aboutsummaryrefslogtreecommitdiffstats
path: root/libical
diff options
context:
space:
mode:
authorEric Busboom <ericb@src.gnome.org>2000-05-15 14:18:21 +0800
committerEric Busboom <ericb@src.gnome.org>2000-05-15 14:18:21 +0800
commitd6b0035a325d060d7f175705c33b0a2d7b60e533 (patch)
tree2ee94e89f94b416cc04a3e8860b1205377397fde /libical
parentf8ff932ae3149c285acea3977a50596749d38584 (diff)
downloadgsoc2013-evolution-d6b0035a325d060d7f175705c33b0a2d7b60e533.tar
gsoc2013-evolution-d6b0035a325d060d7f175705c33b0a2d7b60e533.tar.gz
gsoc2013-evolution-d6b0035a325d060d7f175705c33b0a2d7b60e533.tar.bz2
gsoc2013-evolution-d6b0035a325d060d7f175705c33b0a2d7b60e533.tar.lz
gsoc2013-evolution-d6b0035a325d060d7f175705c33b0a2d7b60e533.tar.xz
gsoc2013-evolution-d6b0035a325d060d7f175705c33b0a2d7b60e533.tar.zst
gsoc2013-evolution-d6b0035a325d060d7f175705c33b0a2d7b60e533.zip
reparing damage from removing files
svn path=/trunk/; revision=3042
Diffstat (limited to 'libical')
-rw-r--r--libical/AUTHORS0
-rw-r--r--libical/CHANGES222
-rw-r--r--libical/COPYING0
-rw-r--r--libical/ChangeLog62
-rw-r--r--libical/INSTALL24
-rw-r--r--libical/MacOS/errno.h185
-rw-r--r--libical/MacOS/libical.mcpbin0 -> 139917 bytes
-rw-r--r--libical/MacOS/libical.mcp.exp1
-rw-r--r--libical/MacOS/libical_prefix.h5
-rw-r--r--libical/MacOS/restrictions.make1
-rw-r--r--libical/MacOS/restrictions.script1
-rw-r--r--libical/MacOS/strdup.c17
-rw-r--r--libical/MacOS/strdup.h3
-rw-r--r--libical/Makefile.am11
-rw-r--r--libical/NEWS250
-rw-r--r--libical/README96
-rw-r--r--libical/TEST4
-rw-r--r--libical/THANKS6
-rw-r--r--libical/TODO28
-rw-r--r--libical/acconfig.h7
-rwxr-xr-xlibical/autogen.sh80
-rw-r--r--libical/configure.in51
-rw-r--r--libical/configure.scan30
-rw-r--r--libical/design-data/.cvsignore2
-rw-r--r--libical/design-data/Makefile.am10
-rw-r--r--libical/design-data/components.txt21
-rw-r--r--libical/design-data/param-c-types.txt23
-rw-r--r--libical/design-data/params-in-prop.txt55
-rw-r--r--libical/design-data/prop-to-value.txt50
-rw-r--r--libical/design-data/property-tokens.txt65
-rw-r--r--libical/design-data/restrictions.csv1348
-rw-r--r--libical/design-data/status-new.txt56
-rw-r--r--libical/design-data/status.foo104
-rw-r--r--libical/design-data/status.txt56
-rw-r--r--libical/design-data/value-c-types.txt22
-rw-r--r--libical/design-data/value-mem-semantics.txt19
-rw-r--r--libical/doc/.cvsignore2
-rw-r--r--libical/doc/Makefile.am1
-rw-r--r--libical/doc/UsingLibical.lyx2256
-rw-r--r--libical/doc/UsingLibical.ps1308
-rw-r--r--libical/doc/UsingLibical.sgml318
-rw-r--r--libical/doc/UsingLibical.txt302
-rwxr-xr-xlibical/install-sh119
-rwxr-xr-xlibical/missing190
-rw-r--r--libical/mkinstalldirs40
-rw-r--r--libical/scripts/.cvsignore2
-rw-r--r--libical/scripts/Makefile.am8
-rwxr-xr-xlibical/scripts/mkderivedcomponents.pl170
-rwxr-xr-xlibical/scripts/mkderivedparameters.pl277
-rwxr-xr-xlibical/scripts/mkderivedproperties.pl286
-rwxr-xr-xlibical/scripts/mkderivedvalues.pl303
-rwxr-xr-xlibical/scripts/mkparameterrestrictions.pl85
-rwxr-xr-xlibical/scripts/mkrestrictionrecords.pl109
-rwxr-xr-xlibical/scripts/mkrestrictiontable.pl86
-rw-r--r--libical/src/.cvsignore2
-rw-r--r--libical/src/Makefile.am1
-rw-r--r--libical/src/libical/.cvsignore14
-rw-r--r--libical/src/libical/.gdb_history457
-rw-r--r--libical/src/libical/.gdbinit3
-rw-r--r--libical/src/libical/Makefile.am87
-rw-r--r--libical/src/libical/base64.c323
-rw-r--r--libical/src/libical/filelock.c143
-rw-r--r--libical/src/libical/filelock.h57
-rw-r--r--libical/src/libical/foo1578
-rw-r--r--libical/src/libical/ical.h43
-rw-r--r--libical/src/libical/icalcomponent.c782
-rw-r--r--libical/src/libical/icalcomponent.h119
-rw-r--r--libical/src/libical/icalenums.c615
-rw-r--r--libical/src/libical/icalenums.h466
-rw-r--r--libical/src/libical/icalerror.c99
-rw-r--r--libical/src/libical/icalerror.h141
-rw-r--r--libical/src/libical/icalirip.h108
-rw-r--r--libical/src/libical/icalitip.output1698
-rw-r--r--libical/src/libical/icalitip.tab.c1663
-rw-r--r--libical/src/libical/icalitip.tab.h137
-rw-r--r--libical/src/libical/icalitipl.l283
-rw-r--r--libical/src/libical/icalitipy.y434
-rw-r--r--libical/src/libical/icallexer.l282
-rw-r--r--libical/src/libical/icalmemory.c244
-rw-r--r--libical/src/libical/icalmemory.h76
-rw-r--r--libical/src/libical/icalparameter.c1913
-rw-r--r--libical/src/libical/icalparameter.h174
-rw-r--r--libical/src/libical/icalparser.c990
-rw-r--r--libical/src/libical/icalparser.h94
-rw-r--r--libical/src/libical/icalproperty.c3095
-rw-r--r--libical/src/libical/icalproperty.h368
-rw-r--r--libical/src/libical/icalrestriction.c1590
-rw-r--r--libical/src/libical/icalrestriction.h72
-rw-r--r--libical/src/libical/icaltypes.c305
-rw-r--r--libical/src/libical/icaltypes.h182
-rw-r--r--libical/src/libical/icalvalue.c2039
-rw-r--r--libical/src/libical/icalvalue.h169
-rw-r--r--libical/src/libical/icalvcal.h39
-rw-r--r--libical/src/libical/icalversion.h.in3
-rw-r--r--libical/src/libical/icalyacc.y480
-rw-r--r--libical/src/libical/locking.c143
-rw-r--r--libical/src/libical/pvl.c768
-rw-r--r--libical/src/libical/pvl.h104
-rw-r--r--libical/src/libical/testlocks.c70
-rw-r--r--libical/src/libicalss/.cvsignore6
-rw-r--r--libical/src/libicalss/Makefile.am23
-rw-r--r--libical/src/libicalss/icalcalendar.c268
-rw-r--r--libical/src/libicalss/icalcalendar.h68
-rw-r--r--libical/src/libicalss/icalcluster.c423
-rw-r--r--libical/src/libicalss/icalcluster.h73
-rw-r--r--libical/src/libicalss/icalcomponent.h115
-rw-r--r--libical/src/libicalss/icalstore.c858
-rw-r--r--libical/src/libicalss/icalstore.h78
-rw-r--r--libical/src/pvl/Makefile0
-rw-r--r--libical/src/test/.cvsignore11
-rw-r--r--libical/src/test/Makefile.am12
-rw-r--r--libical/src/test/alice/booked/199706317
-rw-r--r--libical/src/test/alice/booked/199707701
-rw-r--r--libical/src/test/alice/booked/19970845
-rw-r--r--libical/src/test/alice/booked/19970958
-rw-r--r--libical/src/test/alice/booked/199803241
-rw-r--r--libical/src/test/alice/incoming.ics2164
-rw-r--r--libical/src/test/copycluster.c113
-rw-r--r--libical/src/test/findobj.c71
-rw-r--r--libical/src/test/icaltestparser.c123
-rw-r--r--libical/src/test/regression.c1334
-rw-r--r--libical/src/test/storage.c460
-rw-r--r--libical/src/test/test-component.icd23
-rw-r--r--libical/src/test/usecases.c553
-rw-r--r--libical/test-data/.cvsignore2
-rw-r--r--libical/test-data/021
-rw-r--r--libical/test-data/136
-rw-r--r--libical/test-data/1.113
-rw-r--r--libical/test-data/222
-rw-r--r--libical/test-data/2445.ics329
-rw-r--r--libical/test-data/2445.vcd329
-rw-r--r--libical/test-data/2446.ics1007
-rw-r--r--libical/test-data/2446.vcd1007
-rw-r--r--libical/test-data/321
-rw-r--r--libical/test-data/423
-rw-r--r--libical/test-data/516
-rw-r--r--libical/test-data/621
-rw-r--r--libical/test-data/714
-rw-r--r--libical/test-data/Makefile.am13
-rw-r--r--libical/test-data/smallcluster.ics18
-rw-r--r--libical/test-data/smallcluster.vcd18
141 files changed, 42278 insertions, 0 deletions
diff --git a/libical/AUTHORS b/libical/AUTHORS
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/libical/AUTHORS
diff --git a/libical/CHANGES b/libical/CHANGES
new file mode 100644
index 0000000000..953514a9e4
--- /dev/null
+++ b/libical/CHANGES
@@ -0,0 +1,222 @@
+
+Version 0.15
+------------
+
+Split the storage classess ( icalstore, icalcluster, icalcalendar )
+into a seperate library, libicalss
+
+Implemented restriction checking in file icalrestrictions.c. The
+checking is not complete, but can handle the bulk of the restrictions
+described in RFC 2446.
+
+Created a new value type, METHOD. Changed METHOD property to use the
+new value. The METHOD value uses an enumeration.
+
+
+Version 0.14b
+-------------
+
+Implemented parsing of RECUR values, although it does not handle BYDAY
+specs with numbers.
+
+Fixed error in icalparser_next_line that mangled lines longer than the
+temp buffer (1024 chars.) The temp buffer is now 80 chars, and it can
+handle (apparently) arbitrary length lines
+
+Fixed severe brokenness in a value, but I forgot which one.
+
+Cleaned cruft out of the distribution, so the tarfile is smaller.
+
+
+Version 0.14a 14 Jan 00
+-----------------------
+
+Fixed bug in ROLE parameter -- missing '-' in the text of allowed values
+
+Fixed bug in X-parameters
+
+Version 0.14 11 Jan 00
+----------------------
+
+Fixed wrong value type for TRIGGER property
+
+Added Calendar object. Calendar is an aggregate of two stores and two
+clusters, and can store all of the inforamation associated with a
+calendar.
+
+icalcomponent_add_property and icalcomponent_add_component will
+complain if you try to add a component or property that is already
+part of an other component. The *_free routines wil complain if you try
+to free a linked component or property.
+
+More improvements to error handling.
+
+Parser is much more robust.
+
+Minor memory enhancements.
+
+Regression test runs without memory leaks.
+
+Version 0.13d 21Dec99
+---------------------
+
+Seperated perl interface and library
+
+Added autoconf support
+
+Scripts that generate derived properties, values and parameters now
+change source and header files inline.
+
+Changed icalstore to cluster all components with DTSTART in a month
+into a single file. This should reduce number of file accesses by a
+factor of 60.
+
+Ran code through Purify and fixed memory leaks.
+
+
+Version 0.13 16Nov99
+---------------------
+
+Yet more bug fixes! Yeah!
+
+Added better error handling. The Parser inserts X-LIC-*ERROR
+properties to warn of parsing errors.
+
+The imip source/sink programs in /src/imip is demonstrably functional.
+
+Version 0.12b 17Oct99
+---------------------
+
+More bug fixes, particularily in parse from string routines
+
+ICal::Store is mostly functional
+
+This is version is a checkpoint, not a release.
+
+Version 0.12a 10Oct99
+---------------------
+
+Expanded perl interface:
+ Added 1/2 of Store module
+ Fixed bugs
+ Implemeted get_{first,next}_property
+
+Extended C interface
+ Made get_{first,next}_property work properly
+ Fixed bugs
+
+
+This is version is a checkpoint, not a release.
+
+Version 0.12 27Aug99
+--------------------
+
+Added a rudimentatry perl interface
+
+This is version is a checkpoint, not a release.
+
+
+Version 0.11 11Aug99
+--------------------
+
+Eliminated most use of flex/bison -- all parsing, except for the
+values, is done in C.
+
+Cleaned up memory leaks. Purify claims that I got them all.
+
+Moved all derived component/prop/param/value code ( in .inc / .h
+files) into main files ( icalcomponent.{c,h}, icalproperty.{c,h}, etc/
+)
+
+Implemented *_clone routines.
+
+Fixed a lot of bugs.
+
+Implemented more value types. Still unimplemeneted are BINARY and RECUR
+
+Included MacOS/Code Warior files from Graham Davison
+
+
+Version 0.10 8Jul99
+-------------------
+
+Eliminated shift/reduce and reduce/reduce conflicts in the parser.
+This version is almost feature complete -- it has the basic structure
+for all of the library's functionality, and it will only require
+implementing procedure shells and fixing bugs. I think that all of the
+hard work is done...
+
+Version 0.09a,b 3,7 Jul99
+-------------------------
+
+Various improvements to the parser, added some functionality. The parser code
+is mostly complete, and should be fully functional, except for a horde of
+bugs. Also added support for X-Properties.
+
+Version 0.09 25Jun99
+--------------------
+
+Added a parser in files src/comp/icalitip.{y,l} The lexer is mostly
+functional, but the parser is not.
+
+
+Version 0.08 2Jun99
+--------------------
+
+All files now have MPL licensing
+
+Implement enough of the code to perform some rudimentary testing
+
+
+Version 0.07 14May99
+--------------------
+
+Remove all interfaces that construct object from a string
+
+Moved most code back into comp directory
+
+Implemented C files for most headers -- usecases.c now links.
+
+Many improvements to generation scripts.
+
+
+
+Version 0.06 25Apr99
+--------------------
+
+Expanded distribution to include:
+ Directory structure that can accomodate future expansion
+ Several levels of Makefiles
+ This CHANGES file
+
+Added headers for irip and parse modules
+
+Added several files with design information
+
+Added scripts that I had used to generate much of the ical header code.
+
+Split C headers from CC headers
+
+Added data for iTIP and iCAL component restrictions in restrictions.csv
+
+Version 0.05 11Apr99
+----------------------
+
+Changes to ical headers
+
+ Added derived Property classes.
+
+ Improved the interface to the derived property and parameter classes
+
+ Added derived component classes.
+
+ Created usecases.c and ccusecases.cc to demonstrate use
+
+ C++ interface compile
+
+
+Version 0.04 5Apr99
+-------------------
+
+Version 0.02 30Mar99
+-------------------- \ No newline at end of file
diff --git a/libical/COPYING b/libical/COPYING
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/libical/COPYING
diff --git a/libical/ChangeLog b/libical/ChangeLog
new file mode 100644
index 0000000000..935d5cfede
--- /dev/null
+++ b/libical/ChangeLog
@@ -0,0 +1,62 @@
+2000-05-13 Ettore Perazzoli <ettore@helixcode.com>
+
+ * src/libical/Makefile.am (INCLUDES): Include from the build
+ directory too.
+
+2000-05-10 Christopher James Lahey <clahey@helixcode.com>
+
+ * configure.in: Reorder Makefiles so that it will build.
+
+2000-04-27 Ettore Perazzoli <ettore@helixcode.com>
+
+ * src/test/Makefile.am
+ (INCLUDES): Add `-I ../libical' here too.
+
+ * src/libicalss/Makefile.am:
+ (INCLUDES): I am an idiot. It should be `-I ../libical'.
+
+2000-04-27 Ettore Perazzoli <ettore@helixcode.com>
+
+ * src/libicalss/Makefile.am:
+ (INCLUDES): Add `$(builddir)/../libicalss so that we can #include
+ "libicalversion.h" too.
+
+2000-04-26 Matt Loper <matt@helixcode.com>
+
+ * src/libical/.cvsignore: added icalversion.h.
+
+ * src/libical/icalversion.h: autogenerated file removed from cvs.
+
+2000-04-26 Christopher James Lahey <clahey@helixcode.com>
+
+ * src/test/Makefile.in: Removed.
+
+2000-04-25 Ettore Perazzoli <ettore@helixcode.com>
+
+ * src/libicalss/Makefile.am (INCLUDES): Use `$(srcdir)' properly.
+
+2000-04-24 Seth Alves <alves@hungry.com>
+
+ * src/libical/icaltypes.c (icaldurationtype_from_timet): convert
+ from a time_t to an icaldurationtype.
+
+2000-03-17 Eric Busboom <eric@agony.qualcomm.com>
+
+ * icalstore.c Vastly improved icalstore_test.
+
+2000-03-16 Eric Busboom <eric@agony.qualcomm.com>
+
+ * icalcluster.c Added compile flag (ICAL_SAFESAVES) to switch how
+ icalcluster saves files during commits. When the flag is define,
+ it will write the data to a temorar file and rename the file to
+ the target file.
+
+ * storage.c Added seterate test suite for sotage components
+
+ * icalparser.c Created parser object, implemented line-oriented
+ parsering, and made message oriented parsing work in terms f line
+ oriented parsing.
+
+ * icalparser.c Fixed icalparser_get_line to remove \r in input.
+
+
diff --git a/libical/INSTALL b/libical/INSTALL
new file mode 100644
index 0000000000..88e2a5e7d6
--- /dev/null
+++ b/libical/INSTALL
@@ -0,0 +1,24 @@
+Building the library
+--------------------
+
+This distribution is developed on Red Hat Linux 6.0 and usually
+compiles on SunOS 5.6 and FreeBSD 2.27. I have reports of success of
+previous version on MacOS ( with CodeWarrior ) but I don't know about
+any other systems.
+
+The library is configured with automake. From the root directory, run
+
+ ./configure
+
+To build all of the Makefiles for your system. If you will be installing the library, you may want to use the --prefix flag to set the directory where the library and header files will be installed.
+
+ ./configure --prefix=/proj/local/
+
+If configure runs fine, run "make" to build the library and
+"make install" to install it.
+
+The current version of libical focuses on creating and
+manipulating iCal objects. With it, you can parse text representations
+of iCal components, add and remove sub-components, properties,
+parameters and values, and print the components back out as strings.
+
diff --git a/libical/MacOS/errno.h b/libical/MacOS/errno.h
new file mode 100644
index 0000000000..4be3479b50
--- /dev/null
+++ b/libical/MacOS/errno.h
@@ -0,0 +1,185 @@
+/*
+ * Copyright (c) 1982, 1986, 1989 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)errno.h 7.13 (Berkeley) 2/19/91
+ */
+
+#ifdef macintosh
+#include <errno.h>
+#else
+#ifndef KERNEL
+extern int errno; /* global error number */
+#endif
+#endif
+
+
+#define EPERM 1 /* Operation not permitted */
+/* MSL defines ENOMEM, EACCES, ENOENT, ENOSYS. We give in. */
+#ifndef ENOENT
+#define ENOENT 2 /* No such file or directory */
+#endif
+#define ESRCH 3 /* No such process */
+#define EINTR 4 /* Interrupted system call */
+#define EIO 5 /* Input/output error */
+#define ENXIO 6 /* Device not configured */
+#define E2BIG 7 /* Argument list too long */
+#define ENOEXEC 8 /* Exec format error */
+#define EBADF 9 /* Bad file descriptor */
+#define ECHILD 10 /* No child processes */
+#define EDEADLK 11 /* Resource deadlock avoided */
+ /* 11 was EAGAIN */
+#ifndef ENOMEM
+#define ENOMEM 12 /* Cannot allocate memory */
+#define EACCES 13 /* Permission denied */
+#endif
+#define EFAULT 14 /* Bad address */
+#ifndef _POSIX_SOURCE
+#define ENOTBLK 15 /* Block device required */
+#define EBUSY 16 /* Device busy */
+#endif
+#define EEXIST 17 /* File exists */
+#define EXDEV 18 /* Cross-device link */
+#define ENODEV 19 /* Operation not supported by device */
+#define ENOTDIR 20 /* Not a directory */
+#define EISDIR 21 /* Is a directory */
+#define EINVAL 22 /* Invalid argument */
+#define ENFILE 23 /* Too many open files in system */
+#define EMFILE 24 /* Too many open files */
+#define ENOTTY 25 /* Inappropriate ioctl for device */
+#ifndef _POSIX_SOURCE
+#define ETXTBSY 26 /* Text file busy */
+#endif
+#define EFBIG 27 /* File too large */
+#define ENOSPC 28 /* No space left on device */
+#define ESPIPE 29 /* Illegal seek */
+#define EROFS 30 /* Read-only file system */
+#define EMLINK 31 /* Too many links */
+#define EPIPE 32 /* Broken pipe */
+
+#ifndef __MWERKS__
+/* math software */
+#define EDOM 33 /* Numerical argument out of domain */
+#define ERANGE 34 /* Result too large */
+#endif
+
+/* non-blocking and interrupt i/o */
+#if defined(macintosh)
+#ifndef EAGAIN
+#define EAGAIN 11
+#endif
+#else
+#define EAGAIN 35 /* Resource temporarily unavailable */
+#endif
+#define EWOULDBLOCK EAGAIN /* Operation would block */
+#ifndef _POSIX_SOURCE
+/* Did I tell that MSL also occupies errnos 33-40? We give in. */
+#if ENOMEM==37
+#define EINPROGRESS 136 /* Operation now in progress */
+#define EALREADY 137 /* Operation already in progress */
+
+/* ipc/network software -- argument errors */
+#define ENOTSOCK 138 /* Socket operation on non-socket */
+#define EDESTADDRREQ 139 /* Destination address required */
+#define EMSGSIZE 140 /* Message too long */
+#else
+#define EINPROGRESS 36 /* Operation now in progress */
+#define EALREADY 37 /* Operation already in progress */
+
+/* ipc/network software -- argument errors */
+#define ENOTSOCK 38 /* Socket operation on non-socket */
+#define EDESTADDRREQ 39 /* Destination address required */
+#define EMSGSIZE 40 /* Message too long */
+#endif
+#define EPROTOTYPE 41 /* Protocol wrong type for socket */
+#define ENOPROTOOPT 42 /* Protocol not available */
+#define EPROTONOSUPPORT 43 /* Protocol not supported */
+#define ESOCKTNOSUPPORT 44 /* Socket type not supported */
+#define EOPNOTSUPP 45 /* Operation not supported on socket */
+#define EPFNOSUPPORT 46 /* Protocol family not supported */
+#define EAFNOSUPPORT 47 /* Address family not supported by protocol family */
+#define EADDRINUSE 48 /* Address already in use */
+#define EADDRNOTAVAIL 49 /* Can't assign requested address */
+
+/* ipc/network software -- operational errors */
+#define ENETDOWN 50 /* Network is down */
+#define ENETUNREACH 51 /* Network is unreachable */
+#define ENETRESET 52 /* Network dropped connection on reset */
+#define ECONNABORTED 53 /* Software caused connection abort */
+#define ECONNRESET 54 /* Connection reset by peer */
+#define ENOBUFS 55 /* No buffer space available */
+#define EISCONN 56 /* Socket is already connected */
+#define ENOTCONN 57 /* Socket is not connected */
+#define ESHUTDOWN 58 /* Can't send after socket shutdown */
+#define ETOOMANYREFS 59 /* Too many references: can't splice */
+#define ETIMEDOUT 60 /* Connection timed out */
+#define ECONNREFUSED 61 /* Connection refused */
+
+#define ELOOP 62 /* Too many levels of symbolic links */
+#endif /* _POSIX_SOURCE */
+#define ENAMETOOLONG 63 /* File name too long */
+
+/* should be rearranged */
+#ifndef _POSIX_SOURCE
+#define EHOSTDOWN 64 /* Host is down */
+#define EHOSTUNREACH 65 /* No route to host */
+#endif /* _POSIX_SOURCE */
+#define ENOTEMPTY 66 /* Directory not empty */
+
+/* quotas & mush */
+#ifndef _POSIX_SOURCE
+#define EPROCLIM 67 /* Too many processes */
+#define EUSERS 68 /* Too many users */
+#define EDQUOT 69 /* Disc quota exceeded */
+
+/* Network File System */
+#define ESTALE 70 /* Stale NFS file handle */
+#define EREMOTE 71 /* Too many levels of remote in path */
+#define EBADRPC 72 /* RPC struct is bad */
+#define ERPCMISMATCH 73 /* RPC version wrong */
+#define EPROGUNAVAIL 74 /* RPC prog. not avail */
+#define EPROGMISMATCH 75 /* Program version wrong */
+#define EPROCUNAVAIL 76 /* Bad procedure for program */
+#endif /* _POSIX_SOURCE */
+
+#define ENOLCK 77 /* No locks available */
+
+#ifndef ENOSYS
+#define ENOSYS 78 /* Function not implemented */
+#endif
+
+#define EFTYPE 79 /* Inappropriate file type or format */
+
+#ifdef KERNEL
+/* pseudo-errors returned inside kernel to modify return to process */
+#define ERESTART -1 /* restart syscall */
+#define EJUSTRETURN -2 /* don't modify regs, just return */
+#endif
diff --git a/libical/MacOS/libical.mcp b/libical/MacOS/libical.mcp
new file mode 100644
index 0000000000..1c0ec4a35b
--- /dev/null
+++ b/libical/MacOS/libical.mcp
Binary files differ
diff --git a/libical/MacOS/libical.mcp.exp b/libical/MacOS/libical.mcp.exp
new file mode 100644
index 0000000000..07c84e0efc
--- /dev/null
+++ b/libical/MacOS/libical.mcp.exp
@@ -0,0 +1 @@
+icalvalue_get_utcoffset icalvalue_set_utcoffset icalvalue_new_utcoffset icalvalue_get_uri icalvalue_set_uri icalvalue_new_uri icalvalue_get_trigger icalvalue_set_trigger icalvalue_new_trigger icalvalue_get_time icalvalue_set_time icalvalue_new_time icalvalue_get_text icalvalue_set_text icalvalue_new_text icalvalue_get_recur icalvalue_set_recur icalvalue_new_recur icalvalue_get_period icalvalue_set_period icalvalue_new_period icalvalue_get_integer icalvalue_set_integer icalvalue_new_integer icalvalue_get_geo icalvalue_set_geo icalvalue_new_geo icalvalue_get_float icalvalue_set_float icalvalue_new_float icalvalue_get_duration icalvalue_set_duration icalvalue_new_duration icalvalue_get_datetimeperiod icalvalue_set_datetimeperiod icalvalue_new_datetimeperiod icalvalue_get_datetimedate icalvalue_set_datetimedate icalvalue_new_datetimedate icalvalue_get_datetime icalvalue_set_datetime icalvalue_new_datetime icalvalue_get_date icalvalue_set_date icalvalue_new_date icalvalue_get_caladdress icalvalue_set_caladdress icalvalue_new_caladdress icalvalue_get_boolean icalvalue_set_boolean icalvalue_new_boolean icalvalue_get_binary icalvalue_set_binary icalvalue_new_binary icalvalue_get_attach icalvalue_set_attach icalvalue_new_attach icalvalue_isa_value icalvalue_isa icalvalue_as_ical_string icalvalue_trigger_as_ical_string icalvalue_period_as_ical_string icalvalue_datetimeperiod_as_ical_string icalvalue_recur_as_ical_string icalvalue_geo_as_ical_string icalvalue_float_as_ical_string icalvalue_datetimedate_as_ical_string icalvalue_datetime_as_ical_string icalvalue_date_as_ical_string icalvalue_time_as_ical_string icalvalue_duration_as_ical_string icalvalue_attach_as_ical_string icalvalue_string_as_ical_string icalvalue_int_as_ical_string icalvalue_binary_as_ical_string icalvalue_is_valid icalvalue_free icalvalue_new icalvalue_new_impl icalproperty_get_action icalproperty_set_action icalproperty_vanew_action icalproperty_new_action icalproperty_get_due icalproperty_set_due icalproperty_vanew_due icalproperty_new_due icalproperty_get_dtstamp icalproperty_set_dtstamp icalproperty_vanew_dtstamp icalproperty_new_dtstamp icalproperty_get_completed icalproperty_set_completed icalproperty_vanew_completed icalproperty_new_completed icalproperty_get_geo icalproperty_set_geo icalproperty_vanew_geo icalproperty_new_geo icalproperty_get_created icalproperty_set_created icalproperty_vanew_created icalproperty_new_created icalproperty_get_calscale icalproperty_set_calscale icalproperty_vanew_calscale icalproperty_new_calscale icalproperty_get_percentcomplete icalproperty_set_percentcomplete icalproperty_vanew_percentcomplete icalproperty_new_percentcomplete icalproperty_get_exrule icalproperty_set_exrule icalproperty_vanew_exrule icalproperty_new_exrule icalproperty_get_attach icalproperty_set_attach icalproperty_vanew_attach icalproperty_new_attach icalproperty_get_url icalproperty_set_url icalproperty_vanew_url icalproperty_new_url icalproperty_get_rdate icalproperty_set_rdate icalproperty_vanew_rdate icalproperty_new_rdate icalproperty_get_tzname icalproperty_set_tzname icalproperty_vanew_tzname icalproperty_new_tzname icalproperty_get_dtend icalproperty_set_dtend icalproperty_vanew_dtend icalproperty_new_dtend icalproperty_get_summary icalproperty_set_summary icalproperty_vanew_summary icalproperty_new_summary icalproperty_get_recurrenceid icalproperty_set_recurrenceid icalproperty_vanew_recurrenceid icalproperty_new_recurrenceid icalproperty_get_dtstart icalproperty_set_dtstart icalproperty_vanew_dtstart icalproperty_new_dtstart icalproperty_get_freebusy icalproperty_set_freebusy icalproperty_vanew_freebusy icalproperty_new_freebusy icalproperty_get_priority icalproperty_set_priority icalproperty_vanew_priority icalproperty_new_priority icalproperty_get_repeat icalproperty_set_repeat icalproperty_vanew_repeat icalproperty_new_repeat icalproperty_get_tzurl icalproperty_set_tzurl icalproperty_vanew_tzurl icalproperty_new_tzurl icalproperty_get_resources icalproperty_set_resources icalproperty_vanew_resources icalproperty_new_resources icalproperty_get_tzid icalproperty_set_tzid icalproperty_vanew_tzid icalproperty_new_tzid icalproperty_get_exdate icalproperty_set_exdate icalproperty_vanew_exdate icalproperty_new_exdate icalproperty_get_requeststatus icalproperty_set_requeststatus icalproperty_vanew_requeststatus icalproperty_new_requeststatus icalproperty_get_location icalproperty_set_location icalproperty_vanew_location icalproperty_new_location icalproperty_get_sequence icalproperty_set_sequence icalproperty_vanew_sequence icalproperty_new_sequence icalproperty_get_transp icalproperty_set_transp icalproperty_vanew_transp icalproperty_new_transp icalproperty_get_tzoffsetto icalproperty_set_tzoffsetto icalproperty_vanew_tzoffsetto icalproperty_new_tzoffsetto icalproperty_get_x_name icalproperty_get_x icalproperty_set_x_name icalproperty_set_x icalproperty_vanew_x icalproperty_new_x icalproperty_get_class icalproperty_set_class icalproperty_vanew_class icalproperty_new_class icalproperty_get_trigger icalproperty_set_trigger icalproperty_vanew_trigger icalproperty_new_trigger icalproperty_get_comment icalproperty_set_comment icalproperty_vanew_comment icalproperty_new_comment icalproperty_get_organizer icalproperty_set_organizer icalproperty_vanew_organizer icalproperty_new_organizer icalproperty_get_relatedto icalproperty_set_relatedto icalproperty_vanew_relatedto icalproperty_new_relatedto icalproperty_get_contact icalproperty_set_contact icalproperty_vanew_contact icalproperty_new_contact icalproperty_get_attendee icalproperty_set_attendee icalproperty_vanew_attendee icalproperty_new_attendee icalproperty_get_rrule icalproperty_set_rrule icalproperty_vanew_rrule icalproperty_new_rrule icalproperty_get_tzoffsetfrom icalproperty_set_tzoffsetfrom icalproperty_vanew_tzoffsetfrom icalproperty_new_tzoffsetfrom icalproperty_get_version icalproperty_set_version icalproperty_vanew_version icalproperty_new_version icalproperty_get_categories icalproperty_set_categories icalproperty_vanew_categories icalproperty_new_categories icalproperty_get_description icalproperty_set_description icalproperty_vanew_description icalproperty_new_description icalproperty_get_status icalproperty_set_status icalproperty_vanew_status icalproperty_new_status icalproperty_get_prodid icalproperty_set_prodid icalproperty_vanew_prodid icalproperty_new_prodid icalproperty_get_uid icalproperty_set_uid icalproperty_vanew_uid icalproperty_new_uid icalproperty_get_lastmodified icalproperty_set_lastmodified icalproperty_vanew_lastmodified icalproperty_new_lastmodified icalproperty_get_method icalproperty_set_method icalproperty_vanew_method icalproperty_new_method icalproperty_get_value icalproperty_set_value icalproperty_get_next_parameter icalproperty_get_first_parameter icalproperty_count_parameters icalproperty_remove_parameter icalproperty_add_parameter icalproperty_isa_property icalproperty_isa icalproperty_as_ical_string icalproperty_free icalproperty_new icalproperty_new_impl icalproperty_add_parameters icalparameter_set_x icalparameter_get_x icalparameter_new_x icalparameter_set_value icalparameter_get_value icalparameter_new_value icalparameter_set_tzid icalparameter_get_tzid icalparameter_new_tzid icalparameter_set_sentby icalparameter_get_sentby icalparameter_new_sentby icalparameter_set_rsvp icalparameter_get_rsvp icalparameter_new_rsvp icalparameter_set_role icalparameter_get_role icalparameter_new_role icalparameter_set_reltype icalparameter_get_reltype icalparameter_new_reltype icalparameter_set_related icalparameter_get_related icalparameter_new_related icalparameter_set_range icalparameter_get_range icalparameter_new_range icalparameter_set_partstat icalparameter_get_partstat icalparameter_new_partstat icalparameter_set_member icalparameter_get_member icalparameter_new_member icalparameter_set_language icalparameter_get_language icalparameter_new_language icalparameter_set_fmttype icalparameter_get_fmttype icalparameter_new_fmttype icalparameter_set_fbtype icalparameter_get_fbtype icalparameter_new_fbtype icalparameter_set_encoding icalparameter_get_encoding icalparameter_new_encoding icalparameter_set_dir icalparameter_get_dir icalparameter_new_dir icalparameter_set_delegatedto icalparameter_get_delegatedto icalparameter_new_delegatedto icalparameter_set_delegatedfrom icalparameter_get_delegatedfrom icalparameter_new_delegatedfrom icalparameter_set_cutype icalparameter_get_cutype icalparameter_new_cutype icalparameter_set_cn icalparameter_get_cn icalparameter_new_cn icalparameter_set_altrep icalparameter_get_altrep icalparameter_new_altrep icalparameter_get_xname icalparameterset_xname icalparameter_isa_parameter icalparameter_isa icalparameter_is_valid icalparameter_as_ical_string icalparameter_free icalparameter_new icalparameter_new_impl icalenum_string_to_component_kind icalenum_component_kind_to_string icalenum_value_kind_by_prop icalenum_string_to_parameter_kind icalenum_parameter_kind_to_string icalenum_string_to_property_kind icalenum_property_kind_to_string icalcomponent_get_component icalcomponent_get_next_component icalcomponent_get_first_component icalcomponent_count_components icalcomponent_remove_component icalcomponent_add_component icalcomponent_get_properties icalcomponent_get_next_property icalcomponent_get_first_property icalcomponent_count_properties icalcomponent_remove_property icalcomponent_add_property icalcomponent_isa_component icalcomponent_isa icalcomponent_is_valid icalcomponent_as_ical_string icalcomponent_free icalcomponent_vanew icalcomponent_new icalcomponent_new_impl icalcomponent_add_children #pvl_list_count #pvl_elem_count #pvl_apply #pvl_data #pvl_tail #pvl_head #pvl_prior #pvl_next #pvl_count #pvl_clear #pvl_find_next #pvl_find #pvl_remove #pvl_insert_before #pvl_insert_after #pvl_insert_ordered #pvl_pop #pvl_push #pvl_shift #pvl_unshift #pvl_new_element #pvl_newlist #strdup icalrestriction_records icalrestriction_is_parameter_allowed icalrestriction_get_component_restriction icalrestriction_get_property_restriction icalerrno icalerror_set_errno icalerror_clear_errno buffer_ring initialized buffer_pos icalmemory_append_string icalmemory_free_buffer icalmemory_resize_buffer icalmemory_new_buffer icalmemory_free_tmp_buffer icalmemory_resize_tmp_buffer icalmemory_new_tmp_buffer #__msipl_rd__3std # std::__msipl_rd #__dt__Q23std18__random_generatorFv # std::__random_generator::~__random_generator() #seed__Q23std18__random_generatorFUl # std::__random_generator::seed(unsigned long) #setfill__3stdFi # std::setfill(int) #setbase__3stdFi # std::setbase(int) #setiosflags__3stdFl # std::setiosflags(long) #resetiosflags__3stdFl # std::resetiosflags(long) #ffill__3stdFRQ23std35basic_ios<w,Q23std14char_traits<w>>w # std::ffill(std::basic_ios<wchar_t, std::char_traits<wchar_t>>&,wchar_t) #ffill__3stdFRQ23std35basic_ios<c,Q23std14char_traits<c>>i # std::ffill(std::basic_ios<char, std::char_traits<char>>&,int) #setw__3stdFi # std::setw(int) #setprecision__3stdFi # std::setprecision(int) #__vt__Q23std39basic_istream<c,Q23std14char_traits<c>> # std::basic_istream<char, std::char_traits<char>>::__vt #__vt__Q23std35basic_ios<c,Q23std14char_traits<c>> # std::basic_ios<char, std::char_traits<char>>::__vt #__vt__Q23std39basic_ostream<c,Q23std14char_traits<c>> # std::basic_ostream<char, std::char_traits<char>>::__vt #__vt__Q23std39basic_filebuf<c,Q23std14char_traits<c>> # std::basic_filebuf<char, std::char_traits<char>>::__vt #__vt__Q23std41basic_streambuf<c,Q23std14char_traits<c>> # std::basic_streambuf<char, std::char_traits<char>>::__vt #__vt__Q23std8bad_cast # std::bad_cast::__vt #__vt__Q23std9exception # std::exception::__vt #cerr__3std # std::cerr #clog__3std # std::clog #cout__3std # std::cout #cin__3std # std::cin #index__Q23std8ios_base # std::ios_base::index #heap_size__Q23std14base_allocator # std::base_allocator::heap_size #end_free__Q23std14base_allocator # std::base_allocator::end_free #start_free__Q23std14base_allocator # std::base_allocator::start_free #free_list__Q23std14base_allocator # std::base_allocator::free_list #init_cnt__Q33std8ios_base4Init # std::ios_base::Init::init_cnt #use_facet<Q23std8ctype<c>>__3stdFRCQ23std6locale # std::use_facet<Q23std8ctype<c>>(const std::locale&) #what__Q23std9exceptionCFv # std::exception::what() const #what__Q23std8bad_castCFv # std::bad_cast::what() const #__dt__Q23std9exceptionFv # std::exception::~exception() #use_facet<Q23std14codecvt<c,c,i>>__3stdFRCQ23std6locale # std::use_facet<Q23std14codecvt<c,c,i>>(const std::locale&) #__dt__Q23std8bad_castFv # std::bad_cast::~bad_cast() #init__Q23std35basic_ios<c,Q23std14char_traits<c>>FPQ23std41basic_streambuf<c,Q23std14char_traits<c>> # std::basic_ios<char, std::char_traits<char>>::init(std::basic_streambuf<char, std::char_traits<char>>*) #always_noconv__Q23std23_Generic_codecvt<c,c,i>CFv # std::_Generic_codecvt<char, char, int>::always_noconv() const #out__Q23std23_Generic_codecvt<c,c,i>CFRiPCcPCcRPCcPcPcRPc # std::_Generic_codecvt<char, char, int>::out(int&,const char*,const char*,const char*&,char*,char*,char*&) const #__ct__Q23std39basic_ostream<c,Q23std14char_traits<c>>FPQ23std41basic_streambuf<c,Q23std14char_traits<c>> # std::basic_ostream<char, std::char_traits<char>>::basic_ostream(std::basic_streambuf<char, std::char_traits<char>>*) #__ct__Q23std39basic_istream<c,Q23std14char_traits<c>>FPQ23std41basic_streambuf<c,Q23std14char_traits<c>> # std::basic_istream<char, std::char_traits<char>>::basic_istream(std::basic_streambuf<char, std::char_traits<char>>*) #__dt__Q33std39basic_ostream<c,Q23std14char_traits<c>>6sentryFv # std::basic_ostream<char, std::char_traits<char>>::sentry::~sentry() #flush__Q23std39basic_ostream<c,Q23std14char_traits<c>>Fv # std::basic_ostream<char, std::char_traits<char>>::flush() #close__Q23std39basic_filebuf<c,Q23std14char_traits<c>>Fv # std::basic_filebuf<char, std::char_traits<char>>::close() #overflow__Q23std41basic_streambuf<c,Q23std14char_traits<c>>Fi # std::basic_streambuf<char, std::char_traits<char>>::overflow(int) #xsputn__Q23std41basic_streambuf<c,Q23std14char_traits<c>>FPCci # std::basic_streambuf<char, std::char_traits<char>>::xsputn(const char*,int) #pbackfail__Q23std41basic_streambuf<c,Q23std14char_traits<c>>Fi # std::basic_streambuf<char, std::char_traits<char>>::pbackfail(int) #uflow__Q23std41basic_streambuf<c,Q23std14char_traits<c>>Fv # std::basic_streambuf<char, std::char_traits<char>>::uflow() #underflow__Q23std41basic_streambuf<c,Q23std14char_traits<c>>Fv # std::basic_streambuf<char, std::char_traits<char>>::underflow() #xsgetn__Q23std41basic_streambuf<c,Q23std14char_traits<c>>FPci # std::basic_streambuf<char, std::char_traits<char>>::xsgetn(char*,int) #showmanyc__Q23std41basic_streambuf<c,Q23std14char_traits<c>>Fv # std::basic_streambuf<char, std::char_traits<char>>::showmanyc() #sync__Q23std41basic_streambuf<c,Q23std14char_traits<c>>Fv # std::basic_streambuf<char, std::char_traits<char>>::sync() #seekpos__Q23std41basic_streambuf<c,Q23std14char_traits<c>>FQ23std7fpos<i>s # std::basic_streambuf<char, std::char_traits<char>>::seekpos(std::fpos<int>,short) #seekoff__Q23std41basic_streambuf<c,Q23std14char_traits<c>>FlQ33std8ios_base7seekdirs # std::basic_streambuf<char, std::char_traits<char>>::seekoff(long,std::ios_base::seekdir,short) #setbuf__Q23std41basic_streambuf<c,Q23std14char_traits<c>>FPci # std::basic_streambuf<char, std::char_traits<char>>::setbuf(char*,int) #imbue__Q23std41basic_streambuf<c,Q23std14char_traits<c>>FRCQ23std6locale # std::basic_streambuf<char, std::char_traits<char>>::imbue(const std::locale&) #xsputn__Q23std39basic_filebuf<c,Q23std14char_traits<c>>FPCci # std::basic_filebuf<char, std::char_traits<char>>::xsputn(const char*,int) #xsgetn__Q23std39basic_filebuf<c,Q23std14char_traits<c>>FPci # std::basic_filebuf<char, std::char_traits<char>>::xsgetn(char*,int) #showmanyc__Q23std39basic_filebuf<c,Q23std14char_traits<c>>Fv # std::basic_filebuf<char, std::char_traits<char>>::showmanyc() #imbue__Q23std39basic_filebuf<c,Q23std14char_traits<c>>FRCQ23std6locale # std::basic_filebuf<char, std::char_traits<char>>::imbue(const std::locale&) #uflow__Q23std39basic_filebuf<c,Q23std14char_traits<c>>Fv # std::basic_filebuf<char, std::char_traits<char>>::uflow() #sync__Q23std39basic_filebuf<c,Q23std14char_traits<c>>Fv # std::basic_filebuf<char, std::char_traits<char>>::sync() #setbuf__Q23std39basic_filebuf<c,Q23std14char_traits<c>>FPci # std::basic_filebuf<char, std::char_traits<char>>::setbuf(char*,int) #seekpos__Q23std39basic_filebuf<c,Q23std14char_traits<c>>FQ23std7fpos<i>s # std::basic_filebuf<char, std::char_traits<char>>::seekpos(std::fpos<int>,short) #seekoff__Q23std39basic_filebuf<c,Q23std14char_traits<c>>FlQ33std8ios_base7seekdirs # std::basic_filebuf<char, std::char_traits<char>>::seekoff(long,std::ios_base::seekdir,short) #underflow__Q23std39basic_filebuf<c,Q23std14char_traits<c>>Fv # std::basic_filebuf<char, std::char_traits<char>>::underflow() #pbackfail__Q23std39basic_filebuf<c,Q23std14char_traits<c>>Fi # std::basic_filebuf<char, std::char_traits<char>>::pbackfail(int) #overflow__Q23std39basic_filebuf<c,Q23std14char_traits<c>>Fi # std::basic_filebuf<char, std::char_traits<char>>::overflow(int) #@8@68@__dt__Q23std39basic_ostream<c,Q23std14char_traits<c>>Fv #__dt__Q23std35basic_ios<c,Q23std14char_traits<c>>Fv # std::basic_ios<char, std::char_traits<char>>::~basic_ios() #@12@68@__dt__Q23std39basic_istream<c,Q23std14char_traits<c>>Fv #__dt__Q23std39basic_istream<c,Q23std14char_traits<c>>Fv # std::basic_istream<char, std::char_traits<char>>::~basic_istream() #__dt__Q23std39basic_ostream<c,Q23std14char_traits<c>>Fv # std::basic_ostream<char, std::char_traits<char>>::~basic_ostream() #__dt__Q33std8ios_base4InitFv # std::ios_base::Init::~Init() #__dt__Q23std41basic_streambuf<c,Q23std14char_traits<c>>Fv # std::basic_streambuf<char, std::char_traits<char>>::~basic_streambuf() #__ct__Q33std8ios_base4InitFv # std::ios_base::Init::Init() #__dt__Q23std39basic_filebuf<c,Q23std14char_traits<c>>Fv # std::basic_filebuf<char, std::char_traits<char>>::~basic_filebuf() #__mask_map__3std # std::__mask_map #__vt__Q23std15moneypunct<w,1> # std::moneypunct<wchar_t, 1>::__vt #__vt__Q23std15moneypunct<w,0> # std::moneypunct<wchar_t, 0>::__vt #__vt__Q23std15moneypunct<c,1> # std::moneypunct<char, 1>::__vt #__vt__Q23std15moneypunct<c,0> # std::moneypunct<char, 0>::__vt #__vt__Q23std12timepunct<w> # std::timepunct<wchar_t>::__vt #__vt__Q23std12timepunct<c> # std::timepunct<char>::__vt #__vt__Q23std11numpunct<w> # std::numpunct<wchar_t>::__vt #__vt__Q23std11numpunct<c> # std::numpunct<char>::__vt #__vt__Q23std14codecvt<w,c,i> # std::codecvt<wchar_t, char, int>::__vt #__vt__Q23std14codecvt<c,c,i> # std::codecvt<char, char, int>::__vt #__vt__Q23std15ctype_byname<c> # std::ctype_byname<char>::__vt #__vt__Q23std8ctype<c> # std::ctype<char>::__vt #__vt__Q23std8ctype<w> # std::ctype<wchar_t>::__vt #__vt__Q33std6locale5facet # std::locale::facet::__vt #__vt__Q23std13runtime_error # std::runtime_error::__vt #__vt__Q23std12out_of_range # std::out_of_range::__vt #__vt__Q23std12length_error # std::length_error::__vt #__vt__Q23std11logic_error # std::logic_error::__vt #__vt__Q23std9bad_alloc # std::bad_alloc::__vt #__vt__Q23std23_Generic_codecvt<c,c,i> # std::_Generic_codecvt<char, char, int>::__vt #__vt__Q23std23_Generic_codecvt<w,c,i> # std::_Generic_codecvt<wchar_t, char, int>::__vt #__vt__Q23std64num_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>> # std::num_get<char, std::istreambuf_iterator<char, std::char_traits<char>>>::__vt #__vt__Q23std64num_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>> # std::num_get<wchar_t, std::istreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::__vt #__vt__Q23std64num_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>> # std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char>>>::__vt #__vt__Q23std64num_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>> # std::num_put<wchar_t, std::ostreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::__vt #__vt__Q23std20_Generic_numpunct<c> # std::_Generic_numpunct<char>::__vt #__vt__Q23std20_Generic_numpunct<w> # std::_Generic_numpunct<wchar_t>::__vt #__vt__Q23std10collate<c> # std::collate<char>::__vt #__vt__Q23std10collate<w> # std::collate<wchar_t>::__vt #__vt__Q23std21_Generic_timepunct<c> # std::_Generic_timepunct<char>::__vt #__vt__Q23std21_Generic_timepunct<w> # std::_Generic_timepunct<wchar_t>::__vt #__vt__Q23std65time_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>> # std::time_get<char, std::istreambuf_iterator<char, std::char_traits<char>>>::__vt #__vt__Q23std65time_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>> # std::time_get<wchar_t, std::istreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::__vt #__vt__Q23std65time_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>> # std::time_put<char, std::ostreambuf_iterator<char, std::char_traits<char>>>::__vt #__vt__Q23std65time_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>> # std::time_put<wchar_t, std::ostreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::__vt #__vt__Q23std66money_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>> # std::money_get<char, std::istreambuf_iterator<char, std::char_traits<char>>>::__vt #__vt__Q23std66money_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>> # std::money_get<wchar_t, std::istreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::__vt #__vt__Q23std66money_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>> # std::money_put<char, std::ostreambuf_iterator<char, std::char_traits<char>>>::__vt #__vt__Q23std66money_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>> # std::money_put<wchar_t, std::ostreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::__vt #__vt__Q23std24_Generic_moneypunct<c,0> # std::_Generic_moneypunct<char, 0>::__vt #__vt__Q23std24_Generic_moneypunct<c,1> # std::_Generic_moneypunct<char, 1>::__vt #__vt__Q23std24_Generic_moneypunct<w,0> # std::_Generic_moneypunct<wchar_t, 0>::__vt #__vt__Q23std24_Generic_moneypunct<w,1> # std::_Generic_moneypunct<wchar_t, 1>::__vt #id__Q23std64num_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>> # std::num_get<char, std::istreambuf_iterator<char, std::char_traits<char>>>::id #__init__id__Q23std64num_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>> #id__Q23std64num_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>> # std::num_get<wchar_t, std::istreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::id #__init__id__Q23std64num_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>> #id__Q23std64num_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>> # std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char>>>::id #__init__id__Q23std64num_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>> #id__Q23std64num_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>> # std::num_put<wchar_t, std::ostreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::id #__init__id__Q23std64num_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>> #id__Q23std10collate<c> # std::collate<char>::id #__init__id__Q23std10collate<c> #id__Q23std10collate<w> # std::collate<wchar_t>::id #__init__id__Q23std10collate<w> #id__Q23std65time_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>> # std::time_get<char, std::istreambuf_iterator<char, std::char_traits<char>>>::id #__init__id__Q23std65time_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>> #id__Q23std65time_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>> # std::time_get<wchar_t, std::istreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::id #__init__id__Q23std65time_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>> #id__Q23std65time_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>> # std::time_put<char, std::ostreambuf_iterator<char, std::char_traits<char>>>::id #__init__id__Q23std65time_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>> #id__Q23std65time_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>> # std::time_put<wchar_t, std::ostreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::id #__init__id__Q23std65time_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>> #id__Q23std66money_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>> # std::money_get<char, std::istreambuf_iterator<char, std::char_traits<char>>>::id #__init__id__Q23std66money_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>> #id__Q23std66money_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>> # std::money_get<wchar_t, std::istreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::id #__init__id__Q23std66money_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>> #id__Q23std66money_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>> # std::money_put<char, std::ostreambuf_iterator<char, std::char_traits<char>>>::id #__init__id__Q23std66money_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>> #id__Q23std66money_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>> # std::money_put<wchar_t, std::ostreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::id #__init__id__Q23std66money_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>> #id__Q23std15moneypunct<w,1> # std::moneypunct<wchar_t, 1>::id #__init__id__Q23std15moneypunct<w,1> #id__Q23std15moneypunct<w,0> # std::moneypunct<wchar_t, 0>::id #__init__id__Q23std15moneypunct<w,0> #id__Q23std15moneypunct<c,1> # std::moneypunct<char, 1>::id #__init__id__Q23std15moneypunct<c,1> #id__Q23std15moneypunct<c,0> # std::moneypunct<char, 0>::id #__init__id__Q23std15moneypunct<c,0> #id__Q23std12timepunct<w> # std::timepunct<wchar_t>::id #__init__id__Q23std12timepunct<w> #id__Q23std12timepunct<c> # std::timepunct<char>::id #__init__id__Q23std12timepunct<c> #id__Q23std11numpunct<w> # std::numpunct<wchar_t>::id #__init__id__Q23std11numpunct<w> #id__Q23std11numpunct<c> # std::numpunct<char>::id #__init__id__Q23std11numpunct<c> #id__Q23std14codecvt<w,c,i> # std::codecvt<wchar_t, char, int>::id #__init__id__Q23std14codecvt<w,c,i> #id__Q23std14codecvt<c,c,i> # std::codecvt<char, char, int>::id #__init__id__Q23std14codecvt<c,c,i> #id__Q23std8ctype<c> # std::ctype<char>::id #__init__id__Q23std8ctype<c> #id__Q23std8ctype<w> # std::ctype<wchar_t>::id #__init__id__Q23std8ctype<w> #global_s__Q23std6locale # std::locale::global_s #id_count_s__Q33std6locale2id # std::locale::id::id_count_s #insert__Q23std32vector<Pv,Q23std13allocator<Pv>>FPPvUlRCPv # std::vector<void*, std::allocator<void*>>::insert(void**,unsigned long,void*const&) #erase__Q23std32vector<Pv,Q23std13allocator<Pv>>FPPvPPv # std::vector<void*, std::allocator<void*>>::erase(void**,void**) #do_assign<PCPv>__Q23std32vector<Pv,Q23std13allocator<Pv>>FPCPvPCPvQ23std20forward_iterator_tag # std::vector<void*, std::allocator<void*>>::do_assign<PCPv>(void*const*,void*const*,std::forward_iterator_tag) #resize__Q23std32vector<Pv,Q23std13allocator<Pv>>FUlPv # std::vector<void*, std::allocator<void*>>::resize(unsigned long,void*) #compare__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>CFUlUlPCcUl # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::compare(unsigned long,unsigned long,const char*,unsigned long) const #max_size__Q23std13allocator<Pv>CFv # std::allocator<void*>::max_size() const #max_size__Q23std12allocator<w>CFv # std::allocator<wchar_t>::max_size() const #max_size__Q23std12allocator<c>CFv # std::allocator<char>::max_size() const #init__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>FPCcPCcRCQ23std12allocator<c>Q23std26random_access_iterator_tag # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::init(const char*,const char*,const std::allocator<char>&,std::random_access_iterator_tag) #append__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>FRCQ23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>UlUl # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::append(const std::basic_string<char, std::char_traits<char>, std::allocator<char>>&,unsigned long,unsigned long) #init__Q23std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>FPCwPCwRCQ23std12allocator<w>Q23std26random_access_iterator_tag # std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::init(const wchar_t*,const wchar_t*,const std::allocator<wchar_t>&,std::random_access_iterator_tag) #__dt__Q23std66money_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>Fv # std::money_put<wchar_t, std::ostreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::~money_put() #__dt__Q23std66money_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>Fv # std::money_put<char, std::ostreambuf_iterator<char, std::char_traits<char>>>::~money_put() #__dt__Q23std66money_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>Fv # std::money_get<wchar_t, std::istreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::~money_get() #__dt__Q23std66money_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>Fv # std::money_get<char, std::istreambuf_iterator<char, std::char_traits<char>>>::~money_get() #__dt__Q23std65time_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>Fv # std::time_put<wchar_t, std::ostreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::~time_put() #__dt__Q23std65time_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>Fv # std::time_put<char, std::ostreambuf_iterator<char, std::char_traits<char>>>::~time_put() #__dt__Q23std65time_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>Fv # std::time_get<wchar_t, std::istreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::~time_get() #__dt__Q23std65time_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>Fv # std::time_get<char, std::istreambuf_iterator<char, std::char_traits<char>>>::~time_get() #__dt__Q23std10collate<w>Fv # std::collate<wchar_t>::~collate() #__dt__Q23std10collate<c>Fv # std::collate<char>::~collate() #__dt__Q23std64num_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>Fv # std::num_put<wchar_t, std::ostreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::~num_put() #__dt__Q23std64num_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>Fv # std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char>>>::~num_put() #__dt__Q23std64num_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>Fv # std::num_get<wchar_t, std::istreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::~num_get() #__dt__Q23std64num_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>Fv # std::num_get<char, std::istreambuf_iterator<char, std::char_traits<char>>>::~num_get() #what__Q23std9bad_allocCFv # std::bad_alloc::what() const #what__Q23std11logic_errorCFv # std::logic_error::what() const #replace<Q23std65time_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>>__Q33std6locale3impFRCQ23std65time_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>> # std::locale::imp::replace<Q23std65time_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>>(const std::time_put<wchar_t, std::ostreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>&) #replace<Q23std65time_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>>__Q33std6locale3impFRCQ23std65time_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>> # std::locale::imp::replace<Q23std65time_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>>(const std::time_get<wchar_t, std::istreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>&) #replace<Q23std12timepunct<w>>__Q33std6locale3impFRCQ23std12timepunct<w> # std::locale::imp::replace<Q23std12timepunct<w>>(const std::timepunct<wchar_t>&) #replace<Q23std65time_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>>__Q33std6locale3impFRCQ23std65time_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>> # std::locale::imp::replace<Q23std65time_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>>(const std::time_put<char, std::ostreambuf_iterator<char, std::char_traits<char>>>&) #replace<Q23std65time_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>>__Q33std6locale3impFRCQ23std65time_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>> # std::locale::imp::replace<Q23std65time_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>>(const std::time_get<char, std::istreambuf_iterator<char, std::char_traits<char>>>&) #replace<Q23std12timepunct<c>>__Q33std6locale3impFRCQ23std12timepunct<c> # std::locale::imp::replace<Q23std12timepunct<c>>(const std::timepunct<char>&) #replace<Q23std64num_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>>__Q33std6locale3impFRCQ23std64num_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>> # std::locale::imp::replace<Q23std64num_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>>(const std::num_put<wchar_t, std::ostreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>&) #replace<Q23std64num_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>>__Q33std6locale3impFRCQ23std64num_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>> # std::locale::imp::replace<Q23std64num_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>>(const std::num_get<wchar_t, std::istreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>&) #replace<Q23std11numpunct<w>>__Q33std6locale3impFRCQ23std11numpunct<w> # std::locale::imp::replace<Q23std11numpunct<w>>(const std::numpunct<wchar_t>&) #replace<Q23std64num_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>>__Q33std6locale3impFRCQ23std64num_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>> # std::locale::imp::replace<Q23std64num_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>>(const std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char>>>&) #replace<Q23std64num_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>>__Q33std6locale3impFRCQ23std64num_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>> # std::locale::imp::replace<Q23std64num_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>>(const std::num_get<char, std::istreambuf_iterator<char, std::char_traits<char>>>&) #replace<Q23std11numpunct<c>>__Q33std6locale3impFRCQ23std11numpunct<c> # std::locale::imp::replace<Q23std11numpunct<c>>(const std::numpunct<char>&) #replace<Q23std66money_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>>__Q33std6locale3impFRCQ23std66money_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>> # std::locale::imp::replace<Q23std66money_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>>(const std::money_put<wchar_t, std::ostreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>&) #replace<Q23std66money_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>>__Q33std6locale3impFRCQ23std66money_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>> # std::locale::imp::replace<Q23std66money_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>>(const std::money_get<wchar_t, std::istreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>&) #replace<Q23std15moneypunct<w,1>>__Q33std6locale3impFRCQ23std15moneypunct<w,1> # std::locale::imp::replace<Q23std15moneypunct<w,1>>(const std::moneypunct<wchar_t, 1>&) #replace<Q23std15moneypunct<w,0>>__Q33std6locale3impFRCQ23std15moneypunct<w,0> # std::locale::imp::replace<Q23std15moneypunct<w,0>>(const std::moneypunct<wchar_t, 0>&) #replace<Q23std66money_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>>__Q33std6locale3impFRCQ23std66money_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>> # std::locale::imp::replace<Q23std66money_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>>(const std::money_put<char, std::ostreambuf_iterator<char, std::char_traits<char>>>&) #replace<Q23std66money_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>>__Q33std6locale3impFRCQ23std66money_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>> # std::locale::imp::replace<Q23std66money_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>>(const std::money_get<char, std::istreambuf_iterator<char, std::char_traits<char>>>&) #replace<Q23std15moneypunct<c,1>>__Q33std6locale3impFRCQ23std15moneypunct<c,1> # std::locale::imp::replace<Q23std15moneypunct<c,1>>(const std::moneypunct<char, 1>&) #replace<Q23std15moneypunct<c,0>>__Q33std6locale3impFRCQ23std15moneypunct<c,0> # std::locale::imp::replace<Q23std15moneypunct<c,0>>(const std::moneypunct<char, 0>&) #replace<Q23std14codecvt<w,c,i>>__Q33std6locale3impFRCQ23std14codecvt<w,c,i> # std::locale::imp::replace<Q23std14codecvt<w,c,i>>(const std::codecvt<wchar_t, char, int>&) #replace<Q23std8ctype<w>>__Q33std6locale3impFRCQ23std8ctype<w> # std::locale::imp::replace<Q23std8ctype<w>>(const std::ctype<wchar_t>&) #replace<Q23std14codecvt<c,c,i>>__Q33std6locale3impFRCQ23std14codecvt<c,c,i> # std::locale::imp::replace<Q23std14codecvt<c,c,i>>(const std::codecvt<char, char, int>&) #replace<Q23std8ctype<c>>__Q33std6locale3impFRCQ23std8ctype<c> # std::locale::imp::replace<Q23std8ctype<c>>(const std::ctype<char>&) #replace<Q23std10collate<w>>__Q33std6locale3impFRCQ23std10collate<w> # std::locale::imp::replace<Q23std10collate<w>>(const std::collate<wchar_t>&) #replace<Q23std10collate<c>>__Q33std6locale3impFRCQ23std10collate<c> # std::locale::imp::replace<Q23std10collate<c>>(const std::collate<char>&) #use_facet<Q23std65time_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>>__3stdFRCQ23std6locale # std::use_facet<Q23std65time_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>>(const std::locale&) #use_facet<Q23std65time_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>>__3stdFRCQ23std6locale # std::use_facet<Q23std65time_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>>(const std::locale&) #use_facet<Q23std12timepunct<w>>__3stdFRCQ23std6locale # std::use_facet<Q23std12timepunct<w>>(const std::locale&) #use_facet<Q23std65time_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>>__3stdFRCQ23std6locale # std::use_facet<Q23std65time_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>>(const std::locale&) #use_facet<Q23std65time_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>>__3stdFRCQ23std6locale # std::use_facet<Q23std65time_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>>(const std::locale&) #use_facet<Q23std12timepunct<c>>__3stdFRCQ23std6locale # std::use_facet<Q23std12timepunct<c>>(const std::locale&) #use_facet<Q23std64num_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>>__3stdFRCQ23std6locale # std::use_facet<Q23std64num_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>>(const std::locale&) #use_facet<Q23std64num_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>>__3stdFRCQ23std6locale # std::use_facet<Q23std64num_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>>(const std::locale&) #use_facet<Q23std11numpunct<w>>__3stdFRCQ23std6locale # std::use_facet<Q23std11numpunct<w>>(const std::locale&) #use_facet<Q23std64num_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>>__3stdFRCQ23std6locale # std::use_facet<Q23std64num_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>>(const std::locale&) #use_facet<Q23std64num_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>>__3stdFRCQ23std6locale # std::use_facet<Q23std64num_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>>(const std::locale&) #use_facet<Q23std11numpunct<c>>__3stdFRCQ23std6locale # std::use_facet<Q23std11numpunct<c>>(const std::locale&) #use_facet<Q23std66money_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>>__3stdFRCQ23std6locale # std::use_facet<Q23std66money_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>>(const std::locale&) #use_facet<Q23std66money_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>>__3stdFRCQ23std6locale # std::use_facet<Q23std66money_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>>(const std::locale&) #use_facet<Q23std15moneypunct<w,1>>__3stdFRCQ23std6locale # std::use_facet<Q23std15moneypunct<w,1>>(const std::locale&) #use_facet<Q23std15moneypunct<w,0>>__3stdFRCQ23std6locale # std::use_facet<Q23std15moneypunct<w,0>>(const std::locale&) #use_facet<Q23std66money_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>>__3stdFRCQ23std6locale # std::use_facet<Q23std66money_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>>(const std::locale&) #use_facet<Q23std66money_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>>__3stdFRCQ23std6locale # std::use_facet<Q23std66money_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>>(const std::locale&) #use_facet<Q23std15moneypunct<c,1>>__3stdFRCQ23std6locale # std::use_facet<Q23std15moneypunct<c,1>>(const std::locale&) #use_facet<Q23std15moneypunct<c,0>>__3stdFRCQ23std6locale # std::use_facet<Q23std15moneypunct<c,0>>(const std::locale&) #use_facet<Q23std14codecvt<w,c,i>>__3stdFRCQ23std6locale # std::use_facet<Q23std14codecvt<w,c,i>>(const std::locale&) #use_facet<Q23std8ctype<w>>__3stdFRCQ23std6locale # std::use_facet<Q23std8ctype<w>>(const std::locale&) #use_facet<Q23std10collate<w>>__3stdFRCQ23std6locale # std::use_facet<Q23std10collate<w>>(const std::locale&) #use_facet<Q23std10collate<c>>__3stdFRCQ23std6locale # std::use_facet<Q23std10collate<c>>(const std::locale&) #__ct__Q23std32vector<Pv,Q23std13allocator<Pv>>FRCQ23std32vector<Pv,Q23std13allocator<Pv>> # std::vector<void*, std::allocator<void*>>::vector(const std::vector<void*, std::allocator<void*>>&) #__as__Q23std32vector<Pv,Q23std13allocator<Pv>>FRCQ23std32vector<Pv,Q23std13allocator<Pv>> # std::vector<void*, std::allocator<void*>>::operator =(const std::vector<void*, std::allocator<void*>>&) #init__Q23std32vector<Pv,Q23std13allocator<Pv>>FUlRCPv # std::vector<void*, std::allocator<void*>>::init(unsigned long,void*const&) #__ne<c,Q23std14char_traits<c>,Q23std12allocator<c>>__3stdFRCQ23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>PCc # std::operator !=<char, std::char_traits<char>, std::allocator<char>>(const std::basic_string<char, std::char_traits<char>, std::allocator<char>>&,const char*) #__pl<c,Q23std14char_traits<c>,Q23std12allocator<c>>__3stdFRCQ23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>RCQ23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>> # std::operator +<char, std::char_traits<char>, std::allocator<char>>(const std::basic_string<char, std::char_traits<char>, std::allocator<char>>&,const std::basic_string<char, std::char_traits<char>, std::allocator<char>>&) #__ct__Q33std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>9CharArrayFRCQ23std12allocator<w>Ul # std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::CharArray::CharArray(const std::allocator<wchar_t>&,unsigned long) #__dt__Q23std40_EmptyMemberOpt<Q23std12allocator<w>,Ul>Fv # std::_EmptyMemberOpt<std::allocator<wchar_t>, unsigned long>::~_EmptyMemberOpt() #__ct__Q33std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>9CharArrayFRCQ33std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>9CharArray # std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::CharArray::CharArray(const std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::CharArray&) #get_allocator__Q23std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>CFv # std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::get_allocator() const #__ct__Q23std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>FRCQ23std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>UlUl # std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::basic_string(const std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>&,unsigned long,unsigned long) #__ct__Q23std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>FPCwRCQ23std12allocator<w> # std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::basic_string(const wchar_t*,const std::allocator<wchar_t>&) #init__Q23std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>FUlwRCQ23std12allocator<w> # std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::init(unsigned long,wchar_t,const std::allocator<wchar_t>&) #change_size__Q23std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>FUlb # std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::change_size(unsigned long,bool) #__ct__Q33std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>9CharArrayFRCQ23std12allocator<c>Ul # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::CharArray::CharArray(const std::allocator<char>&,unsigned long) #get_allocator__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>CFv # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::get_allocator() const #__ct__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>FRCQ23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>UlUl # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::basic_string(const std::basic_string<char, std::char_traits<char>, std::allocator<char>>&,unsigned long,unsigned long) #__ct__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>FPCcRCQ23std12allocator<c> # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::basic_string(const char*,const std::allocator<char>&) #__dt__Q23std40_EmptyMemberOpt<Q23std12allocator<c>,Ul>Fv # std::_EmptyMemberOpt<std::allocator<char>, unsigned long>::~_EmptyMemberOpt() #__ct__Q33std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>9CharArrayFRCQ33std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>9CharArray # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::CharArray::CharArray(const std::basic_string<char, std::char_traits<char>, std::allocator<char>>::CharArray&) #assign__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>FRCQ23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>UlUl # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::assign(const std::basic_string<char, std::char_traits<char>, std::allocator<char>>&,unsigned long,unsigned long) #replace__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>FUlUlUlc # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::replace(unsigned long,unsigned long,unsigned long,char) #__dt__Q23std12out_of_rangeFv # std::out_of_range::~out_of_range() #init__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>FUlcRCQ23std12allocator<c> # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::init(unsigned long,char,const std::allocator<char>&) #__dt__Q23std11logic_errorFv # std::logic_error::~logic_error() #change_size__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>FUlb # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::change_size(unsigned long,bool) #__dt__Q23std12length_errorFv # std::length_error::~length_error() #__ct__62_RefCountedPtr<Q33std6locale3imp,26_Single<Q33std6locale3imp>>FPQ33std6locale3imp # _RefCountedPtr<std::locale::imp, _Single<std::locale::imp>>::_RefCountedPtr(std::locale::imp*) #__as__62_RefCountedPtr<Q33std6locale3imp,26_Single<Q33std6locale3imp>>FRC62_RefCountedPtr<Q33std6locale3imp,26_Single<Q33std6locale3imp>> # _RefCountedPtr<std::locale::imp, _Single<std::locale::imp>>::operator =(const _RefCountedPtr<std::locale::imp, _Single<std::locale::imp>>&) #__dt__28_RefCountedPtr<c,9_Array<c>>Fv # _RefCountedPtr<char, _Array<char>>::~_RefCountedPtr() #__ct__62_RefCountedPtr<Q33std6locale3imp,26_Single<Q33std6locale3imp>>FRC62_RefCountedPtr<Q33std6locale3imp,26_Single<Q33std6locale3imp>> # _RefCountedPtr<std::locale::imp, _Single<std::locale::imp>>::_RefCountedPtr(const _RefCountedPtr<std::locale::imp, _Single<std::locale::imp>>&) #assign__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>FPCcUl # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::assign(const char*,unsigned long) #__vc__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>FUl # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::operator [](unsigned long) #resize__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>FUlc # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::resize(unsigned long,char) #end__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>Fv # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::end() #begin__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>Fv # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::begin() #__ct__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>FRCQ23std12allocator<c> # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::basic_string(const std::allocator<char>&) #__vc__Q23std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>FUl # std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::operator [](unsigned long) #resize__Q23std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>FUlw # std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::resize(unsigned long,wchar_t) #__ct__Q23std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>FRCQ23std12allocator<w> # std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::basic_string(const std::allocator<wchar_t>&) #__dt__Q23std9bad_allocFv # std::bad_alloc::~bad_alloc() #__dt__Q23std23_Generic_codecvt<c,c,i>Fv # std::_Generic_codecvt<char, char, int>::~_Generic_codecvt() #__ct__Q23std23_Generic_codecvt<c,c,i>FUl # std::_Generic_codecvt<char, char, int>::_Generic_codecvt(unsigned long) #__dt__Q23std23_Generic_codecvt<w,c,i>Fv # std::_Generic_codecvt<wchar_t, char, int>::~_Generic_codecvt() #__ct__Q23std23_Generic_codecvt<w,c,i>FUl # std::_Generic_codecvt<wchar_t, char, int>::_Generic_codecvt(unsigned long) #__ct__Q23std64num_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>FUl # std::num_get<char, std::istreambuf_iterator<char, std::char_traits<char>>>::num_get(unsigned long) #__ct__Q23std64num_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>FUl # std::num_get<wchar_t, std::istreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::num_get(unsigned long) #__ct__Q23std64num_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>FUl # std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char>>>::num_put(unsigned long) #__ct__Q23std64num_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>FUl # std::num_put<wchar_t, std::ostreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::num_put(unsigned long) #__dt__Q23std20_Generic_numpunct<c>Fv # std::_Generic_numpunct<char>::~_Generic_numpunct() #__ct__Q23std20_Generic_numpunct<c>FUl # std::_Generic_numpunct<char>::_Generic_numpunct(unsigned long) #__dt__Q23std20_Generic_numpunct<w>Fv # std::_Generic_numpunct<wchar_t>::~_Generic_numpunct() #__ct__Q23std20_Generic_numpunct<w>FUl # std::_Generic_numpunct<wchar_t>::_Generic_numpunct(unsigned long) #__ct__Q23std10collate<c>FUl # std::collate<char>::collate(unsigned long) #__ct__Q23std10collate<w>FUl # std::collate<wchar_t>::collate(unsigned long) #__dt__Q23std21_Generic_timepunct<c>Fv # std::_Generic_timepunct<char>::~_Generic_timepunct() #__ct__Q23std21_Generic_timepunct<c>FUl # std::_Generic_timepunct<char>::_Generic_timepunct(unsigned long) #__dt__Q23std21_Generic_timepunct<w>Fv # std::_Generic_timepunct<wchar_t>::~_Generic_timepunct() #__ct__Q23std21_Generic_timepunct<w>FUl # std::_Generic_timepunct<wchar_t>::_Generic_timepunct(unsigned long) #__ct__Q23std65time_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>FUl # std::time_get<char, std::istreambuf_iterator<char, std::char_traits<char>>>::time_get(unsigned long) #__ct__Q23std65time_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>FUl # std::time_get<wchar_t, std::istreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::time_get(unsigned long) #__ct__Q23std65time_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>FUl # std::time_put<char, std::ostreambuf_iterator<char, std::char_traits<char>>>::time_put(unsigned long) #__ct__Q23std65time_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>FUl # std::time_put<wchar_t, std::ostreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::time_put(unsigned long) #__ct__Q23std66money_get<c,Q23std45istreambuf_iterator<c,Q23std14char_traits<c>>>FUl # std::money_get<char, std::istreambuf_iterator<char, std::char_traits<char>>>::money_get(unsigned long) #__ct__Q23std66money_get<w,Q23std45istreambuf_iterator<w,Q23std14char_traits<w>>>FUl # std::money_get<wchar_t, std::istreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::money_get(unsigned long) #__ct__Q23std66money_put<c,Q23std45ostreambuf_iterator<c,Q23std14char_traits<c>>>FUl # std::money_put<char, std::ostreambuf_iterator<char, std::char_traits<char>>>::money_put(unsigned long) #__ct__Q23std66money_put<w,Q23std45ostreambuf_iterator<w,Q23std14char_traits<w>>>FUl # std::money_put<wchar_t, std::ostreambuf_iterator<wchar_t, std::char_traits<wchar_t>>>::money_put(unsigned long) #__dt__Q23std24_Generic_moneypunct<c,0>Fv # std::_Generic_moneypunct<char, 0>::~_Generic_moneypunct() #__ct__Q23std24_Generic_moneypunct<c,0>FUl # std::_Generic_moneypunct<char, 0>::_Generic_moneypunct(unsigned long) #__dt__Q23std24_Generic_moneypunct<c,1>Fv # std::_Generic_moneypunct<char, 1>::~_Generic_moneypunct() #__ct__Q23std24_Generic_moneypunct<c,1>FUl # std::_Generic_moneypunct<char, 1>::_Generic_moneypunct(unsigned long) #__dt__Q23std24_Generic_moneypunct<w,0>Fv # std::_Generic_moneypunct<wchar_t, 0>::~_Generic_moneypunct() #__ct__Q23std24_Generic_moneypunct<w,0>FUl # std::_Generic_moneypunct<wchar_t, 0>::_Generic_moneypunct(unsigned long) #__dt__Q23std24_Generic_moneypunct<w,1>Fv # std::_Generic_moneypunct<wchar_t, 1>::~_Generic_moneypunct() #__ct__Q23std24_Generic_moneypunct<w,1>FUl # std::_Generic_moneypunct<wchar_t, 1>::_Generic_moneypunct(unsigned long) #__ct<PQ33std6locale5facet>__Q23std13allocator<Pv>FRCQ23std31allocator<PQ33std6locale5facet> # std::allocator<void*>::!<std::locale::facet*>(const std::allocator<std::locale::facet*>&) #__ct<c>__Q23std88allocator<Q33std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>9CharArray>FRCQ23std12allocator<c> # std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char>>::CharArray>::!<char>(const std::allocator<char>&) #__ct<w>__Q23std88allocator<Q33std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>9CharArray>FRCQ23std12allocator<w> # std::allocator<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::CharArray>::!<wchar_t>(const std::allocator<wchar_t>&) #what__Q23std13runtime_errorCFv # std::runtime_error::what() const #__dt__Q23std8ctype<w>Fv # std::ctype<wchar_t>::~ctype() #__dt__Q23std15ctype_byname<c>Fv # std::ctype_byname<char>::~ctype_byname() #__dt__Q23std14codecvt<c,c,i>Fv # std::codecvt<char, char, int>::~codecvt() #__dt__Q23std14codecvt<w,c,i>Fv # std::codecvt<wchar_t, char, int>::~codecvt() #do_falsename__Q23std11numpunct<c>CFv # std::numpunct<char>::do_falsename() const #do_truename__Q23std11numpunct<c>CFv # std::numpunct<char>::do_truename() const #do_grouping__Q23std11numpunct<c>CFv # std::numpunct<char>::do_grouping() const #do_thousands_sep__Q23std11numpunct<c>CFv # std::numpunct<char>::do_thousands_sep() const #do_decimal_point__Q23std11numpunct<c>CFv # std::numpunct<char>::do_decimal_point() const #__dt__Q23std11numpunct<c>Fv # std::numpunct<char>::~numpunct() #do_falsename__Q23std11numpunct<w>CFv # std::numpunct<wchar_t>::do_falsename() const #do_truename__Q23std11numpunct<w>CFv # std::numpunct<wchar_t>::do_truename() const #do_grouping__Q23std11numpunct<w>CFv # std::numpunct<wchar_t>::do_grouping() const #do_thousands_sep__Q23std11numpunct<w>CFv # std::numpunct<wchar_t>::do_thousands_sep() const #do_decimal_point__Q23std11numpunct<w>CFv # std::numpunct<wchar_t>::do_decimal_point() const #__dt__Q23std11numpunct<w>Fv # std::numpunct<wchar_t>::~numpunct() #__dt__Q23std12timepunct<c>Fv # std::timepunct<char>::~timepunct() #__dt__Q23std12timepunct<w>Fv # std::timepunct<wchar_t>::~timepunct() #do_neg_format__Q23std15moneypunct<c,0>CFv # std::moneypunct<char, 0>::do_neg_format() const #do_pos_format__Q23std15moneypunct<c,0>CFv # std::moneypunct<char, 0>::do_pos_format() const #do_frac_digits__Q23std15moneypunct<c,0>CFv # std::moneypunct<char, 0>::do_frac_digits() const #do_negative_sign__Q23std15moneypunct<c,0>CFv # std::moneypunct<char, 0>::do_negative_sign() const #do_positive_sign__Q23std15moneypunct<c,0>CFv # std::moneypunct<char, 0>::do_positive_sign() const #do_curr_symbol__Q23std15moneypunct<c,0>CFv # std::moneypunct<char, 0>::do_curr_symbol() const #do_grouping__Q23std15moneypunct<c,0>CFv # std::moneypunct<char, 0>::do_grouping() const #do_thousands_sep__Q23std15moneypunct<c,0>CFv # std::moneypunct<char, 0>::do_thousands_sep() const #do_decimal_point__Q23std15moneypunct<c,0>CFv # std::moneypunct<char, 0>::do_decimal_point() const #__dt__Q23std15moneypunct<c,0>Fv # std::moneypunct<char, 0>::~moneypunct() #do_neg_format__Q23std15moneypunct<c,1>CFv # std::moneypunct<char, 1>::do_neg_format() const #do_pos_format__Q23std15moneypunct<c,1>CFv # std::moneypunct<char, 1>::do_pos_format() const #do_frac_digits__Q23std15moneypunct<c,1>CFv # std::moneypunct<char, 1>::do_frac_digits() const #do_negative_sign__Q23std15moneypunct<c,1>CFv # std::moneypunct<char, 1>::do_negative_sign() const #do_positive_sign__Q23std15moneypunct<c,1>CFv # std::moneypunct<char, 1>::do_positive_sign() const #do_curr_symbol__Q23std15moneypunct<c,1>CFv # std::moneypunct<char, 1>::do_curr_symbol() const #do_grouping__Q23std15moneypunct<c,1>CFv # std::moneypunct<char, 1>::do_grouping() const #do_thousands_sep__Q23std15moneypunct<c,1>CFv # std::moneypunct<char, 1>::do_thousands_sep() const #do_decimal_point__Q23std15moneypunct<c,1>CFv # std::moneypunct<char, 1>::do_decimal_point() const #__dt__Q23std15moneypunct<c,1>Fv # std::moneypunct<char, 1>::~moneypunct() #__dt__Q23std88allocator<Q33std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>9CharArray>Fv # std::allocator<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::CharArray>::~allocator() #__dt__Q23std192_EmptyMemberOpt<Q23std88allocator<Q33std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>9CharArray>,PQ33std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>9CharArray>Fv # std::_EmptyMemberOpt<std::allocator<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::CharArray>, std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::CharArray*>::~_EmptyMemberOpt() #__ct__Q23std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>FUlwRCQ23std12allocator<w> # std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::basic_string(unsigned long,wchar_t,const std::allocator<wchar_t>&) #do_neg_format__Q23std15moneypunct<w,0>CFv # std::moneypunct<wchar_t, 0>::do_neg_format() const #do_pos_format__Q23std15moneypunct<w,0>CFv # std::moneypunct<wchar_t, 0>::do_pos_format() const #do_frac_digits__Q23std15moneypunct<w,0>CFv # std::moneypunct<wchar_t, 0>::do_frac_digits() const #do_negative_sign__Q23std15moneypunct<w,0>CFv # std::moneypunct<wchar_t, 0>::do_negative_sign() const #do_positive_sign__Q23std15moneypunct<w,0>CFv # std::moneypunct<wchar_t, 0>::do_positive_sign() const #do_curr_symbol__Q23std15moneypunct<w,0>CFv # std::moneypunct<wchar_t, 0>::do_curr_symbol() const #do_grouping__Q23std15moneypunct<w,0>CFv # std::moneypunct<wchar_t, 0>::do_grouping() const #do_thousands_sep__Q23std15moneypunct<w,0>CFv # std::moneypunct<wchar_t, 0>::do_thousands_sep() const #do_decimal_point__Q23std15moneypunct<w,0>CFv # std::moneypunct<wchar_t, 0>::do_decimal_point() const #__dt__Q23std15moneypunct<w,0>Fv # std::moneypunct<wchar_t, 0>::~moneypunct() #__dt__Q23std88allocator<Q33std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>9CharArray>Fv # std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char>>::CharArray>::~allocator() #__dt__Q23std192_EmptyMemberOpt<Q23std88allocator<Q33std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>9CharArray>,PQ33std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>9CharArray>Fv # std::_EmptyMemberOpt<std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char>>::CharArray>, std::basic_string<char, std::char_traits<char>, std::allocator<char>>::CharArray*>::~_EmptyMemberOpt() #__ct__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>FUlcRCQ23std12allocator<c> # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::basic_string(unsigned long,char,const std::allocator<char>&) #do_neg_format__Q23std15moneypunct<w,1>CFv # std::moneypunct<wchar_t, 1>::do_neg_format() const #do_pos_format__Q23std15moneypunct<w,1>CFv # std::moneypunct<wchar_t, 1>::do_pos_format() const #do_frac_digits__Q23std15moneypunct<w,1>CFv # std::moneypunct<wchar_t, 1>::do_frac_digits() const #do_negative_sign__Q23std15moneypunct<w,1>CFv # std::moneypunct<wchar_t, 1>::do_negative_sign() const #do_positive_sign__Q23std15moneypunct<w,1>CFv # std::moneypunct<wchar_t, 1>::do_positive_sign() const #do_curr_symbol__Q23std15moneypunct<w,1>CFv # std::moneypunct<wchar_t, 1>::do_curr_symbol() const #do_grouping__Q23std15moneypunct<w,1>CFv # std::moneypunct<wchar_t, 1>::do_grouping() const #do_thousands_sep__Q23std15moneypunct<w,1>CFv # std::moneypunct<wchar_t, 1>::do_thousands_sep() const #do_decimal_point__Q23std15moneypunct<w,1>CFv # std::moneypunct<wchar_t, 1>::do_decimal_point() const #__dt__Q23std15moneypunct<w,1>Fv # std::moneypunct<wchar_t, 1>::~moneypunct() #__two_exp__3stdFs # std::__two_exp(short) #__amu__Q23std4_BCDFQ23std4_BCD # std::_BCD::operator *=(std::_BCD) #__apl__Q23std4_BCDFQ23std4_BCD # std::_BCD::operator +=(std::_BCD) #__ct__Q23std4_BCDFPCci # std::_BCD::_BCD(const char*,int) #to_string__Q23std4_BCDCFiRi # std::_BCD::to_string(int,int&) const #__ct__Q23std4_BCDFri # std::_BCD::_BCD(long double,int) #__dt__Q23std4_BCDFv # std::_BCD::~_BCD() #__ct__Q23std15moneypunct<w,1>FUl # std::moneypunct<wchar_t, 1>::moneypunct(unsigned long) #__ct__Q23std15moneypunct<w,0>FUl # std::moneypunct<wchar_t, 0>::moneypunct(unsigned long) #__ct__Q23std15moneypunct<c,1>FUl # std::moneypunct<char, 1>::moneypunct(unsigned long) #__ct__Q23std15moneypunct<c,0>FUl # std::moneypunct<char, 0>::moneypunct(unsigned long) #do_am_pm__Q23std12timepunct<w>CFi # std::timepunct<wchar_t>::do_am_pm(int) const #do_month_name__Q23std12timepunct<w>CFUl # std::timepunct<wchar_t>::do_month_name(unsigned long) const #do_weekday_name__Q23std12timepunct<w>CFUl # std::timepunct<wchar_t>::do_weekday_name(unsigned long) const #__ct__Q23std12timepunct<w>FUl # std::timepunct<wchar_t>::timepunct(unsigned long) #do_am_pm__Q23std12timepunct<c>CFi # std::timepunct<char>::do_am_pm(int) const #do_month_name__Q23std12timepunct<c>CFUl # std::timepunct<char>::do_month_name(unsigned long) const #do_weekday_name__Q23std12timepunct<c>CFUl # std::timepunct<char>::do_weekday_name(unsigned long) const #__ct__Q23std12timepunct<c>FUl # std::timepunct<char>::timepunct(unsigned long) #__ct__Q23std11numpunct<w>FUl # std::numpunct<wchar_t>::numpunct(unsigned long) #__ct__Q23std11numpunct<c>FUl # std::numpunct<char>::numpunct(unsigned long) #do_in__Q23std14codecvt<w,c,i>CFRiPCcPCcRPCcPwPwRPw # std::codecvt<wchar_t, char, int>::do_in(int&,const char*,const char*,const char*&,wchar_t*,wchar_t*,wchar_t*&) const #do_out__Q23std14codecvt<w,c,i>CFRiPCwPCwRPCwPcPcRPc # std::codecvt<wchar_t, char, int>::do_out(int&,const wchar_t*,const wchar_t*,const wchar_t*&,char*,char*,char*&) const #__ct__Q23std14codecvt<w,c,i>FUl # std::codecvt<wchar_t, char, int>::codecvt(unsigned long) #do_nothing__Q23std14codecvt<c,c,i>CFPCcPCcRPCcPcPcRPc # std::codecvt<char, char, int>::do_nothing(const char*,const char*,const char*&,char*,char*,char*&) const #__ct__Q23std14codecvt<c,c,i>FUl # std::codecvt<char, char, int>::codecvt(unsigned long) #__ct__Q23std15ctype_byname<c>FPCcUl # std::ctype_byname<char>::ctype_byname(const char*,unsigned long) #do_tolower__Q23std8ctype<c>CFPcPCc # std::ctype<char>::do_tolower(char*,const char*) const #do_toupper__Q23std8ctype<c>CFPcPCc # std::ctype<char>::do_toupper(char*,const char*) const #scan_not__Q23std8ctype<c>CFQ33std10ctype_base4maskPCcPCc # std::ctype<char>::scan_not(std::ctype_base::mask,const char*,const char*) const #scan_is__Q23std8ctype<c>CFQ33std10ctype_base4maskPCcPCc # std::ctype<char>::scan_is(std::ctype_base::mask,const char*,const char*) const #is__Q23std8ctype<c>CFPCcPCcPQ33std10ctype_base4mask # std::ctype<char>::is(const char*,const char*,std::ctype_base::mask*) const #__dt__Q23std8ctype<c>Fv # std::ctype<char>::~ctype() #__ct__Q23std8ctype<c>FPCQ33std10ctype_base4maskbUl # std::ctype<char>::ctype(const std::ctype_base::mask*,bool,unsigned long) #__dt__Q23std59basic_string<w,Q23std14char_traits<w>,Q23std12allocator<w>>Fv # std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::~basic_string() #__dt__Q23std12allocator<w>Fv # std::allocator<wchar_t>::~allocator() #widen__Q23std8ctype<w>CFRCQ23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>> # std::ctype<wchar_t>::widen(const std::basic_string<char, std::char_traits<char>, std::allocator<char>>&) const #classify__Q23std8ctype<w>CFw # std::ctype<wchar_t>::classify(wchar_t) const #do_narrow__Q23std8ctype<w>CFPCwPCwcPc # std::ctype<wchar_t>::do_narrow(const wchar_t*,const wchar_t*,char,char*) const #do_widen__Q23std8ctype<w>CFPCcPCcPw # std::ctype<wchar_t>::do_widen(const char*,const char*,wchar_t*) const #do_tolower__Q23std8ctype<w>CFPwPCw # std::ctype<wchar_t>::do_tolower(wchar_t*,const wchar_t*) const #do_toupper__Q23std8ctype<w>CFPwPCw # std::ctype<wchar_t>::do_toupper(wchar_t*,const wchar_t*) const #do_scan_not__Q23std8ctype<w>CFQ33std10ctype_base4maskPCwPCw # std::ctype<wchar_t>::do_scan_not(std::ctype_base::mask,const wchar_t*,const wchar_t*) const #do_scan_is__Q23std8ctype<w>CFQ33std10ctype_base4maskPCwPCw # std::ctype<wchar_t>::do_scan_is(std::ctype_base::mask,const wchar_t*,const wchar_t*) const #do_is__Q23std8ctype<w>CFPCwPCwPQ33std10ctype_base4mask # std::ctype<wchar_t>::do_is(const wchar_t*,const wchar_t*,std::ctype_base::mask*) const #__as__Q33std6locale3impFRCQ33std6locale3imp # std::locale::imp::operator =(const std::locale::imp&) #__dt__Q33std6locale3impFv # std::locale::imp::~imp() #__ct__Q33std6locale3impFRCQ33std6locale3imp # std::locale::imp::imp(const std::locale::imp&) #__dt__Q23std32vector<Pv,Q23std13allocator<Pv>>Fv # std::vector<void*, std::allocator<void*>>::~vector() #__dt__Q23std68vector<PQ33std6locale5facet,Q23std31allocator<PQ33std6locale5facet>>Fv # std::vector<std::locale::facet*, std::allocator<std::locale::facet*>>::~vector() #__dt__Q23std31allocator<PQ33std6locale5facet>Fv # std::allocator<std::locale::facet*>::~allocator() #__dt__Q23std13allocator<Pv>Fv # std::allocator<void*>::~allocator() #__dt__Q23std41_EmptyMemberOpt<Q23std13allocator<Pv>,Ul>Fv # std::_EmptyMemberOpt<std::allocator<void*>, unsigned long>::~_EmptyMemberOpt() #__ct__Q33std6locale3impFUl # std::locale::imp::imp(unsigned long) #__dt__Q33std6locale5facetFv # std::locale::facet::~facet() #make_classic__Q23std6localeFv # std::locale::make_classic() #__ct__Q23std6localeFRC62_RefCountedPtr<Q33std6locale3imp,26_Single<Q33std6locale3imp>> # std::locale::locale(const _RefCountedPtr<std::locale::imp, _Single<std::locale::imp>>&) #classic__Q23std6localeFv # std::locale::classic() #global__Q23std6localeFRCQ23std6locale # std::locale::global(const std::locale&) #name__Q23std6localeCFv # std::locale::name() const #__as__Q23std6localeFRCQ23std6locale # std::locale::operator =(const std::locale&) #__ct__Q23std6localeFRCQ23std6localeRCQ23std6localei # std::locale::locale(const std::locale&,const std::locale&,int) #__dt__Q23std6localeFv # std::locale::~locale() #__ct__Q23std6localeFRCQ23std6localePCci # std::locale::locale(const std::locale&,const char*,int) #__dt__Q23std10_MSLstringFv # std::_MSLstring::~_MSLstring() #__dt__Q23std12allocator<c>Fv # std::allocator<char>::~allocator() #__dt__Q23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>>Fv # std::basic_string<char, std::char_traits<char>, std::allocator<char>>::~basic_string() #__ct__Q23std6localeFPCc # std::locale::locale(const char*) #__dt__Q23std13runtime_errorFv # std::runtime_error::~runtime_error() #__ct__Q23std6localeFRCQ23std6locale # std::locale::locale(const std::locale&) #__dt__62_RefCountedPtr<Q33std6locale3imp,26_Single<Q33std6locale3imp>>Fv # _RefCountedPtr<std::locale::imp, _Single<std::locale::imp>>::~_RefCountedPtr() #__ct__Q23std6localeFv # std::locale::locale() #__ct__28_RefCountedPtr<c,9_Array<c>>FPc # _RefCountedPtr<char, _Array<char>>::_RefCountedPtr(char*) #__as__28_RefCountedPtr<c,9_Array<c>>FRC28_RefCountedPtr<c,9_Array<c>> # _RefCountedPtr<char, _Array<char>>::operator =(const _RefCountedPtr<char, _Array<char>>&) #__ct__Q23std10_MSLstringFRCQ23std59basic_string<c,Q23std14char_traits<c>,Q23std12allocator<c>> # std::_MSLstring::_MSLstring(const std::basic_string<char, std::char_traits<char>, std::allocator<char>>&) #__vt__Q33std8ios_base7failure # std::ios_base::failure::__vt #__vt__Q23std8ios_base # std::ios_base::__vt #what__Q33std8ios_base7failureCFv # std::ios_base::failure::what() const #throwfailure__Q23std8ios_baseFv # std::ios_base::throwfailure() #__dt__Q33std8ios_base7failureFv # std::ios_base::failure::~failure() #__dt__Q23std8ios_baseFv # std::ios_base::~ios_base() #__ct__Q23std8ios_baseFv # std::ios_base::ios_base() #register_callback__Q23std8ios_baseFPFQ33std8ios_base5eventRQ23std8ios_basei_vi # std::ios_base::register_callback(void (*)(std::ios_base::event, std::ios_base&, int),int) #__ct__Q23std50pair<PFQ33std8ios_base5eventRQ23std8ios_basei_v,i>Fv # std::pair<void (*)(std::ios_base::event, std::ios_base&, int), int>::pair() #pword__Q23std8ios_baseFi # std::ios_base::pword(int) #iword__Q23std8ios_baseFi # std::ios_base::iword(int) #getloc__Q23std8ios_baseCFv # std::ios_base::getloc() const #imbue__Q23std8ios_baseFRCQ23std6locale # std::ios_base::imbue(const std::locale&) #__vt__Q23std12strstreambuf # std::strstreambuf::__vt #init__Q23std12strstreambufFPciPc # std::strstreambuf::init(char*,int,char*) #setbuf__Q23std12strstreambufFPci # std::strstreambuf::setbuf(char*,int) #seekpos__Q23std12strstreambufFQ23std7fpos<i>s # std::strstreambuf::seekpos(std::fpos<int>,short) #seekoff__Q23std12strstreambufFlQ33std8ios_base7seekdirs # std::strstreambuf::seekoff(long,std::ios_base::seekdir,short) #underflow__Q23std12strstreambufFv # std::strstreambuf::underflow() #pbackfail__Q23std12strstreambufFi # std::strstreambuf::pbackfail(int) #overflow__Q23std12strstreambufFi # std::strstreambuf::overflow(int) #freeze__Q23std12strstreambufFb # std::strstreambuf::freeze(bool) #__dt__Q23std12strstreambufFv # std::strstreambuf::~strstreambuf() #__console_exit #__stdio_exit #__aborting #__exit #exit #__atexit #atexit #abort #__malloc_pool #free #realloc #calloc #malloc #__files #__num_to_file #__file_to_num #__flush_line_buffered_output_files #__flush_all #__close_all #__init_file #__find_unopened_file #__llmod #__lmod #__mod #__lldiv #__ldiv #__div #__llmul #__lmul #__mul #__lladd #__ladd #__add #lldiv #ldiv #div #llabs #labs #abs #__assertion_failed #bsearch #setbuf #setvbuf #__flush_buffer #__load_buffer #__prep_buffer #__convert_to_newlines #__convert_from_newlines #puts #fputs #putchar #putc #fputc #__put_char #__ungotten #ungetc #gets #fgets #getchar #getc #fgetc #__get_char #__ctype_map #__lower_map #__upper_map #toupper #tolower #isxdigit #isupper #isspace #ispunct #isprint #islower #isgraph #isdigit #iscntrl #isalpha #isalnum #fwrite #fread #errno #__temp_file_mode #__set_idle_proc #__get_file_modes #__handle_reopen #__handle_open #freopen #fopen #fflush #fclose #tmpfile #tmpnam #rename #remove #rewind #fsetpos #fseek #_fseek #fgetpos #ftell #_ftell #__float_nan #__float_huge #__double_min #__double_max #__double_epsilon #__double_tiny #__double_huge #__double_nan #__extended_min #__extended_max #__extended_epsilon #__extended_tiny #__extended_huge #__extended_nan #__lconv #localeconv #setlocale #wcstombs #mbstowcs #wctomb #mbtowc #mblen #memcmp #__memrchr #memchr #memset #memmove #memcpy #__fill_mem #__copy_longs_rev_unaligned #__copy_longs_unaligned #__copy_longs_rev_aligned #__copy_longs_aligned #__move_mem #__copy_mem #__stdio_atexit #perror #ferror #feof #clearerr #__pool_free_all #__pool_free #__pool_realloc #__pool_alloc_clear #__pool_alloc #__pool_preassign #__pool_preallocate #__init_pool_obj #sprintf #snprintf #vsprintf #vsnprintf #printf #vprintf #fprintf #vfprintf #qsort #srand #rand #sscanf #__vsscanf #scanf #fscanf #__vfscanf #raise #signal #__strerror #strerror #strstr #strtok #strcspn #strspn #strpbrk #strrchr #strxfrm #strcoll #strchr #strncmp #strcmp #strncat #strcat #strncpy #strcpy #strlen #__close_string #__write_string #__read_string #__open_string_file #atof #strtod #__strtold #strtoumax #strtoimax #atol #atoi #strtoll #strtol #strtoull #strtoul #__strtoull #__strtoul #system #getenv #__month_to_days #strftime #localtime #gmtime #ctime #asctime #time #mktime #difftime #clock #__leap_year #ccommand #clrscr #__close_console #__write_console #__read_console #__end_critical_region #__begin_critical_region #__kill_critical_regions #__init_critical_regions #fcntl #creat #open #__rename_file #__delete_file #__temp_file_name #__close_file #__position_file #__write_file #__read_file #__open_temp_file #__open_file #__path2fss #__sys_free #__sys_alloc #mkdir #fstat #stat #__to_gm_time #__get_time #__get_clock #write #unlink #ttyname #sleep #rmdir #read #lseek #isatty #getlogin #getcwd #exec #cuserid #close #chdir #_ftype #_fcreator #tell #fdopen #fileno #__gettype #__getcreator #__ctopstring #__system7present #__myraise #utimes #utime #uname #fwide #fgetws #fputws #ungetwc #fgetwc #getwchar #getwc #fputwc #putwchar #putwc #watof #wcstod #__wcstold #wcstoumax #wcstoimax #watol #watoi #wcstoll #wcstol #wcstoull #wcstoul #__wcstoull #__wcstoul #wctrans #towctrans #__wctype_map #__wlower_map #__wupper_map #iswctype #wctype #wctob #towupper #towlower #iswxdigit #iswupper #iswspace #iswpunct #iswprint #iswlower #iswgraph #iswdigit #iswcntrl #iswalpha #iswalnum #wmemcmp #wmemchr #wmemset #wmemmove #wmemcpy #swprintf #vwprintf #vswprintf #wprintf #fwprintf #vfwprintf #swscanf #__vswscanf #vwscanf #wscanf #fwscanf #__vfwscanf #wcsstr #wcstok #wcscspn #wcsspn #wcspbrk #wcsrchr #wcsxfrm #wcscoll #wcschr #wcsncmp #wcscmp #wcsncat #wcscat #wcsncpy #wcscpy #wcslen #wcsftime #wctime #wasctime #ValidateMallocHeap #GetNextMallocHeapRegistration #GetFirstMallocHeapRegistration #UnregisterMallocHeap #RegisterMallocHeap #__fminl #__fmaxl #__fdiml #__nextafterl #__remquol #__copysignl #__remainderl #__fmodl #__modfl #__truncl #llroundl #lroundl #__roundl #llrintl #lrintl #__rintl #__nearbyintl #__floorl #__ceill #__lgammal #__gammal #__erfcl #__erfl #__hypotl #__sqrtl #__powl #__fabsl #scalblnl #scalbnl #__logbl #__log2l #__log1pl #__expm1l #__exp2l #__log10l #__logl #__ldexpl #__frexpl #__expl #__atanhl #__asinhl #__acoshl #__tanhl #__sinhl #__coshl #__tanl #__sinl #__cosl #__atan2l #__atanl #__asinl #__acosl #fminf #fmaxf #fdimf #remquof #copysignf #remainderf #fmodf #truncf #llroundf #lroundf #roundf #llrintf #lrintf #rintf #nearbyintf #floorf #ceilf #lgammaf #gammaf #erfcf #erff #hypotf #sqrtf #powf #fabsf #scalblnf #scalbnf #logbf #log2f #log1pf #expm1f #exp2f #log10f #logf #ldexpf #frexpf #expf #atanhf #asinhf #acoshf #tanhf #sinhf #coshf #tanf #sinf #cosf #atan2f #atanf #asinf #acosf #nextafter #llround #lround #llrint #lrint #scalbln #scalbn #__dc_arr #__del_arr #__new_arr #__init_arr #__copy #__som_check_ev #__som_check_new #__vt__Q23std13bad_exception # std::bad_exception::__vt #what__Q23std13bad_exceptionCFv # std::bad_exception::what() const #__end__catch #__throw #__ct__Q23std9exceptionFv # std::exception::exception() #__unexpected #__dt__Q23std13bad_exceptionFv # std::bad_exception::~bad_exception() #__unregister_fragment #__register_fragment #__global_destructor_chain #__destroy_global_chain #__register_global_object #__destroy_new_array2 #__destroy_new_array #__destroy_arr #__construct_array #__dt__26__partial_array_destructorFv # __partial_array_destructor::~__partial_array_destructor() #__construct_new_array #__throw_catch_compare #unexpected__3stdFv # std::unexpected() #set_unexpected__3stdFPFv_v # std::set_unexpected(void (*)(void)) #terminate__3stdFv # std::terminate() #set_terminate__3stdFPFv_v # std::set_terminate(void (*)(void)) #__vt__Q23std10bad_typeid # std::bad_typeid::__vt #what__Q23std10bad_typeidCFv # std::bad_typeid::what() const #__dynamic_cast #__get_typeid #__dt__Q23std10bad_typeidFv # std::bad_typeid::~bad_typeid() #nothrow__3std # std::nothrow #__dla__FPv # operator delete[](void*) #__nwa__FUlRCQ23std9nothrow_t # operator new[](unsigned long,const std::nothrow_t&) #__nwa__FUl # operator new[](unsigned long) #__dl__FPv # operator delete(void*) #__nw__FUlRCQ23std9nothrow_t # operator new(unsigned long,const std::nothrow_t&) #__nw__FUl # operator new(unsigned long) #_prealloc_newpool__3stdFUl # std::_prealloc_newpool(unsigned long) #_set_newnonptrmax__3stdFUl # std::_set_newnonptrmax(unsigned long) #_set_newpoolsize__3stdFUl # std::_set_newpoolsize(unsigned long) #__throws_bad_alloc__3std # std::__throws_bad_alloc #__new_handler__3std # std::__new_handler #__del_hdl #__new_hdl #set_new_handler__3stdFPFv_v # std::set_new_handler(void (*)(void)) #__throw_bad_alloc__3stdFv # std::__throw_bad_alloc() #qd #__terminate #__initialize #__start #__ptmf_null \ No newline at end of file
diff --git a/libical/MacOS/libical_prefix.h b/libical/MacOS/libical_prefix.h
new file mode 100644
index 0000000000..0810563119
--- /dev/null
+++ b/libical/MacOS/libical_prefix.h
@@ -0,0 +1,5 @@
+/* libical_prefix.h */
+
+#include <stdlib.h>
+#define _TIME_T
+#include "errno.h" \ No newline at end of file
diff --git a/libical/MacOS/restrictions.make b/libical/MacOS/restrictions.make
new file mode 100644
index 0000000000..dd146f5ed3
--- /dev/null
+++ b/libical/MacOS/restrictions.make
@@ -0,0 +1 @@
+#pseudo target all Ä {libical_c_src}parameterrestrictions.inc {libical_c_src}restrictionrecords.inc # Generate source file {libical_c_src}parameterrestrictions.inc Ä ¶ {libical_scripts}mkparameterrestrictions.pl ¶ {libical_data}params-in-prop.txt ¶ {libical_project}restrictions.make perl {libical_scripts}mkparameterrestrictions.pl {libical_data}params-in-prop.txt ¶ > {libical_c_src}parameterrestrictions.inc # Set file creator to CodeWarrior setfile {libical_c_src}parameterrestrictions.inc -c CWIE # Generate source file {libical_c_src}restrictionrecords.inc Ä ¶ {libical_scripts}mkrestrictionrecords.pl ¶ {libical_data}restrictions.csv ¶ {libical_project}restrictions.make perl {libical_scripts}mkrestrictionrecords.pl {libical_data}restrictions.csv ¶ > {libical_c_src}restrictionrecords.inc # Set file creator to CodeWarrior setfile {libical_c_src}restrictionrecords.inc -c CWIE \ No newline at end of file
diff --git a/libical/MacOS/restrictions.script b/libical/MacOS/restrictions.script
new file mode 100644
index 0000000000..ab719b87d5
--- /dev/null
+++ b/libical/MacOS/restrictions.script
@@ -0,0 +1 @@
+directory {libical_project} # Generate source files make all -f restrictions.make > make.out make.out \ No newline at end of file
diff --git a/libical/MacOS/strdup.c b/libical/MacOS/strdup.c
new file mode 100644
index 0000000000..ae60fee3df
--- /dev/null
+++ b/libical/MacOS/strdup.c
@@ -0,0 +1,17 @@
+
+#include "strdup.h"
+#include <string.h>
+#include <stdlib.h>
+
+
+char *strdup(const char *s )
+{
+ char *p;
+
+ if ( (p = (char *) malloc( strlen( s ) + 1 )) == NULL )
+ return( NULL );
+
+ strcpy( p, s );
+
+ return( p );
+}
diff --git a/libical/MacOS/strdup.h b/libical/MacOS/strdup.h
new file mode 100644
index 0000000000..1bb73aa535
--- /dev/null
+++ b/libical/MacOS/strdup.h
@@ -0,0 +1,3 @@
+/* strdup.h */
+
+char * strdup(const char *str);
diff --git a/libical/Makefile.am b/libical/Makefile.am
new file mode 100644
index 0000000000..66b37da052
--- /dev/null
+++ b/libical/Makefile.am
@@ -0,0 +1,11 @@
+
+
+EXTRA_DIST = \
+ ChangeLog \
+ README \
+ TEST \
+ TODO
+
+SUBDIRS = design-data doc scripts test-data src
+
+
diff --git a/libical/NEWS b/libical/NEWS
new file mode 100644
index 0000000000..d5fd9cb9cf
--- /dev/null
+++ b/libical/NEWS
@@ -0,0 +1,250 @@
+Version 0.16 5 April 00 ( cvs tag libical-0-16)
+----------------------------------------------
+
+Now using automake.
+
+Substantial changes to the parser. New interfaces let you parser
+multiple components from a single stream by feading the parser object
+one line at a time.
+
+Added a STRING value type. this type is like TEXT, but does not
+backslash magic characters. It is used in PRODID and REQUEST-STATUS,
+where the '/' and ';' are literal.
+
+Added several convience functions for REQUEST-STATUS to icalenums.c
+
+Addedd a routine to icalcomponent to convert X-LIC errors to
+REQUEST-STATUS return values.
+
+Version 0.15a 5 Mar 00 (cvs tag libical-0-15a)
+---------------------
+
+Experimented with CVS
+
+Fixed icalvalue_set_text to convert escaped characters into the proper
+values.
+
+Other minor code tweaks.
+
+
+Version 0.15 7 Feb 00
+---------------------
+
+Split the storage classess ( icalstore, icalcluster, icalcalendar )
+into a seperate library, libicalss
+
+Implemented restriction checking in file icalrestrictions.c. The
+checking is not complete, but can handle the bulk of the restrictions
+described in RFC 2446.
+
+Created a new value type, METHOD. Changed METHOD property to use the
+new value. The METHOD value uses an enumeration.
+
+
+Version 0.14b
+-------------
+
+Implemented parsing of RECUR values, although it does not handle BYDAY
+specs with numbers.
+
+Fixed error in icalparser_next_line that mangled lines longer than the
+temp buffer (1024 chars.) The temp buffer is now 80 chars, and it can
+handle (apparently) arbitrary length lines
+
+Fixed severe brokenness in a value, but I forgot which one.
+
+Cleaned cruft out of the distribution, so the tarfile is smaller.
+
+
+Version 0.14a 14 Jan 00
+-----------------------
+
+Fixed bug in ROLE parameter -- missing '-' in the text of allowed values
+
+Fixed bug in X-parameters
+
+Version 0.14 11 Jan 00
+----------------------
+
+Fixed wrong value type for TRIGGER property
+
+Added Calendar object. Calendar is an aggregate of two stores and two
+clusters, and can store all of the inforamation associated with a
+calendar.
+
+icalcomponent_add_property and icalcomponent_add_component will
+complain if you try to add a component or property that is already
+part of an other component. The *_free routines wil complain if you try
+to free a linked component or property.
+
+More improvements to error handling.
+
+Parser is much more robust.
+
+Minor memory enhancements.
+
+Regression test runs without memory leaks.
+
+Version 0.13d 21Dec99
+---------------------
+
+Seperated perl interface and library
+
+Added autoconf support
+
+Scripts that generate derived properties, values and parameters now
+change source and header files inline.
+
+Changed icalstore to cluster all components with DTSTART in a month
+into a single file. This should reduce number of file accesses by a
+factor of 60.
+
+Ran code through Purify and fixed memory leaks.
+
+
+Version 0.13 16Nov99
+---------------------
+
+Yet more bug fixes! Yeah!
+
+Added better error handling. The Parser inserts X-LIC-*ERROR
+properties to warn of parsing errors.
+
+The imip source/sink programs in /src/imip is demonstrably functional.
+
+Version 0.12b 17Oct99
+---------------------
+
+More bug fixes, particularily in parse from string routines
+
+ICal::Store is mostly functional
+
+This is version is a checkpoint, not a release.
+
+Version 0.12a 10Oct99
+---------------------
+
+Expanded perl interface:
+ Added 1/2 of Store module
+ Fixed bugs
+ Implemeted get_{first,next}_property
+
+Extended C interface
+ Made get_{first,next}_property work properly
+ Fixed bugs
+
+
+This is version is a checkpoint, not a release.
+
+Version 0.12 27Aug99
+--------------------
+
+Added a rudimentatry perl interface
+
+This is version is a checkpoint, not a release.
+
+
+Version 0.11 11Aug99
+--------------------
+
+Eliminated most use of flex/bison -- all parsing, except for the
+values, is done in C.
+
+Cleaned up memory leaks. Purify claims that I got them all.
+
+Moved all derived component/prop/param/value code ( in .inc / .h
+files) into main files ( icalcomponent.{c,h}, icalproperty.{c,h}, etc/
+)
+
+Implemented *_clone routines.
+
+Fixed a lot of bugs.
+
+Implemented more value types. Still unimplemeneted are BINARY and RECUR
+
+Included MacOS/Code Warior files from Graham Davison
+
+
+Version 0.10 8Jul99
+-------------------
+
+Eliminated shift/reduce and reduce/reduce conflicts in the parser.
+This version is almost feature complete -- it has the basic structure
+for all of the library's functionality, and it will only require
+implementing procedure shells and fixing bugs. I think that all of the
+hard work is done...
+
+Version 0.09a,b 3,7 Jul99
+-------------------------
+
+Various improvements to the parser, added some functionality. The parser code
+is mostly complete, and should be fully functional, except for a horde of
+bugs. Also added support for X-Properties.
+
+Version 0.09 25Jun99
+--------------------
+
+Added a parser in files src/comp/icalitip.{y,l} The lexer is mostly
+functional, but the parser is not.
+
+
+Version 0.08 2Jun99
+--------------------
+
+All files now have MPL licensing
+
+Implement enough of the code to perform some rudimentary testing
+
+
+Version 0.07 14May99
+--------------------
+
+Remove all interfaces that construct object from a string
+
+Moved most code back into comp directory
+
+Implemented C files for most headers -- usecases.c now links.
+
+Many improvements to generation scripts.
+
+
+
+Version 0.06 25Apr99
+--------------------
+
+Expanded distribution to include:
+ Directory structure that can accomodate future expansion
+ Several levels of Makefiles
+ This CHANGES file
+
+Added headers for irip and parse modules
+
+Added several files with design information
+
+Added scripts that I had used to generate much of the ical header code.
+
+Split C headers from CC headers
+
+Added data for iTIP and iCAL component restrictions in restrictions.csv
+
+Version 0.05 11Apr99
+----------------------
+
+Changes to ical headers
+
+ Added derived Property classes.
+
+ Improved the interface to the derived property and parameter classes
+
+ Added derived component classes.
+
+ Created usecases.c and ccusecases.cc to demonstrate use
+
+ C++ interface compile
+
+
+Version 0.04 5Apr99
+-------------------
+
+Version 0.02 30Mar99
+--------------------
diff --git a/libical/README b/libical/README
new file mode 100644
index 0000000000..e0f7641e1e
--- /dev/null
+++ b/libical/README
@@ -0,0 +1,96 @@
+
+LIBICAL -- An implementation of basic iCAL protocols
+
+The code and datafiles in this distribution are licensed under the
+Mozilla Public License. See http://www.mozilla.org/NPL/MPL-1.0.html
+for a copy of the license. Alternately, you may use libical under the
+terms of the GNU Library General Public License. See
+http://www.fsf.org/copyleft/lesser.html for a copy of the LGPL.
+
+This dual license ensures that the library can be incorporated into
+both proprietary code and GPL'd programs, and will benefit from
+improvements made by programmers in both realms. I will only accept
+changes into my version of the library if they are similarly
+dual-licensed.
+
+The code in this distribution implements the iCal protocols as
+described in RFC2445 and RFC2446. The code is in very early stages of
+development.
+
+This code is under active development. If you would like to contribute
+to the project, you can contact me, Eric Busboom, at
+eric@softwarestudio.org. The project has a webpage at
+
+ http://softwarestudio.org/libical/index.html
+
+and a mailing list that you can join by sending the following mail:
+
+ ------------
+ To: minimalist@softwarestudio.org
+ Subject: subscribe libical
+ ------------
+
+
+Building the library
+--------------------
+
+This distribution is developed on Red Hat Linux 6.0 and usually
+compiles on SunOS 5.6 and FreeBSD 2.27. I have reports of success of
+previous version on MacOS ( with CodeWarrior ) but I don't know about
+any other systems.
+
+The library is configured with automake. From the root directory, run
+
+ ./configure
+
+To build all of the Makefiles for your system. If you will be installing the library, you may want to use the --prefix flag to set the directory where the library and header files will be installed.
+
+ ./configure --prefix=/proj/local/
+
+If configure runs fine, run "make" to build the library and
+"make install" to install it.
+
+The current version of libical focuses on creating and
+manipulating iCal objects. With it, you can parse text representations
+of iCal components, add and remove sub-components, properties,
+parameters and values, and print the components back out as strings.
+
+
+Notes for Libical Developers
+-------------------
+
+If you don't want to use gcc as the compiler, and you got the sources
+from CVS, you should set the CC variable to the path to the compiler
+and run "automake --include-deps" to keep automake from using
+gcc-specific automatic dependancy tracking.
+
+ > CC=/pkg/SUNWspro/bin/cc; export CC
+ > automake --include-deps
+ > ./configure --prefix=/proj/local/
+ > make
+
+You will not need to re-run automake unless you got the sources from CVS.
+
+
+Perl Library
+------------
+
+There is a perl language binding of this library, LIBICAL.
+It is available from http://www.softwarestudio.org/libical
+
+Parser
+------
+
+The parser is a test program that will convert a text representation
+of an iCal object to the internal representation and print it back out
+as text. It is primarily a test tool, but it is also a good
+demonstration of how the library works.
+
+To use it, cat one of the test components into the parser
+executable. For example, from the root of the distribution:
+
+ src/test/icalparser < test-data/1.1
+
+
+Eric Busboom
+eric@softwarestudio.org
diff --git a/libical/TEST b/libical/TEST
new file mode 100644
index 0000000000..90c3473b31
--- /dev/null
+++ b/libical/TEST
@@ -0,0 +1,4 @@
+
+Parser Tests
+------------
+Use iCAL keywords as first words of unquoted strings \ No newline at end of file
diff --git a/libical/THANKS b/libical/THANKS
new file mode 100644
index 0000000000..4130c35e23
--- /dev/null
+++ b/libical/THANKS
@@ -0,0 +1,6 @@
+Thanks to:
+
+
+Graham Davison for MacOS support and miscelaneous code bits
+
+Seth Alves for the first cut at the Makefile.am files \ No newline at end of file
diff --git a/libical/TODO b/libical/TODO
new file mode 100644
index 0000000000..c5c85f6753
--- /dev/null
+++ b/libical/TODO
@@ -0,0 +1,28 @@
+
+TODOs for libical-0.16
+---------------------
+
+libical treats properties with multiple values incorrecty -- it always
+seperates multiple values into multiple properties. This is not
+acceptable for CATEGORIES and RESOURCES.
+
+Some TEXT valued properties, like METHOD, have a limited set of valid
+values. The code should check that the values of these properites are
+valid. ( Although METHOD now uses enums, and is not really TEXT valued )
+
+Finish implementing values
+ ATTACH/BINARY
+ content_type
+ language
+
+Check for buffer overflow on external input.
+
+Error Handling
+
+ Dates and times: the parser will accept many illegal date time
+ values
+
+RECUR values ignore integers in BYDAY clauses, ie 'FREQ=MONTHLY;BYDAY=-1SU'
+
+Restrictions code does not catch lack of DTEND or DURATION
+
diff --git a/libical/acconfig.h b/libical/acconfig.h
new file mode 100644
index 0000000000..e9383f73a4
--- /dev/null
+++ b/libical/acconfig.h
@@ -0,0 +1,7 @@
+/* Define to make icalerror_* calls abort instead of internally
+ signalling an error */
+#undef ICAL_ERRORS_ARE_FATAL
+
+/* Define to make icalcluster_commit() save to a temp file and mv to
+ the original file instead of writing to the orig file directly */
+#undef ICAL_SAFESAVES
diff --git a/libical/autogen.sh b/libical/autogen.sh
new file mode 100755
index 0000000000..e15e4e33a8
--- /dev/null
+++ b/libical/autogen.sh
@@ -0,0 +1,80 @@
+#!/bin/sh
+# Run this to generate all the initial makefiles, etc.
+
+srcdir=`dirname $0`
+test -z "$srcdir" && srcdir=.
+
+ORIGDIR=`pwd`
+cd $srcdir
+PROJECT=libical
+TEST_TYPE=-d
+FILE=src
+
+DIE=0
+
+(autoconf --version) < /dev/null > /dev/null 2>&1 || {
+ echo
+ echo "You must have autoconf installed to compile $PROJECT."
+ echo "Download the appropriate package for your distribution,"
+ echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
+ DIE=1
+}
+
+(automake --version) < /dev/null > /dev/null 2>&1 || {
+ echo
+ echo "You must have automake installed to compile $PROJECT."
+ echo "Get ftp://ftp.cygnus.com/pub/home/tromey/automake-1.2d.tar.gz"
+ echo "(or a newer version if it is available)"
+ DIE=1
+}
+
+if test "$DIE" -eq 1; then
+ exit 1
+fi
+
+test $TEST_TYPE $FILE || {
+ echo "You must run this script in the top-level $PROJECT directory"
+ exit 1
+}
+
+if test -z "$*"; then
+ echo "I am going to run ./configure with no arguments - if you wish "
+ echo "to pass any to it, please specify them on the $0 command line."
+fi
+
+case $CC in
+*xlc | *xlc\ * | *lcc | *lcc\ *) am_opt=--include-deps;;
+esac
+
+if test -z "$ACLOCAL_FLAGS"; then
+
+ acdir=`aclocal --print-ac-dir`
+ m4list="glib.m4"
+
+ for file in $m4list
+ do
+ if [ ! -f "$acdir/$file" ]; then
+ echo "WARNING: aclocal's directory is $acdir, but..."
+ echo " no file $acdir/$file"
+ echo " You may see fatal macro warnings below."
+ echo " If these files are installed in /some/dir, set the ACLOCAL_FLAGS "
+ echo " environment variable to \"-I /some/dir\", or install"
+ echo " $acdir/$file."
+ echo ""
+ fi
+ done
+fi
+
+aclocal $ACLOCAL_FLAGS
+
+# optionally feature autoheader
+(autoheader --version) < /dev/null > /dev/null 2>&1 && autoheader
+
+automake -a $am_opt
+autoconf
+cd $ORIGDIR
+
+$srcdir/configure "$@"
+
+echo
+echo "Now type 'make' to compile $PROJECT."
diff --git a/libical/configure.in b/libical/configure.in
new file mode 100644
index 0000000000..db9177b3b3
--- /dev/null
+++ b/libical/configure.in
@@ -0,0 +1,51 @@
+dnl Process this file with autoconf to produce a configure script.
+AC_INIT(src/libical/ical.h)
+AM_CONFIG_HEADER(config.h)
+AM_INIT_AUTOMAKE(libical,0.16)
+
+dnl Checks for programs.
+AC_PROG_YACC
+AC_PROG_CC
+AM_PROG_LEX
+AC_PROG_LN_S
+AC_PROG_RANLIB
+AC_PROG_INSTALL
+
+AM_PROG_LIBTOOL
+
+AC_SUBST(AR)
+AC_CHECK_PROGS(AR, ar aal, ar)
+
+AC_DEFINE(ICAL_ERRORS_ARE_FATAL,1)
+AC_DEFINE(ICAL_SAFESAVES,1)
+
+dnl Checks for libraries.
+dnl Replace `main' with a function in -lical:
+dnl AC_CHECK_LIB(ical, main)
+
+dnl Checks for header files.
+AC_HEADER_STDC
+AC_CHECK_HEADERS(time.h sys/types.h assert.h)
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+AC_C_CONST
+AC_TYPE_SIZE_T
+AC_STRUCT_TM
+
+dnl Checks for library functions.
+AC_CHECK_FUNCS(strdup)
+
+AC_OUTPUT([
+Makefile
+src/Makefile
+src/libical/Makefile
+src/libical/icalversion.h
+src/libicalss/Makefile
+src/test/Makefile
+design-data/Makefile
+doc/Makefile
+scripts/Makefile
+test-data/Makefile
+src/Makefile
+config.h
+])
diff --git a/libical/configure.scan b/libical/configure.scan
new file mode 100644
index 0000000000..c07a9f6bf8
--- /dev/null
+++ b/libical/configure.scan
@@ -0,0 +1,30 @@
+dnl Process this file with autoconf to produce a configure script.
+AC_INIT(src/comp-cc/usecases.cc)
+
+dnl Checks for programs.
+AC_PROG_YACC
+AC_PROG_CC
+AC_PROG_LEX
+AC_PROG_INSTALL
+AC_PROG_LN_S
+AC_PROG_RANLIB
+
+dnl Checks for libraries.
+dnl Replace `main' with a function in -lical:
+AC_CHECK_LIB(ical, main)
+
+dnl Checks for header files.
+AC_HEADER_DIRENT
+AC_HEADER_STDC
+AC_CHECK_HEADERS(fcntl.h limits.h malloc.h unistd.h)
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+AC_C_CONST
+AC_TYPE_OFF_T
+AC_TYPE_SIZE_T
+AC_STRUCT_TM
+
+dnl Checks for library functions.
+AC_CHECK_FUNCS(mkdir strdup uname)
+
+AC_OUTPUT(src/libicalss/Makefile src/test/Makefile src/libical/Makefile src/Makefile src/pvl/Makefile src/comp-cc/Makefile Makefile)
diff --git a/libical/design-data/.cvsignore b/libical/design-data/.cvsignore
new file mode 100644
index 0000000000..3dda72986f
--- /dev/null
+++ b/libical/design-data/.cvsignore
@@ -0,0 +1,2 @@
+Makefile.in
+Makefile
diff --git a/libical/design-data/Makefile.am b/libical/design-data/Makefile.am
new file mode 100644
index 0000000000..0548974160
--- /dev/null
+++ b/libical/design-data/Makefile.am
@@ -0,0 +1,10 @@
+EXTRA_DIST =\
+ components.txt \
+ param-c-types.txt \
+ params-in-prop.txt \
+ prop-to-value.txt \
+ property-tokens.txt \
+ restrictions.csv \
+ status.txt \
+ value-c-types.txt \
+ value-mem-semantics.txt \
diff --git a/libical/design-data/components.txt b/libical/design-data/components.txt
new file mode 100644
index 0000000000..15417eaf2f
--- /dev/null
+++ b/libical/design-data/components.txt
@@ -0,0 +1,21 @@
+VCALENDAR
+VEVENT
+VTODO
+VJOURNAL
+VFREEBUSY
+VTIMEZONE
+XSTANDARDTIME
+XDAYLIGHTSAVINGSTIME
+VALARM
+XAUDIOALARM
+XDISPLAYALARM
+XEMAILALARM
+XPROCEDUREALARM
+X
+VSCHEDULE
+VQUERY
+VCAR
+VCOMMAND
+XLICINVALID
+ANY
+
diff --git a/libical/design-data/param-c-types.txt b/libical/design-data/param-c-types.txt
new file mode 100644
index 0000000000..d2f28e688a
--- /dev/null
+++ b/libical/design-data/param-c-types.txt
@@ -0,0 +1,23 @@
+ALTREP char*
+CN char*
+CUTYPE icalparameter_cutype
+DELEGATED-FROM char*
+DELEGATED-TO char*
+DIR char*
+ENCODING icalparameter_encoding
+FBTYPE icalparameter_fbtype
+FMTTYPE char*
+LANGUAGE char*
+MEMBER char*
+PARTSTAT icalparameter_partstat
+RANGE icalparameter_range
+RELATED icalparameter_related
+RELTYPE icalparameter_reltype
+ROLE icalparameter_role
+RSVP int
+SENT-BY char*
+TZID char*
+VALUE icalparameter_value
+X char*
+X-LIC-ERRORTYPE icalparameter_xlicerrortype
+X-LIC-COMPARETYPE icalparameter_xliccomparetype
diff --git a/libical/design-data/params-in-prop.txt b/libical/design-data/params-in-prop.txt
new file mode 100644
index 0000000000..4d4e133fc3
--- /dev/null
+++ b/libical/design-data/params-in-prop.txt
@@ -0,0 +1,55 @@
+ACTION VALUE X
+ATTACH FMTTYPE ENCODING VALUE X
+ATTENDEE CN CUTYPE DELEGATED-FROM DELEGATED-TO DIR LANGUAGE MEMBER PARTSTAT ROLE RSVP SENT-BY X
+CALSCALE X
+CATEGORIES LANGUAGE X
+CLASS X
+COMMENT ALTREP LANGUAGE X
+COMPLETED X
+CONTACT ALTREP LANGUAGE X
+CREATED X
+DESCRIPTION ALTREP LANGUAGE X
+DTEND VALUE TZID X
+DTSTAMP X
+DTSTART VALUE TZID X
+DUE VALUE TZID X
+DURATION X
+EXDATE VALUE TZID X
+EXRULE X
+FREEBUSY FBTYPE X
+GEO X
+LAST-MODIFIED X
+LOCATION ALTREP LANGUAGE X
+METHOD X
+ORGANIZER CN DIR LANGUAGE SENT-BY X
+PERCENT-COMPLETE X
+PRIORITY X
+PRODID X
+RDATE VALUE TZID X
+RECURRENCE-ID VALUE RANGE TZID X
+RELATED-TO RELTYPE X
+REPEAT X
+REQUEST-STATUS LANGUAGE X
+RESOURCES ALTREP LANGUAGE X
+RRULE X
+SEQUENCE X
+STATUS X
+SUMMARY ALTREP LANGUAGE X
+TRANSP X
+TRIGGER VALUE RELATED X
+TZID X
+TZNAME LANGUAGE X
+TZOFFSETFROM X
+TZOFFSETTO X
+TZURL X
+UID X
+URL X
+VERSION X
+XPROP LANGUAGE X
+X-LIC-ERROR XLICEERRORTYPE X
+SCOPE X
+MAXRESULTS X
+MAXRESULTSSIZE X
+QUERY X
+QUERYNAME X
+TARGET X \ No newline at end of file
diff --git a/libical/design-data/prop-to-value.txt b/libical/design-data/prop-to-value.txt
new file mode 100644
index 0000000000..017c944983
--- /dev/null
+++ b/libical/design-data/prop-to-value.txt
@@ -0,0 +1,50 @@
+CALSCALE TEXT
+METHOD METHOD # Non-std. RFC2445 specifies TEXT
+PRODID TEXT
+VERSION TEXT
+CATEGORIES TEXT
+CLASS TEXT
+COMMENT TEXT
+DESCRIPTION TEXT
+LOCATION TEXT
+PERCENT-COMPLETE INTEGER
+PRIORITY INTEGER
+RESOURCES TEXT
+STATUS TEXT
+SUMMARY TEXT
+COMPLETED DATE-TIME
+FREEBUSY PERIOD
+TRANSP TEXT
+TZNAME TEXT
+TZOFFSETFROM UTC-OFFSET
+TZOFFSETTO UTC-OFFSET
+TZURL URI
+TZID TEXT
+ATTENDEE CAL-ADDRESS
+CONTACT TEXT
+ORGANIZER CAL-ADDRESS
+RELATED-TO TEXT
+URL URI
+UID TEXT
+EXRULE RECUR
+RRULE RECUR
+ACTION TEXT
+REPEAT INTEGER
+CREATED DATE-TIME
+DTSTAMP DATE-TIME
+LAST-MODIFIED DATE-TIME
+SEQUENCE INTEGER
+X-LIC-ERROR TEXT
+X-LIC-CLUSTERCOUNT INTEGER
+REQUEST-STATUS STRING
+ATTACH ATTACH # Non-std: URI or BINARY
+GEO GEO # Non-std: Two FLOATS
+DTEND DATE-TIME-DATE # Non-std: DATE-TIME or DATE
+DUE DATE-TIME-DATE # Non-std: DATE-TIME or DATE
+DTSTART DATE-TIME-DATE # Non-std: DATE-TIME or DATE
+RECURRENCE-ID DATE-TIME-DATE # Non-std: DATE-TIME or DATE
+EXDATE DATE-TIME-DATE # Non-std: DATE-TIME or DATE
+RDATE DATE-TIME-PERIOD # Non-std: DATE-TIME or DATE or PERIOD
+TRIGGER TRIGGER # Non-std: DURATION or DATE-TIME
+DURATION DURATION
+QUERY QUERY
diff --git a/libical/design-data/property-tokens.txt b/libical/design-data/property-tokens.txt
new file mode 100644
index 0000000000..f8a95861c4
--- /dev/null
+++ b/libical/design-data/property-tokens.txt
@@ -0,0 +1,65 @@
+8BIT
+ACCEPTED
+ADD
+AUDIO
+BASE64
+BINARY
+BOOLEAN
+BUSY
+BUSY-TENTATIVE
+BUSY-UNAVAILABLE
+CAL-ADDRESS
+CANCEL
+CANCELLED
+CHAIR
+CHILD
+COMPLETED
+CONFIDENTIAL
+CONFIRMED
+COUNTER
+DATE
+DATE-TIME
+DECLINECOUNTER
+DECLINED
+DELEGATED
+DISPLAY
+DRAFT
+DURATION
+EMAIL
+END
+FINAL
+FLOAT
+FREE
+GREGORIAN
+GROUP
+INDIVIDUAL
+IN-PROCESS
+INTEGER
+NEEDS-ACTION
+NON-PARTICIPANT
+OPAQUE
+OPT-PARTICIPANT
+PARENT
+PERIOD
+PRIVATE
+PROCEDURE
+PUBLIC
+PUBLISH
+RECUR
+REFRESH
+REPLY
+REQ-PARTICIPANT
+REQUEST
+RESOURCE
+ROOM
+SIBLING
+START
+TENTATIVE
+TEXT
+THISANDFUTURE
+THISANDPRIOR
+TIME
+TRANSPAENT
+UNKNOWN
+UTCOFFSET
+XNAME
diff --git a/libical/design-data/restrictions.csv b/libical/design-data/restrictions.csv
new file mode 100644
index 0000000000..e93f0a2a2a
--- /dev/null
+++ b/libical/design-data/restrictions.csv
@@ -0,0 +1,1348 @@
+# Method, Target component, Property, Sub-component, Restriction
+PUBLISH,VEVENT,NONE,NONE,ONEPLUS
+PUBLISH,VEVENT,DTSTAMP,NONE,ONE
+PUBLISH,VEVENT,DTSTART,NONE,ONE
+PUBLISH,VEVENT,ORGANIZER,NONE,ONE
+PUBLISH,VEVENT,SUMMARY,NONE,ONE
+PUBLISH,VEVENT,UID,NONE,ONE
+PUBLISH,VEVENT,RECURRENCEID,NONE,ZEROORONE
+PUBLISH,VEVENT,SEQUENCE,NONE,ZEROORONE
+PUBLISH,VEVENT,ATTACH,NONE,ZEROPLUS
+PUBLISH,VEVENT,CATEGORIES,NONE,ZEROORONE
+PUBLISH,VEVENT,CLASS,NONE,ZEROORONE
+PUBLISH,VEVENT,COMMENT,NONE,ZEROORONE
+PUBLISH,VEVENT,CONTACT,NONE,ZEROPLUS
+PUBLISH,VEVENT,CREATED,NONE,ZEROORONE
+PUBLISH,VEVENT,DESCRIPTION,NONE,ZEROORONE
+PUBLISH,VEVENT,DTEND,NONE,ZEROORONE
+PUBLISH,VEVENT,DURATION,NONE,ZEROORONE
+PUBLISH,VEVENT,EXDATE,NONE,ZEROPLUS
+PUBLISH,VEVENT,EXRULE,NONE,ZEROPLUS
+PUBLISH,VEVENT,GEO,NONE,ZEROORONE
+PUBLISH,VEVENT,LASTMODIFIED,NONE,ZEROORONE
+PUBLISH,VEVENT,LOCATION,NONE,ZEROORONE
+PUBLISH,VEVENT,PRIORITY,NONE,ZEROORONE
+PUBLISH,VEVENT,RDATE,NONE,ZEROPLUS
+PUBLISH,VEVENT,RELATEDTO,NONE,ZEROPLUS
+PUBLISH,VEVENT,RESOURCES,NONE,ZEROORONE
+PUBLISH,VEVENT,RRULE,NONE,ZEROPLUS
+PUBLISH,VEVENT,STATUS,NONE,ZEROORONE
+PUBLISH,VEVENT,TRANSP,NONE,ZEROORONE
+PUBLISH,VEVENT,URL,NONE,ZEROORONE
+PUBLISH,VEVENT,X,NONE,ZEROPLUS
+PUBLISH,VEVENT,ATTENDEE,NONE,ZERO
+PUBLISH,VEVENT,REQUESTSTATUS,NONE,ZERO
+PUBLISH,VEVENT,NONE,VALARM,ZEROPLUS
+PUBLISH,VEVENT,NONE,VFREEBUSY,ZERO
+PUBLISH,VEVENT,NONE,VJOURNAL,ZERO
+PUBLISH,VEVENT,NONE,VTODO,ZERO
+PUBLISH,VEVENT,NONE,VTIMEZONE,ZEROPLUS
+PUBLISH,VEVENT,NONE,X,ZEROPLUS
+REQUEST,VEVENT,NONE,NONE,ONEPLUS
+REQUEST,VEVENT,ATTENDEE,NONE,ONEPLUS
+REQUEST,VEVENT,DTSTAMP,NONE,ONE
+REQUEST,VEVENT,DTSTART,NONE,ONE
+REQUEST,VEVENT,ORGANIZER,NONE,ONE
+REQUEST,VEVENT,SEQUENCE,NONE,ZEROORONE
+REQUEST,VEVENT,SUMMARY,NONE,ONE
+REQUEST,VEVENT,UID,NONE,ONE
+REQUEST,VEVENT,ATTACH,NONE,ZEROPLUS
+REQUEST,VEVENT,CATEGORIES,NONE,ZEROORONE
+REQUEST,VEVENT,CLASS,NONE,ZEROORONE
+REQUEST,VEVENT,COMMENT,NONE,ZEROORONE
+REQUEST,VEVENT,CONTACT,NONE,ZEROPLUS
+REQUEST,VEVENT,CREATED,NONE,ZEROORONE
+REQUEST,VEVENT,DESCRIPTION,NONE,ZEROORONE
+REQUEST,VEVENT,DTEND,NONE,ONEEXCLUSIVE,icalrestriction_check_exclusive
+REQUEST,VEVENT,DURATION,NONE,ONEEXCLUSIVE,icalrestriction_check_exclusive
+REQUEST,VEVENT,EXDATE,NONE,ZEROPLUS
+REQUEST,VEVENT,EXRULE,NONE,ZEROPLUS
+REQUEST,VEVENT,GEO,NONE,ZEROORONE
+REQUEST,VEVENT,LASTMODIFIED,NONE,ZEROORONE
+REQUEST,VEVENT,LOCATION,NONE,ZEROORONE
+REQUEST,VEVENT,PRIORITY,NONE,ZEROORONE
+REQUEST,VEVENT,RDATE,NONE,ZEROPLUS
+REQUEST,VEVENT,RECURRENCEID,NONE,ZEROORONE
+REQUEST,VEVENT,RELATEDTO,NONE,ZEROPLUS
+REQUEST,VEVENT,REQUESTSTATUS,NONE,ZEROPLUS
+REQUEST,VEVENT,RESOURCES,NONE,ZEROORONE
+REQUEST,VEVENT,RRULE,NONE,ZEROPLUS
+REQUEST,VEVENT,STATUS,NONE,ZEROORONE
+REQUEST,VEVENT,TRANSP,NONE,ZEROORONE
+REQUEST,VEVENT,URL,NONE,ZEROORONE
+REQUEST,VEVENT,X,NONE,ZEROPLUS
+REQUEST,VEVENT,NONE,VALARM,ZEROPLUS
+REQUEST,VEVENT,NONE,VTIMEZONE,ZEROPLUS
+REQUEST,VEVENT,NONE,X,ZEROPLUS
+REQUEST,VEVENT,NONE,VFREEBUSY,ZERO
+REQUEST,VEVENT,NONE,VJOURNAL,ZERO
+REQUEST,VEVENT,NONE,VTODO,ZERO
+REPLY,VEVENT,NONE,NONE,ONEPLUS
+REPLY,VEVENT,ATTENDEE,NONE,ONE
+REPLY,VEVENT,DTSTAMP,NONE,ONE
+REPLY,VEVENT,ORGANIZER,NONE,ONE
+REPLY,VEVENT,RECURRENCEID,NONE,ZEROORONE
+REPLY,VEVENT,UID,NONE,ONE
+REPLY,VEVENT,SEQUENCE,NONE,ZEROORONE
+REPLY,VEVENT,ATTACH,NONE,ZEROPLUS
+REPLY,VEVENT,CATEGORIES,NONE,ZEROORONE
+REPLY,VEVENT,CLASS,NONE,ZEROORONE
+REPLY,VEVENT,COMMENT,NONE,ZEROORONE
+REPLY,VEVENT,CONTACT,NONE,ZEROPLUS
+REPLY,VEVENT,CREATED,NONE,ZEROORONE
+REPLY,VEVENT,DESCRIPTION,NONE,ZEROORONE
+REPLY,VEVENT,DTEND,NONE,ONEEXCLUSIVE,icalrestriction_check_exclusive
+REPLY,VEVENT,DTSTART,NONE,ZEROORONE
+REPLY,VEVENT,DURATION,NONE,ONEEXCLUSIVE,icalrestriction_check_exclusive
+REPLY,VEVENT,EXDATE,NONE,ZEROPLUS
+REPLY,VEVENT,EXRULE,NONE,ZEROPLUS
+REPLY,VEVENT,GEO,NONE,ZEROORONE
+REPLY,VEVENT,LASTMODIFIED,NONE,ZEROORONE
+REPLY,VEVENT,LOCATION,NONE,ZEROORONE
+REPLY,VEVENT,PRIORITY,NONE,ZEROORONE
+REPLY,VEVENT,RDATE,NONE,ZEROPLUS
+REPLY,VEVENT,RELATEDTO,NONE,ZEROPLUS
+REPLY,VEVENT,RESOURCES,NONE,ZEROORONE
+REPLY,VEVENT,REQUESTSTATUS,NONE,ZEROPLUS
+REPLY,VEVENT,RRULE,NONE,ZEROPLUS
+REPLY,VEVENT,STATUS,NONE,ZEROORONE
+REPLY,VEVENT,SUMMARY,NONE,ZEROORONE
+REPLY,VEVENT,TRANSP,NONE,ZEROORONE
+REPLY,VEVENT,URL,NONE,ZEROORONE
+REPLY,VEVENT,X,NONE,ZEROPLUS
+REPLY,VEVENT,NONE,VTIMEZONE,ZEROORONE
+REPLY,VEVENT,NONE,X,ZEROPLUS
+REPLY,VEVENT,NONE,VALARM,ZERO
+REPLY,VEVENT,NONE,VFREEBUSY,ZERO
+REPLY,VEVENT,NONE,VJOURNAL,ZERO
+REPLY,VEVENT,NONE,VTODO,ZERO
+ADD,VEVENT,NONE,NONE,ONE
+ADD,VEVENT,DTSTAMP,NONE,ONE
+ADD,VEVENT,DTSTART,NONE,ONE
+ADD,VEVENT,ORGANIZER,NONE,ONE
+ADD,VEVENT,SEQUENCE,NONE,ONE
+ADD,VEVENT,SUMMARY,NONE,ONE
+ADD,VEVENT,UID,NONE,ONE
+ADD,VEVENT,ATTACH,NONE,ZEROPLUS
+ADD,VEVENT,ATTENDEE,NONE,ZEROPLUS
+ADD,VEVENT,CATEGORIES,NONE,ZEROORONE
+ADD,VEVENT,CLASS,NONE,ZEROORONE
+ADD,VEVENT,COMMENT,NONE,ZEROORONE
+ADD,VEVENT,CONTACT,NONE,ZEROPLUS
+ADD,VEVENT,CREATED,NONE,ZEROORONE
+ADD,VEVENT,DESCRIPTION,NONE,ZEROORONE
+ADD,VEVENT,DTEND,NONE,ONEEXCLUSIVE, icalrestriction_check_exclusive
+ADD,VEVENT,DURATION,NONE,ONEEXCLUSIVE, icalrestriction_check_exclusive
+ADD,VEVENT,EXDATE,NONE,ZEROPLUS
+ADD,VEVENT,EXRULE,NONE,ZEROPLUS
+ADD,VEVENT,GEO,NONE,ZEROORONE
+ADD,VEVENT,LASTMODIFIED,NONE,ZEROORONE
+ADD,VEVENT,LOCATION,NONE,ZEROORONE
+ADD,VEVENT,PRIORITY,NONE,ZEROORONE
+ADD,VEVENT,RDATE,NONE,ZEROPLUS
+ADD,VEVENT,RELATEDTO,NONE,ZEROPLUS
+ADD,VEVENT,RESOURCES,NONE,ZEROORONE
+ADD,VEVENT,RRULE,NONE,ZEROPLUS
+ADD,VEVENT,STATUS,NONE,ZEROORONE
+ADD,VEVENT,TRANSP,NONE,ZEROORONE
+ADD,VEVENT,URL,NONE,ZEROORONE
+ADD,VEVENT,X,NONE,ZEROPLUS
+ADD,VEVENT,RECURRENCEID,NONE,ZERO
+ADD,VEVENT,REQUESTSTATUS,NONE,ZERO
+ADD,VEVENT,NONE,VALARM,ZEROPLUS
+ADD,VEVENT,NONE,VTIMEZONE,ZEROPLUS
+ADD,VEVENT,NONE,X,ZEROPLUS
+ADD,VEVENT,NONE,VFREEBUSY,ZERO
+ADD,VEVENT,NONE,VTODO,ZERO
+ADD,VEVENT,NONE,VJOURNAL,ZERO
+CANCEL,VEVENT,NONE,NONE,ONEPLUS
+CANCEL,VEVENT,ATTENDEE,NONE,ZEROPLUS
+CANCEL,VEVENT,DTSTAMP,NONE,ONE
+CANCEL,VEVENT,ORGANIZER,NONE,ONE
+CANCEL,VEVENT,SEQUENCE,NONE,ONE
+CANCEL,VEVENT,UID,NONE,ONE
+CANCEL,VEVENT,COMMENT,NONE,ZEROORONE
+CANCEL,VEVENT,ATTACH,NONE,ZEROPLUS
+CANCEL,VEVENT,CATEGORIES,NONE,ZEROORONE
+CANCEL,VEVENT,CLASS,NONE,ZEROORONE
+CANCEL,VEVENT,CONTACT,NONE,ZEROPLUS
+CANCEL,VEVENT,CREATED,NONE,ZEROORONE
+CANCEL,VEVENT,DESCRIPTION,NONE,ZEROORONE
+CANCEL,VEVENT,DTEND,NONE,ONEEXCLUSIVE, icalrestriction_check_exclusive
+CANCEL,VEVENT,DTSTART,NONE,ZEROORONE
+CANCEL,VEVENT,DURATION,NONE,ONEEXCLUSIVE, icalrestriction_check_exclusive
+CANCEL,VEVENT,EXDATE,NONE,ZEROPLUS
+CANCEL,VEVENT,EXRULE,NONE,ZEROPLUS
+CANCEL,VEVENT,GEO,NONE,ZEROORONE
+CANCEL,VEVENT,LASTMODIFIED,NONE,ZEROORONE
+CANCEL,VEVENT,LOCATION,NONE,ZEROORONE
+CANCEL,VEVENT,PRIORITY,NONE,ZEROORONE
+CANCEL,VEVENT,RDATE,NONE,ZEROPLUS
+CANCEL,VEVENT,RECURRENCEID,NONE,ZEROORONE
+CANCEL,VEVENT,RELATEDTO,NONE,ZEROPLUS
+CANCEL,VEVENT,RESOURCES,NONE,ZEROORONE
+CANCEL,VEVENT,RRULE,NONE,ZEROPLUS
+CANCEL,VEVENT,STATUS,NONE,ZEROORONE
+CANCEL,VEVENT,SUMMARY,NONE,ZEROORONE
+CANCEL,VEVENT,TRANSP,NONE,ZEROORONE
+CANCEL,VEVENT,URL,NONE,ZEROORONE
+CANCEL,VEVENT,X,NONE,ZEROPLUS
+CANCEL,VEVENT,REQUESTSTATUS,NONE,ZERO
+CANCEL,VEVENT,NONE,VTIMEZONE,ZEROPLUS
+CANCEL,VEVENT,NONE,X,ZEROPLUS
+CANCEL,VEVENT,NONE,VTODO,ZERO
+CANCEL,VEVENT,NONE,VJOURNAL,ZERO
+CANCEL,VEVENT,NONE,VFREEBUSY,ZERO
+CANCEL,VEVENT,NONE,VALARM,ZERO
+REFRESH,VEVENT,NONE,NONE,ONE
+REFRESH,VEVENT,ATTENDEE,NONE,ONE
+REFRESH,VEVENT,DTSTAMP,NONE,ONE
+REFRESH,VEVENT,ORGANIZER,NONE,ONE
+REFRESH,VEVENT,UID,NONE,ONE
+REFRESH,VEVENT,COMMENT,NONE,ZEROORONE
+REFRESH,VEVENT,RECURRENCEID,NONE,ZEROORONE
+REFRESH,VEVENT,X,NONE,ZEROPLUS
+REFRESH,VEVENT,ATTACH,NONE,ZERO
+REFRESH,VEVENT,CATEGORIES,NONE,ZERO
+REFRESH,VEVENT,CLASS,NONE,ZERO
+REFRESH,VEVENT,CONTACT,NONE,ZERO
+REFRESH,VEVENT,CREATED,NONE,ZERO
+REFRESH,VEVENT,DESCRIPTION,NONE,ZERO
+REFRESH,VEVENT,DTEND,NONE,ZERO
+REFRESH,VEVENT,DTSTART,NONE,ZERO
+REFRESH,VEVENT,DURATION,NONE,ZERO
+REFRESH,VEVENT,EXDATE,NONE,ZERO
+REFRESH,VEVENT,EXRULE,NONE,ZERO
+REFRESH,VEVENT,GEO,NONE,ZERO
+REFRESH,VEVENT,LASTMODIFIED,NONE,ZERO
+REFRESH,VEVENT,LOCATION,NONE,ZERO
+REFRESH,VEVENT,PRIORITY,NONE,ZERO
+REFRESH,VEVENT,RDATE,NONE,ZERO
+REFRESH,VEVENT,RELATEDTO,NONE,ZERO
+REFRESH,VEVENT,REQUESTSTATUS,NONE,ZERO
+REFRESH,VEVENT,RESOURCES,NONE,ZERO
+REFRESH,VEVENT,RRULE,NONE,ZERO
+REFRESH,VEVENT,SEQUENCE,NONE,ZERO
+REFRESH,VEVENT,STATUS,NONE,ZERO
+REFRESH,VEVENT,SUMMARY,NONE,ZERO
+REFRESH,VEVENT,TRANSP,NONE,ZERO
+REFRESH,VEVENT,URL,NONE,ZERO
+REFRESH,VEVENT,NONE,X,ZEROPLUS
+REFRESH,VEVENT,NONE,VTODO,ZERO
+REFRESH,VEVENT,NONE,VJOURNAL,ZERO
+REFRESH,VEVENT,NONE,VFREEBUSY,ZERO
+REFRESH,VEVENT,NONE,VTIMEZONE,ZERO
+REFRESH,VEVENT,NONE,VALARM,ZERO
+COUNTER,VEVENT,NONE,NONE,ONE
+COUNTER,VEVENT,DTSTAMP,NONE,ONE
+COUNTER,VEVENT,DTSTART,NONE,ONE
+COUNTER,VEVENT,ORGANIZER,NONE,ONE
+COUNTER,VEVENT,SEQUENCE,NONE,ONE
+COUNTER,VEVENT,SUMMARY,NONE,ONE
+COUNTER,VEVENT,UID,NONE,ONE
+COUNTER,VEVENT,ATTACH,NONE,ZEROPLUS
+COUNTER,VEVENT,ATTENDEE,NONE,ZEROPLUS
+COUNTER,VEVENT,CATEGORIES,NONE,ZEROORONE
+COUNTER,VEVENT,CLASS,NONE,ZEROORONE
+COUNTER,VEVENT,COMMENT,NONE,ZEROORONE
+COUNTER,VEVENT,CONTACT,NONE,ZEROPLUS
+COUNTER,VEVENT,CREATED,NONE,ZEROORONE
+COUNTER,VEVENT,DESCRIPTION,NONE,ZEROORONE
+COUNTER,VEVENT,DTEND,NONE,ONEEXCLUSIVE, icalrestriction_check_exclusive
+COUNTER,VEVENT,DURATION,NONE,ONEEXCLUSIVE, icalrestriction_check_exclusive
+COUNTER,VEVENT,EXDATE,NONE,ZEROPLUS
+COUNTER,VEVENT,EXRULE,NONE,ZEROPLUS
+COUNTER,VEVENT,GEO,NONE,ZEROORONE
+COUNTER,VEVENT,LASTMODIFIED,NONE,ZEROORONE
+COUNTER,VEVENT,LOCATION,NONE,ZEROORONE
+COUNTER,VEVENT,PRIORITY,NONE,ZEROORONE
+COUNTER,VEVENT,RDATE,NONE,ZEROPLUS
+COUNTER,VEVENT,RECURRENCEID,NONE,ZEROORONE
+COUNTER,VEVENT,RELATEDTO,NONE,ZEROPLUS
+COUNTER,VEVENT,REQUESTSTATUS,NONE,ZEROPLUS
+COUNTER,VEVENT,RESOURCES,NONE,ZEROORONE
+COUNTER,VEVENT,RRULE,NONE,ZEROPLUS
+COUNTER,VEVENT,STATUS,NONE,ZEROORONE
+COUNTER,VEVENT,TRANSP,NONE,ZEROORONE
+COUNTER,VEVENT,URL,NONE,ZEROORONE
+COUNTER,VEVENT,X,NONE,ZEROPLUS
+COUNTER,VEVENT,NONE,VALARM,ZEROPLUS
+COUNTER,VEVENT,NONE,VTIMEZONE,ZEROPLUS
+COUNTER,VEVENT,NONE,X,ZEROPLUS
+COUNTER,VEVENT,NONE,VTODO,ZERO
+COUNTER,VEVENT,NONE,VJOURNAL,ZERO
+COUNTER,VEVENT,NONE,VFREEBUSY,ZERO
+DECLINECOUNTER,VEVENT,NONE,NONE,ONE
+DECLINECOUNTER,VEVENT,DTSTAMP,NONE,ONE
+DECLINECOUNTER,VEVENT,ORGANIZER,NONE,ONE
+DECLINECOUNTER,VEVENT,UID,NONE,ONE
+DECLINECOUNTER,VEVENT,COMMENT,NONE,ZEROORONE
+DECLINECOUNTER,VEVENT,RECURRENCEID,NONE,ZEROORONE
+DECLINECOUNTER,VEVENT,REQUESTSTATUS,NONE,ZEROPLUS
+DECLINECOUNTER,VEVENT,SEQUENCE,NONE,ZERO
+DECLINECOUNTER,VEVENT,X,NONE,ZEROPLUS
+DECLINECOUNTER,VEVENT,ATTACH,NONE,ZERO
+DECLINECOUNTER,VEVENT,ATTENDEE,NONE,ZERO
+DECLINECOUNTER,VEVENT,CATEGORIES,NONE,ZERO
+DECLINECOUNTER,VEVENT,CLASS,NONE,ZERO
+DECLINECOUNTER,VEVENT,CONTACT,NONE,ZERO
+DECLINECOUNTER,VEVENT,CREATED,NONE,ZERO
+DECLINECOUNTER,VEVENT,DESCRIPTION,NONE,ZERO
+DECLINECOUNTER,VEVENT,DTEND,NONE,ZERO
+DECLINECOUNTER,VEVENT,DTSTART,NONE,ZERO
+DECLINECOUNTER,VEVENT,DURATION,NONE,ZERO
+DECLINECOUNTER,VEVENT,EXDATE,NONE,ZERO
+DECLINECOUNTER,VEVENT,EXRULE,NONE,ZERO
+DECLINECOUNTER,VEVENT,GEO,NONE,ZERO
+DECLINECOUNTER,VEVENT,LASTMODIFIED,NONE,ZERO
+DECLINECOUNTER,VEVENT,LOCATION,NONE,ZERO
+DECLINECOUNTER,VEVENT,PRIORITY,NONE,ZERO
+DECLINECOUNTER,VEVENT,RDATE,NONE,ZERO
+DECLINECOUNTER,VEVENT,RELATEDTO,NONE,ZERO
+DECLINECOUNTER,VEVENT,RESOURCES,NONE,ZERO
+DECLINECOUNTER,VEVENT,RRULE,NONE,ZERO
+DECLINECOUNTER,VEVENT,STATUS,NONE,ZERO
+DECLINECOUNTER,VEVENT,SUMMARY,NONE,ZERO
+DECLINECOUNTER,VEVENT,TRANSP,NONE,ZERO
+DECLINECOUNTER,VEVENT,URL,NONE,ZERO
+DECLINECOUNTER,VEVENT,NONE,X,ZEROPLUS
+DECLINECOUNTER,VEVENT,NONE,VTODO,ZERO
+DECLINECOUNTER,VEVENT,NONE,VJOURNAL,ZERO
+DECLINECOUNTER,VEVENT,NONE,VFREEBUSY,ZERO
+DECLINECOUNTER,VEVENT,NONE,VTIMEZONE,ZERO
+DECLINECOUNTER,VEVENT,NONE,VALARM,ZERO
+PUBLISH,VFREEBUSY,NONE,NONE,ONEPLUS
+PUBLISH,VFREEBUSY,DTSTAMP,NONE,ONE
+PUBLISH,VFREEBUSY,DTSTART,NONE,ONE
+PUBLISH,VFREEBUSY,DTEND,NONE,ONE
+PUBLISH,VFREEBUSY,FREEBUSY,NONE,ONEPLUS
+PUBLISH,VFREEBUSY,ORGANIZER,NONE,ONE
+PUBLISH,VFREEBUSY,COMMENT,NONE,ZEROORONE
+PUBLISH,VFREEBUSY,CONTACT,NONE,ZEROPLUS
+PUBLISH,VFREEBUSY,X,NONE,ZEROPLUS
+PUBLISH,VFREEBUSY,URL,NONE,ZEROORONE
+PUBLISH,VFREEBUSY,ATTENDEE,NONE,ZERO
+PUBLISH,VFREEBUSY,DURATION,NONE,ZERO
+PUBLISH,VFREEBUSY,REQUESTSTATUS,NONE,ZERO
+PUBLISH,VFREEBUSY,UID,NONE,ZERO
+PUBLISH,VFREEBUSY,NONE,X,ZEROPLUS
+PUBLISH,VFREEBUSY,NONE,VEVENT,ZERO
+PUBLISH,VFREEBUSY,NONE,VTODO,ZERO
+PUBLISH,VFREEBUSY,NONE,VJOURNAL,ZERO
+PUBLISH,VFREEBUSY,NONE,VTIMEZONE,ZERO
+PUBLISH,VFREEBUSY,NONE,VALARM,ZERO
+REQUEST,VFREEBUSY,NONE,NONE,ONE
+REQUEST,VFREEBUSY,ATTENDEE,NONE,ONEPLUS
+REQUEST,VFREEBUSY,DTEND,NONE,ONE
+REQUEST,VFREEBUSY,DTSTAMP,NONE,ONE
+REQUEST,VFREEBUSY,DTSTART,NONE,ONE
+REQUEST,VFREEBUSY,ORGANIZER,NONE,ONE
+REQUEST,VFREEBUSY,UID,NONE,ONE
+REQUEST,VFREEBUSY,COMMENT,NONE,ZEROORONE
+REQUEST,VFREEBUSY,CONTACT,NONE,ZEROPLUS
+REQUEST,VFREEBUSY,X,NONE,ZEROPLUS
+REQUEST,VFREEBUSY,FREEBUSY,NONE,ZERO
+REQUEST,VFREEBUSY,DURATION,NONE,ZERO
+REQUEST,VFREEBUSY,REQUESTSTATUS,NONE,ZERO
+REQUEST,VFREEBUSY,URL,NONE,ZERO
+REQUEST,VFREEBUSY,NONE,X,ZEROPLUS
+REQUEST,VFREEBUSY,NONE,VALARM,ZERO
+REQUEST,VFREEBUSY,NONE,VEVENT,ZERO
+REQUEST,VFREEBUSY,NONE,VTODO,ZERO
+REQUEST,VFREEBUSY,NONE,VJOURNAL,ZERO
+REQUEST,VFREEBUSY,NONE,VTIMEZONE,ZERO
+REPLY,VFREEBUSY,NONE,NONE,ONE
+REPLY,VFREEBUSY,ATTENDEE,NONE,ONE
+REPLY,VFREEBUSY,DTSTAMP,NONE,ONE
+REPLY,VFREEBUSY,DTEND,NONE,ONE
+REPLY,VFREEBUSY,DTSTART,NONE,ONE
+REPLY,VFREEBUSY,FREEBUSY,NONE,ONEPLUS
+REPLY,VFREEBUSY,ORGANIZER,NONE,ONE
+REPLY,VFREEBUSY,UID,NONE,ONE
+REPLY,VFREEBUSY,COMMENT,NONE,ZEROORONE
+REPLY,VFREEBUSY,CONTACT,NONE,ZEROPLUS
+REPLY,VFREEBUSY,REQUESTSTATUS,NONE,ZEROPLUS
+REPLY,VFREEBUSY,URL,NONE,ZEROORONE
+REPLY,VFREEBUSY,X,NONE,ZEROPLUS
+REPLY,VFREEBUSY,DURATION,NONE,ZERO
+REPLY,VFREEBUSY,SEQUENCE,NONE,ZERO
+REPLY,VFREEBUSY,NONE,X,ZEROPLUS
+REPLY,VFREEBUSY,NONE,VALARM,ZERO
+REPLY,VFREEBUSY,NONE,VEVENT,ZERO
+REPLY,VFREEBUSY,NONE,VTODO,ZERO
+REPLY,VFREEBUSY,NONE,VJOURNAL,ZERO
+REPLY,VFREEBUSY,NONE,VTIMEZONE,ZERO
+PUBLISH,VTODO,NONE,NONE,ONEPLUS
+PUBLISH,VTODO,DTSTAMP,NONE,ONE
+PUBLISH,VTODO,DTSTART,NONE,ONE
+PUBLISH,VTODO,ORGANIZER,NONE,ONE
+PUBLISH,VTODO,PRIORITY,NONE,ONE
+PUBLISH,VTODO,SEQUENCE,NONE,ZEROORONE
+PUBLISH,VTODO,SUMMARY,NONE,ONE
+PUBLISH,VTODO,UID,NONE,ONE
+PUBLISH,VTODO,ATTACH,NONE,ZEROPLUS
+PUBLISH,VTODO,CATEGORIES,NONE,ZEROORONE
+PUBLISH,VTODO,CLASS,NONE,ZEROORONE
+PUBLISH,VTODO,COMMENT,NONE,ZEROORONE
+PUBLISH,VTODO,CONTACT,NONE,ZEROPLUS
+PUBLISH,VTODO,CREATED,NONE,ZEROORONE
+PUBLISH,VTODO,DESCRIPTION,NONE,ZEROORONE
+PUBLISH,VTODO,DUE,NONE,ZEROORONE
+PUBLISH,VTODO,DURATION,NONE,ZEROORONE
+PUBLISH,VTODO,EXDATE,NONE,ZEROPLUS
+PUBLISH,VTODO,EXRULE,NONE,ZEROPLUS
+PUBLISH,VTODO,GEO,NONE,ZEROORONE
+PUBLISH,VTODO,LASTMODIFIED,NONE,ZEROORONE
+PUBLISH,VTODO,LOCATION,NONE,ZEROORONE
+PUBLISH,VTODO,PERCENTCOMPLETE,NONE,ZEROORONE
+PUBLISH,VTODO,RDATE,NONE,ZEROPLUS
+PUBLISH,VTODO,RECURRENCEID,NONE,ZEROORONE
+PUBLISH,VTODO,RELATEDTO,NONE,ZEROPLUS
+PUBLISH,VTODO,RESOURCES,NONE,ZEROORONE
+PUBLISH,VTODO,RRULE,NONE,ZEROPLUS
+PUBLISH,VTODO,STATUS,NONE,ZEROORONE
+PUBLISH,VTODO,URL,NONE,ZEROORONE
+PUBLISH,VTODO,X,NONE,ZEROPLUS
+PUBLISH,VTODO,ATTENDEE,NONE,ZERO
+PUBLISH,VTODO,REQUESTSTATUS,NONE,ZERO
+PUBLISH,VTODO,NONE,VTIMEZONE,ZEROPLUS
+PUBLISH,VTODO,NONE,VALARM,ZEROPLUS
+PUBLISH,VTODO,NONE,X,ZEROPLUS
+PUBLISH,VTODO,NONE,VFREEBUSY,ZERO
+PUBLISH,VTODO,NONE,VEVENT,ZERO
+PUBLISH,VTODO,NONE,VJOURNAL,ZERO
+REQUEST,VTODO,NONE,NONE,ONEPLUS
+REQUEST,VTODO,ATTENDEE,NONE,ONEPLUS
+REQUEST,VTODO,DTSTAMP,NONE,ONE
+REQUEST,VTODO,DTSTART,NONE,ONE
+REQUEST,VTODO,ORGANIZER,NONE,ONE
+REQUEST,VTODO,PRIORITY,NONE,ONE
+REQUEST,VTODO,SEQUENCE,NONE,ZEROORONE
+REQUEST,VTODO,SUMMARY,NONE,ONE
+REQUEST,VTODO,UID,NONE,ONE
+REQUEST,VTODO,ATTACH,NONE,ZEROPLUS
+REQUEST,VTODO,CATEGORIES,NONE,ZEROORONE
+REQUEST,VTODO,CLASS,NONE,ZEROORONE
+REQUEST,VTODO,COMMENT,NONE,ZEROORONE
+REQUEST,VTODO,CONTACT,NONE,ZEROPLUS
+REQUEST,VTODO,CREATED,NONE,ZEROORONE
+REQUEST,VTODO,DESCRIPTION,NONE,ZEROORONE
+REQUEST,VTODO,DUE,NONE,ZEROORONE
+REQUEST,VTODO,DURATION,NONE,ZEROORONE
+REQUEST,VTODO,EXDATE,NONE,ZEROPLUS
+REQUEST,VTODO,EXRULE,NONE,ZEROPLUS
+REQUEST,VTODO,GEO,NONE,ZEROORONE
+REQUEST,VTODO,LASTMODIFIED,NONE,ZEROORONE
+REQUEST,VTODO,LOCATION,NONE,ZEROORONE
+REQUEST,VTODO,PERCENTCOMPLETE,NONE,ZEROORONE
+REQUEST,VTODO,RDATE,NONE,ZEROPLUS
+REQUEST,VTODO,RECURRENCEID,NONE,ZEROORONE
+REQUEST,VTODO,RELATEDTO,NONE,ZEROPLUS
+REQUEST,VTODO,RESOURCES,NONE,ZEROORONE
+REQUEST,VTODO,RRULE,NONE,ZEROPLUS
+REQUEST,VTODO,STATUS,NONE,ZEROORONE
+REQUEST,VTODO,URL,NONE,ZEROORONE
+REQUEST,VTODO,X,NONE,ZEROPLUS
+REQUEST,VTODO,REQUESTSTATUS,NONE,ZERO
+REQUEST,VTODO,NONE,VALARM,ZEROPLUS
+REQUEST,VTODO,NONE,VTIMEZONE,ZEROPLUS
+REQUEST,VTODO,NONE,X,ZEROPLUS
+REQUEST,VTODO,NONE,VEVENT,ZERO
+REQUEST,VTODO,NONE,VFREEBUSY,ZERO
+REQUEST,VTODO,NONE,VJOURNAL,ZERO
+REPLY,VTODO,NONE,NONE,ONEPLUS
+REPLY,VTODO,ATTENDEE,NONE,ONEPLUS
+REPLY,VTODO,DTSTAMP,NONE,ONE
+REPLY,VTODO,ORGANIZER,NONE,ONE
+REPLY,VTODO,REQUESTSTATUS,NONE,ONEPLUS
+REPLY,VTODO,UID,NONE,ONE
+REPLY,VTODO,ATTACH,NONE,ZEROPLUS
+REPLY,VTODO,CATEGORIES,NONE,ZEROORONE
+REPLY,VTODO,CLASS,NONE,ZEROORONE
+REPLY,VTODO,COMMENT,NONE,ZEROORONE
+REPLY,VTODO,CONTACT,NONE,ZEROPLUS
+REPLY,VTODO,CREATED,NONE,ZEROORONE
+REPLY,VTODO,DESCRIPTION,NONE,ZEROORONE
+REPLY,VTODO,DTSTART,NONE,ZEROORONE
+REPLY,VTODO,DUE,NONE,ZEROORONE
+REPLY,VTODO,DURATION,NONE,ZEROORONE
+REPLY,VTODO,EXDATE,NONE,ZEROPLUS
+REPLY,VTODO,EXRULE,NONE,ZEROPLUS
+REPLY,VTODO,GEO,NONE,ZEROORONE
+REPLY,VTODO,LASTMODIFIED,NONE,ZEROORONE
+REPLY,VTODO,LOCATION,NONE,ZEROORONE
+REPLY,VTODO,PERCENTCOMPLETE,NONE,ZEROORONE
+REPLY,VTODO,PRIORITY,NONE,ZEROORONE
+REPLY,VTODO,RDATE,NONE,ZEROPLUS
+REPLY,VTODO,RELATEDTO,NONE,ZEROPLUS
+REPLY,VTODO,RESOURCES,NONE,ZEROORONE
+REPLY,VTODO,RRULE,NONE,ZEROPLUS
+REPLY,VTODO,RECURRENCEID,NONE,ZEROORONE
+REPLY,VTODO,SEQUENCE,NONE,ZEROORONE
+REPLY,VTODO,STATUS,NONE,ZEROORONE
+REPLY,VTODO,SUMMARY,NONE,ZEROORONE
+REPLY,VTODO,URL,NONE,ZEROORONE
+REPLY,VTODO,X,NONE,ZEROPLUS
+REPLY,VTODO,NONE,VTIMEZONE,ZEROORONE
+REPLY,VTODO,NONE,X,ZEROPLUS
+REPLY,VTODO,NONE,VALARM,ZERO
+REPLY,VTODO,NONE,VEVENT,ZERO
+REPLY,VTODO,NONE,VFREEBUSY,ZERO
+ADD,VTODO,NONE,NONE,ONE
+ADD,VTODO,DTSTAMP,NONE,ONE
+ADD,VTODO,ORGANIZER,NONE,ONE
+ADD,VTODO,PRIORITY,NONE,ONE
+ADD,VTODO,SEQUENCE,NONE,ONE
+ADD,VTODO,SUMMARY,NONE,ONE
+ADD,VTODO,UID,NONE,ONE
+ADD,VTODO,ATTACH,NONE,ZEROPLUS
+ADD,VTODO,ATTENDEE,NONE,ZEROPLUS
+ADD,VTODO,CATEGORIES,NONE,ZEROORONE
+ADD,VTODO,CLASS,NONE,ZEROORONE
+ADD,VTODO,COMMENT,NONE,ZEROORONE
+ADD,VTODO,CONTACT,NONE,ZEROPLUS
+ADD,VTODO,CREATED,NONE,ZEROORONE
+ADD,VTODO,DESCRIPTION,NONE,ZEROORONE
+ADD,VTODO,DTSTART,NONE,ZEROORONE
+ADD,VTODO,DUE,NONE,ZEROORONE
+ADD,VTODO,DURATION,NONE,ZEROORONE
+ADD,VTODO,EXDATE,NONE,ZEROPLUS
+ADD,VTODO,EXRULE,NONE,ZEROPLUS
+ADD,VTODO,GEO,NONE,ZEROORONE
+ADD,VTODO,LASTMODIFIED,NONE,ZEROORONE
+ADD,VTODO,LOCATION,NONE,ZEROORONE
+ADD,VTODO,PERCENTCOMPLETE,NONE,ZEROORONE
+ADD,VTODO,RDATE,NONE,ZEROPLUS
+ADD,VTODO,RELATEDTO,NONE,ZEROPLUS
+ADD,VTODO,RESOURCES,NONE,ZEROORONE
+ADD,VTODO,RRULE,NONE,ZEROPLUS
+ADD,VTODO,STATUS,NONE,ZEROORONE
+ADD,VTODO,URL,NONE,ZEROORONE
+ADD,VTODO,X,NONE,ZEROPLUS
+ADD,VTODO,RECURRENCEID,NONE,ZERO
+ADD,VTODO,REQUESTSTATUS,NONE,ZERO
+ADD,VTODO,NONE,VALARM,ZEROPLUS
+ADD,VTODO,NONE,VTIMEZONE,ZEROPLUS
+ADD,VTODO,NONE,X,ZEROPLUS
+ADD,VTODO,NONE,VEVENT,ZERO
+ADD,VTODO,NONE,VJOURNAL,ZERO
+ADD,VTODO,NONE,VFREEBUSY,ZERO
+CANCEL,VTODO,NONE,NONE,ONE
+CANCEL,VTODO,ATTENDEE,NONE,ZEROPLUS
+CANCEL,VTODO,UID,NONE,ONE
+CANCEL,VTODO,DTSTAMP,NONE,ONE
+CANCEL,VTODO,ORGANIZER,NONE,ONE
+CANCEL,VTODO,SEQUENCE,NONE,ONE
+CANCEL,VTODO,ATTACH,NONE,ZEROPLUS
+CANCEL,VTODO,CATEGORIES,NONE,ZEROORONE
+CANCEL,VTODO,CLASS,NONE,ZEROORONE
+CANCEL,VTODO,COMMENT,NONE,ZEROORONE
+CANCEL,VTODO,CONTACT,NONE,ZEROPLUS
+CANCEL,VTODO,CREATED,NONE,ZEROORONE
+CANCEL,VTODO,DESCRIPTION,NONE,ZEROORONE
+CANCEL,VTODO,DTSTART,NONE,ZEROORONE
+CANCEL,VTODO,DUE,NONE,ZEROORONE
+CANCEL,VTODO,DURATION,NONE,ZEROORONE
+CANCEL,VTODO,EXDATE,NONE,ZEROPLUS
+CANCEL,VTODO,EXRULE,NONE,ZEROPLUS
+CANCEL,VTODO,GEO,NONE,ZEROORONE
+CANCEL,VTODO,LASTMODIFIED,NONE,ZEROORONE
+CANCEL,VTODO,LOCATION,NONE,ZEROORONE
+CANCEL,VTODO,PERCENTCOMPLETE,NONE,ZEROORONE
+CANCEL,VTODO,RDATE,NONE,ZEROPLUS
+CANCEL,VTODO,RECURRENCEID,NONE,ZEROORONE
+CANCEL,VTODO,RELATEDTO,NONE,ZEROPLUS
+CANCEL,VTODO,RESOURCES,NONE,ZEROORONE
+CANCEL,VTODO,RRULE,NONE,ZEROPLUS
+CANCEL,VTODO,PRIORITY,NONE,ZEROORONE
+CANCEL,VTODO,STATUS,NONE,ZEROORONE
+CANCEL,VTODO,URL,NONE,ZEROORONE
+CANCEL,VTODO,X,NONE,ZEROPLUS
+CANCEL,VTODO,REQUESTSTATUS,NONE,ZERO
+CANCEL,VTODO,NONE,VTIMEZONE,ZEROORONE
+CANCEL,VTODO,NONE,X,ZEROPLUS
+CANCEL,VTODO,NONE,VALARM,ZERO
+CANCEL,VTODO,NONE,VEVENT,ZERO
+CANCEL,VTODO,NONE,VFREEBUSY,ZERO
+REFRESH,VTODO,NONE,NONE,ONE
+REFRESH,VTODO,ATTENDEE,NONE,ONE
+REFRESH,VTODO,DTSTAMP,NONE,ONE
+REFRESH,VTODO,UID,NONE,ONE
+REFRESH,VTODO,RECURRENCEID,NONE,ZEROORONE
+REFRESH,VTODO,X,NONE,ZEROPLUS
+REFRESH,VTODO,ATTACH,NONE,ZERO
+REFRESH,VTODO,CATEGORIES,NONE,ZERO
+REFRESH,VTODO,CLASS,NONE,ZERO
+REFRESH,VTODO,COMMENT,NONE,ZERO
+REFRESH,VTODO,CONTACT,NONE,ZERO
+REFRESH,VTODO,CREATED,NONE,ZERO
+REFRESH,VTODO,DESCRIPTION,NONE,ZERO
+REFRESH,VTODO,DTSTART,NONE,ZERO
+REFRESH,VTODO,DUE,NONE,ZERO
+REFRESH,VTODO,DURATION,NONE,ZERO
+REFRESH,VTODO,EXDATE,NONE,ZERO
+REFRESH,VTODO,EXRULE,NONE,ZERO
+REFRESH,VTODO,GEO,NONE,ZERO
+REFRESH,VTODO,LASTMODIFIED,NONE,ZERO
+REFRESH,VTODO,LOCATION,NONE,ZERO
+REFRESH,VTODO,ORGANIZER,NONE,ZERO
+REFRESH,VTODO,PERCENTCOMPLETE,NONE,ZERO
+REFRESH,VTODO,PRIORITY,NONE,ZERO
+REFRESH,VTODO,RDATE,NONE,ZERO
+REFRESH,VTODO,RELATEDTO,NONE,ZERO
+REFRESH,VTODO,REQUESTSTATUS,NONE,ZERO
+REFRESH,VTODO,RESOURCES,NONE,ZERO
+REFRESH,VTODO,RRULE,NONE,ZERO
+REFRESH,VTODO,SEQUENCE,NONE,ZERO
+REFRESH,VTODO,STATUS,NONE,ZERO
+REFRESH,VTODO,URL,NONE,ZERO
+REFRESH,VTODO,NONE,X,ZEROPLUS
+REFRESH,VTODO,NONE,VALARM,ZERO
+REFRESH,VTODO,NONE,VEVENT,ZERO
+REFRESH,VTODO,NONE,VFREEBUSY,ZERO
+REFRESH,VTODO,NONE,VTIMEZONE,ZERO
+COUNTER,VTODO,NONE,NONE,ONE
+COUNTER,VTODO,ATTENDEE,NONE,ONEPLUS
+COUNTER,VTODO,DTSTAMP,NONE,ONE
+COUNTER,VTODO,ORGANIZER,NONE,ONE
+COUNTER,VTODO,PRIORITY,NONE,ONE
+COUNTER,VTODO,SUMMARY,NONE,ONE
+COUNTER,VTODO,UID,NONE,ONE
+COUNTER,VTODO,ATTACH,NONE,ZEROPLUS
+COUNTER,VTODO,CATEGORIES,NONE,ZEROORONE
+COUNTER,VTODO,CLASS,NONE,ZEROORONE
+COUNTER,VTODO,COMMENT,NONE,ZEROORONE
+COUNTER,VTODO,CONTACT,NONE,ZEROPLUS
+COUNTER,VTODO,CREATED,NONE,ZEROORONE
+COUNTER,VTODO,DESCRIPTION,NONE,ZEROORONE
+COUNTER,VTODO,DTSTART,NONE,ZEROORONE
+COUNTER,VTODO,DUE,NONE,ZEROORONE
+COUNTER,VTODO,DURATION,NONE,ZEROORONE
+COUNTER,VTODO,EXDATE,NONE,ZEROPLUS
+COUNTER,VTODO,EXRULE,NONE,ZEROPLUS
+COUNTER,VTODO,GEO,NONE,ZEROORONE
+COUNTER,VTODO,LASTMODIFIED,NONE,ZEROORONE
+COUNTER,VTODO,LOCATION,NONE,ZEROORONE
+COUNTER,VTODO,PERCENTCOMPLETE,NONE,ZEROORONE
+COUNTER,VTODO,RDATE,NONE,ZEROPLUS
+COUNTER,VTODO,RECURRENCEID,NONE,ZEROORONE
+COUNTER,VTODO,RELATEDTO,NONE,ZEROPLUS
+COUNTER,VTODO,REQUESTSTATUS,NONE,ZEROPLUS
+COUNTER,VTODO,RESOURCES,NONE,ZEROORONE
+COUNTER,VTODO,RRULE,NONE,ZEROORONE
+COUNTER,VTODO,SEQUENCE,NONE,ZEROORONE
+COUNTER,VTODO,STATUS,NONE,ZEROORONE
+COUNTER,VTODO,URL,NONE,ZEROORONE
+COUNTER,VTODO,X,NONE,ZEROPLUS
+COUNTER,VTODO,NONE,VALARM,ZEROPLUS
+COUNTER,VTODO,NONE,VTIMEZONE,ZEROORONE
+COUNTER,VTODO,NONE,X,ZEROPLUS
+COUNTER,VTODO,NONE,VEVENT,ZERO
+COUNTER,VTODO,NONE,VFREEBUSY,ZERO
+DECLINECOUNTER,VTODO,NONE,NONE,ONE
+DECLINECOUNTER,VTODO,ATTENDEE,NONE,ONEPLUS
+DECLINECOUNTER,VTODO,DTSTAMP,NONE,ONE
+DECLINECOUNTER,VTODO,ORGANIZER,NONE,ONE
+DECLINECOUNTER,VTODO,SEQUENCE,NONE,ONE
+DECLINECOUNTER,VTODO,UID,NONE,ONE
+DECLINECOUNTER,VTODO,ATTACH,NONE,ZEROPLUS
+DECLINECOUNTER,VTODO,CATEGORIES,NONE,ZEROORONE
+DECLINECOUNTER,VTODO,CLASS,NONE,ZEROORONE
+DECLINECOUNTER,VTODO,COMMENT,NONE,ZEROORONE
+DECLINECOUNTER,VTODO,CONTACT,NONE,ZEROPLUS
+DECLINECOUNTER,VTODO,CREATED,NONE,ZEROORONE
+DECLINECOUNTER,VTODO,DESCRIPTION,NONE,ZEROORONE
+DECLINECOUNTER,VTODO,DTSTART,NONE,ZEROORONE
+DECLINECOUNTER,VTODO,DUE,NONE,ZEROORONE
+DECLINECOUNTER,VTODO,DURATION,NONE,ZEROORONE
+DECLINECOUNTER,VTODO,EXDATE,NONE,ZEROPLUS
+DECLINECOUNTER,VTODO,EXRULE,NONE,ZEROPLUS
+DECLINECOUNTER,VTODO,GEO,NONE,ZEROORONE
+DECLINECOUNTER,VTODO,LASTMODIFIED,NONE,ZEROORONE
+DECLINECOUNTER,VTODO,LOCATION,NONE,ZEROORONE
+DECLINECOUNTER,VTODO,PERCENTCOMPLETE,NONE,ZEROORONE
+DECLINECOUNTER,VTODO,PRIORITY,NONE,ZEROORONE
+DECLINECOUNTER,VTODO,RDATE,NONE,ZEROPLUS
+DECLINECOUNTER,VTODO,RECURRENCEID,NONE,ZEROORONE
+DECLINECOUNTER,VTODO,RELATEDTO,NONE,ZEROPLUS
+DECLINECOUNTER,VTODO,REQUESTSTATUS,NONE,ZEROPLUS
+DECLINECOUNTER,VTODO,RESOURCES,NONE,ZEROORONE
+DECLINECOUNTER,VTODO,RRULE,NONE,ZEROPLUS
+DECLINECOUNTER,VTODO,STATUS,NONE,ZEROORONE
+DECLINECOUNTER,VTODO,URL,NONE,ZEROORONE
+DECLINECOUNTER,VTODO,X,NONE,ZEROPLUS
+DECLINECOUNTER,VTODO,NONE,VTIMEZONE,ZEROPLUS
+DECLINECOUNTER,VTODO,NONE,X,ZEROPLUS
+DECLINECOUNTER,VTODO,NONE,VALARM,ZERO
+DECLINECOUNTER,VTODO,NONE,VEVENT,ZERO
+DECLINECOUNTER,VTODO,NONE,VFREEBUSY,ZERO
+PUBLISH,VJOURNAL,NONE,NONE,ONEPLUS
+PUBLISH,VJOURNAL,DESCRIPTION,NONE,ONE
+PUBLISH,VJOURNAL,DTSTAMP,NONE,ONE
+PUBLISH,VJOURNAL,DTSTART,NONE,ONE
+PUBLISH,VJOURNAL,ORGANIZER,NONE,ONE
+PUBLISH,VJOURNAL,UID,NONE,ONE
+PUBLISH,VJOURNAL,ATTACH,NONE,ZEROPLUS
+PUBLISH,VJOURNAL,CATEGORIES,NONE,ZEROORONE
+PUBLISH,VJOURNAL,CLASS,NONE,ZEROORONE
+PUBLISH,VJOURNAL,COMMENT,NONE,ZEROORONE
+PUBLISH,VJOURNAL,CONTACT,NONE,ZEROPLUS
+PUBLISH,VJOURNAL,CREATED,NONE,ZEROORONE
+PUBLISH,VJOURNAL,EXDATE,NONE,ZEROPLUS
+PUBLISH,VJOURNAL,EXRULE,NONE,ZEROPLUS
+PUBLISH,VJOURNAL,LASTMODIFIED,NONE,ZEROORONE
+PUBLISH,VJOURNAL,RDATE,NONE,ZEROPLUS
+PUBLISH,VJOURNAL,RECURRENCEID,NONE,ZEROORONE
+PUBLISH,VJOURNAL,RELATEDTO,NONE,ZEROPLUS
+PUBLISH,VJOURNAL,RRULE,NONE,ZEROPLUS
+PUBLISH,VJOURNAL,SEQUENCE,NONE,ZEROORONE
+PUBLISH,VJOURNAL,STATUS,NONE,ZEROORONE
+PUBLISH,VJOURNAL,SUMMARY,NONE,ZEROORONE
+PUBLISH,VJOURNAL,URL,NONE,ZEROORONE
+PUBLISH,VJOURNAL,X,NONE,ZEROPLUS
+PUBLISH,VJOURNAL,ATTENDEE,NONE,ZERO
+PUBLISH,VJOURNAL,NONE,VALARM,ZEROPLUS
+PUBLISH,VJOURNAL,NONE,VTIMEZONE,ZEROPLUS
+PUBLISH,VJOURNAL,NONE,X,ZEROPLUS
+PUBLISH,VJOURNAL,NONE,VEVENT,ZERO
+PUBLISH,VJOURNAL,NONE,VFREEBUSY,ZERO
+PUBLISH,VJOURNAL,NONE,VTODO,ZERO
+ADD,VJOURNAL,NONE,NONE,ONE
+ADD,VJOURNAL,DESCRIPTION,NONE,ONE
+ADD,VJOURNAL,DTSTAMP,NONE,ONE
+ADD,VJOURNAL,DTSTART,NONE,ONE
+ADD,VJOURNAL,ORGANIZER,NONE,ONE
+ADD,VJOURNAL,SEQUENCE,NONE,ONE
+ADD,VJOURNAL,UID,NONE,ONE
+ADD,VJOURNAL,ATTACH,NONE,ZEROPLUS
+ADD,VJOURNAL,CATEGORIES,NONE,ZEROORONE
+ADD,VJOURNAL,CLASS,NONE,ZEROORONE
+ADD,VJOURNAL,COMMENT,NONE,ZEROORONE
+ADD,VJOURNAL,CONTACT,NONE,ZEROPLUS
+ADD,VJOURNAL,CREATED,NONE,ZEROORONE
+ADD,VJOURNAL,EXDATE,NONE,ZEROPLUS
+ADD,VJOURNAL,EXRULE,NONE,ZEROPLUS
+ADD,VJOURNAL,LASTMODIFIED,NONE,ZEROORONE
+ADD,VJOURNAL,RDATE,NONE,ZEROPLUS
+ADD,VJOURNAL,RELATEDTO,NONE,ZEROPLUS
+ADD,VJOURNAL,RRULE,NONE,ZEROPLUS
+ADD,VJOURNAL,STATUS,NONE,ZEROORONE
+ADD,VJOURNAL,SUMMARY,NONE,ZEROORONE
+ADD,VJOURNAL,URL,NONE,ZEROORONE
+ADD,VJOURNAL,X,NONE,ZEROPLUS
+ADD,VJOURNAL,ATTENDEE,NONE,ZERO
+ADD,VJOURNAL,RECURRENCEID,NONE,ZERO
+ADD,VJOURNAL,NONE,VALARM,ZEROPLUS
+ADD,VJOURNAL,NONE,VTIMEZONE,ZEROORONE
+ADD,VJOURNAL,NONE,X,ZEROPLUS
+ADD,VJOURNAL,NONE,VEVENT,ZERO
+ADD,VJOURNAL,NONE,VFREEBUSY,ZERO
+ADD,VJOURNAL,NONE,VTODO,ZERO
+CANCEL,VJOURNAL,NONE,NONE,ONEPLUS
+CANCEL,VJOURNAL,DTSTAMP,NONE,ONE
+CANCEL,VJOURNAL,ORGANIZER,NONE,ONE
+CANCEL,VJOURNAL,SEQUENCE,NONE,ONE
+CANCEL,VJOURNAL,UID,NONE,ONE
+CANCEL,VJOURNAL,ATTACH,NONE,ZEROPLUS
+CANCEL,VJOURNAL,ATTENDEE,NONE,ZEROPLUS
+CANCEL,VJOURNAL,CATEGORIES,NONE,ZEROORONE
+CANCEL,VJOURNAL,CLASS,NONE,ZEROORONE
+CANCEL,VJOURNAL,COMMENT,NONE,ZEROORONE
+CANCEL,VJOURNAL,CONTACT,NONE,ZEROPLUS
+CANCEL,VJOURNAL,CREATED,NONE,ZEROORONE
+CANCEL,VJOURNAL,DESCRIPTION,NONE,ZEROORONE
+CANCEL,VJOURNAL,DTSTART,NONE,ZEROORONE
+CANCEL,VJOURNAL,EXDATE,NONE,ZEROPLUS
+CANCEL,VJOURNAL,EXRULE,NONE,ZEROPLUS
+CANCEL,VJOURNAL,LASTMODIFIED,NONE,ZEROORONE
+CANCEL,VJOURNAL,RDATE,NONE,ZEROPLUS
+CANCEL,VJOURNAL,RECURRENCEID,NONE,ZEROORONE
+CANCEL,VJOURNAL,RELATEDTO,NONE,ZEROPLUS
+CANCEL,VJOURNAL,RRULE,NONE,ZEROPLUS
+CANCEL,VJOURNAL,STATUS,NONE,ZEROORONE
+CANCEL,VJOURNAL,SUMMARY,NONE,ZEROORONE
+CANCEL,VJOURNAL,URL,NONE,ZEROORONE
+CANCEL,VJOURNAL,X,NONE,ZEROPLUS
+CANCEL,VJOURNAL,REQUESTSTATUS,NONE,ZERO
+CANCEL,VJOURNAL,NONE,VTIMEZONE,ZEROPLUS
+CANCEL,VJOURNAL,NONE,X,ZEROPLUS
+CANCEL,VJOURNAL,NONE,VALARM,ZERO
+CANCEL,VJOURNAL,NONE,VEVENT,ZERO
+CANCEL,VJOURNAL,NONE,VFREEBUSY,ZERO
+CANCEL,VJOURNAL,NONE,VTODO,ZERO
+NONE,VCALENDAR,ACTION,NONE,ZERO
+NONE,VCALENDAR,ATTACH,NONE,ZERO
+NONE,VCALENDAR,ATTENDEE,NONE,ZERO
+NONE,VCALENDAR,CALSCALE,NONE,ZEROORONE
+NONE,VCALENDAR,CATEGORIES,NONE,ZERO
+NONE,VCALENDAR,CLASS,NONE,ZERO
+NONE,VCALENDAR,COMMENT,NONE,ZERO
+NONE,VCALENDAR,COMPLETED,NONE,ZERO
+NONE,VCALENDAR,CONTACT,NONE,ZERO
+NONE,VCALENDAR,CREATED,NONE,ZERO
+NONE,VCALENDAR,DESCRIPTION,NONE,ZERO
+NONE,VCALENDAR,DTEND,NONE,ZERO
+NONE,VCALENDAR,DTSTAMP,NONE,ZERO
+NONE,VCALENDAR,DTSTART,NONE,ZERO
+NONE,VCALENDAR,DUE,NONE,ZERO
+NONE,VCALENDAR,DURATION,NONE,ZERO
+NONE,VCALENDAR,EXDATE,NONE,ZERO
+NONE,VCALENDAR,EXRULE,NONE,ZERO
+NONE,VCALENDAR,FREEBUSY,NONE,ZERO
+NONE,VCALENDAR,GEO,NONE,ZERO
+NONE,VCALENDAR,LASTMODIFIED,NONE,ZERO
+NONE,VCALENDAR,LOCATION,NONE,ZERO
+NONE,VCALENDAR,METHOD,NONE,ZEROORONE
+NONE,VCALENDAR,ORGANIZER,NONE,ZERO
+NONE,VCALENDAR,PERCENTCOMPLETE,NONE,ZERO
+NONE,VCALENDAR,PRIORITY,NONE,ZERO
+NONE,VCALENDAR,PRODID,NONE,ONE
+NONE,VCALENDAR,RDATE,NONE,ZERO
+NONE,VCALENDAR,RECURRENCEID,NONE,ZERO
+NONE,VCALENDAR,RELATEDTO,NONE,ZERO
+NONE,VCALENDAR,REPEAT,NONE,ZERO
+NONE,VCALENDAR,REQUESTSTATUS,NONE,ZERO
+NONE,VCALENDAR,RESOURCES,NONE,ZERO
+NONE,VCALENDAR,RRULE,NONE,ZERO
+NONE,VCALENDAR,SEQUENCE,NONE,ZERO
+NONE,VCALENDAR,STATUS,NONE,ZERO
+NONE,VCALENDAR,SUMMARY,NONE,ZERO
+NONE,VCALENDAR,TRANSP,NONE,ZERO
+NONE,VCALENDAR,TRIGGER,NONE,ZERO
+NONE,VCALENDAR,TZID,NONE,ZERO
+NONE,VCALENDAR,TZNAME,NONE,ZERO
+NONE,VCALENDAR,TZOFFSETFROM,NONE,ZERO
+NONE,VCALENDAR,TZOFFSETTO,NONE,ZERO
+NONE,VCALENDAR,TZURL,NONE,ZERO
+NONE,VCALENDAR,UID,NONE,ZERO
+NONE,VCALENDAR,URL,NONE,ZERO
+NONE,VCALENDAR,VERSION,NONE,ONE
+NONE,VCALENDAR,X,NONE,ZEROPLUS
+NONE,VEVENT,ACTION,NONE,ZERO
+NONE,VEVENT,ATTACH,NONE,ZEROPLUS
+NONE,VEVENT,ATTENDEE,NONE,ZEROPLUS
+NONE,VEVENT,CALSCALE,NONE,ZERO
+NONE,VEVENT,CATEGORIES,NONE,ZEROPLUS
+NONE,VEVENT,CLASS,NONE,ZEROORONE
+NONE,VEVENT,COMMENT,NONE,ZEROPLUS
+NONE,VEVENT,COMPLETED,NONE,ZERO
+NONE,VEVENT,CONTACT,NONE,ZEROPLUS
+NONE,VEVENT,CREATED,NONE,ZEROORONE
+NONE,VEVENT,DESCRIPTION,NONE,ZEROORONE
+NONE,VEVENT,DTEND,NONE,ONEEXCLUSIVE, icalrestriction_check_exclusive
+NONE,VEVENT,DTSTAMP,NONE,ZEROORONE
+NONE,VEVENT,DTSTART,NONE,ZEROORONE
+NONE,VEVENT,DUE,NONE,ZERO
+NONE,VEVENT,DURATION,NONE,ONEEXCLUSIVE, icalrestriction_check_exclusive
+NONE,VEVENT,EXDATE,NONE,ZEROPLUS
+NONE,VEVENT,EXRULE,NONE,ZEROPLUS
+NONE,VEVENT,FREEBUSY,NONE,ZERO
+NONE,VEVENT,GEO,NONE,ZEROORONE
+NONE,VEVENT,LASTMODIFIED,NONE,ZEROORONE
+NONE,VEVENT,LOCATION,NONE,ZEROORONE
+NONE,VEVENT,METHOD,NONE,ZERO
+NONE,VEVENT,ORGANIZER,NONE,ZEROORONE
+NONE,VEVENT,PERCENTCOMPLETE,NONE,ZERO
+NONE,VEVENT,PRIORITY,NONE,ZEROORONE
+NONE,VEVENT,PRODID,NONE,ZERO
+NONE,VEVENT,RDATE,NONE,ZEROPLUS
+NONE,VEVENT,RECURRENCEID,NONE,ZEROORONE
+NONE,VEVENT,RELATEDTO,NONE,ZEROPLUS
+NONE,VEVENT,REPEAT,NONE,ZERO
+NONE,VEVENT,REQUESTSTATUS,NONE,ZEROPLUS
+NONE,VEVENT,RESOURCES,NONE,ZEROPLUS
+NONE,VEVENT,RRULE,NONE,ZEROPLUS
+NONE,VEVENT,SEQUENCE,NONE,ZEROORONE
+NONE,VEVENT,STATUS,NONE,ZEROORONE
+NONE,VEVENT,SUMMARY,NONE,ZEROORONE
+NONE,VEVENT,TRANSP,NONE,ZEROORONE
+NONE,VEVENT,TRIGGER,NONE,ZERO
+NONE,VEVENT,TZID,NONE,ZERO
+NONE,VEVENT,TZNAME,NONE,ZERO
+NONE,VEVENT,TZOFFSETFROM,NONE,ZERO
+NONE,VEVENT,TZOFFSETTO,NONE,ZERO
+NONE,VEVENT,TZURL,NONE,ZERO
+NONE,VEVENT,UID,NONE,ZEROORONE
+NONE,VEVENT,URL,NONE,ZEROORONE
+NONE,VEVENT,VERSION,NONE,ZERO
+NONE,VEVENT,X,NONE,ZEROPLUS
+NONE,VTODO,ACTION,NONE,ZERO
+NONE,VTODO,ATTACH,NONE,ZEROPLUS
+NONE,VTODO,ATTENDEE,NONE,ZEROPLUS
+NONE,VTODO,CALSCALE,NONE,ZERO
+NONE,VTODO,CATEGORIES,NONE,ZEROPLUS
+NONE,VTODO,CLASS,NONE,ZEROORONE
+NONE,VTODO,COMMENT,NONE,ZEROPLUS
+NONE,VTODO,COMPLETED,NONE,ZEROORONE
+NONE,VTODO,CONTACT,NONE,ZEROPLUS
+NONE,VTODO,CREATED,NONE,ZEROORONE
+NONE,VTODO,DESCRIPTION,NONE,ZEROORONE
+NONE,VTODO,DTEND,NONE,ZERO
+NONE,VTODO,DTSTAMP,NONE,ZEROORONE
+NONE,VTODO,DTSTART,NONE,ZEROORONE
+NONE,VTODO,DUE,NONE,ONEEXCLUSIVE
+NONE,VTODO,DURATION,NONE,ONEEXCLUSIVE
+NONE,VTODO,EXDATE,NONE,ZEROPLUS
+NONE,VTODO,EXRULE,NONE,ZEROPLUS
+NONE,VTODO,FREEBUSY,NONE,ZERO
+NONE,VTODO,GEO,NONE,ZEROORONE
+NONE,VTODO,LASTMODIFIED,NONE,ZEROORONE
+NONE,VTODO,LOCATION,NONE,ZEROORONE
+NONE,VTODO,METHOD,NONE,ZERO
+NONE,VTODO,ORGANIZER,NONE,ZEROORONE
+NONE,VTODO,PERCENTCOMPLETE,NONE,ZEROORONE
+NONE,VTODO,PRIORITY,NONE,ZEROORONE
+NONE,VTODO,PRODID,NONE,ZERO
+NONE,VTODO,RDATE,NONE,ZEROPLUS
+NONE,VTODO,RECURRENCEID,NONE,ZEROORONE
+NONE,VTODO,RELATEDTO,NONE,ZEROPLUS
+NONE,VTODO,REPEAT,NONE,ZERO
+NONE,VTODO,REQUESTSTATUS,NONE,ZEROPLUS
+NONE,VTODO,RESOURCES,NONE,ZEROPLUS
+NONE,VTODO,RRULE,NONE,ZEROPLUS
+NONE,VTODO,SEQUENCE,NONE,ZEROORONE
+NONE,VTODO,STATUS,NONE,ZEROORONE
+NONE,VTODO,SUMMARY,NONE,ZEROORONE
+NONE,VTODO,TRANSP,NONE,ZERO
+NONE,VTODO,TRIGGER,NONE,ZERO
+NONE,VTODO,TZID,NONE,ZERO
+NONE,VTODO,TZNAME,NONE,ZERO
+NONE,VTODO,TZOFFSETFROM,NONE,ZERO
+NONE,VTODO,TZOFFSETTO,NONE,ZERO
+NONE,VTODO,TZURL,NONE,ZERO
+NONE,VTODO,UID,NONE,ZEROORONE
+NONE,VTODO,URL,NONE,ZEROORONE
+NONE,VTODO,VERSION,NONE,ZERO
+NONE,VTODO,X,NONE,ZEROPLUS
+NONE,VJOURNAL,ACTION,NONE,ZERO
+NONE,VJOURNAL,ATTACH,NONE,ZEROPLUS
+NONE,VJOURNAL,ATTENDEE,NONE,ZEROPLUS
+NONE,VJOURNAL,CALSCALE,NONE,ZERO
+NONE,VJOURNAL,CATEGORIES,NONE,ZEROPLUS
+NONE,VJOURNAL,CLASS,NONE,ZEROORONE
+NONE,VJOURNAL,COMMENT,NONE,ZEROPLUS
+NONE,VJOURNAL,COMPLETED,NONE,ZERO
+NONE,VJOURNAL,CONTACT,NONE,ZEROPLUS
+NONE,VJOURNAL,CREATED,NONE,ZEROORONE
+NONE,VJOURNAL,DESCRIPTION,NONE,ZEROORONE
+NONE,VJOURNAL,DTEND,NONE,ZERO
+NONE,VJOURNAL,DTSTAMP,NONE,ZEROORONE
+NONE,VJOURNAL,DTSTART,NONE,ZEROORONE
+NONE,VJOURNAL,DUE,NONE,ONEEXCLUSIVE
+NONE,VJOURNAL,DURATION,NONE,ONEEXCLUSIVE
+NONE,VJOURNAL,EXDATE,NONE,ZEROPLUS
+NONE,VJOURNAL,EXRULE,NONE,ZEROPLUS
+NONE,VJOURNAL,FREEBUSY,NONE,ZERO
+NONE,VJOURNAL,GEO,NONE,ZERO
+NONE,VJOURNAL,LASTMODIFIED,NONE,ZEROORONE
+NONE,VJOURNAL,LOCATION,NONE,ZERO
+NONE,VJOURNAL,METHOD,NONE,ZERO
+NONE,VJOURNAL,ORGANIZER,NONE,ZEROORONE
+NONE,VJOURNAL,PERCENTCOMPLETE,NONE,ZERO
+NONE,VJOURNAL,PRIORITY,NONE,ZERO
+NONE,VJOURNAL,PRODID,NONE,ZERO
+NONE,VJOURNAL,RDATE,NONE,ZEROPLUS
+NONE,VJOURNAL,RECURRENCEID,NONE,ZEROORONE
+NONE,VJOURNAL,RELATEDTO,NONE,ZEROPLUS
+NONE,VJOURNAL,REPEAT,NONE,ZERO
+NONE,VJOURNAL,REQUESTSTATUS,NONE,ZEROPLUS
+NONE,VJOURNAL,RESOURCES,NONE,ZERO
+NONE,VJOURNAL,RRULE,NONE,ZEROPLUS
+NONE,VJOURNAL,SEQUENCE,NONE,ZEROORONE
+NONE,VJOURNAL,STATUS,NONE,ZEROORONE
+NONE,VJOURNAL,SUMMARY,NONE,ZEROORONE
+NONE,VJOURNAL,TRANSP,NONE,ZERO
+NONE,VJOURNAL,TRIGGER,NONE,ZERO
+NONE,VJOURNAL,TZID,NONE,ZERO
+NONE,VJOURNAL,TZNAME,NONE,ZERO
+NONE,VJOURNAL,TZOFFSETFROM,NONE,ZERO
+NONE,VJOURNAL,TZOFFSETTO,NONE,ZERO
+NONE,VJOURNAL,TZURL,NONE,ZERO
+NONE,VJOURNAL,UID,NONE,ZEROORONE
+NONE,VJOURNAL,URL,NONE,ZEROORONE
+NONE,VJOURNAL,VERSION,NONE,ZERO
+NONE,VJOURNAL,X,NONE,ZEROPLUS
+NONE,VFREEBUSY,ACTION,NONE,ZERO
+NONE,VFREEBUSY,ATTACH,NONE,ZERO
+NONE,VFREEBUSY,ATTENDEE,NONE,ZEROPLUS
+NONE,VFREEBUSY,CALSCALE,NONE,ZERO
+NONE,VFREEBUSY,CATEGORIES,NONE,ZERO
+NONE,VFREEBUSY,CLASS,NONE,ZERO
+NONE,VFREEBUSY,COMMENT,NONE,ZEROPLUS
+NONE,VFREEBUSY,COMPLETED,NONE,ZERO
+NONE,VFREEBUSY,CONTACT,NONE,ZEROORONE
+NONE,VFREEBUSY,CREATED,NONE,ZERO
+NONE,VFREEBUSY,DESCRIPTION,NONE,ZERO
+NONE,VFREEBUSY,DTEND,NONE,ZEROORONE
+NONE,VFREEBUSY,DTSTAMP,NONE,ZERO
+NONE,VFREEBUSY,DTSTART,NONE,ZEROORONE
+NONE,VFREEBUSY,DUE,NONE,ZERO
+NONE,VFREEBUSY,DURATION,NONE,ZEROORONE
+NONE,VFREEBUSY,EXDATE,NONE,ZERO
+NONE,VFREEBUSY,EXRULE,NONE,ZERO
+NONE,VFREEBUSY,FREEBUSY,NONE,ZEROPLUS
+NONE,VFREEBUSY,GEO,NONE,ZERO
+NONE,VFREEBUSY,LASTMODIFIED,NONE,ZERO
+NONE,VFREEBUSY,LOCATION,NONE,ZERO
+NONE,VFREEBUSY,METHOD,NONE,ZERO
+NONE,VFREEBUSY,ORGANIZER,NONE,ZEROORONE
+NONE,VFREEBUSY,PERCENTCOMPLETE,NONE,ZERO
+NONE,VFREEBUSY,PRIORITY,NONE,ZERO
+NONE,VFREEBUSY,PRODID,NONE,ZERO
+NONE,VFREEBUSY,RDATE,NONE,ZERO
+NONE,VFREEBUSY,RECURRENCEID,NONE,ZERO
+NONE,VFREEBUSY,RELATEDTO,NONE,ZERO
+NONE,VFREEBUSY,REPEAT,NONE,ZERO
+NONE,VFREEBUSY,REQUESTSTATUS,NONE,ZEROPLUS
+NONE,VFREEBUSY,RESOURCES,NONE,ZERO
+NONE,VFREEBUSY,RRULE,NONE,ZERO
+NONE,VFREEBUSY,SEQUENCE,NONE,ZERO
+NONE,VFREEBUSY,STATUS,NONE,ZERO
+NONE,VFREEBUSY,SUMMARY,NONE,ZERO
+NONE,VFREEBUSY,TRANSP,NONE,ZERO
+NONE,VFREEBUSY,TRIGGER,NONE,ZERO
+NONE,VFREEBUSY,TZID,NONE,ZERO
+NONE,VFREEBUSY,TZNAME,NONE,ZERO
+NONE,VFREEBUSY,TZOFFSETFROM,NONE,ZERO
+NONE,VFREEBUSY,TZOFFSETTO,NONE,ZERO
+NONE,VFREEBUSY,TZURL,NONE,ZERO
+NONE,VFREEBUSY,UID,NONE,ZEROORONE
+NONE,VFREEBUSY,URL,NONE,ZEROORONE
+NONE,VFREEBUSY,VERSION,NONE,ZERO
+NONE,VFREEBUSY,X,NONE,ZEROPLUS
+NONE,VTIMEZONE,ACTION,NONE,ZERO
+NONE,VTIMEZONE,ATTACH,NONE,ZERO
+NONE,VTIMEZONE,ATTENDEE,NONE,ZERO
+NONE,VTIMEZONE,CALSCALE,NONE,ZERO
+NONE,VTIMEZONE,CATEGORIES,NONE,ZERO
+NONE,VTIMEZONE,CLASS,NONE,ZERO
+NONE,VTIMEZONE,COMMENT,NONE,ZERO
+NONE,VTIMEZONE,COMPLETED,NONE,ZERO
+NONE,VTIMEZONE,CONTACT,NONE,ZERO
+NONE,VTIMEZONE,CREATED,NONE,ZERO
+NONE,VTIMEZONE,DESCRIPTION,NONE,ZERO
+NONE,VTIMEZONE,DTEND,NONE,ZERO
+NONE,VTIMEZONE,DTSTAMP,NONE,ZERO
+NONE,VTIMEZONE,DTSTART,NONE,ZERO
+NONE,VTIMEZONE,DUE,NONE,ZERO
+NONE,VTIMEZONE,DURATION,NONE,ZERO
+NONE,VTIMEZONE,EXDATE,NONE,ZERO
+NONE,VTIMEZONE,EXRULE,NONE,ZERO
+NONE,VTIMEZONE,FREEBUSY,NONE,ZERO
+NONE,VTIMEZONE,GEO,NONE,ZERO
+NONE,VTIMEZONE,LASTMODIFIED,NONE,ZEROORONE
+NONE,VTIMEZONE,LOCATION,NONE,ZERO
+NONE,VTIMEZONE,METHOD,NONE,ZERO
+NONE,VTIMEZONE,ORGANIZER,NONE,ZERO
+NONE,VTIMEZONE,PERCENTCOMPLETE,NONE,ZERO
+NONE,VTIMEZONE,PRIORITY,NONE,ZERO
+NONE,VTIMEZONE,PRODID,NONE,ZERO
+NONE,VTIMEZONE,RDATE,NONE,ZERO
+NONE,VTIMEZONE,RECURRENCEID,NONE,ZERO
+NONE,VTIMEZONE,RELATEDTO,NONE,ZERO
+NONE,VTIMEZONE,REPEAT,NONE,ZERO
+NONE,VTIMEZONE,REQUESTSTATUS,NONE,ZERO
+NONE,VTIMEZONE,RESOURCES,NONE,ZERO
+NONE,VTIMEZONE,RRULE,NONE,ZERO
+NONE,VTIMEZONE,SEQUENCE,NONE,ZERO
+NONE,VTIMEZONE,STATUS,NONE,ZERO
+NONE,VTIMEZONE,SUMMARY,NONE,ZERO
+NONE,VTIMEZONE,TRANSP,NONE,ZERO
+NONE,VTIMEZONE,TRIGGER,NONE,ZERO
+NONE,VTIMEZONE,TZID,NONE,ONE
+NONE,VTIMEZONE,TZNAME,NONE,ZERO
+NONE,VTIMEZONE,TZOFFSETFROM,NONE,ZERO
+NONE,VTIMEZONE,TZOFFSETTO,NONE,ZERO
+NONE,VTIMEZONE,TZURL,NONE,ZEROPLUS
+NONE,VTIMEZONE,UID,NONE,ZERO
+NONE,VTIMEZONE,URL,NONE,ZERO
+NONE,VTIMEZONE,VERSION,NONE,ZERO
+NONE,VTIMEZONE,X,NONE,ZEROORONE
+NONE,XSTANDARD,ACTION,NONE,ZERO
+NONE,XSTANDARD,ATTACH,NONE,ZERO
+NONE,XSTANDARD,ATTENDEE,NONE,ZERO
+NONE,XSTANDARD,CALSCALE,NONE,ZERO
+NONE,XSTANDARD,CATEGORIES,NONE,ZERO
+NONE,XSTANDARD,CLASS,NONE,ZERO
+NONE,XSTANDARD,COMMENT,NONE,ZEROPLUS
+NONE,XSTANDARD,COMPLETED,NONE,ZERO
+NONE,XSTANDARD,CONTACT,NONE,ZERO
+NONE,XSTANDARD,CREATED,NONE,ZERO
+NONE,XSTANDARD,DESCRIPTION,NONE,ZERO
+NONE,XSTANDARD,DTEND,NONE,ZERO
+NONE,XSTANDARD,DTSTAMP,NONE,ZERO
+NONE,XSTANDARD,DTSTART,NONE,ONE
+NONE,XSTANDARD,DUE,NONE,ZERO
+NONE,XSTANDARD,DURATION,NONE,ZERO
+NONE,XSTANDARD,EXDATE,NONE,ZERO
+NONE,XSTANDARD,EXRULE,NONE,ZERO
+NONE,XSTANDARD,FREEBUSY,NONE,ZERO
+NONE,XSTANDARD,GEO,NONE,ZERO
+NONE,XSTANDARD,LASTMODIFIED,NONE,ZERO
+NONE,XSTANDARD,LOCATION,NONE,ZERO
+NONE,XSTANDARD,METHOD,NONE,ZERO
+NONE,XSTANDARD,ORGANIZER,NONE,ZERO
+NONE,XSTANDARD,PERCENTCOMPLETE,NONE,ZERO
+NONE,XSTANDARD,PRIORITY,NONE,ZERO
+NONE,XSTANDARD,PRODID,NONE,ZERO
+NONE,XSTANDARD,RDATE,NONE,ZEROPLUS
+NONE,XSTANDARD,RECURRENCEID,NONE,ZERO
+NONE,XSTANDARD,RELATEDTO,NONE,ZERO
+NONE,XSTANDARD,REPEAT,NONE,ZERO
+NONE,XSTANDARD,REQUESTSTATUS,NONE,ZERO
+NONE,XSTANDARD,RESOURCES,NONE,ZERO
+NONE,XSTANDARD,RRULE,NONE,ZEROPLUS
+NONE,XSTANDARD,SEQUENCE,NONE,ZERO
+NONE,XSTANDARD,STATUS,NONE,ZERO
+NONE,XSTANDARD,SUMMARY,NONE,ZERO
+NONE,XSTANDARD,TRANSP,NONE,ZERO
+NONE,XSTANDARD,TRIGGER,NONE,ZERO
+NONE,XSTANDARD,TZID,NONE,ZERO
+NONE,XSTANDARD,TZNAME,NONE,ZEROPLUS
+NONE,XSTANDARD,TZOFFSETFROM,NONE,ONE
+NONE,XSTANDARD,TZOFFSETTO,NONE,ONE
+NONE,XSTANDARD,TZURL,NONE,ZERO
+NONE,XSTANDARD,UID,NONE,ZERO
+NONE,XSTANDARD,URL,NONE,ZERO
+NONE,XSTANDARD,VERSION,NONE,ZERO
+NONE,XSTANDARD,X,NONE,ZEROPLUS
+NONE,XDAYLIGHT,ACTION,NONE,ZERO
+NONE,XDAYLIGHT,ATTACH,NONE,ZERO
+NONE,XDAYLIGHT,ATTENDEE,NONE,ZERO
+NONE,XDAYLIGHT,CALSCALE,NONE,ZERO
+NONE,XDAYLIGHT,CATEGORIES,NONE,ZERO
+NONE,XDAYLIGHT,CLASS,NONE,ZERO
+NONE,XDAYLIGHT,COMMENT,NONE,ZEROPLUS
+NONE,XDAYLIGHT,COMPLETED,NONE,ZERO
+NONE,XDAYLIGHT,CONTACT,NONE,ZERO
+NONE,XDAYLIGHT,CREATED,NONE,ZERO
+NONE,XDAYLIGHT,DESCRIPTION,NONE,ZERO
+NONE,XDAYLIGHT,DTEND,NONE,ZERO
+NONE,XDAYLIGHT,DTSTAMP,NONE,ZERO
+NONE,XDAYLIGHT,DTSTART,NONE,ONE
+NONE,XDAYLIGHT,DUE,NONE,ZERO
+NONE,XDAYLIGHT,DURATION,NONE,ZERO
+NONE,XDAYLIGHT,EXDATE,NONE,ZERO
+NONE,XDAYLIGHT,EXRULE,NONE,ZERO
+NONE,XDAYLIGHT,FREEBUSY,NONE,ZERO
+NONE,XDAYLIGHT,GEO,NONE,ZERO
+NONE,XDAYLIGHT,LASTMODIFIED,NONE,ZERO
+NONE,XDAYLIGHT,LOCATION,NONE,ZERO
+NONE,XDAYLIGHT,METHOD,NONE,ZERO
+NONE,XDAYLIGHT,ORGANIZER,NONE,ZERO
+NONE,XDAYLIGHT,PERCENTCOMPLETE,NONE,ZERO
+NONE,XDAYLIGHT,PRIORITY,NONE,ZERO
+NONE,XDAYLIGHT,PRODID,NONE,ZERO
+NONE,XDAYLIGHT,RDATE,NONE,ZEROPLUS
+NONE,XDAYLIGHT,RECURRENCEID,NONE,ZERO
+NONE,XDAYLIGHT,RELATEDTO,NONE,ZERO
+NONE,XDAYLIGHT,REPEAT,NONE,ZERO
+NONE,XDAYLIGHT,REQUESTSTATUS,NONE,ZERO
+NONE,XDAYLIGHT,RESOURCES,NONE,ZERO
+NONE,XDAYLIGHT,RRULE,NONE,ZEROPLUS
+NONE,XDAYLIGHT,SEQUENCE,NONE,ZERO
+NONE,XDAYLIGHT,STATUS,NONE,ZERO
+NONE,XDAYLIGHT,SUMMARY,NONE,ZERO
+NONE,XDAYLIGHT,TRANSP,NONE,ZERO
+NONE,XDAYLIGHT,TRIGGER,NONE,ZERO
+NONE,XDAYLIGHT,TZID,NONE,ZERO
+NONE,XDAYLIGHT,TZNAME,NONE,ZEROPLUS
+NONE,XDAYLIGHT,TZOFFSETFROM,NONE,ONE
+NONE,XDAYLIGHT,TZOFFSETTO,NONE,ONE
+NONE,XDAYLIGHT,TZURL,NONE,ZERO
+NONE,XDAYLIGHT,UID,NONE,ZERO
+NONE,XDAYLIGHT,URL,NONE,ZERO
+NONE,XDAYLIGHT,VERSION,NONE,ZERO
+NONE,XDAYLIGHT,X,NONE,ZEROPLUS
+NONE,XAUDIOALARM,ACTION,NONE,ONE
+NONE,XAUDIOALARM,ATTACH,NONE,ZEROORONE
+NONE,XAUDIOALARM,ATTENDEE,NONE,ZERO
+NONE,XAUDIOALARM,CALSCALE,NONE,ZERO
+NONE,XAUDIOALARM,CATEGORIES,NONE,ZERO
+NONE,XAUDIOALARM,CLASS,NONE,ZERO
+NONE,XAUDIOALARM,COMMENT,NONE,ZERO
+NONE,XAUDIOALARM,COMPLETED,NONE,ZERO
+NONE,XAUDIOALARM,CONTACT,NONE,ZERO
+NONE,XAUDIOALARM,CREATED,NONE,ZERO
+NONE,XAUDIOALARM,DESCRIPTION,NONE,ZERO
+NONE,XAUDIOALARM,DTEND,NONE,ZERO
+NONE,XAUDIOALARM,DTSTAMP,NONE,ZERO
+NONE,XAUDIOALARM,DTSTART,NONE,ZERO
+NONE,XAUDIOALARM,DUE,NONE,ZERO
+NONE,XAUDIOALARM,DURATION,NONE,ONEMUTUAL,icalrestriction_check_mutual
+NONE,XAUDIOALARM,REPEAT,NONE,ONEMUTUAL,icalrestriction_check_mutual
+NONE,XAUDIOALARM,EXDATE,NONE,ZERO
+NONE,XAUDIOALARM,EXRULE,NONE,ZERO
+NONE,XAUDIOALARM,FREEBUSY,NONE,ZERO
+NONE,XAUDIOALARM,GEO,NONE,ZERO
+NONE,XAUDIOALARM,LASTMODIFIED,NONE,ZERO
+NONE,XAUDIOALARM,LOCATION,NONE,ZERO
+NONE,XAUDIOALARM,METHOD,NONE,ZERO
+NONE,XAUDIOALARM,ORGANIZER,NONE,ZERO
+NONE,XAUDIOALARM,PERCENTCOMPLETE,NONE,ZERO
+NONE,XAUDIOALARM,PRIORITY,NONE,ZERO
+NONE,XAUDIOALARM,PRODID,NONE,ZERO
+NONE,XAUDIOALARM,RDATE,NONE,ZERO
+NONE,XAUDIOALARM,RECURRENCEID,NONE,ZERO
+NONE,XAUDIOALARM,RELATEDTO,NONE,ZERO
+NONE,XAUDIOALARM,REQUESTSTATUS,NONE,ZERO
+NONE,XAUDIOALARM,RESOURCES,NONE,ZERO
+NONE,XAUDIOALARM,RRULE,NONE,ZERO
+NONE,XAUDIOALARM,SEQUENCE,NONE,ZERO
+NONE,XAUDIOALARM,STATUS,NONE,ZERO
+NONE,XAUDIOALARM,SUMMARY,NONE,ZERO
+NONE,XAUDIOALARM,TRANSP,NONE,ZERO
+NONE,XAUDIOALARM,TRIGGER,NONE,ONE
+NONE,XAUDIOALARM,TZID,NONE,ZERO
+NONE,XAUDIOALARM,TZNAME,NONE,ZERO
+NONE,XAUDIOALARM,TZOFFSETFROM,NONE,ZERO
+NONE,XAUDIOALARM,TZOFFSETTO,NONE,ZERO
+NONE,XAUDIOALARM,TZURL,NONE,ZERO
+NONE,XAUDIOALARM,UID,NONE,ZERO
+NONE,XAUDIOALARM,URL,NONE,ZERO
+NONE,XAUDIOALARM,VERSION,NONE,ZERO
+NONE,XAUDIOALARM,X,NONE,ZEROPLUS
+NONE,XDISPLAYALARM,ACTION,NONE,ONE
+NONE,XDISPLAYALARM,ATTACH,NONE,ZERO
+NONE,XDISPLAYALARM,ATTENDEE,NONE,ZERO
+NONE,XDISPLAYALARM,CALSCALE,NONE,ZERO
+NONE,XDISPLAYALARM,CATEGORIES,NONE,ZERO
+NONE,XDISPLAYALARM,CLASS,NONE,ZERO
+NONE,XDISPLAYALARM,COMMENT,NONE,ZERO
+NONE,XDISPLAYALARM,COMPLETED,NONE,ZERO
+NONE,XDISPLAYALARM,CONTACT,NONE,ZERO
+NONE,XDISPLAYALARM,CREATED,NONE,ZERO
+NONE,XDISPLAYALARM,DESCRIPTION,NONE,ONE
+NONE,XDISPLAYALARM,DTEND,NONE,ZERO
+NONE,XDISPLAYALARM,DTSTAMP,NONE,ZERO
+NONE,XDISPLAYALARM,DTSTART,NONE,ZERO
+NONE,XDISPLAYALARM,DUE,NONE,ZERO
+NONE,XDISPLAYALARM,DURATION,NONE,ONEMUTUAL,icalrestriction_check_mutual
+NONE,XDISPLAYALARM,REPEAT,NONE,ONEMUTUAL,icalrestriction_check_mutual
+NONE,XDISPLAYALARM,EXDATE,NONE,ZERO
+NONE,XDISPLAYALARM,EXRULE,NONE,ZERO
+NONE,XDISPLAYALARM,FREEBUSY,NONE,ZERO
+NONE,XDISPLAYALARM,GEO,NONE,ZERO
+NONE,XDISPLAYALARM,LASTMODIFIED,NONE,ZERO
+NONE,XDISPLAYALARM,LOCATION,NONE,ZERO
+NONE,XDISPLAYALARM,METHOD,NONE,ZERO
+NONE,XDISPLAYALARM,ORGANIZER,NONE,ZERO
+NONE,XDISPLAYALARM,PERCENTCOMPLETE,NONE,ZERO
+NONE,XDISPLAYALARM,PRIORITY,NONE,ZERO
+NONE,XDISPLAYALARM,PRODID,NONE,ZERO
+NONE,XDISPLAYALARM,RDATE,NONE,ZERO
+NONE,XDISPLAYALARM,RECURRENCEID,NONE,ZERO
+NONE,XDISPLAYALARM,RELATEDTO,NONE,ZERO
+NONE,XDISPLAYALARM,REQUESTSTATUS,NONE,ZERO
+NONE,XDISPLAYALARM,RESOURCES,NONE,ZERO
+NONE,XDISPLAYALARM,RRULE,NONE,ZERO
+NONE,XDISPLAYALARM,SEQUENCE,NONE,ZERO
+NONE,XDISPLAYALARM,STATUS,NONE,ZERO
+NONE,XDISPLAYALARM,SUMMARY,NONE,ZERO
+NONE,XDISPLAYALARM,TRANSP,NONE,ZERO
+NONE,XDISPLAYALARM,TRIGGER,NONE,ONE
+NONE,XDISPLAYALARM,TZID,NONE,ZERO
+NONE,XDISPLAYALARM,TZNAME,NONE,ZERO
+NONE,XDISPLAYALARM,TZOFFSETFROM,NONE,ZERO
+NONE,XDISPLAYALARM,TZOFFSETTO,NONE,ZERO
+NONE,XDISPLAYALARM,TZURL,NONE,ZERO
+NONE,XDISPLAYALARM,UID,NONE,ZERO
+NONE,XDISPLAYALARM,URL,NONE,ZERO
+NONE,XDISPLAYALARM,VERSION,NONE,ZERO
+NONE,XDISPLAYALARM,X,NONE,ZEROPLUS
+NONE,XEMAILALARM,ACTION,NONE,ONE
+NONE,XEMAILALARM,ATTACH,NONE,ZEROPLUS
+NONE,XEMAILALARM,ATTENDEE,NONE,ONEPLUS
+NONE,XEMAILALARM,CALSCALE,NONE,ZERO
+NONE,XEMAILALARM,CATEGORIES,NONE,ZERO
+NONE,XEMAILALARM,CLASS,NONE,ZERO
+NONE,XEMAILALARM,COMMENT,NONE,ZERO
+NONE,XEMAILALARM,COMPLETED,NONE,ZERO
+NONE,XEMAILALARM,CONTACT,NONE,ZERO
+NONE,XEMAILALARM,CREATED,NONE,ZERO
+NONE,XEMAILALARM,DESCRIPTION,NONE,ONE
+NONE,XEMAILALARM,DTEND,NONE,ZERO
+NONE,XEMAILALARM,DTSTAMP,NONE,ZERO
+NONE,XEMAILALARM,DTSTART,NONE,ZERO
+NONE,XEMAILALARM,DUE,NONE,ZERO
+NONE,XEMAILALARM,DURATION,NONE,ONEMUTUAL,icalrestriction_check_mutual
+NONE,XEMAILALARM,REPEAT,NONE,ONEMUTUAL,icalrestriction_check_mutual
+NONE,XEMAILALARM,EXDATE,NONE,ZERO
+NONE,XEMAILALARM,EXRULE,NONE,ZERO
+NONE,XEMAILALARM,FREEBUSY,NONE,ZERO
+NONE,XEMAILALARM,GEO,NONE,ZERO
+NONE,XEMAILALARM,LASTMODIFIED,NONE,ZERO
+NONE,XEMAILALARM,LOCATION,NONE,ZERO
+NONE,XEMAILALARM,METHOD,NONE,ZERO
+NONE,XEMAILALARM,ORGANIZER,NONE,ZERO
+NONE,XEMAILALARM,PERCENTCOMPLETE,NONE,ZERO
+NONE,XEMAILALARM,PRIORITY,NONE,ZERO
+NONE,XEMAILALARM,PRODID,NONE,ZERO
+NONE,XEMAILALARM,RDATE,NONE,ZERO
+NONE,XEMAILALARM,RECURRENCEID,NONE,ZERO
+NONE,XEMAILALARM,RELATEDTO,NONE,ZERO
+NONE,XEMAILALARM,REQUESTSTATUS,NONE,ZERO
+NONE,XEMAILALARM,RESOURCES,NONE,ZERO
+NONE,XEMAILALARM,RRULE,NONE,ZERO
+NONE,XEMAILALARM,SEQUENCE,NONE,ZERO
+NONE,XEMAILALARM,STATUS,NONE,ZERO
+NONE,XEMAILALARM,SUMMARY,NONE,ONE
+NONE,XEMAILALARM,TRANSP,NONE,ZERO
+NONE,XEMAILALARM,TRIGGER,NONE,ONE
+NONE,XEMAILALARM,TZID,NONE,ZERO
+NONE,XEMAILALARM,TZNAME,NONE,ZERO
+NONE,XEMAILALARM,TZOFFSETFROM,NONE,ZERO
+NONE,XEMAILALARM,TZOFFSETTO,NONE,ZERO
+NONE,XEMAILALARM,TZURL,NONE,ZERO
+NONE,XEMAILALARM,UID,NONE,ZERO
+NONE,XEMAILALARM,URL,NONE,ZERO
+NONE,XEMAILALARM,VERSION,NONE,ZERO
+NONE,XEMAILALARM,X,NONE,ZEROPLUS
+NONE,XPROCEDUREALARM,ACTION,NONE,ONE
+NONE,XPROCEDUREALARM,ATTACH,NONE,ZEROORONE
+NONE,XPROCEDUREALARM,ATTENDEE,NONE,ZERO
+NONE,XPROCEDUREALARM,CALSCALE,NONE,ZERO
+NONE,XPROCEDUREALARM,CATEGORIES,NONE,ZERO
+NONE,XPROCEDUREALARM,CLASS,NONE,ZERO
+NONE,XPROCEDUREALARM,COMMENT,NONE,ZERO
+NONE,XPROCEDUREALARM,COMPLETED,NONE,ZERO
+NONE,XPROCEDUREALARM,CONTACT,NONE,ZERO
+NONE,XPROCEDUREALARM,CREATED,NONE,ZERO
+NONE,XPROCEDUREALARM,DESCRIPTION,NONE,ZEROORONE
+NONE,XPROCEDUREALARM,DTEND,NONE,ZERO
+NONE,XPROCEDUREALARM,DTSTAMP,NONE,ZERO
+NONE,XPROCEDUREALARM,DTSTART,NONE,ZERO
+NONE,XPROCEDUREALARM,DUE,NONE,ZERO
+NONE,XPROCEDUREALARM,DURATION,NONE,ONEMUTUAL,icalrestriction_check_mutual
+NONE,XPROCEDUREALARM,REPEAT,NONE,ONEMUTUAL,icalrestriction_check_mutual
+NONE,XPROCEDUREALARM,EXDATE,NONE,ZERO
+NONE,XPROCEDUREALARM,EXRULE,NONE,ZERO
+NONE,XPROCEDUREALARM,FREEBUSY,NONE,ZERO
+NONE,XPROCEDUREALARM,GEO,NONE,ZERO
+NONE,XPROCEDUREALARM,LASTMODIFIED,NONE,ZERO
+NONE,XPROCEDUREALARM,LOCATION,NONE,ZERO
+NONE,XPROCEDUREALARM,METHOD,NONE,ZERO
+NONE,XPROCEDUREALARM,ORGANIZER,NONE,ZERO
+NONE,XPROCEDUREALARM,PERCENTCOMPLETE,NONE,ZERO
+NONE,XPROCEDUREALARM,PRIORITY,NONE,ZERO
+NONE,XPROCEDUREALARM,PRODID,NONE,ZERO
+NONE,XPROCEDUREALARM,RDATE,NONE,ZERO
+NONE,XPROCEDUREALARM,RECURRENCEID,NONE,ZERO
+NONE,XPROCEDUREALARM,RELATEDTO,NONE,ZERO
+NONE,XPROCEDUREALARM,REQUESTSTATUS,NONE,ZERO
+NONE,XPROCEDUREALARM,RESOURCES,NONE,ZERO
+NONE,XPROCEDUREALARM,RRULE,NONE,ZERO
+NONE,XPROCEDUREALARM,SEQUENCE,NONE,ZERO
+NONE,XPROCEDUREALARM,STATUS,NONE,ZERO
+NONE,XPROCEDUREALARM,SUMMARY,NONE,ZERO
+NONE,XPROCEDUREALARM,TRANSP,NONE,ZERO
+NONE,XPROCEDUREALARM,TRIGGER,NONE,ONE
+NONE,XPROCEDUREALARM,TZID,NONE,ZERO
+NONE,XPROCEDUREALARM,TZNAME,NONE,ZERO
+NONE,XPROCEDUREALARM,TZOFFSETFROM,NONE,ZERO
+NONE,XPROCEDUREALARM,TZOFFSETTO,NONE,ZERO
+NONE,XPROCEDUREALARM,TZURL,NONE,ZERO
+NONE,XPROCEDUREALARM,UID,NONE,ZERO
+NONE,XPROCEDUREALARM,URL,NONE,ZERO
+NONE,XPROCEDUREALARM,VERSION,NONE,ZERO
+NONE,XPROCEDUREALARM,X,NONE,ZEROPLUS
diff --git a/libical/design-data/status-new.txt b/libical/design-data/status-new.txt
new file mode 100644
index 0000000000..9e7bbf83a7
--- /dev/null
+++ b/libical/design-data/status-new.txt
@@ -0,0 +1,56 @@
+2.0 STATOK Operation was successfully performed.
+2.0.1 STARTSENDATA Start ICAL input; end with <CRLF>.<CRLF>
+2.0.11 OKDATAFOLLOWS The request was processed successfully. Reply data follows on the next line and terminates with <CRLF>.<CRLF>
+2.0.2 REPLYPENDING A timeout has occurred. The server is still working on the reply. Use CONTINUE to continue waiting for the reply or ABORT to terminate the command.
+2.0.3 ABORTED The command currently underway was successsfully aborted.
+2.0.4 WILLATTEMPT The specified Calendar is not here but an attempt will be made to deliver the request or reply to the Calendar anyway.
+2.0.5 TRUSTEDWILLQUEUE The request or reply will be queued and delivered to the target calendar when its iRIP server contacts this server and issues the SWITCH command.
+2.0.6 WILLATTEMPT The specified Calendar is not here but an attempt will be made to deliver the request or reply to the Calendar anyway.
+2.0.7 QUEUED The message has been queued for delivery.
+2.0.8 QUEUEEMPTY There are no more queued messages.
+2.1 FALLBACK Success. Fallback taken on one or more property values.
+2.2 NOCOMMANDINPROGRESS An ABORT or CONTINUE was received when no command was in progress
+2.2 IGPROP Success. Invalid property ignored.
+2.3 IGPARAM Success. invalid property parameter ignored.
+2.4 IGXPROP Success. Unknown non-standard property ignored.
+2.5 IGXPARAM Success. Unknown non standard property value ignored.
+2.6 IGCOMP Success. Invalid calendar component ignored.
+2.7 FORWARD Success. Request forwarded to Calendar User.
+2.8 ONEEVENT Success. Repeating event ignored. Scheduled as a single component.
+2.9 TRUNC Success. Truncated end date time to date boundary.
+2.10 ONETODO Success. Repeating VTODO ignored. Scheduled as a single VTODO.
+2.11 TRUNCRRULE Success. Unbounded RRULE clipped at some finite number of instances
+3.0 INVPROPNAME Invalid property name.
+3.1 INVPROPVAL Invalid property value.
+3.2 INVPARAM Invalid property parameter.
+3.3 INVPARAMVAL Invalid property parameter value.
+3.4 INVCOMP Invalid calendar component sequence.
+3.5 INVTIME Invalid date or time.
+3.6 INVRULE Invalid rule.
+3.7 INVCU Invalid Calendar User.
+3.8 NOAUTH No authority.
+3.9 BADVERSION Unsupported version.
+3.10 TOOBIG Request entity too large.
+3.11 MISSREQCOMP Required component or property missing.
+3.12 UNKCOMP Unknown component or property found.
+3.13 BADCOMP Unsupported component or property found
+3.14 NOCAP Unsupported capability.
+4.0 BUSY Event conflict. Date/time is busy.
+5.0 MAYBE Request MAY supported.
+5.1 UNAVAIL Service unavailable.
+5.2 NOSERVICE Invalid calendar service.
+5.3 NOSCHED No scheduling support for user.
+6.1 AUTHENTICATEFAILURE Unsupported authentication mechanism, credentials rejected
+6.2 AUTHENTICATIONABORTED Sender aborted authentication, authentication exchange cancelled
+8.0 GENERALFAILURE A failure has occurred in the Receiver that prevents the operation from succeeding.
+8.1 SERVERTOOBUSY The iRIP Receiver is too busy.
+8.2 ICALOBJECTTOOBIG Object has exceeded the server's size limit.
+8.3 DATETOOLARGE A DATETIME value was too far in the future to be represented on this Calendar.
+8.4 DATETOOSMALL A DATETIME value was too far in the past to be represented on this Calendar.
+9.0 INVALIDIRIPCOMMAND An unrecongnized command was received.
+9.1 UNEXPECTEDCOMMAND The command is not allowed for the server's current state.
+10.1 REFERRAL Accompanied by an alternate address.
+10.2 SERVERSHUTDOWN The server is shutting down.
+10.3 SERVERSTOPPING FLOOD 2
+10.4 EXCEEDEDQUOTAS The operation would cause a resource to exceed the allocated quota
+10.5 QUEUEDTOOLONG The ITIP message has been queued too long. Delivery has been aborted.
diff --git a/libical/design-data/status.foo b/libical/design-data/status.foo
new file mode 100644
index 0000000000..a2591bd26a
--- /dev/null
+++ b/libical/design-data/status.foo
@@ -0,0 +1,104 @@
+2.0 STATOK Operation was successfully performed.
+
+2.0.1 START-SENDATA Start ICAL input; end with
+ <CRLF>.<CRLF>
+
+2.0.11 OK-DATAFOLLOWS The request was processed
+ successfully. Reply data follows on
+ the next line and terminates with
+ <CRLF>.<CRLF>
+
+2.0.2 REPLY-PENDING A timeout has occurred. The server is
+ still working on the reply. Use
+ CONTINUE to continue waiting for the
+ reply or ABORT to terminate the
+ command.
+
+2.0.3 ABORTED In response to the client issuing an
+ ABORT command, this reply code
+ indicates that any command currently
+ underway was successsfully aborted.
+
+2.0.4 WILL-ATTEMPT The specified Calendar is not here
+ but an attempt will be made to deliver
+ the request or reply to the Calendar
+ anyway. There is a trust relationship
+ between this iRIP server and the
+ iRIP server for the target calendar.
+
+2.0.5 TRUSTED-WILL-QUEUE The specified Calendar cannot be
+ contacted directly and a trust
+ relationship exists between this
+ server and the server on which the
+ Calendar exists. The request or reply
+ will be queued and delivered to the
+ target calendar when its iRIP server
+ contacts this server and issues the
+ SWITCH command.
+
+2.0.6 WILL-ATTEMPT The specified Calendar is not here
+ but an attempt will be made to deliver
+ the request or reply to the Calendar
+ anyway. There is not a trust
+ relationship between the iRIP server
+ and the iRIP server for the target
+ calendar.
+
+2.0.7 QUEUED The message has been queued for
+ delivery.
+
+2.0.8 QUEUE-EMPTY There are no more queued messages.
+
+2.2 NO COMMAND IN PROGRESS An ABORT or CONTINUE was received when
+ no command was in progress
+
+6.1 AUTHENTICATE FAILURE Unsupported authentication mechanism,
+ credentials rejected
+
+6.2 AUTHENTICATION ABORTED Sender aborted authentication,
+ authentication exchange cancelled
+
+8.0 GENERAL FAILURE A failure has occurred in the Receiver
+ that prevents the operation from
+ succeeding.
+
+8.1 SERVER TOO BUSY Sent when a session cannot be
+ established because the iRIP
+ Receiver is too busy.
+
+8.2 ICAL OBJECT TOO BIG Used to signal that an ICAL object has
+ exceeded the server's size limit.
+
+8.3 DATE TOO LARGE A DATETIME value was too far in the
+ future to be represented on this
+ Calendar.
+
+8.4 DATE TOO SMALL A DATETIME value was too far in the
+ past to be represented on this
+ Calendar.
+
+9.0 INVALID iRIP COMMAND An unrecongnized command was received.
+
+9.1 UNEXPECTED COMMAND A command was issued in a manner
+ inconsistent with the state diagram.
+ For example, issuing the SENDATA
+ command without having specified any
+ RECIPIENTs will cause this error.
+10.1 REFERRAL Accompanied by an alternate address.
+ The RECIPIENT specified should be
+ contacted at the given alternate
+ address. The referral address MUST
+ follow the reply code.
+
+10.2 SERVER SHUT DOWN The server is shutting down.
+
+10.3 SERVER STOPPING FLOOD 2
+
+
+10.4 EXCEEDED QUOTAS The operation has not be performed
+ because it would cause the resources
+ (memory, disk, CPU, etc) to exceed the
+ allocated quota
+
+10.5 QUEUED TOO LONG The ITIP message has been queued too
+ long. Delivery has been aborted. \ No newline at end of file
diff --git a/libical/design-data/status.txt b/libical/design-data/status.txt
new file mode 100644
index 0000000000..9e7bbf83a7
--- /dev/null
+++ b/libical/design-data/status.txt
@@ -0,0 +1,56 @@
+2.0 STATOK Operation was successfully performed.
+2.0.1 STARTSENDATA Start ICAL input; end with <CRLF>.<CRLF>
+2.0.11 OKDATAFOLLOWS The request was processed successfully. Reply data follows on the next line and terminates with <CRLF>.<CRLF>
+2.0.2 REPLYPENDING A timeout has occurred. The server is still working on the reply. Use CONTINUE to continue waiting for the reply or ABORT to terminate the command.
+2.0.3 ABORTED The command currently underway was successsfully aborted.
+2.0.4 WILLATTEMPT The specified Calendar is not here but an attempt will be made to deliver the request or reply to the Calendar anyway.
+2.0.5 TRUSTEDWILLQUEUE The request or reply will be queued and delivered to the target calendar when its iRIP server contacts this server and issues the SWITCH command.
+2.0.6 WILLATTEMPT The specified Calendar is not here but an attempt will be made to deliver the request or reply to the Calendar anyway.
+2.0.7 QUEUED The message has been queued for delivery.
+2.0.8 QUEUEEMPTY There are no more queued messages.
+2.1 FALLBACK Success. Fallback taken on one or more property values.
+2.2 NOCOMMANDINPROGRESS An ABORT or CONTINUE was received when no command was in progress
+2.2 IGPROP Success. Invalid property ignored.
+2.3 IGPARAM Success. invalid property parameter ignored.
+2.4 IGXPROP Success. Unknown non-standard property ignored.
+2.5 IGXPARAM Success. Unknown non standard property value ignored.
+2.6 IGCOMP Success. Invalid calendar component ignored.
+2.7 FORWARD Success. Request forwarded to Calendar User.
+2.8 ONEEVENT Success. Repeating event ignored. Scheduled as a single component.
+2.9 TRUNC Success. Truncated end date time to date boundary.
+2.10 ONETODO Success. Repeating VTODO ignored. Scheduled as a single VTODO.
+2.11 TRUNCRRULE Success. Unbounded RRULE clipped at some finite number of instances
+3.0 INVPROPNAME Invalid property name.
+3.1 INVPROPVAL Invalid property value.
+3.2 INVPARAM Invalid property parameter.
+3.3 INVPARAMVAL Invalid property parameter value.
+3.4 INVCOMP Invalid calendar component sequence.
+3.5 INVTIME Invalid date or time.
+3.6 INVRULE Invalid rule.
+3.7 INVCU Invalid Calendar User.
+3.8 NOAUTH No authority.
+3.9 BADVERSION Unsupported version.
+3.10 TOOBIG Request entity too large.
+3.11 MISSREQCOMP Required component or property missing.
+3.12 UNKCOMP Unknown component or property found.
+3.13 BADCOMP Unsupported component or property found
+3.14 NOCAP Unsupported capability.
+4.0 BUSY Event conflict. Date/time is busy.
+5.0 MAYBE Request MAY supported.
+5.1 UNAVAIL Service unavailable.
+5.2 NOSERVICE Invalid calendar service.
+5.3 NOSCHED No scheduling support for user.
+6.1 AUTHENTICATEFAILURE Unsupported authentication mechanism, credentials rejected
+6.2 AUTHENTICATIONABORTED Sender aborted authentication, authentication exchange cancelled
+8.0 GENERALFAILURE A failure has occurred in the Receiver that prevents the operation from succeeding.
+8.1 SERVERTOOBUSY The iRIP Receiver is too busy.
+8.2 ICALOBJECTTOOBIG Object has exceeded the server's size limit.
+8.3 DATETOOLARGE A DATETIME value was too far in the future to be represented on this Calendar.
+8.4 DATETOOSMALL A DATETIME value was too far in the past to be represented on this Calendar.
+9.0 INVALIDIRIPCOMMAND An unrecongnized command was received.
+9.1 UNEXPECTEDCOMMAND The command is not allowed for the server's current state.
+10.1 REFERRAL Accompanied by an alternate address.
+10.2 SERVERSHUTDOWN The server is shutting down.
+10.3 SERVERSTOPPING FLOOD 2
+10.4 EXCEEDEDQUOTAS The operation would cause a resource to exceed the allocated quota
+10.5 QUEUEDTOOLONG The ITIP message has been queued too long. Delivery has been aborted.
diff --git a/libical/design-data/value-c-types.txt b/libical/design-data/value-c-types.txt
new file mode 100644
index 0000000000..c7dd26034f
--- /dev/null
+++ b/libical/design-data/value-c-types.txt
@@ -0,0 +1,22 @@
+ATTACH struct icalattachtype # Non-std
+BINARY char*
+BOOLEAN int
+CAL-ADDRESS char*
+DATE struct icaltimetype
+DATE-TIME struct icaltimetype
+DATE-TIME-DATE struct icaltimetype # Non-std
+DATE-TIME-PERIOD struct icalperiodtype # Non-std
+DURATION struct icaldurationtype
+FLOAT float
+GEO struct icalgeotype # Non-std
+INTEGER int
+METHOD icalproperty_method # Non-std
+PERIOD struct icalperiodtype
+RECUR struct icalrecurrencetype
+STRING char* # Non-std
+TEXT char*
+TIME struct icaltimetype
+TRIGGER union icaltriggertype # Non-std
+URI char*
+UTC-OFFSET int
+QUERY char*
diff --git a/libical/design-data/value-mem-semantics.txt b/libical/design-data/value-mem-semantics.txt
new file mode 100644
index 0000000000..5948e244f6
--- /dev/null
+++ b/libical/design-data/value-mem-semantics.txt
@@ -0,0 +1,19 @@
+ATTACH struct icalattachtype
+BINARY char*
+BOOLEAN int
+CAL-ADDRESS char*
+DATE time_t
+DATE-TIME time_t
+DATE-TIME-DATE time_t
+DATE-TIME-PERIOD struct icalperiodtype
+DURATION struct icaldurationtype
+FLOAT float
+GEO struct icalgeotype
+INTEGER int
+PERIOD struct icalperiodtype
+RECUR struct icalrecurrencetype
+TEXT char*
+TIME time_t
+TRIGGER struct icaltriggertimetype
+URI char*
+UTC-OFFSET int
diff --git a/libical/doc/.cvsignore b/libical/doc/.cvsignore
new file mode 100644
index 0000000000..3dda72986f
--- /dev/null
+++ b/libical/doc/.cvsignore
@@ -0,0 +1,2 @@
+Makefile.in
+Makefile
diff --git a/libical/doc/Makefile.am b/libical/doc/Makefile.am
new file mode 100644
index 0000000000..0df4f3f42d
--- /dev/null
+++ b/libical/doc/Makefile.am
@@ -0,0 +1 @@
+EXTRA_DIST = UsingLibical.lyx UsingLibical.ps
diff --git a/libical/doc/UsingLibical.lyx b/libical/doc/UsingLibical.lyx
new file mode 100644
index 0000000000..afc5b0608d
--- /dev/null
+++ b/libical/doc/UsingLibical.lyx
@@ -0,0 +1,2256 @@
+#This file was created by <eric> Sat Feb 19 10:33:21 2000
+#LyX 1.0 (C) 1995-1999 Matthias Ettrich and the LyX Team
+\lyxformat 2.15
+\textclass linuxdoc
+\language default
+\inputencoding default
+\fontscheme default
+\graphics default
+\paperfontsize default
+\spacing single
+\papersize Default
+\paperpackage a4
+\use_geometry 0
+\use_amsmath 0
+\paperorientation portrait
+\secnumdepth 3
+\tocdepth 3
+\paragraph_separation indent
+\defskip medskip
+\quotes_language english
+\quotes_times 2
+\papercolumns 1
+\papersides 1
+\paperpagestyle default
+
+\layout Title
+
+Using Libical
+\layout Author
+
+Eric Busboom (eric@softwarestudio.org)
+\layout Date
+
+January 2000
+\layout Section
+
+Introduction
+\layout Standard
+
+Libical is an Open Source implementation of the iCalendar protocols and
+ protocol data units.
+ The iCalendar specification describes how calendar clients can communicate
+ with calendar servers for users can store their calendar data and arrange
+ meetings with other users.
+
+\layout Standard
+
+Libical implements the following specifications and protocols
+\layout Standard
+\added_space_top 0.3cm \added_space_bottom 0.3cm \LyXTable
+multicol5
+5 2 0 0 -1 -1 -1 -1
+1 0 0 0
+1 0 0 0
+1 0 0 0
+1 0 0 0
+1 1 0 0
+8 1 0 "" ""
+8 1 1 "" ""
+0 8 1 0 0 0 0 "" ""
+0 8 1 0 0 0 0 "" ""
+0 8 1 0 0 0 0 "" ""
+0 8 1 0 0 0 0 "" ""
+0 8 1 0 0 0 0 "" ""
+0 8 1 0 0 0 0 "" ""
+0 8 1 0 0 0 0 "" ""
+0 8 1 0 0 0 0 "" ""
+0 8 1 0 0 0 0 "" ""
+0 8 1 0 0 0 0 "" ""
+
+iCal Core
+\newline
+2445
+\newline
+iTIP
+\newline
+2446
+\newline
+iMIP
+\newline
+2447
+\newline
+iRIP
+\newline
+draft
+\newline
+CAP
+\newline
+draft
+\layout Standard
+
+(The current version, 0.15, does not implement iRip or CAP.
+ )
+\layout Standard
+
+This documentation assumes that you are familiar with the iCalendar standards
+ RFC2445 and RFC2446.
+ these specifications are online on the CALSCH webpage at:
+\layout Verbatim
+
+http://www.imc.org/ietf-calendar/
+\layout Subsection
+
+The libical project
+\layout Standard
+
+This code is under active development.
+ If you would like to contribute to the project, you can contact me, Eric
+ Busboom, at eric@softwarestudio.org.
+ The project has a webpage at
+\layout Verbatim
+
+http://softwarestudio.org/libical/index.html
+\layout Standard
+
+and a mailing list that you can join by sending the following mail:
+\layout Verbatim
+
+To: minimalist@softwarestudio.org
+\layout Verbatim
+
+Subject: subscribe libical
+\layout Subsection
+
+License
+\layout Standard
+
+The code and datafiles in this distribution are licensed under the Mozilla
+ Public License.
+ See http://www.mozilla.org/NPL/MPL-1.0.html for a copy of the license.
+ Alternately, you may use libical under the terms of the GNU Library General
+ Public License.
+ See http://www.fsf.org/copyleft/lesser.html for a copy of the LGPL.
+\layout Standard
+
+This dual license ensures that the library can be incorporated into both
+ proprietary code and GPL'd programs, and will benefit from improvements
+ made by programmers in both realms.
+ I will only accept changes into my version of the library if they are similarly
+ dual-licensed.
+\layout Subsection
+
+Purpose & Goals
+\layout Subsection
+
+Document version
+\layout Verbatim
+
+$Id: UsingLibical.lyx,v 1.4 2000/05/15 06:18:16 ericb Exp $
+\layout Section
+
+Building the Library
+\layout Standard
+
+Libical uses autoconf to generate makefiles, although it uses none of the
+ autoconf flags to influence the compilation.
+ It should built with no adjustments on Linux, FreeBSD and Solaris.
+
+\layout Section
+
+Structure
+\layout Standard
+
+The iCal calendar model is based on four types of objects: components, propertie
+s, values and parameters.
+
+\layout Standard
+
+Properties are the fundamental unit of information in iCal, and they work
+ a bit like a hash entry, with a constant key and a variable value.
+ Properties may also have modifiers, called parameters.
+ In the iCal content line
+\layout Verbatim
+
+ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com
+\layout Standard
+
+The property name is
+\begin_inset Quotes eld
+\end_inset
+
+ORGANIZER,
+\begin_inset Quotes erd
+\end_inset
+
+ the value of the property is
+\begin_inset Quotes eld
+\end_inset
+
+mrbig@host.com
+\begin_inset Quotes erd
+\end_inset
+
+ and the
+\begin_inset Quotes eld
+\end_inset
+
+ROLE
+\begin_inset Quotes erd
+\end_inset
+
+ parameter specifies that Mr Big is the chair of the meetings associated
+ with this property.
+
+\layout Standard
+
+Components are groups of properties that represent the core objects of a
+ calendar system, such as events or timezones.
+
+\layout Standard
+
+The central goal of libical is to parse iTIP data into an internal representatio
+n of Components, Properties, Parameters an Values, and to allow the user
+ to manipulate the data in various ways
+\layout Standard
+\added_space_bottom 0.3cm
+\begin_float fig
+\layout Standard
+
+
+\begin_inset Figure size 180 147
+file icaluml.eps
+flags 13
+
+\end_inset
+
+
+\end_float
+When a component is send across a network, if it is un-encrypted, it will
+ look something like:
+\layout Code
+
+BEGIN:VEVENT
+\layout Code
+
+DTSTAMP:19980309T231000Z
+\layout Code
+
+UID:guid-1.host1.com
+\layout Code
+
+ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com
+\layout Code
+
+ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:
+\layout Code
+
+
+\protected_separator
+ MAILTO:employee-A@host.com
+\layout Code
+
+DESCRIPTION:Project XYZ Review Meeting
+\layout Code
+
+CATEGORIES:MEETING
+\layout Code
+
+CLASS:PUBLIC
+\layout Code
+
+CREATED:19980309T130000Z
+\layout Code
+
+SUMMARY:XYZ Project Review
+\layout Code
+
+DTSTART;TZID=US-Eastern:19980312T083000
+\layout Code
+
+DTEND;TZID=US-Eastern:19980312T093000
+\layout Code
+
+LOCATION:1CP Conference Room 4350
+\layout Code
+
+END:VEVENT
+\layout Subsection
+
+Core iCal classes
+\layout Subsubsection
+
+Components
+\layout Subsubsection
+
+Properties
+\layout Subsubsection
+
+Values
+\layout Subsubsection
+
+Parameters
+\layout Subsection
+
+Other elements of libical
+\layout Standard
+
+In addition to the core iCal classes, libical has many other types, structures,
+ classes that aid in creating and using iCal components.
+
+\layout Subsubsection
+
+Enumerations
+\layout Subsubsection
+
+Types
+\layout Subsubsection
+
+The Parser
+\layout Subsubsection
+
+Restrictions
+\layout Subsubsection
+
+Error objects
+\layout Subsubsection
+
+Memory Management
+\layout Subsubsection
+
+Storage classes
+\layout Section
+
+Differences From RFCs
+\layout Standard
+
+Libical has been designed to follow the standards as closely as possible,
+ so that the key objects in the standards are also keey objects in the library.
+ However, there are a few areas where the specifications are (arguably)
+ irregular, and following them exactly would result in an unfriendly interface.
+ These deviations make libical easier to use by maintaining a self-similar
+ interface.
+
+\layout Subsection
+
+Pseudo Components
+\layout Standard
+
+Libical defines components for groups of properties that look and act like
+ components, but are not defined as components in the specification.
+ XDAYLIGHT and XSTANDARD are notable examples.
+ These pseudo components group properties within the VTIMEZONE components.
+ For instanace, the timezone properties associated with daylight savings
+ time starts with
+\begin_inset Quotes eld
+\end_inset
+
+BEGIN:DAYLIGHT
+\begin_inset Quotes erd
+\end_inset
+
+ and ends with
+\begin_inset Quotes eld
+\end_inset
+
+END:DAYLIGHT, just like other components, but is not defined as a component
+ in RFC2445.
+ ( See RFC2445, page 61 ) In Libical,this grouping is represented by the
+ XDAYLIGHT component.
+ Standard iCAL components all start with the letter
+\begin_inset Quotes eld
+\end_inset
+
+V,
+\begin_inset Quotes erd
+\end_inset
+
+ while pseudo components start with
+\begin_inset Quotes erd
+\end_inset
+
+X.
+\begin_inset Quotes erd
+\end_inset
+
+
+\layout Standard
+
+There are also pseudo components that are conceptually derived classess
+ of VALARM.
+ RFC2446 defines what properties may be included in each component, and
+ for VALARM, the set of properties it may have depends on the value of the
+ ACTION property.
+
+\layout Standard
+
+For instance, if a VALARM component has an ACTION property with the value
+ of
+\begin_inset Quotes eld
+\end_inset
+
+AUDIO,
+\begin_inset Quotes erd
+\end_inset
+
+ the component must also have an
+\begin_inset Quotes eld
+\end_inset
+
+ATTACH
+\begin_inset Quotes erd
+\end_inset
+
+ property.
+ However, if the ACTION value is
+\begin_inset Quotes eld
+\end_inset
+
+DISPLAY,
+\begin_inset Quotes erd
+\end_inset
+
+ the component must have a DESCRIPTION property.
+
+\layout Standard
+
+To handle these various, complex restrictions, libical has pseudo components
+ for each type of alarm: XAUDIOALARM, XDISPLAYALARM, XEMAILALARM and XPROCEDUREA
+LARM.
+
+\layout Subsection
+
+Combined Values
+\layout Standard
+
+Many values can take more than one type.
+ TRIGGER, for instance, can have a value type of with DURATION or of DATE-TIME.
+ These multiple types make it difficult to create routines to return the
+ value associated with a property.
+
+\layout Standard
+
+It is natural to have interfaces that would return the value of a property,
+ but it is cumbersone for a single routine to return multiple types.
+ So, in libical, properties that can have multiple types are given a single
+ type that is the union of their RFC2445 types.
+ For instance, in libical, the value of the TRIGGER property resolves to
+
+\noun on
+struct icaltriggertype
+\noun default
+.
+ This type is a union of a DURATION and a DATE-TIME.
+
+\layout Subsection
+
+Multi-Valued Properties
+\layout Standard
+
+Some properties, such as CATEGORIES have only one value type, but each CATEGORIE
+S property can have multiple value instances.
+ This also results in a cumbersome interface -- CATEGORIES accessors would
+ have to return a list while all other accessors returned a single value.
+ In libical, all properties have a single value, and multi-valued properties
+ are broken down into multiple single valued properties during parsing.
+ That is, an input line like,
+\layout Verbatim
+
+CATEGORIES: work, home
+\layout Standard
+
+becomes in libical's internal representation
+\layout Verbatim
+
+CATEGORIES: work
+\layout Verbatim
+
+CATEGORIES: home
+\layout Standard
+
+Oddly, RFC2445 allows some multi-valued properties ( like FREEBUSY ) to
+ exist as both a multi-values property and as multiple single value properties,
+ while others ( like CATEGORIES ) can only exist as single multi-valued
+ properties.
+ This makes the internal representation for CATEGORIES illegal.
+ However when you convert a component to a string, the library will collect
+ all of the CATEGORIES properties into one.
+
+\layout Section
+
+Implementation Limitations
+\layout Section
+
+Using libical
+\layout Subsection
+
+Creating Components
+\layout Standard
+
+There are three ways to create components in Libical: creating individual
+ objects and assembling them, building entire objects in massive vaargs
+ calls, and parsing a text file containing iCalendar data.
+
+\layout Subsubsection
+
+Constructor Interfaces
+\layout Standard
+
+Using constructor interfaces, you create each of the objects seperately
+ and them assemble them in to components:
+\layout Code
+
+icalcomponent *event;
+\layout Code
+
+icalproperty *prop;
+\layout Code
+
+icalparameter *param;
+\layout Code
+
+struct icaltimetype atime;
+\layout Code
+
+event = icalcomponent_new(ICAL_VEVENT_COMPONENT);
+\layout Code
+
+prop = icalproperty_new_dtstamp(atime) ;
+\layout Code
+
+icalcomponent_add_property(event, prop);
+\layout Code
+
+prop = icalproperty_new_uid(strdup("guid-1.host1.com")) );
+\layout Code
+
+icalcomponent_add_property(event,prop);
+\layout Code
+
+prop=icalproperty_new_organizer(strdup("mrbig@host.com"));
+\layout Code
+
+param = icalparameter_new_role(ICAL_ROLE_CHAIR)
+\layout Code
+
+icalproperty_add_parameter(prop, param);
+\layout Code
+
+icalcomponent_add_property(event,prop);
+\layout Standard
+
+While we are on this example, you should notice that libical uses a semi-object-
+oriented style of interface.
+ Most things you work with are objects, that are instantiated with a constructor
+ that has
+\begin_inset Quotes eld
+\end_inset
+
+new
+\begin_inset Quotes erd
+\end_inset
+
+ in the name.
+ Also note that, other than the object reference, most structure data is
+ passed in to libical routines by value.
+ Strings, of course, are passed in by reference, but libical will take ownership
+ of the memory, so you had beter strdup() the data unless you want a core
+ dump when the memory is freed for the second time.
+ Libical has some complex bu very regular memory handling rules.
+ These are detailed in section
+\begin_inset LatexCommand \ref{sec:memory}
+
+\end_inset
+
+.
+\layout Standard
+
+If any of the constructors fail, they will return 0.
+ If you try to insert 0 into a property or component, or use a zero-valued
+ object reference, libical will either silently ignore the error or will
+ abort with an error message.
+ This behavior is controlled by a compile time flag (ICAL_ERRORS_ARE_FATAL),
+ and will abort by default.
+
+\layout Subsubsection
+
+vaargs Constructors
+\layout Standard
+
+There is another way to create complex components, which is arguable more
+ elegant, if you are not horrified by vaargs.
+ The vaargs constructor interface all you to create intricate components
+ in a single block of text.
+
+\layout Code
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+ calendar =
+\layout Code
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+icalcomponent_vanew(
+\layout Code
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+ ICAL_VCALENDAR_COMPONENT,
+\layout Code
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+ icalproperty_new_version(strdup("2.0")),
+\layout Code
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+ icalproperty_new_prodid(strdup("-//RDU Software//NONSGML HandCal//EN")),
+\layout Code
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+ icalcomponent_vanew(
+\layout Code
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+ICAL_VEVENT_COMPONENT,
+\layout Code
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+icalproperty_new_dtstamp(atime),
+\layout Code
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+icalproperty_new_uid(strdup("guid-1.host1.com")),
+\layout Code
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+icalproperty_vanew_organizer(
+\layout Code
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+ strdup("mrbig@host.com"),
+\layout Code
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+ icalparameter_new_role(ICAL_ROLE_CHAIR),
+\layout Code
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+ 0
+\layout Code
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+),
+\layout Code
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+icalproperty_vanew_attendee(
+\layout Code
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+ strdup("employee-A@host.com"),
+\layout Code
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+ icalparameter_new_role(ICAL_ROLE_REQPARTICIPANT),
+\layout Code
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+ icalparameter_new_rsvp(1),
+\layout Code
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+ icalparameter_new_cutype(ICAL_CUTYPE_GROUP),
+\layout Code
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+ 0
+\layout Code
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+ ),
+\layout Code
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+icalproperty_new_location(strdup("1CP Conference Room 4350")),
+\layout Code
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+0
+\layout Code
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+),
+\layout Code
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+ 0
+\layout Code
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+ );
+\layout Standard
+
+This form is similar to the regular constructor, except that they have
+\begin_inset Quotes eld
+\end_inset
+
+vanew
+\begin_inset Quotes erd
+\end_inset
+
+ instead of
+\begin_inset Quotes eld
+\end_inset
+
+new
+\begin_inset Quotes erd
+\end_inset
+
+ in the name.
+ The arguments are similar too, except that the component contstructor can
+ have a list of properties, and the property constructor can have a list
+ or parameters.
+ Be sure to terminate every list with a '0', or your code will crash, if
+ you are lucky.
+
+\layout Subsubsection
+
+Parsing Text Files
+\layout Standard
+
+The final way to create components will probably be the most common; you
+ can create components from RFC2445 compliant text.
+ If you have the string in memory, use
+\layout Verbatim
+
+icalcomponent* icalparser_parse_string(char* str);
+\layout Standard
+
+This may seem wasteful if you want to pull a large component off of the
+ network; you may prefer to parse the component line by line.
+ This is possible too, with
+\layout Verbatim
+
+icalcomponent* icalparser_parse(char*(*line_gen_func)(char *s, size_t size,
+ void *d));
+\layout Standard
+
+This routine takes a pointer to a function that copies 'size' characters
+ to 's'.
+ The routine returns 's', similar to fgets().
+ See string_line_generator in icalparser.c for an example.
+
+\layout Subsection
+
+Accessing Components
+\layout Standard
+
+Given a reference to a component, you probably will want to access the propertie
+s, parameters and values inside.
+
+\layout Subsubsection
+
+Finding Components
+\layout Standard
+
+To find a sub-component of a component, use:
+\layout Verbatim
+
+icalproperty* icalcomponent_get_first_component(
+\layout Verbatim
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+icalcomponent* component,
+\layout Verbatim
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+icalcomponent_kind kind);
+\layout Standard
+
+This routine will return a reference to the first component of the type
+ 'kind.' The key kind values, listed in icalenums.h are:
+\layout Code
+
+ICAL_ANY_COMPONENT
+\layout Code
+
+ICAL_VEVENT_COMPONENT
+\layout Code
+
+ICAL_VTODO_COMPONENT
+\layout Code
+
+ICAL_VJOURNAL_COMPONENT
+\layout Code
+
+ICAL_VCALENDAR_COMPONENT
+\layout Code
+
+ICAL_VFREEBUSY_COMPONENT
+\layout Code
+
+ICAL_VALARM_COMPONENT
+\layout Standard
+
+These are only the most common components; there are many more listed in
+ icalenums.h.
+\layout Standard
+
+As you might guess, if there is more than one subcomponent of the type you
+ have chosen, this routine will return only the first.
+ to get at the others, you need to iterate through the component.
+
+\layout Subsubsection
+
+Interating Through Components
+\layout Standard
+
+Iteration requires a second routine to get the next subcomponent after the
+ first:
+\layout Verbatim
+
+icalcomponent* icalcomponent_get_next_component(icalcomponent* component,
+
+\layout Verbatim
+
+icalcomponent_kind kind);
+\layout Standard
+
+With the 'first' and 'next' routines, you can create a for loop to iterate
+ through all of a components subcomponents
+\layout Code
+
+
+\protected_separator
+ for(c = icalcomponent_get_first_component(comp,ICAL_ANY_COMPONENT);
+\layout Code
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+c != 0;
+\layout Code
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+c = icalcomponent_get_next_component(comp,ICAL_ANY_COMPONENT))
+\layout Code
+
+{
+\layout Code
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+ do_something(c);
+\layout Code
+
+}
+\layout Standard
+
+This code bit wil iterate through all of the subcomponents in 'comp' but
+ you can select a specific type of component by changing ICAL_ANY_COMPONENT
+ to another component type.
+\layout Subsubsection
+
+Removing Components
+\layout Standard
+
+Libical component have internal iterators, so you can only have one iteration
+ over a component at a time.
+ Removing an element from a list while iterating through the list can cause
+ problems, since you will probably be removing the element that the internal
+ iterator points to.
+ This will result in the iteration loop terminating immediately after removing
+ the element.
+ To avoid the problem, you will need to step the iterator ahead of the element
+ you are going to remove, like this:
+\layout Code
+
+for(c = icalcomponent_get_first_component(parent_comp,ICAL_ANY_COMPONENT);
+
+\layout Code
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+c != 0;
+\layout Code
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+c = next
+\layout Code
+
+{
+\protected_separator
+
+\protected_separator
+
+\layout Code
+
+
+\protected_separator
+next = icalcomponent_get_next_component(parent_comp,ICAL_ANY_COMPONENT);
+\layout Code
+
+
+\protected_separator
+
+\protected_separator
+ icalcomponent_remove_component(parent_comp,c);
+\layout Code
+
+}
+\layout Subsubsection
+
+Working with properties and parameters
+\layout Standard
+
+Finding, iterating and removing properties works the same as it does for
+ components, using the property-specific or parameter-specific interfaces:
+
+\layout Verbatim
+
+icalproperty* icalcomponent_get_first_property(
+\layout Verbatim
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+icalcomponent* component,
+\layout Verbatim
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+icalproperty_kind kind);
+\layout Verbatim
+
+icalproperty* icalcomponent_get_next_property(
+\layout Verbatim
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+icalcomponent* component,
+\layout Verbatim
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+icalproperty_kind kind);
+\layout Verbatim
+
+void icalcomponent_add_property(
+\layout Verbatim
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+icalcomponent* component,
+\layout Verbatim
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+icalproperty* property);
+\layout Verbatim
+
+void icalcomponent_remove_property(
+\layout Verbatim
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+icalcomponent* component,
+\layout Verbatim
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+icalproperty* property);
+\layout Verbatim
+
+icalparameter* icalproperty_get_first_parameter(
+\layout Verbatim
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+icalproperty* prop,
+\layout Verbatim
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+icalparameter_kind kind);
+\layout Verbatim
+
+icalparameter* icalproperty_get_next_parameter(
+\layout Verbatim
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+icalproperty* prop,
+\layout Verbatim
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+icalparameter_kind kind);
+\layout Verbatim
+
+void icalproperty_add_parameter(
+\layout Verbatim
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+icalproperty* prop,
+\layout Verbatim
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+icalparameter* parameter);
+\layout Verbatim
+
+void icalproperty_remove_parameter(
+\layout Verbatim
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+icalproperty* prop,
+\layout Verbatim
+
+
+\protected_separator
+
+\protected_separator
+
+\protected_separator
+icalparameter_kind kind);
+\layout Subsubsection
+
+Getting Values
+\layout Subsubsection
+
+Setting Values
+\layout Subsubsection
+
+Getting Parameters
+\layout Subsubsection
+
+Setting Parameters
+\layout Subsubsection
+
+Removing Parameters
+\layout Subsubsection
+
+Checking Component Validity
+\layout Subsection
+
+Storing Objects
+\layout Standard
+
+The libical distribution inclues a seperate library, libicalss, that allows
+ you to store iCal component data to disk in a variety of ways.
+ This library is documented seperately.
+
+\layout Subsection
+
+
+\begin_inset LatexCommand \label{sec:memory}
+
+\end_inset
+
+Memory Management
+\layout Standard
+
+Libical relies heavily on dynamic allocation for both the core objects and
+ for the strings used to hold values.
+ Some of this memory the library caller owns and must free, and some of
+ the memory is managed by the library.
+ Here is a summary of the memory rules.
+
+\layout Description
+
+1) If the function name has "new" in it, the caller gets control of the
+ memory.
+ ( such as icalcomponent_new(), or icalproperty_new_clone() )
+\layout Description
+
+2) If you got the memory from a routine with new in it, you must call the
+ corresponding *_free routine to free the memory.
+ ( Use icalcomponent_free() to free objects created with icalcomponent_new())
+
+\layout Description
+
+3) If the function name has "add" in it, the caller is transfering control
+ of the memory to the routine.
+ ( icalproperty_add_parameter() )
+\layout Description
+
+4) If the function name has "remove" in it, the caller passes in a pointer
+ to an object and after the call returns, the caller owns the object.
+ So, before you call icalcomponent_remove_property(comp,foo), you do not
+ own "foo" and after the call returns, you do.
+
+\layout Description
+
+5) If the routine returns a string, libical owns the memory and will put
+ it on a ring buffer to reclaim later.
+ You'd better strdup() it if you want to keep it, and you don't have to
+ delete it.
+
+\layout Subsection
+
+Error Handling
+\layout Standard
+
+icalerror_errno.
+ Return values.
+ #defines.
+ icalerror_stop_here.
+ X-LIC-ERROR
+\layout Subsubsection
+
+Return values
+\layout Subsubsection
+
+icalerrno
+\layout Subsubsection
+
+Component errors
+\layout Subsubsection
+
+icalerror_stop_here
+\layout Subsubsection
+
+X-LIC-ERROR
+\layout Subsection
+
+Naming Standard
+\layout Standard
+
+Structures that you access with the
+\begin_inset Quotes eld
+\end_inset
+
+struct
+\begin_inset Quotes erd
+\end_inset
+
+ keyword, such as
+\begin_inset Quotes eld
+\end_inset
+
+struct icaltimetype
+\begin_inset Quotes erd
+\end_inset
+
+ are things that you are allowed to see inside and poke at.
+
+\layout Standard
+
+Structures that you access though a typedef, such as
+\begin_inset Quotes eld
+\end_inset
+
+icalcomponent
+\begin_inset Quotes erd
+\end_inset
+
+ are things where all of the data is hidden.
+
+\layout Standard
+
+Component names that start with
+\begin_inset Quotes eld
+\end_inset
+
+V
+\begin_inset Quotes erd
+\end_inset
+
+ are part of RFC 2445 or another iCal standard.
+ Component names that start with
+\begin_inset Quotes eld
+\end_inset
+
+X
+\begin_inset Quotes erd
+\end_inset
+
+ are also part of the spec, but they are not actually components in the
+ spec.
+ However, they look and act like components, so they are components in libical.
+ Names that start with
+\begin_inset Quotes eld
+\end_inset
+
+XLIC
+\begin_inset Quotes erd
+\end_inset
+
+ or
+\begin_inset Quotes eld
+\end_inset
+
+X-LIC
+\begin_inset Quotes erd
+\end_inset
+
+ are not part of any iCal spec.
+ They are used internally by libical.
+
+\layout Standard
+
+Enums that identify a component, property, value or parameter end with
+\begin_inset Quotes eld
+\end_inset
+
+_COMPONENT,
+\begin_inset Quotes erd
+\end_inset
+
+
+\begin_inset Quotes eld
+\end_inset
+
+_PROPERTY,
+\begin_inset Quotes erd
+\end_inset
+
+
+\begin_inset Quotes eld
+\end_inset
+
+_VALUE,
+\begin_inset Quotes erd
+\end_inset
+
+ or
+\begin_inset Quotes eld
+\end_inset
+
+_PARAMETER
+\begin_inset Quotes erd
+\end_inset
+
+s
+\layout Standard
+
+Enums that identify a parameter value have the name of the parameter as
+ the second word.
+ For instance: ICAL_ROLE_REQPARTICIPANT or ICAL_PARTSTAT_ACCEPTED.
+\layout Standard
+
+The enums for the parts of a recurarance rule and request statuses are irregular.
+
+\layout Section
+
+Useful Recipies
+\layout Standard
+
+Iteration
+\layout Standard
+
+Copying components.
+ Remember that you must clone or remove an object before putting in on another
+ list.
+
+\layout Standard
+
+Finding compliance errors
+\layout Section
+
+Performance
+\layout Standard
+
+Checking restrictions is computationally expensive
+\layout Section
+
+Hacks and Bugs
+\the_end
diff --git a/libical/doc/UsingLibical.ps b/libical/doc/UsingLibical.ps
new file mode 100644
index 0000000000..0417ded6a5
--- /dev/null
+++ b/libical/doc/UsingLibical.ps
@@ -0,0 +1,1308 @@
+%!PS-Adobe-2.0
+%%Creator: dvips(k) 5.85 Copyright 1999 Radical Eye Software
+%%Title: UsingLibical.dvi
+%%Pages: 6
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 612 792
+%%EndComments
+%DVIPSWebPage: (www.radicaleye.com)
+%DVIPSCommandLine: dvips -t letter -o
+%+ /usr/local/home/eric/proj/FreeAssociation/libical/doc/UsingLibical.ps
+%+ UsingLibical.dvi
+%DVIPSParameters: dpi=600, compressed
+%DVIPSSource: TeX output 2000.02.18:1517
+%%BeginProcSet: texc.pro
+%!
+/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
+N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72
+mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0
+0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{
+landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize
+mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[
+matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round
+exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{
+statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0]
+N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin
+/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array
+/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2
+array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N
+df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A
+definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get
+}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub}
+B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr
+1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3
+1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx
+0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx
+sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{
+rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp
+gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B
+/chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{
+/cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{
+A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy
+get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse}
+ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp
+fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17
+{2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add
+chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{
+1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop}
+forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn
+/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put
+}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{
+bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A
+mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{
+SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{
+userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X
+1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4
+index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N
+/p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{
+/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT)
+(LaserWriter 16/600)]{A length product length le{A length product exch 0
+exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse
+end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask
+grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot}
+imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round
+exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto
+fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p
+delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M}
+B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{
+p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S
+rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end
+
+%%EndProcSet
+TeXDict begin 40258431 52099146 1000 600 600 (UsingLibical.dvi)
+@start
+%DVIPSBitmapFont: Fa ecbx1000 10 47
+/Fa 47 122 df<913A03FF8007FE027F9039F07FFF800103B500FDB512E0010F903A00FF
+FE0FF0D93FF8ECF81F90267FE0019038F03FF849485A4816E014804816C00200ED1FF081
+F007C06F91C7FCA8B912E0A4000390C701C0C7FCB3ABB5D8FC3FEBFF80A43D3A7EB938>
+27 D<12E07E127C7E7E7F6C7E6C7E12037F6C7E7F12007F137E137FA2EB3F80A214C013
+1F14E0A2130F14F0A4EB07F8A514FCB114F8A5EB0FF0A414E0131FA214C0133F1480A2EB
+7F00A2137E13FE5B12015B485A5B1207485A485A90C7FC123E5A12F05A16537BBD25>41
+D<EA0F80EA3FE0EA7FF0A2EAFFF8A5EA7FF0A2EA3FE0EA0F800D0D798C1B>46
+D<49B4FC011F13F0017F13FC9038FF83FE4848C67E4848EB7F804848EB3FC04848EB1FE0
+A2001F15F0A24848EB0FF8A3007F15FCA400FF15FEB3007F15FCA5003F15F86D131FA200
+1F15F0A26C6CEB3FE0000715C06C6CEB7F806C6CEBFF003900FF83FE6DB45A011F13F001
+0190C7FC27377CB530>48 D<141E143E14FE1307137FB5FCA3138FEA000FB3B3A5007FB6
+1280A4213679B530>I<EB0FFE90387FFFC048B512F0000714FC390FE03FFF261F800F13
+80263F000313C0D87F8014E0EBE00100FF6D13F07FA2ED7FF8A46C5A6C5A0006C7FCC8FC
+EDFFF0A216E05C16C04A138016004A5A4A5AEC1FF05D4A5A4AC7FC14FE495AD903F01378
+495A495A495A49C712F8017C14F05B49130148B6FC5A5A5A5A5A4815E0B7FCA425367BB5
+30>I<EB03FF011F13F0017F13FC3901FC07FF2603F003138048486C13C0496C13E0EA0F
+F86D14F0487EA66C4814E06C5A6C485AC714C04A138016004A5A4A5AEC3FF090380FFFC0
+5D15F090380007FE913801FF806E13C016E0ED7FF016F8ED3FFCA216FEEA1FC0487E487E
+487EA416FCA249137F007F15F801C0EBFFF06C5A6C6C4813E0260FFC0713806CB6120000
+0114FC6C6C13F0010790C7FC27377CB530>I<ED07C0150FA2151F153F157F15FF5CA25C
+5C5C5C143E143C5C5C1301495A5C495A495A5B133E5B13785B485A1203485A5B48C7FC12
+1E5A127C5AB81280A4C70001EBC000AA0103B61280A429367DB530>I<001C15C0D81F80
+130701F8137F90B61280A216005D5D15F05D15804AC7FC14F090C9FCA7EB03FE90381FFF
+E0017F13F89038FE07FC9038F003FFD9C0011380496C13C090C7FC000E15E0C8127F16F0
+A216F8A3121FEA3FC0487E12FF7FA316F05B15FFD87F8014E0007EC713C0003E5B003F49
+13806C6C481300390FF01FFE6CB512F8000114E06C6C1380D90FF8C7FC25377BB530>I<
+EC0FF8ECFFFE0103EBFF8090390FF80FC090393FE003E090397F8001F09038FF000F48EC
+1FF84848133F485A120F5B121FA2003FEC1FF0ED0FE0484890C7FCA31408EC7FF039FFF1
+FFFC01F313FFD9F78013809039FF007FC049EB3FE04914F0ED1FF85B16FCA34914FEA412
+7FA5123F16FCA26C7E16F8000F143F6D14F0000715E06C6CEB7FC03A01FF81FF806C90B5
+1200013F13FC010F13F00101138027377CB530>I<123C123EEA3FE090B71280A4170048
+5D5E5E5E5EA2007CC7EA0FC000784A5A4BC7FC00F8147E485C5D14014A5AC7485A4A5AA2
+4A5A143F4AC8FCA214FEA213015C1303A21307A2130F5CA2131FA5133FA96D5A6D5A6D5A
+29397BB730>I<49B47E010F13F0013F13FC9038FE01FF3A01F8007F804848EB3FC04848
+EB1FE0150F484814F01507121FA27F7F7F6D130F01FF14E014C09138E01FC06CEBF83F91
+38FE7F806C9038FFFE005D6C14F06C14FC6C14FF6D14806D14C090B612E0D803FD14F026
+07F07F13F848487E261FC00F13FC383F8003007F010013FE90C7127F151F00FE14071503
+1501A21500A216FC7E6C14016D14F86C6C13036DEB07F06C6CEB0FE0D80FFEEB7FC00003
+B61200C614FC013F13F00103138027377CB530>I<EB03FF011F13E0017F13F83901FF01
+FE48486C7E4848EB7F80484814C0001FEC3FE0485AED1FF0127F16F8A212FF16FCA416FE
+A5007F143FA3123F157F6C7E000F14FF6C6C5A3903FE03DF6CB5129F6C6C131FD91FFC13
+FCEB00201400A3D80FE0EB3FF8487E486C14F0A216E0157F16C0EDFF80495A6C48481300
+90388007FE390FE01FF86CB55A6C14C0C691C7FCEB1FF027377CB530>I<DB3FFCEB01C0
+0203B5EAC003021FECF00791B6EAFC0F01039039FC00FF3F4901C0EB1FFFD91FFEC77E49
+481403D97FF080494880485B48177F4849153F4890C9FC181F485A180F123F5B1807127F
+A24993C7FC12FFAD127F7FF003C0123FA27F001F1707A26C6C1780180F6C6D16006C6D5D
+6C173E6C6D157ED97FF85D6D6C4A5A6DB44A5A010701C0EB0FE06D01FCEBFF80010090B5
+48C7FC021F14F8020314E09126003FFEC8FC3A3B7BB945>67 D<B87E17F817FF18C02800
+7FF8000713F09338007FF8EF1FFE717E050313807113C0A27113E0F07FF0A2F03FF8A219
+FC181FA219FEA419FFAC19FEA419FC183FA219F8187F19F0F0FFE0A24D13C04D13804D13
+00EF1FFEEF7FFC933807FFF0B912C095C7FC17FC178040397DB849>I<B912C0A43A007F
+F800039338007FE0171F170F1707A21703A21701A318F0EE7800A41800A216F8A2150115
+0791B5FCA4ECF80715011500A21678A693C8FCADB7FCA434397DB83C>70
+D<DB3FFCEB01C00203B5EAC003021FECF00791B6EAFC0F01039039FC00FF3F4901C0EB1F
+FFD91FFEC77E49481403D97FF080494880485B48177F4849153F4890C9FC181F485A180F
+123F5B1807127FA24993C8FC12FFAB043FB61280A2127F7FDC0003EBC000123FA27F121F
+A26C7EA26C7F6C7F6C7F7ED97FF85C6D7E6DB45C010701C05B6D01FCEBFF3F010090B5EA
+FE0F021FECF8030203ECE0009126003FFEC9FC413B7BB94B>I<B612FCA439007FF800B3
+B3ADB612FCA41E397DB824>73 D<B7FCA426007FF8C9FCB3ACEF0780A5170F1800A35FA2
+5FA25F5F5E5EEE0FFE167FB8FCA431397DB839>76 D<B8FC17F017FEEFFF8028007FF800
+0F13C0040113E07013F0EF7FF8EF3FFCA2EF1FFEA218FFA818FEA2EF3FFCA2EF7FF8EFFF
+F04C13E0040F13C091B7120017FC17E002F8C9FCB3A4B612FCA438397DB841>80
+D<B712FCEEFFE017FC17FF28007FF8000F13C004017F707F717E717EA2717EA284A760A2
+4D5A604D5A4D5A04035B041F90C8FC91B612FC17E0839139F8003FFCEE0FFF707F707F82
+84A2707FA584A51A601AF084177F1901DD3FFE13E0B600FC011F130394390FFF87C071EB
+FF8005011400CBEA1FFC443A7DB848>82 D<D907FF130E013FEBE01E90B5EAF83E0003EC
+FE7E3A07FC01FFFE390FF0001F4848130F48481303491301007F140090C8FC167E5A163E
+A27F161E7F7F6D91C7FC13FC387FFFE014FEECFFF06C14FE6F7E6C816C15F06C816C81C6
+81133F010F801301D9000F1480EC007F030F13C01503818100F0157FA3163FA27E17807E
+167F6C16007E6D14FE01E0495A01F813039039FF801FF800FC90B512E0D8F83F5CD8F007
+49C7FC39E0007FF02A3B7BB935>I<003FB91280A4D9F800EBF003D87FC09238007FC049
+161F007EC7150FA2007C1707A200781703A400F818E0481701A4C892C7FCB3AE010FB7FC
+A43B387DB742>I<B600FC011FB512C0A426007FF8C8381FC000725AB3B3181F013F94C7
+FC8060011F163E6D6C157E187C6D6C15FC6D6D495A6D6DEB07F06D01F0EB1FE0DA7FFEEB
+FFC0021FB6C8FC02075C020014F0030F1380423A7DB849>I<B600F00103B512E0A4C601
+F0C83807F0006E5E017F5F6E150FA2013F5F6E151F011F94C7FC6E5D6D163E6F147E6D16
+7CA26F14FC6D5E6F13016D5E6F13036D5E811707027F5D6F130F023F5D6F131F021F92C8
+FC815F6E143EEE807E6E147CEEC0FC6E5C16E016E16E5C16F36E5C16FF6F5BA36F5BA26F
+90C9FCA26F5AA36F5AA26F5AA26F5A433A7EB848>I<EB3FFE0003B512E0000F14F8391F
+F00FFE003FEB03FF6D6C7F6E7FA26F7EA26C5A6C5AEA0380C8FCA2EC3FFF010FB5FC137F
+3901FFF87F00071380380FFE00EA3FF85B485A12FF5BA415FF6D5A127F263FF00713F83B
+1FFC1FBFFFC0390FFFFE1F0003EBF80F39003FE0032A257DA42E>97
+D<13FFB5FCA412077EAF4AB47E020F13F0023F13FC9138FE03FFDAF00013804AEB7FC002
+80EB3FE091C713F0EE1FF8A217FC160FA217FEAA17FCA3EE1FF8A217F06E133F6EEB7FE0
+6E14C0903AFDF001FF80903AF8FC07FE009039F03FFFF8D9E00F13E0D9C00390C7FC2F3A
+7EB935>I<903801FFC0010F13FC017F13FFD9FF8013802603FE0013C048485AEA0FF812
+1F13F0123F6E13804848EB7F00151C92C7FC12FFA9127FA27F123FED01E06C7E15036C6C
+EB07C06C6C14806C6C131FC69038C07E006DB45A010F13F00101138023257DA42A>I<EE
+7F80ED7FFFA4150381AF903801FF81010F13F1013F13FD9038FFC07F0003EB001FD807FC
+1307000F8048487F5B123FA2485AA312FFAA127FA27F123FA26C6C5B000F5C6C6C5B6C6C
+4913C02701FF80FD13FE39007FFFF9011F13E1010113012F3A7DB935>I<903803FF8001
+1F13F0017F13FC3901FF83FE3A03FE007F804848133F484814C0001FEC1FE05B003FEC0F
+F0A2485A16F8150712FFA290B6FCA301E0C8FCA4127FA36C7E1678121F6C6C14F86D14F0
+00071403D801FFEB0FE06C9038C07FC06DB51200010F13FC010113E025257DA42C>I<EC
+1FF0903801FFFC010713FF90391FF87F8090383FE0FFD9FFC113C0A2481381A24813016E
+1380A2ED3E0092C7FCA8B6FCA4000390C8FCB3ABB512FEA4223A7DB91D>I<161FD907FE
+EBFFC090387FFFE348B6EAEFE02607FE07138F260FF801131F48486C138F003F15CF4990
+387FC7C0EEC000007F81A6003F5DA26D13FF001F5D6C6C4890C7FC3907FE07FE48B512F8
+6D13E0261E07FEC8FC90CAFCA2123E123F7F6C7E90B512F8EDFF8016E06C15F86C816C81
+5A001F81393FC0000F48C8138048157F5A163FA36C157F6C16006D5C6C6C495AD81FF0EB
+07FCD807FEEB3FF00001B612C06C6C91C7FC010713F02B377DA530>I<13FFB5FCA41207
+7EAFED7FC0913803FFF8020F13FE91381F03FFDA3C01138014784A7E4A14C05CA25CA291
+C7FCB3A3B5D8FC3F13FFA4303A7DB935>I<EA01F0EA07FC487EA2487EA56C5AA26C5AEA
+01F0C8FCA913FF127FA412077EB3A9B512F8A4153B7DBA1B>I<13FFB5FCA412077EAF92
+380FFFE0A4923803FC0016F0ED0FE0ED1F804BC7FC157E5DEC03F8EC07E04A5A141FEC7F
+E04A7E8181A2ECCFFEEC0FFF496C7F806E7F6E7F82157F6F7E6F7E82150F82B5D8F83F13
+F8A42D3A7EB932>107 D<13FFB5FCA412077EB3B3ACB512FCA4163A7DB91B>I<01FED97F
+E0EB0FFC00FF902601FFFC90383FFF80020701FF90B512E0DA1F81903983F03FF0DA3C00
+903887801F000749DACF007F00034914DE6D48D97FFC6D7E4A5CA24A5CA291C75BB3A3B5
+D8FC1FB50083B512F0A44C257DA451>I<01FEEB7FC000FF903803FFF8020F13FE91381F
+03FFDA3C011380000713780003497E6D4814C05CA25CA291C7FCB3A3B5D8FC3F13FFA430
+257DA435>I<903801FFC0010F13F8017F13FFD9FF807F3A03FE003FE048486D7E48486D
+7E48486D7EA2003F81491303007F81A300FF1680A9007F1600A3003F5D6D1307001F5DA2
+6C6C495A6C6C495A6C6C495A6C6C6CB45A6C6CB5C7FC011F13FC010113C029257DA430>
+I<9039FF01FF80B5000F13F0023F13FC9138FE07FFDAF00113800003496C13C00280EB7F
+E091C713F0EE3FF8A2EE1FFCA3EE0FFEAA17FC161FA217F8163F17F06E137F6E14E06EEB
+FFC0DAF00313809139FC07FE0091383FFFF8020F13E0020390C7FC91C9FCACB512FCA42F
+357EA435>I<9038FE03F000FFEB0FFEEC3FFF91387C7F809138F8FFC000075B6C6C5A5C
+A29138807F80ED3F00150C92C7FC91C8FCB3A2B512FEA422257EA427>114
+D<90383FF0383903FFFEF8000F13FF381FC00F383F0003007E1301007C130012FC15787E
+7E6D130013FCEBFFE06C13FCECFF806C14C06C14F06C14F81203C614FC131F9038007FFE
+140700F0130114007E157E7E157C6C14FC6C14F8EB80019038F007F090B512C000F81400
+38E01FF81F257DA426>I<130FA55BA45BA25B5BA25A1207001FEBFFE0B6FCA3000390C7
+FCB21578A815F86CEB80F014816CEBC3E090383FFFC06D1380903803FE001D357EB425>
+I<01FFEC3FC0B5EB3FFFA4000714016C80B3A35DA25DA26C5C6E4813E06CD9C03E13FF90
+387FFFFC011F13F00103138030257DA435>I<B539F001FFF8A4000390C7EA1F00161E6E
+133E6C153C6E137C6C15786E13F8017F5CECF001013F5C14F8011F495AA2ECFC07010F5C
+ECFE0F010791C7FC6E5A6D131E15BE6D13BC15FC6D5BA36E5AA26E5AA26E5AA26E5AA22D
+257EA432>I<B539F01FFFF0A4000390398003F8006C01C013E06C1407D97FE05B6D6C48
+5A6E48C7FC90381FFC3E010F5B903807FEFC6D6C5A5D6D5B6D5B6E7E6E7E814A7EA24A7E
+903801F3FFD903E37FD907C17FEB0FC049486C7E4A6C7E013E80496D7E49130F00016E7E
+B590383FFFF8A42D257EA432>120 D<B539F001FFF8A4000390C7EA1F00161E6E133E6C
+153C6E137C6C15786E13F8017F5CECF001013F5C14F8011F495AA2ECFC07010F5CECFE0F
+010791C7FC6E5A6D131E15BE6D13BC15FC6D5BA36E5AA26E5AA26E5AA26E5AA292C8FCA2
+5C141E003F133E387F803C38FFC07C147814F8EBC1F0EBC3E06C485A387D1F80D83FFFC9
+FCEA1FFCEA07F02D357EA432>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fb ecbx1200 12 47
+/Fb 47 122 df<157F913803FFC0020F7F4A7F91383FE1F891387F80789138FF007C4914
+3C495A163E4948131EA3130FA3163E163C167C16786E13F84B5A4B5A15075E6D6C485A4B
+C70003B512E0153E15FC6D5B5D4B91390007C0004B5E6D6D150F4FC7FC6D6D151E49173E
+496D5D491778496D15F890261FBFFE4A5AD93F3F5E9026FE1FFF1403D801FC6E495A0003
+6D5E48486C6D130F000F6F49C8FC001F6D6D133E48486C6D133C187C007F6D6D5B6F6C48
+5A00FF6E6C485A6FEB87C06F13CFEFFF806F91C9FC6D6D5B6F49EC01E06F7F6C6CEC3FFF
+706D13036C6C4A6DEB07C06C6C91B500F0130FDA800702FCEB1F806C9026E03FF89039FF
+80FF00000390B5D8F03FEBFFFE6CDBC00F5C6C6CDA00035C011F01F8D9007F13E0010301
+80020790C7FC4B477BC557>38 D<B612F8A91D097F9A25>45 D<EA07C0EA1FF0EA3FF8EA
+7FFCEAFFFEA7EA7FFCEA3FF8EA1FF0EA07C00F0F788E1F>I<EC03C01407141F147FEB03
+FF133FB6FCA413C3EA0003B3B3ADB712FCA5264177C038>49 D<ECFFE0010F13FE013F6D
+7E90B612E0000315F82607FC0313FE3A0FE0007FFFD81F806D138048C7000F13C0488001
+C015E001F07F00FF6E13F07F17F881A46C5A6C5A6C5AC9FC17F05DA217E05D17C04B1380
+4B1300A2ED1FFC4B5A5E4B5A4B5A4A90C7FC4A5A4A5AEC0FF04A5AEC3F804AC7127814FE
+495A494814F8D907E014F0495A495A49C8FC017C140149140348B7FC4816E05A5A5A5A5A
+B8FC17C0A42D417BC038>I<ECFFF0010713FF011F14C0017F14F049C66C7ED803F8EB3F
+FED807E06D7E81D80FF86D138013FE001F16C07FA66C5A6C4815806C485BC814005D5E4B
+5A4B5A4B5A4A5B020F1380902607FFFEC7FC15F815FF16C090C713F0ED3FFCED0FFEEEFF
+80816F13C017E0A26F13F0A217F8A3EA0FC0EA3FF0487EA2487EA217F0A25D17E06C5A49
+4913C05BD83F80491380D81FF0491300D80FFEEBFFFE6CB612F800015D6C6C14C0011F49
+C7FC010113E02D427BC038>I<163FA25E5E5D5DA25D5D5D5DA25D92B5FCEC01F7EC03E7
+140715C7EC0F87EC1F07143E147E147C14F8EB01F0EB03E0130714C0EB0F80EB1F00133E
+5BA25B485A485A485A120F5B48C7FC123E5A12FCB91280A5C8000F90C7FCAC027FB61280
+A531417DC038>I<0007150301E0143F01FFEB07FF91B6FC5E5E5E5E5E16804BC7FC5D15
+E092C8FC01C0C9FCAAEC3FF001C1B5FC01C714C001DF14F09039FFE03FFC9138000FFE01
+FC6D7E01F06D13804915C0497F6C4815E0C8FC6F13F0A317F8A4EA0F80EA3FE0487E12FF
+7FA317F05B5D6C4815E05B007EC74813C0123E003F4A1380D81FC0491300D80FF0495AD8
+07FEEBFFFC6CB612F0C65D013F1480010F01FCC7FC010113C02D427BC038>I<4AB47E02
+1F13F0027F13FC49B6FC01079038807F8090390FFC001FD93FF014C04948137F4948EBFF
+E048495A5A1400485A120FA248486D13C0EE7F80EE1E00003F92C7FCA25B127FA2EC07FC
+91381FFF8000FF017F13E091B512F89039F9F01FFC9039FBC007FE9039FF8003FF17804A
+6C13C05B6F13E0A24915F0A317F85BA4127FA5123FA217F07F121FA2000F4A13E0A26C6C
+15C06D4913806C018014006C6D485A6C9038E01FFC6DB55A011F5C010714C0010191C7FC
+9038003FF02D427BC038>I<121E121F13FC90B712FEA45A17FC17F817F017E017C0A248
+1680007EC8EA3F00007C157E5E00785D15014B5A00F84A5A484A5A5E151FC848C7FC157E
+5DA24A5A14035D14074A5AA2141F5D143FA2147F5D14FFA25BA35B92C8FCA35BA55BAA6D
+5A6D5A6D5A2F447AC238>I<EC7FF00103B5FC010F14C0013F14F090397F801FFC3A01FC
+0003FE48486D7E497F4848EC7F80163F484815C0A2001F151FA27FA27F7F01FE143F6D15
+8002C0137F02F014006C01FC5B6E485A6C9038FF83FCEDE7F86CECFFE06C5D6C92C7FC6D
+14C06D80010F14F882013F8090B7FC48013F14802607FC0F14C0260FF80314E04848C6FC
+496D13F0003F141F48481307496D13F8150000FF157F90C8123F161F160FA21607A36D15
+F0127F160F6D15E06C6C141F6DEC3FC06C6CEC7F80D80FFE903801FF003A07FFC00FFE6C
+90B55AC615F0013F14C0010F91C7FC010013F02D427BC038>I<EC7FF0903807FFFE011F
+6D7E017F14E09039FFE03FF0489038800FF848496C7E48488048486D7E001F80003F1680
+A2484815C08117E0A212FF17F0A617F8A45D127FA3003F5CA26C7E5D6C6C5B12076C6C13
+1E6CEBC07C6CEBFFF8013F5B010F01C013F00101130090C8FCA217E05DA2EA03C0D80FF0
+15C0487E486C491380A217004B5A150F5E49495A6C48495A01C0EBFFE0260FF0035B6CB6
+5A6C4AC7FC6C14F86C6C13E0D907FEC8FC2D427BC038>I<EE1F80A24C7EA24C7EA34C7E
+A24B7FA34B7FA24B7FA34B7F169F031F80161F82033F80ED3E07037E80157C8203FC804B
+7E02018115F0820203814B137F0207815D173F020F814B7F021F8292C77EA24A82023E80
+027E82027FB7FCA291B87EA2498302F0C8FCA20103834A157F0107834A153FA249488284
+011F8491C97E4984133E017E82B6020FB612F0A54C457CC455>65
+D<DCFFF01470031F01FF14F04AB6EAE0010207EDF803023FEDFE0791B539E001FF0F4949
+C7EA3F9F010701F0EC0FFF4901C0804990C87E4948814948814948167F4849163F484916
+1F5A4A160F485B19074890CAFC19035A5BA2007F1801A34994C7FC12FFAE127F7F1AF0A2
+123FA27F6C18011AE06C7F19036C6D17C06E16077E6C6DEE0F806C6DEE1F006D6C5E6D6C
+167E6D6C6C5D6D6D4A5A6D01F0EC07F0010101FEEC1FE06D903AFFF001FF80023F90B6C7
+FC020715FC020115F0DA001F1480030001F8C8FC44467AC451>67
+D<B9FC18F018FE727E19E026003FFEC7001F13F805017F9438003FFF060F7F727F727F72
+7F84737E737EA2737EA2737EA21B80A2851BC0A51BE0AD1BC0A51B8061A21B006162193F
+624F5A19FF624E5B06075B4E5B063F90C7FC4DB45A050F13F8BA5A19C04EC8FC18F095C9
+FC4B447CC356>I<BA12F8A485D8001F90C71201EF003F180F180318011800A2197E193E
+A3191EA21778A285A405F890C7FCA316011603161F92B5FCA5ED001F160316011600A2F1
+01E01778A2F103C0A494C7FC1907A21A80A2190FA2191FA2193FF17F0061601807181F4D
+B5FCBBFC61A443447DC34A>I<DCFFF01470031F01FF14F04AB6EAE0010207EDF803023F
+EDFE0791B539E001FF0F4949C7EA3F9F010701F0EC0FFF4901C0804990C87E4948814948
+814948167F4849163F4849161F5A4A160F485B19074890CAFC19035A5BA2007F1801A349
+94C8FC12FFAD057FB612F0127F7FA3003FDC0001EBF000A27F7EA26C7FA26C7F807E6C7F
+6C7F6D7E6D6C5D6D6C7E6D6D5C6D01F05C010101FE143F6D903AFFF001FF9F023F90B612
+0F0207EDFC030201EDF000DA001F02C01330030001FCC9FC4C467AC458>71
+D<B7D88003B612FEA526003FFEC9EBF800B3A791B9FCA54AC9FCB3AAB7D88003B612FEA5
+4F447CC358>I<B712F0A526003FFECAFCB3B1F00780A4180F1900A460A360A2187EA218
+FE170117031707171F177FEE03FFB95AA539447CC343>76 D<B500FE067FB512806E95B6
+FCA26F5EA2D8003F50C7FC013D6DEE03DFA2013C6DEE079FA26E6CEE0F1FA26E6C161EA2
+6E6C163CA36E6C1678A26E6C16F0A26E6DEC01E0A26E6DEC03C0A36E6DEC0780A26F6CEC
+0F00A26F6C141EA26F6C5CA36F6C5CA26F6C5CA26F6D485AA26F6D485AA26F6D485AA370
+6C48C7FCA293383FF81EA2706C5AA2706C5AA3706C5AA2705BA2705BA2705BA2B6057FB6
+128071C7FCA2173E171C61447CC36A>I<B64BB512FE8181A281D8003F6D91C7EA780081
+013D7F81133C6E7E6E7F6E7F6E7F6E7F82806E7F6E7F6F7E6F7F83816F7F6F7F6F7F6F7F
+6F7F8382707F707F707F707F8482707F707F717E7113807113C019E0837113F07113F871
+13FC7113FE19FF847213F884848484A28484197F193F191FA2190F1907B6160319011900
+1A78A24F447CC358>I<923807FFC092B512FE0207ECFFC0021F15F091267FFE0013FC90
+2601FFF0EB1FFF01070180010313C04990C76C7FD91FFC6E6C7E49486F7E49486F7E01FF
+8348496F7E48496F1380A248496F13C0A24890C96C13E0A24819F04982003F19F8A3007F
+19FC49177FA400FF19FEAD007F19FC6D17FFA3003F19F8A26D5E6C19F0A26E5D6C19E0A2
+6C6D4B13C06C19806E5D6C6D4B13006C6D4B5A6D6C4B5A6D6C4B5A6D6C4A5B6D01C00107
+5B6D01F0011F5B010101FE90B5C7FC6D90B65A023F15F8020715C002004AC8FC030713C0
+47467AC454>I<B9FC18F018FE727E19E0D8001F90C7000F7F05017F716C7E727E727E72
+1380A21AC084A21AE0A91AC0A24E1380A21A00604E5A4E5A4D485A050F5B92B712C096C7
+FC18FC18C092CBFCB3A7B712E0A543447DC34D>I<B812F8EFFFC018F818FE727ED8001F
+90C7003F13E005037F05007F727E727E727EA28684A286A762A24E90C7FCA24E5A61187F
+943801FFF005075B053F138092B7C8FC18F818E018F892C77FEF3FFF050F7F717F717FA2
+717FA2717FA785A61B0F85A2187F73131F72141EB700E06DEB803E72EBE0FC72EBFFF806
+0114F0726C13E0CC0007138050457DC354>82 D<DAFFE0131C010701FE133C013F9038FF
+807C90B6EAE0FC4815F9489038801FFF3907FC00014848EB007F4848143F4848140F4914
+07007F15035B1601160012FF177CA27FA26D153C7F7F6D92C7FC6C7EEBFFE014FE6CEBFF
+F015FF6C15E016FC6C816C6F7E6C826C826C6C81011F810107811300020F80140003077F
+ED007F82040F1380828212F082A282A27EA218007EA26C5D6C5E6D14036D5D6D140701F8
+4A5A01FFEC3FF002F8EBFFE0486CB65AD8FC1F92C7FCD8F80714FC48C614F04801071380
+31467AC43E>I<003FBA12E0A59026FE000FEB8003D87FE09338003FF049171F90C71607
+A2007E1803007C1801A300781800A400F819F8481978A5C81700B3B3A20107B8FCA54543
+7CC24E>I<B792B6FCA526003FFECAEAFC00806D606F15016D608119036D606F15076D60
+6F150F6D6081191F6D6D93C7FC61027F163E6F157E023F167C8119FC6E6D5C18016E5E70
+13036E5E8218076E6D5C180F6E5E70131F6E93C8FC705B037F143E82187E033F147C7013
+FC6F5C17816F5C17C117C36F5C17E76F5C17FF6F5CA36F91C9FCA2705AA2705AA3705AA2
+705AA2705AA250457EC355>86 D<903801FFE0011F13FE017F6D7E48B612E03A03FE007F
+F84848EB1FFC6D6D7E486C6D7EA26F7FA36F7F6C5A6C5AEA00F090C7FCA40203B5FC91B6
+FC1307013F13F19038FFFC01000313E0481380381FFE00485A5B127F5B12FF5BA35DA26D
+5B6C6C5B4B13F0D83FFE013EEBFFC03A1FFF80FC7F0007EBFFF86CECE01FC66CEB8007D9
+0FFCC9FC322F7DAD36>97 D<EB7FC0B5FCA512037EB1ED0FF892B57E02C314E002CF14F8
+9139DFC03FFC9139FF000FFE02FCEB03FF4A6D13804A15C04A6D13E05CEF7FF0A218F817
+3FA318FCAC18F8A2177F18F0A3EFFFE06E15C06E5B6E491380027C491300496C495A903A
+FC1FC07FFC496CB512F0D9F00314C049C691C7FCC8EA1FF036467DC43E>I<EC3FFC49B5
+12C0010F14F0013F14FC90397FF003FE9039FFC001FF0003495A48494813805B120F485A
+A2485A6F1300007F6E5AED00784991C7FCA212FFAC6C7EA3123F6DEC03C0A26C6C140700
+0F16806D140F6C6DEB1F006C6D133E6C01F05B3A007FFC03F86DB55A010F14C0010391C7
+FC9038003FF82A2F7CAD32>I<EE03FEED07FFA5ED001F160FB1EC3FE0903803FFFC010F
+EBFF8F013F14CF9039FFF807FF48EBC00148903880007F4890C7123F4848141F49140F12
+1F485AA3127F5BA212FFAC127FA37F123FA26C6C141FA26C6C143F0007157F6C6C91B5FC
+6CD9C00314FC6C9038F01FEF6DB5128F011FEBFE0F010713F89026007FC0EBF80036467C
+C43E>I<EC3FF80103B57E010F14E0013F8090397FF83FF89039FFC007FC48496C7E4849
+6C7E48486D1380485A001FED7FC05B003FED3FE0A2127F5B17F0161F12FFA290B7FCA401
+F0C9FCA5127FA27FA2123F17F06C7E16016C6C15E06C6C14036C6DEB07C06C6DEB0F806C
+01F0EB3F0090397FFE01FE011FB55A010714F0010114C09026001FFEC7FC2C2F7DAD33>
+I<DAFFE0137E010F9039FE03FF80013FEBFF8F90B812C048D9C07F133F489038001FF848
+48EB0FFC4848903907FE1F80001F9238FF0F00496D90C7FCA2003F82A8001F93C7FCA26D
+5B000F5D6C6C495A6C6C495A6C9038C07FF04890B55A1680D8078F49C8FC018013E0000F
+90CAFCA47F7F7F90B612C016FC6CEDFF8017E06C826C16FC7E000382000F82D81FF0C77E
+D83FC014074848020113808248C9FC177FA46D15FF007F17006D5C6C6C4A5A6C6C4A5AD8
+0FFEEC3FF83B07FFC001FFF0000190B612C06C6C92C7FC010F14F8D9007F90C8FC32427D
+AC38>103 D<EB7FC0B5FCA512037EB1ED07FE92383FFF8092B512E002C114F89139C7F0
+3FFC9138CF801F9139DF000FFE14DE14FC4A6D7E5CA25CA35CB3A7B60083B512FEA53745
+7CC43E>I<137C48B4FC4813804813C0A24813E0A56C13C0A26C13806C1300EA007C90C7
+FCAAEB7FC0EA7FFFA512037EB3AFB6FCA518467CC520>I<EC03E0EC0FF8EC1FFCEC3FFE
+A2EC7FFFA5EC3FFEA2EC1FFCEC0FF8EC03E091C7FCAAEC01FF0103B5FCA5EB000F80B3B3
+A7EA1F80EA3FC0EA7FE0EAFFF0EC0FFEA215FC141F01E013F8007FEB3FF0393FC0FFE06C
+B512806C1400000313FCC613C0205A86C522>I<EB7FC0B5FCA512037EB3B3B3A3B61280
+A519457CC420>108 D<90277F8007FEEC0FFCB590263FFFC090387FFF8092B5D8F001B5
+12E002816E4880913D87F01FFC0FE03FF8913D8FC00FFE1F801FFC0003D99F009026FF3E
+007F6C019E6D013C130F02BC5D02F86D496D7EA24A5D4A5DA34A5DB3A7B60081B60003B5
+12FEA5572D7CAC5E>I<90397F8007FEB590383FFF8092B512E0028114F8913987F03FFC
+91388F801F000390399F000FFE6C139E14BC02F86D7E5CA25CA35CB3A7B60083B512FEA5
+372D7CAC3E>I<EC1FFC49B512C0010714F0011F14FC90397FF80FFF9026FFC0017F4849
+6C7F4848C7EA3FE000078248486E7E49140F001F82A2003F82491407007F82A400FF1780
+AA007F1700A46C6C4A5AA2001F5E6D141F000F5E6C6C4A5AA26C6C6CEBFFE06C6D485B27
+007FF80F90C7FC6DB55A010F14F8010114C09026001FFCC8FC312F7DAD38>I<90397FC0
+0FF8B590B57E02C314E002CF14F89139DFC03FFC9139FF001FFE000301FCEB07FF6C496D
+13804A15C04A6D13E05C7013F0A2EF7FF8A4EF3FFCACEF7FF8A318F017FFA24C13E06E15
+C06E5B6E4913806E4913006E495A9139DFC07FFC02CFB512F002C314C002C091C7FCED1F
+F092C9FCADB67EA536407DAC3E>I<90387F807FB53881FFE0028313F0028F13F8ED8FFC
+91389F1FFE000313BE6C13BC14F8A214F0ED0FFC9138E007F8ED01E092C7FCA35CB3A5B6
+12E0A5272D7DAC2E>114 D<90391FFC038090B51287000314FF120F381FF003383FC000
+49133F48C7121F127E00FE140FA215077EA27F01E090C7FC13FE387FFFF014FF6C14C015
+F06C14FC6C800003806C15806C7E010F14C0EB003F020313E0140000F0143FA26C141F15
+0FA27EA26C15C06C141FA26DEB3F8001E0EB7F009038F803FE90B55A00FC5CD8F03F13E0
+26E007FEC7FC232F7CAD2C>I<EB01E0A51303A41307A2130FA2131FA2133F137F13FF12
+03000F90B51280B7FCA4C601E0C7FCB3A3ED01E0A9150302F013C0137F150790393FF80F
+8090391FFC1F006DB5FC6D13FC01015B9038003FE023407EBE2C>I<D97FC049B4FCB501
+03B5FCA50003EC000F6C81B3A85EA25EA25E7E6E491380017FD901F713FE9138F807E76D
+B512C7010F1407010313FE9026007FF0EBFC00372E7CAC3E>I<B6903803FFFCA5000101
+E09038003E006C163C80017F5D8017F8013F5D6E1301011F5D6E1303010F5D6E13076D5D
+ED800F6D92C7FC15C05E6DEBE01E163E6D143CEDF07C027F1378EDF8F8023F5B15FD021F
+5B15FF6E5BA36E5BA26E90C8FCA26E5AA26E5AA21578362C7EAB3B>I<B6903803FFFCA5
+000101E09038003E006C163C80017F5D8017F8013F5D6E1301011F5D6E1303010F5D6E13
+076D5DED800F6D92C7FC15C05E6DEBE01E163E6D143CEDF07C027F1378EDF8F8023F5B15
+FD021F5B15FF6E5BA36E5BA26E90C8FCA26E5AA26E5AA21578A215F85D14015D001F1303
+D83F805B387FC007D8FFE05B140F92C9FC5C143E495A387FC1F8EB07F06CB45A6C5B0007
+90CAFCEA01FC36407EAB3B>121 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fc ectt1000 10 59
+/Fc 59 126 df<121FEA3F80EA7FC0EAFFE0B0EA7FC0AEEA1F00C7FCA7121FEA3F80EA7F
+C0EAFFE0A5EA7FC0EA3F80EA1F000B3470B32C>33 D<003C131E007F137F481480A66C14
+00A6007E7FA6003E133EA3003C131E001C131C191977B32C>I<143814FC13011303EB07
+F8EB0FF0EB1FC0EB3F80EB7F0013FE485A485A5B12075B120F5B485AA2123F90C7FCA25A
+127EA312FE5AAC7E127EA3127F7EA27F121FA26C7E7F12077F12037F6C7E6C7E137FEB3F
+80EB1FC0EB0FF0EB07F8EB03FC130113001438164272B92C>40 D<127012FC7E7E6C7E6C
+7EEA0FE06C7E6C7E6C7E6C7E137F7F1480131F14C0130FEB07E0A214F01303A214F81301
+A314FC1300AC130114F8A3130314F0A2130714E0A2EB0FC0131F1480133F14005B13FE48
+5A485A485A485AEA3FC0485A48C7FC5A5A1270164279B92C>I<EA0F80EA1FE0EA3FF0EA
+7FF8A213FCA3123F121F120F120013F8A21201EA03F01207EA1FE0EA7FC0EAFF80130012
+FC12700E17718A2C>44 D<007FB512F0B612F8A36C14F01D0579942C>I<121FEA3F80EA
+7FC0EAFFE0A5EA7FC0EA3F80EA1F000B0B708A2C>I<1507ED0F80A2151F16005D153E15
+7E157CA215FC5D14015D14035D14075D140F5D141F92C7FC5C143EA2147E147C14FC5C13
+015C13035C13075C130F5C131F91C8FC5B133EA2137E137C13FC5B12015B12035B12075B
+120F5B121F90C9FCA25A123E127E127C12FC5AA2127021417BB92C>I<EB03F8EB0FFE90
+383FFF80497F90B57E3901FE0FF03903F803F848486C7EEBE0004848137EA248487FA248
+C7EA1F80A2003E140F007E15C0A3007C140700FC15E0AC6C140F007E15C0A46CEC1F80A3
+6C6CEB3F00A26C6C137E6D13FE00075CEBF0016C6C485A3901FE0FF06CB55A6D5B6D5BD9
+0FFEC7FCEB03F823357CB32C>I<1307497EA2131FA2133F137F13FF5A1207127FB5FC13
+DF139FEA7C1F1200B3AE007FB512E0B612F0A36C14E01C3477B32C>I<121FEA3F80EA7F
+C0EAFFE0A5EA7FC0EA3F80EA1F00C7FCAE121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA
+1F000B2470A32C>58 D<EA0F80EA1FC0EA3FE0EA7FF0A5EA3FE0EA1FC0EA0F80C7FCAEEA
+0F80EA1FE0EA3FF0EA7FF8A213FCA3123F121F120F120013F8A21201EA03F01207EA1FE0
+EA7FC0EAFF80130012FC12700E3071A32C>I<007FB612F0B712F8A36C15F0CAFCA8007F
+B612F0B712F8A36C15F025127DA12C>61 D<EC7F80903803FFE0010F7F013F7F497F9038
+FFC0FE3901FE007FD803F87F4848EB1F809038E00FCF390FC03FFF48484813C091B5FCEA
+3F01393E03F87F903907F03FE0007EEBE01F397C0FC00FEC8007A2EAFC1F00F8EB0003A9
+00FCEB8007D87C0F14C0A2ECC00F3A7E07E01F80003EEBF03F903903F87F00393F01FFFE
+D81F805B6E5A6C6C6C5A3907E00FC09039F00007C06C6CEB0FE0D801FE131F3900FFC0FF
+6DB512C06D1480010FEBFE00010313F89038007FC023337CB22C>64
+D<14FE497EA4497FA214EFA2130781A214C7A2010F7FA314C390381F83F0A590383F01F8
+A490387E00FCA549137E90B512FEA34880A29038F8003FA34848EB1F80A4000715C04913
+0FD87FFEEBFFFC6D5AB514FE6C15FC497E27347EB32C>I<02FF13700107EBE0F84913F9
+013F13FD4913FFEBFF813901FE007F4848131FD807F0130F1507485A491303485A150148
+C7FCA25A007EEC00F01600A212FE5AAB7E127EA3007F15F06CEC01F8A26C7EA26C6C1303
+6D14F06C6C130716E0D803FC131F6C6CEB3FC03A00FF81FF806DB512006D5B010F5B6D13
+F00100138025357DB32C>67 D<007FB612F0B712F8A37E3903F00001A7ED00F01600A4EC
+01E04A7EA490B5FCA5EBF003A46E5A91C8FCA5163C167EA8007FB612FEB7FCA36C15FC27
+337EB22C>69 D<903901FC038090390FFF87C04913EF017F13FF90B6FC4813073803FC01
+497E4848137F4848133F49131F121F5B003F140F90C7FCA2127EED078092C7FCA212FE5A
+A8913803FFF84A13FCA27E007E6D13F89138000FC0A36C141FA27F121F6D133F120F6D13
+7F6C7E6C6C13FF6D5A3801FF076C90B5FC6D13EF011F13CF6DEB0780D901FCC7FC26357D
+B32C>71 D<D87FFEEBFFFCB54813FEA36C486C13FCD807E0EB0FC0B190B6FCA59038E000
+0FB3D87FFEEBFFFCB54813FEA36C486C13FC27337EB22C>I<007FB512F8B612FCA36C14
+F839000FC000B3B3A5007FB512F8B612FCA36C14F81E3379B22C>I<387FFFE0B57EA36C
+5BD803F0C8FCB3AE16F0ED01F8A8007FB6FCB7FCA36C15F025337DB22C>76
+D<D87FE0EB0FFC486CEB1FFEA26D133F007F15FC000F15E001BC137BA4019E13F3A3EB9F
+01A2018F13E3A21483A2018713C314C7A201831383A214EFA201811303A214FFEB80FEA3
+147C14381400ACD87FF0EB1FFC486CEB3FFEA36C48EB1FFC27337EB22C>I<D87FF0EB7F
+FC486CEBFFFEA27F007FEC7FFCD807FEEB07C013DEA213DF13CFA2148013C714C0A213C3
+14E0A213C114F0A213C014F8A2147CA3143EA2141E141FA2140F1587A2140715C7A21403
+15E71401A215F71400A215FFD87FFC137F487E153FA26C48EB1F8027337EB22C>I<EB7F
+FF0003B512E0000F14F848804880EBE003EB800048C7127FA2007E80A300FE158048141F
+B3A86C143FA2007E1500A3007F5CA26C6C13FEEBF00790B5FC6C5C6C5C000314E0C66C90
+C7FC21357BB32C>I<007FB512C0B612F88115FF6C15802603F00013C0153FED0FE0ED07
+F0A2150316F81501A6150316F01507A2ED0FE0ED3FC015FF90B61280160015FC5D15C001
+F0C8FCB0387FFF80B57EA36C5B25337EB22C>I<387FFFFCB67E15E015F86C803907E007
+FE1401EC007F6F7E151FA26F7EA64B5AA2153F4BC7FCEC01FE140790B55A5D15E0818190
+38E007FCEC01FE1400157F81A8160FEE1F80A5D87FFEEB1FBFB5ECFF00815E6C486D5AC8
+EA01F029347EB22C>82 D<90381FF80790B5EA0F804814CF000714FF5A381FF01F383FC0
+03497E48C7FC007E147F00FE143F5A151FA46CEC0F00007E91C7FC127F7FEA3FE0EA1FFC
+EBFFC06C13FC0003EBFFC06C14F06C6C7F01077F9038007FFEEC07FF02001380153FED1F
+C0A2ED0FE0A20078140712FCA56CEC0FC0A26CEC1F806D133F01E0EB7F009038FE01FF90
+B55A5D00F914F0D8F83F13C0D8700790C7FC23357CB32C>I<007FB612FCB712FEA43AFC
+007E007EA70078153CC71400B3AF90383FFFFCA2497F6D5BA227337EB22C>I<D87FFCEB
+7FFC486CEBFFFEA36C48EB7FFCD80FC0EB07E06D130F000715C0A36D131F00031580A36D
+133F00011500A36D5B0000147EA4017E5BA46D485AA490381F83F0A4010F5B14C7A30107
+5BA214EFA201035BA214FFA26D90C7FCA46D5A27347EB22C>86 D<D87FFCEB7FFC486CEB
+FFFEA36C48EB7FFCD807F0EB0FC0151F000315806D133F12016DEB7F0012006D137E017E
+13FE017F5BEB3F01EC81F8131FEC83F0EB0FC314C7903807E7E0A201035B14EF6DB45AA2
+92C7FC7F5C147EB0903807FFE0497FA36D5B27337EB22C>89 D<003FB612C04815E0A400
+7EC7EA1FC0ED3F80A2ED7F00157E15FE4A5A003C5CC712034A5AA24A5A4A5AA24A5A4AC7
+FCA214FE495AA2495A495AA2495A495AA2495A49C8FCA213FE485AA24848EB03C049EB07
+E01207485A5B121F485AA248C7FCB7FCA46C15C023337CB22C>I<007FB6FCB71280A46C
+150021067B7D2C>95 D<3801FFF0000713FE001F6D7E15E048809038C01FF81407EC01FC
+381F80000006C77EC8127EA3ECFFFE131F90B5FC1203120F48EB807E383FF800EA7FC090
+C7FC12FE5AA47E007F14FEEB8003383FE01F6CB612FC6C15FE6C14BF0001EBFE1F3A003F
+F007FC27247CA32C>97 D<EA7FF0487EA3127F1201AAEC1FE0ECFFF801FB13FE90B6FC16
+809138F07FC09138801FE091380007F049EB03F85BED01FC491300A216FE167EA816FE6D
+14FCA2ED01F86D13036DEB07F0150F9138801FE09138E07FC091B51280160001FB5B01F8
+13F83900F03FC027337FB22C>I<903803FFE0011F13F8017F13FE48B5FC48804848C6FC
+EA0FF0485A49137E4848131890C9FC5A127EA25AA8127EA2127F6C140F6DEB1F806C7E6D
+133F6C6CEB7F003907FE03FF6CB55A6C5C6C6C5B011F13E0010390C7FC21247AA32C>I<
+EC0FFE4A7EA380EC003FAAEB07F8EB3FFE90B512BF4814FF5A3807FC0F380FF00348487E
+497E48487F90C7FC007E80A212FE5AA87E007E5CA2007F5C6C7E5C6C6C5A380FF0073807
+FC1F6CB612FC6CECBFFE6C143FEB3FFC90390FF01FFC27337DB22C>I<EB03FE90381FFF
+C0017F13F048B57E48803907FE03FE390FF800FFD81FE0EB3F805B4848EB1FC090C7120F
+5A007E15E015075AB7FCA416C000FCC9FC7E127EA2127F6CEC03C06DEB07E06C7ED80FF0
+130F6C6CEB3FC001FF13FF000190B512806C1500013F13FC010F13F00101138023247CA3
+2C>I<EC0FF8EC3FFE91B5FC4914805B903807FC7F14F090390FE03F0014C092C7FCA600
+7FB512FEB7FCA36C5C26000FC0C7FCB3A8003FB512F04880A36C5C21337DB22C>I<ED03
+F8903907F80FFC90391FFE3FFE017FB6FC48B7FC48ECFE7F9038FC0FF82607F003133E3A
+0FE001FC1CD9C0001300001F8049137EA66D13FE000F5CEBE0016C6C485A3903FC0FF048
+B5FC5D481480D99FFEC7FCEB87F80180C8FCA37F6C7E90B512F06C14FE48ECFF804815E0
+4815F03A3FC0001FF848C7EA03FC007E1400007C157C00FC157E48153EA46C157E007E15
+FCD87F801303D83FE0EB0FF8D81FFCEB7FF06CB612E0000315806C1500D8003F13F80107
+13C028387EA42C>I<EA7FF0487EA3127F1201AAEC1FE0EC7FFC9038F9FFFE01FB7F90B6
+FC9138F03F80ECC01F02807FEC000F5B5BA25BB3267FFFE0B5FCB500F11480A36C01E014
+0029337FB22C>I<1307EB1FC0A2497EA36D5AA20107C7FC90C8FCA7387FFFC080B5FC7E
+A2EA0007B3A8007FB512FCB612FEA36C14FC1F3479B32C>I<140EEC3F80A2EC7FC0A3EC
+3F80A2EC0E0091C7FCA748B512804814C0A37EC7120FB3B3A2141F003C1480007E133FB4
+14005CEB01FEEBFFFC6C5B5C001F5B000790C7FC1A467CB32C>I<EA7FE0487EA3127F12
+01AA91381FFFF04A13F8A36E13F0913800FE004A5A4A5A4A5A4A5A4A5A4A5A4AC7FC14FE
+EBF1FC13F3EBF7FE90B5FCA2EC9F80EC0FC001FE7FEBFC07496C7E496C7E811400157E81
+1680151F3A7FFFC0FFFCB500E113FEA36C01C013FC27337EB22C>I<387FFFE0B57EA37E
+EA0003B3B3A5007FB61280B712C0A36C158022337BB22C>I<3A7F83F007E09039CFFC1F
+F83AFFDFFE3FFCD87FFF13FF91B57E3A07FE1FFC3E01FCEBF83F496C487E01F013E001E0
+13C0A301C01380B33B7FFC3FF87FF0027F13FFD8FFFE6D13F8D87FFC4913F0023F137F2D
+2481A32C>I<397FF01FE039FFF87FFC9038F9FFFE01FB7F6CB6FC00019038F03F80ECC0
+1F02807FEC000F5B5BA25BB3267FFFE0B5FCB500F11480A36C01E0140029247FA32C>I<
+EB07FCEB1FFF017F13C048B512F048803907FC07FC390FF001FE48486C7E0180133F003F
+158090C7121F007EEC0FC0A348EC07E0A76C140F007E15C0A2007F141F6C15806D133F6C
+6CEB7F006D5B6C6C485A3907FC07FC6CB55A6C5C6C6C13C0011F90C7FCEB07FC23247CA3
+2C>I<397FF01FE039FFF8FFF801FB13FE90B6FC6C158000019038F07FC09138801FE091
+380007F049EB03F85BED01FC491300A216FE167EA816FE6D14FCA2ED01F86D13036DEB07
+F0150F9138801FE09138E07FC091B51280160001FB5B01F813F8EC3FC091C8FCAD387FFF
+E0B57EA36C5B27367FA32C>I<D87FFEEB3FC0B53801FFF0020713F8021F13FC6C5B3900
+3F7FE1ECFF019138FC00F84A13704A13005CA25C5CA391C8FCAF007FB512E0B67EA36C5C
+26247EA32C>114 D<90387FF8700003B512F8120F5A5A387FC00F387E00034813015AA3
+6CEB00F0007F140013F0383FFFC06C13FE6CEBFF80000314E0C66C13F8010113FCEB0007
+EC00FE0078147F00FC143F151F7EA26C143F6D133E6D13FE9038F007FC90B5FC15F815E0
+00F8148039701FFC0020247AA32C>I<131E133FA9007FB6FCB71280A36C1500D8003FC8
+FCB1ED03C0ED07E0A5EC800F011FEB1FC0ECE07F6DB51280160001035B6D13F89038003F
+E0232E7EAD2C>I<3A7FF003FF80486C487FA3007F7F0001EB000FB3A3151FA2153F6D13
+7F3900FE03FF90B7FC6D15807F6D13CF902603FE07130029247FA32C>I<3A7FFF01FFFC
+B514FE148314016C15FC3A03E0000F80A26D131F00011500A26D5B0000143EA26D137E01
+7C137CA2017E13FC013E5BA2EB3F01011F5BA21483010F5BA214C701075BA214EF01035B
+A214FF6D90C7FCA26D5A147C27247EA32C>I<D87FFFEB7FFF6EB5FCB515806C16004A7E
+D807C0EB01F0A66C6C495AA3143E147FA2D801F0495AECFF87A214F7A201F113C700005D
+9038F9E3CFA201FB13EFA3D97BC190C7FC017F13FFA21480A2013F5B90381F007C29247F
+A32C>I<3A3FFF03FFF048018713F8A36C010313F03A00FC007E005D90387E01F8013F5B
+EB1F83EC87E090380FCFC0903807EF80EB03FF6D90C7FC5C6D5A147C14FE130180903803
+EF80903807CFC0EB0FC7EC83E090381F01F0013F7FEB7E00017C137C49137E0001803A7F
+FF01FFFC1483B514FE6C15FC140127247EA32C>I<3A7FFF01FFFCB5008113FE14831481
+6C010113FC3A03E0000F806C7E151F6D140012005D6D133E137C017E137E013E137CA201
+3F13FC6D5BA2EB0F815DA2EB07C1ECC3E0A2EB03E3ECE7C0130114F75DEB00FFA292C7FC
+80A2143EA2147E147CA214FC5CA2EA0C01003F5BEA7F83EB87E0EA7E0F495A387FFF806C
+90C8FC6C5A6C5AEA07E027367EA32C>I<003FB612E04815F0A4007EC7EA1FE0ED3FC0ED
+7F80EDFF004A5A003C495AC7485A4A5A4A5A4A5A4A5A4AC7FCEB01FC495AEB0FF0495A49
+5A495A49C8FC4848EB01E04848EB03F0485A485A485A485A485AB7FCA46C15E024247DA3
+2C>I<15FF02071380141F147F91B512004913C04AC7FCEB03F85CB31307EB1FE013FF00
+7F5BB55A49C8FC6D7E6C7FC67F131FEB07F01303B380EB01FEECFFC06D13FF6E1380141F
+14070200130021417BB92C>I<EA7FC0EAFFF813FE6D7E6C7FC67F131FEB07F01303B380
+EB01FEECFFC06D13FF6E1380141F147F91B512004913C04AC7FCEB03F85CB31307EB1FE0
+13FF007F5BB55A49C8FC13F8EA7FC021417BB92C>125 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fd ecbx1440 14.4 41
+/Fd 41 122 df<DC7FFEECFFC0031FB5D8801F13F092B6D8E07F13FC020703F9B57E021F
+D9C007B5EAC1FF91277FFE000102071380DAFFF8010713FC010301E049494813C0495B49
+494913F04990C7FC19E0495A741380017F17C04A6E6E130071EC00FC98C7FCAEBB12FEA5
+26007FFCC7000701C0C8FCB3B3A7007FB5D8FC07B612F0A552547DD34D>27
+D<151E153E15FE1403140F147FEB07FF0003B5FCB6FCA3EBF87FEAFC00C7FCB3B3B3A600
+7FB712FCA52E4E76CD42>49 D<EC1FFE49B512F0010F14FC013FECFF804915E02701FF80
+3F7F2703FC000713FCD807F001017F48486D7FD81F806E138048C87E7013C0D87FE016E0
+01F8806D16F000FF817F7013F8A56C5AA26C5A6C5AEA0380C914F05EA218E05E18C05E18
+804C13005F4C5A4C5A5F4B5B4B5B4B5B94C7FCED0FFC4B5A4B5AED7FC04B5A4A90C8FCEC
+03FC4A5A4A4814F84A5A4A5A4AC8FC02FEEC01F0495A495A495A5CD90F80140349C8FC01
+3E1507017FB7FC90B812E05A5A5A5A5A5A5AB9FC18C0A4354E7ACD42>I<913807FFC002
+7F13FC0103B67E010F15E090261FF80313F890267FC0007F01FEC7EA3FFE48488148486E
+138013FE486C6C6D13C0804817E080A66C5B18C06C5B6C90C75AD80038168090C8FC4C13
+00A24C5A5F4C5A4B5B4B13C0030F5BDB7FFEC7FC91387FFFF816C016FCEEFF80DA000313
+E09238007FF8EE3FFE707E70138018C07013E018F07013F8A218FC82A218FEA3EA03C0EA
+0FF0EA3FFC487EA2B5FCA218FCA25E18F8A26C4816F0495C4916E0D83FE04A13C06C485C
+D80FF04A1380D807FE91387FFE003B03FFE003FFFC6C90B65A6C6C15E0010F92C7FC0101
+14FCD9001F1380374F7BCD42>I<17FC1601A216031607160FA2161F163F167FA216FF5D
+5DA25D5D5D167F153E157E15FC15F8EC01F01403EC07E015C0EC0F80141FEC3F00143E5C
+14FC495A5C495A1307495A5C49C7FC5B137E137C5B1201485A5B485A120F485A90C8FC12
+3E127E5ABA1280A5C901FCC7FCAF021FB71280A5394F7CCE42>I<486C150601F0153E01
+FEEC01FED9FFF0133F91B65A5F5F5F5F5F94C7FC16FC5E16E093C8FC15FC01F0138091CA
+FCAC913807FF80023F13F891B512FE01F36E7E9026FFFC0113E09139E0007FF891C76C7E
+496E7E01F86E7E5B7013804916C0C9FC18E08218F0A418F8A31203EA0FE0EA3FF8487EA2
+12FF7FA218F0A25B5E6C4816E05B01C016C06CC85A18806C6C4A13007FD80FF04A5A6C6C
+ECFFFCD803FE4913F02701FFE00F5B6C6CB612806D92C7FC010F14F8010114C09026003F
+FCC8FC354F7ACD42>I<ED07FE92B512C0020314F0021F14FC91397FFC01FE9139FFE000
+7F01030180EB3F804990C7121F4948EC7FC0494814FF4948010313E0495A49485B5A485B
+A2485BA2486F13C091C7FC4803001300177E94C7FC5AA25B127FA2ED3FF04AB5FC020714
+C000FF4914F091391F807FF891393E001FFE02786D7E4A6D13807013C06D5A4A6D13E018
+F05C7013F8A291C813FCA44916FEA3127FA6123FA37F6C17FCA36C17F85E7E6E15F06C17
+E06C6D5B6E15C06C4B13806D6C491300D93FFC495A6DB4EBFFFC010790B512F06D5D0100
+1580021F01FCC7FC020313C0374F7BCD42>I<121F7F7FEBFF8091B8FCA45A18FE18FC18
+F818F0A218E018C018804817000180C8123E007EC9127E5F007C4B5A4C5A5F16074C5A48
+4B5A4CC7FC167E167CC912FC4B5A4B5AA24B5A150F4B5AA24B5AA24BC8FC5DA25C5D1403
+A214075D140FA3141FA2143FA34A5AA414FFA65BAB6D5B6E5A6E5A6E5A385279D042>I<
+913803FFC0023F13FC49B67E010715E090260FFC0013F8D93FE0EB1FFCD97F80EB07FE49
+C76C7E496E1380484880000317C049157F120718E0173F120FA27FA27F7F6E147F02E015
+C08002FC14FF6C01FF15806F481300EDE0036C9138F807FE6F485A6C9138FF1FF06CEDFF
+E017806D4AC7FC7F010F6E7E6D81010115F06D81010315FE010F81D93FF71580D97FC115
+C02701FF807F14E048EB001F48486D14F04848010314F848481300496E13FC003F151F49
+1407007F6F13FE491400177F00FF163F49151F170F1707A21703A218FCA27F127F6DED07
+F8A26C6CED0FF07F6C6CED1FE06C6CED3FC06C6CEDFF806C01C0010313006C01FCEB3FFE
+6C6CB612F8011F15E001071580010002FCC7FC020F13C0374F7BCD42>I<913807FF8002
+7F13F849B512FE01076E7E90261FFE0113E0903A7FF8003FF049486D7E48496D7E48496D
+7E484980486F138091C7FC486F13C05A18E0485A18F0A27013F812FFA318FCA618FEA35E
+127FA4003F5DA26C7E5E7E6C6D5B161E6C7F6C6D5B6C6C6C13F890393FFC03F06DB55A01
+074A13FC01001400EC1FF891C8FCA218F85EA301FC16F0487E2607FF8015E05E486D15C0
+A24C1380A24C13005F4A131F6C4B5A49C7485A494A5A6C48495B6D01075B2701FF803F90
+C7FC6C90B512FC013F5C6D14C0010791C8FC9038007FF0374F7BCD42>I<B912FEF0FFF0
+19FE737E1AE0D8000F01C0C7001F7F06037F727F726C7E867313807313C0A27313E0A373
+13F0A94F13E0A34F13C01B80614F1300624F5A06035B4E13E0063F5B92B8C7FC19F8A2F1
+FF8003C0C7001F13E0060113F89538007FFE737E070F13C01BE07313F0851BF87313FCA2
+7313FEA31BFFA91BFEA2611BFCA2614F13F81BF0614F13E0077F13C04EB51280060FEBFE
+00BB5A1AF01AC04FC7FC19C050527BD15D>66 D<932603FFF01407047F01FF140F0307B6
+00E0131F033F03F8133F92B700FE137F02039126C003FF13FF020F01F8C7EA3FC1023F01
+C0EC0FE391B5C80003B5FC4901FC814949814901E082011F498249498292CA7E49488349
+48835A4A83485B4885A24849187FA2485B1B3FA2485B1B1FA25AA21B0091CDFCA2B5FCAE
+7EA280A36C1A1FA36C7FA21B3F6C7F1B3E6C7F1B7E6C6D187C6C1AFC6E18F86C19016D6C
+EF03F06D7E6FEE07E06D6DEE0FC001076DEE1F806D01F8EE3F006D6D16FE6D01FF4B5A02
+3F01C0EC07F8020F01FCEC3FF00203903AFFC001FFC0020091B6C7FC033F15FC030715F0
+DB007F1480040301F0C8FC505479D25F>I<BAFC19F819FF1AE01AF8D8000701F0C7001F
+13FE06017FDE003F13C0070F7F07037F737F737F747E747E747F86747F8886888688A274
+7FA3881B7FA288A51D80AF1D00A564A21BFF64A3505BA2505BA2505BA2505B505B99C7FC
+505A1A7F4F485A4F13F0070F5B073F5B4EB55A061F49C8FCBB12F81AE097C9FC19F896CA
+FC59527CD165>I<BB12FCA5D8000701F0C7000F7F1800191F190F19071903190119001A
+7E1A7F86A386A51B80DD03E0130FA497C7FCA31707A3170F171F173FEE01FF92B6FCA5ED
+F001EE003F171F170F1707A31703A794CAFCB3A2B812F0A549527CD153>70
+D<B8D88007B712FCA5D8000701F0C9003FEB8000B3AE92BAFCA503F0C9123FB3B1B8D880
+07B712FCA55E527CD167>72 D<B81280A5D8000701F0C7FCB3B3B3B2B81280A529527DD1
+30>I<B812E0A5D8000F01E0CAFCB3B3A91AF8A419011AF0A51903A31907A2190F1AE019
+1FA2193F197F19FF60180760187F0503B5FCBB12C0A545527CD14F>76
+D<B912FCF0FFE019FE737E1AE0D8000F01E0C7003F7F060313FC06007F737E7313807313
+C07313E0851BF0A21BF885A21BFCA91BF8A3611BF0A21BE04F13C0614F13804F13004F5A
+060713F8063F5B92B812C097C7FC19F8198003E0CBFCB3AEB712FEA54E527CD15A>80
+D<B912E018FF19F019FE737ED8000701F0C714E0060F7F060313FC06007F737E737F8587
+737FA28785A287A863A261636361634F90C8FC4F5A4F5A06035B060F13E095B5128092B7
+48C9FC19F019C019F09226F0000713FC050013FF063F7F727F727F727F727FA2727FA284
+86A886A71D707513F8A2851C017301C013F0A273EBE003B86C6D9038F007E0739038FC1F
+C0070190B51280736C1400080F5BCE13F85D537CD162>82 D<DA0FFE141C91B500F0133C
+010702FC137C011F02FF13FC017F15C19026FFF00113E148903980001FFB4890C7EA07FF
+D807FC14014848804848153F171F4848150FA2007F1607491503A2170112FFA217007FA2
+6D167CA27F7F6D93C7FC6C7E14C014F8ECFF806C14F8EDFFC06C15FC6CEDFF8017F06C16
+FC6C826C707E6C836D82011F8201078213016D6C81020781EC007F030380ED003F040314
+801600173F837113C0838312F883A3837EA319807EA26C5E19007F6D4B5A7F6D4B5A01FC
+4B5A6D151FD9FFC04A5AD97FF8ECFFE028FE1FFF80075B010790B6C7FCD8FC0115FC486C
+6C14F048010F14C0489026007FFCC8FC3A5479D249>I<B700FE4AB612F0A5D8000F01E0
+CA387FC000091FC7FCB3B3B26D611B3E811B7E6D197CA26D6D17FC636D6D1601027F4D5A
+6F4C5A023F170F6E6C4C5A6E6D4B5A6E01E003FFC8FC6E01F8EC03FE020001FEEC1FFC92
+3B7FFFE001FFF8031F90B612E00307168003004BC9FC041F14F0040091CAFC5C537CD165
+>85 D<EC3FFE0107B512E0011F14FC017F14FF2701FFC00F13C02703FE00037F486C0100
+7F6E6D7E486D80707EA2707EA3707F6C5B6C90C7FC6C5AC9FCA60307B5FC0203B6FC147F
+0103B7FC011FEBF00F017F1300EBFFFC000313F04813C0485B4890C7FC5A5B485AF081F0
+12FF5BA35EA26D5C127F6D5C003F03F713C36DD901E314E06CD9C00714FF00079026F01F
+8114C06C90B5C61480C602FC6D1300011F01F0EB3FFC01010180EB07F03C387CB642>97
+D<EB3FF8B5FCA51203C6FCB3A4EE7FF00307B5FC031F14C0037F14F0913AF9FF007FFCDA
+FFF8EB1FFF03E001077F03806D7F92C76C7F4A6E7F5C4A6F7E85183F85A38584A31A80AD
+1A00A36061A261187F616E15FF616E4A5B6E4A5B6F495BDACFE04990C7FCDA87F0EB3FFE
+913A01FE01FFF8496CB65A49013F14C049010749C8FC90C813E041547DD249>I<913803
+FFE0023F13FE91B67E010315E0010F9038003FF8D93FFCEB07FC4948497E4948131F4849
+497E485B485BA24890C7FC5A5B003F6F5A705A705A007F92C8FC5BA312FFAD127F7FA312
+3F7F6CEE0F80A26C6D141F18006C6D5C6C6D143E6C6D147E6C6D5C6D6C495A6DB4EB07F0
+010F9038C01FE06D90B5128001014AC7FCD9003F13F80203138031387CB63A>I<943803
+FF80040FB5FCA5EE003F170FB3A4913803FF80023F13F849B512FE0107ECFF8F011F9038
+C03FEF90273FFE0007B5FCD97FF8130149487F484980484980484980488291C8FC5A5B12
+3FA2127F5BA312FFAD127FA37F123FA3121F7F6C5E6C6D5C5F6C6D91B5FC6C6D5B6C6D49
+14E0D97FFCD90FEFEBFF80D91FFFEB7F8F010790B5120F010114FC6D6C13E00207010049
+C7FC41547CD249>I<913807FF80027F13F849B512FE01076E7E011F010313E0903A3FFC
+007FF0D97FF06D7E49486D7E4849130F48496D7E48824890C77E1880485A82003F17C0A3
+485A18E082A212FFA290B8FCA401FCCAFCA6127FA37F123FA2EF03E06C7E17076C17C06C
+6D140F18806C6D141F6C6DEC3F006C6D147ED97FFC495AD91FFFEB07F86D9038E03FF001
+0390B512C001005D023F01FCC7FC020113E033387CB63C>I<ED1FF8913803FFFE020FEB
+FF80023F14C09139FFF83FE001039038E0FFF049138049010113F85BEB3FFEA2EB7FFCA2
+6F13F0495AEE7FE0EE1F8093C7FCAEB712C0A5C601F8C8FCB3B3A7B612FEA52D547CD328
+>I<DA1FFE14FE49B539E007FF80010FDAFC1F13C0013FDAFF7F13E090267FF807EBFF07
+2701FFE001EBF07F48497E484990387FF83F91C7003F14C048EEFC1F489338FE07004902
+1F90C7FCA2003F82A9001F5EA26D143F6C5E6C5E6E137F6C6D495A6C6D485B6CD9F80713
+804890B6C8FCD803EF14FC01C114E02707C01FFEC9FC49CBFCA2487EA37FA27F13FC90B6
+12FE6CEDFFF017FCEFFF806C8318F06C836C837F48B87E1207D80FFCC700037F4848EC00
+3F4848150F48486F138083485A83A56D5D007F18006D5D003F5F6C6C4B5A01FE153FD807
+FFED7FF06C01C049485AC601FC011F1380013FB648C7FC010F15F8010115C0D9000F01F8
+C8FC3B4F7CB542>I<EB3FF8B5FCA51203C6FCB3A4EE1FFC93B57E030314E0030F14F892
+391FC07FFC92397E003FFE03F86D7EECF9F04B6D7FECFBC0ECFF8092C76C7FA25CA25CA4
+5CB3ACB6D8F807B612C0A542537CD249>I<133FEBFFC0487F487FA2487FA66C5BA26C5B
+6C5B013FC7FC90C8FCAEEB1FF8B5FCA512017EB3B3A6B612F0A51C547CD324>I<EB3FF8
+B5FCA51203C6FCB3A50407B512F0A59339007FF000EF3FC04D5A4DC7FCEE01FC4C5AEE0F
+F04C5A4C5A4CC8FC16FEED03FC4B5A4B5A4B5A4B7E4B7EECF9FF02FB7F91B57EA28203BF
+7F031F7F14FE4A6C7FDAF0077F6F7FA26F7F6F7F167F83707F707FA2707F707F707FA270
+7F707F84B6D8F00F14FEA53F537DD245>107 D<EB3FF8B5FCA51203C6FCB3B3B3B1B612
+F8A51D537CD224>I<D93FF0D91FF84AB47EB591B56C010F13F8030302E0013F13FE030F
+6E90B6FCDB3F809027F803F80F7F922A7E007FFC07E0077F000302F890283FFE0F80037F
+C6D9F1F0011F49487EDAF3E0DAFF3E814B153CDAF7805D92C76C496D7F14FF4A5EA24A5E
+A34A5EB3ADB6D8F80FB66CB612F8A565367BB56E>I<D93FF0EB1FFCB591B57E030314E0
+030F14F892391FC07FFC92397E003FFE000302F86D7EC6EBF1F04B6D7FECF3C0ECF78092
+C76C7F14FF5CA25CA45CB3ACB6D8F807B612C0A542367CB549>I<913801FFC0023F13FE
+91B67E010315E0010F018013F8903A3FFC001FFED97FF0EB07FF49486D7F48496D7F4849
+6D7F91C8127F4883488349153F001F83A2003F8349151FA2007F83A400FF1880AC007F18
+00A3003F5F6D153FA2001F5FA26C6C4B5AA26C6D4A5A6C5F6C6D495B6C6D495B6D6C4990
+C7FCD93FFCEB1FFE6DB46CB45A010790B512F0010115C0D9003F49C8FC020313E039387C
+B642>I<D93FF8EB7FF0B50107B5FC031F14C0037F14F09126F9FF0013FCDAFFF8EB3FFF
+000302E0010F7FC602806D7F92C76C7F4A824A804A6E7F85187F85A2183F85A4721380AD
+4E1300A44E5AA26118FF616E5C616E4A5B6E4A5B6F495B03E04990C7FC6FEB7FFE913AF9
+FE01FFF802F8B65A033F14C0030749C8FC030013E093CAFCB1B612F8A5414D7DB549>I<
+90393FF001FCB590380FFF804B13E0037F13F09238FE1FF89138F1F83F00019138F07FFC
+6CEBF3E015C0ECF780A2ECFF00EE3FF84AEB1FF0EE0FE093C7FC5CA45CB3ABB612FEA52E
+367DB535>114 D<903903FFC00E011FEBFC1E90B6127E000315FE3907FE003FD80FF013
+0F4848130348481301491300127F90C8127EA248153EA27FA27F01F091C7FC13FCEBFF80
+6C13FEECFFF06C14FE6F7E6C15E06C816C15FC6C81C681133F010F15801301D9000F14C0
+EC003F030713E0150100F880167F6C153FA2161F7EA217C07E6D143F17807F6DEC7F0001
+F85C6DEB03FE9039FF801FFC486CB512F0D8F81F14C0D8F00791C7FC39E0007FF02B387C
+B634>I<147CA614FCA41301A31303A21307A2130F131F133F137F13FF1203000F90B512
+FEB7FCA426007FFCC8FCB3A9EE0F80ABEE1F006D7EA2011F143E806D6D5A6DEBC1F86DEB
+FFF001005C023F1380DA03FEC7FC294D7ECB33>I<D93FF8913801FFC0B50207B5FCA500
+03ED001FC61607B3AE5FA35FA25F137F5F6D6C14F7DC01E713F06D6CD907C7EBFFC0903A
+0FFF801F876D90B51207010114FC6D6C13F0020701C091C7FC42377CB549>I<B600E090
+381FFFFCA5000101F8C7000113006CEE007C6E15FC017F5E6E1401013F5E8017036D6D5C
+17076D5E6F130F6D5E6F131F6D93C7FC815F6D6D133E177E6D157C6F13FC027F5C811601
+DA3FFF5B16036E5C16876E5C16CF6E5C16EF16FF6E91C8FCA26E5BA26E5BA26F5AA36F5A
+A26F5AA26F5AA35E151F93C9FC5D153E157ED81FC0137C487E486C13FC486C5B14015D4A
+5A14074A5A6C48485A4948CAFC495A383F81FC6CB45A6C5B000313C0C648CBFC3E4D7DB4
+45>121 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fe ecss2074 20.74 10
+/Fe 10 116 df<EAFFC0B3B3B3B3B3B390B912FCA83E7570F456>76
+D<D8FFC0F03FF0B3B3B3B3AD6C6CF07FE0A46C6CF0FFC0A36D5F001F1A80A26C6C4D1300
+A26C6C4D5A6D170F6C616E161F6C6D4C5A6C6D4C5A6E16FF6D6C4B5B6D6C4B5B6D6C4B5B
+6D6C6C021F90C7FC6D01E0EC7FFE6D01F849485A6D9026FF801F5B6D91B65A6E5E021F16
+8002074BC8FC020115F86E6C14E0030F91C9FC030013F04C7770F46D>85
+D<91380FFF8049B512F0010F14FC017F14FF48B712C0000782001F824882DAE0007F49C7
+EA3FFE01F8140FD81FC06E7E90C86C1380121E00186F13C0001081CAFCEF7FE0A318F017
+3FAD93B5FC157F0207B6FC143F49B7FC1307011F153F017FEBF80090B512804801F8C7FC
+4813C04890C8FCEA0FFC485A485A5B485A5BA248C9FCA5177FA26D15FFA26C6C5C6D5C6D
+140F6C6C5C01FF91B5FC6CEBE00791B612BF6CEDFE3F16FC6C15F06C15C06CECFE006C6C
+13F0D91FFCC9FC344C77CA4C>97 D<EAFFC0B3B3ADED0FFC92B57E020714E0021F80027F
+14FC91B67E01C38101C7829026CFFE0080D9DFF0131FD9FFC001037F4A6D7F49C86C7E49
+153F496F7E170F496F7E5B717E4981A2711380A2187FA219C0183FA419E0181FAD183F19
+C0A3187FA2198018FFA24D1300A25F6D5E17076D4B5A6D151F4D5A6D4B5A6D15FF6D0203
+5B6E495BD9DFE0013F5B9026CFFC01B5C7FC01C7B65A01C35D01C15D01C05D023F14C002
+0F5C020301FCC8FCC8EA3FE03B7C72FA52>I<ED3FFF4AB512F8020F14FF023F15C04A15
+F049B712FC4916FF49178049EBE0004990C7120FD93FFC02011300D97FF06E7E4948151F
+0280814890C912034894C7FC5B485A5B120F5B121F5B123F5BA3485AA548CCFCAD6C7EA4
+7F123FA27F121F7FA26C7EA26C6C17806D1601000317036C6C160F6E151F6C01E0ED7FC0
+6D6CEC01FFD93FFC14076DB4143F6DD9E003B512806D90B6EAFE006D5E6D16F06D6C5D6E
+1580020F02FCC7FC020114E09126003FFCC8FC3A4C78CA47>I<DB1FE04AB4FC912601FF
+FE143F02079026FF8003B5FC4AECC01F023F02F0B6FC4A02FB158091BAFC49EBE01F49D9
+000302FCC7FC49486D01F8C8FC02F89038007F8049486E7E49486E7E4A140F013F824A14
+07A249C86C7EA401FE6F7EAA017F4B5AA46D6C4A5AA26E140F011F5E6E141F6D6C4A5A6D
+6C4A5A02FEEB01FF496C4990C9FC499038E01FFE92B55A495D02BF5C020F14C0496C5CD9
+7E0149CAFC9138001FE001FE90CCFCA67FA27F8080EB3FF091B612FE6DEDFFF818FF6D17
+C019F0013F17FC498390BA7E48854801E0C71203480180DA001F7F4848C900037F484816
+0049EF3FF84848171F49717E127F4917078648481703A76D1707007F616D170F003F616D
+171FD81FFCEF7FF06C6C4D5A6D5E6C01C003075B6C01F8033F5BC601FF4AB448C7FC6D01
+F0011F5B6D90B75A010F17E00103178001004CC8FC021F15F002031580DA000F01E0C9FC
+496D7CC950>103 D<EAFFE0ABC7FCB3A9EA7FE0B3B3B3B30B6F74EE25>105
+D<EAFFC0B3B3B3B3B3B3AF0A7B73FA25>108 D<ED1FF826FFC001B57E020714E0021F14
+F8027F8091B67E01C18101C316809038C7FE00D9CFF0011F13C0D9DFE0010713E0D9FF80
+130191C8FC18F049157F5B173F4916F8A249151FA35BA45BB3B3AC354A72C952>110
+D<91380FFFC091B512FE0107ECFFC0011F15F8017F15FE90B812804817C05A489038F000
+3F4890C70003138049EC007FD81FF8151F491507003F16014992C7FCA2485AA77FA26C7E
+7F7F6CB4FC6C13C014F86CEBFF806C14FC6CECFFE06C15FC6D14FF6D15C0010F81010315
+F8010081020F80DA007F7F03071480DB003F13C0160F040313E01600EF7FF0173FA2EF1F
+F8A2170FA7EF1FF0A20070163F127C007FEE7FE001C015FF01F0020313C0B5020F138002
+F0137F91B712006C5E001F5E000716F0C65E011F1580010302FCC7FCD9000F13C0354C7C
+CA3D>115 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Ff ecrm0700 7 1
+/Ff 1 66 df<140EA2141FA34A7EA3EC6FC0A2ECEFE014C7A290380183F0A390380301F8
+A201067F1400A249137EA2011C137F01187FA24980013FB5FCA2903960000FC0A201E080
+491307A248486D7EA200038115011207D81FC0497ED8FFF890383FFFE0A22B2A7EA931>
+65 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fg ecrm1000 10 78
+/Fg 78 123 df<B81280A2290280962A>21 D<DA0FF813FC91397FFF07FF903B01F807DF
+83C0903A07E001FF0F903B1F8007FE1FE090393F000FFC137E16F85B9338F00780484801
+0790C7FC1503ACB812F8A32801F80003F0C7FCB3AB486C497E267FFFE0B512F0A3333B7F
+BA30>27 D<EC0FF8EC7FFE903901F80780903907E001C090391F8000E090383F0007017E
+497EA25BA2485A6F5AED018092C8FCA9ED03F0B7FCA33901F8000F1503B3AA486C497E26
+7FFFE0B512C0A32A3B7FBA2E>I<EC0FFC91387FFF70903901F803F0903807E00790381F
+800FEB3F00137EA25B150748481303ADB7FCA33901F80003B3AB486C497E267FFFE0B512
+C0A32A3B7FBA2E>I<DA0FF0EB1FF0DA7FFEEBFFFC903B01F80F83F00F903C07E001CFC0
+0380903C1F8000FF0001C090273F0007FE130F017E4948497EA2495CA248485C03076E5A
+03030203C7FC95C8FCA9F007E0BAFCA33C01F80003F0001F1807B3AA486C496C497E267F
+FFE0B500C1B51280A3413B7FBA45>I<007C137C00FE13FEEAFF01A3EAFE00A7007E13FC
+007C137CA8003C137800381338A700181330171E77BA2A>34 D<030C497EA2031C130303
+1891C7FCA303385B03301306A30370130E0360130CA303E0131C4B1318A3020114384B13
+30A30203147092C71260A34A14E0007FB91280BA12C0C7270C000180C7FCA2021C130302
+1891C8FCA402385B02301306A50270130E0260130CA2BA12C06C1880280001C00038C8FC
+4A1330A30103147091C71260A34914E001065CA3010E1301010C5CA3011C1303011891C9
+FCA301385B01301306A30170130E0160130CA23A4A7BB945>I<EB0380A3EB0FF0EB7FFE
+48B512803903F38FC03907C381E0390F8380F0D81F031338123E003C141C007C140C150E
+0078143E00F814FE1481A400FCEB80FC157800FE140012FF127F13C313E3EA3FFF6C7F14
+F86C13FE6CEBFF80000114C06C14E0013F13F01303ECBFF8148FEC83FC1481A2EC80FE15
+7E123C12FF153EA412FE00F8143C00E0147C12600070147815F8003814F0003C1381001E
+EB83E0000FEB87C03907E39F803901FFFE006C5BEB1FE0EB0380A41F437BBD2A>I<121C
+127FEAFF80A213C0A3127F121C1200A412011380A2120313005A1206120E5A5A5A12600A
+1979B917>39 D<146014E0EB01C0EB0380EB0700130E131E5B5BA25B485AA2485AA21207
+5B120F90C7FCA25A121EA2123EA35AA65AB2127CA67EA3121EA2121F7EA27F12077F1203
+A26C7EA26C7E1378A27F7F130E7FEB0380EB01C0EB00E01460135278BD20>I<12C07E12
+707E7E7E120F6C7E6C7EA26C7E6C7EA21378A2137C133C133E131EA2131F7FA21480A3EB
+07C0A6EB03E0B2EB07C0A6EB0F80A31400A25B131EA2133E133C137C1378A25BA2485A48
+5AA2485A48C7FC120E5A5A5A5A5A13527CBD20>I<EB0380497EA7397803803C00FC147E
+00FE14FE397F8383FC393FC387F8390FE38FE03903FBBF803900FFFE00EB3FF8EB0FE0A2
+EB3FF8EBFFFE3903FBBF80390FE38FE0393FC387F8397F8383FC39FE0380FE00FC147E00
+78143C390007C000A76D5A1F247BBD2A>I<121C127FEAFF80A213C0A3127F121C1200A4
+12011380A2120313005A1206120E5A5A5A12600A19798817>44 D<B512FCA516057F941C
+>I<121C127FEAFF80A5EA7F00121C0909798817>I<1506A2150E150CA2151C1518153815
+30A215701560A215E015C0A214011580A2140315005C1406A2140E140CA2141C1418A214
+381430A21470146014E05CA213015CA2130391C7FCA25B1306A2130E130C131C1318A213
+381330A213701360A213E05BA212015B120390C8FCA25A1206A2120E120CA2121C1218A2
+1238123012701260A212E05AA21F537BBD2A>I<EB03F8EB1FFF90387E0FC09038F803E0
+3901E000F0484813780007147C48487FA248C77EA2481580A3007EEC0FC0A500FE15E0B3
+007E15C0A4007F141F6C1580A36C1500A26C6C133EA26C6C5B6C6C5BEBF0013900F803E0
+90387E0FC0D91FFFC7FCEB03F823397DB62A>I<EB01C013031307131F13FFB5FCA2131F
+1200B3B3A7497E007FB512F0A31C3779B62A>I<EB0FF0EB7FFE48B57E3903E03FE0390F
+000FF0001E6D7E001C6D7E486D7E5A6E7E126012FE6CEC7F807FA56CC7FC121CC8FCEDFF
+00A25D14015D14035D4A5A4A5A5D4A5A4AC7FC147E5C495A14E0495A495A49C8FC011EEB
+01805B5B49130348481400485A485A90C75A48B6FC5A5A485CB6FCA321377CB62A>I<EB
+07F8EB3FFF90B512C03901F80FF03903C007F848486C7E390E0001FEEA0F80391FE000FF
+7FA56C5A6C5AC7485AA25D14035D4A5A5DEC0F80027FC7FCEB1FFCECFF809038000FE06E
+7EEC01FC816E7EED7F80A216C0A2153F16E0A2121EEA7F80A2487EA316C0157F49148000
+7EC7FC0070ECFF006C495A121E390F8003F83907F00FF00001B512C06C6C90C7FCEB0FF8
+23397DB62A>I<1538A2157815F8A2140114031407A2140F141F141B14331473146314C3
+13011483EB030313071306130C131C131813301370136013C01201EA038013005A120E12
+0C5A123812305A12E0B712F8A3C73803F800AA4A7E0103B512F8A325387EB72A>I<0006
+140CD80780133C9038F003F890B5FC5D5D158092C7FC14FC38067FE090C9FCAAEB07F8EB
+1FFE9038780F809038E007E03907C003F0496C7E130000066D7E81C8FC8181A21680A412
+1C127F5A7FA390C713005D12FC00605C12704A5A6C5C6C1303001E495A6C6C485A3907E0
+3F800001B5C7FC38007FFCEB1FE021397CB62A>I<EC3FC0903801FFF0010713FC90380F
+E03E90383F800790387E001F49EB3F804848137F485A12075B000FEC3F0049131E001F91
+C7FC5B123FA3127F90C9FCEB01FC903807FF8039FF1E07E090383801F0496C7E01607F01
+E0137E497F16805BED1FC0A390C713E0A57EA47F123F16C0A2001FEC3F807F000F15006D
+5B000714FE6C6C5B6C6C485A3900FE07F090387FFFC0011F90C7FCEB03FC23397DB62A>
+I<12301238123E003FB612E0A316C05A168016000070C712060060140E5D5D00E0143048
+14705D5DC712014A5A4AC7FC1406140E5CA25C1478147014F05C1301A213035C1307A213
+0FA3131F5CA2133FA5137FA96DC8FC131E233A7BB72A>I<EB03F8EB1FFF017F13C09038
+FC07F03901E001F83903C0007C4848133C90C7123E48141E000E141F001E80A3121FA26D
+5B6D131E7FD80FF85B6D137C01FF13786C6D5A6CEBE3E0ECF780C601FFC7FC6D5A6D6C7E
+010F13E0013F7F01F97F3901E07FFE48486C7E380F800F48486C1380001E010113C0487F
+007C143F0078EC1FE0150F00F81407481403A21501A36C15C0A200781403007C15806C14
+076CEC0F006C6C131ED807E0137C3903F803F0C6B55A013F1380D907FCC7FC23397DB62A
+>I<121C127FEAFF80A5EA7F00121CC7FCB2121C127FEAFF80A5EA7F00121C092479A317>
+58 D<EC03FF021F13E09138FC00FCD901E0131ED90780EB0780011EC7EA01E00138EC00
+704981498148488148488190C97E48D901FC1480000ED907FFEB01C0000C90391F03C000
+001C90267E00E013E000184901701360263801F86D13700030496D13300103EC0FE02670
+07E00107133800601718495AA200E0171C484848150CAA6C6C7E1260A26D6C151C007017
+18263003F0130F0101141F00386D013F1338261800FC01771330001C017E9038E3F07000
+0C90261F03C113E0000E903A07FF00FFC06CD901FCEB3F006C90CAFC7F6C7E6C7E13706D
+167C011EED03FCD90780EC1FF0D901E0ECFF80D900FC90383FFC00021FB51280020301E0
+C7FC363C7BBA41>64 D<1538A3157CA315FEA34A7EA34A6C7EA202077FEC063FA2020E7F
+EC0C1FA2021C7FEC180FA202387FEC3007A202707FEC6003A202C07F1501A2D901807F81
+A249C77F167FA20106810107B6FCA24981010CC7121FA2496E7EA3496E7EA3496E7EA213
+E0707E1201486C81D80FFC02071380B56C90B512FEA3373C7DBB3E>I<B712E016FC16FF
+0001903980007FC06C90C7EA1FE0707E707E707EA2707EA283A75F16035F4C5A4C5A4C5A
+4C5AEEFF8091B500FCC7FCA291C7EA7F80EE1FE0EE07F0707E707E83707EA21880177F18
+C0A7188017FFA24C13005F16034C5AEE1FF8486DEB7FF0B812C094C7FC16F832397DB83B
+>I<913A01FF800180020FEBE003027F13F8903A01FF807E07903A03FC000F0FD90FF0EB
+039F4948EB01DFD93F80EB00FF49C8127F01FE153F12014848151F4848150FA248481507
+A2485A1703123F5B007F1601A35B00FF93C7FCAD127F6DED0180A3123F7F001F16031800
+6C7E5F6C7E17066C6C150E6C6C5D00001618017F15386D6C5CD91FE05C6D6CEB03C0D903
+FCEB0F80902701FF803FC7FC9039007FFFFC020F13F002011380313D7BBA3C>I<B712C0
+16F816FE000190398001FF806C90C7EA3FE0EE0FF0EE03F8707E707E177FA2EF3F8018C0
+171F18E0170F18F0A3EF07F8A418FCAC18F8A4EF0FF0A218E0A2171F18C0EF3F80A2EF7F
+0017FE4C5A4C5AEE0FF0EE3FE0486DEBFF80B8C7FC16F816C036397DB83F>I<B812FEA3
+000190388000076C90C8FC173F838383A383A31880170116C0A394C7FCA31501A2150315
+0F91B5FCA3EC000F15031501A21500A21860A318E093C712C0A41701A3EF0380A21707A2
+170F173F177F486D903807FF00B9FCA333397EB838>I<B812F8A30001903880001F6C90
+C71201EE00FC177C173C171CA2170CA4170E1706A2ED0180A21700A41503A21507151F91
+B5FCA3EC001F15071503A21501A692C8FCAD4813C0B612C0A32F397DB836>I<DBFF8013
+C0020FEBF001023F13FC9139FF803F03903A03FC000787D90FF0EB03CF4948EB00EF4948
+147F4948143F49C8121F485A4848150F48481507A248481503A2485A1701123F5B007F16
+00A448481600AB93B6FCA26C7E9338007FE0EF3FC0A2123F7F121FA26C7EA26C7EA26C7E
+6C7E6C6C157F6D7E6D6C14FF6D6C14EFD90FF8EB03C7D903FEEB0783903A00FFC03F0191
+393FFFFC00020F01F0130002001380383D7CBA41>I<B648B512FEA30001902680000313
+006C90C76C5AB3A491B6FCA391C71201B3A6486D497EB648B512FEA337397DB83E>I<B6
+12C0A3C6EBC0006D5AB3B3AD497EB612C0A31A397EB81E>I<013FB512E0A39039001FFC
+00EC07F8B3B3A3123FEA7F80EAFFC0A44A5A1380D87F005B0070131F6C5C6C495A6C49C7
+FC380781FC3801FFF038007F80233B7DB82B>I<B612E0A3000101C0C8FC6C90C9FCB3AD
+1718A517381730A31770A317F0A216011603160FEE1FE0486D13FFB8FCA32D397DB834>
+76 D<B5933807FFF86E5DA20001F0FC002600DFC0ED1BF8A2D9CFE01533A3D9C7F01563
+A3D9C3F815C3A2D9C1FCEC0183A3D9C0FEEC0303A2027F1406A36E6C130CA36E6C1318A2
+6E6C1330A36E6C1360A26E6C13C0A3913901FC0180A3913900FE0300A2ED7F06A3ED3F8C
+A2ED1FD8A3ED0FF0A3486C6D5A487ED80FFC6D48497EB500C00203B512F8A2ED01804539
+7DB84C>I<B5913807FFFE8080C69238007FE06EEC1F80D9DFF0EC0F001706EBCFF8EBC7
+FCA2EBC3FEEBC1FFA201C07F6E7EA26E7E6E7E81140F6E7E8114036E7E168080ED7FC016
+E0153FED1FF0ED0FF8A2ED07FCED03FEA2ED01FF6F1386A2EE7FC6EE3FE6A2EE1FF6EE0F
+FEA216071603A216011600A2177E486C153E487ED80FFC151EB500C0140EA2170637397D
+B83E>I<EC03FF021F13E09138FE01FC903901F8007ED907E0EB1F8049486D7ED93F80EB
+07F049C76C7E01FE6E7E48486E7E49157E0003167F4848ED3F80A24848ED1FC0A2001F17
+E049150F003F17F0A3007F17F8491507A300FF17FCAC007F17F86D150FA3003F17F0A26C
+6CED1FE0A36C6CED3FC0000717806D157F000317006C6C15FEA26C6C4A5A017F4A5A6D6C
+495A6D6C495AD907E0EB1F80D903F8017FC7FC903900FE01FC91381FFFE0020390C8FC36
+3D7BBA41>I<B712C016FC16FF0001D9800013C06C90C7EA1FE0707EEE03F883707EA270
+7EA21880A71800A24C5AA24C5A5FEE0FF04C5AEEFF8091B548C7FC16F091CAFCB3A5487F
+B6FCA331397EB838>I<EC03FF021F13E09138FE01FC903901F8007ED907E0EB1F804948
+6D7ED93F80EB07F049C76C7E01FE6E7E48486E7EA24848157F0007178049153F000F17C0
+49151F001F17E0A24848ED0FF0A3007F17F8A2491507A200FF17FCAC007F17F8A26D150F
+A2003F17F0A26C6CED1FE0A36C6CED3FC00007027C14804AB4FC3C03F80383807F003B01
+FC0701C0FEEC0E002600FE0CEBE1FC017FEC63F8D93F8CEB77F0D91FCCEB3FE0D907EE14
+806DB449C7FC0100D981FC130CEC1FFF0203131C91C7001E131C161F183CEF807CEFC0F8
+EE0FFFA318F08218E07013C07013809338007E00364B7BBA41>I<B612FEEDFFE016F800
+0190388007FE6C90C76C7EEE3FC0707E707E707EA2707EA283A65FA24C5AA24C5A4C5AEE
+3F8004FFC8FCED07FC91B512E05E9138000FF0ED03F8ED00FE82707E707EA2161F83A583
+A6F00180A217F8160F1803486D01071400B66D6C5A04011306933800FE0ECAEA3FFCEF07
+F0393B7DB83D>I<D90FF813C090383FFE0190B512813903F807E33907E000F74848137F
+4848133F48C7121F003E140F007E1407A2007C140312FC1501A36C1400A37E6D14006C7E
+7F13F86CB47E6C13F8ECFF806C14E06C14F86C14FEC680013F1480010714C0EB007F0207
+13E0EC007FED3FF0151F150FED07F8A200C01403A21501A37EA216F07E15036C15E06C14
+076C15C06C140F6DEB1F80D8FBF0EB3F00D8F0FE13FE39E03FFFF8010F13E0D8C00190C7
+FC253D7CBA2E>I<003FB812E0A3D9C003EB001F273E0001FE130348EE01F00078160000
+701770A300601730A400E01738481718A4C71600B3B0913807FF80011FB612E0A335397D
+B83C>I<B6903807FFFEA3000101809038007FE06C90C8EA1F80EF0F001706B3B2170E6D
+150C80171C133F17186D6C14385F6D6C14F06D6C5C6D6C495A6D6CEB07806D6C49C7FC91
+387F807E91381FFFF8020713E09138007F80373B7DB83E>I<B500FC91387FFF80A30003
+018091380FFC006C90C8EA07E0715A6C705A6E1403017F93C7FCA280013F1506A26E140E
+011F150C80010F5DA28001075DA26E147001031560A26D6C5CA2806D4A5AA2ED8003027F
+91C8FCA291383FC006A215E0021F5BA2EDF01C020F1318A26E6C5AA215FC02035BA2EDFE
+E002015BA26E6C5AA36FC9FCA3153EA2151CA3393B7EB83E>I<007FB590383FFFFCA3C6
+01F801071380D97FE0D903FCC7FC013FEC01F06D6C5C5F6D6C5C6D6C13034CC8FC6D6C13
+06160E6D6C5B6DEB8018163891387FC0306E6C5A16E06E6C5A91380FF18015FB6EB4C9FC
+5D14036E7EA26E7F6F7EA24B7E15DF9138019FF09138038FF8150F91380607FC91380E03
+FE140C4A6C7EEC38000230804A6D7E14E04A6D7E49486D7E130391C76C7E01066E7E130E
+010C6E7E011C1401013C8101FE822607FF80010713E0B500E0013FEBFF80A339397EB83E
+>88 D<B500FE91383FFFE0A3000301E0913807FE00C649EC03F0017F6F5A606D6C5D6D6C
+140395C7FC6D6C1406A26D6C5C6D6C141C17186D6C143817306D6D5B6E6C13E05F91383F
+E0015F91381FF003DA0FF890C8FC1606913807FC0E160C913803FE1C913801FF185E6E13
+B016E0157F6F5AB3A24B7E023FB512C0A33B397FB83E>I<003FB7FCA39039FC0001FE01
+C0130349495A003EC7FC003C4A5A5E0038141F00784A5A12704B5A5E006014FF4A90C7FC
+A24A5A5DC712074A5AA24A5A5D143F4A5AA24A5A92C8FC5B495AA2495A5C130F4948EB01
+80A2495A5C137F495A16034890C7FC5B1203485AEE0700485A495C001F5D48485C5E4848
+495A49130FB8FCA329397BB833>I<007FB81280B912C0A26C17803204797041>95
+D<EB1FE0EBFFFC3803E03F3907000F80390F8007E0486C6C7E13E06E7EA26E7E6C5A6C5A
+C8FCA4147FEB07FFEB3FE0EBFE00EA03F8EA0FF0EA1FC0123F485A90C7FC160C12FEA314
+01A26C13036CEB077C903980063E18383FC01E3A0FE0781FF03A03FFF00FE03A007F8007
+C026277DA52A>97 D<EA03F012FFA3120F1203B0EC1FE0EC7FF89038F1E03E9039F3801F
+809039F7000FC001FEEB07E049EB03F049EB01F85BED00FCA216FEA2167E167FAA167E16
+FEA216FC15016D14F8ED03F07F01EEEB07E001C6EB0FC09039C7801F00903881E07E9038
+00FFF8C7EA1FC0283B7EB92E>I<EB03FC90381FFF8090387E03E03901F80070484813F8
+3907E001FC380FC003A2EA1F80123F90380001F848EB00F01500A2127E12FEAA127E127F
+A26C14067F001F140E6D130C000F141C6C6C13386C6C13706C6C13E039007C07C090381F
+FF00EB07F81F277DA525>I<ED0FC0EC03FFA3EC003F150FB0EB03F8EB1FFF90387E078F
+9038F801EF3903F0007F4848133F4848131FA24848130F123F90C7FC5AA2127E12FEAA12
+7E127FA27EA26C6C131FA26C6C133F6C6C137F6C6CEBEFF03A01F801CFFF39007C078F90
+381FFE0FD907F813C0283B7DB92E>I<EB07F8EB1FFF90387C0FC03901F803E03903F001
+F0D807E013F8380FC0004848137CA248C7127E153E5A153F127E12FEA3B7FCA248C8FCA5
+127EA2127FA26C14037F001F14076C6C13060007140E6D131CD801F013386C6C13709038
+7E03E090381FFF80903803FC0020277EA525>I<147E903803FF8090380FC1E0EB1F8790
+383F0FF0137EA213FCA23901F803C091C7FCADB512FCA3D801F8C7FCB3AB487E387FFFF8
+A31C3B7FBA19>I<ED03F090390FF00FF890393FFC3C3C9039F81F707C3901F00FE03903
+E007C03A07C003E010000FECF000A248486C7EA86C6C485AA200075C6C6C485A6D485A6D
+48C7FC38073FFC38060FF0000EC9FCA4120FA213C06CB512C015F86C14FE6CECFF804815
+C03A0F80007FE048C7EA0FF0003E140348140116F8481400A56C1401007C15F06CEC03E0
+003F1407D80F80EB0F80D807E0EB3F003901FC01FC39007FFFF0010790C7FC26387EA52A
+>I<EA03F012FFA3120F1203B0EC0FF0EC3FFCECF03F9039F1C01F809039F3800FC0EBF7
+0013FE496D7EA25BA35BB3A3486C497EB500C1B51280A3293A7EB92E>I<EA0380EA0FE0
+487EA56C5AEA0380C8FCAAEA03F012FFA312071203B3AA487EB512C0A312387EB717>I<
+EB01C0EB07F0EB0FF8A5EB07F0EB01C090C7FCAAEB01F813FFA313071301B3B3A2123C12
+7E00FF13F01303A214E038FE07C0127C383C0F00EA0FFEEA03F8154984B719>I<EA03F0
+12FFA3120F1203B1913801FFFCA39138007FC01600157C15705D4A5A4A5A4AC7FC141E14
+38147814FC13F1EBF3FEEBF73F01FE7FEBF81F496C7E8114076E7E6E7E811400157E157F
+811680ED1FC0486CEB3FF0B500C0B5FCA3283A7EB92C>I<EA03F012FFA3120F1203B3B3
+AD487EB512C0A3123A7EB917>I<2703F00FF0EB1FE000FFD93FFCEB7FF8913AF03F01E0
+7E903BF1C01F83803F3D0FF3800FC7001F802603F70013CE01FE14DC49D907F8EB0FC0A2
+495CA3495CB3A3486C496CEB1FE0B500C1B50083B5FCA340257EA445>I<3903F00FF000
+FFEB3FFCECF03F9039F1C01F803A0FF3800FC03803F70013FE496D7EA25BA35BB3A3486C
+497EB500C1B51280A329257EA42E>I<EB03FE90380FFF8090383E03E09038F800F84848
+137C48487F48487F4848EB0F80001F15C090C712074815E0A2007EEC03F0A400FE15F8A9
+007E15F0A2007F14076C15E0A26C6CEB0FC0000F15806D131F6C6CEB3F006C6C137EC66C
+13F890387E03F090381FFFC0D903FEC7FC25277EA52A>I<3903F01FE000FFEB7FF89038
+F1E07E9039F3801F803A07F7000FC0D803FEEB07E049EB03F04914F849130116FC150016
+FEA3167FAA16FEA3ED01FCA26DEB03F816F06D13076DEB0FE001F614C09039F7803F0090
+38F1E07E9038F0FFF8EC1FC091C8FCAB487EB512C0A328357EA42E>I<D903F813C09038
+1FFE0190387E07819038FC01C33903F000E3000714774848133749133F001F141F485A15
+0F48C7FCA312FEAA127FA37E6D131F121F6D133F120F6C6C137F6C6C13EF3901F801CF39
+007E078F90381FFE0FEB07F890C7FCABED1FE00203B5FCA328357DA42C>I<3807E01F00
+FFEB7FC09038E1E3E09038E387F0380FE707EA03E613EE9038EC03E09038FC0080491300
+A45BB3A2487EB512F0A31C257EA421>I<EBFF03000313E7380F80FF381E003F487F487F
+00707F12F0A2807EA27EB490C7FCEA7FE013FF6C13E06C13F86C7F00037FC67F01071380
+EB007F141F00C0EB0FC01407A26C1303A37E15806C13077EEC0F00B4131E38F3C07C38E1
+FFF038C03F801A277DA521>I<1318A51338A31378A313F8120112031207001FB5FCB6FC
+A2D801F8C7FCB215C0A93800FC011580EB7C03017E13006D5AEB0FFEEB01F81A347FB220
+>I<D803F0EB07E000FFEB01FFA3000FEB001F00031407B3A4150FA3151F12016D133F00
+00EC77F86D9038E7FF8090383F03C790381FFF87903A03FC07E00029267EA42E>I<B538
+803FFEA33A0FF8000FF06C48EB07E00003EC03C06D148000011500A26C6C1306A26D130E
+017E130CA26D5BA2EC8038011F1330A26D6C5AA214E001075BA2903803F180A3D901FBC7
+FCA214FF6D5AA2147CA31438A227257EA32C>I<B53A1FFFE03FFEA3260FF8009038000F
+F86C48017EEB03E018C00003023EEB0180A26C6C013FEB0300A36C6CEC8006156FA2017E
+9038EFC00C15C7171CD93F01EBE01815830281EBF038D91F831430150102C3EBF8709026
+0FC6001360A2D907E66D5A02EC137CA2D903FCEB7F804A133FA2010192C7FC4A7FA20100
+141E4A130E0260130C37257EA33C>I<B538807FFFA33A03FE003FF00001EC1F80000092
+C7FC017E131C6D13186D6C5AECC070010F5B6D6C5AECF180EB03FB6DB4C8FC6D5AA2147F
+804A7E8114CF903801C7E090380383F090380703F8EB0601496C7E011C137E49137F0178
+7F496D7E486C80000FEC3FF0D8FFFE90B51280A329247FA32C>I<B538803FFEA33A0FF8
+000FF06C48EB07C00003EC03806C7E16007F00001406A2017E5BA2137F6D5BA26D6C5AA2
+ECC070010F1360A26D6C5AA214F101035BA2D901FBC7FCA214FF6D5AA2147CA31438A214
+30A214701460A25CA2EA7C0100FE5B130391C8FC1306EAFC0EEA701C6C5AEA1FF0EA0FC0
+27357EA32C>I<003FB512FCA2EB8003D83E0013F8003CEB07F00038EB0FE012300070EB
+1FC0EC3F800060137F150014FE495AA2C6485A495AA2495A495A495AA290387F000613FE
+A2485A485A0007140E5B4848130C4848131CA24848133C48C7127C48EB03FC90B5FCA21F
+247EA325>I E
+%EndDVIPSBitmapFont
+end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 600dpi
+TeXDict begin
+%%BeginPaperSize: Letter
+letter
+%%EndPaperSize
+
+%%EndSetup
+%%Page: 1 1
+1 0 bop 0 162 a Fg(11)17 b(11)h(T)249 180 y(E)295 162
+y(X)h(L)398 145 y Ff(A)435 162 y Fg(T)481 180 y(E)527
+162 y(X)0 353 y Fe(Using)54 b(Libical)p 0 467 3900 24
+v 0 580 a Fg(Eric)28 b(Busb)r(o)r(om)f(\(eric@soft)n(w)n
+(arestudio.org\))1921 b(Jan)n(uary)25 b(2000)0 1217 y
+Fd(1)131 b(In)l(tro)t(duction)0 1456 y Fg(Libical)23
+b(is)f(an)h(Op)r(en)g(Source)f(implemen)n(tation)h(of)g(the)g
+(iCalendar)f(proto)r(cols)f(and)i(proto)r(col)e(data)i(units.)35
+b(The)23 b(iCalendar)0 1570 y(sp)r(eci\034cation)k(describ)r(es)g(ho)n
+(w)f(calendar)g(clien)n(ts)i(can)f(comm)n(unicate)f(with)i(calendar)e
+(serv)n(ers)f(for)i(users)g(can)g(store)f(their)0 1683
+y(calendar)g(data)h(and)h(arrange)d(meetings)i(with)h(other)f(users.)0
+1840 y(Libical)g(implemen)n(ts)h(the)g(follo)n(wing)e(sp)r
+(eci\034cations)h(and)h(proto)r(cols)0 1996 y(iCal)f(Core)g(2445)e
+(iTIP)k(2446)c(iMIP)j(2447)e(iRIP)i(draft)g(CAP)g(draft)0
+2153 y(\(The)g(curren)n(t)f(v)n(ersion,)f(0.15,)g(do)r(es)h(not)h
+(implemen)n(t)g(iRip)g(or)e(CAP)-7 b(.)29 b(\))0 2309
+y(This)j(do)r(cumen)n(tation)g(assumes)g(that)g(y)n(ou)g(are)f
+(familiar)h(with)h(the)f(iCalendar)f(standards)g(RF)n(C2445)g(and)h(RF)
+n(C2446.)0 2423 y(these)c(sp)r(eci\034cations)e(are)h(online)g(on)h
+(the)g(CALSCH)g(w)n(ebpage)e(at:)p 0 2475 3900 4 v 0
+2617 a Fc(http://www.imc.o)o(rg)o(/ie)o(tf)o(-c)o(ale)o(nd)o(ar)o(/)p
+0 2776 V 0 2996 a Fb(1.1)112 b(The)38 b(libical)c(pro)6
+b(ject)0 3207 y Fg(This)29 b(co)r(de)g(is)g(under)g(activ)n(e)f(dev)n
+(elopmen)n(t.)40 b(If)30 b(y)n(ou)e(w)n(ould)h(lik)n(e)f(to)h(con)n
+(tribute)g(to)g(the)g(pro)5 b(ject,)29 b(y)n(ou)f(can)h(con)n(tact)f
+(me,)0 3320 y(Eric)g(Busb)r(o)r(om,)f(at)g(eric@soft)n(w)n
+(arestudio.org.)33 b(The)27 b(pro)5 b(ject)27 b(has)g(a)g(w)n(ebpage)g
+(at)332 3518 y(h)n(ttp://soft)n(w)n(arestudio.org/libical/index.h)n
+(tml)0 3716 y(and)g(a)h(mailing)f(list)g(that)h(y)n(ou)f(can)g(join)h
+(b)n(y)f(sending)g(the)h(follo)n(wing)f(mail:)p 0 3769
+V 0 3904 a Fc(To:)42 b(minimalist@softwa)o(re)o(st)o(udi)o(o.)o(or)o(g)
+0 4017 y(Subject:)e(subscribe)g(libical)p 0 4176 V 0
+4396 a Fb(1.2)112 b(License)0 4607 y Fg(The)60 b(co)r(de)f(and)h
+(data\034les)f(in)h(this)g(distribution)g(are)e(licensed)i(under)g(the)
+g(Mozilla)f(Public)h(License.)133 b(See)0 4720 y(h)n
+(ttp://www.mozilla.org/NPL/MPL-1.0.h)n(tml)37 b(for)j(a)h(cop)n(y)f(of)
+g(the)i(license.)76 b(Alternately)-7 b(,)44 b(y)n(ou)c(ma)n(y)g(use)g
+(libical)0 4834 y(under)32 b(the)g(terms)g(of)g(the)g(GNU)h(Library)d
+(General)h(Public)i(License.)50 b(See)32 b(h)n(ttp://www.fsf.org/cop)n
+(yleft/lesser.h)n(tml)0 4947 y(for)27 b(a)g(cop)n(y)g(of)g(the)h(LGPL.)
+0 5104 y(This)j(dual)g(license)f(ensures)h(that)g(the)g(library)f(can)g
+(b)r(e)i(incorp)r(orated)d(in)n(to)i(b)r(oth)g(proprietary)e(co)r(de)i
+(and)f(GPL'd)i(pro-)0 5217 y(grams,)23 b(and)h(will)h(b)r(ene\034t)g
+(from)f(impro)n(v)n(emen)n(ts)e(made)i(b)n(y)g(programmers)e(in)i(b)r
+(oth)h(realms.)34 b(I)25 b(will)f(only)g(accept)g(c)n(hanges)0
+5331 y(in)n(to)j(m)n(y)h(v)n(ersion)e(of)h(the)h(library)e(if)i(they)g
+(are)f(similarly)f(dual-licensed.)0 5615 y Fb(1.3)112
+b(Purp)s(ose)38 b(&)f(Goals)0 5844 y(1.4)112 b(Do)s(cumen)m(t)37
+b(v)m(ersion)0 6054 y Fg($Id:)g(UsingLibical.lyx,v)26
+b(1.4)h(2000/02/18)22 b(23:06:04)j(eric)i(Exp)h(eric)f($)0
+6386 y Fd(2)131 b(Building)46 b(the)e(Library)0 6624
+y Fg(Libical)37 b(uses)g(auto)r(conf)h(to)f(generate)f(mak)n(e\034les,)
+k(although)c(it)i(uses)g(none)f(of)h(the)g(auto)r(conf)f(\035ags)f(to)i
+(in\035uence)g(the)0 6738 y(compilation.)e(It)28 b(should)f(built)i
+(with)f(no)f(adjustmen)n(ts)h(on)f(Lin)n(ux,)g(F)-7 b(reeBSD)28
+b(and)f(Solaris.)0 7069 y Fd(3)131 b(Structure)0 7308
+y Fg(The)28 b(iCal)f(calendar)f(mo)r(del)i(is)f(based)g(on)h(four)f(t)n
+(yp)r(es)g(of)h(ob)5 b(jects:)36 b(comp)r(onen)n(ts,)27
+b(prop)r(erties,)g(v)-5 b(alues)27 b(and)g(parameters.)0
+7464 y(Prop)r(erties)32 b(are)f(the)i(fundamen)n(tal)f(unit)i(of)e
+(information)g(in)g(iCal,)i(and)e(they)g(w)n(ork)f(a)h(bit)h(lik)n(e)f
+(a)g(hash)g(en)n(try)-7 b(,)34 b(with)e(a)0 7578 y(constan)n(t)21
+b(k)n(ey)h(and)g(a)f(v)-5 b(ariable)21 b(v)-5 b(alue.)35
+b(Prop)r(erties)21 b(ma)n(y)h(also)f(ha)n(v)n(e)g(mo)r(di\034ers,)h
+(called)g(parameters.)33 b(In)22 b(the)h(iCal)f(con)n(ten)n(t)0
+7691 y(line)p 0 7728 V 0 7863 a Fc(ORGANIZER;ROLE=C)o(HA)o(IR:)o(MA)o
+(IL)o(TO:)o(mr)o(bi)o(g@h)o(os)o(t.)o(com)p eop
+%%Page: 2 2
+2 1 bop 0 -167 3900 5 v 0 -200 a Fa(4.)73 b(Di\033erences)31
+b(F)-8 b(rom)31 b(RF)m(Cs)2732 b Fg(2)p 0 162 3900 4
+v 0 312 a(The)34 b(prop)r(ert)n(y)f(name)h(is)g("OR)n(GANIZER,")g(the)g
+(v)-5 b(alue)34 b(of)h(the)f(prop)r(ert)n(y)f(is)h("mrbig@host.com")e
+(and)i(the)g("R)n(OLE")0 425 y(parameter)26 b(sp)r(eci\034es)h(that)h
+(Mr)g(Big)f(is)g(the)h(c)n(hair)e(of)i(the)g(meetings)f(asso)r(ciated)f
+(with)i(this)g(prop)r(ert)n(y)-7 b(.)0 582 y(Comp)r(onen)n(ts)26
+b(are)f(groups)g(of)h(prop)r(erties)f(that)i(represen)n(t)e(the)i(core)
+e(ob)5 b(jects)26 b(of)g(a)g(calendar)f(system,)h(suc)n(h)g(as)g(ev)n
+(en)n(ts)f(or)0 695 y(timezones.)0 852 y(The)k(cen)n(tral)f(goal)g(of)h
+(libical)g(is)g(to)g(parse)f(iTIP)i(data)e(in)n(to)h(an)g(in)n(ternal)f
+(represen)n(tation)g(of)h(Comp)r(onen)n(ts,)g(Prop)r(erties,)0
+965 y(P)n(arameters)d(an)h(V)-7 b(alues,)27 b(and)h(to)f(allo)n(w)g
+(the)h(user)f(to)g(manipulate)g(the)h(data)g(in)f(v)-5
+b(arious)27 b(w)n(a)n(ys)0 1257 y Fb(3.1)112 b(Comp)s(onen)m(ts)0
+1486 y(3.2)g(Prop)s(erties)0 1715 y(3.3)g(V)-9 b(alues)0
+1944 y(3.4)112 b(P)m(arameters)0 2173 y(3.5)g(En)m(umerations)0
+2402 y(3.6)g(T)m(yp)s(es)0 2631 y(3.7)g(The)38 b(P)m(arser)0
+2860 y(3.8)112 b(Restrictions)0 3089 y(3.9)g(Memory)37
+b(Managemen)m(t)0 3356 y Fd(4)131 b(Di\033erences)44
+b(F)-11 b(rom)43 b(RF)l(Cs)0 3594 y Fg(Libical)c(has)f(b)r(een)h
+(designed)g(to)f(follo)n(w)h(the)g(standards)e(as)i(closely)f(as)g(p)r
+(ossible,)j(so)e(that)g(the)g(k)n(ey)f(ob)5 b(jects)39
+b(in)g(the)0 3708 y(standards)30 b(are)g(also)g(k)n(eey)g(ob)5
+b(jects)31 b(in)h(the)f(library)-7 b(.)47 b(Ho)n(w)n(ev)n(er,)30
+b(there)h(are)f(a)h(few)g(areas)e(where)i(the)h(sp)r(eci\034cations)e
+(are)0 3821 y(\(arguably\))g(irregular,)h(and)g(follo)n(wing)g(them)h
+(exactly)f(w)n(ould)g(result)h(in)g(an)f(unfriendly)h(in)n(terface.)49
+b(These)31 b(deviations)0 3935 y(mak)n(e)c(libical)g(easier)f(to)i(use)
+f(b)n(y)h(main)n(taining)e(a)h(self-similar)g(in)n(terface.)0
+4227 y Fb(4.1)112 b(Pseudo)38 b(Comp)s(onen)m(ts)0 4437
+y Fg(Libical)g(de\034nes)g(comp)r(onen)n(ts)g(for)g(groups)f(of)i(prop)
+r(erties)e(that)i(lo)r(ok)e(and)i(act)f(lik)n(e)g(comp)r(onen)n(ts,)i
+(but)f(are)f(not)g(de-)0 4550 y(\034ned)c(as)f(comp)r(onen)n(ts)g(in)h
+(the)g(sp)r(eci\034cation.)54 b(XD)n(A)-7 b(YLIGHT)35
+b(and)e(XST)-7 b(AND)n(ARD)36 b(are)c(notable)h(examples.)54
+b(These)0 4664 y(pseudo)23 b(comp)r(onen)n(ts)g(group)g(prop)r(erties)g
+(within)h(the)g(VTIMEZONE)h(comp)r(onen)n(ts.)35 b(XD)n(A)-7
+b(YLIGHT)25 b(starts)d(with)j("BE-)0 4777 y(GIN:D)n(A)-7
+b(YLIGHT")35 b(and)f(ends)g(with)g("END:D)n(A)-7 b(YLIGHT,)36
+b(just)e(lik)n(e)g(other)f(comp)r(onen)n(ts,)i(but)g(is)f(not)g
+(de\034ned)g(as)f(a)0 4891 y(comp)r(onen)n(t)27 b(in)h(RF)n(C2445.)35
+b(\()28 b(See)f(RF)n(C2445,)f(page)h(61)f(\))i(In)g(Libical,)f(it)h(is)
+g(a)f(comp)r(onen)n(t.)0 5047 y(There)35 b(are)g(also)g(pseudo)h(comp)r
+(onen)n(ts)f(that)i(are)e(conceptually)g(deriv)n(ed)g(classess)f(of)i
+(V)-9 b(ALARM.)37 b(RF)n(C2446)d(de\034nes)0 5161 y(what)d(prop)r
+(erties)f(ma)n(y)g(b)r(e)h(included)g(in)g(eac)n(h)f(comp)r(onen)n(t,)i
+(and)e(for)h(V)-9 b(ALARM,)31 b(the)g(set)g(of)g(prop)r(erties)f(it)h
+(ma)n(y)f(ha)n(v)n(e)0 5275 y(dep)r(ends)e(on)f(the)h(v)-5
+b(alue)28 b(of)f(the)h(A)n(CTION)f(prop)r(ert)n(y)-7
+b(.)0 5431 y(F)g(or)19 b(instance,)j(if)e(a)g(V)-9 b(ALARM)20
+b(comp)r(onen)n(t)g(has)f(an)h(A)n(CTION)g(prop)r(ert)n(y)e(with)j(the)
+f(v)-5 b(alue)20 b(of)g("A)n(UDIO,")f(the)h(comp)r(onen)n(t)0
+5545 y(m)n(ust)h(also)g(ha)n(v)n(e)f(an)h("A)-7 b(TT)g(A)n(CH")21
+b(prop)r(ert)n(y)-7 b(.)34 b(Ho)n(w)n(ev)n(er,)20 b(if)i(the)g(A)n
+(CTION)f(v)-5 b(alue)21 b(is)g("DISPLA)-7 b(Y,")22 b(the)g(comp)r(onen)
+n(t)f(m)n(ust)0 5658 y(ha)n(v)n(e)26 b(a)i(DESCRIPTION)g(prop)r(ert)n
+(y)-7 b(.)p eop
+%%Page: 3 3
+3 2 bop 0 -167 3900 5 v 0 -200 a Fa(5.)73 b(Implemen)m(tation)29
+b(Limitations)2539 b Fg(3)0 162 y(T)-7 b(o)28 b(handle)g(these)g(v)-5
+b(arious,)27 b(complex)h(restrictions,)f(libical)h(has)g(pseudo)g(comp)
+r(onen)n(ts)f(for)h(eac)n(h)f(t)n(yp)r(e)i(of)f(alarm:)37
+b(XA)n(U-)0 275 y(DIO)n(ALARM,)28 b(XDISPLA)-7 b(Y)g(ALARM,)30
+b(XEMAILALARM)f(and)f(XPR)n(OCEDUREALARM.)0 567 y Fb(4.2)112
+b(Com)m(bined)37 b(V)-9 b(alues)0 777 y Fg(Man)n(y)34
+b(v)-5 b(alues)34 b(can)g(tak)n(e)g(more)g(than)g(one)h(t)n(yp)r(e.)58
+b(TRIGGER,)35 b(for)f(instance,)i(can)e(ha)n(v)n(e)g(a)g(v)-5
+b(alue)34 b(t)n(yp)r(e)h(of)g(with)g(DU-)0 890 y(RA)-7
+b(TION)32 b(or)f(of)h(D)n(A)-7 b(TE-TIME.)33 b(These)f(m)n(ultiple)g(t)
+n(yp)r(es)g(mak)n(e)f(it)i(di\036cult)g(to)e(create)g(routines)h(to)f
+(return)h(the)g(v)-5 b(alue)0 1004 y(asso)r(ciated)26
+b(with)i(a)f(prop)r(ert)n(y)-7 b(.)0 1161 y(It)30 b(is)g(natural)g(to)f
+(ha)n(v)n(e)g(in)n(terfaces)g(that)i(w)n(ould)e(return)h(the)g(v)-5
+b(alue)30 b(of)g(a)g(prop)r(ert)n(y)-7 b(,)29 b(but)i(it)f(is)g(cum)n
+(b)r(ersone)f(for)h(a)g(single)0 1274 y(routine)i(to)g(return)g(m)n
+(ultiple)h(t)n(yp)r(es.)51 b(So,)33 b(in)g(libical,)g(prop)r(erties)e
+(that)i(can)f(ha)n(v)n(e)f(m)n(ultiple)i(t)n(yp)r(es)f(are)f(giv)n(en)h
+(a)g(single)0 1388 y(t)n(yp)r(e)26 b(that)g(is)g(the)g(union)g(of)g
+(their)g(RF)n(C2445)e(t)n(yp)r(es.)36 b(F)-7 b(or)26
+b(instance,)g(in)g(libical,)g(the)g(v)-5 b(alue)26 b(of)g(the)g
+(TRIGGER)h(prop)r(ert)n(y)0 1501 y(resolv)n(es)e(to)j(struct)f
+(icaltriggert)n(yp)r(e.)35 b(This)28 b(t)n(yp)r(e)f(is)h(a)f(union)h
+(of)f(a)g(DURA)-7 b(TION)29 b(and)e(a)g(D)n(A)-7 b(TE-TIME.)0
+1793 y Fb(4.3)112 b(Multi-V)-9 b(alued)36 b(Prop)s(erties)0
+2003 y Fg(Some)31 b(prop)r(erties,)h(suc)n(h)f(as)g(CA)-7
+b(TEGORIES)33 b(ha)n(v)n(e)d(only)h(one)g(v)-5 b(alue)32
+b(t)n(yp)r(e,)h(but)f(eac)n(h)e(CA)-7 b(TEGORIES)33 b(prop)r(ert)n(y)d
+(can)0 2116 y(ha)n(v)n(e)24 b(m)n(ultiple)h(v)-5 b(alue)25
+b(instances.)35 b(This)25 b(also)f(results)g(in)h(a)g(cum)n(b)r(ersome)
+f(in)n(terface)g(\025)g(CA)-7 b(TEGORIES)26 b(accessors)d(w)n(ould)0
+2230 y(ha)n(v)n(e)k(to)i(return)f(a)g(list)g(while)h(all)f(other)g
+(accessors)e(returned)i(a)g(single)g(v)-5 b(alue.)39
+b(In)29 b(libical,)g(all)f(prop)r(erties)f(ha)n(v)n(e)h(a)g(single)0
+2344 y(v)-5 b(alue,)35 b(and)e(m)n(ulti-v)-5 b(alued)33
+b(prop)r(erties)f(are)h(brok)n(en)f(do)n(wn)g(in)n(to)h(m)n(ultiple)h
+(single)f(v)-5 b(alued)33 b(prop)r(erties)g(during)f(parsing.)0
+2457 y(That)c(is,)f(an)g(input)i(line)e(lik)n(e,)p 0
+2526 3900 4 v 0 2703 a Fc(CATEGORIES:)39 b(work,)i(home)p
+0 2903 V 0 3053 a Fg(b)r(ecomes)27 b(in)h(libical's)f(in)n(ternal)g
+(represen)n(tation)p 0 3122 V 0 3299 a Fc(CATEGORIES:)39
+b(work)0 3412 y(CATEGORIES:)g(home)p 0 3612 V 0 3767
+a Fg(Oddly)-7 b(,)34 b(RF)n(C2445)d(allo)n(ws)g(some)h(m)n(ulti-v)-5
+b(alued)33 b(prop)r(erties)f(\()h(lik)n(e)g(FREEBUSY)h(\))f(to)g(exist)
+g(as)f(b)r(oth)h(a)f(m)n(ulti-v)-5 b(alues)0 3881 y(prop)r(ert)n(y)24
+b(and)h(as)f(m)n(ultiple)h(single)g(v)-5 b(alue)24 b(prop)r(erties,)h
+(while)g(others)f(\()i(lik)n(e)e(CA)-7 b(TEGORIES)26
+b(\))f(can)g(only)g(exist)f(as)h(single)0 3994 y(m)n(ulti-v)-5
+b(alued)32 b(prop)r(erties.)48 b(This)31 b(mak)n(es)g(the)h(in)n
+(ternal)f(represen)n(tation)e(for)i(CA)-7 b(TEGORIES)33
+b(illegal.)48 b(Ho)n(w)n(ev)n(er)30 b(when)0 4108 y(y)n(ou)d(con)n(v)n
+(ert)f(a)h(comp)r(onen)n(t)g(to)h(a)f(string,)g(the)h(library)e(will)i
+(collect)f(all)g(of)h(the)g(CA)-7 b(TEGORIES)28 b(prop)r(erties)f(in)n
+(to)g(one.)0 4446 y Fd(5)131 b(Implemen)l(tation)44 b(Limitations)0
+4742 y(6)131 b(Using)44 b(libical)0 4999 y Fb(6.1)112
+b(Creating)37 b(Comp)s(onen)m(ts)0 5209 y Fg(There)e(are)g(three)h(w)n
+(a)n(ys)e(to)i(create)e(comp)r(onen)n(ts)i(in)g(Libical:)53
+b(creating)34 b(individual)i(ob)5 b(jects)35 b(and)h(assem)n(bling)e
+(them,)0 5323 y(building)28 b(en)n(tire)f(ob)5 b(jects)27
+b(in)h(massiv)n(e)e(v)-5 b(aargs)26 b(calls,)h(and)g(parsing)f(a)h
+(text)h(\034le)g(con)n(taining)e(iCalendar)h(data.)p
+eop
+%%Page: 4 4
+4 3 bop 0 -167 3900 5 v 0 -200 a Fa(6.)73 b(Using)32
+b(libical)3190 b Fg(4)0 162 y Fa(6.1.1)94 b(Constructor)32
+b(In)m(terfaces)0 372 y Fg(Using)d(constructor)f(in)n(terfaces,)h(y)n
+(ou)f(create)h(eac)n(h)f(of)i(the)f(ob)5 b(jects)29 b(sep)r(erately)g
+(and)g(them)h(assem)n(ble)e(them)i(in)g(to)f(com-)0 485
+y(p)r(onen)n(ts:)p 0 555 3900 4 v 0 738 a Fc(event)41
+b(=)j(icalcomponent_n)o(ew)o(\(IC)o(AL)o(_V)o(EVE)o(NT)o(_C)o(OMP)o(ON)
+o(EN)o(T\);)0 852 y(icalcomponent_ad)o(d_)o(pro)o(pe)o(rt)o(y\(e)o(ve)o
+(nt)o(,)38 b(icalproperty_ne)o(w_)o(dts)o(ta)o(mp)o(\(at)o(im)o(e\))f
+(\);)0 965 y(icalcomponent_ad)o(d_)o(pro)o(pe)o(rt)o(y\(e)o(ve)o(nt)o
+(,ic)o(al)o(pr)o(ope)o(rt)o(y_)o(new)o(_u)o(id\()o(st)o(rd)o(up\()o("g)
+o(ui)o(d-1)o(.h)o(os)o(t1.)o(co)o(m")o(\)\))g(\);)0 1079
+y(property=icalpro)o(pe)o(rty)o(_n)o(ew)o(_or)o(ga)o(ni)o(zer)o(\(s)o
+(tr)o(dup)o(\(")o(mr)o(big)o(@h)o(ost)o(.c)o(om)o("\)\))o(;)0
+1192 y(icalproperty_add)o(_p)o(ara)o(me)o(te)o(r\(p)o(ro)o(pe)o(rty)o
+(,i)o(ca)o(lpa)o(ra)o(me)o(ter)o(_n)o(ew_)o(ro)o(le)o(\(IC)o(AL)o(_R)o
+(OLE)o(_C)o(HA)o(IR\))g(\);)0 1306 y(icalcomponent_ad)o(d_)o(pro)o(pe)o
+(rt)o(y\(e)o(ve)o(nt)o(,pr)o(op)o(er)o(ty\))o(;)p 0 1506
+V 0 1722 a Fa(6.1.2)94 b(v)-5 b(aargs)32 b(Constructors)0
+1932 y(6.1.3)94 b(P)m(arsing)32 b(T)-8 b(ext)32 b(Files)0
+2161 y Fb(6.2)112 b(A)m(ccessing)37 b(Comp)s(onen)m(ts)0
+2371 y Fa(6.2.1)94 b(Finding)30 b(Comp)s(onen)m(ts)0
+2582 y(6.2.2)94 b(Remo)m(ving)29 b(Comp)s(onen)m(ts)0
+2792 y Fg(Remo)n(ving)23 b(an)h(elemen)n(t)h(from)f(a)g(list)g(while)h
+(iterating)e(through)h(the)h(list)f(can)g(cause)g(problems,)g(since)g
+(y)n(ou)g(will)g(probably)0 2905 y(b)r(e)e(remo)n(ving)e(the)i(elemen)n
+(t)g(that)g(the)g(in)n(ternal)f(iterator)f(p)r(oin)n(ts)i(to.)34
+b(This)22 b(will)g(result)f(in)h(the)g(iteration)f(lo)r(op)h
+(terminating)0 3019 y(immediately)29 b(after)f(remo)n(ving)g(the)h
+(elemen)n(t.)41 b(T)-7 b(o)28 b(a)n(v)n(oid)g(the)h(problem,)f(y)n(ou)h
+(will)g(need)g(to)f(step)h(the)h(iterator)d(ahead)h(of)0
+3132 y(the)g(elemen)n(t)g(y)n(ou)e(are)h(going)f(to)i(remo)n(v)n(e,)e
+(lik)n(e)h(this:)p 0 3202 V 0 3385 a Fc(for\(c)41 b(=)j
+(icalcomponent_g)o(et)o(_fi)o(rs)o(t_)o(com)o(po)o(ne)o(nt\()o(pa)o(re)
+o(nt_)o(co)o(mp,)o(IC)o(AL)o(_AN)o(Y_)o(CO)o(MPO)o(NE)o(NT)o(\);)305
+3499 y(c)f(!=)g(0;)305 3612 y(c)g(=)g(next)0 3726 y({)174
+3839 y(next)f(=)h(icalcomponent_get)o(_n)o(ex)o(t_c)o(om)o(po)o(nen)o
+(t\()o(pa)o(ren)o(t_)o(com)o(p,)o(IC)o(AL_)o(AN)o(Y_)o(COM)o(PO)o(NE)o
+(NT\))o(;)174 3953 y(icalcomponent_rem)o(ov)o(e_)o(com)o(po)o(ne)o
+(nt\()o(pa)o(re)o(nt_)o(co)o(mp)o(,c\))o(;)0 4067 y(})p
+0 4267 V eop
+%%Page: 5 5
+5 4 bop 0 -167 3900 5 v 0 -200 a Fa(6.)73 b(Using)32
+b(libical)3190 b Fg(5)0 162 y Fa(6.2.3)94 b(Finding)30
+b(Prop)s(erties)0 372 y(6.2.4)94 b(Remo)m(ving)29 b(Prop)s(erties)0
+582 y(6.2.5)94 b(Getting)31 b(V)-8 b(alues)0 792 y(6.2.6)94
+b(Setting)31 b(V)-8 b(alues)0 1002 y(6.2.7)94 b(Getting)31
+b(P)m(arameters)0 1212 y(6.2.8)94 b(Setting)31 b(P)m(arameters)0
+1422 y(6.2.9)94 b(Remo)m(ving)29 b(P)m(arameters)0 1632
+y(6.2.10)93 b(Chec)m(king)32 b(Comp)s(onen)m(t)e(V)-8
+b(alidit)m(y)0 1861 y Fb(6.3)112 b(Storing)37 b(Ob)6
+b(jects)0 2071 y Fg(The)27 b(libical)g(distribution)h(inclues)f(a)g
+(sep)r(erate)f(library)-7 b(,)26 b(libicalss,)h(that)g(allo)n(ws)f(y)n
+(ou)g(to)i(store)e(iCal)h(comp)r(onen)n(t)g(data)f(to)0
+2185 y(disk)h(in)h(a)f(v)-5 b(ariet)n(y)27 b(of)h(w)n(a)n(ys.)35
+b(This)27 b(library)g(is)g(do)r(cumen)n(ted)h(sep)r(erately)-7
+b(.)0 2476 y Fb(6.4)112 b(Memory)37 b(Managemen)m(t)0
+2686 y Fg(Libical)25 b(relies)f(hea)n(vily)g(on)h(dynamic)g(allo)r
+(cation)f(for)h(b)r(oth)h(the)f(core)f(ob)5 b(jects)25
+b(and)g(for)f(the)i(strings)e(used)h(to)g(hold)g(v)-5
+b(alues.)0 2800 y(Some)34 b(of)f(this)h(memory)f(the)h(library)f
+(caller)g(o)n(wns)g(and)g(m)n(ust)h(free,)h(and)f(some)f(of)h(the)g
+(memory)f(is)h(managed)e(b)n(y)i(the)0 2914 y(library)-7
+b(.)36 b(Here)27 b(is)g(a)g(summary)g(of)h(the)g(memory)e(rules.)0
+3153 y Fa(1\))208 3300 y Fg(If)k(the)g(function)g(name)g(has)f
+Fc(")p Fg(new)p Fc(")g Fg(in)h(it,)h(the)f(caller)f(gets)g(con)n(trol)g
+(of)h(the)g(memory)-7 b(.)42 b(\()31 b(suc)n(h)e(as)g(icalcomp)r(onen-)
+208 3413 y(t_new\(\),)f(or)e(icalprop)r(ert)n(y_new_clone\(\))f(\))0
+3593 y Fa(2\))208 3740 y Fg(If)j(y)n(ou)g(got)g(the)h(memory)f(from)g
+(a)g(routine)g(with)h(new)f(in)h(it,)g(y)n(ou)f(m)n(ust)h(call)f(the)h
+(corresp)r(onding)d(*_free)i(routine)208 3854 y(to)f(free)g(the)h
+(memory)-7 b(.)36 b(\()28 b(Use)g(icalcomp)r(onen)n(t_free\(\))e(to)i
+(free)f(ob)5 b(jects)27 b(created)g(with)h(icalcomp)r(onen)n
+(t_new\(\)\))0 4034 y Fa(3\))208 4181 y Fg(If)h(the)g(function)g(name)f
+(has)g Fc(")p Fg(add)p Fc(")g Fg(in)h(it,)g(the)g(caller)e(is)i
+(transfering)e(con)n(trol)g(of)i(the)g(memory)f(to)g(the)h(routine.)40
+b(\()208 4294 y(icalprop)r(ert)n(y_add_parameter\(\))23
+b(\))0 4474 y Fa(4\))208 4621 y Fg(If)29 b(the)h(function)g(name)f(has)
+g Fc(")p Fg(remo)n(v)n(e)p Fc(")e Fg(in)j(it,)g(the)g(caller)f(passes)f
+(in)i(a)f(p)r(oin)n(ter)g(to)g(an)g(ob)5 b(ject)29 b(and)h(after)f(the)
+g(call)208 4735 y(returns,)j(the)h(caller)e(o)n(wns)g(the)h(ob)5
+b(ject.)50 b(So,)33 b(b)r(efore)f(y)n(ou)f(call)h(icalcomp)r(onen)n
+(t_remo)n(v)n(e_prop)r(ert)n(y\(comp,fo)r(o\),)208 4848
+y(y)n(ou)26 b(do)i(not)f(o)n(wn)g Fc(")p Fg(fo)r(o)p
+Fc(")g Fg(and)g(after)g(the)h(call)f(returns,)g(y)n(ou)g(do.)0
+5028 y Fa(5\))208 5175 y Fg(If)d(the)g(routine)f(returns)g(a)g(string,)
+h(libical)g(o)n(wns)f(the)h(memory)f(and)g(will)h(put)g(it)h(on)e(a)g
+(ring)g(bu\033er)h(to)g(reclaim)f(later.)208 5288 y(Y)-7
+b(ou'd)27 b(b)r(etter)h(strdup\(\))g(it)g(if)g(y)n(ou)f(w)n(an)n(t)g
+(to)h(k)n(eep)f(it,)h(and)f(y)n(ou)g(don't)h(ha)n(v)n(e)e(to)h(delete)h
+(it.)0 5580 y Fb(6.5)112 b(Error)36 b(Handling)0 5790
+y Fg(icalerror_errno.)c(Return)c(v)-5 b(alues.)37 b(#de\034nes.)g
+(icalerror_stop_here)p eop
+%%Page: 6 6
+6 5 bop 0 -167 3900 5 v 0 -200 a Fa(7.)73 b(Useful)32
+b(Recipies)3067 b Fg(6)0 162 y Fa(6.5.1)94 b(Return)31
+b(v)-5 b(alues)0 372 y(6.5.2)94 b(icalerrno)0 582 y(6.5.3)g(Comp)s
+(onen)m(t)29 b(errors)0 811 y Fb(6.6)112 b(Naming)36
+b(Standard)0 1021 y Fg(Structures)26 b(that)i(y)n(ou)e(access)f(with)j
+(the)f("struct")f(k)n(eyw)n(ord,)f(suc)n(h)h(as)h("struct)f(icaltimet)n
+(yp)r(e")g(are)g(things)h(that)g(y)n(ou)f(are)0 1134
+y(allo)n(w)n(ed)g(to)i(see)f(inside)g(and)h(p)r(ok)n(e)f(at.)0
+1291 y(Structures)33 b(that)h(y)n(ou)e(access)g(though)i(a)f(t)n(yp)r
+(edef,)i(suc)n(h)e(as)g("icalcomp)r(onen)n(t")e(are)i(things)g(where)g
+(all)g(of)h(the)f(data)g(is)0 1405 y(hidden.)0 1561 y(Comp)r(onen)n(t)
+28 b(names)g(that)h(start)f(with)h("V")f(are)f(part)h(of)h(RF)n(C)f
+(2445)f(or)g(another)h(iCal)g(standard.)38 b(Comp)r(onen)n(t)29
+b(names)0 1675 y(that)h(start)f(with)i("X")e(are)g(also)g(part)g(of)h
+(the)g(sp)r(ec,)g(but)h(they)f(are)f(not)h(actually)f(comp)r(onen)n(ts)
+g(in)h(the)g(sp)r(ec.)44 b(Ho)n(w)n(ev)n(er,)0 1788 y(they)34
+b(lo)r(ok)f(and)g(act)h(lik)n(e)f(comp)r(onen)n(ts,)h(so)f(they)h(are)f
+(comp)r(onen)n(ts)g(in)h(libical.)55 b(Names)33 b(that)h(start)f(with)h
+("XLIC")f(or)0 1902 y("X-LIC")26 b(are)h(not)h(part)f(of)g(an)n(y)g
+(iCal)g(sp)r(ec.)37 b(They)27 b(are)g(used)h(in)n(ternally)e(b)n(y)i
+(libical.)0 2058 y(En)n(ums)d(that)f(iden)n(tify)h(a)f(comp)r(onen)n
+(t,)h(prop)r(ert)n(y)-7 b(,)24 b(v)-5 b(alue)24 b(or)g(parameter)e(end)
+j(with)g("_COMPONENT,")e("_PR)n(OPER-)0 2172 y(TY,")k("_V)-9
+b(ALUE,")28 b(or)e("_P)-7 b(AAMETER"s)0 2328 y(En)n(ums)31
+b(that)f(iden)n(tify)h(a)f(parameter)f(v)-5 b(alue)30
+b(ha)n(v)n(e)f(the)i(name)f(of)h(the)f(parameter)f(as)h(the)h(second)e
+(w)n(ord.)45 b(F)-7 b(or)29 b(instance:)0 2442 y(ICAL_R)n(OLE_REQP)-7
+b(AR)g(TICIP)g(ANT)29 b(or)d(ICAL_P)-7 b(AR)g(TST)g(A)g(T_A)n(CCEPTED.)
+0 2598 y(The)28 b(en)n(ums)f(for)g(the)h(parts)f(of)g(a)g(recurarance)e
+(rule)j(and)f(request)g(statuses)g(are)f(irregular.)0
+2937 y Fd(7)131 b(Useful)44 b(Recipies)0 3175 y Fg(Iteration)0
+3332 y(Cop)n(ying)26 b(comp)r(onen)n(ts.)37 b(Remem)n(b)r(er)27
+b(that)h(y)n(ou)f(m)n(ust)g(clone)g(or)g(remo)n(v)n(e)f(an)h(ob)5
+b(ject)28 b(b)r(efore)f(putting)h(in)g(on)f(anothr)g(list.)0
+3488 y(Finding)h(compliance)f(errors)0 3827 y Fd(8)131
+b(P)l(erformance)0 4065 y Fg(Chec)n(king)27 b(restrictions)f(is)h
+(computationally)g(exp)r(ensiv)n(e)0 4404 y Fd(9)131
+b(Hac)l(ks)45 b(and)e(Bugs)p eop
+%%Trailer
+end
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/libical/doc/UsingLibical.sgml b/libical/doc/UsingLibical.sgml
new file mode 100644
index 0000000000..d967bd860c
--- /dev/null
+++ b/libical/doc/UsingLibical.sgml
@@ -0,0 +1,318 @@
+<!doctype linuxdoc system>
+
+<!-- LinuxDoc file was created by LyX 1.0 (C) 1995-1999 by <eric> Wed Jan 5 22:30:06 2000
+ -->
+ <article>
+ <title>
+Using Libical
+ </title>
+ <author>
+Eric Busboom (eric@softwarestudio.org)
+ </author>
+ <date>
+January 2000
+ </date>
+ <sect>
+Introduction
+ <p>
+Libical is an Open Source implementation of the iCalendar protocols and
+ protocol data units. The iCalendar specification describes how calendar clients
+ can communicate with calendar servers for users can store their calendar data
+ and arrange meetings with other users.
+ </p>
+ <p>
+Libical implements the following specifications and protocols
+ </p>
+ <p>
+iCal Core
+2445
+iTIP
+2446
+iMIP
+2447
+iRIP
+draft
+CAP
+draft
+ </p>
+ <p>
+(The current version, 0.14, does not implement iRip or CAP. )
+ </p>
+ <p>
+This code is under active development. If you would like to contribute
+ to the project, you can contact me, Eric Busboom, at eric@softwarestudio.org.
+ The project has a webpage at
+ </p>
+ <p>
+ <quote>
+http://softwarestudio.org/libical/index.html
+ </quote>
+</p> <p>
+and a mailing list that you can join by sending the following mail:
+ </p>
+ <p>
+ <code>
+------------
+To: minimalist@softwarestudio.org
+Subject: subscribe libical
+------------
+ </code>
+</p> <p>
+&dollar;Id: UsingLibical.lyx,v 1.3 2000/01/06 06:20:06 eric Exp eric &dollar;
+ </p>
+ <sect1>
+License
+ <p>
+The code and datafiles in this distribution are licensed under the Mozilla
+ Public License. See http://www.mozilla.org/NPL/MPL-1.0.html for a copy of the
+ license. Alternately, you may use libical under the terms of the GNU Library
+ General Public License. See http://www.fsf.org/copyleft/lesser.html for a copy
+ of the LGPL.
+ </p>
+ <p>
+This dual license ensures that the library can be incorporated into both
+ proprietary code and GPL'd programs, and will benefit from improvements made
+ by programmers in both realms. I will only accept changes into my version of
+ the library if they are similarly dual-licensed.
+ </p>
+ <sect1>
+Purpose &amp; Goals
+ <sect>
+Building the Library
+ <sect>
+Structure
+ <p>
+The iCal calendar model is based on four types of objects: components,
+ properties, values and parameters.
+ </p>
+ <p>
+Components are the fundamental grouping of calendar information
+ </p>
+ <p>
+Properties are the fundamental unit of information. Each property is composed
+ of a type, a value and collection of parameters.
+ </p>
+ <sect1>
+Components
+ <p>
+Components are named clusters of properties
+ </p>
+ <sect1>
+Properties
+ <sect1>
+Values
+ <sect1>
+Parameters
+ <sect1>
+Storage
+ <sect2>
+Cluster
+ <sect2>
+Store
+ <sect2>
+Calendar
+ <sect1>
+Other bits
+ <p>
+Restrictions
+ </p>
+ <p>
+Types
+ </p>
+ <sect>
+Differences From RFCs
+ <p>
+Although libical has been design to follow the standards as closely as
+ possible, there are a few areas where the specifications are irregular, and
+ following them exactly would result in an unfriendly interface.
+ </p>
+ <sect1>
+Pseudo Components
+ <p>
+Libical defines pseudo components for groups of properties that look and
+ act like components, but are not defined as components in the specification.
+ XDAYLIGHT and XSTANDARD are notable examples. These pseudo components group
+ properties within the VTIMEZONE components. XDAYLIGHT starts with "BEGIN:DAYLIGHT"
+ and ends with "END:DAYLIGHT, just like other components, but is not defined
+ as a component in RFC2445. ( See RFC2445, page 61 ) In Libical, it is a component.
+
+ </p>
+ <p>
+There are also pseudo componentsthat are conceptually derived classess
+ of VALARM. RFC2446 defines what properties may be included in each component,
+ and for VALARM, the set of properties it may have depends on the value of the
+ ACTION property.
+ </p>
+ <p>
+For instance, if a VALARM component has an ACTION property with the value
+ of "AUDIO," the component must also have an "ATTACH" property. However, if the
+ ACTION value is "DISPLAY," the component must have a DESCRIPTION property.
+ </p>
+ <p>
+To handle these various, complex restrictions, libical has pseudo components
+ for each type of alarm: XAUDIOALARM, XDISPLAYALARM, XEMAILALARM and XPROCEDUREALARM.
+
+ </p>
+ <sect1>
+Combined Values
+ <p>
+Many values can take more than one type. TRIGGER, for instance, can have
+ a value type of with DURATION or of DATE-TIME. It is natural to have interfaces
+ that would return the value of a property, but it is cumbersone for a single
+ routine to return multiple types. So, in libical, properties that can have
+ multiple types are given a single type that is the union of their RFC2445 types.
+ In libical, the value of the TRIGGER property resolves to
+ </p>
+ <p>
+struct icaltriggertype
+ </p>
+ <p>
+This type is a union of a DURATION and a DATE-TIME.
+ </p>
+ <sect1>
+Multi-Valued Properties
+ <p>
+Some properties, such as CATEGORIES, have a single value type, but may
+ have multiple values in a single instance. This also results in a cumbersome
+ interface -- CATEGORIES accessors would have to return a list which all other
+ accessors returned a single value. In libical, all properties have a single
+ value, and multi-valued properties are broken down into multiple single valued
+ properties during parsing. The is,
+ </p>
+ <p>
+ <code>
+CATEGORIES: work, home
+ </code>
+</p> <p>
+becomes in libical's internal representation
+ </p>
+ <p>
+ <code>
+CATEGORIES: work
+CATEGORIES: home
+ </code>
+</p> <p>
+Oddly, RFC2445 allows some multi-valued properties ( like FREEBUSY ) to
+ exist as both a multi-values property and as multiple single value properties,
+ while others ( like CATEGORIES ) can only exist as single multi-valued properties.
+ This makes the internal representation for CATEGORIES illegal. However when
+ you convert a component to a string, the library will collect all of the CATEGORIES
+ properties into one.
+ </p>
+ <sect>
+Implementation Limitations
+ <sect>
+Using libical
+ <sect1>
+Creating Components
+ <sect2>
+Constructor interfaces
+ <sect2>
+vaargs Constructors
+ <sect2>
+Parsing Text Files
+ <sect1>
+Accessing Components
+ <sect2>
+Finding Components
+ <sect2>
+Removing Components
+ <p>
+Removing an element from a list while iterating through the list can cause
+ problems, since you will probably be removing the element that the internal
+ iterator points to. This will result in the iteration loop terminating immediately
+ after removing the element. To avoid the problem, you will need to step the
+ iterator ahead of the element you are going to remove, like this:
+ </p>
+ <p>
+ <code>
+for(c = icalcomponent_get_first_component(s);
+ c != 0;
+ c = next)
+&lcub;
+ next = icalcomponent_get_next_component(s);
+ icalcomponent_remove_component(s,c);
+&rcub;
+ </code>
+</p> <sect2>
+Finding Properties
+ <sect2>
+Removing Properties
+ <sect2>
+Getting Values
+ <sect2>
+Setting Values
+ <sect2>
+Getting Parameters
+ <sect2>
+Setting Parameters
+ <sect2>
+Removing Parameters
+ <sect1>
+Storing Objects
+ <p>
+When you store a component to the database with icalstore_add_component,
+ you give the library takes the memory, so the caller does not own the component
+ anymore. If you want to keep ownership, use clone to make a copy. ( See "Memory
+ Management" and "Naming Starndard for more about routines with "add" in the name.
+ )
+ </p>
+ <sect1>
+Memory Management
+ <p>
+Here are the memory rules for the C library:
+ </p>
+ <p>
+ <descrip>
+ <tag>
+1)</tag>If the function name has &quot;new&quot; in it, the caller gets
+ control of the memory. ( such as icalcomponent_new(), or icalproperty_new_clone()
+ )
+ <tag>
+2)</tag>If you got the memory from a routine with new in it, you must
+ call the corresponding *_free routine to free the memory. ( Use icalcomponent_free()
+ to free objects created with icalcomponent_new())
+ <tag>
+3)</tag>If the function name has &quot;add&quot; in it, the caller is
+ transfering control of the memory to the routine. ( icalproperty_add_parameter()
+ )
+ <tag>
+4)</tag>If the function name has &quot;remove&quot; in it, the caller
+ passes in a pointer to an object and after the call returns, the caller owns
+ the object. So, before you call icalcomponent_remove_property(comp,foo), you
+ do not own &quot;foo&quot; and after the call returns, you do.
+ <tag>
+5)</tag>If the routine returns a string, libical owns the memory and will
+ put it on a ring buffer to reclaim later. You'd better strdup it if you want
+ to keep it, and you don't have to delete it.
+ </descrip>
+</p> <sect1>
+Error Handling
+ <sect2>
+Return values
+ <sect2>
+icalerrno
+ <sect2>
+Component errors
+ <sect1>
+Naming Standard
+ <p>
+Structures that you access with the "struct" keyword, such as "struct icaltimetype"
+ are things that you are allowed to see inside and poke at.
+ </p>
+ <p>
+Structures that you access though a typedef, such as "icalcomponent" are
+ things where all of the data is hidden.
+ </p>
+ <p>
+Component names that start with "V" are part of RFC 2445 or another iCal
+ standard. Component names that start with "X" are also part of the spec, but
+ they are not actually components in the spec. However, they look and act like
+ components, so they are components in libical. Names that start with "XLIC" or
+ "X-LIC" are not part of any iCal spec. They are used internally by libical.
+ </p>
+ <sect>
+Hacks and Bugs
+
+
+ </article>
diff --git a/libical/doc/UsingLibical.txt b/libical/doc/UsingLibical.txt
new file mode 100644
index 0000000000..f80ea31121
--- /dev/null
+++ b/libical/doc/UsingLibical.txt
@@ -0,0 +1,302 @@
+
+
+Using Libical
+
+Eric Busboom (eric@softwarestudio.org)
+
+January 2000
+
+1 Introduction
+
+Libical is an Open Source implementation of the iCalendar protocols
+and protocol data units. The iCalendar specification describes how
+calendar clients can communicate with calendar servers for users can
+store their calendar data and arrange meetings with other users.
+
+Libical implements the following specifications and protocols
+
++----------+-------+
+|iCal Core | 2445 |
++----------+-------+
++----------+-------+
+| iTIP | 2446 |
++----------+-------+
++----------+-------+
+| iMIP | 2447 |
++----------+-------+
++----------+-------+
+| iRIP | draft |
++----------+-------+
++----------+-------+
+| CAP | draft |
++----------+-------+
+
+
+(The current version, 0.14, does not implement iRip or CAP. )
+
+This documentation assumes that you are familiar with the iCalendar
+standards RFC2445 and RFC2446.
+
+1.1 The libical project
+
+This code is under active development. If you would like to contribute
+to the project, you can contact me, Eric Busboom, at eric@softwarestudio.org.
+The project has a webpage at
+
+http://softwarestudio.org/libical/index.html
+
+and a mailing list that you can join by sending the following mail:
+
+------------
+
+To: minimalist@softwarestudio.org
+
+Subject: subscribe libical
+
+------------
+
+1.2 License
+
+The code and datafiles in this distribution are licensed under the
+Mozilla Public License. See http://www.mozilla.org/NPL/MPL-1.0.html
+for a copy of the license. Alternately, you may use libical under
+the terms of the GNU Library General Public License. See http://www.fsf.org/copyleft/lesser.html
+for a copy of the LGPL.
+
+This dual license ensures that the library can be incorporated into
+both proprietary code and GPL'd programs, and will benefit from improvements
+made by programmers in both realms. I will only accept changes into
+my version of the library if they are similarly dual-licensed.
+
+1.3 Purpose & Goals
+
+1.4 Document version
+
+$Id$
+
+2 Building the Library
+
+3 Structure
+
+The iCal calendar model is based on four types of objects: components,
+properties, values and parameters.
+
+Properties are the fundamental unit of information in iCal, and they
+work a bit like a hash entry, with a constant key and a variable value.
+Properties may also have modifiers, called parameters. In the iCal
+content line
+
+ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com
+
+The property name is ``ORGANIZER,'' the value of the property is ``mrbig@host.com''
+and the ``ROLE'' parameter specifies that Mr Big is the chair of the
+meetings associated with this property.
+
+Components are groups of properties that represent the core objects
+of a calendar system, such as events or timezones.
+
+The central goal of libical is to parse iTIP data into an internal
+representation of Components, Properties, Parameters an Values, and
+to allow the user to manipulate the data in various ways
+
+3.1 Components
+
+3.2 Properties
+
+3.3 Values
+
+3.4 Parameters
+
+3.5 Enumerations
+
+3.6 Types
+
+3.7 The Parser
+
+3.8 Restrictions
+
+3.9 Memory Management
+
+4 Differences From RFCs
+
+Libical has been designed to follow the standards as closely as possible,
+so that the key objects in the standards are also keey objects in
+the library. However, there are a few areas where the specifications
+are (arguably) irregular, and following them exactly would result
+in an unfriendly interface. These deviations make libical easier to
+use by maintaining a self-similar interface.
+
+4.1 Pseudo Components
+
+Libical defines components for groups of properties that look and act
+like components, but are not defined as components in the specification.
+XDAYLIGHT and XSTANDARD are notable examples. These pseudo components
+group properties within the VTIMEZONE components. XDAYLIGHT starts
+with ``BEGIN:DAYLIGHT'' and ends with ``END:DAYLIGHT, just like other
+components, but is not defined as a component in RFC2445. ( See RFC2445,
+page 61 ) In Libical, it is a component.
+
+There are also pseudo components that are conceptually derived classess
+of VALARM. RFC2446 defines what properties may be included in each
+component, and for VALARM, the set of properties it may have depends
+on the value of the ACTION property.
+
+For instance, if a VALARM component has an ACTION property with the
+value of ``AUDIO,'' the component must also have an ``ATTACH'' property.
+However, if the ACTION value is ``DISPLAY,'' the component must have
+a DESCRIPTION property.
+
+To handle these various, complex restrictions, libical has pseudo components
+for each type of alarm: XAUDIOALARM, XDISPLAYALARM, XEMAILALARM and
+XPROCEDUREALARM.
+
+4.2 Combined Values
+
+Many values can take more than one type. TRIGGER, for instance, can
+have a value type of with DURATION or of DATE-TIME. These multiple
+types make it difficult to create routines to return the value associated
+with a property.
+
+It is natural to have interfaces that would return the value of a property,
+but it is cumbersone for a single routine to return multiple types.
+So, in libical, properties that can have multiple types are given
+a single type that is the union of their RFC2445 types. For instance,
+in libical, the value of the TRIGGER property resolves to struct icaltriggertype.
+This type is a union of a DURATION and a DATE-TIME.
+
+4.3 Multi-Valued Properties
+
+Some properties, such as CATEGORIES have only one value type, but each
+CATEGORIES property can have multiple value instances. This also results
+in a cumbersome interface -- CATEGORIES accessors would have to return
+a list while all other accessors returned a single value. In libical,
+all properties have a single value, and multi-valued properties are
+broken down into multiple single valued properties during parsing.
+That is, an input line like,
+
+CATEGORIES: work, home
+
+becomes in libical's internal representation
+
+CATEGORIES: work
+
+CATEGORIES: home
+
+Oddly, RFC2445 allows some multi-valued properties ( like FREEBUSY
+) to exist as both a multi-values property and as multiple single
+value properties, while others ( like CATEGORIES ) can only exist
+as single multi-valued properties. This makes the internal representation
+for CATEGORIES illegal. However when you convert a component to a
+string, the library will collect all of the CATEGORIES properties
+into one.
+
+5 Implementation Limitations
+
+6 Using libical
+
+6.1 Creating Components
+
+6.1.1 Constructor Interfaces
+
+6.1.2 vaargs Constructors
+
+6.1.3 Parsing Text Files
+
+6.2 Accessing Components
+
+6.2.1 Finding Components
+
+6.2.2 Removing Components
+
+Removing an element from a list while iterating through the list can
+cause problems, since you will probably be removing the element that
+the internal iterator points to. This will result in the iteration
+loop terminating immediately after removing the element. To avoid
+the problem, you will need to step the iterator ahead of the element
+you are going to remove, like this:
+
+for(c = icalcomponent_get_first_component(s);
+
+ c != 0;
+
+ c = next)
+
+{
+
+ next = icalcomponent_get_next_component(s);
+
+ icalcomponent_remove_component(s,c);
+
+}
+
+6.2.3 Finding Properties
+
+6.2.4 Removing Properties
+
+6.2.5 Getting Values
+
+6.2.6 Setting Values
+
+6.2.7 Getting Parameters
+
+6.2.8 Setting Parameters
+
+6.2.9 Removing Parameters
+
+6.2.10 Checking Component Validity
+
+6.3 Storing Objects
+
+The libical distribution inclues a seperate library, libicalss, that
+allows you to store iCal component data to disk in a variety of ways.
+This library is documented seperately.
+
+6.4 Memory Management
+
+Here are the memory rules for the library:
+
+1) If the function name has "new" in it, the caller gets control
+ of the memory. ( such as icalcomponent_new(), or icalproperty_new_clone()
+ )
+
+2) If you got the memory from a routine with new in it, you must
+ call the corresponding *_free routine to free the memory. ( Use
+ icalcomponent_free() to free objects created with icalcomponent_new())
+
+3) If the function name has "add" in it, the caller is transfering
+ control of the memory to the routine. ( icalproperty_add_parameter() )
+
+4) If the function name has "remove" in it, the caller passes in
+ a pointer to an object and after the call returns, the caller owns
+ the object. So, before you call icalcomponent_remove_property(comp,foo),
+ you do not own "foo" and after the call returns, you do.
+
+5) If the routine returns a string, libical owns the memory and will
+ put it on a ring buffer to reclaim later. You'd better strdup it
+ if you want to keep it, and you don't have to delete it.
+
+6.5 Error Handling
+
+6.5.1 Return values
+
+6.5.2 icalerrno
+
+6.5.3 Component errors
+
+6.6 Naming Standard
+
+Structures that you access with the ``struct'' keyword, such as ``struct
+icaltimetype'' are things that you are allowed to see inside and poke
+at.
+
+Structures that you access though a typedef, such as ``icalcomponent''
+are things where all of the data is hidden.
+
+Component names that start with ``V'' are part of RFC 2445 or another
+iCal standard. Component names that start with ``X'' are also part
+of the spec, but they are not actually components in the spec. However,
+they look and act like components, so they are components in libical.
+Names that start with ``XLIC'' or ``X-LIC'' are not part of any iCal
+spec. They are used internally by libical.
+
+7 Hacks and Bugs
diff --git a/libical/install-sh b/libical/install-sh
new file mode 100755
index 0000000000..0ff4b6a08e
--- /dev/null
+++ b/libical/install-sh
@@ -0,0 +1,119 @@
+#!/bin/sh
+
+#
+# install - install a program, script, or datafile
+# This comes from X11R5; it is not part of GNU.
+#
+# $XConsortium: install.sh,v 1.2 89/12/18 14:47:22 jim Exp $
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+#
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+
+instcmd="$mvprog"
+chmodcmd=""
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+
+while [ x"$1" != x ]; do
+ case $1 in
+ -c) instcmd="$cpprog"
+ shift
+ continue;;
+
+ -m) chmodcmd="$chmodprog $2"
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd="$stripprog"
+ shift
+ continue;;
+
+ *) if [ x"$src" = x ]
+ then
+ src=$1
+ else
+ dst=$1
+ fi
+ shift
+ continue;;
+ esac
+done
+
+if [ x"$src" = x ]
+then
+ echo "install: no input file specified"
+ exit 1
+fi
+
+if [ x"$dst" = x ]
+then
+ echo "install: no destination specified"
+ exit 1
+fi
+
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+if [ -d $dst ]
+then
+ dst="$dst"/`basename $src`
+fi
+
+# Make a temp file name in the proper directory.
+
+dstdir=`dirname $dst`
+dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+$doit $instcmd $src $dsttmp
+
+# and set any options; do chmod last to preserve setuid bits
+
+if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; fi
+if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; fi
+if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; fi
+if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; fi
+
+# Now rename the file to the real destination.
+
+$doit $rmcmd $dst
+$doit $mvcmd $dsttmp $dst
+
+
+exit 0
diff --git a/libical/missing b/libical/missing
new file mode 100755
index 0000000000..7789652e87
--- /dev/null
+++ b/libical/missing
@@ -0,0 +1,190 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+# Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+# Franc,ois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+if test $# -eq 0; then
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+fi
+
+case "$1" in
+
+ -h|--h|--he|--hel|--help)
+ echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+ -h, --help display this help and exit
+ -v, --version output version information and exit
+
+Supported PROGRAM values:
+ aclocal touch file \`aclocal.m4'
+ autoconf touch file \`configure'
+ autoheader touch file \`config.h.in'
+ automake touch all \`Makefile.in' files
+ bison create \`y.tab.[ch]', if possible, from existing .[ch]
+ flex create \`lex.yy.c', if possible, from existing .c
+ lex create \`lex.yy.c', if possible, from existing .c
+ makeinfo touch the output file
+ yacc create \`y.tab.[ch]', if possible, from existing .[ch]"
+ ;;
+
+ -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+ echo "missing - GNU libit 0.0"
+ ;;
+
+ -*)
+ echo 1>&2 "$0: Unknown \`$1' option"
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+ ;;
+
+ aclocal)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified \`acinclude.m4' or \`configure.in'. You might want
+ to install the \`Automake' and \`Perl' packages. Grab them from
+ any GNU archive site."
+ touch aclocal.m4
+ ;;
+
+ autoconf)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified \`configure.in'. You might want to install the
+ \`Autoconf' and \`GNU m4' packages. Grab them from any GNU
+ archive site."
+ touch configure
+ ;;
+
+ autoheader)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified \`acconfig.h' or \`configure.in'. You might want
+ to install the \`Autoconf' and \`GNU m4' packages. Grab them
+ from any GNU archive site."
+ files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' configure.in`
+ test -z "$files" && files="config.h"
+ touch_files=
+ for f in $files; do
+ case "$f" in
+ *:*) touch_files="$touch_files "`echo "$f" |
+ sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+ *) touch_files="$touch_files $f.in";;
+ esac
+ done
+ touch $touch_files
+ ;;
+
+ automake)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified \`Makefile.am', \`acinclude.m4' or \`configure.in'.
+ You might want to install the \`Automake' and \`Perl' packages.
+ Grab them from any GNU archive site."
+ find . -type f -name Makefile.am -print |
+ sed 's/\.am$/.in/' |
+ while read f; do touch "$f"; done
+ ;;
+
+ bison|yacc)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified a \`.y' file. You may need the \`Bison' package
+ in order for those modifications to take effect. You can get
+ \`Bison' from any GNU archive site."
+ rm -f y.tab.c y.tab.h
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.y)
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.c
+ fi
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.h
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f y.tab.h ]; then
+ echo >y.tab.h
+ fi
+ if [ ! -f y.tab.c ]; then
+ echo 'main() { return 0; }' >y.tab.c
+ fi
+ ;;
+
+ lex|flex)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified a \`.l' file. You may need the \`Flex' package
+ in order for those modifications to take effect. You can get
+ \`Flex' from any GNU archive site."
+ rm -f lex.yy.c
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.l)
+ SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" lex.yy.c
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f lex.yy.c ]; then
+ echo 'main() { return 0; }' >lex.yy.c
+ fi
+ ;;
+
+ makeinfo)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified a \`.texi' or \`.texinfo' file, or any other file
+ indirectly affecting the aspect of the manual. The spurious
+ call might also be the consequence of using a buggy \`make' (AIX,
+ DU, IRIX). You might want to install the \`Texinfo' package or
+ the \`GNU make' package. Grab either from any GNU archive site."
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ if test -z "$file"; then
+ file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+ file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
+ fi
+ touch $file
+ ;;
+
+ *)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, and you do not seem to have it handy on your
+ system. You might have modified some files without having the
+ proper tools for further handling them. Check the \`README' file,
+ it often tells you about the needed prerequirements for installing
+ this package. You may also peek at any GNU archive site, in case
+ some other package would contain this missing \`$1' program."
+ exit 1
+ ;;
+esac
+
+exit 0
diff --git a/libical/mkinstalldirs b/libical/mkinstalldirs
new file mode 100644
index 0000000000..e82eeacbb3
--- /dev/null
+++ b/libical/mkinstalldirs
@@ -0,0 +1,40 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain
+
+# $Id: mkinstalldirs,v 1.3 2000/05/15 06:18:13 ericb Exp $
+
+errstatus=0
+
+for file
+do
+ set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+ shift
+
+ pathcomp=
+ for d
+ do
+ pathcomp="$pathcomp$d"
+ case "$pathcomp" in
+ -* ) pathcomp=./$pathcomp ;;
+ esac
+
+ if test ! -d "$pathcomp"; then
+ echo "mkdir $pathcomp" 1>&2
+
+ mkdir "$pathcomp" || lasterr=$?
+
+ if test ! -d "$pathcomp"; then
+ errstatus=$lasterr
+ fi
+ fi
+
+ pathcomp="$pathcomp/"
+ done
+done
+
+exit $errstatus
+
+# mkinstalldirs ends here \ No newline at end of file
diff --git a/libical/scripts/.cvsignore b/libical/scripts/.cvsignore
new file mode 100644
index 0000000000..b840c21800
--- /dev/null
+++ b/libical/scripts/.cvsignore
@@ -0,0 +1,2 @@
+Makefile.in
+Makefile \ No newline at end of file
diff --git a/libical/scripts/Makefile.am b/libical/scripts/Makefile.am
new file mode 100644
index 0000000000..fd1b053cb6
--- /dev/null
+++ b/libical/scripts/Makefile.am
@@ -0,0 +1,8 @@
+EXTRA_DIST = \
+mkderivedcomponents.pl \
+mkderivedparameters.pl \
+mkderivedproperties.pl \
+mkderivedvalues.pl \
+mkparameterrestrictions.pl \
+mkrestrictionrecords.pl \
+mkrestrictiontable.pl
diff --git a/libical/scripts/mkderivedcomponents.pl b/libical/scripts/mkderivedcomponents.pl
new file mode 100755
index 0000000000..ac4e472250
--- /dev/null
+++ b/libical/scripts/mkderivedcomponents.pl
@@ -0,0 +1,170 @@
+#!/usr/local/bin/perl
+
+use Getopt::Std;
+getopts('chspi:');
+
+
+# ARG 0 is components.txt
+open(PV,"$ARGV[0]") || die "Can't open components file $ARGV[0]:$!";
+
+my @components;
+
+while (<PV>){
+
+ s/#.*//;
+
+ chop;
+
+ push(@components,$_);
+
+}
+
+close PV;
+
+# Write the file inline by copying everything before a demarcation
+# line, and putting the generated data after the demarcation
+
+if ($opt_i) {
+
+ open(IN,$opt_i) || die "Can't open input file \"$opt_i\"";
+
+ while(<IN>){
+
+ if (/Do not edit/){
+ last;
+ }
+
+ print;
+
+ }
+
+ if($opt_i){
+ print "# Everything below this line is machine generated. Do not edit. \n";
+ } else {
+ print "/* Everything below this line is machine generated. Do not edit. */\n";
+ }
+
+}
+
+if ($opt_c or $opt_h and !$opt_i){
+
+print <<EOM;
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: icalderivedproperties.{c,h}
+ CREATOR: eric 09 May 1999
+
+ \044Id:\044
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+
+ ======================================================================*/
+
+/*
+ * THIS FILE IS MACHINE GENERATED DO NOT EDIT
+ */
+
+#include <stdarg.h> /* for va_arg functions */
+
+EOM
+
+}
+
+if ($opt_p and !$opt_i){
+
+print <<EOM;
+
+EOM
+
+}
+
+
+foreach $comp (@components) {
+
+ next if !$comp;
+
+ my $ucf = join("",map {ucfirst(lc($_));} split(/-/,$comp));
+ my $lc = lc($ucf);
+ my $uc = uc($lc);
+
+ if($opt_c) { # Make C source
+ print<<EOM;
+
+/* $comp */
+
+icalcomponent* icalcomponent_new_${lc}()
+{
+ return (icalcomponent*)icalcomponent_new_impl(ICAL_${uc}_COMPONENT);
+}
+
+icalcomponent* icalcomponent_vanew_${lc}(...)
+{
+ va_list args;
+ struct icalcomponent_impl *impl = icalcomponent_new_impl(ICAL_${uc}_component);
+
+ va_start(args,v);
+ icalcomponent_add_properties(impl, args);
+ va_end(args);
+
+ return (icalcomponent*)impl;
+}
+
+EOM
+
+
+ } elsif ($opt_h) { # Make a C header
+ print<<EOM;
+
+/* $comp */
+icalcomponent* icalcomponent_new_${lc}();
+icalcomponent* icalcomponent_vanew_${lc}(...);
+EOM
+
+} elsif ($opt_s) { # Make something for a switch statement
+
+print <<EOM;
+case ICAL_${uc}_PROPERTY:
+EOM
+
+} elsif ($opt_p) { # make perl source
+
+print <<EOM;
+
+# $comp
+package Net::ICal::Component::${ucf};
+\@ISA=qw(Net::ICal::Component);
+
+sub new
+{
+ my \$package = shift;
+ my \$c = Net::ICal::icalcomponent_new(\$Net::ICal::ICAL_${uc}_COMPONENT);
+
+ my \$self = Net::ICal::Component::new_from_ref(\$c);
+ Net::ICal::Component::_add_elements(\$self,\\\@_);
+
+ # Self is blessed in new_from_ref
+
+ return \$self;
+
+}
+EOM
+
+}
+
+
+
+}
+
+
diff --git a/libical/scripts/mkderivedparameters.pl b/libical/scripts/mkderivedparameters.pl
new file mode 100755
index 0000000000..2b505c878a
--- /dev/null
+++ b/libical/scripts/mkderivedparameters.pl
@@ -0,0 +1,277 @@
+#!/usr/local/bin/perl
+
+use Getopt::Std;
+getopts('chspi:');
+
+%no_xname = (RELATED=>1,RANGE=>1,RSVP=>1,XLICERRORTYPE=>1,XLICCOMPARETYPE=>1);
+
+# Usually, open param-c-types.txt
+open(F,"$ARGV[0]") || die "Can't open C parameter types file $ARGV[0]:$!";
+
+# Write the file inline by copying everything before a demarcation
+# line, and putting the generated data after the demarcation
+
+if ($opt_i) {
+
+ open(IN,$opt_i) || die "Can't open input file $opt_i";
+
+ while(<IN>){
+
+ if (/Do not edit/){
+ last;
+ }
+
+ print;
+
+ }
+
+ if($opt_p){
+ print "# Everything below this line is machine generated. Do not edit. \n";
+ } else {
+ print "/* Everything below this line is machine generated. Do not edit. */\n";
+ }
+
+}
+
+
+
+if (($opt_c or $opt_h) and !$opt_i) {
+
+print <<EOM;
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: icalderivedparameters.{c,h}
+ CREATOR: eric 09 May 1999
+
+ \044Id: mkderivedparameters.pl,v 1.1 1999/05/14 07:04:31 eric Exp eric \044
+ \044Locker: eric \044
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+
+ ======================================================================*/
+
+/*
+ * THIS FILE IS MACHINE GENERATED DO NOT EDIT
+ */
+
+
+EOM
+
+}
+
+if ($opt_p and !$opt_i){
+
+print <<EOM;
+# -*- Mode: Perl -*-
+# ======================================================================
+# \044Id:\044
+#
+# (C) COPYRIGHT 1999 Eric Busboom
+# http://www.softwarestudio.org
+#
+# The contents of this file are subject to the Mozilla Public License
+# Version 1.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.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS"
+# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+# the License for the specific language governing rights and
+# limitations under the License.
+#
+# The original author is Eric Busboom
+# The original code is derivedparams.h
+#
+# ======================================================================*/
+
+EOM
+
+}
+
+
+while(<F>){
+
+ chop;
+ my ($param,$type) = split(/\s{2,}/,$_);
+
+ my $ucf = join("",map {ucfirst(lc($_));} split(/-/,$param));
+
+ my $lc = lc($ucf);
+ my $uc = uc($lc);
+
+ my $lctype = lc($type);
+
+
+ my $charorenum;
+ my $set_code;
+ my $pointer_check;
+ my $new_pointer_check;
+ my $new_pointer_check_v;
+ my $xrange;
+
+ if ($type=~/char/){
+ $new_pointer_check = "icalerror_check_arg_rz( (v!=0),\"v\");";
+ $new_pointer_check_v = "icalerror_check_arg_rv( (v!=0),\"v\");";
+ }
+
+
+ if ($type=~/char/ ) {
+
+ $charorenum = " icalerror_check_arg_rz( (param!=0), \"param\");\n return ((struct icalparameter_impl*)param)->string;";
+
+ $pointer_check = "icalerror_check_arg_rz( (v!=0),\"v\");";
+
+ $set_code = "((struct icalparameter_impl*)param)->string = strdup(v);"
+
+ } else {
+
+ $xrange =" if ( ((struct icalparameter_impl*)param)->string != 0){\n return ICAL_${uc}_XNAME;\n }\n" if !exists $no_xname{$uc};
+
+ $charorenum=<<EOM;
+ icalerror_check_arg( (param!=0), \"param\");
+$xrange
+ return ((struct icalparameter_impl*)param)->data.v_${lc};
+EOM
+
+ $pointer_check = "icalerror_check_arg( (v!=0),\"v\");";
+
+ $set_code = "((struct icalparameter_impl*)param)->data.v_${lc} = v;";
+
+ $print_code = "switch (impl->data.v_${lc}) {\ncase ICAL_${uc}_: {\n}\ncase ICAL_${uc}_XNAME: /* Fall Through */\n}\n";
+
+ }
+
+
+
+ if ($opt_c) {
+
+ print <<EOM;
+/* $param */
+icalparameter* icalparameter_new_${lc}($type v)
+{
+ struct icalparameter_impl *impl;
+ icalerror_clear_errno();
+ $new_pointer_check
+ impl = icalparameter_new_impl(ICAL_${uc}_PARAMETER);
+ if (impl == 0) {
+ return 0;
+ }
+
+ icalparameter_set_${lc}((icalparameter*) impl,v);
+ if (icalerrno != ICAL_NO_ERROR) {
+ icalparameter_free((icalparameter*) impl);
+ return 0;
+ }
+
+ return (icalparameter*) impl;
+}
+
+${type} icalparameter_get_${lc}(icalparameter* param)
+{
+ icalerror_clear_errno();
+$charorenum
+}
+
+void icalparameter_set_${lc}(icalparameter* param, ${type} v)
+{
+ $new_pointer_check_v
+ icalerror_check_arg_rv( (param!=0), "param");
+ icalerror_clear_errno();
+
+ $set_code
+}
+
+EOM
+
+ } elsif( $opt_h) {
+
+ print <<EOM;
+/* $param */
+icalparameter* icalparameter_new_${lc}($type v);
+${type} icalparameter_get_${lc}(icalparameter* value);
+void icalparameter_set_${lc}(icalparameter* value, ${type} v);
+
+EOM
+
+} elsif ($opt_s) {
+
+next if $type =~ /char/;
+
+print<<EOM;
+case ICAL_${uc}_PARAMETER:
+{
+ $print_code
+}
+EOM
+
+}
+
+ if ($opt_p) {
+
+ print <<EOM;
+
+# $param
+
+package Net::ICal::Parameter::${ucf};
+\@ISA=qw(Net::ICal::Parameter);
+
+sub new
+{
+ my \$self = [];
+ my \$package = shift;
+ my \$value = shift;
+
+ bless \$self, \$package;
+
+ my \$p;
+
+ if (\$value) {
+ \$p = Net::ICal::icalparameter_new_from_string(\$Net::ICal::ICAL_${uc}_PARAMETER,\$value);
+ } else {
+ \$p = Net::ICal::icalparameter_new(\$Net::ICal::ICAL_${uc}_PARAMETER);
+ }
+
+ \$self->[0] = \$p;
+
+ return \$self;
+}
+
+sub get
+{
+ my \$self = shift;
+ my \$impl = \$self->_impl();
+
+ return Net::ICal::icalparameter_as_ical_string(\$impl);
+
+}
+
+sub set
+{
+ # This is hard to implement, so I've punted for now.
+ die "Set is not implemented";
+}
+
+EOM
+
+}
+
+}
+
+if ($opt_h){
+
+print <<EOM;
+#endif ICALPARAMETER_H
+EOM
+}
diff --git a/libical/scripts/mkderivedproperties.pl b/libical/scripts/mkderivedproperties.pl
new file mode 100755
index 0000000000..f3c94f2cfd
--- /dev/null
+++ b/libical/scripts/mkderivedproperties.pl
@@ -0,0 +1,286 @@
+#!/usr/local/bin/perl
+
+use Getopt::Std;
+getopts('chsypmi:');
+
+# ARG 0 is prop-to-value
+open(PV,"$ARGV[0]") || die "Can't open prop to value file $ARGV[0]:$!";
+
+
+while (<PV>){
+
+ chop;
+ my @v = split(/\s+/,$_);
+
+ my $prop = shift @v;
+ my $value = shift @v;
+ my $comment = join(" ",@v);
+
+ $propmap{$prop} = $value;
+}
+
+close PV;
+
+# ARG 1 is value-c-types.txt
+open(F,"$ARGV[1]") || die "Can't open C parameter types file $ARGV[1 ]:$!";
+
+while (<F>){
+
+ chop;
+ my @v = split(/\t+/,$_);
+
+ my $value = shift @v;
+ my $type = shift @v;
+ my $comment = join(" ",@v);
+
+ $valuemap{$value} = $type;
+
+}
+
+close F;
+
+# Write the file inline by copying everything before a demarcation
+# line, and putting the generated data after the demarcation
+
+if ($opt_i) {
+
+ open(IN,$opt_i) || die "Can't open input file $opt_i";
+
+ while(<IN>){
+
+ if (/Do not edit/){
+ last;
+ }
+
+ print;
+
+ }
+
+ print "/* Everything below this line is machine generated. Do not edit. */\n";
+
+}
+
+
+if ( ($opt_h or $opt_s) and !$opt_i ){
+
+print <<EOM;
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: icalderivedproperties.{c,h}
+ CREATOR: eric 09 May 1999
+
+ \044Id:\044
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+
+ ======================================================================*/
+
+/*
+ * THIS FILE IS MACHINE GENERATED. DO NOT EDIT
+ */
+
+
+EOM
+
+}
+
+
+if ($opt_p and !$opt_i){
+
+print <<EOM;
+
+EOM
+
+}
+
+foreach $prop (keys %propmap) {
+
+ next if !$prop;
+
+ my $value = $propmap{$prop};
+
+ if (!$value){
+ die "Can't find value for property \"$prop\"\n";
+ }
+
+ my $ucf = join("",map {ucfirst(lc($_));} split(/-/,$prop));
+ my $lc = lc($ucf);
+ my $uc = uc($lc);
+
+ my $ucfvalue = join("",map {ucfirst(lc($_));} split(/-/,$value));
+ my $lcvalue = lc($ucfvalue);
+ my $ucvalue = uc($lcvalue);
+
+ my $type = $valuemap{$value};
+
+ my $pointer_check;
+ if ($type =~ /\*/){
+ $pointer_check = "icalerror_check_arg_rz( (v!=0),\"v\");\n" if $type =~ /\*/;
+ } elsif ( $type eq "void" ){
+ $pointer_check = "icalerror_check_arg_rv( (v!=0),\"v\");\n" if $type =~ /\*/;
+
+ }
+
+ my $set_pointer_check = "icalerror_check_arg_rv( (v!=0),\"v\");\n" if $type =~ /\*/;
+
+ if($opt_c) { # Generate C source
+ print<<EOM;
+
+/* $prop */
+
+icalproperty* icalproperty_new_${lc}($type v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_${uc}_PROPERTY);
+ $pointer_check
+
+ icalproperty_set_${lc}((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_${lc}($type v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_${uc}_PROPERTY);
+ $pointer_check
+
+ icalproperty_set_${lc}((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_${lc}(icalproperty* prop, $type v)
+{
+ icalvalue *value;
+
+ $set_pointer_check
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_${lcvalue}(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+$type icalproperty_get_${lc}(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_${lcvalue}(value);
+}
+EOM
+
+
+ } elsif ($opt_h) { # Generate C Header file
+ print<<EOM;
+
+/* $prop */
+icalproperty* icalproperty_new_${lc}($type v);
+icalproperty* icalproperty_vanew_${lc}($type v, ...);
+void icalproperty_set_${lc}(icalproperty* prop, $type v);
+$type icalproperty_get_${lc}(icalproperty* prop);
+EOM
+
+} elsif ($opt_s) { # Generate case in a switch statement
+
+print <<EOM;
+case ICAL_${uc}_PROPERTY:
+EOM
+
+
+} elsif ($opt_p) { # Generate perl code
+
+print <<EOM;
+
+package Net::ICal::Property::${ucf};
+use Net::ICal::Property;
+\@ISA=qw(Net::ICal::Property);
+sub new
+{
+ my \$package = shift;
+
+ my \$p = Net::ICal::icalproperty_new(\$Net::ICal::ICAL_${uc}_PROPERTY);
+ my \$self = Net::ICal::Property::new_from_ref(\$p);
+
+ \$self->_add_elements(\\\@_);
+
+ return bless \$self, \$package;
+}
+
+sub set_value
+{
+ my \$self = shift;
+ my \$v = shift;
+
+ my \$impl = \$self->_impl();
+
+
+ if ( ref \$v && Net::ICal::icalvalue_isa_value(\$v->_impl())){
+ Net::ICal::icalproperty_set_value(\$impl,\$v->_impl);
+ } else {
+ my \$value = Net::ICal::icalvalue_new_from_string(\$Net::ICal::ICAL_${ucvalue}_VALUE,\$v);
+ die if !\$impl;
+ Net::ICal::icalproperty_set_value(\$impl,\$value) unless !\$value;
+ }
+
+}
+
+sub get_value
+{
+ my \$self = shift;
+ my \$impl = \$self->_impl();
+
+ if (defined \$impl){
+ my \$value = Net::ICal::icalproperty_get_value(\$impl);
+ return "" if !\$value;
+ return Net::ICal::icalvalue_as_ical_string(\$value);
+ } else {
+ return "";
+ }
+}
+
+EOM
+
+} elsif ($opt_m) { # Generate a map
+
+print "\'${uc}\' => \'Net::ICal::Property::${ucf},\'\n";
+
+}
+
+} # This brace terminates the main loop
+
+
+
+# Add things to the end of the output.
+
+if ($opt_p)
+{
+ print "1;\n";
+}
+
+if ($opt_h){
+
+print <<EOM;
+#endif ICALPROPERTY_H
+EOM
+}
+
diff --git a/libical/scripts/mkderivedvalues.pl b/libical/scripts/mkderivedvalues.pl
new file mode 100755
index 0000000000..a0909a6d94
--- /dev/null
+++ b/libical/scripts/mkderivedvalues.pl
@@ -0,0 +1,303 @@
+#!/usr/bin/perl
+
+
+use Getopt::Std;
+getopts('chspi:');
+
+#Options
+# c -> generate c code file
+# h-> generate header file
+# s -> generate switch statement
+
+# Open with value-c-types.txt
+
+
+open(F,"$ARGV[0]") || die "Can't open values data file $ARGV[0]:$!";
+
+
+# Write the file inline by copying everything before a demarcation
+# line, and putting the generated data after the demarcation
+
+if ($opt_i) {
+
+ open(IN,$opt_i) || die "Can't open input file $opt_i";
+
+ while(<IN>){
+
+ if (/Do not edit/){
+ last;
+ }
+
+ print;
+
+ }
+
+ print "/* Everything below this line is machine generated. Do not edit. */\n";
+
+}
+
+
+if (($opt_c || $opt_h) and !$opt_i) {
+print <<EOM;
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: icalderivedvalues.{c,h}
+ CREATOR: eric 09 May 1999
+
+ \044Id:\044
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ ======================================================================*/
+
+/*
+ * THIS FILE IS MACHINE GENERATED DO NOT EDIT
+ */
+
+
+
+EOM
+}
+
+if ($opt_p and !$opt_i){
+
+print <<EOM;
+# -*- Mode: Perl -*-
+# ======================================================================
+# \044Id:\044
+#
+# (C) COPYRIGHT 1999 Eric Busboom
+# http://www.softwarestudio.org
+#
+# The contents of this file are subject to the Mozilla Public License
+# Version 1.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.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS"
+# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+# the License for the specific language governing rights and
+# limitations under the License.
+#
+# The original author is Eric Busboom
+# The original code is derivedvalues.h
+#
+# ======================================================================*/
+
+EOM
+
+}
+
+# Map type names to the value in the icalvalue_impl data union */
+
+%union_map = (
+ BOOLEAN => 'int',
+ CALADDRESS=>'string',
+ DATE=>'time',
+ DATETIME=>'time',
+ DATETIMEDATE=>'time',
+ DATETIMEPERIOD=>'period',
+ DURATION=>'duration',
+ INTEGER=>'int',
+ TEXT=>'string',
+ URI=>'string',
+ UTCOFFSET=>'int',
+ QUERY=>'string',
+ BINARY=>'string'
+ );
+
+while(<F>)
+{
+
+ chop;
+ my @v = split(/\t+/,$_);
+
+ my $value = shift @v;
+ my $type = shift @v;
+ my $comment = join(" ",@v);
+
+ my $ucf = join("",map {ucfirst(lc($_));} split(/-/,$value));
+
+ my $lc = lc($ucf);
+ my $uc = uc($lc);
+
+ my $pointer_check = "icalerror_check_arg_rz( (v!=0),\"v\");\n" if $type =~ /\*/;
+ my $pointer_check_rv = "icalerror_check_arg_rv( (v!=0),\"v\");\n" if $type =~ /\*/;
+
+ my $assign;
+
+ if ($type =~ /char/){
+ $assign = "strdup(v);\n\n if (impl->data.v_string == 0){\n errno = ENOMEM;\n }\n";
+ } else {
+ $assign = "v;";
+ }
+
+ my $union_data;
+
+ if (exists $union_map{$uc} ){
+ $union_data=$union_map{$uc};
+ } else {
+ $union_data = $lc;
+ }
+
+ if ($opt_c) {
+print <<EOM;
+
+icalvalue*
+icalvalue_new_${lc} ($type v)
+{
+ struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_${uc}_VALUE);
+
+ $pointer_check
+ icalvalue_set_${lc}((icalvalue*)impl,v);
+
+ return (icalvalue*)impl;
+}
+
+void
+icalvalue_set_${lc}(icalvalue* value, $type v)
+{
+ struct icalvalue_impl* impl;
+
+ icalerror_check_arg_rv( (value!=0),"value");
+ $pointer_check_rv
+ icalerror_check_value_type(value, ICAL_${uc}_VALUE);
+
+ impl = (struct icalvalue_impl*)value;
+ impl->data.v_${union_data} = $assign
+}
+
+$type
+icalvalue_get_${lc}(icalvalue* value)
+{
+ icalerror_check_arg( (value!=0),"value");
+ icalerror_check_value_type(value, ICAL_${uc}_VALUE);
+
+ return ((struct icalvalue_impl*)value)->data.v_${union_data};
+}
+
+EOM
+
+} elsif($opt_h) {
+
+ print <<EOM;
+/* $value $comment */
+icalvalue* icalvalue_new_${lc}($type v);
+$type icalvalue_get_${lc}(icalvalue* value);
+void icalvalue_set_${lc}(icalvalue* value, ${type} v);
+
+EOM
+
+} elsif ($opt_s) {
+
+if ( $ud{$union_data}++ == 0) {
+
+print<<EOM;
+char* icalvalue_${union_data}_as_ical_string(icalvalue* value) {
+
+ $type data;
+ char temp[1024];
+ char *str;
+ icalerror_check_arg( (value!=0),"value");
+ data = ((struct icalvalue_impl*)value)->data.v_${union_data}
+
+ str = strdup(temp);
+
+ return str;
+}
+
+EOM
+
+}
+} elsif ($opt_p) { # Generate perl code
+
+print <<EOM;
+
+package ICal::Value::${ucf};
+use ICal::Value;
+\@ISA=qw(ICal::Value);
+sub new
+{
+ my \$self = [];
+ my \$package = shift;
+ my \$value = shift;
+
+ bless \$self, \$package;
+
+ my \$p;
+
+ if (\$value){
+ \$p = ICal::icalvalue_new_from_string(\$ICal::ICAL_${uc}_VALUE,\$value);
+ } else {
+ \$p = ICal::icalvalue_new(\$ICal::ICAL_${uc}_VALUE);
+ }
+
+ \$self->[0] = \$p;
+
+ return \$self;
+}
+
+sub set
+{
+ my \$self = shift;
+ my \$v = shift;
+
+ my \$impl = \$self->_impl();
+
+ if (\$v) {
+ my \$new_value = ICal::icalvalue_new_from_string(\$ICal::ICAL_${uc}_VALUE,\$v);
+ if (\$new_value){
+ ICal::icalvalue_free(\$self->[0]);
+ \$self->[0] = \$new_value;
+ }
+
+ }
+
+}
+
+sub get
+{
+ my \$self = shift;
+ my \$impl = \$self->[0];
+
+ if (defined \$impl){
+
+ return ICal::icalvalue_as_ical_string(\$impl);
+
+ }
+}
+
+EOM
+}
+
+
+
+}
+
+if ($opt_p)
+{
+ print "1;\n";
+}
+
+
+if ($opt_h){
+
+print <<EOM;
+#endif ICALVALUE_H
+EOM
+}
+
+
+__END__
+
diff --git a/libical/scripts/mkparameterrestrictions.pl b/libical/scripts/mkparameterrestrictions.pl
new file mode 100755
index 0000000000..2c57eb4ca5
--- /dev/null
+++ b/libical/scripts/mkparameterrestrictions.pl
@@ -0,0 +1,85 @@
+#!/usr/bin/perl
+
+# Version: 1.0
+# Script last updated: 30May1999 GMD
+# Change log:
+# <none>
+
+
+# usually open params-in-prop.txt
+open(F,"$ARGV[0]") || die "Can't open restriction file $ARGV[0]:$!";
+
+print <<EOM;
+/*
+ ======================================================================
+ File: parameterrestrictions.c
+
+ (C) COPYRIGHT 1999 Graham Davison
+ mailto:g.m.davison\@computer.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+
+ ======================================================================*/
+
+/*
+ * THIS FILE IS MACHINE GENERATED DO NOT EDIT
+ */
+
+
+int icalrestriction_is_parameter_allowed(icalproperty_kind prop,icalparameter_kind param)
+{
+ switch (prop)
+ {
+EOM
+
+while(<F>)
+{
+ chop;
+
+ # split line by whitespace
+ my @v = split(/\s+/,$_);
+ # property is first item on line
+ my $prop = shift @v;
+ my $prop_name = $prop;
+ if (substr($prop,0,1) eq "X") { $prop = "X"; }
+ $prop = join("",split(/-/,$prop));
+
+print <<EOM;
+
+ /* ${prop_name} */
+ case ICAL_${prop}_PROPERTY:
+ switch (param)
+ {
+EOM
+
+ foreach $param (@v)
+ {
+ $param = join("",split(/-/,$param));
+ print "\t\t\t\tcase ICAL_${param}_PARAMETER:\n";
+ }
+
+print <<EOM;
+ return 1;
+ default:
+ return 0;
+ }
+
+EOM
+
+}
+
+print <<EOM;
+ }
+
+ return 0;
+}
+EOM
diff --git a/libical/scripts/mkrestrictionrecords.pl b/libical/scripts/mkrestrictionrecords.pl
new file mode 100755
index 0000000000..e2c62ae748
--- /dev/null
+++ b/libical/scripts/mkrestrictionrecords.pl
@@ -0,0 +1,109 @@
+#!/usr/bin/perl
+
+# Version: 1.0
+# Script last updated: 30May1999 GMD
+# Change log:
+# <none>
+
+# usually open restrictions.csv
+open(F,"$ARGV[0]") || die "Can't open restriction file $ARGV[0]:$!";
+
+print <<EOM;
+/*
+ ======================================================================
+ File: restrictionrecords.c
+
+ (C) COPYRIGHT 1999 Graham Davison
+ mailto:g.m.davison\@computer.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+
+ ======================================================================*/
+
+
+/*
+ * THIS FILE IS MACHINE GENERATED DO NOT EDIT
+ */
+
+
+typedef struct icalrestriction_record {
+ icalproperty_method method;
+ icalcomponent_kind component;
+ icalproperty_kind property;
+ icalcomponent_kind subcomponent;
+ icalrestriction_kind restriction;
+} icalrestriction_record;
+
+
+icalrestriction_record icalrestriction_records[] =
+{
+EOM
+
+my $last_method = "";
+my $last_component = "";
+my $last_property = "";
+my $need_header = 0;
+
+while(<F>)
+{
+ chop;
+
+ # split line at commas
+ my ($method,$component,$property,$subcomponent,$restriction)=split(/\,/,$_);
+
+ #
+ #put in code to generate comments here!
+ #
+ if ($method ne $last_method)
+ {
+ $need_header = 1;
+ $last_method = $method;
+ }
+ if ($component ne $last_component)
+ {
+ $need_header = 1;
+ $last_component = $component;
+ }
+
+ if ($need_header)
+ {
+ print "\n\t/* METHOD: ${method}, COMPONENT: ${component} */\n";
+ $need_header = 0;
+ }
+
+ foreach $item ($component,$property,$subcomponent,$restriction)
+ {
+ # handle special cases.
+ if ($item eq "NONE")
+ { $item = "NO"; }
+ else { if (substr($item,0,1) eq "X")
+ { $item = "X"; }}
+
+ # strip out dashes
+ $item = join("",split(/-/,$item));
+ }
+ # strip leading V from component names
+ $component =~ s/^(V?)(\w+?)((SAVINGS)?)((TIME)?)$/$2/;
+ $subcomponent =~ s/^V(\w+)/$1/;
+
+ print "\t\{ICAL_METHOD_${method},ICAL_${component}_COMPONENT,";
+ print "ICAL_${property}_PROPERTY,ICAL_${subcomponent}_COMPONENT,";
+ print "ICAL_RESTRICTION_${restriction}\},\n";
+
+}
+
+print <<EOM;
+
+ /* END */
+ {ICAL_METHOD_NONE,ICAL_NO_COMPONENT,ICAL_NO_PROPERTY,ICAL_NO_COMPONENT,ICAL_RESTRICTION_NONE}
+};
+EOM
diff --git a/libical/scripts/mkrestrictiontable.pl b/libical/scripts/mkrestrictiontable.pl
new file mode 100755
index 0000000000..c91f3d0bc4
--- /dev/null
+++ b/libical/scripts/mkrestrictiontable.pl
@@ -0,0 +1,86 @@
+#!/usr/bin/perl
+
+use Getopt::Std;
+getopts('i:');
+
+# the argument should be the path to the restriction datafile, usually
+# design-data/restrictions.csv
+open(F,"$ARGV[0]") || die "Can't open restriction data file $ARGV[0]:$!";
+
+# Write the file inline by copying everything before a demarcation
+# line, and putting the generated data after the demarcation
+
+if ($opt_i) {
+
+ open(IN,$opt_i) || die "Can't open input file $opt_i";
+
+ while(<IN>){
+
+ if (/Do not edit/){
+ last;
+ }
+
+ print;
+
+ }
+
+ print "/* Everything below this line is machine generated. Do not edit. */\n";
+
+
+ close IN;
+}
+
+print "icalrestriction_property_record icalrestriction_property_records[] = {\n";
+
+while(<F>)
+{
+
+ chop;
+
+ s/\#.*$//;
+
+ my($method,$targetcomp,$prop,$subcomp,$restr,$sub) = split(/,/,$_);
+
+ next if !$method;
+
+ if(!$sub) {
+ $sub = "0";
+ }
+
+ if($prop ne "NONE"){
+ print(" \{ICAL_METHOD_${method},ICAL_${targetcomp}_COMPONENT,ICAL_${prop}_PROPERTY,ICAL_RESTRICTION_${restr},$sub\},\n");
+ }
+
+}
+
+
+print " {ICAL_METHOD_NONE,ICAL_NO_COMPONENT,ICAL_NO_PROPERTY,ICAL_RESTRICTION_NONE}\n";
+
+print "};\n";
+
+print "icalrestriction_component_record icalrestriction_component_records[] = {\n";
+
+
+close(F);
+open(F,"$ARGV[0]") || die "Can't open restriction data file $ARGV[0]:$!";
+
+while(<F>)
+{
+
+ chop;
+
+ s/\#.*$//;
+
+ my($method,$targetcomp,$prop,$subcomp,$restr) = split(/,/,$_);
+
+ next if !$method;
+
+
+ if($subcomp ne "NONE"){
+ print(" \{ICAL_METHOD_${method},ICAL_${targetcomp}_COMPONENT,ICAL_${subcomp}_COMPONENT,ICAL_RESTRICTION_${restr}\},\n");
+ }
+
+}
+
+print " {ICAL_METHOD_NONE,ICAL_NO_COMPONENT,ICAL_NO_COMPONENT,ICAL_RESTRICTION_NONE}\n";
+print "};\n";
diff --git a/libical/src/.cvsignore b/libical/src/.cvsignore
new file mode 100644
index 0000000000..c038ed7864
--- /dev/null
+++ b/libical/src/.cvsignore
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in \ No newline at end of file
diff --git a/libical/src/Makefile.am b/libical/src/Makefile.am
new file mode 100644
index 0000000000..37dc5e39cb
--- /dev/null
+++ b/libical/src/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = libical libicalss test
diff --git a/libical/src/libical/.cvsignore b/libical/src/libical/.cvsignore
new file mode 100644
index 0000000000..708af857d7
--- /dev/null
+++ b/libical/src/libical/.cvsignore
@@ -0,0 +1,14 @@
+Makefile
+Makefile.in
+icalitipy.c
+icalitipy.h
+icalitipl.c
+icallexer.c
+icalyacc.c
+icalyacc.h
+y.output
+*.lo
+*.la
+.libs
+.deps
+icalversion.h
diff --git a/libical/src/libical/.gdb_history b/libical/src/libical/.gdb_history
new file mode 100644
index 0000000000..55362e9165
--- /dev/null
+++ b/libical/src/libical/.gdb_history
@@ -0,0 +1,457 @@
+run
+ptype E
+graph display E
+quit
+run
+print E
+graph display E
+up
+print p
+graph display p
+ptype p
+info line 'p'
+graph display p
+print parameter_iterator
+break icalproperty.c:182
+run
+next
+print p
+graph display p
+quit
+run
+up
+graph display p
+print parameter_iterator
+graph display p
+print *(p)
+quit
+show directories
+run
+run
+y
+list usecases.c
+list test_parameters
+info line 'main'
+info line 'test_parameters'
+info line 'icalproperty_vanew_comment'
+ptype icalproperty_add_parameters
+info line 'icalproperty_add_parameters'
+run
+up
+info line 'icalproperty_vanew_comment'
+info line 'icalproperty_add_parameters'
+break icalproperty.c:51
+run
+step
+next
+nexti
+info line 'icalproperty_vanew_comment'
+info line 'icalproperty_add_parameters'
+break icalproperty.c:53
+run
+next
+graph display vp
+break icalparameter_isa_parameter
+cont
+run
+step
+next
+quit
+run
+break icalcomponent_get_first_property
+break icalcomponent_get_next_property
+break icalcomponent_new
+run
+next
+step
+next
+step
+next
+graph display impl
+up
+down
+next
+graph display *(impl)
+next
+cont
+next
+graph display c
+next
+graph display *(prop)
+next
+step
+quit
+run
+up
+graph display p
+down
+print E
+up
+print *(prop)
+graph display *(prop)
+down
+up
+print prop
+print param
+down
+up
+print p
+up
+break usecases.c:522
+run
+step
+next
+up
+run
+step
+next
+step
+next
+quit
+run
+up
+quit
+info line 'test_memory'
+break b1
+break usecases.c:558
+run
+graph display *(f)
+graph display *(p)
+next
+run
+next
+step
+next
+print pos
+print *(pos)
+graph display string
+graph display *(pos)
+next
+set variable *pos = 0x8053520
+next
+step
+next
+print buf_size
+print *(buf_size)
+print *(string)
+ptype string
+next
+run
+print f
+graph display f
+graph display p
+next
+step
+next
+run
+next
+graph display bufsize
+next
+quit
+graph display test_memory
+info line 'test_memory'
+break usecases.c:560
+run
+graph display f
+next
+graph display p
+print p -f
+print strlen(S1)
+next
+print p - f
+print strlen(S1) + strlen(S2)
+next
+break usecases.c:572
+run
+cont
+step
+graph display *(pos)
+next
+step
+quit
+info line 'test_memory'
+break usecases.c:560
+set args
+run
+next
+graph display f
+graph display p
+next
+graph display bufsize
+run
+next
+set args
+run
+quit
+info line 'test_memory'
+break usecases.c:560
+graph display f
+graph display p
+run
+graph display f
+graph display p
+graph display bufsize
+next
+down
+up
+quit
+run
+where
+frame 2
+break icalmemory.c:79
+run
+next
+run
+graph display buffer_ring
+run
+ont(box, font) = font(box, font);
+_fontfix(box) = fontfix(box);
+ont(box, font) = font(box, font);
+#pragma override font
+font(box, font) = _fontfix(_font(box, string(font)));
+ont(box, font) = font(box, font);
+ist
+list
+print buffer_ring[buffer_pos]
+break icalmemory.c:77
+run
+cont
+quit
+run
+up
+break icalmemory.c:77
+break icalmemory.c:78
+run
+graph display buffer_ring
+next
+cont
+quit
+run
+up
+break icalmemory.c:77
+run
+break icalmemory.c:78
+cont
+graph display buffer_ring[buffer_pos]
+quit
+break usecases.c:560
+run
+step
+break icalmemory.c:129
+disable 2
+next
+info line 'icalmemory_resize_buffer'
+break icalmemory.c:79
+cont
+run
+cont
+next
+run
+cont
+graph display buffer_ring[buffer_pos]
+graph display buffer_ring
+break icalmemory.c:78
+run
+graph display buffer_pos
+cont
+run
+cont
+quit
+info line 'test_memory'
+info line 'icalmemory_append_string'
+break icalmemory.c:78
+break icalmemory.c:79
+run
+graph display buffer_ring
+graph display buffer_ring[buffer_pos]
+graph display buffer_pos
+cont
+next
+free( buffer_ring[2]
+free( buffer_ring[2] )
+call free(buffer_ring[2] )
+call free(buffer_ring[1] )
+free(buffer_ring[1])
+run
+cont
+set variable buffer_pos = 2
+next
+run
+cont
+run
+cont
+run
+cont
+next
+quit
+info line 'test_memory'
+info line 'icalmemory_append_string'
+break icalmemory.c:78
+break icalmemory.c:79
+run
+graph display buffer_ring
+graph display buffer_pos
+graph display buffer_ring[buffer_pos]
+cont
+run
+cont
+set variable buffer_pos = 2
+next
+cont
+next
+cont
+run
+next
+run
+quit
+info line 'test_memory'
+info line 'icalmemory_append_string'
+break icalmemory.c:76
+break icalmemory.c:77
+run
+graph display buffer_ring
+graph display buffer_pos
+graph display buffer_ring[buffer_pos]
+cont
+next
+cont
+next
+cont
+run
+cont
+next
+cont
+run
+cont
+next
+graph display rtrn
+next
+run
+next
+cont
+next
+run
+step
+run
+next
+quit
+run
+up
+print pos
+graph display string
+run
+up
+break usecases.c:572
+run
+print bufsize
+step
+next
+step
+quit
+run
+up
+graph display buf_size
+graph display *(buf_size)
+break icalmemory.c:136
+run
+next
+run
+graph display *(new_buf)
+quit
+run
+up
+down
+break icalmemory.c:136
+run
+graph display *(new_buf)
+quit
+run
+up
+break icalmemory.c:136
+run
+print *(new_buf)
+next
+print *buf_size
+print *bu
+print *buf
+next
+print new_buf
+quit
+run
+up
+break icalmemory.c:136
+run
+print *(new_buf)
+graph display *(new_buf)
+graph display new_pos
+graph display *(buf)
+next
+graph display new_buf
+run
+next
+run
+graph display *(pos)
+next
+quit
+info line 'test_memory'
+info line 'icalmemory_append_string'
+break icalmemory.c:136
+run
+graph display *(buf_size)
+next
+quit
+info line 'test_memory'
+break usecases.c:570
+run
+step
+next
+delete 1
+until usecases.c:572
+step
+next
+graph display *(buf_size)
+next
+graph display *(pos)
+graph display *(buf)
+graph display *(new_buf)
+graph display new_buf
+next
+graph display string
+print *pos - *buf
+run
+break icalmemory.c:136
+run
+next
+set variable *pos = 0x8054993
+next
+run
+next
+set variable *pos = 0x8054980
+set variable *pos = 0x8054700
+next
+run
+next
+down
+up
+down
+quit
+run < ../../test-data/1.1
+up
+break icalproperty.c:165
+run
+next
+run
+info line 'icalvalue_as_ical_string'
+break icalvalue.c:424
+cont
+next
+print value
+next
+run
+up
+cont
+up
+print *(prop)
+graph display *(icalproperty_impl*)prop
+quit
+
diff --git a/libical/src/libical/.gdbinit b/libical/src/libical/.gdbinit
new file mode 100644
index 0000000000..19de9b8209
--- /dev/null
+++ b/libical/src/libical/.gdbinit
@@ -0,0 +1,3 @@
+directory /home/eric/proj/FreeAssociation/libical/src/pvl/
+path /home/eric/proj/FreeAssociation/libical/src/pvl/
+
diff --git a/libical/src/libical/Makefile.am b/libical/src/libical/Makefile.am
new file mode 100644
index 0000000000..698a2d5a94
--- /dev/null
+++ b/libical/src/libical/Makefile.am
@@ -0,0 +1,87 @@
+
+#AUTOMAKE_OPTIONS = no-dependencies
+
+#noinst_LTLIBRARIES = libical.la
+lib_LTLIBRARIES = libical.la
+
+INCLUDES = -I.
+
+YFLAGS =-d -v -t
+
+libical_la_SOURCES = \
+ ical.h \
+ icalcomponent.c \
+ icalcomponent.h \
+ icalenums.c \
+ icalenums.h \
+ icalerror.c \
+ icalerror.h \
+ icalyacc.y \
+ icallexer.l \
+ icalmemory.c \
+ icalmemory.h \
+ icalparameter.c \
+ icalparameter.h \
+ icalparser.c \
+ icalparser.h \
+ icalproperty.c \
+ icalproperty.h \
+ icalrestriction.c \
+ icalrestriction.h \
+ icaltypes.c \
+ icaltypes.h \
+ icalvalue.c \
+ icalvalue.h \
+ icalvcal.h \
+ pvl.c \
+ pvl.h
+
+include_HEADERS=\
+ ical.h \
+ icalcomponent.h \
+ icalenums.h \
+ icalerror.h \
+ icalmemory.h \
+ icalparameter.h \
+ icalparser.h \
+ icalproperty.h \
+ icalrestriction.h \
+ icaltypes.h \
+ icalvalue.h \
+ icalvcal.h \
+ icalversion.h \
+ pvl.h
+
+
+
+EXTRA_DIST = icallexer.c icalyacc.c icalyacc.h
+
+CONFIG_CLEAN_FILES = y.output *~
+
+DESIGNDATA = ../../design-data
+ICALSCRIPTS = ../../scripts
+derived: icalproperty icalparameter icalvalue
+
+icalproperty:
+ $(ICALSCRIPTS)/mkderivedproperties.pl -i icalproperty.h -h $(DESIGNDATA)/prop-to-value.txt ${DESIGNDATA}/value-c-types.txt > icalproperty.newh
+ mv icalproperty.newh icalproperty.h
+
+ $(ICALSCRIPTS)/mkderivedproperties.pl -i icalproperty.c -c $(DESIGNDATA)/prop-to-value.txt ${DESIGNDATA}/value-c-types.txt > icalproperty.newc
+ mv icalproperty.newc icalproperty.c
+
+
+icalparameter:
+ $(ICALSCRIPTS)/mkderivedparameters.pl -i icalparameter.h -h $(DESIGNDATA)/param-c-types.txt > icalparameter.newh
+ mv icalparameter.newh icalparameter.h
+
+ $(ICALSCRIPTS)/mkderivedparameters.pl -i icalparameter.c -c $(DESIGNDATA)/param-c-types.txt > icalparameter.newc
+ mv icalparameter.newc icalparameter.c
+
+icalvalue:
+ $(ICALSCRIPTS)/mkderivedvalues.pl -i icalvalue.h -h $(DESIGNDATA)/value-c-types.txt > icalvalue.newh
+ mv icalvalue.newh icalvalue.h
+
+ $(ICALSCRIPTS)/mkderivedvalues.pl -i icalvalue.c -c $(DESIGNDATA)/value-c-types.txt > icalvalue.newc
+ mv icalvalue.newc icalvalue.c
+
+
diff --git a/libical/src/libical/base64.c b/libical/src/libical/base64.c
new file mode 100644
index 0000000000..5925f977ac
--- /dev/null
+++ b/libical/src/libical/base64.c
@@ -0,0 +1,323 @@
+/*
+
+ Encode or decode file as MIME base64 (RFC 1341)
+
+ by John Walker
+ http://www.fourmilab.ch/
+
+ This program is in the public domain.
+
+*/
+
+#define REVDATE "11th August 1997"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+
+#define TRUE 1
+#define FALSE 0
+
+#define LINELEN 72 /* Encoded line length (max 76) */
+
+typedef unsigned char byte; /* Byte type */
+
+static FILE *fi = stdin; /* Input file */
+static FILE *fo = stdout; /* Output file */
+static byte iobuf[256]; /* I/O buffer */
+static int iolen = 0; /* Bytes left in I/O buffer */
+static int iocp = 256; /* Character removal pointer */
+static int ateof = FALSE; /* EOF encountered */
+static byte dtable[256]; /* Encode / decode table */
+static int linelength = 0; /* Length of encoded output line */
+static char eol[] = "\r\n"; /* End of line sequence */
+static int errcheck = TRUE; /* Check decode input for errors ? */
+
+/* INBUF -- Fill input buffer with data */
+
+static int inbuf(void)
+{
+ int l;
+
+ if (ateof) {
+ return FALSE;
+ }
+ l = fread(iobuf, 1, 256, fi); /* Read input buffer */
+ if (l <= 0) {
+ if (ferror(fi)) {
+ exit(1);
+ }
+ ateof = TRUE;
+ return FALSE;
+ }
+ iolen = l;
+ iocp = 0;
+ return TRUE;
+}
+
+/* INCHAR -- Return next character from input */
+
+static int inchar(void)
+{
+ if (iocp >= iolen) {
+ if (!inbuf()) {
+ return EOF;
+ }
+ }
+
+ return iobuf[iocp++];
+}
+
+/* OCHAR -- Output an encoded character, inserting line breaks
+ where required. */
+
+static void ochar(int c)
+{
+ if (linelength >= LINELEN) {
+ if (fputs(eol, fo) == EOF) {
+ exit(1);
+ }
+ linelength = 0;
+ }
+ if (putc(((byte) c), fo) == EOF) {
+ exit(1);
+ }
+ linelength++;
+}
+
+/* ENCODE -- Encode binary file into base64. */
+
+static void encode(void)
+{
+ int i, hiteof = FALSE;
+
+ /* Fill dtable with character encodings. */
+
+ for (i = 0; i < 26; i++) {
+ dtable[i] = 'A' + i;
+ dtable[26 + i] = 'a' + i;
+ }
+ for (i = 0; i < 10; i++) {
+ dtable[52 + i] = '0' + i;
+ }
+ dtable[62] = '+';
+ dtable[63] = '/';
+
+ while (!hiteof) {
+ byte igroup[3], ogroup[4];
+ int c, n;
+
+ igroup[0] = igroup[1] = igroup[2] = 0;
+ for (n = 0; n < 3; n++) {
+ c = inchar();
+ if (c == EOF) {
+ hiteof = TRUE;
+ break;
+ }
+ igroup[n] = (byte) c;
+ }
+ if (n > 0) {
+ ogroup[0] = dtable[igroup[0] >> 2];
+ ogroup[1] = dtable[((igroup[0] & 3) << 4) | (igroup[1] >> 4)];
+ ogroup[2] = dtable[((igroup[1] & 0xF) << 2) | (igroup[2] >> 6)];
+ ogroup[3] = dtable[igroup[2] & 0x3F];
+
+ /* Replace characters in output stream with "=" pad
+ characters if fewer than three characters were
+ read from the end of the input stream. */
+
+ if (n < 3) {
+ ogroup[3] = '=';
+ if (n < 2) {
+ ogroup[2] = '=';
+ }
+ }
+ for (i = 0; i < 4; i++) {
+ ochar(ogroup[i]);
+ }
+ }
+ }
+ if (fputs(eol, fo) == EOF) {
+ exit(1);
+ }
+}
+
+/* INSIG -- Return next significant input */
+
+static int insig(void)
+{
+ int c;
+
+ /*CONSTANTCONDITION*/
+ while (TRUE) {
+ c = inchar();
+ if (c == EOF || (c > ' ')) {
+ return c;
+ }
+ }
+ /*NOTREACHED*/
+}
+
+/* DECODE -- Decode base64. */
+
+static void decode(void)
+{
+ int i;
+
+ for (i = 0; i < 255; i++) {
+ dtable[i] = 0x80;
+ }
+ for (i = 'A'; i <= 'Z'; i++) {
+ dtable[i] = 0 + (i - 'A');
+ }
+ for (i = 'a'; i <= 'z'; i++) {
+ dtable[i] = 26 + (i - 'a');
+ }
+ for (i = '0'; i <= '9'; i++) {
+ dtable[i] = 52 + (i - '0');
+ }
+ dtable['+'] = 62;
+ dtable['/'] = 63;
+ dtable['='] = 0;
+
+ /*CONSTANTCONDITION*/
+ while (TRUE) {
+ byte a[4], b[4], o[3];
+
+ for (i = 0; i < 4; i++) {
+ int c = insig();
+
+ if (c == EOF) {
+ if (errcheck && (i > 0)) {
+ fprintf(stderr, "Input file incomplete.\n");
+ exit(1);
+ }
+ return;
+ }
+ if (dtable[c] & 0x80) {
+ if (errcheck) {
+ fprintf(stderr, "Illegal character '%c' in input file.\n", c);
+ exit(1);
+ }
+ /* Ignoring errors: discard invalid character. */
+ i--;
+ continue;
+ }
+ a[i] = (byte) c;
+ b[i] = (byte) dtable[c];
+ }
+ o[0] = (b[0] << 2) | (b[1] >> 4);
+ o[1] = (b[1] << 4) | (b[2] >> 2);
+ o[2] = (b[2] << 6) | b[3];
+ i = a[2] == '=' ? 1 : (a[3] == '=' ? 2 : 3);
+ if (fwrite(o, i, 1, fo) == EOF) {
+ exit(1);
+ }
+ if (i < 3) {
+ return;
+ }
+ }
+}
+
+/* USAGE -- Print how-to-call information. */
+
+static void usage(char *pname)
+{
+ fprintf(stderr, "%s -- Encode/decode file as base64. Call:\n", pname);
+ fprintf(stderr,
+ " %s [-e[ncode] / -d[ecode]] [-n] [infile] [outfile]\n", pname);
+ fprintf(stderr, "\n");
+ fprintf(stderr, "Options:\n");
+ fprintf(stderr, " -D Decode base64 encoded file\n");
+ fprintf(stderr, " -E Encode file into base64\n");
+ fprintf(stderr, " -N Ignore errors when decoding\n");
+ fprintf(stderr, " -U Print this message\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, "by John Walker\n");
+ fprintf(stderr, " WWW: http://www.fourmilab.ch/\n");
+}
+
+/* Main program */
+
+int main(int argc, char *argv[])
+{
+ int i, f = 0, decoding = FALSE;
+ char *cp, opt;
+
+ for (i = 1; i < argc; i++) {
+ cp = argv[i];
+ if (*cp == '-') {
+ opt = *(++cp);
+ if (islower(opt)) {
+ opt = toupper(opt);
+ }
+ switch (opt) {
+
+ case 'D': /* -D Decode */
+ decoding = TRUE;
+ break;
+
+ case 'E': /* -E Encode */
+ decoding = FALSE;
+ break;
+
+ case 'N': /* -N Suppress error checking */
+ errcheck = FALSE;
+ break;
+
+ case 'U': /* -U Print how-to-call information */
+ case '?':
+ usage(argv[0]);
+ return 0;
+ }
+ } else {
+ switch (f) {
+
+ /** Warning! On systems which distinguish text mode and
+ binary I/O (MS-DOS, Macintosh, etc.) the modes in these
+ open statements will have to be made conditional based
+ upon whether an encode or decode is being done, which
+ will have to be specified earlier. But it's worse: if
+ input or output is from standard input or output, the
+ mode will have to be changed on the fly, which is
+ generally system and compiler dependent. 'Twasn't me
+ who couldn't conform to Unix CR/LF convention, so
+ don't ask me to write the code to work around
+ Apple and Microsoft's incompatible standards. **/
+
+ case 0:
+ if (strcmp(cp, "-") != 0) {
+ if ((fi = fopen(cp, "r")) == NULL) {
+ fprintf(stderr, "Cannot open input file %s\n", cp);
+ return 2;
+ }
+ }
+ f++;
+ break;
+
+ case 1:
+ if (strcmp(cp, "-") != 0) {
+ if ((fo = fopen(cp, "w")) == NULL) {
+ fprintf(stderr, "Cannot open output file %s\n", cp);
+ return 2;
+ }
+ }
+ f++;
+ break;
+
+ default:
+ fprintf(stderr, "Too many file names specified.\n");
+ usage(argv[0]);
+ return 2;
+ }
+ }
+ }
+
+ if (decoding) {
+ decode();
+ } else {
+ encode();
+ }
+ return 0;
+}
diff --git a/libical/src/libical/filelock.c b/libical/src/libical/filelock.c
new file mode 100644
index 0000000000..0376bc2bec
--- /dev/null
+++ b/libical/src/libical/filelock.c
@@ -0,0 +1,143 @@
+
+/*
+ I Stole this from:
+ http://www.cis.temple.edu/~ingargio/old/cis307s96/readings/rwlockexample.html
+
+ CIS 307: An example using Read/Write File Locks
+ [fcntl.h], [fcntl.c], [fcntlmain.c]
+
+In Stevens "Advanced Programming in the Unix Environment" we see ways to use
+the Unix service fcntl to lock portions of a file for reading and writing in
+the manner stated in the Reader and Writer problem [any number of readers at
+a time, but writers must operate alone]. Here we have three files that adapt
+and use the code from Stevens:
+
+*fcntl.h: Specification of the locking functions.
+*fcntl.c: Implementation of the locking functions.
+*fcntlmain.c: Driver that does a simple test of the locking functions.
+
+WARNING: A file lock request which is blocked can be interrupted by a
+signal. In this case the lock operation returns EINTR. Thus we may think we
+got a lock when we really don't. A solution is to block signals when
+locking. Another solution is to test the value returned by the lock
+operation and relock if the value is EINTR. Another solution, which we adopt
+here, is to do nothing about it.
+
+/* fcntl.c -- Defines mutexes in terms of read/write locks on files.
+ * (code is mostly from Stevens: Advanced Programming in the
+ * Unix environment. See from page 367 on.
+ * filerwlock, filerwlockCreate, filerwlockDelete,
+ * filerwreadlock, filerwlongreadlock, filerwlongunlock,
+ * filerwlockUnlock
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+int lock_reg(int, int, int, off_t, int, off_t);
+
+#define read_lock(fd, offset, whence, len) \
+ lock_reg(fd, F_SETLK, F_RDLCK, offset, whence, len)
+
+#define readw_lock(fd, offset, whence, len) \
+ lock_reg(fd, F_SETLKW, F_RDLCK, offset, whence, len)
+
+#define write_lock(fd, offset, whence, len) \
+ lock_reg(fd, F_SETLK, F_WRLCK, offset, whence, len)
+
+#define writew_lock(fd, offset, whence, len) \
+ lock_reg(fd, F_SETLKW, F_WRLCK, offset, whence, len)
+
+#define un_lock(fd, offset, whence, len) \
+ lock_reg(fd, F_SETLK, F_UNLCK, offset, whence, len)
+
+pid_t lock_test(int, int , off_t , int , off_t );
+
+#define is_readlock(fd, offset, whence, len) \
+ lock_test(fd, F_RDLCK, offset, whence, len)
+
+#define is_writelock(fd, offset, whence, len) \
+ lock_test(fd, F_WRLCK, offset, whence, len)
+
+int lock_reg(int fd, int cmd, int type, off_t offset, int whence, off_t len)
+{
+ struct flock lock;
+ lock.l_type = type; /* F_RDLCK, F_WRLCK, F_UNLCK */
+ lock.l_start = offset; /* byte offset relative to l_whence */
+ lock.l_whence = whence; /* SEEK_SET, SEEK_CUR, SEEK_END */
+ lock.l_len = len; /* #bytes (0 means to EOF) */
+ return (fcntl(fd, cmd, &lock));
+}
+
+pid_t lock_test(int fd, int type, off_t offset, int whence, off_t len)
+{
+ struct flock lock;
+ lock.l_type = type; /* F_RDLCK or F_WRLCK */
+ lock.l_start = offset; /* byte offset relative to l_whence */
+ lock.l_whence = whence; /* SEEK_SET, SEEK_CUR, SEEK_END */
+ lock.l_len = len; /* #bytes (0 means to EOF) */
+ if (fcntl(fd,F_GETLK,&lock) < 0){
+ perror("fcntl"); exit(1);}
+ if (lock.l_type == F_UNLCK)
+ return (0); /* false, region is not locked by another process */
+ return (lock.l_pid); /* true, return pid of lock owner */
+}
+
+typedef struct {
+ int fd;
+ int n;} filerwlock;
+
+/* Create N read/write locks and returns the id of this cluster of locks. */
+filerwlock * filerwlockCreate(char *filename, int n) {
+ filerwlock *fl = (filerwlock *)malloc(sizeof(filerwlock));
+ if (((fl->fd) = open(filename, O_RDWR | O_CREAT | O_TRUNC, S_IWUSR)) < 0) {
+ perror("open");
+ exit(1);}
+ fl->n = n;
+ return fl;
+ }
+
+/* Delete the cluster of read/write locks associated with fl. */
+int filerwlockDelete(filerwlock *fl) {
+ if (close(fl->fd) < 0) {
+ perror("close");
+ exit(1);}
+ return free(fl);
+ }
+
+/* Given the read/write lock cluster fl, lock its ith element */
+int filerwreadlock(filerwlock *fl, int i) {
+ if ((i < 0) | (i >= fl->n)) {
+ printf("filerwlockLock needs i in range 0 .. %d\n", (fl->n)-1);
+ exit(0);}
+ readw_lock(fl->fd, i, SEEK_SET, 1);
+ }
+
+int filerwwritelock(filerwlock *fl, int i) {
+ if ((i < 0) | (i >= fl->n)) {
+ printf("filerwlockLock needs i in range 0 .. %d\n", (fl->n)-1);
+ exit(0);}
+ writew_lock(fl->fd, i, SEEK_SET, 1);
+ }
+
+/* Given the lock cluster fl, unlock its ith element */
+int filerwunlock(filerwlock *fl, int i){
+
+ if ((i < 0) | (i >= fl->n)) {
+ printf("filerwlockUnlock needs i in range 0 .. %d\n", (fl->n)-1);
+ exit(0);}
+ un_lock(fl->fd, i, SEEK_SET, 1);
+ }
+
+/* Given the lock cluster fl, it read locks all its elements */
+int filerwlongreadlock(filerwlock *fl) {
+ readw_lock(fl->fd, 0, SEEK_SET, fl->n);
+}
+
+/* Given the lock cluster fl, it unlocks all its elements */
+int filerwlongunlock(filerwlock *fl) {
+ un_lock(fl->fd, 0, SEEK_SET, fl->n);
+}
+
diff --git a/libical/src/libical/filelock.h b/libical/src/libical/filelock.h
new file mode 100644
index 0000000000..dbe0715cc6
--- /dev/null
+++ b/libical/src/libical/filelock.h
@@ -0,0 +1,57 @@
+/*
+ I Stole this from:
+ http://www.cis.temple.edu/~ingargio/old/cis307s96/readings/rwlockexample.html
+
+ CIS 307: An example using Read/Write File Locks
+ [fcntl.h], [fcntl.c], [fcntlmain.c]
+
+In Stevens "Advanced Programming in the Unix Environment" we see ways to use
+the Unix service fcntl to lock portions of a file for reading and writing in
+the manner stated in the Reader and Writer problem [any number of readers at
+a time, but writers must operate alone]. Here we have three files that adapt
+and use the code from Stevens:
+
+*fcntl.h: Specification of the locking functions.
+*fcntl.c: Implementation of the locking functions.
+*fcntlmain.c: Driver that does a simple test of the locking functions.
+
+WARNING: A file lock request which is blocked can be interrupted by a
+signal. In this case the lock operation returns EINTR. Thus we may think we
+got a lock when we really don't. A solution is to block signals when
+locking. Another solution is to test the value returned by the lock
+operation and relock if the value is EINTR. Another solution, which we adopt
+here, is to do nothing about it.
+
+fcntl.h
+
+*/
+
+/* fcntl.h -- Defines mutexes in terms of read/write locks on files.
+ * filerwlock, filerwlockCreate, filerwlockDelete,
+ * filerwreadlock, filerwlockUnlock
+ */
+
+typedef struct {
+ int fd;
+ int n;
+} filerwlock;
+
+/* Create N read/write locks and returns the id of this cluster of locks. */
+filerwlock * filerwlockCreate(char *filename, int n);
+
+/* Delete the cluster of read/write locks associated with fl. */
+int filerwlockDelete(filerwlock *fl);
+
+/* Given the read/write lock cluster fl, lock its ith element */
+int filerwreadlock(filerwlock *fl, int i);
+
+int filerwwritelock(filerwlock *fl, int i);
+
+/* Given the lock cluster fl, unlock its ith element */
+int filerwunlock(filerwlock *fl, int i);
+
+/* Given the lock cluster fl, it read locks all its elements */
+int filerwlongreadlock(filerwlock *fl);
+
+/* Given the lock cluster fl, it unlocks all its elements */
+int filerwlongunlock(filerwlock *fl);
diff --git a/libical/src/libical/foo b/libical/src/libical/foo
new file mode 100644
index 0000000000..f46fdc7814
--- /dev/null
+++ b/libical/src/libical/foo
@@ -0,0 +1,1578 @@
+/*
+ ======================================================================
+ File: icalrestriction.c
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+
+ ======================================================================*/
+
+#include "icalenums.h"
+#include "icalrestriction.h"
+
+/* Define the structs for the restrictions. these data are filled out
+in machine generated code below */
+
+typedef struct icalrestriction_property_record {
+ icalproperty_method method;
+ icalcomponent_kind component;
+ icalproperty_kind property;
+ icalrestriction_kind restriction;
+} icalrestriction_property_record;
+
+
+typedef struct icalrestriction_component_record {
+ icalproperty_method method;
+ icalcomponent_kind component;
+ icalcomponent_kind subcomponent;
+ icalrestriction_kind restriction;
+} icalrestriction_component_record;
+
+icalrestriction_component_record icalrestriction_component_records[];
+icalrestriction_property_record icalrestriction_property_records[];
+
+/* The each row gives the result of comparing a restriction against a
+ count. The columns in each row represent 0,1,2+. '-1' indicates
+ 'invalid, 'don't care' or 'needs more analysis' */
+
+char compare_map[ICAL_RESTRICTION_UNKNOWN+1][3] = {
+ { 1, 1, 1},/*ICAL_RESTRICTION_NONE*/
+ { 1, 0, 0},/*ICAL_RESTRICTION_ZERO*/
+ { 0, 1, 0},/*ICAL_RESTRICTION_ONE*/
+ { 1, 1, 1},/*ICAL_RESTRICTION_ZEROPLUS*/
+ { 0, 1, 1},/*ICAL_RESTRICTION_ONEPLUS*/
+ { 1, 1, 0},/*ICAL_RESTRICTION_ZEROORONE*/
+ { 1, 1, 0},/*ICAL_RESTRICTION_ONEEXCLUSIVE*/
+ { 1, 1, 0},/*ICAL_RESTRICTION_ONEMUTUAL*/
+ { 1, 1, 1} /*ICAL_RESTRICTION_UNKNOWN*/
+};
+
+char restr_string_map[ICAL_RESTRICTION_UNKNOWN+1][60] = {
+ "unknown number",/*ICAL_RESTRICTION_NONE*/
+ "0",/*ICAL_RESTRICTION_ZERO*/
+ "1",/*ICAL_RESTRICTION_ONE*/
+ "zero or more",/*ICAL_RESTRICTION_ZEROPLUS*/
+ "one or more" ,/*ICAL_RESTRICTION_ONEPLUS*/
+ "zero or more",/*ICAL_RESTRICTION_ZEROORONE*/
+ "zero or one, exclusive with another property",/*ICAL_RESTRICTION_ONEEXCLUSIVE*/
+ "zero or one, mutual with another property",/*ICAL_RESTRICTION_ONEMUTUAL*/
+ "unknown number" /*ICAL_RESTRICTION_UNKNOWN*/
+};
+
+
+int
+icalrestriction_compare(icalrestriction_kind restr, int count){
+
+ if ( restr < ICAL_RESTRICTION_NONE || restr > ICAL_RESTRICTION_UNKNOWN
+ || count < 0){
+ return -1;
+ }
+
+ if (count > 2) {
+ count = 2;
+ }
+
+ return compare_map[restr][count];
+
+}
+
+int icalrestriction_check_component(icalproperty_method method,
+ icalcomponent* comp)
+{
+ icalproperty_kind kind;
+ icalcomponent_kind comp_kind;
+ icalrestriction_kind restr;
+ int count;
+ int compare;
+ int valid = 1;
+
+ comp_kind = icalcomponent_isa(comp);
+
+ /* Check all of the properties in this component */
+
+ for(kind = ICAL_ANY_PROPERTY+1; kind != ICAL_NO_PROPERTY; kind++){
+ count = icalcomponent_count_properties(comp, kind);
+
+ restr = icalrestriction_get_property_restriction(method,
+ comp_kind,
+ kind);
+
+
+ if(restr == ICAL_RESTRICTION_ONEEXCLUSIVE ) {
+ /* HACK. Treat this as a 0/1 restriction */
+ restr = ICAL_RESTRICTION_ZEROORONE;
+ compare = icalrestriction_compare(restr,count);
+ } else if (restr == ICAL_RESTRICTION_ONEMUTUAL ) {
+ /* HACK. Treat this as a 0/1 restriction */
+ restr = ICAL_RESTRICTION_ZEROORONE;
+ compare = icalrestriction_compare(restr,count);
+ } else {
+ compare = icalrestriction_compare(restr,count);
+ }
+
+ assert(compare != -1);
+
+
+ if (compare == 0){
+ char temp[1024];
+
+ sprintf(temp, "Failed iTIP restrictions for property %s. Expected %s instances of the property and got %d",
+ icalenum_property_kind_to_string(kind),
+ restr_string_map[restr], count);
+
+ icalcomponent_add_property
+ (comp,
+ icalproperty_vanew_xlicerror(
+ temp,
+ icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_INVALIDITIP),
+ 0));
+ }
+
+
+ valid = valid && compare;
+ }
+
+
+
+ return valid;
+
+
+}
+
+int icalrestriction_check(icalcomponent* outer_comp)
+{
+ icalcomponent_kind comp_kind;
+ icalproperty_method method;
+ icalcomponent* inner_comp;
+ icalproperty *method_prop;
+ int valid;
+
+ icalerror_check_arg_rz( (outer_comp!=0), "outer comp");
+
+
+ /* Get the Method value from the outer component */
+
+ comp_kind = icalcomponent_isa(outer_comp);
+
+ if (comp_kind != ICAL_VCALENDAR_COMPONENT){
+ icalerror_set_errno(ICAL_BADARG_ERROR);
+ return 0;
+ }
+
+ method_prop = icalcomponent_get_first_property(outer_comp,
+ ICAL_METHOD_PROPERTY);
+
+ if (method_prop == 0){
+ method = ICAL_METHOD_NONE;
+ } else {
+ method = icalproperty_get_method(method_prop);
+ }
+
+
+ /* Check the VCALENDAR wrapper */
+ valid = icalrestriction_check_component(ICAL_METHOD_NONE,outer_comp);
+
+
+ /* Now check the inner components */
+
+ for(inner_comp= icalcomponent_get_first_component(outer_comp,
+ ICAL_ANY_COMPONENT);
+ inner_comp != 0;
+ inner_comp= icalcomponent_get_next_component(outer_comp,
+ ICAL_ANY_COMPONENT)){
+
+ valid = valid && icalrestriction_check_component(method,inner_comp);
+
+ }
+
+
+ return valid;
+
+}
+
+icalrestriction_kind
+icalrestriction_get_property_restriction(icalproperty_method method,
+ icalcomponent_kind component,
+ icalproperty_kind property)
+{
+ int i;
+
+ for(i = 0;
+ icalrestriction_property_records[i].restriction != ICAL_RESTRICTION_NONE;
+ i++){
+
+ if (method == icalrestriction_property_records[i].method &&
+ component == icalrestriction_property_records[i].component &&
+ property == icalrestriction_property_records[i].property ){
+ return icalrestriction_property_records[i].restriction;
+ }
+ }
+
+ return ICAL_RESTRICTION_UNKNOWN;
+}
+
+icalrestriction_kind
+icalrestriction_get_component_restriction(icalproperty_method method,
+ icalcomponent_kind component,
+ icalcomponent_kind subcomponent)
+{
+
+ int i;
+
+ for(i = 0;
+ icalrestriction_component_records[i].restriction != ICAL_RESTRICTION_NONE;
+ i++){
+
+ if (method == icalrestriction_component_records[i].method &&
+ component == icalrestriction_component_records[i].component &&
+ subcomponent == icalrestriction_component_records[i].subcomponent ){
+ return icalrestriction_component_records[i].restriction;
+ }
+ }
+
+ return ICAL_RESTRICTION_UNKNOWN;
+}
+
+/* Everything below this line is machine generated. Do not edit. */
+icalrestriction_property_record icalrestriction_property_records[] = {
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ONEPLUS,0},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE,icalrestriction_check_exclusive},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE,icalrestriction_check_exclusive},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE,icalrestriction_check_exclusive},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE,icalrestriction_check_exclusive},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE, icalrestriction_check_exclusive},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE, icalrestriction_check_exclusive},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE, icalrestriction_check_exclusive},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE, icalrestriction_check_exclusive},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE, icalrestriction_check_exclusive},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE, icalrestriction_check_exclusive},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ONEPLUS,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ONEPLUS,0},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ONEPLUS,0},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ONEPLUS,0},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ONEPLUS,0},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ONEPLUS,0},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ONEPLUS,0},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ONEPLUS,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE, icalrestriction_check_exclusive},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE, icalrestriction_check_exclusive},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ONEMUTUAL,icalrestriction_check_mutual},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ONEMUTUAL,icalrestriction_check_mutual},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ONEMUTUAL,icalrestriction_check_mutual},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ONEMUTUAL,icalrestriction_check_mutual},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ONEPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ONEMUTUAL,icalrestriction_check_mutual},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ONEMUTUAL,icalrestriction_check_mutual},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ONEMUTUAL,icalrestriction_check_mutual},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ONEMUTUAL,icalrestriction_check_mutual},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ONE,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ZERO,0},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0},
+ {ICAL_METHOD_NONE,ICAL_NO_COMPONENT,ICAL_NO_PROPERTY,ICAL_RESTRICTION_NONE}
+};
+icalrestriction_component_record icalrestriction_component_records[] = {
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_NO_COMPONENT,ICAL_NO_COMPONENT,ICAL_RESTRICTION_NONE}
+};
diff --git a/libical/src/libical/ical.h b/libical/src/libical/ical.h
new file mode 100644
index 0000000000..d0f33cd1a1
--- /dev/null
+++ b/libical/src/libical/ical.h
@@ -0,0 +1,43 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: ical.h
+ CREATOR: eric 20 March 1999
+
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The original author is Eric Busboom
+ The original code is ical.h
+
+======================================================================*/
+
+#ifndef ICAL_H
+#define ICAL_H
+
+#include "icalversion.h"
+#include "icalenums.h"
+#include "icalvalue.h"
+#include "icalparameter.h"
+#include "icalproperty.h"
+#include "icalcomponent.h"
+#include "icaltypes.h"
+#include "icalparser.h"
+#include "icalmemory.h"
+#include "icalerror.h"
+#include "icalrestriction.h"
+
+#endif /* !ICAL_H */
+
+
+
diff --git a/libical/src/libical/icalcomponent.c b/libical/src/libical/icalcomponent.c
new file mode 100644
index 0000000000..bd2b13189c
--- /dev/null
+++ b/libical/src/libical/icalcomponent.c
@@ -0,0 +1,782 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalcomponent.c
+ CREATOR: eric 28 April 1999
+
+ $Id$
+
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The original author is Eric Busboom
+ The original code is icalcomponent.c
+
+======================================================================*/
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "ical.h"
+#include "pvl.h" /* "Pointer-to-void list" */
+#include <stdlib.h> /* for malloc */
+#include <stdarg.h> /* for va_list, etc */
+#include <errno.h>
+#include "icalerror.h"
+#include <assert.h>
+#include <stdio.h> /* for fprintf */
+#include "icalmemory.h"
+#include "icalenums.h"
+
+#define MAX_TMP 1024
+
+
+/* icalproperty functions that only components get to use */
+void icalproperty_set_parent(icalproperty* property,
+ icalcomponent* component);
+
+icalcomponent* icalproperty_get_parent(icalproperty* property);
+
+
+
+struct icalcomponent_impl
+{
+ char id[5];
+ icalcomponent_kind kind;
+ char* x_name;
+ pvl_list properties;
+ pvl_elem property_iterator;
+ pvl_list components;
+ pvl_elem component_iterator;
+ icalcomponent* parent;
+};
+
+void icalcomponent_add_children(struct icalcomponent_impl *impl,va_list args)
+{
+ void* vp;
+
+ while((vp = va_arg(args, void*)) != 0) {
+
+ assert (icalcomponent_isa_component(vp) != 0 ||
+ icalproperty_isa_property(vp) != 0 ) ;
+
+ if (icalcomponent_isa_component(vp) != 0 ){
+
+ icalcomponent_add_component((icalcomponent*)impl,
+ (icalcomponent*)vp);
+
+ } else if (icalproperty_isa_property(vp) != 0 ){
+
+ icalcomponent_add_property((icalcomponent*)impl,
+ (icalproperty*)vp);
+ }
+ }
+}
+
+icalcomponent*
+icalcomponent_new_impl (icalcomponent_kind kind)
+{
+ struct icalcomponent_impl* comp;
+
+ if ( ( comp = (struct icalcomponent_impl*)
+ malloc(sizeof(struct icalcomponent_impl))) == 0) {
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return 0;
+ }
+
+ strcpy(comp->id,"comp");
+
+ comp->kind = kind;
+ comp->properties = pvl_newlist();
+ comp->property_iterator = 0;
+ comp->components = pvl_newlist();
+ comp->component_iterator = 0;
+ comp->x_name = 0;
+ comp->parent = 0;
+
+ return comp;
+}
+
+icalcomponent*
+icalcomponent_new (icalcomponent_kind kind)
+{
+ return (icalcomponent*)icalcomponent_new_impl(kind);
+}
+
+icalcomponent*
+icalcomponent_vanew (icalcomponent_kind kind, ...)
+{
+ va_list args;
+
+ struct icalcomponent_impl *impl = icalcomponent_new_impl(kind);
+
+ if (impl == 0){
+ return 0;
+ }
+
+ va_start(args,kind);
+ icalcomponent_add_children(impl, args);
+ va_end(args);
+
+ return (icalcomponent*) impl;
+}
+
+icalcomponent* icalcomponent_new_from_string(char* str)
+{
+ icalcomponent_kind kind;
+
+ icalerror_check_arg_rz( (str!=0), "str");
+
+ kind = icalenum_string_to_component_kind(str);
+
+ if (kind == ICAL_NO_COMPONENT){
+ return 0;
+ }
+
+ return icalcomponent_new(kind);
+}
+
+icalcomponent* icalcomponent_new_clone(icalcomponent* component)
+{
+ struct icalcomponent_impl *old = (struct icalcomponent_impl*)component;
+ struct icalcomponent_impl *new;
+ icalproperty *p;
+ icalcomponent *c;
+
+ icalerror_check_arg_rv( (component!=0), "component");
+
+ new = icalcomponent_new_impl(old->kind);
+
+ if (new == 0){
+ return 0;
+ }
+
+
+ for(p = icalcomponent_get_first_property(old,ICAL_ANY_PROPERTY);
+ p != 0;
+ p = icalcomponent_get_next_property(old,ICAL_ANY_PROPERTY)){
+
+ icalcomponent_add_property(new,icalproperty_new_clone(p));
+ }
+
+
+ for(c = icalcomponent_get_first_component(old,ICAL_ANY_COMPONENT);
+ c != 0;
+ c = icalcomponent_get_next_component(old,ICAL_ANY_COMPONENT)){
+
+ icalcomponent_add_component(new,icalcomponent_new_clone(c));
+ }
+
+ return new;
+
+}
+
+
+void
+icalcomponent_free (icalcomponent* component)
+{
+ icalproperty* prop;
+ icalcomponent* comp;
+ struct icalcomponent_impl *c = (struct icalcomponent_impl*)component;
+
+ icalerror_check_arg_rv( (component!=0), "component");
+
+#ifdef ICAL_FREE_ON_LIST_IS_ERROR
+ icalerror_assert( (c->parent ==0),"Tried to free a component that is still attached to a parent component");
+#else
+ if(c->parent != 0){
+ return;
+ }
+#endif
+
+ if(component != 0 ){
+
+ while( (prop=pvl_pop(c->properties)) != 0){
+ assert(prop != 0);
+ icalproperty_set_parent(prop,0);
+ icalproperty_free(prop);
+ }
+
+ pvl_free(c->properties);
+
+ while( (comp=pvl_data(pvl_head(c->components))) != 0){
+ assert(comp!=0);
+ icalcomponent_remove_component(component,comp);
+ icalcomponent_free(comp);
+ }
+
+ pvl_free(c->components);
+
+ if (c->x_name != 0) {
+ free(c->x_name);
+ }
+
+ c->kind = ICAL_NO_COMPONENT;
+ c->properties = 0;
+ c->property_iterator = 0;
+ c->components = 0;
+ c->component_iterator = 0;
+ c->x_name = 0;
+ c->id[0] = 'X';
+
+ free(c);
+ }
+}
+
+char*
+icalcomponent_as_ical_string (icalcomponent* component)
+{
+ char* buf, *out_buf;
+ char* tmp_buf;
+ size_t buf_size = 1024;
+ char* buf_ptr = 0;
+
+#ifdef ICAL_UNIX_NEWLINE
+ char newline[] = "\n";
+#else
+ char newline[] = "\r\n";
+#endif
+
+ icalcomponent *c;
+ icalproperty *p;
+ icalcomponent_kind kind = icalcomponent_isa(component);
+
+ char* kind_string;
+
+ buf = icalmemory_new_buffer(buf_size);
+ buf_ptr = buf;
+
+ icalerror_check_arg_rz( (component!=0), "component");
+ icalerror_check_arg_rz( (kind!=ICAL_NO_COMPONENT), "component kind is ICAL_NO_COMPONENT");
+
+ kind_string = icalenum_component_kind_to_string(kind);
+
+ icalerror_check_arg_rz( (kind_string!=0),"Unknown kind of component");
+
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, "BEGIN:");
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, kind_string);
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, newline);
+
+
+ for(p = icalcomponent_get_first_property(component,ICAL_ANY_PROPERTY);
+ p != 0;
+ p = icalcomponent_get_next_property(component,ICAL_ANY_PROPERTY)){
+
+ tmp_buf = icalproperty_as_ical_string(p);
+
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, tmp_buf);
+ }
+
+
+ for(c = icalcomponent_get_first_component(component,ICAL_ANY_COMPONENT);
+ c != 0;
+ c = icalcomponent_get_next_component(component,ICAL_ANY_COMPONENT)){
+
+ tmp_buf = icalcomponent_as_ical_string(c);
+
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, tmp_buf);
+
+ }
+
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, "END:");
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size,
+ icalenum_component_kind_to_string(kind));
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, newline);
+
+ out_buf = icalmemory_tmp_copy(buf);
+ free(buf);
+
+ return out_buf;
+}
+
+
+int
+icalcomponent_is_valid (icalcomponent* component)
+{
+ struct icalcomponent_impl *impl = (struct icalcomponent_impl *)component;
+
+
+ if ( (strcmp(impl->id,"comp") == 0) &&
+ impl->kind != ICAL_NO_COMPONENT){
+ return 1;
+ } else {
+ return 0;
+ }
+
+}
+
+
+icalcomponent_kind
+icalcomponent_isa (icalcomponent* component)
+{
+ struct icalcomponent_impl *impl = (struct icalcomponent_impl *)component;
+ icalerror_check_arg_rz( (component!=0), "component");
+
+ if(component != 0)
+ {
+ return impl->kind;
+ }
+
+ return ICAL_NO_COMPONENT;
+}
+
+
+int
+icalcomponent_isa_component (void* component)
+{
+ struct icalcomponent_impl *impl = (struct icalcomponent_impl *)component;
+
+ icalerror_check_arg_rz( (component!=0), "component");
+
+ if (strcmp(impl->id,"comp") == 0) {
+ return 1;
+ } else {
+ return 0;
+ }
+
+}
+
+int icalcomponent_property_sorter(void *a, void *b)
+{
+ icalproperty_kind kinda, kindb;
+ char *ksa, *ksb;
+
+ kinda = icalproperty_isa((icalproperty*)a);
+ kindb = icalproperty_isa((icalproperty*)b);
+
+ ksa = icalenum_property_kind_to_string(kinda);
+ ksb = icalenum_property_kind_to_string(kindb);
+
+ return strcmp(ksa,ksb);
+}
+
+
+void
+icalcomponent_add_property (icalcomponent* component, icalproperty* property)
+{
+ struct icalcomponent_impl *impl;
+
+ icalerror_check_arg_rv( (component!=0), "component");
+ icalerror_check_arg_rv( (property!=0), "property");
+
+ impl = (struct icalcomponent_impl*)component;
+
+ icalerror_assert( (!icalproperty_get_parent(property)),"The property has already been added to a component. Remove the property with icalcomponent_remove_property before calling icalcomponent_add_property");
+
+ icalproperty_set_parent(property,component);
+
+#ifdef ICAL_INSERT_ORDERED
+ pvl_insert_ordered(impl->properties,
+ icalcomponent_property_sorter,property);
+#else
+ pvl_push(impl->properties,property);
+#endif
+
+}
+
+
+void
+icalcomponent_remove_property (icalcomponent* component, icalproperty* property)
+{
+ struct icalcomponent_impl *impl;
+ pvl_elem itr, next_itr;
+ struct icalproperty_impl *pimpl;
+
+ icalerror_check_arg_rv( (component!=0), "component");
+ icalerror_check_arg_rv( (property!=0), "property");
+
+ impl = (struct icalcomponent_impl*)component;
+
+ pimpl = (struct icalproperty_impl*)property;
+
+ icalerror_assert( (icalproperty_get_parent(property)),"The property is not a member of a component");
+
+
+ for( itr = pvl_head(impl->properties);
+ itr != 0;
+ itr = next_itr)
+ {
+ next_itr = pvl_next(itr);
+
+ if( pvl_data(itr) == (void*)property ){
+
+ if (impl->property_iterator == itr){
+ impl->property_iterator = pvl_next(itr);
+ }
+
+ pvl_remove( impl->properties, itr);
+ icalproperty_set_parent(property,0);
+ }
+ }
+}
+
+int
+icalcomponent_count_properties (icalcomponent* component, icalproperty_kind kind)
+{
+ int count=0;
+ icalproperty *p;
+ icalerror_check_arg_rz( (component!=0), "component");
+
+ for(p = icalcomponent_get_first_property(component,kind);
+ p != 0;
+ p = icalcomponent_get_next_property(component,kind)){
+
+ count++;
+ }
+
+
+ return count;
+
+}
+
+icalproperty* icalcomponent_get_current_property (icalcomponent* component)
+{
+
+ struct icalcomponent_impl *c = (struct icalcomponent_impl*)component;
+ icalerror_check_arg_rz( (component!=0),"component");
+
+ if ((c->property_iterator==0)){
+ return 0;
+ }
+
+ return (icalproperty*) pvl_data(c->property_iterator);
+
+}
+
+icalproperty*
+icalcomponent_get_first_property (icalcomponent* component, icalproperty_kind kind)
+{
+ struct icalcomponent_impl *c = (struct icalcomponent_impl*)component;
+ icalerror_check_arg_rz( (component!=0),"component");
+
+ for( c->property_iterator = pvl_head(c->properties);
+ c->property_iterator != 0;
+ c->property_iterator = pvl_next(c->property_iterator)) {
+
+ icalproperty *p = (icalproperty*) pvl_data(c->property_iterator);
+
+ if (icalproperty_isa(p) == kind || kind == ICAL_ANY_PROPERTY) {
+
+ return p;
+ }
+ }
+ return 0;
+}
+
+icalproperty*
+icalcomponent_get_next_property (icalcomponent* component, icalproperty_kind kind)
+{
+ struct icalcomponent_impl *c = (struct icalcomponent_impl*)component;
+ icalerror_check_arg_rz( (component!=0),"component");
+
+ if (c->property_iterator == 0){
+ return 0;
+ }
+
+ for( c->property_iterator = pvl_next(c->property_iterator);
+ c->property_iterator != 0;
+ c->property_iterator = pvl_next(c->property_iterator)) {
+
+ icalproperty *p = (icalproperty*) pvl_data(c->property_iterator);
+
+ if (icalproperty_isa(p) == kind || kind == ICAL_ANY_PROPERTY) {
+
+ return p;
+ }
+ }
+
+ return 0;
+}
+
+
+icalproperty**
+icalcomponent_get_properties (icalcomponent* component, icalproperty_kind kind);
+
+
+void
+icalcomponent_add_component (icalcomponent* parent, icalcomponent* child)
+{
+ struct icalcomponent_impl *impl, *cimpl;
+
+ icalerror_check_arg_rv( (parent!=0), "parent");
+ icalerror_check_arg_rv( (child!=0), "child");
+
+ impl = (struct icalcomponent_impl*)parent;
+ cimpl = (struct icalcomponent_impl*)child;
+
+ icalerror_assert( (cimpl->parent ==0),"The child component has already been added to a parent component. Remove the component with icalcomponent_remove_componenet before calling icalcomponent_add_component");
+
+ cimpl->parent = parent;
+
+ pvl_push(impl->components,child);
+}
+
+
+void
+icalcomponent_remove_component (icalcomponent* parent, icalcomponent* child)
+{
+ struct icalcomponent_impl *impl,*cimpl;
+ pvl_elem itr, next_itr;
+
+ icalerror_check_arg_rv( (parent!=0), "parent");
+ icalerror_check_arg_rv( (child!=0), "child");
+
+ impl = (struct icalcomponent_impl*)parent;
+ cimpl = (struct icalcomponent_impl*)child;
+
+ for( itr = pvl_head(impl->components);
+ itr != 0;
+ itr = next_itr)
+ {
+ next_itr = pvl_next(itr);
+
+ if( pvl_data(itr) == (void*)child ){
+
+ if (impl->component_iterator == itr){
+ /* impl->component_iterator = pvl_next(itr);*/
+ }
+ pvl_remove( impl->components, itr);
+ cimpl->parent = 0;
+ }
+ }
+}
+
+
+int
+icalcomponent_count_components (icalcomponent* component, icalcomponent_kind kind)
+{
+ int count=0;
+ icalcomponent *c;
+ icalerror_check_arg_rz( (component!=0), "component");
+
+ for(c = icalcomponent_get_first_component(component,kind);
+ c != 0;
+ c = icalcomponent_get_next_component(component,kind)){
+
+ count++;
+ }
+
+
+ return count;
+}
+
+icalcomponent*
+icalcomponent_get_current_component(icalcomponent* component)
+{
+ struct icalcomponent_impl *c = (struct icalcomponent_impl*)component;
+
+ icalerror_check_arg_rz( (component!=0),"component");
+
+ if (c->component_iterator == 0){
+ return 0;
+ }
+
+ return (icalcomponent*) pvl_data(c->component_iterator);
+}
+
+icalcomponent*
+icalcomponent_get_first_component (icalcomponent* component,
+ icalcomponent_kind kind)
+{
+ struct icalcomponent_impl *c = (struct icalcomponent_impl*)component;
+
+ icalerror_check_arg_rz( (component!=0),"component");
+
+ for( c->component_iterator = pvl_head(c->components);
+ c->component_iterator != 0;
+ c->component_iterator = pvl_next(c->component_iterator)) {
+
+ icalcomponent *p = (icalcomponent*) pvl_data(c->component_iterator);
+
+ if (icalcomponent_isa(p) == kind || kind == ICAL_ANY_COMPONENT) {
+
+ return p;
+ }
+ }
+
+ return 0;
+}
+
+
+icalcomponent*
+icalcomponent_get_next_component (icalcomponent* component, icalcomponent_kind kind)
+{
+ struct icalcomponent_impl *c = (struct icalcomponent_impl*)component;
+
+ icalerror_check_arg_rz( (component!=0),"component");
+
+ if (c->component_iterator == 0){
+ return 0;
+ }
+
+ for( c->component_iterator = pvl_next(c->component_iterator);
+ c->component_iterator != 0;
+ c->component_iterator = pvl_next(c->component_iterator)) {
+
+ icalcomponent *p = (icalcomponent*) pvl_data(c->component_iterator);
+
+ if (icalcomponent_isa(p) == kind || kind == ICAL_ANY_COMPONENT) {
+
+ return p;
+ }
+ }
+
+ return 0;
+}
+
+
+icalproperty**
+icalcomponent_get_component (icalcomponent* component, icalproperty_kind kind);
+
+
+int icalcomponent_count_errors(icalcomponent* component)
+{
+ int errors = 0;
+ icalproperty *p;
+ icalcomponent *c;
+
+ for(p = icalcomponent_get_first_property(component,ICAL_ANY_PROPERTY);
+ p != 0;
+ p = icalcomponent_get_next_property(component,ICAL_ANY_PROPERTY)){
+
+ if(icalproperty_isa(p) == ICAL_XLICERROR_PROPERTY)
+ {
+ errors++;
+ }
+ }
+
+ for(c = icalcomponent_get_first_component(component,ICAL_ANY_COMPONENT);
+ c != 0;
+ c = icalcomponent_get_next_component(component,ICAL_ANY_COMPONENT)){
+
+ errors += icalcomponent_count_errors(c);
+
+ }
+
+ return errors;
+}
+
+
+void icalcomponent_strip_errors(icalcomponent* component)
+{
+ icalproperty *p, *next_p;
+ icalcomponent *c;
+
+ for(p = icalcomponent_get_first_property(component,ICAL_ANY_PROPERTY);
+ p != 0;
+ p = next_p){
+
+ next_p = icalcomponent_get_next_property(component,ICAL_ANY_PROPERTY);
+
+ if(icalproperty_isa(p) == ICAL_XLICERROR_PROPERTY)
+ {
+ icalcomponent_remove_property(component,p);
+ }
+ }
+
+ for(c = icalcomponent_get_first_component(component,ICAL_ANY_COMPONENT);
+ c != 0;
+ c = icalcomponent_get_next_component(component,ICAL_ANY_COMPONENT)){
+
+ icalcomponent_strip_errors(c);
+ }
+}
+
+
+void icalcomponent_convert_errors(icalcomponent* component)
+{
+ icalproperty *p, *next_p;
+ icalcomponent *c;
+
+ for(p = icalcomponent_get_first_property(component,ICAL_ANY_PROPERTY);
+ p != 0;
+ p = next_p){
+
+ next_p = icalcomponent_get_next_property(component,ICAL_ANY_PROPERTY);
+
+ if(icalproperty_isa(p) == ICAL_XLICERROR_PROPERTY)
+ {
+ struct icalreqstattype rst;
+ char tmp[MAX_TMP];
+ icalparameter *param = icalproperty_get_first_parameter
+ (p,ICAL_XLICERRORTYPE_PARAMETER);
+
+ rst.code = ICAL_UNKNOWN_STATUS;
+ rst.desc = 0;
+
+ switch(icalparameter_get_xlicerrortype(param)){
+
+ case ICAL_XLICERRORTYPE_PARAMETERNAMEPARSEERROR: {
+ rst.code = ICAL_3_2_INVPARAM_STATUS;
+ break;
+ }
+ case ICAL_XLICERRORTYPE_PARAMETERVALUEPARSEERROR: {
+ rst.code = ICAL_3_3_INVPARAMVAL_STATUS;
+ break;
+ }
+ case ICAL_XLICERRORTYPE_PROPERTYPARSEERROR: {
+ rst.code = ICAL_3_0_INVPROPNAME_STATUS;
+ break;
+ }
+ case ICAL_XLICERRORTYPE_VALUEPARSEERROR: {
+ rst.code = ICAL_3_1_INVPROPVAL_STATUS;
+ break;
+ }
+ case ICAL_XLICERRORTYPE_COMPONENTPARSEERROR: {
+ rst.code = ICAL_3_4_INVCOMP_STATUS;
+ break;
+ }
+
+ default: {
+ }
+ }
+ if (rst.code != ICAL_UNKNOWN_STATUS){
+
+ rst.debug = icalproperty_get_xlicerror(p);
+ icalcomponent_add_property(component,
+ icalproperty_new_requeststatus(
+ icalreqstattype_as_string(rst)
+ )
+ );
+
+ icalcomponent_remove_property(component,p);
+ }
+ }
+ }
+
+ for(c = icalcomponent_get_first_component(component,ICAL_ANY_COMPONENT);
+ c != 0;
+ c = icalcomponent_get_next_component(component,ICAL_ANY_COMPONENT)){
+
+ icalcomponent_convert_errors(c);
+ }
+}
+
+
+icalcomponent* icalcomponent_get_parent(icalcomponent* component)
+{
+ struct icalcomponent_impl *c = (struct icalcomponent_impl*)component;
+
+ return c->parent;
+}
+
+void icalcomponent_set_parent(icalcomponent* component, icalcomponent* parent)
+{
+ struct icalcomponent_impl *c = (struct icalcomponent_impl*)component;
+
+ c->parent = parent;
+}
+
+
diff --git a/libical/src/libical/icalcomponent.h b/libical/src/libical/icalcomponent.h
new file mode 100644
index 0000000000..8d9f22ca76
--- /dev/null
+++ b/libical/src/libical/icalcomponent.h
@@ -0,0 +1,119 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalcomponent.h
+ CREATOR: eric 20 March 1999
+
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The original author is Eric Busboom
+ The original code is icalcomponent.h
+
+======================================================================*/
+
+#ifndef ICALCOMPONENT_H
+#define ICALCOMPONENT_H
+
+#include "icalproperty.h"
+#include "icalvalue.h"
+#include "icalenums.h" /* defines icalcomponent_kind */
+
+typedef void icalcomponent;
+
+icalcomponent* icalcomponent_new(icalcomponent_kind kind);
+icalcomponent* icalcomponent_new_clone(icalcomponent* component);
+icalcomponent* icalcomponent_new_from_string(char* str);
+icalcomponent* icalcomponent_vanew(icalcomponent_kind kind, ...);
+void icalcomponent_free(icalcomponent* component);
+
+char* icalcomponent_as_ical_string(icalcomponent* component);
+
+int icalcomponent_is_valid(icalcomponent* component);
+
+icalcomponent_kind icalcomponent_isa(icalcomponent* component);
+
+int icalcomponent_isa_component (void* component);
+
+/*
+ * Working with properties
+ */
+
+void icalcomponent_add_property(icalcomponent* component,
+ icalproperty* property);
+
+void icalcomponent_remove_property(icalcomponent* component,
+ icalproperty* property);
+
+int icalcomponent_count_properties(icalcomponent* component,
+ icalproperty_kind kind);
+
+/* Iterate through the properties */
+icalproperty* icalcomponent_get_current_property(icalcomponent* component);
+
+icalproperty* icalcomponent_get_first_property(icalcomponent* component,
+ icalproperty_kind kind);
+icalproperty* icalcomponent_get_next_property(icalcomponent* component,
+ icalproperty_kind kind);
+
+/* Return a null-terminated array of icalproperties*/
+
+icalproperty** icalcomponent_get_properties(icalcomponent* component,
+ icalproperty_kind kind);
+
+
+/*
+ * Working with components
+ */
+
+
+void icalcomponent_add_component(icalcomponent* parent,
+ icalcomponent* child);
+
+void icalcomponent_remove_component(icalcomponent* parent,
+ icalcomponent* child);
+
+int icalcomponent_count_components(icalcomponent* component,
+ icalcomponent_kind kind);
+
+/* Iterate through components */
+icalcomponent* icalcomponent_get_current_component (icalcomponent* component);
+
+icalcomponent* icalcomponent_get_first_component(icalcomponent* component,
+ icalcomponent_kind kind);
+icalcomponent* icalcomponent_get_next_component(icalcomponent* component,
+ icalcomponent_kind kind);
+
+/* Return a null-terminated array of icalproperties*/
+icalproperty** icalcomponent_get_component(icalcomponent* component,
+ icalproperty_kind kind);
+
+/* Working with embedded error properties */
+
+int icalcomponent_count_errors(icalcomponent* component);
+
+/* Remove all X-LIC-ERROR properties*/
+void icalcomponent_strip_errors(icalcomponent* component);
+
+/* Convert some X-LIC-ERROR properties into RETURN-STATUS properties*/
+void icalcomponent_convert_errors(icalcomponent* component);
+
+/* Internal operations. You don't see these... */
+icalcomponent* icalcomponent_get_parent(icalcomponent* component);
+void icalcomponent_set_parent(icalcomponent* component,
+ icalcomponent* parent);
+
+#endif /* !ICALCOMPONENT_H */
+
+
+
diff --git a/libical/src/libical/icalenums.c b/libical/src/libical/icalenums.c
new file mode 100644
index 0000000000..95f308eec6
--- /dev/null
+++ b/libical/src/libical/icalenums.c
@@ -0,0 +1,615 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalenum.c
+ CREATOR: eric 29 April 1999
+
+ $Id$
+
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The original author is Eric Busboom
+ The original code is icalenum.c
+
+ ======================================================================*/
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "icalenums.h"
+
+struct icalproperty_kind_map {
+ icalproperty_kind kind;
+ char name[20];
+};
+
+static struct icalproperty_kind_map property_map[] =
+{
+ { ICAL_ACTION_PROPERTY, "ACTION"},
+ { ICAL_ATTACH_PROPERTY, "ATTACH"},
+ { ICAL_ATTENDEE_PROPERTY, "ATTENDEE"},
+ { ICAL_CALSCALE_PROPERTY, "CALSCALE"},
+ { ICAL_CATEGORIES_PROPERTY, "CATEGORIES"},
+ { ICAL_CLASS_PROPERTY, "CLASS"},
+ { ICAL_COMMENT_PROPERTY, "COMMENT"},
+ { ICAL_COMPLETED_PROPERTY, "COMPLETED"},
+ { ICAL_CONTACT_PROPERTY, "CONTACT"},
+ { ICAL_CREATED_PROPERTY, "CREATED"},
+ { ICAL_DESCRIPTION_PROPERTY, "DESCRIPTION"},
+ { ICAL_DTEND_PROPERTY, "DTEND"},
+ { ICAL_DTSTAMP_PROPERTY, "DTSTAMP"},
+ { ICAL_DTSTART_PROPERTY, "DTSTART"},
+ { ICAL_DUE_PROPERTY, "DUE"},
+ { ICAL_DURATION_PROPERTY, "DURATION"},
+ { ICAL_EXDATE_PROPERTY, "EXDATE"},
+ { ICAL_EXRULE_PROPERTY, "EXRULE"},
+ { ICAL_FREEBUSY_PROPERTY, "FREEBUSY"},
+ { ICAL_GEO_PROPERTY, "GEO"},
+ { ICAL_LASTMODIFIED_PROPERTY, "LAST-MODIFIED"},
+ { ICAL_LOCATION_PROPERTY, "LOCATION"},
+ { ICAL_METHOD_PROPERTY, "METHOD"},
+ { ICAL_ORGANIZER_PROPERTY, "ORGANIZER"},
+ { ICAL_PERCENTCOMPLETE_PROPERTY, "PERCENT-COMPLETE"},
+ { ICAL_PRIORITY_PROPERTY, "PRIORITY"},
+ { ICAL_PRODID_PROPERTY, "PRODID"},
+ { ICAL_RDATE_PROPERTY, "RDATE"},
+ { ICAL_RECURRENCEID_PROPERTY, "RECURRENCE-ID"},
+ { ICAL_RELATEDTO_PROPERTY, "RELATED-TO"},
+ { ICAL_REPEAT_PROPERTY, "REPEAT"},
+ { ICAL_REQUESTSTATUS_PROPERTY, "REQUEST-STATUS"},
+ { ICAL_RESOURCES_PROPERTY, "RESOURCES"},
+ { ICAL_RRULE_PROPERTY, "RRULE"},
+ { ICAL_SEQUENCE_PROPERTY, "SEQUENCE"},
+ { ICAL_STATUS_PROPERTY, "STATUS"},
+ { ICAL_SUMMARY_PROPERTY, "SUMMARY"},
+ { ICAL_TRANSP_PROPERTY, "TRANSP"},
+ { ICAL_TRIGGER_PROPERTY, "TRIGGER"},
+ { ICAL_TZID_PROPERTY, "TZID"},
+ { ICAL_TZNAME_PROPERTY, "TZNAME"},
+ { ICAL_TZOFFSETFROM_PROPERTY, "TZOFFSETFROM"},
+ { ICAL_TZOFFSETTO_PROPERTY, "TZOFFSETTO"},
+ { ICAL_TZURL_PROPERTY, "TZURL"},
+ { ICAL_UID_PROPERTY, "UID"},
+ { ICAL_URL_PROPERTY, "URL"},
+ { ICAL_VERSION_PROPERTY, "VERSION"},
+ { ICAL_X_PROPERTY,"X_PROPERTY"},
+
+ /* CAP Object Properties */
+
+ { ICAL_SCOPE_PROPERTY, "SCOPE"},
+ { ICAL_MAXRESULTS_PROPERTY, "MAXRESULTS"},
+ { ICAL_MAXRESULTSSIZE_PROPERTY, "MAXRESULTSSIZE"},
+ { ICAL_QUERY_PROPERTY, "QUERY" },
+ { ICAL_QUERYNAME_PROPERTY, "QUERYNAME" },
+ { ICAL_TARGET_PROPERTY, "TARGET"},
+
+ /* libical private properties */
+ { ICAL_XLICERROR_PROPERTY,"X-LIC-ERROR"},
+ { ICAL_XLICCLUSTERCOUNT_PROPERTY,"X-LIC-CLUSTERCOUNT"},
+
+ /* End of the list */
+ { ICAL_NO_PROPERTY, ""}
+};
+
+
+char* icalenum_property_kind_to_string(icalproperty_kind kind)
+{
+ int i;
+
+ for (i=0; property_map[i].kind != ICAL_NO_PROPERTY; i++) {
+ if (property_map[i].kind == kind) {
+ return property_map[i].name;
+ }
+ }
+
+ return 0;
+
+}
+
+icalproperty_kind icalenum_string_to_property_kind(char* string)
+{
+ int i;
+
+ if (string ==0 ) {
+ return ICAL_NO_PROPERTY;
+ }
+
+ for (i=0; property_map[i].kind != ICAL_NO_PROPERTY; i++) {
+ if (strcmp(property_map[i].name, string) == 0) {
+ return property_map[i].kind;
+ }
+ }
+
+ return ICAL_NO_PROPERTY;
+}
+
+
+
+
+struct icalparameter_kind_map {
+ icalparameter_kind kind;
+ char name[20];
+};
+
+static struct icalparameter_kind_map parameter_map[] =
+{
+ { ICAL_ALTREP_PARAMETER, "ALTREP"},
+ { ICAL_CN_PARAMETER, "CN"},
+ { ICAL_CUTYPE_PARAMETER, "CUTYPE"},
+ { ICAL_DELEGATEDFROM_PARAMETER, "DELEGATED-FROM"},
+ { ICAL_DELEGATEDTO_PARAMETER, "DELEGATED-TO"},
+ { ICAL_DIR_PARAMETER, "DIR"},
+ { ICAL_ENCODING_PARAMETER, "ENCODING"},
+ { ICAL_FBTYPE_PARAMETER, "FBTYPE"},
+ { ICAL_FMTTYPE_PARAMETER, "FMTTYPE"},
+ { ICAL_LANGUAGE_PARAMETER, "LANGUAGE"},
+ { ICAL_MEMBER_PARAMETER, "MEMBER"},
+ { ICAL_PARTSTAT_PARAMETER, "PARTSTAT"},
+ { ICAL_RANGE_PARAMETER, "RANGE"},
+ { ICAL_RELATED_PARAMETER, "RELATED"},
+ { ICAL_RELTYPE_PARAMETER, "RELTYPE"},
+ { ICAL_ROLE_PARAMETER, "ROLE"},
+ { ICAL_RSVP_PARAMETER, "RSVP"},
+ { ICAL_SENTBY_PARAMETER, "SENT-BY"},
+ { ICAL_TZID_PARAMETER, "TZID"},
+ { ICAL_VALUE_PARAMETER, "VALUE"},
+
+ /* CAP parameters */
+
+ /* libical private parameters */
+ { ICAL_XLICERRORTYPE_PARAMETER, "X-LIC-ERRORTYPE"},
+ { ICAL_XLICCOMPARETYPE_PARAMETER, "X-LIC-COMPARETYPE"},
+
+ /* End of list */
+ { ICAL_NO_PARAMETER, ""}
+};
+
+char* icalenum_parameter_kind_to_string(icalparameter_kind kind)
+{
+ int i;
+
+ for (i=0; parameter_map[i].kind != ICAL_NO_PARAMETER; i++) {
+ if (parameter_map[i].kind == kind) {
+ return parameter_map[i].name;
+ }
+ }
+
+ return 0;
+
+}
+
+icalparameter_kind icalenum_string_to_parameter_kind(char* string)
+{
+ int i;
+
+ if (string ==0 ) {
+ return ICAL_NO_PARAMETER;
+ }
+
+ for (i=0; parameter_map[i].kind != ICAL_NO_PARAMETER; i++) {
+ if (strcmp(parameter_map[i].name, string) == 0) {
+ return parameter_map[i].kind;
+ }
+ }
+
+ return ICAL_NO_PARAMETER;
+}
+
+struct icalvalue_kind_map {
+ icalvalue_kind kind;
+ char name[20];
+};
+
+static struct icalvalue_kind_map value_map[] =
+{
+ { ICAL_BINARY_VALUE, "BINARY"},
+ { ICAL_BOOLEAN_VALUE, "BOOLEAN"},
+ { ICAL_CALADDRESS_VALUE, "CAL-ADDRESS"},
+ { ICAL_DATE_VALUE, "DATE"},
+ { ICAL_DATETIME_VALUE, "DATE-TIME"},
+ { ICAL_DURATION_VALUE, "DURATION"},
+ { ICAL_FLOAT_VALUE, "FLOAT"},
+ { ICAL_INTEGER_VALUE, "INTEGER"},
+ { ICAL_PERIOD_VALUE, "PERIOD"},
+ { ICAL_RECUR_VALUE, "RECUR"},
+ { ICAL_TEXT_VALUE, "TEXT"},
+ { ICAL_TIME_VALUE, "TIME"},
+ { ICAL_URI_VALUE, "URI"},
+ { ICAL_UTCOFFSET_VALUE, "UTC-OFFSET"},
+ { ICAL_METHOD_VALUE, "METHOD"}, /* Not an RFC2445 type */
+ { ICAL_GEO_VALUE, "FLOAT"}, /* Not an RFC2445 type */
+ { ICAL_ATTACH_VALUE, "XATTACH"}, /* Not an RFC2445 type */
+ { ICAL_DATETIMEDATE_VALUE, "XDATETIMEDATE"}, /* Not an RFC2445 type */
+ { ICAL_DATETIMEPERIOD_VALUE, "XDATETIMEPERIOD"}, /* Not an RFC2445 type */
+ { ICAL_QUERY_VALUE, "QUERY"},
+ { ICAL_NO_VALUE, ""},
+};
+
+char* icalenum_value_kind_to_string(icalvalue_kind kind)
+{
+ int i;
+
+ for (i=0; value_map[i].kind != ICAL_NO_VALUE; i++) {
+ if (value_map[i].kind == kind) {
+ return value_map[i].name;
+ }
+ }
+
+ return 0;
+
+}
+
+icalvalue_kind icalenum_value_kind_by_prop(icalproperty_kind kind)
+{
+
+ return ICAL_NO_VALUE;
+}
+
+
+struct icalcomponent_kind_map {
+ icalcomponent_kind kind;
+ char name[20];
+};
+
+
+
+static struct icalcomponent_kind_map component_map[] =
+{
+ { ICAL_VEVENT_COMPONENT, "VEVENT" },
+ { ICAL_VTODO_COMPONENT, "VTODO" },
+ { ICAL_VJOURNAL_COMPONENT, "VJOURNAL" },
+ { ICAL_VCALENDAR_COMPONENT, "VCALENDAR" },
+ { ICAL_VFREEBUSY_COMPONENT, "VFREEBUSY" },
+ { ICAL_VTIMEZONE_COMPONENT, "VTIMEZONE" },
+ { ICAL_VALARM_COMPONENT, "VALARM" },
+ { ICAL_XSTANDARD_COMPONENT, "STANDARD" }, /*These are part of RFC2445 */
+ { ICAL_XDAYLIGHT_COMPONENT, "DAYLIGHT" }, /*but are not really components*/
+ { ICAL_X_COMPONENT, "X" },
+ { ICAL_VSCHEDULE_COMPONENT, "SCHEDULE" },
+
+ /* CAP components */
+ { ICAL_VQUERY_COMPONENT, "VQUERY" },
+ { ICAL_VCAR_COMPONENT, "VCAR" },
+ { ICAL_VCOMMAND_COMPONENT, "VCOMMAND" },
+
+ /* libical private components */
+ { ICAL_XLICINVALID_COMPONENT, "X-LIC-UNKNOWN" },
+ { ICAL_ANY_COMPONENT, "ANY" },
+ { ICAL_XROOT_COMPONENT, "XROOT" },
+
+ /* End of list */
+ { ICAL_NO_COMPONENT, "" },
+};
+
+char* icalenum_component_kind_to_string(icalcomponent_kind kind)
+{
+ int i;
+
+ for (i=0; component_map[i].kind != ICAL_NO_COMPONENT; i++) {
+ if (component_map[i].kind == kind) {
+ return component_map[i].name;
+ }
+ }
+
+ return 0;
+
+}
+
+icalcomponent_kind icalenum_string_to_component_kind(char* string)
+{
+ int i;
+
+ if (string ==0 ) {
+ return ICAL_NO_COMPONENT;
+ }
+
+ for (i=0; component_map[i].kind != ICAL_NO_COMPONENT; i++) {
+ if (strcmp(component_map[i].name, string) == 0) {
+ return component_map[i].kind;
+ }
+ }
+
+ return ICAL_NO_COMPONENT;
+}
+
+struct icalproperty_kind_value_map {
+ icalproperty_kind prop;
+ icalvalue_kind value;
+};
+
+static struct icalproperty_kind_value_map propval_map[] =
+{
+ { ICAL_CALSCALE_PROPERTY, ICAL_TEXT_VALUE },
+ { ICAL_METHOD_PROPERTY, ICAL_METHOD_VALUE },
+ { ICAL_PRODID_PROPERTY, ICAL_TEXT_VALUE },
+ { ICAL_VERSION_PROPERTY, ICAL_TEXT_VALUE },
+ { ICAL_CATEGORIES_PROPERTY, ICAL_TEXT_VALUE },
+ { ICAL_CLASS_PROPERTY, ICAL_TEXT_VALUE },
+ { ICAL_COMMENT_PROPERTY, ICAL_TEXT_VALUE },
+ { ICAL_DESCRIPTION_PROPERTY, ICAL_TEXT_VALUE },
+ { ICAL_LOCATION_PROPERTY, ICAL_TEXT_VALUE },
+ { ICAL_PERCENTCOMPLETE_PROPERTY, ICAL_INTEGER_VALUE },
+ { ICAL_PRIORITY_PROPERTY, ICAL_INTEGER_VALUE },
+ { ICAL_RESOURCES_PROPERTY, ICAL_TEXT_VALUE },
+ { ICAL_STATUS_PROPERTY, ICAL_TEXT_VALUE },
+ { ICAL_SUMMARY_PROPERTY, ICAL_TEXT_VALUE },
+ { ICAL_COMPLETED_PROPERTY, ICAL_DATETIME_VALUE },
+ { ICAL_FREEBUSY_PROPERTY, ICAL_PERIOD_VALUE },
+ { ICAL_TRANSP_PROPERTY, ICAL_TEXT_VALUE },
+ { ICAL_TZNAME_PROPERTY, ICAL_TEXT_VALUE },
+ { ICAL_TZOFFSETFROM_PROPERTY, ICAL_UTCOFFSET_VALUE },
+ { ICAL_TZOFFSETTO_PROPERTY, ICAL_UTCOFFSET_VALUE },
+ { ICAL_TZURL_PROPERTY, ICAL_URI_VALUE },
+ { ICAL_TZID_PROPERTY, ICAL_TEXT_VALUE },
+ { ICAL_ATTENDEE_PROPERTY, ICAL_CALADDRESS_VALUE },
+ { ICAL_CONTACT_PROPERTY, ICAL_TEXT_VALUE },
+ { ICAL_ORGANIZER_PROPERTY, ICAL_CALADDRESS_VALUE },
+ { ICAL_RELATEDTO_PROPERTY, ICAL_TEXT_VALUE },
+ { ICAL_URL_PROPERTY, ICAL_URI_VALUE },
+ { ICAL_UID_PROPERTY, ICAL_TEXT_VALUE },
+ { ICAL_EXRULE_PROPERTY, ICAL_RECUR_VALUE },
+ { ICAL_RRULE_PROPERTY, ICAL_RECUR_VALUE },
+ { ICAL_ACTION_PROPERTY, ICAL_TEXT_VALUE },
+ { ICAL_REPEAT_PROPERTY, ICAL_INTEGER_VALUE },
+ { ICAL_CREATED_PROPERTY, ICAL_DATETIME_VALUE },
+ { ICAL_DTSTAMP_PROPERTY, ICAL_DATETIME_VALUE },
+ { ICAL_LASTMODIFIED_PROPERTY, ICAL_DATETIME_VALUE },
+ { ICAL_SEQUENCE_PROPERTY, ICAL_INTEGER_VALUE },
+ { ICAL_X_PROPERTY, ICAL_TEXT_VALUE },
+ { ICAL_REQUESTSTATUS_PROPERTY, ICAL_TEXT_VALUE },
+ { ICAL_ATTACH_PROPERTY, ICAL_URI_VALUE },
+ { ICAL_GEO_PROPERTY, ICAL_GEO_VALUE },
+ { ICAL_DTEND_PROPERTY, ICAL_DATETIME_VALUE },
+ { ICAL_DUE_PROPERTY, ICAL_DATETIME_VALUE },
+ { ICAL_DTSTART_PROPERTY, ICAL_DATETIME_VALUE },
+ { ICAL_RECURRENCEID_PROPERTY, ICAL_DATETIME_VALUE },
+ { ICAL_EXDATE_PROPERTY, ICAL_DATETIME_VALUE },
+ { ICAL_RDATE_PROPERTY, ICAL_DATETIME_VALUE },
+ { ICAL_TRIGGER_PROPERTY, ICAL_DURATION_VALUE },
+ { ICAL_DURATION_PROPERTY, ICAL_DURATION_VALUE },
+
+ /* CAP properties */
+ { ICAL_SCOPE_PROPERTY, ICAL_TEXT_VALUE },
+ { ICAL_MAXRESULTS_PROPERTY, ICAL_INTEGER_VALUE},
+ { ICAL_MAXRESULTSSIZE_PROPERTY, ICAL_INTEGER_VALUE},
+ { ICAL_QUERY_PROPERTY, ICAL_QUERY_VALUE },
+ { ICAL_QUERYNAME_PROPERTY, ICAL_TEXT_VALUE },
+ { ICAL_TARGET_PROPERTY, ICAL_CALADDRESS_VALUE },
+
+
+ /* libical private properties */
+ { ICAL_XLICERROR_PROPERTY,ICAL_TEXT_VALUE},
+ { ICAL_XLICCLUSTERCOUNT_PROPERTY,ICAL_INTEGER_VALUE},
+
+
+ /* End of list */
+ { ICAL_NO_PROPERTY, ICAL_NO_PROPERTY}
+};
+
+
+icalvalue_kind icalenum_property_kind_to_value_kind(icalproperty_kind kind)
+{
+ int i;
+
+ for (i=0; propval_map[i].value != ICAL_NO_VALUE; i++) {
+ if ( propval_map[i].prop == kind ) {
+ return propval_map[i].value;
+ }
+ }
+
+ return ICAL_NO_VALUE;
+}
+
+struct {icalrecurrencetype_weekday wd; char * str; }
+wd_map[] = {
+ {ICAL_SUNDAY_WEEKDAY,"SU"},
+ {ICAL_MONDAY_WEEKDAY,"MO"},
+ {ICAL_TUESDAY_WEEKDAY,"TU"},
+ {ICAL_WEDNESDAY_WEEKDAY,"WE"},
+ {ICAL_THURSDAY_WEEKDAY,"TH"},
+ {ICAL_FRIDAY_WEEKDAY,"FR"},
+ {ICAL_SATURDAY_WEEKDAY,"SA"},
+ {ICAL_NO_WEEKDAY,0}
+};
+
+char* icalenum_weekday_to_string(icalrecurrencetype_weekday kind)
+{
+ int i;
+
+ for (i=0; wd_map[i].wd != ICAL_NO_WEEKDAY; i++) {
+ if ( wd_map[i].wd == kind) {
+ return wd_map[i].str;
+ }
+ }
+
+ return 0;
+}
+
+
+struct {
+ icalrecurrencetype_frequency kind;
+ char* str;
+} freq_map[] = {
+ {ICAL_SECONDLY_RECURRENCE,"SECONDLY"},
+ {ICAL_MINUTELY_RECURRENCE,"MINUTELY"},
+ {ICAL_HOURLY_RECURRENCE,"HOURLY"},
+ {ICAL_DAILY_RECURRENCE,"DAILY"},
+ {ICAL_WEEKLY_RECURRENCE,"WEEKLY"},
+ {ICAL_MONTHLY_RECURRENCE,"MONTHLY"},
+ {ICAL_YEARLY_RECURRENCE,"YEARLY"},
+ {ICAL_NO_RECURRENCE,0}
+};
+
+char* icalenum_recurrence_to_string(icalrecurrencetype_frequency kind)
+{
+ int i;
+
+ for (i=0; freq_map[i].kind != ICAL_NO_RECURRENCE ; i++) {
+ if ( freq_map[i].kind == kind ) {
+ return freq_map[i].str;
+ }
+ }
+ return 0;
+}
+
+
+struct {
+ icalrecurrencetype_frequency kind;
+ int major;
+ int minor;
+ char* str;
+} status_map[] = {
+ {ICAL_2_0_SUCCESS_STATUS, 2,0,"Success."},
+ {ICAL_2_1_FALLBACK_STATUS, 2,1,"Success but fallback taken on one or more property values."},
+ {ICAL_2_2_IGPROP_STATUS, 2,2,"Success, invalid property ignored."},
+ {ICAL_2_3_IGPARAM_STATUS, 2,3,"Success, invalid property parameter ignored."},
+ {ICAL_2_4_IGXPROP_STATUS, 2,4,"Success, unknown non-standard property ignored."},
+ {ICAL_2_5_IGXPARAM_STATUS, 2,5,"Success, unknown non standard property value ignored."},
+ {ICAL_2_6_IGCOMP_STATUS, 2,6,"Success, invalid calendar component ignored."},
+ {ICAL_2_7_FORWARD_STATUS, 2,7,"Success, request forwarded to Calendar User."},
+ {ICAL_2_8_ONEEVENT_STATUS, 2,8,"Success, repeating event ignored. Scheduled as a single component."},
+ {ICAL_2_9_TRUNC_STATUS, 2,9,"Success, truncated end date time to date boundary."},
+ {ICAL_2_10_ONETODO_STATUS, 2,10,"Success, repeating VTODO ignored. Scheduled as a single VTODO."},
+ {ICAL_2_11_TRUNCRRULE_STATUS, 2,11,"Success, unbounded RRULE clipped at some finite number of instances "},
+ {ICAL_3_0_INVPROPNAME_STATUS, 3,0,"Invalid property name."},
+ {ICAL_3_1_INVPROPVAL_STATUS, 3,1,"Invalid property value."},
+ {ICAL_3_2_INVPARAM_STATUS, 3,2,"Invalid property parameter."},
+ {ICAL_3_3_INVPARAMVAL_STATUS, 3,3,"Invalid property parameter value."},
+ {ICAL_3_4_INVCOMP_STATUS, 3,4,"Invalid calendar component."},
+ {ICAL_3_5_INVTIME_STATUS, 3,5,"Invalid date or time."},
+ {ICAL_3_6_INVRULE_STATUS, 3,6,"Invalid rule."},
+ {ICAL_3_7_INVCU_STATUS, 3,7,"Invalid Calendar User."},
+ {ICAL_3_8_NOAUTH_STATUS, 3,8,"No authority."},
+ {ICAL_3_9_BADVERSION_STATUS, 3,9,"Unsupported version."},
+ {ICAL_3_10_TOOBIG_STATUS, 3,10,"Request entity too large."},
+ {ICAL_3_11_MISSREQCOMP_STATUS, 3,11,"Required component or property missing."},
+ {ICAL_3_12_UNKCOMP_STATUS, 3,12,"Unknown component or property found."},
+ {ICAL_3_13_BADCOMP_STATUS, 3,13,"Unsupported component or property found"},
+ {ICAL_3_14_NOCAP_STATUS, 3,14,"Unsupported capability."},
+ {ICAL_4_0_BUSY_STATUS, 4,0,"Event conflict. Date/time is busy."},
+ {ICAL_5_0_MAYBE_STATUS, 5,0,"Request MAY supported."},
+ {ICAL_5_1_UNAVAIL_STATUS, 5,1,"Service unavailable."},
+ {ICAL_5_2_NOSERVICE_STATUS, 5,2,"Invalid calendar service."},
+ {ICAL_5_3_NOSCHED_STATUS, 5,3,"No scheduling support for user."},
+ {ICAL_UNKNOWN_STATUS, 0,0,"Error: Unknown request status"}
+};
+
+
+char* icalenum_reqstat_desc(icalrequeststatus stat)
+{
+
+ int i;
+
+ for (i=0; status_map[i].kind != ICAL_UNKNOWN_STATUS; i++) {
+ if ( status_map[i].kind == stat) {
+ return status_map[i].str;
+ }
+ }
+
+ return 0;
+}
+
+
+short icalenum_reqstat_major(icalrequeststatus stat)
+{
+ int i;
+
+ for (i=0; status_map[i].kind != ICAL_UNKNOWN_STATUS; i++) {
+ if ( status_map[i].kind == stat) {
+ return status_map[i].major;
+ }
+ }
+ return -1;
+}
+
+short icalenum_reqstat_minor(icalrequeststatus stat)
+{
+ int i;
+
+ for (i=0; status_map[i].kind != ICAL_UNKNOWN_STATUS; i++) {
+ if ( status_map[i].kind == stat) {
+ return status_map[i].minor;
+ }
+ }
+ return -1;
+}
+
+
+icalrequeststatus icalenum_num_to_reqstat(short major, short minor)
+{
+ int i;
+
+ for (i=0; status_map[i].kind != ICAL_UNKNOWN_STATUS; i++) {
+ if ( status_map[i].major == major && status_map[i].minor == minor) {
+ return status_map[i].kind;
+ }
+ }
+ return 0;
+}
+
+
+
+struct {icalproperty_method method; char* str;} method_map[] = {
+ {ICAL_METHOD_PUBLISH,"PUBLISH"},
+ {ICAL_METHOD_REQUEST,"REQUEST"},
+ {ICAL_METHOD_REPLY,"REPLY"},
+ {ICAL_METHOD_ADD,"ADD"},
+ {ICAL_METHOD_CANCEL,"CANCEL"},
+ {ICAL_METHOD_REFRESH,"REFRESH"},
+ {ICAL_METHOD_COUNTER,"CPUNTER"},
+ {ICAL_METHOD_DECLINECOUNTER,"DECLINECOUNTER"},
+ /* CAP Methods */
+ {ICAL_METHOD_CREATE,"CREATE"},
+ {ICAL_METHOD_READ,"READ"},
+ {ICAL_METHOD_RESPONSE,"RESPONSE"},
+ {ICAL_METHOD_MOVE,"MOVE"},
+ {ICAL_METHOD_MODIFY,"MODIFY"},
+ {ICAL_METHOD_GENERATEUID,"GENERATEUID"},
+ {ICAL_METHOD_DELETE,"DELETE"},
+ {ICAL_METHOD_NONE,"NONE"}
+};
+
+
+char* icalenum_method_to_string(icalproperty_method method)
+{
+ int i;
+
+ for (i=0; method_map[i].method != ICAL_METHOD_NONE; i++) {
+ if ( method_map[i].method == method) {
+ return method_map[i].str;
+ }
+ }
+
+ return 0;
+}
+
+icalproperty_method icalenum_string_to_method(char* str)
+{
+ int i;
+
+ while(*str == ' '){
+ str++;
+ }
+
+
+ for (i=0; method_map[i].method != ICAL_METHOD_NONE; i++) {
+ if ( strcmp(method_map[i].str, str) == 0) {
+ return method_map[i].method;
+ }
+ }
+
+ return ICAL_METHOD_NONE;
+}
diff --git a/libical/src/libical/icalenums.h b/libical/src/libical/icalenums.h
new file mode 100644
index 0000000000..ff7cee486e
--- /dev/null
+++ b/libical/src/libical/icalenums.h
@@ -0,0 +1,466 @@
+/* -*- Mode: C -*-*/
+/*======================================================================
+ FILE: icalenums.h
+
+
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The original author is Eric Busboom
+ The original code is icalenums.h
+
+ Contributions from:
+ Graham Davison (g.m.davison@computer.org)
+
+======================================================================*/
+
+#ifndef ICALENUMS_H
+#define ICALENUMS_H
+
+
+
+/***********************************************************************
+ * Component enumerations
+**********************************************************************/
+
+typedef enum icalcomponent_kind {
+ ICAL_NO_COMPONENT,
+ ICAL_ANY_COMPONENT, /* Used to select all components*/
+ ICAL_XROOT_COMPONENT,
+ ICAL_XATTACH_COMPONENT, /* MIME attached data, returned by parser. */
+ ICAL_VEVENT_COMPONENT,
+ ICAL_VTODO_COMPONENT,
+ ICAL_VJOURNAL_COMPONENT,
+ ICAL_VCALENDAR_COMPONENT,
+ ICAL_VFREEBUSY_COMPONENT,
+ ICAL_VALARM_COMPONENT,
+ ICAL_XAUDIOALARM_COMPONENT,
+ ICAL_XDISPLAYALARM_COMPONENT,
+ ICAL_XEMAILALARM_COMPONENT,
+ ICAL_XPROCEDUREALARM_COMPONENT,
+ ICAL_VTIMEZONE_COMPONENT,
+ ICAL_XSTANDARD_COMPONENT,
+ ICAL_XDAYLIGHT_COMPONENT,
+ ICAL_X_COMPONENT,
+ ICAL_VSCHEDULE_COMPONENT,
+ ICAL_VQUERY_COMPONENT,
+ ICAL_VCAR_COMPONENT,
+ ICAL_VCOMMAND_COMPONENT,
+ ICAL_XLICINVALID_COMPONENT
+} icalcomponent_kind;
+
+/***********************************************************************
+ * Property Enumerations
+**********************************************************************/
+
+typedef enum icalproperty_kind {
+ ICAL_ANY_PROPERTY = 0, /* This must be the first enum, for iteration */
+ ICAL_CALSCALE_PROPERTY,
+ ICAL_METHOD_PROPERTY,
+ ICAL_PRODID_PROPERTY,
+ ICAL_VERSION_PROPERTY,
+ ICAL_ATTACH_PROPERTY,
+ ICAL_CATEGORIES_PROPERTY,
+ ICAL_CLASS_PROPERTY,
+ ICAL_COMMENT_PROPERTY,
+ ICAL_DESCRIPTION_PROPERTY,
+ ICAL_GEO_PROPERTY,
+ ICAL_LOCATION_PROPERTY,
+ ICAL_PERCENTCOMPLETE_PROPERTY,
+ ICAL_PRIORITY_PROPERTY,
+ ICAL_RESOURCES_PROPERTY,
+ ICAL_STATUS_PROPERTY,
+ ICAL_SUMMARY_PROPERTY,
+ ICAL_COMPLETED_PROPERTY,
+ ICAL_DTEND_PROPERTY,
+ ICAL_DUE_PROPERTY,
+ ICAL_DTSTART_PROPERTY,
+ ICAL_DURATION_PROPERTY,
+ ICAL_FREEBUSY_PROPERTY,
+ ICAL_TRANSP_PROPERTY,
+ ICAL_TZID_PROPERTY,
+ ICAL_TZNAME_PROPERTY,
+ ICAL_TZOFFSETFROM_PROPERTY,
+ ICAL_TZOFFSETTO_PROPERTY,
+ ICAL_TZURL_PROPERTY,
+ ICAL_ATTENDEE_PROPERTY,
+ ICAL_CONTACT_PROPERTY,
+ ICAL_ORGANIZER_PROPERTY,
+ ICAL_RECURRENCEID_PROPERTY,
+ ICAL_RELATEDTO_PROPERTY,
+ ICAL_URL_PROPERTY,
+ ICAL_UID_PROPERTY,
+ ICAL_EXDATE_PROPERTY,
+ ICAL_EXRULE_PROPERTY,
+ ICAL_RDATE_PROPERTY,
+ ICAL_RRULE_PROPERTY,
+ ICAL_ACTION_PROPERTY,
+ ICAL_REPEAT_PROPERTY,
+ ICAL_TRIGGER_PROPERTY,
+ ICAL_CREATED_PROPERTY,
+ ICAL_DTSTAMP_PROPERTY,
+ ICAL_LASTMODIFIED_PROPERTY,
+ ICAL_SEQUENCE_PROPERTY,
+ ICAL_REQUESTSTATUS_PROPERTY,
+ ICAL_X_PROPERTY,
+
+ /* CAP Properties */
+ ICAL_SCOPE_PROPERTY,
+ ICAL_MAXRESULTS_PROPERTY,
+ ICAL_MAXRESULTSSIZE_PROPERTY,
+ ICAL_QUERY_PROPERTY,
+ ICAL_QUERYNAME_PROPERTY,
+ ICAL_TARGET_PROPERTY,
+
+ /* libical private properties */
+ ICAL_XLICERROR_PROPERTY,
+ ICAL_XLICCLUSTERCOUNT_PROPERTY,
+
+ ICAL_NO_PROPERTY /* This must be the last enum, for iteration */
+
+} icalproperty_kind;
+
+/***********************************************************************
+ * Enumerations for the values of properties
+ ***********************************************************************/
+
+typedef enum icalproperty_method {
+ ICAL_METHOD_PUBLISH,
+ ICAL_METHOD_REQUEST,
+ ICAL_METHOD_REPLY,
+ ICAL_METHOD_ADD,
+ ICAL_METHOD_CANCEL,
+ ICAL_METHOD_REFRESH,
+ ICAL_METHOD_COUNTER,
+ ICAL_METHOD_DECLINECOUNTER,
+ /* CAP Methods */
+ ICAL_METHOD_CREATE,
+ ICAL_METHOD_READ,
+ ICAL_METHOD_RESPONSE,
+ ICAL_METHOD_MOVE,
+ ICAL_METHOD_MODIFY,
+ ICAL_METHOD_GENERATEUID,
+ ICAL_METHOD_DELETE,
+ ICAL_METHOD_NONE
+} icalproperty_method ;
+
+typedef enum icalproperty_transp {
+ ICAL_TRANSP_OPAQUE,
+ ICAL_TRANS_TRANSPARENT
+} icalproperty_trans;
+
+typedef enum icalproperty_calscale {
+ ICAL_CALSCALE_GREGORIAN
+} icalproperty_calscale ;
+
+
+typedef enum icalproperty_class {
+ ICAL_CLASS_PUBLIC,
+ ICAL_CLASS_PRIVATE,
+ ICAL_CLASS_CONFIDENTIAL,
+ ICAL_CLASS_XNAME
+} icalproperty_class;
+
+
+typedef enum icalproperty_status {
+ ICAL_STATUS_TENTATIVE,
+ ICAL_STATUS_CONFIRMED,
+ ICAL_STATUS_CANCELLED, /* CANCELED? SIC */
+ ICAL_STATUS_NEEDSACTION,
+ ICAL_STATUS_COMPLETED,
+ ICAL_STATUS_INPROCESS,
+ ICAL_STATUS_DRAFT,
+ ICAL_STATUS_FINAL
+} icalproperty_status;
+
+typedef enum icalproperty_action {
+ ICAL_ACTION_AUDIO,
+ ICAL_ACTION_DISPLAY,
+ ICAL_ACTION_EMAIL,
+ ICAL_ACTION_PROCEDURE,
+ ICAL_ACTION_XNAME
+} icalproperty_action;
+
+/***********************************************************************
+ * Value enumerations
+**********************************************************************/
+
+typedef enum icalvalue_kind {
+ ICAL_NO_VALUE,
+ ICAL_ATTACH_VALUE, /* Non-Standard*/
+ ICAL_BINARY_VALUE,
+ ICAL_BOOLEAN_VALUE,
+ ICAL_CALADDRESS_VALUE,
+ ICAL_DATE_VALUE,
+ ICAL_DATETIME_VALUE,
+ ICAL_DATETIMEDATE_VALUE, /* Non-Standard */
+ ICAL_DATETIMEPERIOD_VALUE, /* Non-Standard */
+ ICAL_DURATION_VALUE,
+ ICAL_FLOAT_VALUE,
+ ICAL_GEO_VALUE, /* Non-Standard */
+ ICAL_INTEGER_VALUE,
+ ICAL_METHOD_VALUE, /* Non-Standard */
+ ICAL_PERIOD_VALUE,
+ ICAL_RECUR_VALUE,
+ ICAL_STRING_VALUE, /* Non-Standard */
+ ICAL_TEXT_VALUE,
+ ICAL_TIME_VALUE,
+ ICAL_TRIGGER_VALUE, /* Non-Standard */
+ ICAL_URI_VALUE,
+ ICAL_UTCOFFSET_VALUE,
+ ICAL_QUERY_VALUE,
+ ICAL_XNAME_VALUE
+} icalvalue_kind;
+
+
+/***********************************************************************
+ * Parameter Enumerations
+ **********************************************************************/
+
+
+typedef enum icalparameter_kind {
+ ICAL_NO_PARAMETER,
+ ICAL_ANY_PARAMETER,
+ ICAL_ALTREP_PARAMETER, /* DQUOTE uri DQUOTE */
+ ICAL_CN_PARAMETER, /* text */
+ ICAL_CUTYPE_PARAMETER, /*INDIVIDUAL, GROUP, RESOURCE,ROOM,UNKNOWN, x-name*/
+ ICAL_DELEGATEDFROM_PARAMETER, /* *("," DQUOTE cal-address DQUOTE) */
+ ICAL_DELEGATEDTO_PARAMETER, /* *("," DQUOTE cal-address DQUOTE) */
+ ICAL_DIR_PARAMETER, /* DQUOTE uri DQUOTE */
+ ICAL_ENCODING_PARAMETER, /* *BIT, BASE64, x-name */
+ ICAL_FMTTYPE_PARAMETER, /* registered MINE content type */
+ ICAL_FBTYPE_PARAMETER, /* FREE, BUSY, BUSY-UNAVAILABLE, BUSY-TENTATIVE,x-name */
+ ICAL_LANGUAGE_PARAMETER, /* text from RFC 1766 */
+ ICAL_MEMBER_PARAMETER, /* DQUOTE cal-address DQUOTE */
+ ICAL_PARTSTAT_PARAMETER, /* NEEDS-ACTION, ACCEPTED, DECLINED, TENTATIVE, DELEGATED, x-name */
+ ICAL_RANGE_PARAMETER, /* THISANDPRIOR, THISANDFUTURE */
+ ICAL_RELATED_PARAMETER, /* START, END */
+ ICAL_RELTYPE_PARAMETER, /* PARENT, CHILD, SIBLING,x-name */
+ ICAL_ROLE_PARAMETER, /* CHAIR, REQ_PARTICIPANT, OPT_PARTICIPANT, NON_PARTICIPANT, x-name */
+ ICAL_RSVP_PARAMETER, /* TRUE. FALSE */
+ ICAL_SENTBY_PARAMETER, /* DQUOTE uri DQUOTE */
+ ICAL_TZID_PARAMETER, /* [tzidprefix] paramtext CRLF */
+ ICAL_VALUE_PARAMETER, /* BINARY, BOOLEAN, CAL_ADDRESS, DATE, DATE-TIME, DURATION, FLOAT, INTEGER, PERIOD, RECUR, TEXT, TIME, UTC_OFFSET, x-name */
+ ICAL_XLICERRORTYPE_PARAMETER, /*ICAL_XLICERROR_PARSE_ERROR,ICAL_XLICERROR_INVALID_ITIP*/
+ ICAL_XLICCOMPARETYPE_PARAMETER, /**/
+ ICAL_X_PARAMETER /* text */
+} icalparameter_kind;
+
+typedef enum icalparameter_cutype {
+ ICAL_CUTYPE_INDIVIDUAL,
+ ICAL_CUTYPE_GROUP,
+ ICAL_CUTYPE_RESOURCE,
+ ICAL_CUTYPE_ROOM,
+ ICAL_CUTYPE_UNKNOWN,
+ ICAL_CUTYPE_XNAME
+} icalparameter_cutype;
+
+
+typedef enum icalparameter_encoding {
+ ICAL_ENCODING_8BIT,
+ ICAL_ENCODING_BASE64,
+ ICAL_ENCODING_XNAME
+} icalparameter_encoding;
+
+typedef enum icalparameter_fbtype {
+ ICAL_FBTYPE_FREE,
+ ICAL_FBTYPE_BUSY,
+ ICAL_FBTYPE_BUSYUNAVAILABLE,
+ ICAL_FBTYPE_BUSYTENTATIVE,
+ ICAL_FBTYPE_XNAME
+} icalparameter_fbtype;
+
+typedef enum icalparameter_partstat {
+ ICAL_PARTSTAT_NEEDSACTION,
+ ICAL_PARTSTAT_ACCEPTED,
+ ICAL_PARTSTAT_DECLINED,
+ ICAL_PARTSTAT_TENTATIVE,
+ ICAL_PARTSTAT_DELEGATED,
+ ICAL_PARTSTAT_COMPLETED,
+ ICAL_PARTSTAT_INPROCESS,
+ ICAL_PARTSTAT_XNAME
+} icalparameter_partstat;
+
+typedef enum icalparameter_range {
+ ICAL_RANGE_THISANDPRIOR,
+ ICAL_RANGE_THISANDFUTURE
+} icalparameter_range;
+
+typedef enum icalparameter_related {
+ ICAL_RELATED_START,
+ ICAL_RELATED_END
+} icalparameter_related;
+
+typedef enum icalparameter_reltype {
+ ICAL_RELTYPE_PARENT,
+ ICAL_RELTYPE_CHILD,
+ ICAL_RELTYPE_SIBLING,
+ ICAL_RELTYPE_XNAME
+} icalparameter_reltype;
+
+typedef enum icalparameter_role {
+ ICAL_ROLE_CHAIR,
+ ICAL_ROLE_REQPARTICIPANT,
+ ICAL_ROLE_OPTPARTICIPANT,
+ ICAL_ROLE_NONPARTICIPANT,
+ ICAL_ROLE_XNAME
+} icalparameter_role;
+
+typedef enum icalparameter_xlicerrortype {
+ ICAL_XLICERRORTYPE_COMPONENTPARSEERROR,
+ ICAL_XLICERRORTYPE_PARAMETERVALUEPARSEERROR,
+ ICAL_XLICERRORTYPE_PARAMETERNAMEPARSEERROR,
+ ICAL_XLICERRORTYPE_PROPERTYPARSEERROR,
+ ICAL_XLICERRORTYPE_VALUEPARSEERROR,
+ ICAL_XLICERRORTYPE_INVALIDITIP
+} icalparameter_xlicerrortype;
+
+typedef enum icalparameter_xliccomparetype {
+ ICAL_XLICCOMPARETYPE_EQUAL=0,
+ ICAL_XLICCOMPARETYPE_LESS=-1,
+ ICAL_XLICCOMPARETYPE_LESSEQUAL=2,
+ ICAL_XLICCOMPARETYPE_GREATER=1,
+ ICAL_XLICCOMPARETYPE_GREATEREQUAL=3,
+ ICAL_XLICCOMPARETYPE_NOTEQUAL=4,
+ ICAL_XLICCOMPARETYPE_REGEX=5
+} icalparameter_xliccomparetype;
+
+typedef enum icalparameter_value {
+ ICAL_VALUE_XNAME = ICAL_XNAME_VALUE,
+ ICAL_VALUE_BINARY = ICAL_BINARY_VALUE,
+ ICAL_VALUE_BOOLEAN = ICAL_BOOLEAN_VALUE,
+ ICAL_VALUE_CALADDRESS = ICAL_CALADDRESS_VALUE,
+ ICAL_VALUE_DATE = ICAL_DATE_VALUE,
+ ICAL_VALUE_DATETIME = ICAL_DATETIME_VALUE,
+ ICAL_VALUE_DURATION = ICAL_DURATION_VALUE,
+ ICAL_VALUE_FLOAT = ICAL_FLOAT_VALUE,
+ ICAL_VALUE_INTEGER = ICAL_INTEGER_VALUE,
+ ICAL_VALUE_PERIOD = ICAL_PERIOD_VALUE,
+ ICAL_VALUE_RECUR = ICAL_RECUR_VALUE,
+ ICAL_VALUE_TEXT = ICAL_TEXT_VALUE,
+ ICAL_VALUE_TIME = ICAL_TIME_VALUE,
+ ICAL_VALUE_UTCOFFSET = ICAL_UTCOFFSET_VALUE,
+ ICAL_VALUE_URI = ICAL_URI_VALUE,
+ ICAL_VALUE_ERROR = ICAL_NO_VALUE
+} icalparameter_value;
+
+/***********************************************************************
+ * Recurrances
+**********************************************************************/
+
+
+typedef enum icalrecurrencetype_frequency
+{
+ ICAL_NO_RECURRENCE,
+ ICAL_SECONDLY_RECURRENCE,
+ ICAL_MINUTELY_RECURRENCE,
+ ICAL_HOURLY_RECURRENCE,
+ ICAL_DAILY_RECURRENCE,
+ ICAL_WEEKLY_RECURRENCE,
+ ICAL_MONTHLY_RECURRENCE,
+ ICAL_YEARLY_RECURRENCE
+} icalrecurrencetype_frequency;
+
+typedef enum icalrecurrencetype_weekday
+{
+ ICAL_NO_WEEKDAY,
+ ICAL_SUNDAY_WEEKDAY,
+ ICAL_MONDAY_WEEKDAY,
+ ICAL_TUESDAY_WEEKDAY,
+ ICAL_WEDNESDAY_WEEKDAY,
+ ICAL_THURSDAY_WEEKDAY,
+ ICAL_FRIDAY_WEEKDAY,
+ ICAL_SATURDAY_WEEKDAY
+} icalrecurrencetype_weekday;
+
+enum {
+ ICAL_RECURRENCE_ARRAY_MAX = 0x7f7f,
+ ICAL_RECURRENCE_ARRAY_MAX_BYTE = 0x7f
+};
+
+
+char* icalenum_recurrence_to_string(icalrecurrencetype_frequency kind);
+char* icalenum_weekday_to_string(icalrecurrencetype_weekday kind);
+
+/***********************************************************************
+ * Request Status codes
+ **********************************************************************/
+
+typedef enum icalrequeststatus {
+ ICAL_UNKNOWN_STATUS,
+ ICAL_2_0_SUCCESS_STATUS,
+ ICAL_2_1_FALLBACK_STATUS,
+ ICAL_2_2_IGPROP_STATUS,
+ ICAL_2_3_IGPARAM_STATUS,
+ ICAL_2_4_IGXPROP_STATUS,
+ ICAL_2_5_IGXPARAM_STATUS,
+ ICAL_2_6_IGCOMP_STATUS,
+ ICAL_2_7_FORWARD_STATUS,
+ ICAL_2_8_ONEEVENT_STATUS,
+ ICAL_2_9_TRUNC_STATUS,
+ ICAL_2_10_ONETODO_STATUS,
+ ICAL_2_11_TRUNCRRULE_STATUS,
+ ICAL_3_0_INVPROPNAME_STATUS,
+ ICAL_3_1_INVPROPVAL_STATUS,
+ ICAL_3_2_INVPARAM_STATUS,
+ ICAL_3_3_INVPARAMVAL_STATUS,
+ ICAL_3_4_INVCOMP_STATUS,
+ ICAL_3_5_INVTIME_STATUS,
+ ICAL_3_6_INVRULE_STATUS,
+ ICAL_3_7_INVCU_STATUS,
+ ICAL_3_8_NOAUTH_STATUS,
+ ICAL_3_9_BADVERSION_STATUS,
+ ICAL_3_10_TOOBIG_STATUS,
+ ICAL_3_11_MISSREQCOMP_STATUS,
+ ICAL_3_12_UNKCOMP_STATUS,
+ ICAL_3_13_BADCOMP_STATUS,
+ ICAL_3_14_NOCAP_STATUS,
+ ICAL_4_0_BUSY_STATUS,
+ ICAL_5_0_MAYBE_STATUS,
+ ICAL_5_1_UNAVAIL_STATUS,
+ ICAL_5_2_NOSERVICE_STATUS,
+ ICAL_5_3_NOSCHED_STATUS
+} icalrequeststatus;
+
+
+char* icalenum_reqstat_desc(icalrequeststatus stat);
+short icalenum_reqstat_major(icalrequeststatus stat);
+short icalenum_reqstat_minor(icalrequeststatus stat);
+icalrequeststatus icalenum_num_to_reqstat(short major, short minor);
+
+/***********************************************************************
+ * Conversion functions
+**********************************************************************/
+
+char* icalenum_property_kind_to_string(icalproperty_kind kind);
+icalproperty_kind icalenum_string_to_property_kind(char* string);
+
+char* icalenum_value_kind_to_string(icalvalue_kind kind);
+icalvalue_kind icalenum_value_kind_by_prop(icalproperty_kind kind);
+
+char* icalenum_parameter_kind_to_string(icalparameter_kind kind);
+icalparameter_kind icalenum_string_to_parameter_kind(char* string);
+
+char* icalenum_component_kind_to_string(icalcomponent_kind kind);
+icalcomponent_kind icalenum_string_to_component_kind(char* string);
+
+icalvalue_kind icalenum_property_kind_to_value_kind(icalproperty_kind kind);
+
+char* icalenum_method_to_string(icalproperty_method);
+icalproperty_method icalenum_string_to_method(char* string);
+
+#endif /* !ICALENUMS_H */
+
+
+
diff --git a/libical/src/libical/icalerror.c b/libical/src/libical/icalerror.c
new file mode 100644
index 0000000000..fb9e152b16
--- /dev/null
+++ b/libical/src/libical/icalerror.c
@@ -0,0 +1,99 @@
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: icalerror.c
+ CREATOR: eric 16 May 1999
+
+ $Id$
+ $Locker$
+
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The original author is Eric Busboom
+ The original code is icalerror.c
+
+ ======================================================================*/
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "icalerror.h"
+
+icalerrorenum icalerrno;
+
+int foo;
+void icalerror_stop_here(void)
+{
+ foo++; /* Keep optimizers from removing routine */
+}
+
+void icalerror_crash_here(void)
+{
+ int *p=0;
+ *p = 1;
+
+ assert( *p);
+}
+
+
+void icalerror_clear_errno() {
+
+ icalerrno = ICAL_NO_ERROR;
+}
+
+void icalerror_set_errno(icalerrorenum e) {
+
+ icalerror_stop_here();
+ icalerrno = e;
+}
+
+
+struct icalerror_string_map {
+ icalerrorenum error;
+ char name[160];
+};
+
+static struct icalerror_string_map string_map[] =
+{
+ {ICAL_BADARG_ERROR,"Bad argumnet to function"},
+ {ICAL_NEWFAILED_ERROR,"Failed to create a new object via a *_new() routine"},
+ {ICAL_MALFORMEDDATA_ERROR,"An input string was not correctly formed"},
+ {ICAL_PARSE_ERROR,"Failed to parse a part of an iCal componet"},
+ {ICAL_INTERNAL_ERROR,"Random internal error. This indicates an error in the library code, not an error in use"},
+ {ICAL_FILE_ERROR,"An operation on a file failed. Check errno for more detail."},
+ {ICAL_ALLOCATION_ERROR,"Failed to allocate memory"},
+ {ICAL_USAGE_ERROR,"The caller failed to properly sequence called to an object's interface"},
+ {ICAL_NO_ERROR,"No error"},
+ {ICAL_UNKNOWN_ERROR,"Unknown error type -- icalerror_strerror() was probably given bad input"}
+};
+
+
+char* icalerror_strerror(icalerrorenum e) {
+
+ int i;
+
+ for (i=0; string_map[i].error != ICAL_UNKNOWN_ERROR; i++) {
+ if (string_map[i].error == e) {
+ return string_map[i].name;
+ }
+ }
+
+ return string_map[i].name; /* Return string for ICAL_UNKNOWN_ERROR*/
+
+}
+
+
+
diff --git a/libical/src/libical/icalerror.h b/libical/src/libical/icalerror.h
new file mode 100644
index 0000000000..124699c21b
--- /dev/null
+++ b/libical/src/libical/icalerror.h
@@ -0,0 +1,141 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalerror.h
+ CREATOR: eric 09 May 1999
+
+ $Id$
+
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The original author is Eric Busboom
+ The original code is icalerror.h
+
+======================================================================*/
+
+
+#ifndef ICALERROR_H
+#define ICALERROR_H
+
+#include <assert.h>
+#include <stdio.h> /* For icalerror_warn() */
+
+/* This routine is called before any error is triggered. It is called
+ by icalerror_set_errno, so it does not appear in all of the macros
+ below */
+void icalerror_stop_here(void);
+
+void icalerror_crash_here(void);
+
+#ifdef ICAL_ERRORS_ARE_FATAL
+#undef NDEBUG
+#endif
+
+#define icalerror_check_value_type(value,type);
+#define icalerror_check_property_type(value,type);
+#define icalerror_check_parameter_type(value,type);
+#define icalerror_check_component_type(value,type);
+
+/* Assert with a message */
+#ifdef ICAL_ERRORS_ARE_FATAL
+
+#ifdef __GNUC__
+#define icalerror_assert(test,message) if(!(test)){fprintf(stderr,"%s(), %s:%d: %s\n",__FUNCTION__,__FILE__,__LINE__,message);icalerror_stop_here(); abort();}
+#else /*__GNUC__*/
+#define icalerror_assert(test,message) if(!(test)){fprintf(stderr,"%s:%d: %s\n",__FILE__,__LINE__,message);icalerror_stop_here(); abort();}
+#endif /*__GNUC__*/
+#else
+#define icalerror_assert(test,message)
+#endif
+
+
+/* Check & abort if check fails */
+#ifdef ICAL_ERRORS_ARE_FATAL
+#define icalerror_check_arg(test,arg) icalerror_stop_here();assert(test)
+#else
+#define icalerror_check_arg(test,arg)
+#endif
+/* Check & return void if check failes*/
+
+#ifdef ICAL_ERRORS_ARE_FATAL
+#define icalerror_check_arg_rv(test,arg) icalerror_stop_here();assert(test);
+#else
+#define icalerror_check_arg_rv(test,arg) if(!(test)) { icalerror_set_errno(ICAL_BADARG_ERROR); return; }
+#endif
+
+/* Check & return 0 if check failes*/
+#ifdef ICAL_ERRORS_ARE_FATAL
+#define icalerror_check_arg_rz(test,arg) icalerror_stop_here();assert(test);
+#else
+#define icalerror_check_arg_rz(test,arg) if(!(test)) {icalerror_set_errno(ICAL_BADARG_ERROR); return 0;}
+#endif
+
+
+/* Check & return an error if check failes*/
+#ifdef ICAL_ERRORS_ARE_FATAL
+#define icalerror_check_arg_re(test,arg,error) icalerror_stop_here();assert(test);
+#else
+#define icalerror_check_arg_re(test,arg,error) if(!(test)) {icalerror_stop_here(); return error;}
+#endif
+
+
+/* Warning messages */
+
+#ifdef ICAL_ERRORS_ARE_FATAL
+
+#ifdef __GNUC__
+#define icalerror_warn(message) {fprintf(stderr,"%s(), %s:%d: %s\n",__FUNCTION__,__FILE__,__LINE__,message); abort();}
+#else /* __GNU_C__ */
+#define icalerror_warn(message) {fprintf(stderr,"%s:%d: %s\n",__FILE__,__LINE__,message); abort();}
+#endif /* __GNU_C__ */
+
+#else /*ICAL_ERRORS_ARE_FATAL */
+
+#ifdef __GNUC__
+#define icalerror_warn(message) {fprintf(stderr,"%s(), %s:%d: %s\n",__FUNCTION__,__FILE__,__LINE__,message);}
+#else /* __GNU_C__ */
+#define icalerror_warn(message) {fprintf(stderr,"%s:%d: %s\n",__FILE__,__LINE__,message);}
+#endif /* __GNU_C__ */
+
+#endif /*ICAL_ERRORS_ARE_FATAL*/
+
+typedef enum icalerrorenum {
+
+ ICAL_BADARG_ERROR,
+ ICAL_NEWFAILED_ERROR,
+ ICAL_MALFORMEDDATA_ERROR,
+ ICAL_PARSE_ERROR,
+ ICAL_INTERNAL_ERROR, /* Like assert --internal consist. prob */
+ ICAL_FILE_ERROR,
+ ICAL_ALLOCATION_ERROR,
+ ICAL_USAGE_ERROR,
+ ICAL_NO_ERROR,
+ ICAL_MULTIPLEINCLUSION_ERROR,
+ ICAL_UNKNOWN_ERROR /* Used for problems in input to icalerror_strerror()*/
+
+} icalerrorenum;
+
+extern icalerrorenum icalerrno;
+
+
+void icalerror_clear_errno();
+void icalerror_set_errno(icalerrorenum);
+
+char* icalerror_strerror(icalerrorenum e);
+
+
+#endif /* !ICALERROR_H */
+
+
+
diff --git a/libical/src/libical/icalirip.h b/libical/src/libical/icalirip.h
new file mode 100644
index 0000000000..eefbca35c5
--- /dev/null
+++ b/libical/src/libical/icalirip.h
@@ -0,0 +1,108 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalirip.h
+ CREATOR: eric 20 April 1999
+
+ $Id$
+
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The original author is Eric Busboom
+ The original code is icalirip.h
+
+======================================================================*/
+
+
+#ifndef ICALIRIP_H
+#define ICALIRIP_H
+
+#include "ical.h"
+
+typedef void* icalirip;
+
+/********************** Server (Reciever) Interfaces *************************/
+
+icalirip* icalirip_new();
+void* icalirip_free();
+
+/* Protocol functions */
+char* icalirip_process_request(icalirip* irip, char* string);
+
+/* iRIP server stubs */
+typedef struct icalirip_response {
+ char code[6];
+ char caluid[1024];
+ void* result;
+} icalirip_response;
+
+icalirip_response icalirip_timedout_stub(icalirip* irip);
+icalirip_response icalirip_authenticate_stub(icalirip* irip, char* mechanism, char* data);
+icalirip_response icalirip_sendata_stub(icalirip* irip, unsigned int time);
+icalirip_response icalirip_dequeue_stub(icalirip* irip, char* caluid,unsigned int time);
+icalirip_response icalirip_recipient_stub(icalirip* irip, char* address, unsigned int time);
+icalirip_response icalirip_switch_stub(icalirip* irip);
+icalirip_response icalirip_disconnect_stub(icalirip* irip);
+icalirip_response icalirip_unknown_stub(icalirip* irip, char* command);
+
+/* icalirip_set_stubs makes the module use function pointers to
+instead of the above stubs. The set_stubs procedure will requires the
+user to link another library with defined the above stubs and
+re-directs the call to the appropriate pointer to function. */
+
+typedef struct icalirip_stubs {
+
+ void(*authenticate_stub)(icalirip* irip, char* mechanism, char* data);
+ void (*sendata_stub)(icalirip* irip, unsigned int time);
+ void (*dequeue_stub)(icalirip* irip, char* caluid, unsigned int time);
+ void (*recipient_stub)(icalirip* irip, char* address, unsigned int time);
+ void (*switch_stub)(icalirip* irip);
+ void (*disconnect_stub)();
+ void (*unknown_stub)(icalirip* irip, char* command, char** data);
+
+} icalirip_stubs;
+
+void icalirip_set_stubs(icalirip* irip, icalirip_stubs* stubs);
+
+/********************** Client (Sender) Interfaces **************************/
+
+/* Client API */
+icalirip_response icalirip_abort(icalirip* irip);
+icalirip_response icalirip_authenticate(icalirip* irip, char* mechanism, char* data);
+icalirip_response icalirip_capability(icalirip* irip);
+icalirip_response icalirip_continue(icalirip* irip, unsigned int time);
+icalirip_response icalirip_sendata(icalirip* irip, icalcomponent* comp, unsigned int time);
+icalirip_response icalirip_recipient(icalirip* irip, char* address, unsigned int time);
+icalirip_response icalirip_dequeue(icalirip* irip, char* address, unsigned int time);
+icalirip_response icalirip_switch(icalirip* irip);
+icalirip_response icalirip_disconnect();
+icalirip_response icalirip_unknown(icalirip* irip, char* command);
+
+/* client stubs */
+void icalirip_send_request(icalirip* irip,char* request);
+char* icalirip_get_response(icalirip* irip);
+
+/********************** Configuration Interfaces **************************/
+
+/* Configure capabilities */
+void icalirip_add_auth_mechanism(icalirip* irip, char* auth);
+void icalirip_set_max_object_size(icalirip* irip, unsigned int size);
+void icalirip_set_max_date(icalirip* irip, time_t time);
+void icalirip_set_min_date(icalirip* irip, time_t time);
+
+
+#endif /* !ICALIRIP_H */
+
+
+
diff --git a/libical/src/libical/icalitip.output b/libical/src/libical/icalitip.output
new file mode 100644
index 0000000000..1218f89c74
--- /dev/null
+++ b/libical/src/libical/icalitip.output
@@ -0,0 +1,1698 @@
+
+
+Terminals which are not used:
+
+ FLOATNUMBER
+ STRING
+ EOL
+ CHARACTER
+ COLON
+ TIMESEPERATOR
+ BIT8
+ ACCEPTED
+ ADD
+ AUDIO
+ BASE64
+ BINARY
+ BOOLEAN
+ BUSY
+ BUSYTENTATIVE
+ BUSYUNAVAILABLE
+ CALADDRESS
+ CANCEL
+ CANCELLED
+ CHAIR
+ CHILD
+ COMPLETED
+ CONFIDENTIAL
+ CONFIRMED
+ COUNTER
+ DATE
+ DATETIME
+ DECLINECOUNTER
+ DECLINED
+ DELEGATED
+ DISPLAY
+ DRAFT
+ DURATION
+ EMAIL
+ END
+ FINAL
+ FLOAT
+ FREE
+ GREGORIAN
+ GROUP
+ INDIVIDUAL
+ INPROCESS
+ INTEGER
+ NEEDSACTION
+ NONPARTICIPANT
+ OPAQUE
+ OPTPARTICIPANT
+ PARENT
+ PERIOD
+ PRIVATE
+ PROCEDURE
+ PUBLIC
+ PUBLISH
+ RECUR
+ REFRESH
+ REPLY
+ REQPARTICIPANT
+ REQUEST
+ RESOURCE
+ ROOM
+ SIBLING
+ START
+ TENTATIVE
+ TEXT
+ THISANDFUTURE
+ THISANDPRIOR
+ TIME
+ TRANSPAENT
+ UNKNOWN
+ UTCOFFSET
+ XNAME
+ ALTREP
+ CN
+ CUTYPE
+ DAYLIGHT
+ DIR
+ ENCODING
+ EVENT
+ FBTYPE
+ FMTTYPE
+ LANGUAGE
+ MEMBER
+ PARTSTAT
+ RANGE
+ RELATED
+ RELTYPE
+ ROLE
+ RSVP
+ SENTBY
+ STANDARD
+ URI
+
+
+
+Grammar
+rule 1 value -> binary_value
+rule 2 value -> boolean_value
+rule 3 value -> date_value
+rule 4 value -> datetime_value
+rule 5 value -> duration_value
+rule 6 value -> period_value
+rule 7 value -> recur_value
+rule 8 value -> utcoffset_value
+rule 9 value -> error
+rule 10 binary_value -> "unimplemented2"
+rule 11 boolean_value -> TRUE
+rule 12 boolean_value -> FALSE
+rule 13 date_value -> DIGITS
+rule 14 utc_char -> /* empty */
+rule 15 utc_char -> UTC_CHAR
+rule 16 utc_char_b -> /* empty */
+rule 17 utc_char_b -> UTC_CHAR
+rule 18 datetime_value -> DIGITS TIME_CHAR DIGITS utc_char
+rule 19 dur_date -> dur_day
+rule 20 dur_date -> dur_day dur_time
+rule 21 dur_week -> DIGITS 'W'
+rule 22 dur_time -> TIME_CHAR dur_hour
+rule 23 dur_time -> TIME_CHAR dur_minute
+rule 24 dur_time -> TIME_CHAR dur_second
+rule 25 dur_hour -> DIGITS 'H'
+rule 26 dur_hour -> DIGITS 'H' dur_minute
+rule 27 dur_minute -> DIGITS 'M'
+rule 28 dur_minute -> DIGITS 'M' dur_second
+rule 29 dur_second -> DIGITS 'S'
+rule 30 dur_day -> DIGITS 'D'
+rule 31 dur_prefix -> /* empty */
+rule 32 dur_prefix -> '+'
+rule 33 dur_prefix -> '-'
+rule 34 duration_value -> dur_prefix 'P' dur_date
+rule 35 duration_value -> dur_prefix 'P' dur_time
+rule 36 duration_value -> dur_prefix 'P' dur_week
+rule 37 period_value -> DIGITS TIME_CHAR DIGITS utc_char '/' DIGITS TIME_CHAR DIGITS utc_char_b
+rule 38 period_value -> DIGITS TIME_CHAR DIGITS utc_char '/' duration_value
+rule 39 recur_start -> FREQ EQUALS SECONDLY
+rule 40 recur_start -> FREQ EQUALS MINUTELY
+rule 41 recur_start -> FREQ EQUALS HOURLY
+rule 42 recur_start -> FREQ EQUALS DAILY
+rule 43 recur_start -> FREQ EQUALS WEEKLY
+rule 44 recur_start -> FREQ EQUALS MONTHLY
+rule 45 recur_start -> FREQ EQUALS YEARLY
+rule 46 weekday -> SU
+rule 47 weekday -> MO
+rule 48 weekday -> TU
+rule 49 weekday -> WE
+rule 50 weekday -> TH
+rule 51 weekday -> FR
+rule 52 weekday -> SA
+rule 53 weekday_list -> weekday
+rule 54 weekday_list -> DIGITS weekday
+rule 55 weekday_list -> weekday_list COMMA weekday
+rule 56 recur_list -> DIGITS
+rule 57 recur_list -> recur_list COMMA DIGITS
+rule 58 recur_skip -> INTERVAL EQUALS DIGITS
+rule 59 recur_skip -> WKST EQUALS SU
+rule 60 recur_skip -> WKST EQUALS MO
+rule 61 recur_skip -> WKST EQUALS TU
+rule 62 recur_skip -> WKST EQUALS WE
+rule 63 recur_skip -> WKST EQUALS TH
+rule 64 recur_skip -> WKST EQUALS FR
+rule 65 recur_skip -> WKST EQUALS SA
+rule 66 recur_skip -> BYSECOND EQUALS recur_list
+rule 67 recur_skip -> BYMINUTE EQUALS recur_list
+rule 68 recur_skip -> BYHOUR EQUALS recur_list
+rule 69 recur_skip -> BYDAY EQUALS weekday_list
+rule 70 recur_skip -> BYMONTH EQUALS recur_list
+rule 71 recur_skip -> BYMONTHDAY EQUALS recur_list
+rule 72 recur_skip -> BYYEARDAY EQUALS recur_list
+rule 73 recur_skip -> BYWEEKNO EQUALS recur_list
+rule 74 recur_skip -> BYSETPOS EQUALS recur_list
+rule 75 recur_skip -> UNTIL EQUALS datetime_value
+rule 76 recur_skip -> UNTIL EQUALS date_value
+rule 77 recur_skip -> COUNT EQUALS DIGITS
+rule 78 recur_skip_list -> /* empty */
+rule 79 recur_skip_list -> recur_skip_list SEMICOLON recur_skip
+rule 80 recur_value -> recur_start recur_skip_list
+rule 81 plusminus -> '+'
+rule 82 plusminus -> '-'
+rule 83 utcoffset_value -> plusminus INTNUMBER INTNUMBER
+rule 84 utcoffset_value -> plusminus INTNUMBER INTNUMBER INTNUMBER
+
+Terminals, with rules where they appear
+
+$ (-1)
+'+' (43) 32 81
+'-' (45) 33 82
+'/' (47) 37 38
+'D' (68) 30
+'H' (72) 25 26
+'M' (77) 27 28
+'P' (80) 34 35 36
+'S' (83) 29
+'W' (87) 21
+error (256) 9
+DIGITS (257) 13 18 21 25 26 27 28 29 30 37 38 54 56 57 58 77
+INTNUMBER (258) 83 84
+FLOATNUMBER (259)
+STRING (260)
+EOL (261)
+EQUALS (262) 39 40 41 42 43 44 45 58 59 60 61 62 63 64 65 66 67 68
+ 69 70 71 72 73 74 75 76 77
+CHARACTER (263)
+COLON (264)
+COMMA (265) 55 57
+SEMICOLON (266) 79
+TIMESEPERATOR (267)
+TRUE (268) 11
+FALSE (269) 12
+FREQ (270) 39 40 41 42 43 44 45
+BYDAY (271) 69
+BYHOUR (272) 68
+BYMINUTE (273) 67
+BYMONTH (274) 70
+BYMONTHDAY (275) 71
+BYSECOND (276) 66
+BYSETPOS (277) 74
+BYWEEKNO (278) 73
+BYYEARDAY (279) 72
+DAILY (280) 42
+MINUTELY (281) 40
+MONTHLY (282) 44
+SECONDLY (283) 39
+WEEKLY (284) 43
+HOURLY (285) 41
+YEARLY (286) 45
+INTERVAL (287) 58
+COUNT (288) 77
+UNTIL (289) 75 76
+WKST (290) 59 60 61 62 63 64 65
+MO (291) 47 60
+SA (292) 52 65
+SU (293) 46 59
+TU (294) 48 61
+WE (295) 49 62
+TH (296) 50 63
+FR (297) 51 64
+BIT8 (298)
+ACCEPTED (299)
+ADD (300)
+AUDIO (301)
+BASE64 (302)
+BINARY (303)
+BOOLEAN (304)
+BUSY (305)
+BUSYTENTATIVE (306)
+BUSYUNAVAILABLE (307)
+CALADDRESS (308)
+CANCEL (309)
+CANCELLED (310)
+CHAIR (311)
+CHILD (312)
+COMPLETED (313)
+CONFIDENTIAL (314)
+CONFIRMED (315)
+COUNTER (316)
+DATE (317)
+DATETIME (318)
+DECLINECOUNTER (319)
+DECLINED (320)
+DELEGATED (321)
+DISPLAY (322)
+DRAFT (323)
+DURATION (324)
+EMAIL (325)
+END (326)
+FINAL (327)
+FLOAT (328)
+FREE (329)
+GREGORIAN (330)
+GROUP (331)
+INDIVIDUAL (332)
+INPROCESS (333)
+INTEGER (334)
+NEEDSACTION (335)
+NONPARTICIPANT (336)
+OPAQUE (337)
+OPTPARTICIPANT (338)
+PARENT (339)
+PERIOD (340)
+PRIVATE (341)
+PROCEDURE (342)
+PUBLIC (343)
+PUBLISH (344)
+RECUR (345)
+REFRESH (346)
+REPLY (347)
+REQPARTICIPANT (348)
+REQUEST (349)
+RESOURCE (350)
+ROOM (351)
+SIBLING (352)
+START (353)
+TENTATIVE (354)
+TEXT (355)
+THISANDFUTURE (356)
+THISANDPRIOR (357)
+TIME (358)
+TRANSPAENT (359)
+UNKNOWN (360)
+UTCOFFSET (361)
+XNAME (362)
+ALTREP (363)
+CN (364)
+CUTYPE (365)
+DAYLIGHT (366)
+DIR (367)
+ENCODING (368)
+EVENT (369)
+FBTYPE (370)
+FMTTYPE (371)
+LANGUAGE (372)
+MEMBER (373)
+PARTSTAT (374)
+RANGE (375)
+RELATED (376)
+RELTYPE (377)
+ROLE (378)
+RSVP (379)
+SENTBY (380)
+STANDARD (381)
+URI (382)
+TIME_CHAR (383) 18 22 23 24 37 38
+UTC_CHAR (384) 15 17
+"unimplemented2" (385) 10
+
+Nonterminals, with rules where they appear
+
+value (141)
+ on left: 1 2 3 4 5 6 7 8 9
+binary_value (142)
+ on left: 10, on right: 1
+boolean_value (143)
+ on left: 11 12, on right: 2
+date_value (144)
+ on left: 13, on right: 3 76
+utc_char (145)
+ on left: 14 15, on right: 18 37 38
+utc_char_b (146)
+ on left: 16 17, on right: 37
+datetime_value (147)
+ on left: 18, on right: 4 75
+dur_date (148)
+ on left: 19 20, on right: 34
+dur_week (149)
+ on left: 21, on right: 36
+dur_time (150)
+ on left: 22 23 24, on right: 20 35
+dur_hour (151)
+ on left: 25 26, on right: 22
+dur_minute (152)
+ on left: 27 28, on right: 23 26
+dur_second (153)
+ on left: 29, on right: 24 28
+dur_day (154)
+ on left: 30, on right: 19 20
+dur_prefix (155)
+ on left: 31 32 33, on right: 34 35 36
+duration_value (156)
+ on left: 34 35 36, on right: 5 38
+period_value (157)
+ on left: 37 38, on right: 6
+recur_start (158)
+ on left: 39 40 41 42 43 44 45, on right: 80
+weekday (159)
+ on left: 46 47 48 49 50 51 52, on right: 53 54 55
+weekday_list (160)
+ on left: 53 54 55, on right: 55 69
+recur_list (161)
+ on left: 56 57, on right: 57 66 67 68 70 71 72 73 74
+recur_skip (162)
+ on left: 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
+ 76 77, on right: 79
+recur_skip_list (163)
+ on left: 78 79, on right: 79 80
+recur_value (164)
+ on left: 80, on right: 7
+plusminus (165)
+ on left: 81 82, on right: 83 84
+utcoffset_value (166)
+ on left: 83 84, on right: 8
+
+
+state 0
+
+ error shift, and go to state 1
+ DIGITS shift, and go to state 2
+ TRUE shift, and go to state 3
+ FALSE shift, and go to state 4
+ FREQ shift, and go to state 5
+ "unimplemented2" shift, and go to state 6
+ '+' shift, and go to state 7
+ '-' shift, and go to state 8
+
+ 'P' reduce using rule 31 (dur_prefix)
+
+ value go to state 133
+ binary_value go to state 9
+ boolean_value go to state 10
+ date_value go to state 11
+ datetime_value go to state 12
+ dur_prefix go to state 13
+ duration_value go to state 14
+ period_value go to state 15
+ recur_start go to state 16
+ recur_value go to state 17
+ plusminus go to state 18
+ utcoffset_value go to state 19
+
+
+
+state 1
+
+ value -> error . (rule 9)
+
+ $default reduce using rule 9 (value)
+
+
+
+state 2
+
+ date_value -> DIGITS . (rule 13)
+ datetime_value -> DIGITS . TIME_CHAR DIGITS utc_char (rule 18)
+ period_value -> DIGITS . TIME_CHAR DIGITS utc_char '/' DIGITS TIME_CHAR DIGITS utc_char_b (rule 37)
+ period_value -> DIGITS . TIME_CHAR DIGITS utc_char '/' duration_value (rule 38)
+
+ TIME_CHAR shift, and go to state 20
+
+ $default reduce using rule 13 (date_value)
+
+
+
+state 3
+
+ boolean_value -> TRUE . (rule 11)
+
+ $default reduce using rule 11 (boolean_value)
+
+
+
+state 4
+
+ boolean_value -> FALSE . (rule 12)
+
+ $default reduce using rule 12 (boolean_value)
+
+
+
+state 5
+
+ recur_start -> FREQ . EQUALS SECONDLY (rule 39)
+ recur_start -> FREQ . EQUALS MINUTELY (rule 40)
+ recur_start -> FREQ . EQUALS HOURLY (rule 41)
+ recur_start -> FREQ . EQUALS DAILY (rule 42)
+ recur_start -> FREQ . EQUALS WEEKLY (rule 43)
+ recur_start -> FREQ . EQUALS MONTHLY (rule 44)
+ recur_start -> FREQ . EQUALS YEARLY (rule 45)
+
+ EQUALS shift, and go to state 21
+
+
+
+state 6
+
+ binary_value -> "unimplemented2" . (rule 10)
+
+ $default reduce using rule 10 (binary_value)
+
+
+
+state 7
+
+ dur_prefix -> '+' . (rule 32)
+ plusminus -> '+' . (rule 81)
+
+ INTNUMBER reduce using rule 81 (plusminus)
+ $default reduce using rule 32 (dur_prefix)
+
+
+
+state 8
+
+ dur_prefix -> '-' . (rule 33)
+ plusminus -> '-' . (rule 82)
+
+ INTNUMBER reduce using rule 82 (plusminus)
+ $default reduce using rule 33 (dur_prefix)
+
+
+
+state 9
+
+ value -> binary_value . (rule 1)
+
+ $default reduce using rule 1 (value)
+
+
+
+state 10
+
+ value -> boolean_value . (rule 2)
+
+ $default reduce using rule 2 (value)
+
+
+
+state 11
+
+ value -> date_value . (rule 3)
+
+ $default reduce using rule 3 (value)
+
+
+
+state 12
+
+ value -> datetime_value . (rule 4)
+
+ $default reduce using rule 4 (value)
+
+
+
+state 13
+
+ duration_value -> dur_prefix . 'P' dur_date (rule 34)
+ duration_value -> dur_prefix . 'P' dur_time (rule 35)
+ duration_value -> dur_prefix . 'P' dur_week (rule 36)
+
+ 'P' shift, and go to state 22
+
+
+
+state 14
+
+ value -> duration_value . (rule 5)
+
+ $default reduce using rule 5 (value)
+
+
+
+state 15
+
+ value -> period_value . (rule 6)
+
+ $default reduce using rule 6 (value)
+
+
+
+state 16
+
+ recur_value -> recur_start . recur_skip_list (rule 80)
+
+ $default reduce using rule 78 (recur_skip_list)
+
+ recur_skip_list go to state 23
+
+
+
+state 17
+
+ value -> recur_value . (rule 7)
+
+ $default reduce using rule 7 (value)
+
+
+
+state 18
+
+ utcoffset_value -> plusminus . INTNUMBER INTNUMBER (rule 83)
+ utcoffset_value -> plusminus . INTNUMBER INTNUMBER INTNUMBER (rule 84)
+
+ INTNUMBER shift, and go to state 24
+
+
+
+state 19
+
+ value -> utcoffset_value . (rule 8)
+
+ $default reduce using rule 8 (value)
+
+
+
+state 20
+
+ datetime_value -> DIGITS TIME_CHAR . DIGITS utc_char (rule 18)
+ period_value -> DIGITS TIME_CHAR . DIGITS utc_char '/' DIGITS TIME_CHAR DIGITS utc_char_b (rule 37)
+ period_value -> DIGITS TIME_CHAR . DIGITS utc_char '/' duration_value (rule 38)
+
+ DIGITS shift, and go to state 25
+
+
+
+state 21
+
+ recur_start -> FREQ EQUALS . SECONDLY (rule 39)
+ recur_start -> FREQ EQUALS . MINUTELY (rule 40)
+ recur_start -> FREQ EQUALS . HOURLY (rule 41)
+ recur_start -> FREQ EQUALS . DAILY (rule 42)
+ recur_start -> FREQ EQUALS . WEEKLY (rule 43)
+ recur_start -> FREQ EQUALS . MONTHLY (rule 44)
+ recur_start -> FREQ EQUALS . YEARLY (rule 45)
+
+ DAILY shift, and go to state 26
+ MINUTELY shift, and go to state 27
+ MONTHLY shift, and go to state 28
+ SECONDLY shift, and go to state 29
+ WEEKLY shift, and go to state 30
+ HOURLY shift, and go to state 31
+ YEARLY shift, and go to state 32
+
+
+
+state 22
+
+ duration_value -> dur_prefix 'P' . dur_date (rule 34)
+ duration_value -> dur_prefix 'P' . dur_time (rule 35)
+ duration_value -> dur_prefix 'P' . dur_week (rule 36)
+
+ DIGITS shift, and go to state 33
+ TIME_CHAR shift, and go to state 34
+
+ dur_date go to state 35
+ dur_week go to state 36
+ dur_time go to state 37
+ dur_day go to state 38
+
+
+
+state 23
+
+ recur_skip_list -> recur_skip_list . SEMICOLON recur_skip (rule 79)
+ recur_value -> recur_start recur_skip_list . (rule 80)
+
+ SEMICOLON shift, and go to state 39
+
+ $default reduce using rule 80 (recur_value)
+
+
+
+state 24
+
+ utcoffset_value -> plusminus INTNUMBER . INTNUMBER (rule 83)
+ utcoffset_value -> plusminus INTNUMBER . INTNUMBER INTNUMBER (rule 84)
+
+ INTNUMBER shift, and go to state 40
+
+
+
+state 25
+
+ datetime_value -> DIGITS TIME_CHAR DIGITS . utc_char (rule 18)
+ period_value -> DIGITS TIME_CHAR DIGITS . utc_char '/' DIGITS TIME_CHAR DIGITS utc_char_b (rule 37)
+ period_value -> DIGITS TIME_CHAR DIGITS . utc_char '/' duration_value (rule 38)
+
+ UTC_CHAR shift, and go to state 41
+
+ $default reduce using rule 14 (utc_char)
+
+ utc_char go to state 42
+
+
+
+state 26
+
+ recur_start -> FREQ EQUALS DAILY . (rule 42)
+
+ $default reduce using rule 42 (recur_start)
+
+
+
+state 27
+
+ recur_start -> FREQ EQUALS MINUTELY . (rule 40)
+
+ $default reduce using rule 40 (recur_start)
+
+
+
+state 28
+
+ recur_start -> FREQ EQUALS MONTHLY . (rule 44)
+
+ $default reduce using rule 44 (recur_start)
+
+
+
+state 29
+
+ recur_start -> FREQ EQUALS SECONDLY . (rule 39)
+
+ $default reduce using rule 39 (recur_start)
+
+
+
+state 30
+
+ recur_start -> FREQ EQUALS WEEKLY . (rule 43)
+
+ $default reduce using rule 43 (recur_start)
+
+
+
+state 31
+
+ recur_start -> FREQ EQUALS HOURLY . (rule 41)
+
+ $default reduce using rule 41 (recur_start)
+
+
+
+state 32
+
+ recur_start -> FREQ EQUALS YEARLY . (rule 45)
+
+ $default reduce using rule 45 (recur_start)
+
+
+
+state 33
+
+ dur_week -> DIGITS . 'W' (rule 21)
+ dur_day -> DIGITS . 'D' (rule 30)
+
+ 'W' shift, and go to state 43
+ 'D' shift, and go to state 44
+
+
+
+state 34
+
+ dur_time -> TIME_CHAR . dur_hour (rule 22)
+ dur_time -> TIME_CHAR . dur_minute (rule 23)
+ dur_time -> TIME_CHAR . dur_second (rule 24)
+
+ DIGITS shift, and go to state 45
+
+ dur_hour go to state 46
+ dur_minute go to state 47
+ dur_second go to state 48
+
+
+
+state 35
+
+ duration_value -> dur_prefix 'P' dur_date . (rule 34)
+
+ $default reduce using rule 34 (duration_value)
+
+
+
+state 36
+
+ duration_value -> dur_prefix 'P' dur_week . (rule 36)
+
+ $default reduce using rule 36 (duration_value)
+
+
+
+state 37
+
+ duration_value -> dur_prefix 'P' dur_time . (rule 35)
+
+ $default reduce using rule 35 (duration_value)
+
+
+
+state 38
+
+ dur_date -> dur_day . (rule 19)
+ dur_date -> dur_day . dur_time (rule 20)
+
+ TIME_CHAR shift, and go to state 34
+
+ $default reduce using rule 19 (dur_date)
+
+ dur_time go to state 49
+
+
+
+state 39
+
+ recur_skip_list -> recur_skip_list SEMICOLON . recur_skip (rule 79)
+
+ BYDAY shift, and go to state 50
+ BYHOUR shift, and go to state 51
+ BYMINUTE shift, and go to state 52
+ BYMONTH shift, and go to state 53
+ BYMONTHDAY shift, and go to state 54
+ BYSECOND shift, and go to state 55
+ BYSETPOS shift, and go to state 56
+ BYWEEKNO shift, and go to state 57
+ BYYEARDAY shift, and go to state 58
+ INTERVAL shift, and go to state 59
+ COUNT shift, and go to state 60
+ UNTIL shift, and go to state 61
+ WKST shift, and go to state 62
+
+ recur_skip go to state 63
+
+
+
+state 40
+
+ utcoffset_value -> plusminus INTNUMBER INTNUMBER . (rule 83)
+ utcoffset_value -> plusminus INTNUMBER INTNUMBER . INTNUMBER (rule 84)
+
+ INTNUMBER shift, and go to state 64
+
+ $default reduce using rule 83 (utcoffset_value)
+
+
+
+state 41
+
+ utc_char -> UTC_CHAR . (rule 15)
+
+ $default reduce using rule 15 (utc_char)
+
+
+
+state 42
+
+ datetime_value -> DIGITS TIME_CHAR DIGITS utc_char . (rule 18)
+ period_value -> DIGITS TIME_CHAR DIGITS utc_char . '/' DIGITS TIME_CHAR DIGITS utc_char_b (rule 37)
+ period_value -> DIGITS TIME_CHAR DIGITS utc_char . '/' duration_value (rule 38)
+
+ '/' shift, and go to state 65
+
+ $default reduce using rule 18 (datetime_value)
+
+
+
+state 43
+
+ dur_week -> DIGITS 'W' . (rule 21)
+
+ $default reduce using rule 21 (dur_week)
+
+
+
+state 44
+
+ dur_day -> DIGITS 'D' . (rule 30)
+
+ $default reduce using rule 30 (dur_day)
+
+
+
+state 45
+
+ dur_hour -> DIGITS . 'H' (rule 25)
+ dur_hour -> DIGITS . 'H' dur_minute (rule 26)
+ dur_minute -> DIGITS . 'M' (rule 27)
+ dur_minute -> DIGITS . 'M' dur_second (rule 28)
+ dur_second -> DIGITS . 'S' (rule 29)
+
+ 'H' shift, and go to state 66
+ 'M' shift, and go to state 67
+ 'S' shift, and go to state 68
+
+
+
+state 46
+
+ dur_time -> TIME_CHAR dur_hour . (rule 22)
+
+ $default reduce using rule 22 (dur_time)
+
+
+
+state 47
+
+ dur_time -> TIME_CHAR dur_minute . (rule 23)
+
+ $default reduce using rule 23 (dur_time)
+
+
+
+state 48
+
+ dur_time -> TIME_CHAR dur_second . (rule 24)
+
+ $default reduce using rule 24 (dur_time)
+
+
+
+state 49
+
+ dur_date -> dur_day dur_time . (rule 20)
+
+ $default reduce using rule 20 (dur_date)
+
+
+
+state 50
+
+ recur_skip -> BYDAY . EQUALS weekday_list (rule 69)
+
+ EQUALS shift, and go to state 69
+
+
+
+state 51
+
+ recur_skip -> BYHOUR . EQUALS recur_list (rule 68)
+
+ EQUALS shift, and go to state 70
+
+
+
+state 52
+
+ recur_skip -> BYMINUTE . EQUALS recur_list (rule 67)
+
+ EQUALS shift, and go to state 71
+
+
+
+state 53
+
+ recur_skip -> BYMONTH . EQUALS recur_list (rule 70)
+
+ EQUALS shift, and go to state 72
+
+
+
+state 54
+
+ recur_skip -> BYMONTHDAY . EQUALS recur_list (rule 71)
+
+ EQUALS shift, and go to state 73
+
+
+
+state 55
+
+ recur_skip -> BYSECOND . EQUALS recur_list (rule 66)
+
+ EQUALS shift, and go to state 74
+
+
+
+state 56
+
+ recur_skip -> BYSETPOS . EQUALS recur_list (rule 74)
+
+ EQUALS shift, and go to state 75
+
+
+
+state 57
+
+ recur_skip -> BYWEEKNO . EQUALS recur_list (rule 73)
+
+ EQUALS shift, and go to state 76
+
+
+
+state 58
+
+ recur_skip -> BYYEARDAY . EQUALS recur_list (rule 72)
+
+ EQUALS shift, and go to state 77
+
+
+
+state 59
+
+ recur_skip -> INTERVAL . EQUALS DIGITS (rule 58)
+
+ EQUALS shift, and go to state 78
+
+
+
+state 60
+
+ recur_skip -> COUNT . EQUALS DIGITS (rule 77)
+
+ EQUALS shift, and go to state 79
+
+
+
+state 61
+
+ recur_skip -> UNTIL . EQUALS datetime_value (rule 75)
+ recur_skip -> UNTIL . EQUALS date_value (rule 76)
+
+ EQUALS shift, and go to state 80
+
+
+
+state 62
+
+ recur_skip -> WKST . EQUALS SU (rule 59)
+ recur_skip -> WKST . EQUALS MO (rule 60)
+ recur_skip -> WKST . EQUALS TU (rule 61)
+ recur_skip -> WKST . EQUALS WE (rule 62)
+ recur_skip -> WKST . EQUALS TH (rule 63)
+ recur_skip -> WKST . EQUALS FR (rule 64)
+ recur_skip -> WKST . EQUALS SA (rule 65)
+
+ EQUALS shift, and go to state 81
+
+
+
+state 63
+
+ recur_skip_list -> recur_skip_list SEMICOLON recur_skip . (rule 79)
+
+ $default reduce using rule 79 (recur_skip_list)
+
+
+
+state 64
+
+ utcoffset_value -> plusminus INTNUMBER INTNUMBER INTNUMBER . (rule 84)
+
+ $default reduce using rule 84 (utcoffset_value)
+
+
+
+state 65
+
+ period_value -> DIGITS TIME_CHAR DIGITS utc_char '/' . DIGITS TIME_CHAR DIGITS utc_char_b (rule 37)
+ period_value -> DIGITS TIME_CHAR DIGITS utc_char '/' . duration_value (rule 38)
+
+ DIGITS shift, and go to state 82
+ '+' shift, and go to state 83
+ '-' shift, and go to state 84
+
+ $default reduce using rule 31 (dur_prefix)
+
+ dur_prefix go to state 13
+ duration_value go to state 85
+
+
+
+state 66
+
+ dur_hour -> DIGITS 'H' . (rule 25)
+ dur_hour -> DIGITS 'H' . dur_minute (rule 26)
+
+ DIGITS shift, and go to state 86
+
+ $default reduce using rule 25 (dur_hour)
+
+ dur_minute go to state 87
+
+
+
+state 67
+
+ dur_minute -> DIGITS 'M' . (rule 27)
+ dur_minute -> DIGITS 'M' . dur_second (rule 28)
+
+ DIGITS shift, and go to state 88
+
+ $default reduce using rule 27 (dur_minute)
+
+ dur_second go to state 89
+
+
+
+state 68
+
+ dur_second -> DIGITS 'S' . (rule 29)
+
+ $default reduce using rule 29 (dur_second)
+
+
+
+state 69
+
+ recur_skip -> BYDAY EQUALS . weekday_list (rule 69)
+
+ DIGITS shift, and go to state 90
+ MO shift, and go to state 91
+ SA shift, and go to state 92
+ SU shift, and go to state 93
+ TU shift, and go to state 94
+ WE shift, and go to state 95
+ TH shift, and go to state 96
+ FR shift, and go to state 97
+
+ weekday go to state 98
+ weekday_list go to state 99
+
+
+
+state 70
+
+ recur_skip -> BYHOUR EQUALS . recur_list (rule 68)
+
+ DIGITS shift, and go to state 100
+
+ recur_list go to state 101
+
+
+
+state 71
+
+ recur_skip -> BYMINUTE EQUALS . recur_list (rule 67)
+
+ DIGITS shift, and go to state 100
+
+ recur_list go to state 102
+
+
+
+state 72
+
+ recur_skip -> BYMONTH EQUALS . recur_list (rule 70)
+
+ DIGITS shift, and go to state 100
+
+ recur_list go to state 103
+
+
+
+state 73
+
+ recur_skip -> BYMONTHDAY EQUALS . recur_list (rule 71)
+
+ DIGITS shift, and go to state 100
+
+ recur_list go to state 104
+
+
+
+state 74
+
+ recur_skip -> BYSECOND EQUALS . recur_list (rule 66)
+
+ DIGITS shift, and go to state 100
+
+ recur_list go to state 105
+
+
+
+state 75
+
+ recur_skip -> BYSETPOS EQUALS . recur_list (rule 74)
+
+ DIGITS shift, and go to state 100
+
+ recur_list go to state 106
+
+
+
+state 76
+
+ recur_skip -> BYWEEKNO EQUALS . recur_list (rule 73)
+
+ DIGITS shift, and go to state 100
+
+ recur_list go to state 107
+
+
+
+state 77
+
+ recur_skip -> BYYEARDAY EQUALS . recur_list (rule 72)
+
+ DIGITS shift, and go to state 100
+
+ recur_list go to state 108
+
+
+
+state 78
+
+ recur_skip -> INTERVAL EQUALS . DIGITS (rule 58)
+
+ DIGITS shift, and go to state 109
+
+
+
+state 79
+
+ recur_skip -> COUNT EQUALS . DIGITS (rule 77)
+
+ DIGITS shift, and go to state 110
+
+
+
+state 80
+
+ recur_skip -> UNTIL EQUALS . datetime_value (rule 75)
+ recur_skip -> UNTIL EQUALS . date_value (rule 76)
+
+ DIGITS shift, and go to state 111
+
+ date_value go to state 112
+ datetime_value go to state 113
+
+
+
+state 81
+
+ recur_skip -> WKST EQUALS . SU (rule 59)
+ recur_skip -> WKST EQUALS . MO (rule 60)
+ recur_skip -> WKST EQUALS . TU (rule 61)
+ recur_skip -> WKST EQUALS . WE (rule 62)
+ recur_skip -> WKST EQUALS . TH (rule 63)
+ recur_skip -> WKST EQUALS . FR (rule 64)
+ recur_skip -> WKST EQUALS . SA (rule 65)
+
+ MO shift, and go to state 114
+ SA shift, and go to state 115
+ SU shift, and go to state 116
+ TU shift, and go to state 117
+ WE shift, and go to state 118
+ TH shift, and go to state 119
+ FR shift, and go to state 120
+
+
+
+state 82
+
+ period_value -> DIGITS TIME_CHAR DIGITS utc_char '/' DIGITS . TIME_CHAR DIGITS utc_char_b (rule 37)
+
+ TIME_CHAR shift, and go to state 121
+
+
+
+state 83
+
+ dur_prefix -> '+' . (rule 32)
+
+ $default reduce using rule 32 (dur_prefix)
+
+
+
+state 84
+
+ dur_prefix -> '-' . (rule 33)
+
+ $default reduce using rule 33 (dur_prefix)
+
+
+
+state 85
+
+ period_value -> DIGITS TIME_CHAR DIGITS utc_char '/' duration_value . (rule 38)
+
+ $default reduce using rule 38 (period_value)
+
+
+
+state 86
+
+ dur_minute -> DIGITS . 'M' (rule 27)
+ dur_minute -> DIGITS . 'M' dur_second (rule 28)
+
+ 'M' shift, and go to state 67
+
+
+
+state 87
+
+ dur_hour -> DIGITS 'H' dur_minute . (rule 26)
+
+ $default reduce using rule 26 (dur_hour)
+
+
+
+state 88
+
+ dur_second -> DIGITS . 'S' (rule 29)
+
+ 'S' shift, and go to state 68
+
+
+
+state 89
+
+ dur_minute -> DIGITS 'M' dur_second . (rule 28)
+
+ $default reduce using rule 28 (dur_minute)
+
+
+
+state 90
+
+ weekday_list -> DIGITS . weekday (rule 54)
+
+ MO shift, and go to state 91
+ SA shift, and go to state 92
+ SU shift, and go to state 93
+ TU shift, and go to state 94
+ WE shift, and go to state 95
+ TH shift, and go to state 96
+ FR shift, and go to state 97
+
+ weekday go to state 122
+
+
+
+state 91
+
+ weekday -> MO . (rule 47)
+
+ $default reduce using rule 47 (weekday)
+
+
+
+state 92
+
+ weekday -> SA . (rule 52)
+
+ $default reduce using rule 52 (weekday)
+
+
+
+state 93
+
+ weekday -> SU . (rule 46)
+
+ $default reduce using rule 46 (weekday)
+
+
+
+state 94
+
+ weekday -> TU . (rule 48)
+
+ $default reduce using rule 48 (weekday)
+
+
+
+state 95
+
+ weekday -> WE . (rule 49)
+
+ $default reduce using rule 49 (weekday)
+
+
+
+state 96
+
+ weekday -> TH . (rule 50)
+
+ $default reduce using rule 50 (weekday)
+
+
+
+state 97
+
+ weekday -> FR . (rule 51)
+
+ $default reduce using rule 51 (weekday)
+
+
+
+state 98
+
+ weekday_list -> weekday . (rule 53)
+
+ $default reduce using rule 53 (weekday_list)
+
+
+
+state 99
+
+ weekday_list -> weekday_list . COMMA weekday (rule 55)
+ recur_skip -> BYDAY EQUALS weekday_list . (rule 69)
+
+ COMMA shift, and go to state 123
+
+ $default reduce using rule 69 (recur_skip)
+
+
+
+state 100
+
+ recur_list -> DIGITS . (rule 56)
+
+ $default reduce using rule 56 (recur_list)
+
+
+
+state 101
+
+ recur_list -> recur_list . COMMA DIGITS (rule 57)
+ recur_skip -> BYHOUR EQUALS recur_list . (rule 68)
+
+ COMMA shift, and go to state 124
+
+ $default reduce using rule 68 (recur_skip)
+
+
+
+state 102
+
+ recur_list -> recur_list . COMMA DIGITS (rule 57)
+ recur_skip -> BYMINUTE EQUALS recur_list . (rule 67)
+
+ COMMA shift, and go to state 124
+
+ $default reduce using rule 67 (recur_skip)
+
+
+
+state 103
+
+ recur_list -> recur_list . COMMA DIGITS (rule 57)
+ recur_skip -> BYMONTH EQUALS recur_list . (rule 70)
+
+ COMMA shift, and go to state 124
+
+ $default reduce using rule 70 (recur_skip)
+
+
+
+state 104
+
+ recur_list -> recur_list . COMMA DIGITS (rule 57)
+ recur_skip -> BYMONTHDAY EQUALS recur_list . (rule 71)
+
+ COMMA shift, and go to state 124
+
+ $default reduce using rule 71 (recur_skip)
+
+
+
+state 105
+
+ recur_list -> recur_list . COMMA DIGITS (rule 57)
+ recur_skip -> BYSECOND EQUALS recur_list . (rule 66)
+
+ COMMA shift, and go to state 124
+
+ $default reduce using rule 66 (recur_skip)
+
+
+
+state 106
+
+ recur_list -> recur_list . COMMA DIGITS (rule 57)
+ recur_skip -> BYSETPOS EQUALS recur_list . (rule 74)
+
+ COMMA shift, and go to state 124
+
+ $default reduce using rule 74 (recur_skip)
+
+
+
+state 107
+
+ recur_list -> recur_list . COMMA DIGITS (rule 57)
+ recur_skip -> BYWEEKNO EQUALS recur_list . (rule 73)
+
+ COMMA shift, and go to state 124
+
+ $default reduce using rule 73 (recur_skip)
+
+
+
+state 108
+
+ recur_list -> recur_list . COMMA DIGITS (rule 57)
+ recur_skip -> BYYEARDAY EQUALS recur_list . (rule 72)
+
+ COMMA shift, and go to state 124
+
+ $default reduce using rule 72 (recur_skip)
+
+
+
+state 109
+
+ recur_skip -> INTERVAL EQUALS DIGITS . (rule 58)
+
+ $default reduce using rule 58 (recur_skip)
+
+
+
+state 110
+
+ recur_skip -> COUNT EQUALS DIGITS . (rule 77)
+
+ $default reduce using rule 77 (recur_skip)
+
+
+
+state 111
+
+ date_value -> DIGITS . (rule 13)
+ datetime_value -> DIGITS . TIME_CHAR DIGITS utc_char (rule 18)
+
+ TIME_CHAR shift, and go to state 125
+
+ $default reduce using rule 13 (date_value)
+
+
+
+state 112
+
+ recur_skip -> UNTIL EQUALS date_value . (rule 76)
+
+ $default reduce using rule 76 (recur_skip)
+
+
+
+state 113
+
+ recur_skip -> UNTIL EQUALS datetime_value . (rule 75)
+
+ $default reduce using rule 75 (recur_skip)
+
+
+
+state 114
+
+ recur_skip -> WKST EQUALS MO . (rule 60)
+
+ $default reduce using rule 60 (recur_skip)
+
+
+
+state 115
+
+ recur_skip -> WKST EQUALS SA . (rule 65)
+
+ $default reduce using rule 65 (recur_skip)
+
+
+
+state 116
+
+ recur_skip -> WKST EQUALS SU . (rule 59)
+
+ $default reduce using rule 59 (recur_skip)
+
+
+
+state 117
+
+ recur_skip -> WKST EQUALS TU . (rule 61)
+
+ $default reduce using rule 61 (recur_skip)
+
+
+
+state 118
+
+ recur_skip -> WKST EQUALS WE . (rule 62)
+
+ $default reduce using rule 62 (recur_skip)
+
+
+
+state 119
+
+ recur_skip -> WKST EQUALS TH . (rule 63)
+
+ $default reduce using rule 63 (recur_skip)
+
+
+
+state 120
+
+ recur_skip -> WKST EQUALS FR . (rule 64)
+
+ $default reduce using rule 64 (recur_skip)
+
+
+
+state 121
+
+ period_value -> DIGITS TIME_CHAR DIGITS utc_char '/' DIGITS TIME_CHAR . DIGITS utc_char_b (rule 37)
+
+ DIGITS shift, and go to state 126
+
+
+
+state 122
+
+ weekday_list -> DIGITS weekday . (rule 54)
+
+ $default reduce using rule 54 (weekday_list)
+
+
+
+state 123
+
+ weekday_list -> weekday_list COMMA . weekday (rule 55)
+
+ MO shift, and go to state 91
+ SA shift, and go to state 92
+ SU shift, and go to state 93
+ TU shift, and go to state 94
+ WE shift, and go to state 95
+ TH shift, and go to state 96
+ FR shift, and go to state 97
+
+ weekday go to state 127
+
+
+
+state 124
+
+ recur_list -> recur_list COMMA . DIGITS (rule 57)
+
+ DIGITS shift, and go to state 128
+
+
+
+state 125
+
+ datetime_value -> DIGITS TIME_CHAR . DIGITS utc_char (rule 18)
+
+ DIGITS shift, and go to state 129
+
+
+
+state 126
+
+ period_value -> DIGITS TIME_CHAR DIGITS utc_char '/' DIGITS TIME_CHAR DIGITS . utc_char_b (rule 37)
+
+ UTC_CHAR shift, and go to state 130
+
+ $default reduce using rule 16 (utc_char_b)
+
+ utc_char_b go to state 131
+
+
+
+state 127
+
+ weekday_list -> weekday_list COMMA weekday . (rule 55)
+
+ $default reduce using rule 55 (weekday_list)
+
+
+
+state 128
+
+ recur_list -> recur_list COMMA DIGITS . (rule 57)
+
+ $default reduce using rule 57 (recur_list)
+
+
+
+state 129
+
+ datetime_value -> DIGITS TIME_CHAR DIGITS . utc_char (rule 18)
+
+ UTC_CHAR shift, and go to state 41
+
+ $default reduce using rule 14 (utc_char)
+
+ utc_char go to state 132
+
+
+
+state 130
+
+ utc_char_b -> UTC_CHAR . (rule 17)
+
+ $default reduce using rule 17 (utc_char_b)
+
+
+
+state 131
+
+ period_value -> DIGITS TIME_CHAR DIGITS utc_char '/' DIGITS TIME_CHAR DIGITS utc_char_b . (rule 37)
+
+ $default reduce using rule 37 (period_value)
+
+
+
+state 132
+
+ datetime_value -> DIGITS TIME_CHAR DIGITS utc_char . (rule 18)
+
+ $default reduce using rule 18 (datetime_value)
+
+
+
+state 133
+
+ $ go to state 134
+
+
+
+state 134
+
+ $ go to state 135
+
+
+
+state 135
+
+ $default accept
diff --git a/libical/src/libical/icalitip.tab.c b/libical/src/libical/icalitip.tab.c
new file mode 100644
index 0000000000..82536647e3
--- /dev/null
+++ b/libical/src/libical/icalitip.tab.c
@@ -0,0 +1,1663 @@
+
+/* A Bison parser, made from icalitip.y
+ by GNU Bison version 1.28 */
+
+#define YYBISON 1 /* Identify Bison output. */
+
+#define yyparse icalparser_yyparse
+#define yylex icalparser_yylex
+#define yyerror icalparser_yyerror
+#define yylval icalparser_yylval
+#define yychar icalparser_yychar
+#define yydebug icalparser_yydebug
+#define yynerrs icalparser_yynerrs
+#define DIGITS 257
+#define INTNUMBER 258
+#define FLOATNUMBER 259
+#define STRING 260
+#define EOL 261
+#define EQUALS 262
+#define CHARACTER 263
+#define COLON 264
+#define COMMA 265
+#define SEMICOLON 266
+#define TIMESEPERATOR 267
+#define TRUE 268
+#define FALSE 269
+#define FREQ 270
+#define BYDAY 271
+#define BYHOUR 272
+#define BYMINUTE 273
+#define BYMONTH 274
+#define BYMONTHDAY 275
+#define BYSECOND 276
+#define BYSETPOS 277
+#define BYWEEKNO 278
+#define BYYEARDAY 279
+#define DAILY 280
+#define MINUTELY 281
+#define MONTHLY 282
+#define SECONDLY 283
+#define WEEKLY 284
+#define HOURLY 285
+#define YEARLY 286
+#define INTERVAL 287
+#define COUNT 288
+#define UNTIL 289
+#define WKST 290
+#define MO 291
+#define SA 292
+#define SU 293
+#define TU 294
+#define WE 295
+#define TH 296
+#define FR 297
+#define BIT8 298
+#define ACCEPTED 299
+#define ADD 300
+#define AUDIO 301
+#define BASE64 302
+#define BINARY 303
+#define BOOLEAN 304
+#define BUSY 305
+#define BUSYTENTATIVE 306
+#define BUSYUNAVAILABLE 307
+#define CALADDRESS 308
+#define CANCEL 309
+#define CANCELLED 310
+#define CHAIR 311
+#define CHILD 312
+#define COMPLETED 313
+#define CONFIDENTIAL 314
+#define CONFIRMED 315
+#define COUNTER 316
+#define DATE 317
+#define DATETIME 318
+#define DECLINECOUNTER 319
+#define DECLINED 320
+#define DELEGATED 321
+#define DISPLAY 322
+#define DRAFT 323
+#define DURATION 324
+#define EMAIL 325
+#define END 326
+#define FINAL 327
+#define FLOAT 328
+#define FREE 329
+#define GREGORIAN 330
+#define GROUP 331
+#define INDIVIDUAL 332
+#define INPROCESS 333
+#define INTEGER 334
+#define NEEDSACTION 335
+#define NONPARTICIPANT 336
+#define OPAQUE 337
+#define OPTPARTICIPANT 338
+#define PARENT 339
+#define PERIOD 340
+#define PRIVATE 341
+#define PROCEDURE 342
+#define PUBLIC 343
+#define PUBLISH 344
+#define RECUR 345
+#define REFRESH 346
+#define REPLY 347
+#define REQPARTICIPANT 348
+#define REQUEST 349
+#define RESOURCE 350
+#define ROOM 351
+#define SIBLING 352
+#define START 353
+#define TENTATIVE 354
+#define TEXT 355
+#define THISANDFUTURE 356
+#define THISANDPRIOR 357
+#define TIME 358
+#define TRANSPAENT 359
+#define UNKNOWN 360
+#define UTCOFFSET 361
+#define XNAME 362
+#define ALTREP 363
+#define CN 364
+#define CUTYPE 365
+#define DAYLIGHT 366
+#define DIR 367
+#define ENCODING 368
+#define EVENT 369
+#define FBTYPE 370
+#define FMTTYPE 371
+#define LANGUAGE 372
+#define MEMBER 373
+#define PARTSTAT 374
+#define RANGE 375
+#define RELATED 376
+#define RELTYPE 377
+#define ROLE 378
+#define RSVP 379
+#define SENTBY 380
+#define STANDARD 381
+#define URI 382
+#define TIME_CHAR 383
+#define UTC_CHAR 384
+
+#line 1 "icalitip.y"
+
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: icalitip.y
+ CREATOR: eric 10 June 1999
+
+ DESCRIPTION:
+
+ $Id$
+ $Locker$
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The original author is Eric Busboom
+ The original code is icalitip.y
+
+
+
+ ================================b======================================*/
+
+#include <stdlib.h>
+#include <string.h> /* for strdup() */
+#include <limits.h> /* for SHRT_MAX*/
+#include "icalparser.h"
+#include "ical.h"
+#include "pvl.h"
+
+#define YYERROR_VERBOSE
+#define YYDEBUG 1
+
+icalvalue *icalparser_yy_value; /* Current Value */
+
+/* Globals for UTCOFFSET values */
+int utc;
+int utc_b;
+int utcsign;
+
+/* Globals for DURATION values */
+struct icaldurationtype duration;
+
+/* Globals for RECUR values */
+struct icalrecurrencetype recur;
+short skiplist[367];
+short skippos;
+
+void copy_list(short* array, size_t size);
+void clear_recur();
+void add_prop(icalproperty_kind);
+void icalparser_fill_date(struct tm* t, char* dstr);
+void icalparser_fill_time(struct tm* t, char* tstr);
+void set_value_type(icalvalue_kind kind);
+void yyerror(char *s); /* Don't know why I need this.... */
+int yylex(void); /* Or this. */
+void set_parser_value_state();
+struct icaltimetype fill_datetime(char* d, char* t);
+
+
+
+/* Set the state of the lexer so it will interpret values ( iCAL
+ VALUEs, that is, ) correctly. */
+
+
+#line 75 "icalitip.y"
+typedef union {
+ float v_float;
+ int v_int;
+ char* v_string;
+
+} YYSTYPE;
+#include <stdio.h>
+
+#ifndef __cplusplus
+#ifndef __STDC__
+#define const
+#endif
+#endif
+
+
+
+#define YYFINAL 135
+#define YYFLAG -32768
+#define YYNTBASE 141
+
+#define YYTRANSLATE(x) ((unsigned)(x) <= 385 ? yytranslate[x] : 167)
+
+static const short yytranslate[] = { 0,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 137, 2, 138, 2, 140, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 136, 2, 2,
+ 2, 133, 2, 2, 2, 2, 134, 2, 2, 139,
+ 2, 2, 135, 2, 2, 2, 132, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 1, 3, 4, 5, 6,
+ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+ 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
+ 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
+ 37, 38, 39, 40, 41, 42, 43, 44, 45, 46,
+ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
+ 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,
+ 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
+ 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
+ 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,
+ 97, 98, 99, 100, 101, 102, 103, 104, 105, 106,
+ 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
+ 117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
+ 127, 128, 129, 130, 131
+};
+
+#if YYDEBUG != 0
+static const short yyprhs[] = { 0,
+ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18,
+ 20, 22, 24, 26, 27, 29, 30, 32, 37, 39,
+ 42, 45, 48, 51, 54, 57, 61, 64, 68, 71,
+ 74, 75, 77, 79, 83, 87, 91, 101, 108, 112,
+ 116, 120, 124, 128, 132, 136, 138, 140, 142, 144,
+ 146, 148, 150, 152, 155, 159, 161, 165, 169, 173,
+ 177, 181, 185, 189, 193, 197, 201, 205, 209, 213,
+ 217, 221, 225, 229, 233, 237, 241, 245, 246, 250,
+ 253, 255, 257, 261
+};
+
+static const short yyrhs[] = { 142,
+ 0, 143, 0, 144, 0, 147, 0, 156, 0, 157,
+ 0, 164, 0, 166, 0, 1, 0, 131, 0, 14,
+ 0, 15, 0, 3, 0, 0, 130, 0, 0, 130,
+ 0, 3, 129, 3, 145, 0, 154, 0, 154, 150,
+ 0, 3, 132, 0, 129, 151, 0, 129, 152, 0,
+ 129, 153, 0, 3, 133, 0, 3, 133, 152, 0,
+ 3, 134, 0, 3, 134, 153, 0, 3, 135, 0,
+ 3, 136, 0, 0, 137, 0, 138, 0, 155, 139,
+ 148, 0, 155, 139, 150, 0, 155, 139, 149, 0,
+ 3, 129, 3, 145, 140, 3, 129, 3, 146, 0,
+ 3, 129, 3, 145, 140, 156, 0, 16, 8, 29,
+ 0, 16, 8, 27, 0, 16, 8, 31, 0, 16,
+ 8, 26, 0, 16, 8, 30, 0, 16, 8, 28,
+ 0, 16, 8, 32, 0, 39, 0, 37, 0, 40,
+ 0, 41, 0, 42, 0, 43, 0, 38, 0, 159,
+ 0, 3, 159, 0, 160, 11, 159, 0, 3, 0,
+ 161, 11, 3, 0, 33, 8, 3, 0, 36, 8,
+ 39, 0, 36, 8, 37, 0, 36, 8, 40, 0,
+ 36, 8, 41, 0, 36, 8, 42, 0, 36, 8,
+ 43, 0, 36, 8, 38, 0, 22, 8, 161, 0,
+ 19, 8, 161, 0, 18, 8, 161, 0, 17, 8,
+ 160, 0, 20, 8, 161, 0, 21, 8, 161, 0,
+ 25, 8, 161, 0, 24, 8, 161, 0, 23, 8,
+ 161, 0, 35, 8, 147, 0, 35, 8, 144, 0,
+ 34, 8, 3, 0, 0, 163, 12, 162, 0, 158,
+ 163, 0, 137, 0, 138, 0, 165, 4, 4, 0,
+ 165, 4, 4, 4, 0
+};
+
+#endif
+
+#if YYDEBUG != 0
+static const short yyrline[] = { 0,
+ 112, 114, 115, 116, 117, 118, 119, 120, 121, 127,
+ 129, 132, 135, 150, 152, 155, 157, 159, 175, 176,
+ 178, 183, 186, 189, 193, 197, 202, 206, 211, 216,
+ 221, 224, 227, 231, 236, 241, 250, 271, 303, 305,
+ 306, 307, 308, 309, 310, 314, 316, 317, 318, 319,
+ 320, 321, 325, 327, 328, 331, 333, 336, 338, 339,
+ 340, 341, 342, 343, 344, 345, 346, 347, 348, 349,
+ 350, 351, 352, 353, 354, 357, 360, 364, 366, 368,
+ 376, 377, 379, 385
+};
+#endif
+
+
+#if YYDEBUG != 0 || defined (YYERROR_VERBOSE)
+
+static const char * const yytname[] = { "$","error","$undefined.","DIGITS",
+"INTNUMBER","FLOATNUMBER","STRING","EOL","EQUALS","CHARACTER","COLON","COMMA",
+"SEMICOLON","TIMESEPERATOR","TRUE","FALSE","FREQ","BYDAY","BYHOUR","BYMINUTE",
+"BYMONTH","BYMONTHDAY","BYSECOND","BYSETPOS","BYWEEKNO","BYYEARDAY","DAILY",
+"MINUTELY","MONTHLY","SECONDLY","WEEKLY","HOURLY","YEARLY","INTERVAL","COUNT",
+"UNTIL","WKST","MO","SA","SU","TU","WE","TH","FR","BIT8","ACCEPTED","ADD","AUDIO",
+"BASE64","BINARY","BOOLEAN","BUSY","BUSYTENTATIVE","BUSYUNAVAILABLE","CALADDRESS",
+"CANCEL","CANCELLED","CHAIR","CHILD","COMPLETED","CONFIDENTIAL","CONFIRMED",
+"COUNTER","DATE","DATETIME","DECLINECOUNTER","DECLINED","DELEGATED","DISPLAY",
+"DRAFT","DURATION","EMAIL","END","FINAL","FLOAT","FREE","GREGORIAN","GROUP",
+"INDIVIDUAL","INPROCESS","INTEGER","NEEDSACTION","NONPARTICIPANT","OPAQUE","OPTPARTICIPANT",
+"PARENT","PERIOD","PRIVATE","PROCEDURE","PUBLIC","PUBLISH","RECUR","REFRESH",
+"REPLY","REQPARTICIPANT","REQUEST","RESOURCE","ROOM","SIBLING","START","TENTATIVE",
+"TEXT","THISANDFUTURE","THISANDPRIOR","TIME","TRANSPAENT","UNKNOWN","UTCOFFSET",
+"XNAME","ALTREP","CN","CUTYPE","DAYLIGHT","DIR","ENCODING","EVENT","FBTYPE",
+"FMTTYPE","LANGUAGE","MEMBER","PARTSTAT","RANGE","RELATED","RELTYPE","ROLE",
+"RSVP","SENTBY","STANDARD","URI","TIME_CHAR","UTC_CHAR","\"unimplemented2\"",
+"'W'","'H'","'M'","'S'","'D'","'+'","'-'","'P'","'/'","value","binary_value",
+"boolean_value","date_value","utc_char","utc_char_b","datetime_value","dur_date",
+"dur_week","dur_time","dur_hour","dur_minute","dur_second","dur_day","dur_prefix",
+"duration_value","period_value","recur_start","weekday","weekday_list","recur_list",
+"recur_skip","recur_skip_list","recur_value","plusminus","utcoffset_value", NULL
+};
+#endif
+
+static const short yyr1[] = { 0,
+ 141, 141, 141, 141, 141, 141, 141, 141, 141, 142,
+ 143, 143, 144, 145, 145, 146, 146, 147, 148, 148,
+ 149, 150, 150, 150, 151, 151, 152, 152, 153, 154,
+ 155, 155, 155, 156, 156, 156, 157, 157, 158, 158,
+ 158, 158, 158, 158, 158, 159, 159, 159, 159, 159,
+ 159, 159, 160, 160, 160, 161, 161, 162, 162, 162,
+ 162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+ 162, 162, 162, 162, 162, 162, 162, 163, 163, 164,
+ 165, 165, 166, 166
+};
+
+static const short yyr2[] = { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 0, 1, 0, 1, 4, 1, 2,
+ 2, 2, 2, 2, 2, 3, 2, 3, 2, 2,
+ 0, 1, 1, 3, 3, 3, 9, 6, 3, 3,
+ 3, 3, 3, 3, 3, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2, 3, 1, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 0, 3, 2,
+ 1, 1, 3, 4
+};
+
+static const short yydefact[] = { 0,
+ 9, 13, 11, 12, 0, 10, 32, 33, 1, 2,
+ 3, 4, 0, 5, 6, 78, 7, 0, 8, 0,
+ 0, 0, 80, 0, 14, 42, 40, 44, 39, 43,
+ 41, 45, 0, 0, 34, 36, 35, 19, 0, 83,
+ 15, 18, 21, 30, 0, 22, 23, 24, 20, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 79, 84, 31, 25, 27, 29, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 32, 33, 38, 0, 26, 0, 28, 0,
+ 47, 52, 46, 48, 49, 50, 51, 53, 69, 56,
+ 68, 67, 70, 71, 66, 74, 73, 72, 58, 77,
+ 13, 76, 75, 60, 65, 59, 61, 62, 63, 64,
+ 0, 54, 0, 0, 0, 16, 55, 57, 14, 17,
+ 37, 18, 0, 0, 0
+};
+
+static const short yydefgoto[] = { 133,
+ 9, 10, 11, 42, 131, 12, 35, 36, 37, 46,
+ 47, 48, 38, 13, 14, 15, 16, 98, 99, 101,
+ 63, 23, 17, 18, 19
+};
+
+static const short yypact[] = { -1,
+-32768, -123,-32768,-32768, 1,-32768, 3, 6,-32768,-32768,
+-32768,-32768, -127,-32768,-32768,-32768,-32768, 64,-32768, 66,
+ -10, -2, 58, 67, -58,-32768,-32768,-32768,-32768,-32768,
+-32768,-32768, -128, 70,-32768,-32768,-32768, -55, 28, 71,
+-32768, -64,-32768,-32768, -68,-32768,-32768,-32768,-32768, 69,
+ 72, 73, 74, 75, 76, 77, 78, 79, 80, 81,
+ 82, 83,-32768,-32768, 2, 89, 90,-32768, 0, 91,
+ 91, 91, 91, 91, 91, 91, 91, 92, 93, 94,
+ -14, -51,-32768,-32768,-32768, -36,-32768, -56,-32768, -7,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 88,-32768,
+ 95, 95, 95, 95, 95, 95, 95, 95,-32768,-32768,
+ -29,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
+ 98,-32768, -7, 99, 100, -26,-32768,-32768, -58,-32768,
+-32768,-32768, 105, 107,-32768
+};
+
+static const short yypgoto[] = {-32768,
+-32768,-32768, 29, -21,-32768, 30,-32768,-32768, 84,-32768,
+ 45, 46,-32768,-32768, 47,-32768,-32768, -79,-32768, -17,
+-32768,-32768,-32768,-32768,-32768
+};
+
+
+#define YYLAST 140
+
+
+static const short yytable[] = { 1,
+ 33, 2, 90, 43, 82, 20, -81, 44, 21, -82,
+ 122, 22, 3, 4, 5, 26, 27, 28, 29, 30,
+ 31, 32, 114, 115, 116, 117, 118, 119, 120, 91,
+ 92, 93, 94, 95, 96, 97, 91, 92, 93, 94,
+ 95, 96, 97, 127, 50, 51, 52, 53, 54, 55,
+ 56, 57, 58, 102, 103, 104, 105, 106, 107, 108,
+ 59, 60, 61, 62, 66, 67, 68, 24, 25, 39,
+ 40, 41, 45, 34, 64, 65, 69, 121, 68, 70,
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
+ 81, 86, 88, 100, 109, 110, 111, 67, 123, 125,
+ 126, 128, 129, 130, 134, 124, 135, 132, 112, 113,
+ 87, 85, 89, 0, 0, 0, 0, 0, 0, 0,
+ 0, 49, 0, 0, 0, 0, 34, 0, 0, 6,
+ 0, 0, 0, 0, 0, 7, 8, -31, 83, 84
+};
+
+static const short yycheck[] = { 1,
+ 3, 3, 3, 132, 3, 129, 4, 136, 8, 4,
+ 90, 139, 14, 15, 16, 26, 27, 28, 29, 30,
+ 31, 32, 37, 38, 39, 40, 41, 42, 43, 37,
+ 38, 39, 40, 41, 42, 43, 37, 38, 39, 40,
+ 41, 42, 43, 123, 17, 18, 19, 20, 21, 22,
+ 23, 24, 25, 71, 72, 73, 74, 75, 76, 77,
+ 33, 34, 35, 36, 133, 134, 135, 4, 3, 12,
+ 4, 130, 3, 129, 4, 140, 8, 129, 135, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 3, 3, 3, 3, 3, 3, 134, 11, 129,
+ 3, 3, 3, 130, 0, 11, 0, 129, 80, 80,
+ 66, 65, 67, -1, -1, -1, -1, -1, -1, -1,
+ -1, 38, -1, -1, -1, -1, 129, -1, -1, 131,
+ -1, -1, -1, -1, -1, 137, 138, 139, 137, 138
+};
+/* -*-C-*- Note some compilers choke on comments on `#line' lines. */
+#line 3 "/usr/lib/bison.simple"
+/* This file comes from bison-1.28. */
+
+/* Skeleton output parser for bison,
+ Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+/* As a special exception, when this file is copied by Bison into a
+ Bison output file, you may use that output file without restriction.
+ This special exception was added by the Free Software Foundation
+ in version 1.24 of Bison. */
+
+/* This is the parser code that is written into each bison parser
+ when the %semantic_parser declaration is not specified in the grammar.
+ It was written by Richard Stallman by simplifying the hairy parser
+ used when %semantic_parser is specified. */
+
+#ifndef YYSTACK_USE_ALLOCA
+#ifdef alloca
+#define YYSTACK_USE_ALLOCA
+#else /* alloca not defined */
+#ifdef __GNUC__
+#define YYSTACK_USE_ALLOCA
+#define alloca __builtin_alloca
+#else /* not GNU C. */
+#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386))
+#define YYSTACK_USE_ALLOCA
+#include <alloca.h>
+#else /* not sparc */
+/* We think this test detects Watcom and Microsoft C. */
+/* This used to test MSDOS, but that is a bad idea
+ since that symbol is in the user namespace. */
+#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__)
+#if 0 /* No need for malloc.h, which pollutes the namespace;
+ instead, just don't use alloca. */
+#include <malloc.h>
+#endif
+#else /* not MSDOS, or __TURBOC__ */
+#if defined(_AIX)
+/* I don't know what this was needed for, but it pollutes the namespace.
+ So I turned it off. rms, 2 May 1997. */
+/* #include <malloc.h> */
+ #pragma alloca
+#define YYSTACK_USE_ALLOCA
+#else /* not MSDOS, or __TURBOC__, or _AIX */
+#if 0
+#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up,
+ and on HPUX 10. Eventually we can turn this on. */
+#define YYSTACK_USE_ALLOCA
+#define alloca __builtin_alloca
+#endif /* __hpux */
+#endif
+#endif /* not _AIX */
+#endif /* not MSDOS, or __TURBOC__ */
+#endif /* not sparc */
+#endif /* not GNU C */
+#endif /* alloca not defined */
+#endif /* YYSTACK_USE_ALLOCA not defined */
+
+#ifdef YYSTACK_USE_ALLOCA
+#define YYSTACK_ALLOC alloca
+#else
+#define YYSTACK_ALLOC malloc
+#endif
+
+/* Note: there must be only one dollar sign in this file.
+ It is replaced by the list of actions, each action
+ as one case of the switch. */
+
+#define yyerrok (yyerrstatus = 0)
+#define yyclearin (yychar = YYEMPTY)
+#define YYEMPTY -2
+#define YYEOF 0
+#define YYACCEPT goto yyacceptlab
+#define YYABORT goto yyabortlab
+#define YYERROR goto yyerrlab1
+/* Like YYERROR except do call yyerror.
+ This remains here temporarily to ease the
+ transition to the new meaning of YYERROR, for GCC.
+ Once GCC version 2 has supplanted version 1, this can go. */
+#define YYFAIL goto yyerrlab
+#define YYRECOVERING() (!!yyerrstatus)
+#define YYBACKUP(token, value) \
+do \
+ if (yychar == YYEMPTY && yylen == 1) \
+ { yychar = (token), yylval = (value); \
+ yychar1 = YYTRANSLATE (yychar); \
+ YYPOPSTACK; \
+ goto yybackup; \
+ } \
+ else \
+ { yyerror ("syntax error: cannot back up"); YYERROR; } \
+while (0)
+
+#define YYTERROR 1
+#define YYERRCODE 256
+
+#ifndef YYPURE
+#define YYLEX yylex()
+#endif
+
+#ifdef YYPURE
+#ifdef YYLSP_NEEDED
+#ifdef YYLEX_PARAM
+#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM)
+#else
+#define YYLEX yylex(&yylval, &yylloc)
+#endif
+#else /* not YYLSP_NEEDED */
+#ifdef YYLEX_PARAM
+#define YYLEX yylex(&yylval, YYLEX_PARAM)
+#else
+#define YYLEX yylex(&yylval)
+#endif
+#endif /* not YYLSP_NEEDED */
+#endif
+
+/* If nonreentrant, generate the variables here */
+
+#ifndef YYPURE
+
+int yychar; /* the lookahead symbol */
+YYSTYPE yylval; /* the semantic value of the */
+ /* lookahead symbol */
+
+#ifdef YYLSP_NEEDED
+YYLTYPE yylloc; /* location data for the lookahead */
+ /* symbol */
+#endif
+
+int yynerrs; /* number of parse errors so far */
+#endif /* not YYPURE */
+
+#if YYDEBUG != 0
+int yydebug; /* nonzero means print parse trace */
+/* Since this is uninitialized, it does not stop multiple parsers
+ from coexisting. */
+#endif
+
+/* YYINITDEPTH indicates the initial size of the parser's stacks */
+
+#ifndef YYINITDEPTH
+#define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH is the maximum size the stacks can grow to
+ (effective only if the built-in stack extension method is used). */
+
+#if YYMAXDEPTH == 0
+#undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+#define YYMAXDEPTH 10000
+#endif
+
+/* Define __yy_memcpy. Note that the size argument
+ should be passed with type unsigned int, because that is what the non-GCC
+ definitions require. With GCC, __builtin_memcpy takes an arg
+ of type size_t, but it can handle unsigned int. */
+
+#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */
+#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT)
+#else /* not GNU C or C++ */
+#ifndef __cplusplus
+
+/* This is the most reliable way to avoid incompatibilities
+ in available built-in functions on various systems. */
+static void
+__yy_memcpy (to, from, count)
+ char *to;
+ char *from;
+ unsigned int count;
+{
+ register char *f = from;
+ register char *t = to;
+ register int i = count;
+
+ while (i-- > 0)
+ *t++ = *f++;
+}
+
+#else /* __cplusplus */
+
+/* This is the most reliable way to avoid incompatibilities
+ in available built-in functions on various systems. */
+static void
+__yy_memcpy (char *to, char *from, unsigned int count)
+{
+ register char *t = to;
+ register char *f = from;
+ register int i = count;
+
+ while (i-- > 0)
+ *t++ = *f++;
+}
+
+#endif
+#endif
+
+#line 217 "/usr/lib/bison.simple"
+
+/* The user can define YYPARSE_PARAM as the name of an argument to be passed
+ into yyparse. The argument should have type void *.
+ It should actually point to an object.
+ Grammar actions can access the variable by casting it
+ to the proper pointer type. */
+
+#ifdef YYPARSE_PARAM
+#ifdef __cplusplus
+#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL
+#else /* not __cplusplus */
+#define YYPARSE_PARAM_ARG YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+#endif /* not __cplusplus */
+#else /* not YYPARSE_PARAM */
+#define YYPARSE_PARAM_ARG
+#define YYPARSE_PARAM_DECL
+#endif /* not YYPARSE_PARAM */
+
+/* Prevent warning if -Wstrict-prototypes. */
+#ifdef __GNUC__
+#ifdef YYPARSE_PARAM
+int yyparse (void *);
+#else
+int yyparse (void);
+#endif
+#endif
+
+int
+yyparse(YYPARSE_PARAM_ARG)
+ YYPARSE_PARAM_DECL
+{
+ register int yystate;
+ register int yyn;
+ register short *yyssp;
+ register YYSTYPE *yyvsp;
+ int yyerrstatus; /* number of tokens to shift before error messages enabled */
+ int yychar1 = 0; /* lookahead token as an internal (translated) token number */
+
+ short yyssa[YYINITDEPTH]; /* the state stack */
+ YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */
+
+ short *yyss = yyssa; /* refer to the stacks thru separate pointers */
+ YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */
+
+#ifdef YYLSP_NEEDED
+ YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */
+ YYLTYPE *yyls = yylsa;
+ YYLTYPE *yylsp;
+
+#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--)
+#else
+#define YYPOPSTACK (yyvsp--, yyssp--)
+#endif
+
+ int yystacksize = YYINITDEPTH;
+ int yyfree_stacks = 0;
+
+#ifdef YYPURE
+ int yychar;
+ YYSTYPE yylval;
+ int yynerrs;
+#ifdef YYLSP_NEEDED
+ YYLTYPE yylloc;
+#endif
+#endif
+
+ YYSTYPE yyval; /* the variable used to return */
+ /* semantic values from the action */
+ /* routines */
+
+ int yylen;
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Starting parse\n");
+#endif
+
+ yystate = 0;
+ yyerrstatus = 0;
+ yynerrs = 0;
+ yychar = YYEMPTY; /* Cause a token to be read. */
+
+ /* Initialize stack pointers.
+ Waste one element of value and location stack
+ so that they stay on the same level as the state stack.
+ The wasted elements are never initialized. */
+
+ yyssp = yyss - 1;
+ yyvsp = yyvs;
+#ifdef YYLSP_NEEDED
+ yylsp = yyls;
+#endif
+
+/* Push a new state, which is found in yystate . */
+/* In all cases, when you get here, the value and location stacks
+ have just been pushed. so pushing a state here evens the stacks. */
+yynewstate:
+
+ *++yyssp = yystate;
+
+ if (yyssp >= yyss + yystacksize - 1)
+ {
+ /* Give user a chance to reallocate the stack */
+ /* Use copies of these so that the &'s don't force the real ones into memory. */
+ YYSTYPE *yyvs1 = yyvs;
+ short *yyss1 = yyss;
+#ifdef YYLSP_NEEDED
+ YYLTYPE *yyls1 = yyls;
+#endif
+
+ /* Get the current used size of the three stacks, in elements. */
+ int size = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+ /* Each stack pointer address is followed by the size of
+ the data in use in that stack, in bytes. */
+#ifdef YYLSP_NEEDED
+ /* This used to be a conditional around just the two extra args,
+ but that might be undefined if yyoverflow is a macro. */
+ yyoverflow("parser stack overflow",
+ &yyss1, size * sizeof (*yyssp),
+ &yyvs1, size * sizeof (*yyvsp),
+ &yyls1, size * sizeof (*yylsp),
+ &yystacksize);
+#else
+ yyoverflow("parser stack overflow",
+ &yyss1, size * sizeof (*yyssp),
+ &yyvs1, size * sizeof (*yyvsp),
+ &yystacksize);
+#endif
+
+ yyss = yyss1; yyvs = yyvs1;
+#ifdef YYLSP_NEEDED
+ yyls = yyls1;
+#endif
+#else /* no yyoverflow */
+ /* Extend the stack our own way. */
+ if (yystacksize >= YYMAXDEPTH)
+ {
+ yyerror("parser stack overflow");
+ if (yyfree_stacks)
+ {
+ free (yyss);
+ free (yyvs);
+#ifdef YYLSP_NEEDED
+ free (yyls);
+#endif
+ }
+ return 2;
+ }
+ yystacksize *= 2;
+ if (yystacksize > YYMAXDEPTH)
+ yystacksize = YYMAXDEPTH;
+#ifndef YYSTACK_USE_ALLOCA
+ yyfree_stacks = 1;
+#endif
+ yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp));
+ __yy_memcpy ((char *)yyss, (char *)yyss1,
+ size * (unsigned int) sizeof (*yyssp));
+ yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp));
+ __yy_memcpy ((char *)yyvs, (char *)yyvs1,
+ size * (unsigned int) sizeof (*yyvsp));
+#ifdef YYLSP_NEEDED
+ yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp));
+ __yy_memcpy ((char *)yyls, (char *)yyls1,
+ size * (unsigned int) sizeof (*yylsp));
+#endif
+#endif /* no yyoverflow */
+
+ yyssp = yyss + size - 1;
+ yyvsp = yyvs + size - 1;
+#ifdef YYLSP_NEEDED
+ yylsp = yyls + size - 1;
+#endif
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Stack size increased to %d\n", yystacksize);
+#endif
+
+ if (yyssp >= yyss + yystacksize - 1)
+ YYABORT;
+ }
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Entering state %d\n", yystate);
+#endif
+
+ goto yybackup;
+ yybackup:
+
+/* Do appropriate processing given the current state. */
+/* Read a lookahead token if we need one and don't already have one. */
+/* yyresume: */
+
+ /* First try to decide what to do without reference to lookahead token. */
+
+ yyn = yypact[yystate];
+ if (yyn == YYFLAG)
+ goto yydefault;
+
+ /* Not known => get a lookahead token if don't already have one. */
+
+ /* yychar is either YYEMPTY or YYEOF
+ or a valid token in external form. */
+
+ if (yychar == YYEMPTY)
+ {
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Reading a token: ");
+#endif
+ yychar = YYLEX;
+ }
+
+ /* Convert token to internal form (in yychar1) for indexing tables with */
+
+ if (yychar <= 0) /* This means end of input. */
+ {
+ yychar1 = 0;
+ yychar = YYEOF; /* Don't call YYLEX any more */
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Now at end of input.\n");
+#endif
+ }
+ else
+ {
+ yychar1 = YYTRANSLATE(yychar);
+
+#if YYDEBUG != 0
+ if (yydebug)
+ {
+ fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
+ /* Give the individual parser a way to print the precise meaning
+ of a token, for further debugging info. */
+#ifdef YYPRINT
+ YYPRINT (stderr, yychar, yylval);
+#endif
+ fprintf (stderr, ")\n");
+ }
+#endif
+ }
+
+ yyn += yychar1;
+ if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
+ goto yydefault;
+
+ yyn = yytable[yyn];
+
+ /* yyn is what to do for this token type in this state.
+ Negative => reduce, -yyn is rule number.
+ Positive => shift, yyn is new state.
+ New state is final state => don't bother to shift,
+ just return success.
+ 0, or most negative number => error. */
+
+ if (yyn < 0)
+ {
+ if (yyn == YYFLAG)
+ goto yyerrlab;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+ else if (yyn == 0)
+ goto yyerrlab;
+
+ if (yyn == YYFINAL)
+ YYACCEPT;
+
+ /* Shift the lookahead token. */
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
+#endif
+
+ /* Discard the token being shifted unless it is eof. */
+ if (yychar != YYEOF)
+ yychar = YYEMPTY;
+
+ *++yyvsp = yylval;
+#ifdef YYLSP_NEEDED
+ *++yylsp = yylloc;
+#endif
+
+ /* count tokens shifted since error; after three, turn off error status. */
+ if (yyerrstatus) yyerrstatus--;
+
+ yystate = yyn;
+ goto yynewstate;
+
+/* Do the default action for the current state. */
+yydefault:
+
+ yyn = yydefact[yystate];
+ if (yyn == 0)
+ goto yyerrlab;
+
+/* Do a reduction. yyn is the number of a rule to reduce with. */
+yyreduce:
+ yylen = yyr2[yyn];
+ if (yylen > 0)
+ yyval = yyvsp[1-yylen]; /* implement default value of the action */
+
+#if YYDEBUG != 0
+ if (yydebug)
+ {
+ int i;
+
+ fprintf (stderr, "Reducing via rule %d (line %d), ",
+ yyn, yyrline[yyn]);
+
+ /* Print the symbols being reduced, and their result. */
+ for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
+ fprintf (stderr, "%s ", yytname[yyrhs[i]]);
+ fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
+ }
+#endif
+
+
+ switch (yyn) {
+
+case 9:
+#line 121 "icalitip.y"
+{
+ icalparser_yy_value = 0;
+ icalparser_clear_flex_input();
+ yyclearin;
+ ;
+ break;}
+case 11:
+#line 131 "icalitip.y"
+{ icalparser_yy_value = icalvalue_new_boolean(1); ;
+ break;}
+case 12:
+#line 133 "icalitip.y"
+{ icalparser_yy_value = icalvalue_new_boolean(0); ;
+ break;}
+case 13:
+#line 136 "icalitip.y"
+{
+ struct icaltimetype stm;
+
+ stm = fill_datetime(yyvsp[0].v_string,0);
+
+ stm.hour = -1;
+ stm.minute = -1;
+ stm.second = -1;
+ stm.is_utc = 0;
+ stm.is_date = 1;
+
+ icalparser_yy_value = icalvalue_new_date(stm);
+ ;
+ break;}
+case 14:
+#line 151 "icalitip.y"
+{utc = 0;;
+ break;}
+case 15:
+#line 152 "icalitip.y"
+{utc = 1;;
+ break;}
+case 16:
+#line 156 "icalitip.y"
+{utc_b = 0;;
+ break;}
+case 17:
+#line 157 "icalitip.y"
+{utc_b = 1;;
+ break;}
+case 18:
+#line 161 "icalitip.y"
+{
+ struct icaltimetype stm;
+ stm = fill_datetime(yyvsp[-3].v_string, yyvsp[-1].v_string);
+ stm.is_utc = utc;
+ stm.is_date = 0;
+
+ icalparser_yy_value =
+ icalvalue_new_datetime(stm);
+ ;
+ break;}
+case 21:
+#line 179 "icalitip.y"
+{
+ duration.weeks = atoi(yyvsp[-1].v_string);
+ ;
+ break;}
+case 22:
+#line 184 "icalitip.y"
+{
+ ;
+ break;}
+case 23:
+#line 187 "icalitip.y"
+{
+ ;
+ break;}
+case 24:
+#line 190 "icalitip.y"
+{
+ ;
+ break;}
+case 25:
+#line 194 "icalitip.y"
+{
+ duration.hours = atoi(yyvsp[-1].v_string);
+ ;
+ break;}
+case 26:
+#line 198 "icalitip.y"
+{
+ duration.hours = atoi(yyvsp[-2].v_string);
+ ;
+ break;}
+case 27:
+#line 203 "icalitip.y"
+{
+ duration.minutes = atoi(yyvsp[-1].v_string);
+ ;
+ break;}
+case 28:
+#line 207 "icalitip.y"
+{
+ duration.minutes = atoi(yyvsp[-2].v_string);
+ ;
+ break;}
+case 29:
+#line 212 "icalitip.y"
+{
+ duration.seconds = atoi(yyvsp[-1].v_string);
+ ;
+ break;}
+case 30:
+#line 217 "icalitip.y"
+{
+ duration.days = atoi(yyvsp[-1].v_string);
+ ;
+ break;}
+case 31:
+#line 222 "icalitip.y"
+{
+ ;
+ break;}
+case 32:
+#line 225 "icalitip.y"
+{
+ ;
+ break;}
+case 33:
+#line 228 "icalitip.y"
+{
+ ;
+ break;}
+case 34:
+#line 232 "icalitip.y"
+{
+ icalparser_yy_value = icalvalue_new_duration(duration);
+ memset(&duration,0, sizeof(duration));
+ ;
+ break;}
+case 35:
+#line 237 "icalitip.y"
+{
+ icalparser_yy_value = icalvalue_new_duration(duration);
+ memset(&duration,0, sizeof(duration));
+ ;
+ break;}
+case 36:
+#line 242 "icalitip.y"
+{
+ icalparser_yy_value = icalvalue_new_duration(duration);
+ memset(&duration,0, sizeof(duration));
+ ;
+ break;}
+case 37:
+#line 251 "icalitip.y"
+{
+ struct icalperiodtype p;
+
+ p.start = fill_datetime(yyvsp[-8].v_string,yyvsp[-6].v_string);
+ p.start.is_utc = utc;
+ p.start.is_date = 0;
+
+
+ p.end = fill_datetime(yyvsp[-3].v_string,yyvsp[-1].v_string);
+ p.end.is_utc = utc_b;
+ p.end.is_date = 0;
+
+ p.duration.days = -1;
+ p.duration.weeks = -1;
+ p.duration.hours = -1;
+ p.duration.minutes = -1;
+ p.duration.seconds = -1;
+
+ icalparser_yy_value = icalvalue_new_period(p);
+ ;
+ break;}
+case 38:
+#line 272 "icalitip.y"
+{
+ struct icalperiodtype p;
+
+ p.start = fill_datetime(yyvsp[-5].v_string,yyvsp[-3].v_string);
+ p.start.is_utc = utc;
+ p.start.is_date = 0;
+
+ p.end.year = -1;
+ p.end.month = -1;
+ p.end.day = -1;
+ p.end.hour = -1;
+ p.end.minute = -1;
+ p.end.second = -1;
+
+ /* The duration_value rule setes the global 'duration'
+ variable, but it also creates a new value in
+ icalparser_yy_value. So, free that, then copy
+ 'duration' into the icalperiodtype struct. */
+
+ p.duration = icalvalue_get_duration(icalparser_yy_value);
+ icalvalue_free(icalparser_yy_value);
+ icalparser_yy_value = 0;
+
+ icalparser_yy_value = icalvalue_new_period(p);
+
+ ;
+ break;}
+case 39:
+#line 304 "icalitip.y"
+{clear_recur();recur.freq = ICAL_SECONDLY_RECURRENCE;;
+ break;}
+case 40:
+#line 305 "icalitip.y"
+{clear_recur();recur.freq = ICAL_MINUTELY_RECURRENCE;;
+ break;}
+case 41:
+#line 306 "icalitip.y"
+{clear_recur();recur.freq = ICAL_HOURLY_RECURRENCE;;
+ break;}
+case 42:
+#line 307 "icalitip.y"
+{clear_recur();recur.freq = ICAL_DAILY_RECURRENCE;;
+ break;}
+case 43:
+#line 308 "icalitip.y"
+{clear_recur();recur.freq = ICAL_WEEKLY_RECURRENCE;;
+ break;}
+case 44:
+#line 309 "icalitip.y"
+{clear_recur();recur.freq = ICAL_MONTHLY_RECURRENCE;;
+ break;}
+case 45:
+#line 310 "icalitip.y"
+{clear_recur();recur.freq = ICAL_YEARLY_RECURRENCE;;
+ break;}
+case 46:
+#line 315 "icalitip.y"
+{ skiplist[skippos]=ICAL_SUNDAY_WEEKDAY; if( skippos<8) skippos++;;
+ break;}
+case 47:
+#line 316 "icalitip.y"
+{ skiplist[skippos]=ICAL_MONDAY_WEEKDAY;if( skippos<8) skippos++;;
+ break;}
+case 48:
+#line 317 "icalitip.y"
+{ skiplist[skippos]=ICAL_TUESDAY_WEEKDAY;if( skippos<8) skippos++;;
+ break;}
+case 49:
+#line 318 "icalitip.y"
+{ skiplist[skippos]=ICAL_WEDNESDAY_WEEKDAY;if( skippos<8) skippos++;;
+ break;}
+case 50:
+#line 319 "icalitip.y"
+{ skiplist[skippos]=ICAL_THURSDAY_WEEKDAY;if( skippos<8) skippos++;;
+ break;}
+case 51:
+#line 320 "icalitip.y"
+{ skiplist[skippos]=ICAL_FRIDAY_WEEKDAY;if( skippos<8) skippos++;;
+ break;}
+case 52:
+#line 321 "icalitip.y"
+{ skiplist[skippos]=ICAL_SATURDAY_WEEKDAY;if( skippos<8) skippos++;;
+ break;}
+case 54:
+#line 327 "icalitip.y"
+{ ;
+ break;}
+case 56:
+#line 332 "icalitip.y"
+{ skiplist[skippos] = atoi(yyvsp[0].v_string); skippos++;;
+ break;}
+case 57:
+#line 333 "icalitip.y"
+{ skiplist[skippos] = atoi(yyvsp[0].v_string); if (skippos<367) skippos++;;
+ break;}
+case 58:
+#line 337 "icalitip.y"
+{recur.interval = atoi(yyvsp[0].v_string);;
+ break;}
+case 59:
+#line 338 "icalitip.y"
+{recur.week_start = ICAL_SUNDAY_WEEKDAY;;
+ break;}
+case 60:
+#line 339 "icalitip.y"
+{recur.week_start = ICAL_MONDAY_WEEKDAY;;
+ break;}
+case 61:
+#line 340 "icalitip.y"
+{recur.week_start = ICAL_TUESDAY_WEEKDAY;;
+ break;}
+case 62:
+#line 341 "icalitip.y"
+{recur.week_start = ICAL_WEDNESDAY_WEEKDAY;;
+ break;}
+case 63:
+#line 342 "icalitip.y"
+{recur.week_start = ICAL_THURSDAY_WEEKDAY;;
+ break;}
+case 64:
+#line 343 "icalitip.y"
+{recur.week_start = ICAL_FRIDAY_WEEKDAY;;
+ break;}
+case 65:
+#line 344 "icalitip.y"
+{recur.week_start = ICAL_SATURDAY_WEEKDAY;;
+ break;}
+case 66:
+#line 345 "icalitip.y"
+{copy_list(recur.by_second,60);;
+ break;}
+case 67:
+#line 346 "icalitip.y"
+{copy_list(recur.by_minute,60);;
+ break;}
+case 68:
+#line 347 "icalitip.y"
+{copy_list(recur.by_hour,24);;
+ break;}
+case 69:
+#line 348 "icalitip.y"
+{copy_list(recur.by_day,7);;
+ break;}
+case 70:
+#line 349 "icalitip.y"
+{copy_list(recur.by_month,12);;
+ break;}
+case 71:
+#line 350 "icalitip.y"
+{copy_list(recur.by_month_day,31);;
+ break;}
+case 72:
+#line 351 "icalitip.y"
+{copy_list(recur.by_year_day,366);;
+ break;}
+case 73:
+#line 352 "icalitip.y"
+{copy_list(recur.by_week_no,53);;
+ break;}
+case 74:
+#line 353 "icalitip.y"
+{copy_list(recur.by_set_pos,366);;
+ break;}
+case 75:
+#line 355 "icalitip.y"
+{ recur.until = icalvalue_get_datetime(icalparser_yy_value);
+ icalvalue_free(icalparser_yy_value); icalparser_yy_value=0;;
+ break;}
+case 76:
+#line 358 "icalitip.y"
+{ recur.until = icalvalue_get_date(icalparser_yy_value);
+ icalvalue_free(icalparser_yy_value); icalparser_yy_value=0;;
+ break;}
+case 77:
+#line 361 "icalitip.y"
+{ recur.count = atoi(yyvsp[0].v_string); ;
+ break;}
+case 80:
+#line 370 "icalitip.y"
+{ icalparser_yy_value = icalvalue_new_recur(recur); ;
+ break;}
+case 81:
+#line 376 "icalitip.y"
+{ utcsign = 1; ;
+ break;}
+case 82:
+#line 377 "icalitip.y"
+{ utcsign = -1; ;
+ break;}
+case 83:
+#line 381 "icalitip.y"
+{
+ icalparser_yy_value = icalvalue_new_utcoffset( utcsign * (yyvsp[-1].v_int*3600) + (yyvsp[0].v_int*60) );
+ ;
+ break;}
+case 84:
+#line 386 "icalitip.y"
+{
+ icalparser_yy_value = icalvalue_new_utcoffset(utcsign * (yyvsp[-2].v_int*3600) + (yyvsp[-1].v_int*60) +(yyvsp[0].v_int));
+ ;
+ break;}
+}
+ /* the action file gets copied in in place of this dollarsign */
+#line 543 "/usr/lib/bison.simple"
+
+ yyvsp -= yylen;
+ yyssp -= yylen;
+#ifdef YYLSP_NEEDED
+ yylsp -= yylen;
+#endif
+
+#if YYDEBUG != 0
+ if (yydebug)
+ {
+ short *ssp1 = yyss - 1;
+ fprintf (stderr, "state stack now");
+ while (ssp1 != yyssp)
+ fprintf (stderr, " %d", *++ssp1);
+ fprintf (stderr, "\n");
+ }
+#endif
+
+ *++yyvsp = yyval;
+
+#ifdef YYLSP_NEEDED
+ yylsp++;
+ if (yylen == 0)
+ {
+ yylsp->first_line = yylloc.first_line;
+ yylsp->first_column = yylloc.first_column;
+ yylsp->last_line = (yylsp-1)->last_line;
+ yylsp->last_column = (yylsp-1)->last_column;
+ yylsp->text = 0;
+ }
+ else
+ {
+ yylsp->last_line = (yylsp+yylen-1)->last_line;
+ yylsp->last_column = (yylsp+yylen-1)->last_column;
+ }
+#endif
+
+ /* Now "shift" the result of the reduction.
+ Determine what state that goes to,
+ based on the state we popped back to
+ and the rule number reduced by. */
+
+ yyn = yyr1[yyn];
+
+ yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
+ if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+ yystate = yytable[yystate];
+ else
+ yystate = yydefgoto[yyn - YYNTBASE];
+
+ goto yynewstate;
+
+yyerrlab: /* here on detecting error */
+
+ if (! yyerrstatus)
+ /* If not already recovering from an error, report this error. */
+ {
+ ++yynerrs;
+
+#ifdef YYERROR_VERBOSE
+ yyn = yypact[yystate];
+
+ if (yyn > YYFLAG && yyn < YYLAST)
+ {
+ int size = 0;
+ char *msg;
+ int x, count;
+
+ count = 0;
+ /* Start X at -yyn if nec to avoid negative indexes in yycheck. */
+ for (x = (yyn < 0 ? -yyn : 0);
+ x < (sizeof(yytname) / sizeof(char *)); x++)
+ if (yycheck[x + yyn] == x)
+ size += strlen(yytname[x]) + 15, count++;
+ msg = (char *) malloc(size + 15);
+ if (msg != 0)
+ {
+ strcpy(msg, "parse error");
+
+ if (count < 5)
+ {
+ count = 0;
+ for (x = (yyn < 0 ? -yyn : 0);
+ x < (sizeof(yytname) / sizeof(char *)); x++)
+ if (yycheck[x + yyn] == x)
+ {
+ strcat(msg, count == 0 ? ", expecting `" : " or `");
+ strcat(msg, yytname[x]);
+ strcat(msg, "'");
+ count++;
+ }
+ }
+ yyerror(msg);
+ free(msg);
+ }
+ else
+ yyerror ("parse error; also virtual memory exceeded");
+ }
+ else
+#endif /* YYERROR_VERBOSE */
+ yyerror("parse error");
+ }
+
+ goto yyerrlab1;
+yyerrlab1: /* here on error raised explicitly by an action */
+
+ if (yyerrstatus == 3)
+ {
+ /* if just tried and failed to reuse lookahead token after an error, discard it. */
+
+ /* return failure if at end of input */
+ if (yychar == YYEOF)
+ YYABORT;
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
+#endif
+
+ yychar = YYEMPTY;
+ }
+
+ /* Else will try to reuse lookahead token
+ after shifting the error token. */
+
+ yyerrstatus = 3; /* Each real token shifted decrements this */
+
+ goto yyerrhandle;
+
+yyerrdefault: /* current state does not do anything special for the error token. */
+
+#if 0
+ /* This is wrong; only states that explicitly want error tokens
+ should shift them. */
+ yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/
+ if (yyn) goto yydefault;
+#endif
+
+yyerrpop: /* pop the current state because it cannot handle the error token */
+
+ if (yyssp == yyss) YYABORT;
+ yyvsp--;
+ yystate = *--yyssp;
+#ifdef YYLSP_NEEDED
+ yylsp--;
+#endif
+
+#if YYDEBUG != 0
+ if (yydebug)
+ {
+ short *ssp1 = yyss - 1;
+ fprintf (stderr, "Error: state stack now");
+ while (ssp1 != yyssp)
+ fprintf (stderr, " %d", *++ssp1);
+ fprintf (stderr, "\n");
+ }
+#endif
+
+yyerrhandle:
+
+ yyn = yypact[yystate];
+ if (yyn == YYFLAG)
+ goto yyerrdefault;
+
+ yyn += YYTERROR;
+ if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
+ goto yyerrdefault;
+
+ yyn = yytable[yyn];
+ if (yyn < 0)
+ {
+ if (yyn == YYFLAG)
+ goto yyerrpop;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+ else if (yyn == 0)
+ goto yyerrpop;
+
+ if (yyn == YYFINAL)
+ YYACCEPT;
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Shifting error token, ");
+#endif
+
+ *++yyvsp = yylval;
+#ifdef YYLSP_NEEDED
+ *++yylsp = yylloc;
+#endif
+
+ yystate = yyn;
+ goto yynewstate;
+
+ yyacceptlab:
+ /* YYACCEPT comes here. */
+ if (yyfree_stacks)
+ {
+ free (yyss);
+ free (yyvs);
+#ifdef YYLSP_NEEDED
+ free (yyls);
+#endif
+ }
+ return 0;
+
+ yyabortlab:
+ /* YYABORT comes here. */
+ if (yyfree_stacks)
+ {
+ free (yyss);
+ free (yyvs);
+#ifdef YYLSP_NEEDED
+ free (yyls);
+#endif
+ }
+ return 1;
+}
+#line 392 "icalitip.y"
+
+
+
+void clear_recur()
+{
+ memset(&skiplist, ICAL_RECURRENCE_ARRAY_MAX_BYTE, sizeof(skiplist));
+ skippos = 0;
+
+ icalrecurrencetype_clear(&recur);
+}
+
+void copy_list(short* array, size_t size)
+{
+ memcpy(array, skiplist, size*sizeof(short));
+ memset(&skiplist,ICAL_RECURRENCE_ARRAY_MAX_BYTE, sizeof(skiplist));
+ skippos = 0;
+}
+
+struct icaltimetype fill_datetime(char* datestr, char* timestr)
+{
+ struct icaltimetype stm;
+
+ memset(&stm,0,sizeof(stm));
+
+ if (datestr != 0){
+ sscanf(datestr,"%4d%2d%2d",&(stm.year), &(stm.month),
+ &(stm.day));
+ }
+
+ if (timestr != 0){
+ sscanf(timestr,"%2d%2d%2d", &(stm.hour), &(stm.minute),
+ &(stm.second));
+ }
+
+ return stm;
+
+}
+
+void yyerror(char* s)
+{
+ /*fprintf(stderr,"Parse error \'%s\'\n", s);*/
+}
+
diff --git a/libical/src/libical/icalitip.tab.h b/libical/src/libical/icalitip.tab.h
new file mode 100644
index 0000000000..197bd1c292
--- /dev/null
+++ b/libical/src/libical/icalitip.tab.h
@@ -0,0 +1,137 @@
+typedef union {
+ float v_float;
+ int v_int;
+ char* v_string;
+
+} YYSTYPE;
+#define DIGITS 257
+#define INTNUMBER 258
+#define FLOATNUMBER 259
+#define STRING 260
+#define EOL 261
+#define EQUALS 262
+#define CHARACTER 263
+#define COLON 264
+#define COMMA 265
+#define SEMICOLON 266
+#define TIMESEPERATOR 267
+#define TRUE 268
+#define FALSE 269
+#define FREQ 270
+#define BYDAY 271
+#define BYHOUR 272
+#define BYMINUTE 273
+#define BYMONTH 274
+#define BYMONTHDAY 275
+#define BYSECOND 276
+#define BYSETPOS 277
+#define BYWEEKNO 278
+#define BYYEARDAY 279
+#define DAILY 280
+#define MINUTELY 281
+#define MONTHLY 282
+#define SECONDLY 283
+#define WEEKLY 284
+#define HOURLY 285
+#define YEARLY 286
+#define INTERVAL 287
+#define COUNT 288
+#define UNTIL 289
+#define WKST 290
+#define MO 291
+#define SA 292
+#define SU 293
+#define TU 294
+#define WE 295
+#define TH 296
+#define FR 297
+#define BIT8 298
+#define ACCEPTED 299
+#define ADD 300
+#define AUDIO 301
+#define BASE64 302
+#define BINARY 303
+#define BOOLEAN 304
+#define BUSY 305
+#define BUSYTENTATIVE 306
+#define BUSYUNAVAILABLE 307
+#define CALADDRESS 308
+#define CANCEL 309
+#define CANCELLED 310
+#define CHAIR 311
+#define CHILD 312
+#define COMPLETED 313
+#define CONFIDENTIAL 314
+#define CONFIRMED 315
+#define COUNTER 316
+#define DATE 317
+#define DATETIME 318
+#define DECLINECOUNTER 319
+#define DECLINED 320
+#define DELEGATED 321
+#define DISPLAY 322
+#define DRAFT 323
+#define DURATION 324
+#define EMAIL 325
+#define END 326
+#define FINAL 327
+#define FLOAT 328
+#define FREE 329
+#define GREGORIAN 330
+#define GROUP 331
+#define INDIVIDUAL 332
+#define INPROCESS 333
+#define INTEGER 334
+#define NEEDSACTION 335
+#define NONPARTICIPANT 336
+#define OPAQUE 337
+#define OPTPARTICIPANT 338
+#define PARENT 339
+#define PERIOD 340
+#define PRIVATE 341
+#define PROCEDURE 342
+#define PUBLIC 343
+#define PUBLISH 344
+#define RECUR 345
+#define REFRESH 346
+#define REPLY 347
+#define REQPARTICIPANT 348
+#define REQUEST 349
+#define RESOURCE 350
+#define ROOM 351
+#define SIBLING 352
+#define START 353
+#define TENTATIVE 354
+#define TEXT 355
+#define THISANDFUTURE 356
+#define THISANDPRIOR 357
+#define TIME 358
+#define TRANSPAENT 359
+#define UNKNOWN 360
+#define UTCOFFSET 361
+#define XNAME 362
+#define ALTREP 363
+#define CN 364
+#define CUTYPE 365
+#define DAYLIGHT 366
+#define DIR 367
+#define ENCODING 368
+#define EVENT 369
+#define FBTYPE 370
+#define FMTTYPE 371
+#define LANGUAGE 372
+#define MEMBER 373
+#define PARTSTAT 374
+#define RANGE 375
+#define RELATED 376
+#define RELTYPE 377
+#define ROLE 378
+#define RSVP 379
+#define SENTBY 380
+#define STANDARD 381
+#define URI 382
+#define TIME_CHAR 383
+#define UTC_CHAR 384
+
+
+extern YYSTYPE icalparser_yylval;
diff --git a/libical/src/libical/icalitipl.l b/libical/src/libical/icalitipl.l
new file mode 100644
index 0000000000..9abe9538c9
--- /dev/null
+++ b/libical/src/libical/icalitipl.l
@@ -0,0 +1,283 @@
+%{
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: icalitip.y
+ CREATOR: eric 10 June 1999
+
+ DESCRIPTION:
+
+ $Id: icalitipl.l,v 1.3 2000/05/15 06:18:17 ericb Exp $
+ $Locker: $
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The original author is Eric Busboom
+ The original code is icalitip.y
+
+
+
+ ======================================================================*/
+#include "icalitipy.h"
+#include "icalparser.h"
+#include "icalenums.h"
+#include "icalmemory.h"
+#include "assert.h"
+
+#include <string.h> /* For strdup() */
+
+#define ICAL_MAX_STR_CONST 1024
+
+#undef YY_INPUT
+#define YY_INPUT(b,r,ms) ( r= icalparser_flex_input(b,ms))
+#undef yywrap
+
+#undef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) icalparser_yyerror(msg)
+
+icalvalue_kind value_kind=ICAL_NO_VALUE;
+void set_parser_value_state();
+extern enum icalparser_state_enum icalparser_state;
+extern int yydebug;
+
+void icalparser_yyerror(char *s);
+
+void init_str_buf();
+
+int last_state;
+
+char *str_buf;
+char *str_buf_p;
+size_t buf_sz; /* = ICAL_MAX_STR_CONST;*/
+
+
+%}
+
+crlf \x0D\x0A
+nl \n
+lbreak \x0D\x0A\x20
+ulbreak \x0A\x20
+space [ ]
+qsafechar [^\x00-\x1F\"]
+safechar [^\x00-\x1F\"\:\;\,]
+tsafechar [\x20-\x21\x23-\x2B\x2D-\x39\x3C-\x5B\x5D-\x7E]
+valuechar [^\x00-\x08\x10-\x1F]
+xname X-[a-zA-Z0-9\-]+
+xname2 [a-zA-Z0-9\-\ ]
+paramtext {safechar}+
+value {valuechar}+
+quotedstring \"{qsafechar}+\"
+digit [0-9]
+
+%array /* Make yytext an array. Slow, but handy. HACK */
+
+%option caseless
+
+
+%s quoted_string
+%s binary_value boolean_value uri_value time_value duration_value number_value period_value recur_value text_value utcoffset_value
+%s enum_param_value string_param_value stringlist_param_value keyword line_start component seperator parameter end_of_value paramtext
+
+
+
+%%
+
+%{
+%}
+
+
+<binary_value>{
+.* { icalparser_yylval.v_string= icalmemory_tmp_copy(yytext);
+ return STRING;}
+{crlf}|\n { return EOL;}
+
+}
+
+<boolean_value>{
+. { return CHARACTER; }
+{crlf}|\n { return EOL;}
+
+}
+
+<uri_value>{
+.* { icalparser_yylval.v_string= icalmemory_tmp_copy(yytext);
+ return STRING;}
+{crlf}|\n { return EOL;}
+
+}
+
+
+<time_value>{
+{digit}* { icalparser_yylval.v_string= icalmemory_tmp_copy(yytext);
+ return DIGITS; }
+T { return TIME_CHAR; }
+Z { return UTC_CHAR; }
+{crlf}|\n { return EOL;}
+}
+
+<duration_value>{
+{digit}+ { icalparser_yylval.v_string =icalmemory_tmp_copy(yytext);
+ return DIGITS; }
+T { return TIME_CHAR; }
+[\+\-PTWHMSD] { return yytext[0]; }
+{crlf}|\n { return EOL;}
+
+}
+
+<number_value>{
+[\+\-\.0-9]+ { icalparser_yylval.v_int=atoi(yytext); return INTNUMBER; }
+{crlf}|\n { return EOL;}
+}
+
+<period_value>{
+{digit}+ { icalparser_yylval.v_string =icalmemory_tmp_copy(yytext) ;
+ return DIGITS; }
+T { return TIME_CHAR; }
+Z { return UTC_CHAR; }
+[\/\+\-PWHMSD] { return yytext[0]; }
+{crlf}|\n { return EOL;}
+
+}
+
+<recur_value>{
+INTERVAL { return INTERVAL; }
+COUNT { return COUNT; }
+UNTIL { return UNTIL; }
+FREQ { return FREQ; }
+BYDAY { return BYDAY; }
+BYHOUR { return BYHOUR; }
+BYMINUTE { return BYMINUTE; }
+BYMONTH { return BYMONTH; }
+BYMONTHDAY { return BYMONTHDAY; }
+BYSECOND { return BYSECOND; }
+BYSETPOS { return BYSETPOS; }
+BYWEEKNO { return BYWEEKNO; }
+BYYEARDAY { return BYYEARDAY; }
+DAILY { return DAILY; }
+SECONDLY { return SECONDLY; }
+MINUTELY { return MINUTELY; }
+HOURLY { return HOURLY; }
+MONTHLY { return MONTHLY; }
+WEEKLY { return WEEKLY; }
+YEARLY { return YEARLY; }
+WKST { return WKST; }
+MO { return MO; }
+SA { return SA; }
+SU { return SU; }
+TU { return TU; }
+WE { return WE; }
+TH { return TH; }
+FR { return FR; }
+= { return EQUALS; }
+, { return COMMA; }
+; { return SEMICOLON; }
+[\-\+0-9]+ { icalparser_yylval.v_string= icalmemory_tmp_copy(yytext);
+ return DIGITS; }
+T { return TIME_CHAR; }
+Z { return UTC_CHAR; }
+{crlf}|\n { return EOL;}
+}
+
+<utcoffset_value>{
+{crlf}|\n { return EOL;}
+\-|\+ { return yytext[0]; }
+{digit}{digit} { icalparser_yylval.v_int=atoi(yytext); return INTNUMBER; }
+
+}
+
+<enum_param_value>{
+. { return CHARACTER; }
+{crlf}|\n { return EOL;}
+
+}
+
+<seperator>{
+, { BEGIN(last_state); return COMMA; }
+}
+
+
+%%
+
+int yywrap()
+{
+ return 1;
+}
+
+
+void set_parser_value_state(icalvalue_kind kind)
+{
+
+ switch (kind){
+
+ case ICAL_ATTACH_VALUE:
+ case ICAL_BINARY_VALUE:
+ {BEGIN(binary_value);break;}
+
+ case ICAL_BOOLEAN_VALUE:
+ case ICAL_INTEGER_VALUE:
+ case ICAL_FLOAT_VALUE:
+ {BEGIN(number_value);break;}
+
+ case ICAL_UTCOFFSET_VALUE:
+ {BEGIN(utcoffset_value);break;}
+
+ case ICAL_TEXT_VALUE:
+ {BEGIN(text_value);
+ init_str_buf();
+ break;}
+
+ case ICAL_CALADDRESS_VALUE:
+ case ICAL_URI_VALUE:
+ {BEGIN(uri_value);break;}
+
+ case ICAL_DATE_VALUE:
+ case ICAL_DATETIME_VALUE:
+ case ICAL_DATETIMEDATE_VALUE:
+ case ICAL_DATETIMEPERIOD_VALUE:
+ case ICAL_TIME_VALUE:
+ {BEGIN(time_value);break;}
+
+ case ICAL_DURATION_VALUE:
+ {BEGIN(duration_value);break;}
+
+ case ICAL_PERIOD_VALUE:
+ {BEGIN(period_value);break;}
+
+ case ICAL_GEO_VALUE:
+ case ICAL_QUERY_VALUE:
+ {BEGIN(text_value);break;}
+
+ case ICAL_RECUR_VALUE:
+ {BEGIN(recur_value);break;}
+
+ case ICAL_NO_VALUE:
+ {
+ /* The value is probably actually a component name */
+ {BEGIN(component); break;}
+ }
+ default:
+ {
+ assert(1==0);
+ }
+ }
+}
+
+void init_str_buf()
+{
+ str_buf = icalmemory_tmp_buffer(ICAL_MAX_STR_CONST);
+ str_buf_p = str_buf;
+ buf_sz = ICAL_MAX_STR_CONST;
+
+
+}
+
diff --git a/libical/src/libical/icalitipy.y b/libical/src/libical/icalitipy.y
new file mode 100644
index 0000000000..07573d62cd
--- /dev/null
+++ b/libical/src/libical/icalitipy.y
@@ -0,0 +1,434 @@
+%{
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: icalitip.y
+ CREATOR: eric 10 June 1999
+
+ DESCRIPTION:
+
+ $Id: icalitipy.y,v 1.3 2000/05/15 06:18:17 ericb Exp $
+ $Locker: $
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The original author is Eric Busboom
+ The original code is icalitip.y
+
+
+
+ ================================b======================================*/
+
+#include <stdlib.h>
+#include <string.h> /* for strdup() */
+#include <limits.h> /* for SHRT_MAX*/
+#include "icalparser.h"
+#include "ical.h"
+#include "pvl.h"
+
+#define YYERROR_VERBOSE
+#define YYDEBUG 1
+
+icalvalue *icalparser_yy_value; /* Current Value */
+
+/* Globals for UTCOFFSET values */
+int utc;
+int utc_b;
+int utcsign;
+
+/* Globals for DURATION values */
+struct icaldurationtype duration;
+
+/* Globals for RECUR values */
+struct icalrecurrencetype recur;
+short skiplist[367];
+short skippos;
+
+void copy_list(short* array, size_t size);
+void clear_recur();
+void add_prop(icalproperty_kind);
+void icalparser_fill_date(struct tm* t, char* dstr);
+void icalparser_fill_time(struct tm* t, char* tstr);
+void set_value_type(icalvalue_kind kind);
+void yyerror(char *s); /* Don't know why I need this.... */
+int yylex(void); /* Or this. */
+void set_parser_value_state();
+struct icaltimetype fill_datetime(char* d, char* t);
+
+
+
+/* Set the state of the lexer so it will interpret values ( iCAL
+ VALUEs, that is, ) correctly. */
+
+%}
+
+%union {
+ float v_float;
+ int v_int;
+ char* v_string;
+
+}
+
+%token <v_string> DIGITS
+%token <v_int> INTNUMBER
+%token <v_float> FLOATNUMBER
+%token <v_string> STRING
+%token EOL EQUALS CHARACTER COLON COMMA SEMICOLON TIMESEPERATOR
+
+%token TRUE FALSE
+
+%token FREQ BYDAY BYHOUR BYMINUTE BYMONTH BYMONTHDAY BYSECOND BYSETPOS BYWEEKNO
+%token BYYEARDAY DAILY MINUTELY MONTHLY SECONDLY WEEKLY HOURLY YEARLY
+%token INTERVAL COUNT UNTIL WKST MO SA SU TU WE TH FR
+
+%token BIT8 ACCEPTED ADD AUDIO BASE64 BINARY BOOLEAN BUSY BUSYTENTATIVE
+%token BUSYUNAVAILABLE CALADDRESS CANCEL CANCELLED CHAIR CHILD COMPLETED
+%token CONFIDENTIAL CONFIRMED COUNTER DATE DATETIME DECLINECOUNTER DECLINED
+%token DELEGATED DISPLAY DRAFT DURATION EMAIL END FINAL FLOAT FREE GREGORIAN
+%token GROUP INDIVIDUAL INPROCESS INTEGER NEEDSACTION NONPARTICIPANT
+%token OPAQUE OPTPARTICIPANT PARENT PERIOD PRIVATE PROCEDURE PUBLIC PUBLISH
+%token RECUR REFRESH REPLY REQPARTICIPANT REQUEST RESOURCE ROOM SIBLING
+%token START TENTATIVE TEXT THISANDFUTURE THISANDPRIOR TIME TRANSPAENT
+%token UNKNOWN UTCOFFSET XNAME
+
+%token ALTREP CN CUTYPE DAYLIGHT DIR ENCODING EVENT FBTYPE FMTTYPE LANGUAGE
+%token MEMBER PARTSTAT RANGE RELATED RELTYPE ROLE RSVP SENTBY STANDARD URI
+
+%token TIME_CHAR UTC_CHAR
+
+
+%%
+
+value:
+ binary_value
+ | boolean_value
+ | date_value
+ | datetime_value
+ | duration_value
+ | period_value
+ | recur_value
+ | utcoffset_value
+ | error {
+ icalparser_yy_value = 0;
+ icalparser_clear_flex_input();
+ yyclearin;
+ }
+
+binary_value: "unimplemented2"
+
+boolean_value:
+ TRUE
+ { icalparser_yy_value = icalvalue_new_boolean(1); }
+ | FALSE
+ { icalparser_yy_value = icalvalue_new_boolean(0); }
+
+date_value: DIGITS
+ {
+ struct icaltimetype stm;
+
+ stm = fill_datetime($1,0);
+
+ stm.hour = -1;
+ stm.minute = -1;
+ stm.second = -1;
+ stm.is_utc = 0;
+ stm.is_date = 1;
+
+ icalparser_yy_value = icalvalue_new_date(stm);
+ }
+
+utc_char:
+ /*empty*/ {utc = 0;}
+ | UTC_CHAR {utc = 1;}
+
+/* This is used in the period_value, where there may be two utc characters per rule. */
+utc_char_b:
+ /*empty*/ {utc_b = 0;}
+ | UTC_CHAR {utc_b = 1;}
+
+datetime_value:
+ DIGITS TIME_CHAR DIGITS utc_char
+ {
+ struct icaltimetype stm;
+ stm = fill_datetime($1, $3);
+ stm.is_utc = utc;
+ stm.is_date = 0;
+
+ icalparser_yy_value =
+ icalvalue_new_datetime(stm);
+ }
+
+
+/* Duration */
+
+
+dur_date: dur_day
+ | dur_day dur_time
+
+dur_week: DIGITS 'W'
+ {
+ duration.weeks = atoi($1);
+ }
+
+dur_time: TIME_CHAR dur_hour
+ {
+ }
+ | TIME_CHAR dur_minute
+ {
+ }
+ | TIME_CHAR dur_second
+ {
+ }
+
+dur_hour: DIGITS 'H'
+ {
+ duration.hours = atoi($1);
+ }
+ | DIGITS 'H' dur_minute
+ {
+ duration.hours = atoi($1);
+ }
+
+dur_minute: DIGITS 'M'
+ {
+ duration.minutes = atoi($1);
+ }
+ | DIGITS 'M' dur_second
+ {
+ duration.minutes = atoi($1);
+ }
+
+dur_second: DIGITS 'S'
+ {
+ duration.seconds = atoi($1);
+ }
+
+dur_day: DIGITS 'D'
+ {
+ duration.days = atoi($1);
+ }
+
+dur_prefix: /* empty */
+ {
+ }
+ | '+'
+ {
+ }
+ | '-'
+ {
+ }
+
+duration_value: dur_prefix 'P' dur_date
+ {
+ icalparser_yy_value = icalvalue_new_duration(duration);
+ memset(&duration,0, sizeof(duration));
+ }
+ | dur_prefix 'P' dur_time
+ {
+ icalparser_yy_value = icalvalue_new_duration(duration);
+ memset(&duration,0, sizeof(duration));
+ }
+ | dur_prefix 'P' dur_week
+ {
+ icalparser_yy_value = icalvalue_new_duration(duration);
+ memset(&duration,0, sizeof(duration));
+ }
+
+
+/* Period */
+
+period_value: DIGITS TIME_CHAR DIGITS utc_char '/' DIGITS TIME_CHAR DIGITS utc_char_b
+ {
+ struct icalperiodtype p;
+
+ p.start = fill_datetime($1,$3);
+ p.start.is_utc = utc;
+ p.start.is_date = 0;
+
+
+ p.end = fill_datetime($6,$8);
+ p.end.is_utc = utc_b;
+ p.end.is_date = 0;
+
+ p.duration.days = -1;
+ p.duration.weeks = -1;
+ p.duration.hours = -1;
+ p.duration.minutes = -1;
+ p.duration.seconds = -1;
+
+ icalparser_yy_value = icalvalue_new_period(p);
+ }
+ | DIGITS TIME_CHAR DIGITS utc_char '/' duration_value
+ {
+ struct icalperiodtype p;
+
+ p.start = fill_datetime($1,$3);
+ p.start.is_utc = utc;
+ p.start.is_date = 0;
+
+ p.end.year = -1;
+ p.end.month = -1;
+ p.end.day = -1;
+ p.end.hour = -1;
+ p.end.minute = -1;
+ p.end.second = -1;
+
+ /* The duration_value rule setes the global 'duration'
+ variable, but it also creates a new value in
+ icalparser_yy_value. So, free that, then copy
+ 'duration' into the icalperiodtype struct. */
+
+ p.duration = icalvalue_get_duration(icalparser_yy_value);
+ icalvalue_free(icalparser_yy_value);
+ icalparser_yy_value = 0;
+
+ icalparser_yy_value = icalvalue_new_period(p);
+
+ }
+
+
+
+/* Recur */
+
+recur_start:
+ FREQ EQUALS SECONDLY {clear_recur();recur.freq = ICAL_SECONDLY_RECURRENCE;}
+ | FREQ EQUALS MINUTELY {clear_recur();recur.freq = ICAL_MINUTELY_RECURRENCE;}
+ | FREQ EQUALS HOURLY {clear_recur();recur.freq = ICAL_HOURLY_RECURRENCE;}
+ | FREQ EQUALS DAILY {clear_recur();recur.freq = ICAL_DAILY_RECURRENCE;}
+ | FREQ EQUALS WEEKLY {clear_recur();recur.freq = ICAL_WEEKLY_RECURRENCE;}
+ | FREQ EQUALS MONTHLY {clear_recur();recur.freq = ICAL_MONTHLY_RECURRENCE;}
+ | FREQ EQUALS YEARLY {clear_recur();recur.freq = ICAL_YEARLY_RECURRENCE;}
+ ;
+
+
+weekday:
+ SU { skiplist[skippos]=ICAL_SUNDAY_WEEKDAY; if( skippos<8) skippos++;}
+ | MO { skiplist[skippos]=ICAL_MONDAY_WEEKDAY;if( skippos<8) skippos++;}
+ | TU { skiplist[skippos]=ICAL_TUESDAY_WEEKDAY;if( skippos<8) skippos++;}
+ | WE { skiplist[skippos]=ICAL_WEDNESDAY_WEEKDAY;if( skippos<8) skippos++;}
+ | TH { skiplist[skippos]=ICAL_THURSDAY_WEEKDAY;if( skippos<8) skippos++;}
+ | FR { skiplist[skippos]=ICAL_FRIDAY_WEEKDAY;if( skippos<8) skippos++;}
+ | SA { skiplist[skippos]=ICAL_SATURDAY_WEEKDAY;if( skippos<8) skippos++;}
+ ;
+
+
+weekday_list:
+ weekday
+ | DIGITS weekday { } /* HACK Incorectly handles int in BYDAY */
+ | weekday_list COMMA weekday
+
+
+recur_list:
+ DIGITS { skiplist[skippos] = atoi($1); skippos++;}
+ | recur_list COMMA DIGITS { skiplist[skippos] = atoi($3); if (skippos<367) skippos++;}
+ ;
+
+recur_skip:
+ INTERVAL EQUALS DIGITS {recur.interval = atoi($3);}
+ | WKST EQUALS SU {recur.week_start = ICAL_SUNDAY_WEEKDAY;}
+ | WKST EQUALS MO {recur.week_start = ICAL_MONDAY_WEEKDAY;}
+ | WKST EQUALS TU {recur.week_start = ICAL_TUESDAY_WEEKDAY;}
+ | WKST EQUALS WE {recur.week_start = ICAL_WEDNESDAY_WEEKDAY;}
+ | WKST EQUALS TH {recur.week_start = ICAL_THURSDAY_WEEKDAY;}
+ | WKST EQUALS FR {recur.week_start = ICAL_FRIDAY_WEEKDAY;}
+ | WKST EQUALS SA {recur.week_start = ICAL_SATURDAY_WEEKDAY;}
+ | BYSECOND EQUALS recur_list{copy_list(recur.by_second,60);}
+ | BYMINUTE EQUALS recur_list{copy_list(recur.by_minute,60);}
+ | BYHOUR EQUALS recur_list{copy_list(recur.by_hour,24);}
+ | BYDAY EQUALS weekday_list{copy_list(recur.by_day,7);}
+ | BYMONTH EQUALS recur_list{copy_list(recur.by_month,12);}
+ | BYMONTHDAY EQUALS recur_list{copy_list(recur.by_month_day,31);}
+ | BYYEARDAY EQUALS recur_list{copy_list(recur.by_year_day,366);}
+ | BYWEEKNO EQUALS recur_list{copy_list(recur.by_week_no,53);}
+ | BYSETPOS EQUALS recur_list{copy_list(recur.by_set_pos,366);}
+ | UNTIL EQUALS datetime_value
+ { recur.until = icalvalue_get_datetime(icalparser_yy_value);
+ icalvalue_free(icalparser_yy_value); icalparser_yy_value=0;}
+ | UNTIL EQUALS date_value
+ { recur.until = icalvalue_get_date(icalparser_yy_value);
+ icalvalue_free(icalparser_yy_value); icalparser_yy_value=0;}
+ | COUNT EQUALS DIGITS
+ { recur.count = atoi($3); }
+ ;
+
+recur_skip_list:
+ /* empty */
+ | recur_skip_list SEMICOLON recur_skip
+
+recur_value:
+ recur_start recur_skip_list
+ { icalparser_yy_value = icalvalue_new_recur(recur); }
+
+
+
+/* UTC Offset */
+
+plusminus: '+' { utcsign = 1; }
+ | '-' { utcsign = -1; }
+
+utcoffset_value:
+ plusminus INTNUMBER INTNUMBER
+ {
+ icalparser_yy_value = icalvalue_new_utcoffset( utcsign * ($2*3600) + ($3*60) );
+ }
+
+ | plusminus INTNUMBER INTNUMBER INTNUMBER
+ {
+ icalparser_yy_value = icalvalue_new_utcoffset(utcsign * ($2*3600) + ($3*60) +($4));
+ }
+
+
+
+%%
+
+
+void clear_recur()
+{
+ memset(&skiplist, ICAL_RECURRENCE_ARRAY_MAX_BYTE, sizeof(skiplist));
+ skippos = 0;
+
+ icalrecurrencetype_clear(&recur);
+}
+
+void copy_list(short* array, size_t size)
+{
+ memcpy(array, skiplist, size*sizeof(short));
+ memset(&skiplist,ICAL_RECURRENCE_ARRAY_MAX_BYTE, sizeof(skiplist));
+ skippos = 0;
+}
+
+struct icaltimetype fill_datetime(char* datestr, char* timestr)
+{
+ struct icaltimetype stm;
+
+ memset(&stm,0,sizeof(stm));
+
+ if (datestr != 0){
+ sscanf(datestr,"%4d%2d%2d",&(stm.year), &(stm.month),
+ &(stm.day));
+ }
+
+ if (timestr != 0){
+ sscanf(timestr,"%2d%2d%2d", &(stm.hour), &(stm.minute),
+ &(stm.second));
+ }
+
+ return stm;
+
+}
+
+void yyerror(char* s)
+{
+ /*fprintf(stderr,"Parse error \'%s\'\n", s);*/
+}
+
diff --git a/libical/src/libical/icallexer.l b/libical/src/libical/icallexer.l
new file mode 100644
index 0000000000..7f3358e079
--- /dev/null
+++ b/libical/src/libical/icallexer.l
@@ -0,0 +1,282 @@
+%{
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: icallexer.l
+ CREATOR: eric 10 June 1999
+
+ DESCRIPTION:
+
+ $Id: icallexer.l,v 1.3 2000/05/15 06:18:17 ericb Exp $
+ $Locker: $
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The original author is Eric Busboom
+ The original code is icalitip.y
+
+
+
+ ======================================================================*/
+#include "icalyacc.h"
+#include "icalparser.h"
+#include "icalenums.h"
+#include "icalmemory.h"
+#include "assert.h"
+
+#include <string.h> /* For strdup() */
+
+int icalparser_flex_input(char* buf, int max_size);
+void icalparser_clear_flex_input();
+
+
+#define ICAL_MAX_STR_CONST 1024
+
+#undef YY_INPUT
+#define YY_INPUT(b,r,ms) ( r= icalparser_flex_input(b,ms))
+#undef yywrap
+
+#undef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yyerror(msg)
+
+icalvalue_kind value_kind=ICAL_NO_VALUE;
+void set_parser_value_state();
+extern int yydebug;
+
+void yyerror(char *s);
+
+void init_str_buf();
+
+int last_state;
+
+char *str_buf;
+char *str_buf_p;
+size_t buf_sz; /* = ICAL_MAX_STR_CONST;*/
+
+
+%}
+
+crlf \x0D?\x0A
+space [ ]
+qsafechar [^\x00-\x1F\"]
+safechar [^\x00-\x1F\"\:\;\,]
+tsafechar [\x20-\x21\x23-\x2B\x2D-\x39\x3C-\x5B\x5D-\x7E]
+valuechar [^\x00-\x08\x10-\x1F]
+xname X-[a-zA-Z0-9\-]+
+xname2 [a-zA-Z0-9\-\ ]
+paramtext {safechar}+
+value {valuechar}+
+quotedstring \"{qsafechar}+\"
+digit [0-9]
+
+%array /* Make yytext an array. Slow, but handy. HACK */
+
+%option caseless
+
+%s quoted_string
+%s binary_value boolean_value uri_value time_value duration_value number_value period_value recur_value text_value utcoffset_value
+%s enum_param_value string_param_value stringlist_param_value keyword line_start component seperator parameter end_of_value paramtext
+
+
+
+%%
+
+%{
+%}
+
+
+<binary_value>{
+.* { yylval.v_string= icalmemory_tmp_copy(yytext);
+ return STRING;}
+{crlf} { return EOL;}
+
+}
+
+<boolean_value>{
+. { return CHARACTER; }
+{crlf} { return EOL;}
+
+}
+
+<uri_value>{
+.* { yylval.v_string= icalmemory_tmp_copy(yytext);
+ return STRING;}
+{crlf} { return EOL;}
+
+}
+
+
+<time_value>{
+{digit}* { yylval.v_string= icalmemory_tmp_copy(yytext);
+ return DIGITS; }
+T { return TIME_CHAR; }
+Z { return UTC_CHAR; }
+{crlf} { return EOL;}
+}
+
+<duration_value>{
+{digit}+ { yylval.v_string =icalmemory_tmp_copy(yytext);
+ return DIGITS; }
+T { return TIME_CHAR; }
+[\+\-PTWHMSD] { return yytext[0]; }
+{crlf} { return EOL;}
+
+}
+
+<number_value>{
+[\+\-\.0-9]+ { yylval.v_int=atoi(yytext); return INTNUMBER; }
+{crlf} { return EOL;}
+}
+
+<period_value>{
+{digit}+ { yylval.v_string =icalmemory_tmp_copy(yytext) ;
+ return DIGITS; }
+T { return TIME_CHAR; }
+Z { return UTC_CHAR; }
+[\/\+\-PWHMSD] { return yytext[0]; }
+{crlf} { return EOL;}
+
+}
+
+<recur_value>{
+INTERVAL { return INTERVAL; }
+COUNT { return COUNT; }
+UNTIL { return UNTIL; }
+FREQ { return FREQ; }
+BYDAY { return BYDAY; }
+BYHOUR { return BYHOUR; }
+BYMINUTE { return BYMINUTE; }
+BYMONTH { return BYMONTH; }
+BYMONTHDAY { return BYMONTHDAY; }
+BYSECOND { return BYSECOND; }
+BYSETPOS { return BYSETPOS; }
+BYWEEKNO { return BYWEEKNO; }
+BYYEARDAY { return BYYEARDAY; }
+DAILY { return DAILY; }
+SECONDLY { return SECONDLY; }
+MINUTELY { return MINUTELY; }
+HOURLY { return HOURLY; }
+MONTHLY { return MONTHLY; }
+WEEKLY { return WEEKLY; }
+YEARLY { return YEARLY; }
+WKST { return WKST; }
+MO { return MO; }
+SA { return SA; }
+SU { return SU; }
+TU { return TU; }
+WE { return WE; }
+TH { return TH; }
+FR { return FR; }
+= { return EQUALS; }
+, { return COMMA; }
+; { return SEMICOLON; }
+[\-\+0-9]+ { yylval.v_string= icalmemory_tmp_copy(yytext);
+ return DIGITS; }
+T { return TIME_CHAR; }
+Z { return UTC_CHAR; }
+{crlf} { return EOL;}
+}
+
+<utcoffset_value>{
+{crlf} { return EOL;}
+\-|\+ { return yytext[0]; }
+{digit}{digit} { yylval.v_int=atoi(yytext); return INTNUMBER; }
+
+}
+
+<enum_param_value>{
+. { return CHARACTER; }
+{crlf} { return EOL;}
+
+}
+
+<seperator>{
+, { BEGIN(last_state); return COMMA; }
+}
+
+
+%%
+
+int yywrap()
+{
+ return 1;
+}
+
+
+void set_parser_value_state(icalvalue_kind kind)
+{
+
+ switch (kind){
+
+ case ICAL_ATTACH_VALUE:
+ case ICAL_BINARY_VALUE:
+ {BEGIN(binary_value);break;}
+
+ case ICAL_BOOLEAN_VALUE:
+ case ICAL_INTEGER_VALUE:
+ case ICAL_FLOAT_VALUE:
+ {BEGIN(number_value);break;}
+
+ case ICAL_UTCOFFSET_VALUE:
+ {BEGIN(utcoffset_value);break;}
+
+ case ICAL_TEXT_VALUE:
+ {BEGIN(text_value);
+ init_str_buf();
+ break;}
+
+ case ICAL_CALADDRESS_VALUE:
+ case ICAL_URI_VALUE:
+ {BEGIN(uri_value);break;}
+
+ case ICAL_DATE_VALUE:
+ case ICAL_DATETIME_VALUE:
+ case ICAL_DATETIMEDATE_VALUE:
+ case ICAL_DATETIMEPERIOD_VALUE:
+ case ICAL_TIME_VALUE:
+ {BEGIN(time_value);break;}
+
+ case ICAL_DURATION_VALUE:
+ {BEGIN(duration_value);break;}
+
+ case ICAL_PERIOD_VALUE:
+ {BEGIN(period_value);break;}
+
+ case ICAL_GEO_VALUE:
+ case ICAL_QUERY_VALUE:
+ {BEGIN(text_value);break;}
+
+ case ICAL_RECUR_VALUE:
+ {BEGIN(recur_value);break;}
+
+ case ICAL_NO_VALUE:
+ {
+ /* The value is probably actually a component name */
+ {BEGIN(component); break;}
+ }
+ default:
+ {
+ assert(1==0);
+ }
+ }
+}
+
+void init_str_buf()
+{
+ str_buf = icalmemory_tmp_buffer(ICAL_MAX_STR_CONST);
+ str_buf_p = str_buf;
+ buf_sz = ICAL_MAX_STR_CONST;
+
+
+}
+
diff --git a/libical/src/libical/icalmemory.c b/libical/src/libical/icalmemory.c
new file mode 100644
index 0000000000..e89451fbce
--- /dev/null
+++ b/libical/src/libical/icalmemory.c
@@ -0,0 +1,244 @@
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: icalmemory.c
+ CREATOR: eric 30 June 1999
+
+ $Id$
+ $Locker$
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The Original Code is icalmemory.h
+ The Initial Developer of the Original Code is Eric Busboom
+
+ (C) COPYRIGHT 1999 The Software Studio.
+ http://www.softwarestudio.org
+
+ ======================================================================*/
+
+/* libical often passes strings back to the caller. To make these
+ * interfaces simple, I did not want the caller to have to pass in a
+ * memory buffer, but having libical pass out newly allocated memory
+ * makes it difficult to de-allocate the memory.
+ *
+ * The ring buffer in this scheme makes it possible for libical to pass
+ * out references to memory which the caller does not own, and be able
+ * to de-allocate the memory later. The ring allows libical to have
+ * several buffers active simultaneously, which is handy when creating
+ * string representations of components. */
+
+#define ICALMEMORY_C
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+
+#include "icalmemory.h"
+#include "icalerror.h"
+
+#include <stdio.h> /* for printf (debugging) */
+#include <stdlib.h> /* for malloc, realloc */
+#include <string.h> /* for memset() */
+
+#define BUFFER_RING_SIZE 25
+#define MIN_BUFFER_SIZE 200
+
+void* buffer_ring[BUFFER_RING_SIZE+1];
+int buffer_pos = 0;
+int initialized = 0;
+
+/* Create a new temporary buffer on the ring. Libical owns these and wil deallocate them. */
+void*
+icalmemory_tmp_buffer (size_t size)
+{
+ void *rtrn;
+ /* I don't think I need this -- I think static arrays are
+ initialized to 0 as a standard part of C, but I am not sure. */
+
+ if (initialized == 0){
+ int i;
+ for(i=0; i<BUFFER_RING_SIZE; i++){
+ buffer_ring[i] = 0;
+ }
+ initialized = 1;
+ }
+
+ /* Ideally, this routine would re-use an existing buffer if it is
+ larger than the requested buffer. Maybe later.... */
+
+ if (size < MIN_BUFFER_SIZE){
+ size = MIN_BUFFER_SIZE;
+ }
+
+ if ( buffer_ring[buffer_pos] != 0){
+ /*sprintf(buffer_ring[buffer_pos], "***DEALLOCATED MEMORY***: %d",buffer_pos);*/
+ free( buffer_ring[buffer_pos]);
+ buffer_ring[buffer_pos] = 0;
+ }
+
+
+ rtrn = buffer_ring[buffer_pos] = (void*)malloc(size);
+
+ memset(rtrn,0,size);
+
+ if(++buffer_pos > BUFFER_RING_SIZE){
+ buffer_pos = 0;
+ }
+
+ return rtrn;
+}
+
+void icalmemory_free_ring()
+{
+
+ int i;
+ for(i=0; i<BUFFER_RING_SIZE; i++){
+ if ( buffer_ring[i] != 0){
+ free( buffer_ring[i]);
+ }
+ buffer_ring[i] = 0;
+ }
+
+ initialized = 1;
+
+}
+
+/* Like strdup, but the buffer is on the ring. */
+char*
+icalmemory_tmp_copy(char* str)
+{
+ char* b = icalmemory_tmp_buffer(strlen(str)+1);
+
+ strcpy(b,str);
+
+ return b;
+}
+
+
+
+void
+icalmemory_free_tmp_buffer (void* buf)
+{
+ if(buf == 0)
+ {
+ return;
+ }
+
+ free(buf);
+}
+
+
+/* These buffer routines create memory the old fashioned way -- so the caller will have to delocate the new memory */
+
+void* icalmemory_new_buffer(size_t size)
+{
+ /* HACK. need to handle out of memory case */
+ void *b = malloc(size);
+
+ memset(b,0,size);
+
+ return b;
+}
+
+void* icalmemory_resize_buffer(void* buf, size_t size)
+{
+ /* HACK. need to handle out of memory case */
+
+ return realloc(buf, size);
+}
+
+void icalmemory_free_buffer(void* buf)
+{
+ free(buf);
+}
+
+void
+icalmemory_append_string(char** buf, char** pos, size_t* buf_size,
+ char* string)
+{
+ char *new_buf;
+ char *new_pos;
+
+ size_t data_length, final_length, string_length;
+
+#ifndef ICAL_NO_INTERNAL_DEBUG
+ icalerror_check_arg_rv( (buf!=0),"buf");
+ icalerror_check_arg_rv( (*buf!=0),"*buf");
+ icalerror_check_arg_rv( (pos!=0),"pos");
+ icalerror_check_arg_rv( (*pos!=0),"*pos");
+ icalerror_check_arg_rv( (buf_size!=0),"buf_size");
+ icalerror_check_arg_rv( (*buf_size!=0),"*buf_size");
+ icalerror_check_arg_rv( (string!=0),"string");
+#endif
+
+ string_length = strlen(string);
+ data_length = (size_t)*pos - (size_t)*buf;
+ final_length = data_length + string_length;
+
+ if ( final_length > (size_t) *buf_size ) {
+
+
+ *buf_size = (*buf_size) * 2 + final_length;
+
+ new_buf = realloc(*buf,*buf_size);
+
+ new_pos = (void*)((size_t)new_buf + data_length);
+
+ *pos = new_pos;
+ *buf = new_buf;
+ }
+
+ strcpy(*pos, string);
+
+ *pos += string_length;
+}
+
+
+void
+icalmemory_append_char(char** buf, char** pos, size_t* buf_size,
+ char ch)
+{
+ char *new_buf;
+ char *new_pos;
+
+ size_t data_length, final_length;
+
+#ifndef ICAL_NO_INTERNAL_DEBUG
+ icalerror_check_arg_rv( (buf!=0),"buf");
+ icalerror_check_arg_rv( (*buf!=0),"*buf");
+ icalerror_check_arg_rv( (pos!=0),"pos");
+ icalerror_check_arg_rv( (*pos!=0),"*pos");
+ icalerror_check_arg_rv( (buf_size!=0),"buf_size");
+ icalerror_check_arg_rv( (*buf_size!=0),"*buf_size");
+#endif
+
+ data_length = (size_t)*pos - (size_t)*buf;
+
+ final_length = data_length + 2;
+
+ if ( final_length > (size_t) *buf_size ) {
+
+
+ *buf_size = (*buf_size) * 2 + final_length +1;
+
+ new_buf = realloc(*buf,*buf_size);
+
+ new_pos = (void*)((size_t)new_buf + data_length);
+
+ *pos = new_pos;
+ *buf = new_buf;
+ }
+
+ **pos = ch;
+ *pos += 1;
+
+}
diff --git a/libical/src/libical/icalmemory.h b/libical/src/libical/icalmemory.h
new file mode 100644
index 0000000000..26d22b7316
--- /dev/null
+++ b/libical/src/libical/icalmemory.h
@@ -0,0 +1,76 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalmemory.h
+ CREATOR: eric 30 June 1999
+
+
+ $Id$
+ $Locker$
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The Original Code is icalmemory.h
+ The Initial Developer of the Original Code is Eric Busboom
+
+ (C) COPYRIGHT 1999 The Software Studio.
+ http://www.softwarestudio.org
+
+======================================================================*/
+
+#ifndef ICALMEMORY_H
+#define ICALMEMORY_H
+
+#include <sys/types.h> /* for size_t */
+
+/* Tmp buffers are managed by ical. References can be returned to the caller, although the caller will not own the memory. */
+
+void* icalmemory_tmp_buffer(size_t size);
+char* icalmemory_tmp_copy(char* str);
+
+/* Add an externally allocated buffer to the ring. */
+void icalmemory_add_tmp_buffer(void*);
+
+
+/* Free all memory used in the ring */
+void icalmemory_free_ring();
+
+/* Non-tmp buffers must be freed. These are mostly wrappers around
+ * malloc, etc, but are used so the caller can change the memory
+ * allocators in a future version of the library */
+
+void* icalmemory_new_buffer(size_t size);
+void* icalmemory_resize_buffer(void* buf, size_t size);
+void icalmemory_free_buffer(void* buf);
+
+/* icalmemory_append_string will copy the string 'string' to the
+ buffer 'buf' starting at position 'pos', reallocing 'buf' if it is
+ too small. 'buf_size' is the size of 'buf' and will be changed if
+ 'buf' is reallocated. 'pos' will point to the last byte of the new
+ string in 'buf', usually a '\0' */
+
+/* THESE ROUTINES CAN NOT BE USED ON TMP BUFFERS. Only use them on
+ normally allocated memory, or on buffers created from
+ icalmemory_new_buffer, never with buffers created by
+ icalmemory_tmp_buffer. If icalmemory_append_string has to resize a
+ buffer on the ring, the ring will loose track of it an you will
+ have memory problems. */
+
+void icalmemory_append_string(char** buf, char** pos, size_t* buf_size,
+ char* string);
+
+/* icalmemory_append_char is similar, but is appends a character instead of a string */
+void icalmemory_append_char(char** buf, char** pos, size_t* buf_size,
+ char ch);
+
+#endif /* !ICALMEMORY_H */
+
+
+
diff --git a/libical/src/libical/icalparameter.c b/libical/src/libical/icalparameter.c
new file mode 100644
index 0000000000..cf37eb07b2
--- /dev/null
+++ b/libical/src/libical/icalparameter.c
@@ -0,0 +1,1913 @@
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: icalderivedparameters.{c,h}
+ CREATOR: eric 09 May 1999
+
+ $Id$
+ $Locker$
+
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The original author is Eric Busboom
+ The original code is icalderivedparameters.{c,h}
+
+ Contributions from:
+ Graham Davison (g.m.davison@computer.org)
+
+ ======================================================================*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "ical.h"
+#include "icalerror.h"
+#include <stdlib.h> /* for malloc() */
+#include <errno.h>
+#include <string.h> /* for memset() */
+#include "icalmemory.h"
+
+struct icalparameter_impl
+{
+ icalparameter_kind kind;
+ char id[5];
+ int size;
+ char* string;
+ char* x_name;
+ icalproperty* parent;
+
+ union data {
+ int v_int;
+ int v_rsvp;
+ icalparameter_cutype v_cutype;
+ icalparameter_encoding v_encoding;
+ icalparameter_fbtype v_fbtype;
+ icalparameter_partstat v_partstat;
+ icalparameter_range v_range;
+ icalparameter_related v_related;
+ icalparameter_reltype v_reltype;
+ icalparameter_role v_role;
+ icalparameter_value v_value;
+ icalparameter_xlicerrortype v_xlicerrortype;
+ icalparameter_xliccomparetype v_xliccomparetype;
+ } data;
+};
+
+struct icalparameter_impl* icalparameter_new_impl(icalparameter_kind kind)
+{
+ struct icalparameter_impl* v;
+
+ if ( ( v = (struct icalparameter_impl*)
+ malloc(sizeof(struct icalparameter_impl))) == 0) {
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return 0;
+ }
+
+ strcpy(v->id,"para");
+
+ v->kind = kind;
+ v->size = 0;
+ v->string = 0;
+ v->x_name = 0;
+ v->parent = 0;
+ memset(&(v->data),0,sizeof(v->data));
+
+ return v;
+}
+
+icalparameter*
+icalparameter_new (icalparameter_kind kind)
+{
+ struct icalparameter_impl* v = icalparameter_new_impl(kind);
+
+ return (icalparameter*) v;
+
+}
+
+icalparameter*
+icalparameter_new_clone(icalparameter* param)
+{
+ struct icalparameter_impl *old;
+ struct icalparameter_impl *new;
+
+ old = (struct icalparameter_impl *)param;
+ new = icalparameter_new_impl(old->kind);
+
+ icalerror_check_arg_rz((param!=0),"param");
+
+ if (new == 0){
+ return 0;
+ }
+
+ memcpy(new,old,sizeof(struct icalparameter_impl));
+
+ if (old->string != 0){
+ new->string = strdup(old->string);
+ if (new->string == 0){
+ icalparameter_free(new);
+ return 0;
+ }
+ }
+
+ if (old->x_name != 0){
+ new->x_name = strdup(old->x_name);
+ if (new->x_name == 0){
+ icalparameter_free(new);
+ return 0;
+ }
+ }
+
+ return new;
+}
+
+
+icalparameter* icalparameter_new_from_string(icalparameter_kind kind, char* val)
+{
+
+ icalparameter* param=0;
+
+ icalerror_check_arg_rz((val!=0),"val");
+
+ switch (kind) {
+ case ICAL_ALTREP_PARAMETER:
+ {
+ param = icalparameter_new_altrep(val);
+
+ break;
+ }
+ case ICAL_CN_PARAMETER:
+ {
+ param = icalparameter_new_cn(val);
+
+ break;
+ }
+ case ICAL_CUTYPE_PARAMETER:
+ {
+ if(strcmp(val,"INDIVIDUAL") == 0){
+ param = icalparameter_new_cutype(ICAL_CUTYPE_INDIVIDUAL);
+ }
+ else if(strcmp(val,"GROUP") == 0){
+ param = icalparameter_new_cutype(ICAL_CUTYPE_GROUP);
+ }
+ else if(strcmp(val,"RESOURCE") == 0){
+ param = icalparameter_new_cutype(ICAL_CUTYPE_RESOURCE);
+ }
+ else if(strcmp(val,"ROOM") == 0){
+ param = icalparameter_new_cutype(ICAL_CUTYPE_ROOM);
+ }
+ else if(strcmp(val,"UNKNOWN") == 0){
+ param = icalparameter_new_cutype(ICAL_CUTYPE_UNKNOWN);
+ }
+ else {
+ param = icalparameter_new_cutype(ICAL_CUTYPE_XNAME);
+ icalparameter_set_xvalue(param,val);
+ }
+ break;
+ }
+
+ case ICAL_DELEGATEDFROM_PARAMETER:
+ {
+ param = icalparameter_new_delegatedfrom(val);
+
+ break;
+ }
+ case ICAL_DELEGATEDTO_PARAMETER:
+ {
+ param = icalparameter_new_delegatedto(val);
+
+ break;
+ }
+ case ICAL_DIR_PARAMETER:
+ {
+ param = icalparameter_new_dir(val);
+
+ break;
+ }
+ case ICAL_ENCODING_PARAMETER:
+ {
+ if(strcmp(val,"BIT8") == 0){
+ param = icalparameter_new_encoding(ICAL_ENCODING_8BIT);
+ }
+ else if(strcmp(val,"BASE64") == 0){
+ param = icalparameter_new_encoding(ICAL_ENCODING_BASE64);
+ }
+ else {
+ param = icalparameter_new_encoding(ICAL_ENCODING_XNAME);
+ icalparameter_set_xvalue(param,val);
+ }
+ break;
+ }
+ case ICAL_FBTYPE_PARAMETER:
+ {
+ if(strcmp(val,"FREE") == 0){
+ param = icalparameter_new_fbtype(ICAL_FBTYPE_FREE);
+ }
+ else if(strcmp(val,"BUSY") == 0){
+ param = icalparameter_new_fbtype(ICAL_FBTYPE_BUSY);
+ }
+ else if(strcmp(val,"BUSYUNAVAILABLE") == 0){
+ param = icalparameter_new_fbtype(ICAL_FBTYPE_BUSYUNAVAILABLE);
+ }
+ else if(strcmp(val,"BUSYTENTATIVE") == 0){
+ param = icalparameter_new_fbtype(ICAL_FBTYPE_BUSYTENTATIVE);
+ }
+ else {
+ param = icalparameter_new_fbtype(ICAL_FBTYPE_XNAME);
+ icalparameter_set_xvalue(param,val);
+ }
+ break;
+ }
+ case ICAL_FMTTYPE_PARAMETER:
+ {
+ param = icalparameter_new_fmttype(val);
+ break;
+ }
+ case ICAL_LANGUAGE_PARAMETER:
+ {
+ param = icalparameter_new_language(val);
+
+ break;
+ }
+ case ICAL_MEMBER_PARAMETER:
+ {
+ param = icalparameter_new_member(val);
+
+ break;
+ }
+ case ICAL_PARTSTAT_PARAMETER:
+ {
+ if(strcmp(val,"NEEDSACTION") == 0){
+ param = icalparameter_new_partstat(ICAL_PARTSTAT_NEEDSACTION);
+ }
+ else if(strcmp(val,"ACCEPTED") == 0){
+ param = icalparameter_new_partstat(ICAL_PARTSTAT_ACCEPTED);
+ }
+ else if(strcmp(val,"DECLINED") == 0){
+ param = icalparameter_new_partstat(ICAL_PARTSTAT_DECLINED);
+ }
+ else if(strcmp(val,"TENTATIVE") == 0){
+ param = icalparameter_new_partstat(ICAL_PARTSTAT_TENTATIVE);
+ }
+ else if(strcmp(val,"DELEGATED") == 0){
+ param = icalparameter_new_partstat(ICAL_PARTSTAT_DELEGATED);
+ }
+ else if(strcmp(val,"COMPLETED") == 0){
+ param = icalparameter_new_partstat(ICAL_PARTSTAT_COMPLETED);
+ }
+ else if(strcmp(val,"INPROCESS") == 0){
+ param = icalparameter_new_partstat(ICAL_PARTSTAT_INPROCESS);
+ }
+ else {
+ param = icalparameter_new_partstat(ICAL_PARTSTAT_XNAME);
+ icalparameter_set_xvalue(param,val);
+ }
+ break;
+ }
+ case ICAL_RANGE_PARAMETER:
+ {
+ if(strcmp(val,"THISANDFUTURE") == 0){
+ param = icalparameter_new_range(ICAL_RANGE_THISANDFUTURE);
+ }
+ else if(strcmp(val,"THISANDPRIOR") == 0){
+ param = icalparameter_new_range(ICAL_RANGE_THISANDPRIOR);
+ }
+
+ break;
+ }
+ case ICAL_RELATED_PARAMETER:
+ {
+ if(strcmp(val,"START") == 0){
+ param = icalparameter_new_related(ICAL_RELATED_START);
+ }
+ else if(strcmp(val,"END") == 0){
+ param = icalparameter_new_related(ICAL_RELATED_END);
+ }
+
+ break;
+ }
+ case ICAL_RELTYPE_PARAMETER:
+ {
+ if(strcmp(val,"PARENT") == 0){
+ param = icalparameter_new_reltype(ICAL_RELTYPE_PARENT);
+ }
+ else if(strcmp(val,"CHILD") == 0){
+ param = icalparameter_new_reltype(ICAL_RELTYPE_CHILD);
+ }
+ else if(strcmp(val,"SIBLING") == 0){
+ param = icalparameter_new_reltype(ICAL_RELTYPE_SIBLING);
+ }
+ else {
+ param = icalparameter_new_reltype(ICAL_RELTYPE_XNAME);
+ icalparameter_set_xvalue(param,val);
+ }
+ break;
+ }
+ case ICAL_ROLE_PARAMETER:
+ {
+ if(strcmp(val,"CHAIR") == 0){
+ param = icalparameter_new_role(ICAL_ROLE_CHAIR);
+ }
+ else if(strcmp(val,"REQ-PARTICIPANT") == 0){
+ param = icalparameter_new_role(ICAL_ROLE_REQPARTICIPANT);
+ }
+ else if(strcmp(val,"OPT-PARTICIPANT") == 0){
+ param = icalparameter_new_role(ICAL_ROLE_OPTPARTICIPANT);
+ }
+ else if(strcmp(val,"NON-PARTICIPANT") == 0){
+ param = icalparameter_new_role(ICAL_ROLE_NONPARTICIPANT);
+ }
+ else {
+ param = icalparameter_new_role(ICAL_ROLE_XNAME);
+ icalparameter_set_xvalue(param,val);
+ }
+ break;
+ }
+ case ICAL_RSVP_PARAMETER:
+ {
+ if(strcmp(val,"TRUE") == 0){
+ param = icalparameter_new_rsvp(1);
+ }
+ else if(strcmp(val,"FALSE") == 0){
+ param = icalparameter_new_rsvp(0);
+ }
+
+ break;
+ }
+ case ICAL_SENTBY_PARAMETER:
+ {
+ param = icalparameter_new_sentby(val);
+
+ break;
+ }
+ case ICAL_TZID_PARAMETER:
+ {
+ param = icalparameter_new_tzid(val);
+
+ break;
+ }
+ case ICAL_VALUE_PARAMETER:
+ {
+ if(strcmp(val,"BINARY") == 0){
+ param = icalparameter_new_value(ICAL_VALUE_BINARY);
+ }
+ else if(strcmp(val,"BOOLEAN") == 0){
+ param = icalparameter_new_value(ICAL_VALUE_BOOLEAN);
+ }
+ else if(strcmp(val,"CAL-ADDRESS") == 0){
+ param = icalparameter_new_value(ICAL_VALUE_CALADDRESS);
+ }
+ else if(strcmp(val,"DATE") == 0){
+ param = icalparameter_new_value(ICAL_VALUE_DATE);
+ }
+ else if(strcmp(val,"DATE-TIME") == 0){
+ param = icalparameter_new_value(ICAL_VALUE_DATETIME);
+ }
+ else if(strcmp(val,"DURATION") == 0){
+ param = icalparameter_new_value(ICAL_VALUE_DURATION);
+ }
+ else if(strcmp(val,"FLOAT") == 0){
+ param = icalparameter_new_value(ICAL_VALUE_FLOAT);
+ }
+ else if(strcmp(val,"INTEGER") == 0){
+ param = icalparameter_new_value(ICAL_VALUE_INTEGER);
+ }
+ else if(strcmp(val,"PERIOD") == 0){
+ param = icalparameter_new_value(ICAL_VALUE_PERIOD);
+ }
+ else if(strcmp(val,"RECUR") == 0){
+ param = icalparameter_new_value(ICAL_VALUE_RECUR);
+ }
+ else if(strcmp(val,"TEXT") == 0){
+ param = icalparameter_new_value(ICAL_VALUE_TEXT);
+ }
+ else if(strcmp(val,"TIME") == 0){
+ param = icalparameter_new_value(ICAL_VALUE_TIME);
+ }
+ else if(strcmp(val,"URI") == 0){
+ param = icalparameter_new_value(ICAL_VALUE_URI);
+ }
+ else if(strcmp(val,"UTC-OFFSET") == 0){
+ param = icalparameter_new_value(ICAL_VALUE_UTCOFFSET);
+ }
+ else {
+ param = 0;
+ }
+ break;
+ }
+ case ICAL_XLICERRORTYPE_PARAMETER:
+ {
+
+ if(strcmp(val,"COMPONENT_PARSE_ERROR") == 0){
+ param = icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_COMPONENTPARSEERROR);
+ }
+ else if(strcmp(val,"PROPERTY_PARSE_ERROR") == 0){
+ param = icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_PROPERTYPARSEERROR);
+ }
+ else if(strcmp(val,"PARAMETER_NAME_PARSE_ERROR") == 0){
+ param = icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_PARAMETERNAMEPARSEERROR);
+ }
+ else if(strcmp(val,"PARAMETER_VALUE_PARSE_ERROR") == 0){
+ param = icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_PARAMETERVALUEPARSEERROR);
+ }
+ else if(strcmp(val,"VALUE_PARSE_ERROR") == 0){
+ param = icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_VALUEPARSEERROR);
+ }
+ else if(strcmp(val,"INVALID_ITIP") == 0){
+ param = icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_INVALIDITIP);
+ }
+ break;
+ }
+
+ case ICAL_XLICCOMPARETYPE_PARAMETER:
+ {
+
+ if(strcmp(val,"EQUAL") == 0){
+ param = icalparameter_new_xliccomparetype(ICAL_XLICCOMPARETYPE_EQUAL);
+ }
+ else if(strcmp(val,"NOTEQUAL") == 0){
+ param = icalparameter_new_xliccomparetype(ICAL_XLICCOMPARETYPE_NOTEQUAL);
+ }
+ else if(strcmp(val,"LESS") == 0){
+ param = icalparameter_new_xliccomparetype(ICAL_XLICCOMPARETYPE_LESS);
+ }
+ else if(strcmp(val,"GREATER") == 0){
+ param = icalparameter_new_xliccomparetype(ICAL_XLICCOMPARETYPE_GREATER);
+ }
+ else if(strcmp(val,"LESSEQUAL") == 0){
+ param = icalparameter_new_xliccomparetype(ICAL_XLICCOMPARETYPE_LESSEQUAL);
+ }
+ else if(strcmp(val,"GREATEREQUAL") == 0){
+ param = icalparameter_new_xliccomparetype(ICAL_XLICCOMPARETYPE_GREATEREQUAL);
+ }
+ else if(strcmp(val,"REGEX") == 0){
+ param = icalparameter_new_xliccomparetype(ICAL_XLICCOMPARETYPE_REGEX);
+ } else {
+ param = 0;
+ }
+ break;
+ }
+
+
+ case ICAL_X_PARAMETER:
+ {
+ param = icalparameter_new(ICAL_FBTYPE_PARAMETER);
+ icalparameter_set_xvalue(param,val);
+ break;
+ }
+
+ case ICAL_NO_PARAMETER:
+ default:
+ {
+ return 0;
+ }
+
+
+ }
+
+ return param;
+}
+
+void
+icalparameter_free (icalparameter* parameter)
+{
+ struct icalparameter_impl * impl;
+
+ impl = (struct icalparameter_impl*)parameter;
+
+/* HACK. This always triggers, even when parameter is non-zero
+ icalerror_check_arg_rv((parameter==0),"parameter");*/
+
+
+#ifdef ICAL_FREE_ON_LIST_IS_ERROR
+ icalerror_assert( (impl->parent ==0),"Tried to free a parameter that is still attached to a component. ");
+
+#else
+ if(impl->parent !=0){
+ return;
+ }
+#endif
+
+
+ if (impl->string != 0){
+ free (impl->string);
+ }
+
+ if (impl->x_name != 0){
+ free (impl->x_name);
+ }
+
+ memset(impl,0,sizeof(impl));
+
+ impl->parent = 0;
+ impl->id[0] = 'X';
+ free(impl);
+}
+
+
+char no_parameter[]="Error: No Parameter";
+char*
+icalparameter_as_ical_string (icalparameter* parameter)
+{
+ struct icalparameter_impl* impl;
+ size_t buf_size = 1024;
+ char* buf;
+ char* buf_ptr;
+ char *out_buf;
+ char *kind_string;
+
+ char tend[1024]; /* HACK . Should be using memory buffer ring */
+
+ icalerror_check_arg_rz( (parameter!=0), "parameter");
+
+ /* Create new buffer that we can append names, parameters and a
+ value to, and reallocate as needed. Later, this buffer will be
+ copied to a icalmemory_tmp_buffer, which is managed internally
+ by libical, so it can be given to the caller without fear of
+ the caller forgetting to free it */
+
+ buf = icalmemory_new_buffer(buf_size);
+ buf_ptr = buf;
+ impl = (struct icalparameter_impl*)parameter;
+
+ kind_string = icalenum_parameter_kind_to_string(impl->kind);
+
+ if (impl->kind == ICAL_NO_PARAMETER ||
+ impl->kind == ICAL_ANY_PARAMETER ||
+ kind_string == 0)
+ {
+ icalerror_set_errno(ICAL_BADARG_ERROR);
+ return 0;
+ }
+
+ /* Put the parameter name into the string */
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, kind_string);
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, "=");
+
+ switch (impl->kind) {
+ case ICAL_CUTYPE_PARAMETER:
+ {
+ switch (impl->data.v_cutype) {
+ case ICAL_CUTYPE_INDIVIDUAL: {
+ strcpy(tend,"INDIVIDUAL");break;
+ }
+ case ICAL_CUTYPE_GROUP:{
+ strcpy(tend,"GROUP");break;
+ }
+ case ICAL_CUTYPE_RESOURCE: {
+ strcpy(tend,"RESOURCE");break;
+ }
+ case ICAL_CUTYPE_ROOM:{
+ strcpy(tend,"ROOM");break;
+ }
+ case ICAL_CUTYPE_UNKNOWN:{
+ strcpy(tend,"UNKNOWN");break;
+ }
+ case ICAL_CUTYPE_XNAME:{
+ if (impl->string == 0){ return no_parameter;}
+ strcpy(tend,impl->string);break;
+ }
+ default:{
+ icalerror_set_errno(ICAL_BADARG_ERROR);break;
+ }
+ }
+ break;
+
+ }
+ case ICAL_ENCODING_PARAMETER:
+ {
+ switch (impl->data.v_encoding) {
+ case ICAL_ENCODING_8BIT: {
+ strcpy(tend,"8BIT");break;
+ }
+ case ICAL_ENCODING_BASE64:{
+ strcpy(tend,"BASE64");break;
+ }
+ default:{
+ icalerror_set_errno(ICAL_BADARG_ERROR);break;
+ }
+ }
+ break;
+ }
+
+ case ICAL_FBTYPE_PARAMETER:
+ {
+ switch (impl->data.v_fbtype) {
+ case ICAL_FBTYPE_FREE:{
+ strcpy(tend,"FREE");break;
+ }
+ case ICAL_FBTYPE_BUSY: {
+ strcpy(tend,"BUSY");break;
+ }
+ case ICAL_FBTYPE_BUSYUNAVAILABLE:{
+ strcpy(tend,"BUSYUNAVAILABLE");break;
+ }
+ case ICAL_FBTYPE_BUSYTENTATIVE:{
+ strcpy(tend,"BUSYTENTATIVE");break;
+ }
+ case ICAL_FBTYPE_XNAME:{
+ if (impl->string == 0){ return no_parameter;}
+ strcpy(tend,impl->string);break;
+ }
+ default:{
+ icalerror_set_errno(ICAL_BADARG_ERROR);break;
+ }
+ }
+ break;
+
+ }
+ case ICAL_PARTSTAT_PARAMETER:
+ {
+ switch (impl->data.v_partstat) {
+ case ICAL_PARTSTAT_NEEDSACTION: {
+ strcpy(tend,"NEEDSACTION");break;
+ }
+ case ICAL_PARTSTAT_ACCEPTED: {
+ strcpy(tend,"ACCEPTED");break;
+ }
+ case ICAL_PARTSTAT_DECLINED:{
+ strcpy(tend,"DECLINED");break;
+ }
+ case ICAL_PARTSTAT_TENTATIVE:{
+ strcpy(tend,"TENTATIVE");break;
+ }
+ case ICAL_PARTSTAT_DELEGATED:{
+ strcpy(tend,"DELEGATED");break;
+ }
+ case ICAL_PARTSTAT_COMPLETED:{
+ strcpy(tend,"COMPLETED");break;
+ }
+ case ICAL_PARTSTAT_INPROCESS:{
+ strcpy(tend,"INPROCESS");break;
+ }
+ case ICAL_PARTSTAT_XNAME:{
+ if (impl->string == 0){ return no_parameter;}
+ strcpy(tend,impl->string);break;
+ }
+ default:{
+ icalerror_set_errno(ICAL_BADARG_ERROR);break;
+ }
+ }
+ break;
+
+ }
+ case ICAL_RANGE_PARAMETER:
+ {
+ switch (impl->data.v_range) {
+ case ICAL_RANGE_THISANDPRIOR: {
+ strcpy(tend,"THISANDPRIOR");break;
+ }
+ case ICAL_RANGE_THISANDFUTURE: {
+ strcpy(tend,"THISANDFUTURE");break;
+ }
+ default:{
+ icalerror_set_errno(ICAL_BADARG_ERROR);break;
+ }
+ }
+ break;
+ }
+ case ICAL_RELATED_PARAMETER:
+ {
+ switch (impl->data.v_related) {
+ case ICAL_RELATED_START: {
+ strcpy(tend,"START");break;
+ }
+ case ICAL_RELATED_END: {
+ strcpy(tend,"END");break;
+ }
+ default:{
+ icalerror_set_errno(ICAL_BADARG_ERROR);break;
+ }
+ }
+ break;
+ }
+ case ICAL_RELTYPE_PARAMETER:
+ {
+ switch (impl->data.v_reltype) {
+ case ICAL_RELTYPE_PARENT: {
+ strcpy(tend,"PARENT");break;
+ }
+ case ICAL_RELTYPE_CHILD:{
+ strcpy(tend,"CHILD");break;
+ }
+ case ICAL_RELTYPE_SIBLING:{
+ strcpy(tend,"SIBLING");break;
+ }
+ case ICAL_RELTYPE_XNAME:{
+ if (impl->string == 0){ return no_parameter;}
+ strcpy(tend,impl->string);break;
+ }
+ default:{
+ icalerror_set_errno(ICAL_BADARG_ERROR);break;
+ }
+ }
+ break;
+ }
+ case ICAL_ROLE_PARAMETER:
+ {
+ switch (impl->data.v_role) {
+ case ICAL_ROLE_CHAIR: {
+ strcpy(tend,"CHAIR");break;
+ }
+ case ICAL_ROLE_REQPARTICIPANT: {
+ strcpy(tend,"REQ-PARTICIPANT");break;
+ }
+ case ICAL_ROLE_OPTPARTICIPANT: {
+ strcpy(tend,"OPT-PARTICIPANT");break;
+ }
+ case ICAL_ROLE_NONPARTICIPANT: {
+ strcpy(tend,"NON-PARTICIPANT");break;
+ }
+ case ICAL_ROLE_XNAME:{
+ if (impl->string == 0){ return no_parameter;}
+ strcpy(tend,impl->string);break;
+ }
+ default:{
+ icalerror_set_errno(ICAL_BADARG_ERROR);break;
+ }
+ }
+ break;
+ }
+ case ICAL_RSVP_PARAMETER:
+ {
+ switch (impl->data.v_rsvp) {
+ case 1: {
+ strcpy(tend,"TRUE");break;
+ }
+ case 0: {
+ strcpy(tend,"FALSE");break;
+ }
+ default:{
+ icalerror_set_errno(ICAL_BADARG_ERROR);break;
+ }
+ }
+ break;
+ }
+ case ICAL_VALUE_PARAMETER:
+ {
+ switch (impl->data.v_value) {
+ case ICAL_VALUE_BINARY: {
+ strcpy(tend,"BINARY");break;
+ }
+ case ICAL_VALUE_BOOLEAN: {
+ strcpy(tend,"BOOLEAN");break;
+ }
+ case ICAL_VALUE_CALADDRESS: {
+ strcpy(tend,"CAL-ADDRESS");break;
+ }
+ case ICAL_VALUE_DATE: {
+ strcpy(tend,"DATE");break;
+ }
+ case ICAL_VALUE_DATETIME: {
+ strcpy(tend,"DATE-TIME");break;
+ }
+ case ICAL_VALUE_DURATION: {
+ strcpy(tend,"DURATION");break;
+ }
+ case ICAL_VALUE_FLOAT: {
+ strcpy(tend,"FLOAT");break;
+ }
+ case ICAL_VALUE_INTEGER: {
+ strcpy(tend,"INTEGER");break;
+ }
+ case ICAL_VALUE_PERIOD: {
+ strcpy(tend,"PERIOD");break;
+ }
+ case ICAL_VALUE_RECUR: {
+ strcpy(tend,"RECUR");break;
+ }
+ case ICAL_VALUE_TEXT: {
+ strcpy(tend,"TEXT");break;
+ }
+ case ICAL_VALUE_TIME: {
+ strcpy(tend,"TIME");break;
+ }
+ case ICAL_VALUE_URI: {
+ strcpy(tend,"URI");break;
+ }
+ case ICAL_VALUE_UTCOFFSET: {
+ strcpy(tend,"UTC-OFFSET");break;
+ }
+ case ICAL_VALUE_XNAME: {
+ if (impl->string == 0){ return no_parameter;}
+ strcpy(tend,impl->string);break;
+ }
+ default:{
+ strcpy(tend,"ERROR");
+ icalerror_set_errno(ICAL_BADARG_ERROR);break;
+ }
+ }
+ break;
+ }
+
+
+ case ICAL_XLICERRORTYPE_PARAMETER:
+ {
+ switch (impl->data.v_xlicerrortype) {
+ case ICAL_XLICERRORTYPE_COMPONENTPARSEERROR:
+ {
+ strcpy(tend,"COMPONENT_PARSE_ERROR");break;
+ }
+ case ICAL_XLICERRORTYPE_PROPERTYPARSEERROR:
+ {
+ strcpy(tend,"PROPERTY_PARSE_ERROR");break;
+ }
+ case ICAL_XLICERRORTYPE_PARAMETERNAMEPARSEERROR:
+ {
+ strcpy(tend,"PARAMETER_NAME_PARSE_ERROR");break;
+ }
+ case ICAL_XLICERRORTYPE_PARAMETERVALUEPARSEERROR:
+ {
+ strcpy(tend,"PARAMETER_VALUE_PARSE_ERROR");break;
+ }
+ case ICAL_XLICERRORTYPE_VALUEPARSEERROR:
+ {
+ strcpy(tend,"VALUE_PARSE_ERROR");break;
+ }
+ case ICAL_XLICERRORTYPE_INVALIDITIP:
+ {
+ strcpy(tend,"INVALID_ITIP");break;
+ }
+ }
+ break;
+ }
+
+ case ICAL_XLICCOMPARETYPE_PARAMETER:
+ {
+ switch (impl->data.v_xliccomparetype) {
+ case ICAL_XLICCOMPARETYPE_EQUAL:
+ {
+ strcpy(tend,"EQUAL");break;
+ }
+ case ICAL_XLICCOMPARETYPE_NOTEQUAL:
+ {
+ strcpy(tend,"NOTEQUAL");break;
+ }
+ case ICAL_XLICCOMPARETYPE_LESS:
+ {
+ strcpy(tend,"LESS");break;
+ }
+ case ICAL_XLICCOMPARETYPE_GREATER:
+ {
+ strcpy(tend,"GREATER");break;
+ }
+ case ICAL_XLICCOMPARETYPE_LESSEQUAL:
+ {
+ strcpy(tend,"LESSEQUAL");break;
+ }
+ case ICAL_XLICCOMPARETYPE_GREATEREQUAL:
+ {
+ strcpy(tend,"GREATEREQUAL");break;
+ }
+ case ICAL_XLICCOMPARETYPE_REGEX:
+ {
+ strcpy(tend,"REGEX");break;
+ }
+ break;
+ }
+
+ default:{
+ icalerror_set_errno(ICAL_BADARG_ERROR);break;
+ }
+ break;
+ }
+
+
+ case ICAL_SENTBY_PARAMETER:
+ case ICAL_TZID_PARAMETER:
+ case ICAL_X_PARAMETER:
+ case ICAL_FMTTYPE_PARAMETER:
+ case ICAL_LANGUAGE_PARAMETER:
+ case ICAL_MEMBER_PARAMETER:
+ case ICAL_DELEGATEDFROM_PARAMETER:
+ case ICAL_DELEGATEDTO_PARAMETER:
+ case ICAL_DIR_PARAMETER:
+ case ICAL_ALTREP_PARAMETER:
+ case ICAL_CN_PARAMETER:
+ {
+ if (impl->string == 0){ return no_parameter;}
+ strcpy(tend,impl->string);break;
+ break;
+ }
+
+ case ICAL_NO_PARAMETER:
+ case ICAL_ANY_PARAMETER:
+ {
+ /* These are actually handled before the case/switch
+ clause */
+ }
+
+ }
+
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, tend);
+
+ /* Now, copy the buffer to a tmp_buffer, which is safe to give to
+ the caller without worring about de-allocating it. */
+
+
+ out_buf = icalmemory_tmp_buffer(strlen(buf));
+ strcpy(out_buf, buf);
+
+ icalmemory_free_buffer(buf);
+
+ return out_buf;
+
+}
+
+
+int
+icalparameter_is_valid (icalparameter* parameter);
+
+
+icalparameter_kind
+icalparameter_isa (icalparameter* parameter)
+{
+ if(parameter == 0){
+ return ICAL_NO_PARAMETER;
+ }
+
+ return ((struct icalparameter_impl *)parameter)->kind;
+}
+
+
+int
+icalparameter_isa_parameter (void* parameter)
+{
+ struct icalparameter_impl *impl = (struct icalparameter_impl *)parameter;
+
+ if (parameter == 0){
+ return 0;
+ }
+
+ if (strcmp(impl->id,"para") == 0) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+
+void
+icalparameter_set_xname (icalparameter* param, char* v)
+{
+ struct icalparameter_impl *impl = (struct icalparameter_impl*)param;
+ icalerror_check_arg_rv( (param!=0),"param");
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ if (impl->x_name != 0){
+ free(impl->x_name);
+ }
+
+ impl->x_name = strdup(v);
+
+ if (impl->x_name == 0){
+ errno = ENOMEM;
+ }
+
+}
+
+char*
+icalparameter_get_xname (icalparameter* param)
+{
+ struct icalparameter_impl *impl = (struct icalparameter_impl*)param;
+ icalerror_check_arg_rz( (param!=0),"param");
+
+ return impl->x_name;
+}
+
+void
+icalparameter_set_xvalue (icalparameter* param, char* v)
+{
+ struct icalparameter_impl *impl = (struct icalparameter_impl*)param;
+
+ icalerror_check_arg_rv( (param!=0),"param");
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ if (impl->string != 0){
+ free(impl->string);
+ }
+
+ impl->string = strdup(v);
+
+ if (impl->string == 0){
+ errno = ENOMEM;
+ }
+
+}
+
+char*
+icalparameter_get_xvalue (icalparameter* param)
+{
+ struct icalparameter_impl *impl = (struct icalparameter_impl*)param;
+
+ icalerror_check_arg_rz( (param!=0),"param");
+
+ return impl->string;
+
+}
+
+void icalparameter_set_parent(icalparameter* param,
+ icalproperty* property)
+{
+ struct icalparameter_impl *impl = (struct icalparameter_impl*)param;
+
+ icalerror_check_arg_rv( (param!=0),"param");
+
+ impl->parent = property;
+}
+
+icalproperty* icalparameter_get_parent(icalparameter* param)
+{
+ struct icalparameter_impl *impl = (struct icalparameter_impl*)param;
+
+ icalerror_check_arg_rv( (param!=0),"param");
+
+ return impl->parent;
+}
+
+
+/* Everything below this line is machine generated. Do not edit. */
+/* ALTREP */
+icalparameter* icalparameter_new_altrep(char* v)
+{
+ struct icalparameter_impl *impl;
+ icalerror_clear_errno();
+ icalerror_check_arg_rz( (v!=0),"v");
+ impl = icalparameter_new_impl(ICAL_ALTREP_PARAMETER);
+ if (impl == 0) {
+ return 0;
+ }
+
+ icalparameter_set_altrep((icalparameter*) impl,v);
+ if (icalerrno != ICAL_NO_ERROR) {
+ icalparameter_free((icalparameter*) impl);
+ return 0;
+ }
+
+ return (icalparameter*) impl;
+}
+
+char* icalparameter_get_altrep(icalparameter* param)
+{
+ icalerror_clear_errno();
+ icalerror_check_arg_rz( (param!=0), "param");
+ return ((struct icalparameter_impl*)param)->string;
+}
+
+void icalparameter_set_altrep(icalparameter* param, char* v)
+{
+ icalerror_check_arg_rv( (v!=0),"v");
+ icalerror_check_arg_rv( (param!=0), "param");
+ icalerror_clear_errno();
+
+ ((struct icalparameter_impl*)param)->string = strdup(v);
+}
+
+/* CN */
+icalparameter* icalparameter_new_cn(char* v)
+{
+ struct icalparameter_impl *impl;
+ icalerror_clear_errno();
+ icalerror_check_arg_rz( (v!=0),"v");
+ impl = icalparameter_new_impl(ICAL_CN_PARAMETER);
+ if (impl == 0) {
+ return 0;
+ }
+
+ icalparameter_set_cn((icalparameter*) impl,v);
+ if (icalerrno != ICAL_NO_ERROR) {
+ icalparameter_free((icalparameter*) impl);
+ return 0;
+ }
+
+ return (icalparameter*) impl;
+}
+
+char* icalparameter_get_cn(icalparameter* param)
+{
+ icalerror_clear_errno();
+ icalerror_check_arg_rz( (param!=0), "param");
+ return ((struct icalparameter_impl*)param)->string;
+}
+
+void icalparameter_set_cn(icalparameter* param, char* v)
+{
+ icalerror_check_arg_rv( (v!=0),"v");
+ icalerror_check_arg_rv( (param!=0), "param");
+ icalerror_clear_errno();
+
+ ((struct icalparameter_impl*)param)->string = strdup(v);
+}
+
+/* CUTYPE */
+icalparameter* icalparameter_new_cutype(icalparameter_cutype v)
+{
+ struct icalparameter_impl *impl;
+ icalerror_clear_errno();
+
+ impl = icalparameter_new_impl(ICAL_CUTYPE_PARAMETER);
+ if (impl == 0) {
+ return 0;
+ }
+
+ icalparameter_set_cutype((icalparameter*) impl,v);
+ if (icalerrno != ICAL_NO_ERROR) {
+ icalparameter_free((icalparameter*) impl);
+ return 0;
+ }
+
+ return (icalparameter*) impl;
+}
+
+icalparameter_cutype icalparameter_get_cutype(icalparameter* param)
+{
+ icalerror_clear_errno();
+ icalerror_check_arg( (param!=0), "param");
+ if ( ((struct icalparameter_impl*)param)->string != 0){
+ return ICAL_CUTYPE_XNAME;
+ }
+
+ return ((struct icalparameter_impl*)param)->data.v_cutype;
+
+}
+
+void icalparameter_set_cutype(icalparameter* param, icalparameter_cutype v)
+{
+
+ icalerror_check_arg_rv( (param!=0), "param");
+ icalerror_clear_errno();
+
+ ((struct icalparameter_impl*)param)->data.v_cutype = v;
+}
+
+/* DELEGATED-FROM */
+icalparameter* icalparameter_new_delegatedfrom(char* v)
+{
+ struct icalparameter_impl *impl;
+ icalerror_clear_errno();
+ icalerror_check_arg_rz( (v!=0),"v");
+ impl = icalparameter_new_impl(ICAL_DELEGATEDFROM_PARAMETER);
+ if (impl == 0) {
+ return 0;
+ }
+
+ icalparameter_set_delegatedfrom((icalparameter*) impl,v);
+ if (icalerrno != ICAL_NO_ERROR) {
+ icalparameter_free((icalparameter*) impl);
+ return 0;
+ }
+
+ return (icalparameter*) impl;
+}
+
+char* icalparameter_get_delegatedfrom(icalparameter* param)
+{
+ icalerror_clear_errno();
+ icalerror_check_arg_rz( (param!=0), "param");
+ return ((struct icalparameter_impl*)param)->string;
+}
+
+void icalparameter_set_delegatedfrom(icalparameter* param, char* v)
+{
+ icalerror_check_arg_rv( (v!=0),"v");
+ icalerror_check_arg_rv( (param!=0), "param");
+ icalerror_clear_errno();
+
+ ((struct icalparameter_impl*)param)->string = strdup(v);
+}
+
+/* DELEGATED-TO */
+icalparameter* icalparameter_new_delegatedto(char* v)
+{
+ struct icalparameter_impl *impl;
+ icalerror_clear_errno();
+ icalerror_check_arg_rz( (v!=0),"v");
+ impl = icalparameter_new_impl(ICAL_DELEGATEDTO_PARAMETER);
+ if (impl == 0) {
+ return 0;
+ }
+
+ icalparameter_set_delegatedto((icalparameter*) impl,v);
+ if (icalerrno != ICAL_NO_ERROR) {
+ icalparameter_free((icalparameter*) impl);
+ return 0;
+ }
+
+ return (icalparameter*) impl;
+}
+
+char* icalparameter_get_delegatedto(icalparameter* param)
+{
+ icalerror_clear_errno();
+ icalerror_check_arg_rz( (param!=0), "param");
+ return ((struct icalparameter_impl*)param)->string;
+}
+
+void icalparameter_set_delegatedto(icalparameter* param, char* v)
+{
+ icalerror_check_arg_rv( (v!=0),"v");
+ icalerror_check_arg_rv( (param!=0), "param");
+ icalerror_clear_errno();
+
+ ((struct icalparameter_impl*)param)->string = strdup(v);
+}
+
+/* DIR */
+icalparameter* icalparameter_new_dir(char* v)
+{
+ struct icalparameter_impl *impl;
+ icalerror_clear_errno();
+ icalerror_check_arg_rz( (v!=0),"v");
+ impl = icalparameter_new_impl(ICAL_DIR_PARAMETER);
+ if (impl == 0) {
+ return 0;
+ }
+
+ icalparameter_set_dir((icalparameter*) impl,v);
+ if (icalerrno != ICAL_NO_ERROR) {
+ icalparameter_free((icalparameter*) impl);
+ return 0;
+ }
+
+ return (icalparameter*) impl;
+}
+
+char* icalparameter_get_dir(icalparameter* param)
+{
+ icalerror_clear_errno();
+ icalerror_check_arg_rz( (param!=0), "param");
+ return ((struct icalparameter_impl*)param)->string;
+}
+
+void icalparameter_set_dir(icalparameter* param, char* v)
+{
+ icalerror_check_arg_rv( (v!=0),"v");
+ icalerror_check_arg_rv( (param!=0), "param");
+ icalerror_clear_errno();
+
+ ((struct icalparameter_impl*)param)->string = strdup(v);
+}
+
+/* ENCODING */
+icalparameter* icalparameter_new_encoding(icalparameter_encoding v)
+{
+ struct icalparameter_impl *impl;
+ icalerror_clear_errno();
+
+ impl = icalparameter_new_impl(ICAL_ENCODING_PARAMETER);
+ if (impl == 0) {
+ return 0;
+ }
+
+ icalparameter_set_encoding((icalparameter*) impl,v);
+ if (icalerrno != ICAL_NO_ERROR) {
+ icalparameter_free((icalparameter*) impl);
+ return 0;
+ }
+
+ return (icalparameter*) impl;
+}
+
+icalparameter_encoding icalparameter_get_encoding(icalparameter* param)
+{
+ icalerror_clear_errno();
+ icalerror_check_arg( (param!=0), "param");
+ if ( ((struct icalparameter_impl*)param)->string != 0){
+ return ICAL_ENCODING_XNAME;
+ }
+
+ return ((struct icalparameter_impl*)param)->data.v_encoding;
+
+}
+
+void icalparameter_set_encoding(icalparameter* param, icalparameter_encoding v)
+{
+
+ icalerror_check_arg_rv( (param!=0), "param");
+ icalerror_clear_errno();
+
+ ((struct icalparameter_impl*)param)->data.v_encoding = v;
+}
+
+/* FBTYPE */
+icalparameter* icalparameter_new_fbtype(icalparameter_fbtype v)
+{
+ struct icalparameter_impl *impl;
+ icalerror_clear_errno();
+
+ impl = icalparameter_new_impl(ICAL_FBTYPE_PARAMETER);
+ if (impl == 0) {
+ return 0;
+ }
+
+ icalparameter_set_fbtype((icalparameter*) impl,v);
+ if (icalerrno != ICAL_NO_ERROR) {
+ icalparameter_free((icalparameter*) impl);
+ return 0;
+ }
+
+ return (icalparameter*) impl;
+}
+
+icalparameter_fbtype icalparameter_get_fbtype(icalparameter* param)
+{
+ icalerror_clear_errno();
+ icalerror_check_arg( (param!=0), "param");
+ if ( ((struct icalparameter_impl*)param)->string != 0){
+ return ICAL_FBTYPE_XNAME;
+ }
+
+ return ((struct icalparameter_impl*)param)->data.v_fbtype;
+
+}
+
+void icalparameter_set_fbtype(icalparameter* param, icalparameter_fbtype v)
+{
+
+ icalerror_check_arg_rv( (param!=0), "param");
+ icalerror_clear_errno();
+
+ ((struct icalparameter_impl*)param)->data.v_fbtype = v;
+}
+
+/* FMTTYPE */
+icalparameter* icalparameter_new_fmttype(char* v)
+{
+ struct icalparameter_impl *impl;
+ icalerror_clear_errno();
+ icalerror_check_arg_rz( (v!=0),"v");
+ impl = icalparameter_new_impl(ICAL_FMTTYPE_PARAMETER);
+ if (impl == 0) {
+ return 0;
+ }
+
+ icalparameter_set_fmttype((icalparameter*) impl,v);
+ if (icalerrno != ICAL_NO_ERROR) {
+ icalparameter_free((icalparameter*) impl);
+ return 0;
+ }
+
+ return (icalparameter*) impl;
+}
+
+char* icalparameter_get_fmttype(icalparameter* param)
+{
+ icalerror_clear_errno();
+ icalerror_check_arg_rz( (param!=0), "param");
+ return ((struct icalparameter_impl*)param)->string;
+}
+
+void icalparameter_set_fmttype(icalparameter* param, char* v)
+{
+ icalerror_check_arg_rv( (v!=0),"v");
+ icalerror_check_arg_rv( (param!=0), "param");
+ icalerror_clear_errno();
+
+ ((struct icalparameter_impl*)param)->string = strdup(v);
+}
+
+/* LANGUAGE */
+icalparameter* icalparameter_new_language(char* v)
+{
+ struct icalparameter_impl *impl;
+ icalerror_clear_errno();
+ icalerror_check_arg_rz( (v!=0),"v");
+ impl = icalparameter_new_impl(ICAL_LANGUAGE_PARAMETER);
+ if (impl == 0) {
+ return 0;
+ }
+
+ icalparameter_set_language((icalparameter*) impl,v);
+ if (icalerrno != ICAL_NO_ERROR) {
+ icalparameter_free((icalparameter*) impl);
+ return 0;
+ }
+
+ return (icalparameter*) impl;
+}
+
+char* icalparameter_get_language(icalparameter* param)
+{
+ icalerror_clear_errno();
+ icalerror_check_arg_rz( (param!=0), "param");
+ return ((struct icalparameter_impl*)param)->string;
+}
+
+void icalparameter_set_language(icalparameter* param, char* v)
+{
+ icalerror_check_arg_rv( (v!=0),"v");
+ icalerror_check_arg_rv( (param!=0), "param");
+ icalerror_clear_errno();
+
+ ((struct icalparameter_impl*)param)->string = strdup(v);
+}
+
+/* MEMBER */
+icalparameter* icalparameter_new_member(char* v)
+{
+ struct icalparameter_impl *impl;
+ icalerror_clear_errno();
+ icalerror_check_arg_rz( (v!=0),"v");
+ impl = icalparameter_new_impl(ICAL_MEMBER_PARAMETER);
+ if (impl == 0) {
+ return 0;
+ }
+
+ icalparameter_set_member((icalparameter*) impl,v);
+ if (icalerrno != ICAL_NO_ERROR) {
+ icalparameter_free((icalparameter*) impl);
+ return 0;
+ }
+
+ return (icalparameter*) impl;
+}
+
+char* icalparameter_get_member(icalparameter* param)
+{
+ icalerror_clear_errno();
+ icalerror_check_arg_rz( (param!=0), "param");
+ return ((struct icalparameter_impl*)param)->string;
+}
+
+void icalparameter_set_member(icalparameter* param, char* v)
+{
+ icalerror_check_arg_rv( (v!=0),"v");
+ icalerror_check_arg_rv( (param!=0), "param");
+ icalerror_clear_errno();
+
+ ((struct icalparameter_impl*)param)->string = strdup(v);
+}
+
+/* PARTSTAT */
+icalparameter* icalparameter_new_partstat(icalparameter_partstat v)
+{
+ struct icalparameter_impl *impl;
+ icalerror_clear_errno();
+
+ impl = icalparameter_new_impl(ICAL_PARTSTAT_PARAMETER);
+ if (impl == 0) {
+ return 0;
+ }
+
+ icalparameter_set_partstat((icalparameter*) impl,v);
+ if (icalerrno != ICAL_NO_ERROR) {
+ icalparameter_free((icalparameter*) impl);
+ return 0;
+ }
+
+ return (icalparameter*) impl;
+}
+
+icalparameter_partstat icalparameter_get_partstat(icalparameter* param)
+{
+ icalerror_clear_errno();
+ icalerror_check_arg( (param!=0), "param");
+ if ( ((struct icalparameter_impl*)param)->string != 0){
+ return ICAL_PARTSTAT_XNAME;
+ }
+
+ return ((struct icalparameter_impl*)param)->data.v_partstat;
+
+}
+
+void icalparameter_set_partstat(icalparameter* param, icalparameter_partstat v)
+{
+
+ icalerror_check_arg_rv( (param!=0), "param");
+ icalerror_clear_errno();
+
+ ((struct icalparameter_impl*)param)->data.v_partstat = v;
+}
+
+/* RANGE */
+icalparameter* icalparameter_new_range(icalparameter_range v)
+{
+ struct icalparameter_impl *impl;
+ icalerror_clear_errno();
+
+ impl = icalparameter_new_impl(ICAL_RANGE_PARAMETER);
+ if (impl == 0) {
+ return 0;
+ }
+
+ icalparameter_set_range((icalparameter*) impl,v);
+ if (icalerrno != ICAL_NO_ERROR) {
+ icalparameter_free((icalparameter*) impl);
+ return 0;
+ }
+
+ return (icalparameter*) impl;
+}
+
+icalparameter_range icalparameter_get_range(icalparameter* param)
+{
+ icalerror_clear_errno();
+ icalerror_check_arg( (param!=0), "param");
+
+ return ((struct icalparameter_impl*)param)->data.v_range;
+
+}
+
+void icalparameter_set_range(icalparameter* param, icalparameter_range v)
+{
+
+ icalerror_check_arg_rv( (param!=0), "param");
+ icalerror_clear_errno();
+
+ ((struct icalparameter_impl*)param)->data.v_range = v;
+}
+
+/* RELATED */
+icalparameter* icalparameter_new_related(icalparameter_related v)
+{
+ struct icalparameter_impl *impl;
+ icalerror_clear_errno();
+
+ impl = icalparameter_new_impl(ICAL_RELATED_PARAMETER);
+ if (impl == 0) {
+ return 0;
+ }
+
+ icalparameter_set_related((icalparameter*) impl,v);
+ if (icalerrno != ICAL_NO_ERROR) {
+ icalparameter_free((icalparameter*) impl);
+ return 0;
+ }
+
+ return (icalparameter*) impl;
+}
+
+icalparameter_related icalparameter_get_related(icalparameter* param)
+{
+ icalerror_clear_errno();
+ icalerror_check_arg( (param!=0), "param");
+
+ return ((struct icalparameter_impl*)param)->data.v_related;
+
+}
+
+void icalparameter_set_related(icalparameter* param, icalparameter_related v)
+{
+
+ icalerror_check_arg_rv( (param!=0), "param");
+ icalerror_clear_errno();
+
+ ((struct icalparameter_impl*)param)->data.v_related = v;
+}
+
+/* RELTYPE */
+icalparameter* icalparameter_new_reltype(icalparameter_reltype v)
+{
+ struct icalparameter_impl *impl;
+ icalerror_clear_errno();
+
+ impl = icalparameter_new_impl(ICAL_RELTYPE_PARAMETER);
+ if (impl == 0) {
+ return 0;
+ }
+
+ icalparameter_set_reltype((icalparameter*) impl,v);
+ if (icalerrno != ICAL_NO_ERROR) {
+ icalparameter_free((icalparameter*) impl);
+ return 0;
+ }
+
+ return (icalparameter*) impl;
+}
+
+icalparameter_reltype icalparameter_get_reltype(icalparameter* param)
+{
+ icalerror_clear_errno();
+ icalerror_check_arg( (param!=0), "param");
+ if ( ((struct icalparameter_impl*)param)->string != 0){
+ return ICAL_RELTYPE_XNAME;
+ }
+
+ return ((struct icalparameter_impl*)param)->data.v_reltype;
+
+}
+
+void icalparameter_set_reltype(icalparameter* param, icalparameter_reltype v)
+{
+
+ icalerror_check_arg_rv( (param!=0), "param");
+ icalerror_clear_errno();
+
+ ((struct icalparameter_impl*)param)->data.v_reltype = v;
+}
+
+/* ROLE */
+icalparameter* icalparameter_new_role(icalparameter_role v)
+{
+ struct icalparameter_impl *impl;
+ icalerror_clear_errno();
+
+ impl = icalparameter_new_impl(ICAL_ROLE_PARAMETER);
+ if (impl == 0) {
+ return 0;
+ }
+
+ icalparameter_set_role((icalparameter*) impl,v);
+ if (icalerrno != ICAL_NO_ERROR) {
+ icalparameter_free((icalparameter*) impl);
+ return 0;
+ }
+
+ return (icalparameter*) impl;
+}
+
+icalparameter_role icalparameter_get_role(icalparameter* param)
+{
+ icalerror_clear_errno();
+ icalerror_check_arg( (param!=0), "param");
+ if ( ((struct icalparameter_impl*)param)->string != 0){
+ return ICAL_ROLE_XNAME;
+ }
+
+ return ((struct icalparameter_impl*)param)->data.v_role;
+
+}
+
+void icalparameter_set_role(icalparameter* param, icalparameter_role v)
+{
+
+ icalerror_check_arg_rv( (param!=0), "param");
+ icalerror_clear_errno();
+
+ ((struct icalparameter_impl*)param)->data.v_role = v;
+}
+
+/* RSVP */
+icalparameter* icalparameter_new_rsvp(int v)
+{
+ struct icalparameter_impl *impl;
+ icalerror_clear_errno();
+
+ impl = icalparameter_new_impl(ICAL_RSVP_PARAMETER);
+ if (impl == 0) {
+ return 0;
+ }
+
+ icalparameter_set_rsvp((icalparameter*) impl,v);
+ if (icalerrno != ICAL_NO_ERROR) {
+ icalparameter_free((icalparameter*) impl);
+ return 0;
+ }
+
+ return (icalparameter*) impl;
+}
+
+int icalparameter_get_rsvp(icalparameter* param)
+{
+ icalerror_clear_errno();
+ icalerror_check_arg( (param!=0), "param");
+
+ return ((struct icalparameter_impl*)param)->data.v_rsvp;
+
+}
+
+void icalparameter_set_rsvp(icalparameter* param, int v)
+{
+
+ icalerror_check_arg_rv( (param!=0), "param");
+ icalerror_clear_errno();
+
+ ((struct icalparameter_impl*)param)->data.v_rsvp = v;
+}
+
+/* SENT-BY */
+icalparameter* icalparameter_new_sentby(char* v)
+{
+ struct icalparameter_impl *impl;
+ icalerror_clear_errno();
+ icalerror_check_arg_rz( (v!=0),"v");
+ impl = icalparameter_new_impl(ICAL_SENTBY_PARAMETER);
+ if (impl == 0) {
+ return 0;
+ }
+
+ icalparameter_set_sentby((icalparameter*) impl,v);
+ if (icalerrno != ICAL_NO_ERROR) {
+ icalparameter_free((icalparameter*) impl);
+ return 0;
+ }
+
+ return (icalparameter*) impl;
+}
+
+char* icalparameter_get_sentby(icalparameter* param)
+{
+ icalerror_clear_errno();
+ icalerror_check_arg_rz( (param!=0), "param");
+ return ((struct icalparameter_impl*)param)->string;
+}
+
+void icalparameter_set_sentby(icalparameter* param, char* v)
+{
+ icalerror_check_arg_rv( (v!=0),"v");
+ icalerror_check_arg_rv( (param!=0), "param");
+ icalerror_clear_errno();
+
+ ((struct icalparameter_impl*)param)->string = strdup(v);
+}
+
+/* TZID */
+icalparameter* icalparameter_new_tzid(char* v)
+{
+ struct icalparameter_impl *impl;
+ icalerror_clear_errno();
+ icalerror_check_arg_rz( (v!=0),"v");
+ impl = icalparameter_new_impl(ICAL_TZID_PARAMETER);
+ if (impl == 0) {
+ return 0;
+ }
+
+ icalparameter_set_tzid((icalparameter*) impl,v);
+ if (icalerrno != ICAL_NO_ERROR) {
+ icalparameter_free((icalparameter*) impl);
+ return 0;
+ }
+
+ return (icalparameter*) impl;
+}
+
+char* icalparameter_get_tzid(icalparameter* param)
+{
+ icalerror_clear_errno();
+ icalerror_check_arg_rz( (param!=0), "param");
+ return ((struct icalparameter_impl*)param)->string;
+}
+
+void icalparameter_set_tzid(icalparameter* param, char* v)
+{
+ icalerror_check_arg_rv( (v!=0),"v");
+ icalerror_check_arg_rv( (param!=0), "param");
+ icalerror_clear_errno();
+
+ ((struct icalparameter_impl*)param)->string = strdup(v);
+}
+
+/* VALUE */
+icalparameter* icalparameter_new_value(icalparameter_value v)
+{
+ struct icalparameter_impl *impl;
+ icalerror_clear_errno();
+
+ impl = icalparameter_new_impl(ICAL_VALUE_PARAMETER);
+ if (impl == 0) {
+ return 0;
+ }
+
+ icalparameter_set_value((icalparameter*) impl,v);
+ if (icalerrno != ICAL_NO_ERROR) {
+ icalparameter_free((icalparameter*) impl);
+ return 0;
+ }
+
+ return (icalparameter*) impl;
+}
+
+icalparameter_value icalparameter_get_value(icalparameter* param)
+{
+ icalerror_clear_errno();
+ icalerror_check_arg( (param!=0), "param");
+ if ( ((struct icalparameter_impl*)param)->string != 0){
+ return ICAL_VALUE_XNAME;
+ }
+
+ return ((struct icalparameter_impl*)param)->data.v_value;
+
+}
+
+void icalparameter_set_value(icalparameter* param, icalparameter_value v)
+{
+
+ icalerror_check_arg_rv( (param!=0), "param");
+ icalerror_clear_errno();
+
+ ((struct icalparameter_impl*)param)->data.v_value = v;
+}
+
+/* X */
+icalparameter* icalparameter_new_x(char* v)
+{
+ struct icalparameter_impl *impl;
+ icalerror_clear_errno();
+ icalerror_check_arg_rz( (v!=0),"v");
+ impl = icalparameter_new_impl(ICAL_X_PARAMETER);
+ if (impl == 0) {
+ return 0;
+ }
+
+ icalparameter_set_x((icalparameter*) impl,v);
+ if (icalerrno != ICAL_NO_ERROR) {
+ icalparameter_free((icalparameter*) impl);
+ return 0;
+ }
+
+ return (icalparameter*) impl;
+}
+
+char* icalparameter_get_x(icalparameter* param)
+{
+ icalerror_clear_errno();
+ icalerror_check_arg_rz( (param!=0), "param");
+ return ((struct icalparameter_impl*)param)->string;
+}
+
+void icalparameter_set_x(icalparameter* param, char* v)
+{
+ icalerror_check_arg_rv( (v!=0),"v");
+ icalerror_check_arg_rv( (param!=0), "param");
+ icalerror_clear_errno();
+
+ ((struct icalparameter_impl*)param)->string = strdup(v);
+}
+
+/* X-LIC-ERRORTYPE */
+icalparameter* icalparameter_new_xlicerrortype(icalparameter_xlicerrortype v)
+{
+ struct icalparameter_impl *impl;
+ icalerror_clear_errno();
+
+ impl = icalparameter_new_impl(ICAL_XLICERRORTYPE_PARAMETER);
+ if (impl == 0) {
+ return 0;
+ }
+
+ icalparameter_set_xlicerrortype((icalparameter*) impl,v);
+ if (icalerrno != ICAL_NO_ERROR) {
+ icalparameter_free((icalparameter*) impl);
+ return 0;
+ }
+
+ return (icalparameter*) impl;
+}
+
+icalparameter_xlicerrortype icalparameter_get_xlicerrortype(icalparameter* param)
+{
+ icalerror_clear_errno();
+ icalerror_check_arg( (param!=0), "param");
+
+ return ((struct icalparameter_impl*)param)->data.v_xlicerrortype;
+
+}
+
+void icalparameter_set_xlicerrortype(icalparameter* param, icalparameter_xlicerrortype v)
+{
+
+ icalerror_check_arg_rv( (param!=0), "param");
+ icalerror_clear_errno();
+
+ ((struct icalparameter_impl*)param)->data.v_xlicerrortype = v;
+}
+
+/* X-LIC-COMPARETYPE */
+icalparameter* icalparameter_new_xliccomparetype(icalparameter_xliccomparetype v)
+{
+ struct icalparameter_impl *impl;
+ icalerror_clear_errno();
+
+ impl = icalparameter_new_impl(ICAL_XLICCOMPARETYPE_PARAMETER);
+ if (impl == 0) {
+ return 0;
+ }
+
+ icalparameter_set_xliccomparetype((icalparameter*) impl,v);
+ if (icalerrno != ICAL_NO_ERROR) {
+ icalparameter_free((icalparameter*) impl);
+ return 0;
+ }
+
+ return (icalparameter*) impl;
+}
+
+icalparameter_xliccomparetype icalparameter_get_xliccomparetype(icalparameter* param)
+{
+ icalerror_clear_errno();
+ icalerror_check_arg( (param!=0), "param");
+
+ return ((struct icalparameter_impl*)param)->data.v_xliccomparetype;
+
+}
+
+void icalparameter_set_xliccomparetype(icalparameter* param, icalparameter_xliccomparetype v)
+{
+
+ icalerror_check_arg_rv( (param!=0), "param");
+ icalerror_clear_errno();
+
+ ((struct icalparameter_impl*)param)->data.v_xliccomparetype = v;
+}
+
diff --git a/libical/src/libical/icalparameter.h b/libical/src/libical/icalparameter.h
new file mode 100644
index 0000000000..174cae6f3f
--- /dev/null
+++ b/libical/src/libical/icalparameter.h
@@ -0,0 +1,174 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalparam.h
+ CREATOR: eric 20 March 1999
+
+
+ $Id$
+ $Locker$
+
+
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The original author is Eric Busboom
+ The original code is icalparam.h
+
+ ======================================================================*/
+
+#ifndef ICALPARAM_H
+#define ICALPARAM_H
+
+#include "icalenums.h" /* defined icalparameter_kind and other enums */
+
+typedef void icalparameter;
+
+icalparameter* icalparameter_new(icalparameter_kind kind);
+icalparameter* icalparameter_new_clone(icalparameter* p);
+icalparameter* icalparameter_new_from_string(icalparameter_kind kind, char* value);
+
+void icalparameter_free(icalparameter* parameter);
+
+char* icalparameter_as_ical_string(icalparameter* parameter);
+
+int icalparameter_is_valid(icalparameter* parameter);
+
+icalparameter_kind icalparameter_isa(icalparameter* parameter);
+
+int icalparameter_isa_parameter(void* param);
+
+/* Acess the name of an X parameer */
+void icalparameter_set_xname (icalparameter* param, char* v);
+char* icalparameter_get_xname(icalparameter* param);
+void icalparameter_set_xvalue (icalparameter* param, char* v);
+char* icalparameter_get_xvalue(icalparameter* param);
+
+
+/* Everything below this line is machine generated. Do not edit. */
+/* ALTREP */
+icalparameter* icalparameter_new_altrep(char* v);
+char* icalparameter_get_altrep(icalparameter* value);
+void icalparameter_set_altrep(icalparameter* value, char* v);
+
+/* CN */
+icalparameter* icalparameter_new_cn(char* v);
+char* icalparameter_get_cn(icalparameter* value);
+void icalparameter_set_cn(icalparameter* value, char* v);
+
+/* CUTYPE */
+icalparameter* icalparameter_new_cutype(icalparameter_cutype v);
+icalparameter_cutype icalparameter_get_cutype(icalparameter* value);
+void icalparameter_set_cutype(icalparameter* value, icalparameter_cutype v);
+
+/* DELEGATED-FROM */
+icalparameter* icalparameter_new_delegatedfrom(char* v);
+char* icalparameter_get_delegatedfrom(icalparameter* value);
+void icalparameter_set_delegatedfrom(icalparameter* value, char* v);
+
+/* DELEGATED-TO */
+icalparameter* icalparameter_new_delegatedto(char* v);
+char* icalparameter_get_delegatedto(icalparameter* value);
+void icalparameter_set_delegatedto(icalparameter* value, char* v);
+
+/* DIR */
+icalparameter* icalparameter_new_dir(char* v);
+char* icalparameter_get_dir(icalparameter* value);
+void icalparameter_set_dir(icalparameter* value, char* v);
+
+/* ENCODING */
+icalparameter* icalparameter_new_encoding(icalparameter_encoding v);
+icalparameter_encoding icalparameter_get_encoding(icalparameter* value);
+void icalparameter_set_encoding(icalparameter* value, icalparameter_encoding v);
+
+/* FBTYPE */
+icalparameter* icalparameter_new_fbtype(icalparameter_fbtype v);
+icalparameter_fbtype icalparameter_get_fbtype(icalparameter* value);
+void icalparameter_set_fbtype(icalparameter* value, icalparameter_fbtype v);
+
+/* FMTTYPE */
+icalparameter* icalparameter_new_fmttype(char* v);
+char* icalparameter_get_fmttype(icalparameter* value);
+void icalparameter_set_fmttype(icalparameter* value, char* v);
+
+/* LANGUAGE */
+icalparameter* icalparameter_new_language(char* v);
+char* icalparameter_get_language(icalparameter* value);
+void icalparameter_set_language(icalparameter* value, char* v);
+
+/* MEMBER */
+icalparameter* icalparameter_new_member(char* v);
+char* icalparameter_get_member(icalparameter* value);
+void icalparameter_set_member(icalparameter* value, char* v);
+
+/* PARTSTAT */
+icalparameter* icalparameter_new_partstat(icalparameter_partstat v);
+icalparameter_partstat icalparameter_get_partstat(icalparameter* value);
+void icalparameter_set_partstat(icalparameter* value, icalparameter_partstat v);
+
+/* RANGE */
+icalparameter* icalparameter_new_range(icalparameter_range v);
+icalparameter_range icalparameter_get_range(icalparameter* value);
+void icalparameter_set_range(icalparameter* value, icalparameter_range v);
+
+/* RELATED */
+icalparameter* icalparameter_new_related(icalparameter_related v);
+icalparameter_related icalparameter_get_related(icalparameter* value);
+void icalparameter_set_related(icalparameter* value, icalparameter_related v);
+
+/* RELTYPE */
+icalparameter* icalparameter_new_reltype(icalparameter_reltype v);
+icalparameter_reltype icalparameter_get_reltype(icalparameter* value);
+void icalparameter_set_reltype(icalparameter* value, icalparameter_reltype v);
+
+/* ROLE */
+icalparameter* icalparameter_new_role(icalparameter_role v);
+icalparameter_role icalparameter_get_role(icalparameter* value);
+void icalparameter_set_role(icalparameter* value, icalparameter_role v);
+
+/* RSVP */
+icalparameter* icalparameter_new_rsvp(int v);
+int icalparameter_get_rsvp(icalparameter* value);
+void icalparameter_set_rsvp(icalparameter* value, int v);
+
+/* SENT-BY */
+icalparameter* icalparameter_new_sentby(char* v);
+char* icalparameter_get_sentby(icalparameter* value);
+void icalparameter_set_sentby(icalparameter* value, char* v);
+
+/* TZID */
+icalparameter* icalparameter_new_tzid(char* v);
+char* icalparameter_get_tzid(icalparameter* value);
+void icalparameter_set_tzid(icalparameter* value, char* v);
+
+/* VALUE */
+icalparameter* icalparameter_new_value(icalparameter_value v);
+icalparameter_value icalparameter_get_value(icalparameter* value);
+void icalparameter_set_value(icalparameter* value, icalparameter_value v);
+
+/* X */
+icalparameter* icalparameter_new_x(char* v);
+char* icalparameter_get_x(icalparameter* value);
+void icalparameter_set_x(icalparameter* value, char* v);
+
+/* X-LIC-ERRORTYPE */
+icalparameter* icalparameter_new_xlicerrortype(icalparameter_xlicerrortype v);
+icalparameter_xlicerrortype icalparameter_get_xlicerrortype(icalparameter* value);
+void icalparameter_set_xlicerrortype(icalparameter* value, icalparameter_xlicerrortype v);
+
+/* X-LIC-COMPARETYPE */
+icalparameter* icalparameter_new_xliccomparetype(icalparameter_xliccomparetype v);
+icalparameter_xliccomparetype icalparameter_get_xliccomparetype(icalparameter* value);
+void icalparameter_set_xliccomparetype(icalparameter* value, icalparameter_xliccomparetype v);
+
+#endif ICALPARAMETER_H
diff --git a/libical/src/libical/icalparser.c b/libical/src/libical/icalparser.c
new file mode 100644
index 0000000000..8541ae4fab
--- /dev/null
+++ b/libical/src/libical/icalparser.c
@@ -0,0 +1,990 @@
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: icalparser.c
+ CREATOR: eric 04 August 1999
+
+ $Id$
+ $Locker$
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The Initial Developer of the Original Code is Eric Busboom
+
+ (C) COPYRIGHT 1999 The Software Studio.
+ http://www.softwarestudio.org
+
+ ======================================================================*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+
+#include "ical.h"
+#include "pvl.h"
+#include "icalparser.h"
+#include "icalmemory.h"
+#include <string.h> /* For strncpy & size_t */
+#include <stdio.h> /* For FILE and fgets and sprintf */
+#include <stdlib.h> /* for free */
+
+
+extern icalvalue* icalparser_yy_value;
+void set_parser_value_state(icalvalue_kind kind);
+int ical_yy_parse(void);
+
+char* icalparser_get_next_char(char c, char *str);
+char* icalparser_get_next_parameter(char* line,char** end);
+char* icalparser_get_next_value(char* line, char **end, icalvalue_kind kind);
+char* icalparser_get_prop_name(char* line, char** end);
+char* icalparser_get_param_name(char* line, char **end);
+
+#define TMP_BUF_SIZE 80
+
+struct icalparser_impl
+{
+ int buffer_full;
+ size_t tmp_buf_size;
+ char temp[TMP_BUF_SIZE];
+ icalcomponent *root_component;
+ icalcomponent *tail;
+ int version;
+ int level;
+ int lineno;
+ icalparser_state state;
+ pvl_list components;
+
+ void *line_gen_data;
+
+};
+
+
+icalparser* icalparser_new()
+{
+ struct icalparser_impl* impl = 0;
+
+ if ( ( impl = (struct icalparser_impl*)
+ malloc(sizeof(struct icalparser_impl))) == 0) {
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return 0;
+ }
+
+ impl->root_component = 0;
+ impl->components = pvl_newlist();
+ impl->level = 0;
+ impl->state = ICALPARSER_SUCCESS;
+
+ impl->tmp_buf_size = TMP_BUF_SIZE;
+ impl->buffer_full = 0;
+ impl->lineno = 0;
+
+ memset(impl->temp,0, TMP_BUF_SIZE);
+
+ return (icalparser*)impl;
+}
+
+void icalparser_free(icalparser* parser)
+{
+ struct icalparser_impl* impl = (struct icalparser_impl*)parser;
+ icalcomponent *c;
+
+ if (impl->root_component != 0){
+ icalcomponent_free(impl->root_component);
+ }
+
+ while( (c=pvl_pop(impl->components)) != 0){
+ icalcomponent_free(c);
+ }
+
+ pvl_free(impl->components);
+}
+
+void icalparser_set_gen_data(icalparser* parser, void* data)
+{
+ struct icalparser_impl* impl = (struct icalparser_impl*)parser;
+
+ impl->line_gen_data = data;
+}
+
+
+icalvalue* icalvalue_new_from_string_with_error(icalvalue_kind kind,
+ char* str,
+ icalproperty **error);
+
+
+
+char* icalparser_get_next_char(char c, char *str)
+{
+ int quote_mode = 0;
+ char* p;
+
+
+ for(p=str; *p!=0; p++){
+
+ if ( quote_mode == 0 && *p=='"' && *(p-1) != '\\' ){
+ quote_mode =1;
+ continue;
+ }
+
+ if ( quote_mode == 1 && *p=='"' && *(p-1) != '\\' ){
+ quote_mode =0;
+ continue;
+ }
+
+ if (quote_mode == 0 && *p== c && *(p-1) != '\\' ){
+ return p;
+ }
+
+ }
+
+ return 0;
+}
+
+/* make a new tmp buffer out of a substring */
+char* make_segment(char* start, char* end)
+{
+ char *buf;
+ size_t size = (size_t)end - (size_t)start;
+
+ buf = icalmemory_tmp_buffer(size+1);
+
+
+ strncpy(buf,start,size);
+ *(buf+size) = 0;
+
+ return buf;
+
+}
+
+char* input_buffer;
+char* input_buffer_p;
+#define min(a,b) ((a) < (b) ? (a) : (b))
+
+int icalparser_flex_input(char* buf, int max_size)
+{
+ int n = min(max_size,strlen(input_buffer_p));
+
+ if (n > 0){
+ memcpy(buf, input_buffer_p, n);
+ input_buffer_p += n;
+ return n;
+ } else {
+ return 0;
+ }
+}
+
+void icalparser_clear_flex_input()
+{
+ input_buffer_p = input_buffer+strlen(input_buffer);
+}
+
+/* Cal the flex parser to parse a complex value */
+
+icalvalue* icalparser_parse_value(icalvalue_kind kind,
+ char* str, icalproperty** error)
+{
+ int r;
+ input_buffer_p = input_buffer = str;
+
+ set_parser_value_state(kind);
+ icalparser_yy_value = 0;
+
+ r = ical_yy_parse();
+
+ /* Error. Parse failed */
+ if( icalparser_yy_value == 0 || r != 0){
+
+ if(icalparser_yy_value !=0){
+ icalvalue_free(icalparser_yy_value);
+ icalparser_yy_value = 0;
+ }
+
+ return 0;
+ }
+
+ if (error != 0){
+ *error = 0;
+ }
+
+ return icalparser_yy_value;
+}
+
+char* icalparser_get_prop_name(char* line, char** end)
+{
+ char* p;
+ char* v;
+ char *str;
+
+ p = icalparser_get_next_char(';',line);
+ v = icalparser_get_next_char(':',line);
+ if (p== 0 && v == 0) {
+ return 0;
+ }
+
+ /* There is no ';' or, it is after the ';' that marks the beginning of
+ the value */
+ if (v!=0 && ( p == 0 || p > v)){
+ str = make_segment(line,v);
+ *end = v+1;
+ } else {
+ str = make_segment(line,p);
+ *end = p+1;
+ }
+
+ return str;
+}
+
+char* icalparser_get_param_name(char* line, char **end)
+{
+
+ char* next;
+ char *str;
+
+ next = icalparser_get_next_char('=',line);
+
+ if (next == 0) {
+ return 0;
+ }
+
+ str = make_segment(line,next);
+ *end = next+1;
+ return str;
+
+}
+
+char* icalparser_get_next_paramvalue(char* line, char **end)
+{
+
+ char* next;
+ char *str;
+
+ next = icalparser_get_next_char(',',line);
+
+ if (next == 0){
+ next = (char*)(size_t)line+(size_t)strlen(line);\
+ }
+
+ if (next == line){
+ return 0;
+ } else {
+ str = make_segment(line,next);
+ *end = next+1;
+ return str;
+ }
+
+}
+
+/* A property may have multiple values, if the values are seperated by
+ commas in the content line. This routine will look for the next
+ comma after line and will set the next place to start searching in
+ end. */
+
+char* icalparser_get_next_value(char* line, char **end, icalvalue_kind kind)
+{
+
+ char* next;
+ char *p;
+ char *str;
+ size_t length = strlen(line);
+
+ p = line;
+ while(1){
+
+ next = icalparser_get_next_char(',',p);
+
+ /* Unforunately, RFC2445 says that for the RECUR value, COMMA
+ can both seperate digits in a list, and it can seperate
+ multiple recurrence specifications. This is not a friendly
+ part of the spec. This weirdness tries to
+ distinguish the two uses. it is probably a HACK*/
+
+ if( kind == ICAL_RECUR_VALUE ) {
+ if ( next != 0 &&
+ (*end+length) > next+5 &&
+ strncmp(next,"FREQ",4) == 0
+ ) {
+ /* The COMMA was followed by 'FREQ', is it a real seperator*/
+ /* Fall through */
+ printf("%s\n",next);
+ } else if (next != 0){
+ /* Not real, get the next COMMA */
+ p = next+1;
+ next = 0;
+ continue;
+ }
+ }
+
+ /* If the comma is preceeded by a '\', then it is a literal and
+ not a value seperator*/
+
+ if ( (next!=0 && *(next-1) == '\\') ||
+ (next!=0 && *(next-3) == '\\')
+ )
+ /*second clause for '/' is on prev line. HACK may be out of bounds */
+ {
+ p = next+1;
+ } else {
+ break;
+ }
+
+ }
+
+ if (next == 0){
+ next = (char*)(size_t)line+length;
+ *end = next;
+ } else {
+ *end = next+1;
+ }
+
+ if (next == line){
+ return 0;
+ }
+
+
+ str = make_segment(line,next);
+ return str;
+
+}
+
+char* icalparser_get_next_parameter(char* line,char** end)
+{
+ char *next;
+ char *v;
+ char *str;
+
+ v = icalparser_get_next_char(':',line);
+ next = icalparser_get_next_char(';', line);
+
+ /* There is no ';' or, it is after the ':' that marks the beginning of
+ the value */
+
+ if (next == 0 || next > v) {
+ next = icalparser_get_next_char(':', line);
+ }
+
+ if (next != 0) {
+ str = make_segment(line,next);
+ *end = next+1;
+ return str;
+ } else {
+ *end = line;
+ return 0;
+ }
+}
+
+/* Get a single property line, from the property name through the
+ final new line, and include any continuation lines */
+
+char* icalparser_get_line(icalparser *parser,
+ char* (*line_gen_func)(char *s, size_t size, void *d))
+{
+ char *line;
+ char *line_p;
+ struct icalparser_impl* impl = (struct icalparser_impl*)parser;
+ size_t buf_size = impl->tmp_buf_size;
+
+
+ line_p = line = icalmemory_new_buffer(buf_size);
+ line[0] = '\0';
+
+ while(1) {
+
+ /* The buffer is not clear, so transfer the data in it to the
+ output. This may be left over from a previous call */
+ if (impl->temp[0] != '\0' ) {
+
+ /* If the last position in the temp buffer is occupied,
+ mark the buffer as full. The means we will do another
+ read later, because the line is not finished */
+ if (impl->temp[impl->tmp_buf_size-1] == 0){
+ impl->buffer_full = 1;
+ } else {
+ impl->buffer_full = 0;
+ }
+
+ /* Copy the temp to the output and clear the temp buffer. */
+ icalmemory_append_string(&line,&line_p,&buf_size,impl->temp);
+ impl->temp[0] = '\0' ;
+ }
+
+ impl->temp[impl->tmp_buf_size-1] = 1; /* Mark end of buffer */
+
+ if ((*line_gen_func)(impl->temp,impl->tmp_buf_size,impl->line_gen_data)
+ ==0){/* Get more data */
+
+ /* If the first position is clear, it means we didn't get
+ any more data from the last call to line_ge_func*/
+ if (impl->temp[0] == '\0'){
+
+ if(line[0] != '\0'){
+ /* There is data in the output, so fall trhough and process it*/
+ break;
+ } else {
+ /* No data in output; return and signal that there
+ is no more input*/
+ free(line);
+ return 0;
+ }
+ }
+ }
+
+
+ /* If the output line ends in a '\n' and the temp buffer
+ begins with a ' ', then the buffer holds a continuation
+ line, so keep reading. */
+
+ if ( line_p > line+1 && *(line_p-1) == '\n' && impl->temp[0] == ' ') {
+
+ /* back up the pointer to erase the continuation characters */
+ line_p--;
+
+ if ( *(line_p-1) == '\r'){
+ line_p--;
+ }
+
+ /* shift the temp buffer down to eliminate the leading space*/
+ memmove(&(impl->temp[0]),&(impl->temp[1]),impl->tmp_buf_size);
+
+ impl->temp[impl->tmp_buf_size-1] = impl->temp[impl->tmp_buf_size-2];
+
+ } else if ( impl->buffer_full == 1 ) {
+
+ /* The buffer was filled on the last read, so read again */
+
+ } else {
+
+ /* Looks like the end of this content line, so break */
+ break;
+ }
+
+
+ }
+
+ /* Erase the final newline and/or carriage return*/
+ if ( line_p > line+1 && *(line_p-1) == '\n') {
+ *(line_p-1) = '\0';
+ if ( *(line_p-2) == '\r'){
+ *(line_p-2) = '\0';
+ }
+
+ } else {
+ *(line_p) = '\0';
+ }
+
+ return line;
+
+}
+
+void insert_error(icalcomponent* comp, char* text,
+ char* message, icalparameter_xlicerrortype type)
+{
+ char temp[1024];
+
+ if (strlen(text) > 256) {
+ sprintf(temp,"%s: \'%256s...\'",message,text);
+ } else {
+ sprintf(temp,"%s: \'%s\'",message,text);
+ }
+
+ icalcomponent_add_property
+ (comp,
+ icalproperty_vanew_xlicerror(
+ temp,
+ icalparameter_new_xlicerrortype(type),
+ 0));
+}
+
+icalcomponent* icalparser_parse(icalparser *parser,
+ char* (*line_gen_func)(char *s, size_t size,
+ void* d))
+{
+
+ char* line;
+ icalcomponent *c=0;
+ icalcomponent *root_component=0;
+
+ icalerror_check_arg_rz((parser !=0),"parser");
+
+ do{
+ line = icalparser_get_line(parser, line_gen_func);
+
+ if ((c = icalparser_add_line(parser,line)) != 0){
+ if (root_component == 0){
+ /* Just one component */
+ icalparser_claim(parser);
+ root_component = c;
+ } else if(icalcomponent_isa(root_component)
+ != ICAL_XROOT_COMPONENT) {
+ /*Got a second component, so move the two components under
+ an XROOT container */
+ icalcomponent *tempc;
+ tempc = icalcomponent_new(ICAL_XROOT_COMPONENT);
+ icalcomponent_add_component(tempc, root_component);
+ icalparser_claim(parser);
+ icalcomponent_add_component(tempc, c);
+ root_component = tempc;
+ } else {
+ /* Already have an XROOT container, so add the component
+ to it*/
+ icalcomponent_add_component(root_component, c);
+ icalparser_claim(parser);
+ }
+ }
+ } while ( line != 0);
+
+ return root_component;
+
+}
+
+icalcomponent* icalparser_add_line(icalparser* parser,
+ char* line)
+{
+ char *p;
+ char *str;
+ char *end;
+ int vcount = 0;
+ icalproperty *prop;
+ icalvalue *value;
+ icalvalue_kind value_kind = ICAL_NO_VALUE;
+
+
+ struct icalparser_impl *impl = (struct icalparser_impl*)parser;
+ icalerror_check_arg_rz((parser != 0),"parser");
+
+
+ if (line == 0)
+ {
+ impl->state = ICALPARSER_ERROR;
+ return 0;
+ }
+
+ /* Begin by getting the property name at the start of the line. The
+ property name may end up being "BEGIN" or "END" in which case it
+ is not really a property, but the market for the start or end of
+ a component */
+
+ end = 0;
+ str = icalparser_get_prop_name(line, &end);
+
+ if (str == 0){
+ /* Could not get a property name */
+ icalcomponent *tail = pvl_data(pvl_tail(impl->components));
+
+ if (tail){
+ insert_error(tail,line,
+ "Got a data line, but could not find a property name or component begin tag",
+ ICAL_XLICERRORTYPE_COMPONENTPARSEERROR);
+ }
+ tail = 0;
+ impl->state = ICALPARSER_ERROR;
+ return 0;
+ }
+
+ /**********************************************************************
+ * Handle begin and end of components
+ **********************************************************************/
+
+
+ /* If the property name is BEGIN or END, we are actually
+ starting or ending a new component */
+
+ if(strcmp(str,"BEGIN") == 0){
+ icalcomponent *c;
+
+ impl->level++;
+ str = icalparser_get_next_value(end,&end, value_kind);
+
+ c = icalcomponent_new_from_string(str);
+
+ if (c == 0){
+ c = icalcomponent_new(ICAL_XLICINVALID_COMPONENT);
+ insert_error(c,str,"Parse error in component name",
+ ICAL_XLICERRORTYPE_COMPONENTPARSEERROR);
+ }
+
+ pvl_push(impl->components,c);
+
+ impl->state = ICALPARSER_BEGIN_COMP;
+ return 0;
+
+ } else if (strcmp(str,"END") == 0 ) {
+ icalcomponent* tail;
+
+ impl->level--;
+ str = icalparser_get_next_value(end,&end, value_kind);
+
+ impl->root_component = pvl_pop(impl->components);
+
+ tail = pvl_data(pvl_tail(impl->components));
+
+ if(tail != 0){
+ icalcomponent_add_component(tail,impl->root_component);
+ }
+
+ tail = 0;
+
+ /* Return the component if we are back to the 0th level */
+ if (impl->level == 0){
+ impl->state = ICALPARSER_SUCCESS;
+ return impl->root_component;
+ } else {
+ impl->state = ICALPARSER_END_COMP;
+ return 0;
+ }
+ }
+
+
+ /* There is no point in continuing if we have not seen a
+ component yet */
+
+ if(pvl_data(pvl_tail(impl->components)) == 0){
+ impl->state = ICALPARSER_ERROR;
+ return 0;
+ }
+
+
+ /**********************************************************************
+ * Handle property names
+ **********************************************************************/
+ /* At this point, the property name really is a property name,
+ (Not a component name) so make a new property and add it to
+ the component */
+
+ prop = icalproperty_new_from_string(str);
+
+ if (prop != 0){
+ icalcomponent *tail = pvl_data(pvl_tail(impl->components));
+
+ icalcomponent_add_property(tail, prop);
+
+ /* Set the value kind for the default for this type of
+ property. This may be re-set by a VALUE parameter */
+ value_kind =
+ icalenum_property_kind_to_value_kind(
+ icalproperty_isa(prop));
+
+ } else {
+ icalcomponent* tail = pvl_data(pvl_tail(impl->components));
+
+ insert_error(tail,str,"Parse error in property name",
+ ICAL_XLICERRORTYPE_PROPERTYPARSEERROR);
+
+ tail = 0;
+ impl->state = ICALPARSER_ERROR;
+ return 0;
+ }
+
+ /**********************************************************************
+ * Handle parameter values
+ **********************************************************************/
+
+ /* Now, add any parameters to the last property */
+
+ p = 0;
+ while(1) {
+
+ if (*(end-1) == ':'){
+ /* if the last seperator was a ":" and the value is a
+ URL, icalparser_get_next_parameter will find the
+ ':' in the URL, so better break now. */
+ break;
+ }
+
+ str = icalparser_get_next_parameter(end,&end);
+
+ if (str != 0){
+ char* name;
+ char* pvalue;
+
+ icalparameter *param = 0;
+ icalparameter_kind kind;
+ icalcomponent *tail = pvl_data(pvl_tail(impl->components));
+
+ name = icalparser_get_param_name(str,&pvalue);
+
+ if (name == 0){
+ /* 'tail' defined above */
+ insert_error(tail, str, "Can't parse parameter name",
+ ICAL_XLICERRORTYPE_PARAMETERNAMEPARSEERROR);
+ tail = 0;
+ break;
+ }
+
+ kind = icalenum_string_to_parameter_kind(name);
+
+ if (kind != ICAL_NO_PARAMETER){
+ param = icalparameter_new_from_string(kind,pvalue);
+ } else {
+ /* Error. Failed to parse the parameter*/
+ /* 'tail' defined above */
+ insert_error(tail, str, "Can't parse parameter name",
+ ICAL_XLICERRORTYPE_PARAMETERNAMEPARSEERROR);
+ tail = 0;
+ impl->state = ICALPARSER_ERROR;
+ return 0;
+ }
+
+ if (param == 0){
+ /* 'tail' defined above */
+ insert_error(tail,str,"Can't parse parameter value",
+ ICAL_XLICERRORTYPE_PARAMETERVALUEPARSEERROR);
+
+ tail = 0;
+ impl->state = ICALPARSER_ERROR;
+ continue;
+ }
+
+ /* If it is a VALUE parameter, set the kind of value*/
+ if (icalparameter_isa(param)==ICAL_VALUE_PARAMETER){
+
+ value_kind = (icalvalue_kind)
+ icalparameter_get_value(param);
+
+ if (value_kind == ICAL_NO_VALUE){
+
+ /* Ooops, could not parse the value of the
+ parameter ( it was not one of the defined
+ values ), so reset the value_kind */
+
+ insert_error(
+ tail, str,
+ "Got a VALUE parameter with an unknown type",
+ ICAL_XLICERRORTYPE_PARAMETERVALUEPARSEERROR);
+ icalparameter_free(param);
+
+ value_kind =
+ icalenum_property_kind_to_value_kind(
+ icalproperty_isa(prop));
+
+ icalparameter_free(param);
+ tail = 0;
+ impl->state = ICALPARSER_ERROR;
+ return 0;
+ }
+ }
+
+ /* Everything is OK, so add the parameter */
+ icalproperty_add_parameter(prop,param);
+ tail = 0;
+
+ } else { /* if ( str != 0) */
+ /* If we did not get a param string, go on to looking
+ for a value */
+ break;
+ } /* if ( str != 0) */
+
+ } /* while(1) */
+
+ /**********************************************************************
+ * Handle values
+ **********************************************************************/
+
+ /* Look for values. If there are ',' characters in the values,
+ then there are multiple values, so clone the current
+ parameter and add one part of the value to each clone */
+
+ vcount=0;
+ while(1) {
+ str = icalparser_get_next_value(end,&end, value_kind);
+
+ if (str != 0){
+
+ if (vcount > 0){
+ /* Actually, only clone after the second value */
+ icalproperty* clone = icalproperty_new_clone(prop);
+ icalcomponent* tail = pvl_data(pvl_tail(impl->components));
+
+ icalcomponent_add_property(tail, clone);
+ prop = clone;
+ tail = 0;
+ }
+
+ value = icalvalue_new_from_string(value_kind, str);
+
+ /* Don't add properties without value */
+ if (value == 0){
+ char temp[200]; /* HACK */
+
+ icalproperty_kind prop_kind = icalproperty_isa(prop);
+ icalcomponent* tail = pvl_data(pvl_tail(impl->components));
+
+ sprintf(temp,"Can't parse as %s value in %s property. Removing entire property",
+ icalenum_value_kind_to_string(value_kind),
+ icalenum_property_kind_to_string(prop_kind));
+
+ insert_error(tail, str, temp,
+ ICAL_XLICERRORTYPE_VALUEPARSEERROR);
+
+ /* Remove the troublesome property */
+ icalcomponent_remove_property(tail,prop);
+ icalproperty_free(prop);
+ prop = 0;
+ tail = 0;
+ impl->state = ICALPARSER_ERROR;
+ return 0;
+
+ } else {
+ vcount++;
+ icalproperty_set_value(prop, value);
+ }
+
+
+ } else {
+ if (vcount == 0){
+ char temp[200]; /* HACK */
+
+ icalproperty_kind prop_kind = icalproperty_isa(prop);
+ icalcomponent *tail = pvl_data(pvl_tail(impl->components));
+
+ sprintf(temp,"No value for %s property. Removing entire property",
+ icalenum_property_kind_to_string(prop_kind));
+
+ insert_error(tail, str, temp,
+ ICAL_XLICERRORTYPE_VALUEPARSEERROR);
+
+ /* Remove the troublesome property */
+ icalcomponent_remove_property(tail,prop);
+ icalproperty_free(prop);
+ prop = 0;
+ tail = 0;
+ impl->state = ICALPARSER_ERROR;
+ return 0;
+ } else {
+
+ break;
+ }
+ }
+ }
+
+ /****************************************************************
+ * End of component parsing.
+ *****************************************************************/
+
+ if (pvl_data(pvl_tail(impl->components)) == 0 &&
+ impl->level == 0){
+ impl->state = ICALPARSER_SUCCESS;
+ return impl->root_component;
+ } else {
+ impl->state = ICALPARSER_IN_PROGRESS;
+ return 0;
+ }
+
+}
+
+icalparser_state icalparser_get_state(icalparser* parser)
+{
+ struct icalparser_impl* impl = (struct icalparser_impl*) parser;
+ return impl->state;
+
+}
+
+icalcomponent* icalparser_claim(icalparser* parser)
+{
+ struct icalparser_impl* impl = (struct icalparser_impl*) parser;
+ icalcomponent *c = impl->root_component;
+
+ impl->root_component = 0;
+
+ return c;
+
+}
+
+
+icalcomponent* icalparser_clean(icalparser* parser)
+{
+ struct icalparser_impl* impl = (struct icalparser_impl*) parser;
+ icalcomponent *tail = pvl_data(pvl_tail(impl->components));
+
+ icalerror_check_arg_rz((parser != 0 ),"parser");
+
+ /* We won't get a clean exit if some components did not have an
+ "END" tag. Clear off any component that may be left in the list */
+
+
+ while((tail=pvl_data(pvl_tail(impl->components))) != 0){
+
+ insert_error(tail," ",
+ "Missing END tag for this component. Closing component at end of input.",
+ ICAL_XLICERRORTYPE_COMPONENTPARSEERROR);
+
+
+ impl->root_component = pvl_pop(impl->components);
+ tail=pvl_data(pvl_tail(impl->components));
+
+ if(tail != 0){
+ icalcomponent_add_component(tail,impl->root_component);
+ }
+ }
+
+ return impl->root_component;
+
+}
+
+struct slg_data {
+ char* pos;
+ char* str;
+};
+
+char* string_line_generator(char *out, size_t buf_size, void *d)
+{
+ char *n;
+ size_t size;
+ struct slg_data* data = (struct slg_data*)d;
+
+ if(data->pos==0){
+ data->pos=data->str;
+ }
+
+ /* If the pointer is at the end of the string, we are done */
+ if (*(data->pos)==0){
+ return 0;
+ }
+
+ n = strchr(data->pos,'\n');
+
+ if (n == 0){
+ size = strlen(data->pos);
+ } else {
+ n++; /* include newline in output */
+ size = (n-data->pos);
+ }
+
+ if (size > buf_size-1){
+ size = buf_size-1;
+ }
+
+
+ strncpy(out,data->pos,size);
+
+ *(out+size) = '\0';
+
+ data->pos += size;
+
+ return out;
+}
+
+icalcomponent* icalparser_parse_string(char* str)
+{
+ icalcomponent *c;
+ struct slg_data d;
+ icalparser *p;
+
+ d.pos = 0;
+ d.str = str;
+
+ p = icalparser_new();
+ icalparser_set_gen_data(p,&d);
+ c = icalparser_parse(p,string_line_generator);
+ icalparser_free(p);
+
+ return c;
+
+}
diff --git a/libical/src/libical/icalparser.h b/libical/src/libical/icalparser.h
new file mode 100644
index 0000000000..25c07eca9f
--- /dev/null
+++ b/libical/src/libical/icalparser.h
@@ -0,0 +1,94 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalparser.h
+ CREATOR: eric 20 April 1999
+
+ $Id$
+
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The original author is Eric Busboom
+ The original code is icalparser.h
+
+======================================================================*/
+
+
+#ifndef ICALPARSER_H
+#define ICALPARSER_H
+
+#include "ical.h"
+#include <stdio.h> /* For FILE* */
+
+typedef void* icalparser;
+typedef enum icalparser_state {
+ ICALPARSER_ERROR,
+ ICALPARSER_SUCCESS,
+ ICALPARSER_BEGIN_COMP,
+ ICALPARSER_END_COMP,
+ ICALPARSER_IN_PROGRESS
+} icalparser_state;
+
+
+/***********************************************************************
+ * Message oriented parsing. icalparser_parse takes a string that
+ * holds the text ( in RFC 2445 format ) and returns a pointer to an
+ * icalcomponent. The caller owns the memory. line_gen_func is a
+ * pointer to a function that returns one content line per invocation
+ **********************************************************************/
+
+icalcomponent* icalparser_parse(icalparser *parser,
+ char* (*line_gen_func)(char *s, size_t size, void *d));
+
+/* A simple, and incorrect interface - can only return one component*/
+icalcomponent* icalparser_parse_string(char* str);
+
+
+/***********************************************************************
+ * Line-oriented parsing.
+ *
+ * Create a new parser via icalparse_new_parser, then add ines one at
+ * a time with icalparse_add_line(). icalparser_add_line() will return
+ * non-zero when it has finished with a component.
+ ***********************************************************************/
+
+icalparser* icalparser_new();
+void icalparser_set_gen_data(icalparser* parser, void* data);
+icalcomponent* icalparser_add_line(icalparser* parser, char* str );
+icalcomponent* icalparser_claim(icalparser* parser);
+icalcomponent* icalparser_clean(icalparser* parser);
+icalparser_state icalparser_get_state(icalparser* parser);
+void icalparser_free(icalparser* parser);
+
+/***********************************************************************
+ * Parser support functions
+ ***********************************************************************/
+
+/* Use the flex/bison parser to turn a string into a value type */
+icalvalue* icalparser_parse_value(icalvalue_kind kind, char* str, icalcomponent** errors);
+
+/* Given a line generator function, return a single iCal content line.*/
+char* icalparser_get_line(icalparser* parser, char* (*line_gen_func)(char *s, size_t size, void *d));
+
+
+/* a line_gen_function that returns lines from a string. To use it,
+ set string_line_generator_str to point to the input string, and set
+ string_line_generator_pos to 0. These globals make the routine not
+ thead-safe. */
+
+extern char* string_line_generator_str;
+extern char* string_line_generator_pos;
+char* string_line_generator(char *out, size_t buf_size, void *d);
+
+#endif /* !ICALPARSE_H */
diff --git a/libical/src/libical/icalproperty.c b/libical/src/libical/icalproperty.c
new file mode 100644
index 0000000000..c3fe7c9073
--- /dev/null
+++ b/libical/src/libical/icalproperty.c
@@ -0,0 +1,3095 @@
+/* -*- Mode: C -*- */
+
+/*======================================================================
+ FILE: icalproperty.c
+ CREATOR: eric 28 April 1999
+
+ $Id$
+
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The original author is Eric Busboom
+ The original code is icalproperty.c
+
+======================================================================*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h> /* For strdup, rindex */
+#include <assert.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <stdio.h> /* for printf */
+#include <stdarg.h> /* for va_list, va_start, etc. */
+
+#include "ical.h"
+#include "pvl.h"
+#include "icalenums.h"
+#include "icalerror.h"
+#include "icalmemory.h"
+
+#define TMP_BUF_SIZE 1024
+
+/* Private routines for icalproperty */
+void icalvalue_set_parent(icalvalue* value,
+ icalproperty* property);
+icalproperty* icalvalue_get_parent(icalvalue* value);
+
+void icalparameter_set_parent(icalparameter* param,
+ icalproperty* property);
+icalproperty* icalparameter_get_parent(icalparameter* value);
+
+
+void icalproperty_set_x_name(icalproperty* prop, char* name);
+
+struct icalproperty_impl
+{
+ char id[5];
+ icalproperty_kind kind;
+ char* x_name;
+ pvl_list parameters;
+ pvl_elem parameter_iterator;
+ icalvalue* value;
+ icalcomponent *parent;
+};
+
+void icalproperty_add_parameters(struct icalproperty_impl *impl,va_list args)
+{
+
+ void* vp;
+
+ while((vp = va_arg(args, void*)) != 0) {
+
+ if (icalvalue_isa_value(vp) != 0 ){
+ } else if (icalparameter_isa_parameter(vp) != 0 ){
+
+ icalproperty_add_parameter((icalproperty*)impl,
+ (icalparameter*)vp);
+ } else {
+ abort();
+ }
+
+ }
+
+
+}
+
+struct icalproperty_impl*
+icalproperty_new_impl (icalproperty_kind kind)
+{
+ struct icalproperty_impl* prop;
+
+ if ( ( prop = (struct icalproperty_impl*)
+ malloc(sizeof(struct icalproperty_impl))) == 0) {
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return 0;
+ }
+
+ strcpy(prop->id,"prop");
+
+ prop->kind = kind;
+ prop->parameters = pvl_newlist();
+ prop->parameter_iterator = 0;
+ prop->value = 0;
+ prop->x_name = 0;
+ prop->parent = 0;
+
+ return prop;
+}
+
+
+icalproperty*
+icalproperty_new (icalproperty_kind kind)
+{
+ icalproperty *prop = (icalproperty*)icalproperty_new_impl(kind);
+
+ return prop;
+}
+
+
+icalproperty*
+icalproperty_new_clone(icalproperty* prop)
+{
+ struct icalproperty_impl *old = (struct icalproperty_impl*)prop;
+ struct icalproperty_impl *new = icalproperty_new_impl(old->kind);
+ pvl_elem p;
+
+ icalerror_check_arg_rz((prop!=0),"Prop");
+ icalerror_check_arg_rz((old!=0),"old");
+ icalerror_check_arg_rz((new!=0),"new");
+
+ if (old->value !=0) {
+ new->value = icalvalue_new_clone(old->value);
+ }
+
+ if (old->x_name != 0) {
+
+ new->x_name = strdup(old->x_name);
+
+ if (new->x_name == 0) {
+ icalproperty_free(new);
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return 0;
+ }
+ }
+
+ for(p=pvl_head(old->parameters);p != 0; p = pvl_next(p)){
+ icalparameter *param = icalparameter_new_clone(pvl_data(p));
+
+ if (param == 0){
+ icalproperty_free(new);
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return 0;
+ }
+
+ pvl_push(new->parameters,param);
+
+ }
+
+ return new;
+
+}
+
+/* This one works a little differently from the other *_from_string
+ routines; the string input is the name of the property, not the
+ data associated with the property, as it is in
+ icalvalue_from_string. All of the parsing associated with
+ properties is driven by routines in icalparse.c */
+
+icalproperty* icalproperty_new_from_string(char* str)
+{
+ icalproperty_kind kind;
+
+ icalerror_check_arg_rz( (str!=0),"str");
+
+ kind = icalenum_string_to_property_kind(str);
+
+ if (kind == ICAL_NO_PROPERTY){
+
+ if( str[0] == 'X' && str[1] == '-'){
+ icalproperty *p = icalproperty_new(ICAL_X_PROPERTY);
+ icalproperty_set_x_name(p,str);
+ return p;
+ } else {
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ return 0;
+ }
+
+ } else {
+ return icalproperty_new(kind);
+ }
+}
+
+void
+icalproperty_free (icalproperty* prop)
+{
+ struct icalproperty_impl *p;
+
+ icalparameter* param;
+
+ icalerror_check_arg_rv((prop!=0),"prop");
+
+ p = (struct icalproperty_impl*)prop;
+
+#ifdef ICAL_FREE_ON_LIST_IS_ERROR
+ icalerror_assert( (p->parent ==0),"Tried to free a property that is still attached to a component. ");
+
+#else
+ if(p->parent !=0){
+ return;
+ }
+#endif
+
+ if (p->value != 0){
+ icalvalue_set_parent(p->value,0);
+ icalvalue_free(p->value);
+ }
+
+ while( (param = pvl_pop(p->parameters)) != 0){
+ icalparameter_free(param);
+ }
+
+ pvl_free(p->parameters);
+
+ if (p->x_name != 0) {
+ free(p->x_name);
+ }
+
+ p->kind = ICAL_NO_PROPERTY;
+ p->parameters = 0;
+ p->parameter_iterator = 0;
+ p->value = 0;
+ p->x_name = 0;
+ p->id[0] = 'X';
+
+ free(p);
+
+}
+
+
+char*
+icalproperty_as_ical_string (icalproperty* prop)
+{
+ icalparameter *param;
+
+ /* Create new buffer that we can append names, parameters and a
+ value to, and reallocate as needed. Later, this buffer will be
+ copied to a icalmemory_tmp_buffer, which is managed internally
+ by libical, so it can be given to the caller without fear of
+ the caller forgetting to free it */
+
+ char* property_name = 0;
+ size_t buf_size = 1024;
+ char* buf = icalmemory_new_buffer(buf_size);
+ char* buf_ptr = buf;
+ icalvalue* value;
+ char *out_buf;
+
+#ifdef ICAL_UNIX_NEWLINE
+ char newline[] = "\n";
+#else
+ char newline[] = "\r\n";
+#endif
+
+ struct icalproperty_impl *impl = (struct icalproperty_impl*)prop;
+
+ icalerror_check_arg_rz( (prop!=0),"prop");
+
+ /* Append property name */
+
+ if (impl->kind == ICAL_X_PROPERTY && impl->x_name != 0){
+ property_name = impl->x_name;
+ } else {
+ property_name = icalenum_property_kind_to_string(impl->kind);
+ }
+
+ if (property_name == 0 ) {
+ icalerror_warn("Got a property of an unknown kind.");
+ icalmemory_free_buffer(buf);
+ return 0;
+
+ }
+
+
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, property_name);
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, newline);
+
+ /* Append parameters */
+ for(param = icalproperty_get_first_parameter(prop,ICAL_ANY_PARAMETER);
+ param != 0;
+ param = icalproperty_get_next_parameter(prop,ICAL_ANY_PARAMETER)) {
+
+ char* kind_string = icalparameter_as_ical_string(param);
+
+ if (kind_string == 0 ) {
+ char temp[TMP_BUF_SIZE];
+ snprintf(temp, TMP_BUF_SIZE,"Got a parameter of unknown kind in %s property",property_name);
+ icalerror_warn(temp);
+ continue;
+ }
+
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, " ;");
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, kind_string);
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, newline);
+
+ }
+
+ /* Append value */
+
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, " :");
+
+ value = icalproperty_get_value(prop);
+
+ if (value != 0){
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size,
+ icalvalue_as_ical_string(icalproperty_get_value(prop)));
+ } else {
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size,"ERROR: No Value");
+
+ }
+
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, newline);
+
+ /* Now, copy the buffer to a tmp_buffer, which is safe to give to
+ the caller without worring about de-allocating it. */
+
+
+ out_buf = icalmemory_tmp_buffer(strlen(buf)+1);
+ strcpy(out_buf, buf);
+
+ icalmemory_free_buffer(buf);
+
+ return out_buf;
+}
+
+
+
+icalproperty_kind
+icalproperty_isa (icalproperty* property)
+{
+ struct icalproperty_impl *p = (struct icalproperty_impl*)property;
+
+ if(property != 0){
+ return p->kind;
+ }
+
+ return ICAL_NO_PROPERTY;
+}
+
+int
+icalproperty_isa_property (void* property)
+{
+ struct icalproperty_impl *impl = (struct icalproperty_impl*)property;
+
+ icalerror_check_arg_rz( (property!=0), "property");
+
+ if (strcmp(impl->id,"prop") == 0) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+
+void
+icalproperty_add_parameter (icalproperty* prop,icalparameter* parameter)
+{
+ struct icalproperty_impl *p = (struct icalproperty_impl*)prop;
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+ icalerror_check_arg_rv( (parameter!=0),"parameter");
+
+ pvl_push(p->parameters, parameter);
+
+}
+
+
+void
+icalproperty_remove_parameter (icalproperty* prop, icalparameter_kind kind)
+{
+ icalerror_check_arg_rv((prop!=0),"prop");
+
+ assert(0); /* This routine is not implemented */
+}
+
+
+int
+icalproperty_count_parameters (icalproperty* prop)
+{
+ struct icalproperty_impl *p = (struct icalproperty_impl*)prop;
+
+ if(prop != 0){
+ return pvl_count(p->parameters);
+ }
+
+ icalerror_set_errno(ICAL_USAGE_ERROR);
+ return -1;
+}
+
+
+icalparameter*
+icalproperty_get_first_parameter (icalproperty* prop, icalparameter_kind kind)
+{
+ struct icalproperty_impl *p = (struct icalproperty_impl*)prop;
+
+ icalerror_check_arg_rz( (prop!=0),"prop");
+
+ p->parameter_iterator = pvl_head(p->parameters);
+
+ if (p->parameter_iterator == 0) {
+ return 0;
+ }
+
+ return (icalparameter*) pvl_data(p->parameter_iterator);
+}
+
+
+icalparameter*
+icalproperty_get_next_parameter (icalproperty* prop, icalparameter_kind kind)
+{
+ struct icalproperty_impl *p = (struct icalproperty_impl*)prop;
+ icalerror_check_arg_rz( (prop!=0),"prop");
+
+ if (p->parameter_iterator == 0 ) {
+ return 0;
+ }
+
+ p->parameter_iterator = pvl_next(p->parameter_iterator);
+
+ if (p->parameter_iterator == 0 ) {
+ return 0;
+ }
+
+ return (icalparameter*) pvl_data(p->parameter_iterator);
+}
+
+void
+icalproperty_set_value (icalproperty* prop, icalvalue* value)
+{
+ struct icalproperty_impl *p = (struct icalproperty_impl*)prop;
+
+ icalerror_check_arg_rv((prop !=0),"prop");
+ icalerror_check_arg_rv((value !=0),"value");
+
+ if (p->value != 0){
+ icalvalue_set_parent(p->value,0);
+ icalvalue_free(p->value);
+ p->value = 0;
+ }
+
+ p->value = value;
+
+ icalvalue_set_parent(value,prop);
+}
+
+
+icalvalue*
+icalproperty_get_value (icalproperty* prop)
+{
+ struct icalproperty_impl *p = (struct icalproperty_impl*)prop;
+
+ icalerror_check_arg_rz( (prop!=0),"prop");
+
+ return p->value;
+}
+
+
+void icalproperty_set_x_name(icalproperty* prop, char* name)
+{
+ struct icalproperty_impl *impl = (struct icalproperty_impl*)prop;
+
+ icalerror_check_arg_rv( (name!=0),"name");
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ if (impl->x_name != 0) {
+ free(impl->x_name);
+ }
+
+ impl->x_name = strdup(name);
+
+ if(impl->x_name == 0){
+ icalerror_set_errno(ICAL_ALLOCATION_ERROR);
+ }
+
+}
+
+char* icalproperty_get_x_name(icalproperty* prop){
+
+ struct icalproperty_impl *impl = (struct icalproperty_impl*)prop;
+
+ icalerror_check_arg_rz( (prop!=0),"prop");
+
+ return impl->x_name;
+}
+
+
+void icalproperty_set_parent(icalproperty* property,
+ icalcomponent* component)
+{
+ struct icalproperty_impl *impl = (struct icalproperty_impl*)property;
+
+ icalerror_check_arg_rv( (property!=0),"property");
+
+ impl->parent = component;
+}
+
+icalcomponent* icalproperty_get_parent(icalproperty* property)
+{
+ struct icalproperty_impl *impl = (struct icalproperty_impl*)property;
+
+ icalerror_check_arg_rv( (property!=0),"property");
+
+ return impl->parent;
+}
+
+
+/* Everything below this line is machine generated. Do not edit. */
+
+/* METHOD */
+
+icalproperty* icalproperty_new_method(icalproperty_method v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_METHOD_PROPERTY);
+
+
+ icalproperty_set_method((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_method(icalproperty_method v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_METHOD_PROPERTY);
+
+
+ icalproperty_set_method((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_method(icalproperty* prop, icalproperty_method v)
+{
+ icalvalue *value;
+
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_method(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+icalproperty_method icalproperty_get_method(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_method(value);
+}
+
+/* LAST-MODIFIED */
+
+icalproperty* icalproperty_new_lastmodified(struct icaltimetype v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_LASTMODIFIED_PROPERTY);
+
+
+ icalproperty_set_lastmodified((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_lastmodified(struct icaltimetype v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_LASTMODIFIED_PROPERTY);
+
+
+ icalproperty_set_lastmodified((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_lastmodified(icalproperty* prop, struct icaltimetype v)
+{
+ icalvalue *value;
+
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_datetime(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+struct icaltimetype icalproperty_get_lastmodified(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_datetime(value);
+}
+
+/* UID */
+
+icalproperty* icalproperty_new_uid(char* v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_UID_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_uid((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_uid(char* v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_UID_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_uid((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_uid(icalproperty* prop, char* v)
+{
+ icalvalue *value;
+
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_text(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+char* icalproperty_get_uid(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_text(value);
+}
+
+/* PRODID */
+
+icalproperty* icalproperty_new_prodid(char* v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_PRODID_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_prodid((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_prodid(char* v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_PRODID_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_prodid((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_prodid(icalproperty* prop, char* v)
+{
+ icalvalue *value;
+
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_text(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+char* icalproperty_get_prodid(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_text(value);
+}
+
+/* STATUS */
+
+icalproperty* icalproperty_new_status(char* v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_STATUS_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_status((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_status(char* v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_STATUS_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_status((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_status(icalproperty* prop, char* v)
+{
+ icalvalue *value;
+
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_text(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+char* icalproperty_get_status(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_text(value);
+}
+
+/* DESCRIPTION */
+
+icalproperty* icalproperty_new_description(char* v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_DESCRIPTION_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_description((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_description(char* v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_DESCRIPTION_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_description((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_description(icalproperty* prop, char* v)
+{
+ icalvalue *value;
+
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_text(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+char* icalproperty_get_description(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_text(value);
+}
+
+/* DURATION */
+
+icalproperty* icalproperty_new_duration(struct icaldurationtype v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_DURATION_PROPERTY);
+
+
+ icalproperty_set_duration((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_duration(struct icaldurationtype v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_DURATION_PROPERTY);
+
+
+ icalproperty_set_duration((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_duration(icalproperty* prop, struct icaldurationtype v)
+{
+ icalvalue *value;
+
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_duration(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+struct icaldurationtype icalproperty_get_duration(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_duration(value);
+}
+
+/* CATEGORIES */
+
+icalproperty* icalproperty_new_categories(char* v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_CATEGORIES_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_categories((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_categories(char* v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_CATEGORIES_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_categories((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_categories(icalproperty* prop, char* v)
+{
+ icalvalue *value;
+
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_text(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+char* icalproperty_get_categories(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_text(value);
+}
+
+/* VERSION */
+
+icalproperty* icalproperty_new_version(char* v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_VERSION_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_version((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_version(char* v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_VERSION_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_version((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_version(icalproperty* prop, char* v)
+{
+ icalvalue *value;
+
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_text(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+char* icalproperty_get_version(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_text(value);
+}
+
+/* TZOFFSETFROM */
+
+icalproperty* icalproperty_new_tzoffsetfrom(int v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_TZOFFSETFROM_PROPERTY);
+
+
+ icalproperty_set_tzoffsetfrom((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_tzoffsetfrom(int v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_TZOFFSETFROM_PROPERTY);
+
+
+ icalproperty_set_tzoffsetfrom((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_tzoffsetfrom(icalproperty* prop, int v)
+{
+ icalvalue *value;
+
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_utcoffset(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+int icalproperty_get_tzoffsetfrom(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_utcoffset(value);
+}
+
+/* RRULE */
+
+icalproperty* icalproperty_new_rrule(struct icalrecurrencetype v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_RRULE_PROPERTY);
+
+
+ icalproperty_set_rrule((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_rrule(struct icalrecurrencetype v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_RRULE_PROPERTY);
+
+
+ icalproperty_set_rrule((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_rrule(icalproperty* prop, struct icalrecurrencetype v)
+{
+ icalvalue *value;
+
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_recur(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+struct icalrecurrencetype icalproperty_get_rrule(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_recur(value);
+}
+
+/* ATTENDEE */
+
+icalproperty* icalproperty_new_attendee(char* v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_ATTENDEE_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_attendee((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_attendee(char* v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_ATTENDEE_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_attendee((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_attendee(icalproperty* prop, char* v)
+{
+ icalvalue *value;
+
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_caladdress(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+char* icalproperty_get_attendee(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_caladdress(value);
+}
+
+/* CONTACT */
+
+icalproperty* icalproperty_new_contact(char* v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_CONTACT_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_contact((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_contact(char* v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_CONTACT_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_contact((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_contact(icalproperty* prop, char* v)
+{
+ icalvalue *value;
+
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_text(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+char* icalproperty_get_contact(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_text(value);
+}
+
+/* RELATED-TO */
+
+icalproperty* icalproperty_new_relatedto(char* v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_RELATEDTO_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_relatedto((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_relatedto(char* v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_RELATEDTO_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_relatedto((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_relatedto(icalproperty* prop, char* v)
+{
+ icalvalue *value;
+
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_text(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+char* icalproperty_get_relatedto(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_text(value);
+}
+
+/* ORGANIZER */
+
+icalproperty* icalproperty_new_organizer(char* v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_ORGANIZER_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_organizer((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_organizer(char* v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_ORGANIZER_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_organizer((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_organizer(icalproperty* prop, char* v)
+{
+ icalvalue *value;
+
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_caladdress(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+char* icalproperty_get_organizer(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_caladdress(value);
+}
+
+/* COMMENT */
+
+icalproperty* icalproperty_new_comment(char* v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_COMMENT_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_comment((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_comment(char* v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_COMMENT_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_comment((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_comment(icalproperty* prop, char* v)
+{
+ icalvalue *value;
+
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_text(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+char* icalproperty_get_comment(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_text(value);
+}
+
+/* TRIGGER */
+
+icalproperty* icalproperty_new_trigger(union icaltriggertype v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_TRIGGER_PROPERTY);
+
+
+ icalproperty_set_trigger((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_trigger(union icaltriggertype v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_TRIGGER_PROPERTY);
+
+
+ icalproperty_set_trigger((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_trigger(icalproperty* prop, union icaltriggertype v)
+{
+ icalvalue *value;
+
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_trigger(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+union icaltriggertype icalproperty_get_trigger(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_trigger(value);
+}
+
+/* X-LIC-ERROR */
+
+icalproperty* icalproperty_new_xlicerror(char* v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_XLICERROR_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_xlicerror((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_xlicerror(char* v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_XLICERROR_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_xlicerror((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_xlicerror(icalproperty* prop, char* v)
+{
+ icalvalue *value;
+
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_text(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+char* icalproperty_get_xlicerror(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_text(value);
+}
+
+/* CLASS */
+
+icalproperty* icalproperty_new_class(char* v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_CLASS_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_class((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_class(char* v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_CLASS_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_class((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_class(icalproperty* prop, char* v)
+{
+ icalvalue *value;
+
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_text(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+char* icalproperty_get_class(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_text(value);
+}
+
+/* TZOFFSETTO */
+
+icalproperty* icalproperty_new_tzoffsetto(int v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_TZOFFSETTO_PROPERTY);
+
+
+ icalproperty_set_tzoffsetto((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_tzoffsetto(int v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_TZOFFSETTO_PROPERTY);
+
+
+ icalproperty_set_tzoffsetto((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_tzoffsetto(icalproperty* prop, int v)
+{
+ icalvalue *value;
+
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_utcoffset(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+int icalproperty_get_tzoffsetto(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_utcoffset(value);
+}
+
+/* TRANSP */
+
+icalproperty* icalproperty_new_transp(char* v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_TRANSP_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_transp((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_transp(char* v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_TRANSP_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_transp((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_transp(icalproperty* prop, char* v)
+{
+ icalvalue *value;
+
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_text(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+char* icalproperty_get_transp(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_text(value);
+}
+
+/* SEQUENCE */
+
+icalproperty* icalproperty_new_sequence(int v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_SEQUENCE_PROPERTY);
+
+
+ icalproperty_set_sequence((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_sequence(int v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_SEQUENCE_PROPERTY);
+
+
+ icalproperty_set_sequence((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_sequence(icalproperty* prop, int v)
+{
+ icalvalue *value;
+
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_integer(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+int icalproperty_get_sequence(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_integer(value);
+}
+
+/* LOCATION */
+
+icalproperty* icalproperty_new_location(char* v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_LOCATION_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_location((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_location(char* v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_LOCATION_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_location((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_location(icalproperty* prop, char* v)
+{
+ icalvalue *value;
+
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_text(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+char* icalproperty_get_location(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_text(value);
+}
+
+/* REQUEST-STATUS */
+
+icalproperty* icalproperty_new_requeststatus(char* v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_REQUESTSTATUS_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_requeststatus((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_requeststatus(char* v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_REQUESTSTATUS_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_requeststatus((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_requeststatus(icalproperty* prop, char* v)
+{
+ icalvalue *value;
+
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_string(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+char* icalproperty_get_requeststatus(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_string(value);
+}
+
+/* EXDATE */
+
+icalproperty* icalproperty_new_exdate(struct icaltimetype v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_EXDATE_PROPERTY);
+
+
+ icalproperty_set_exdate((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_exdate(struct icaltimetype v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_EXDATE_PROPERTY);
+
+
+ icalproperty_set_exdate((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_exdate(icalproperty* prop, struct icaltimetype v)
+{
+ icalvalue *value;
+
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_datetimedate(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+struct icaltimetype icalproperty_get_exdate(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_datetimedate(value);
+}
+
+/* TZID */
+
+icalproperty* icalproperty_new_tzid(char* v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_TZID_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_tzid((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_tzid(char* v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_TZID_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_tzid((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_tzid(icalproperty* prop, char* v)
+{
+ icalvalue *value;
+
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_text(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+char* icalproperty_get_tzid(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_text(value);
+}
+
+/* RESOURCES */
+
+icalproperty* icalproperty_new_resources(char* v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_RESOURCES_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_resources((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_resources(char* v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_RESOURCES_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_resources((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_resources(icalproperty* prop, char* v)
+{
+ icalvalue *value;
+
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_text(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+char* icalproperty_get_resources(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_text(value);
+}
+
+/* TZURL */
+
+icalproperty* icalproperty_new_tzurl(char* v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_TZURL_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_tzurl((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_tzurl(char* v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_TZURL_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_tzurl((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_tzurl(icalproperty* prop, char* v)
+{
+ icalvalue *value;
+
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_uri(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+char* icalproperty_get_tzurl(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_uri(value);
+}
+
+/* REPEAT */
+
+icalproperty* icalproperty_new_repeat(int v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_REPEAT_PROPERTY);
+
+
+ icalproperty_set_repeat((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_repeat(int v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_REPEAT_PROPERTY);
+
+
+ icalproperty_set_repeat((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_repeat(icalproperty* prop, int v)
+{
+ icalvalue *value;
+
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_integer(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+int icalproperty_get_repeat(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_integer(value);
+}
+
+/* PRIORITY */
+
+icalproperty* icalproperty_new_priority(int v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_PRIORITY_PROPERTY);
+
+
+ icalproperty_set_priority((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_priority(int v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_PRIORITY_PROPERTY);
+
+
+ icalproperty_set_priority((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_priority(icalproperty* prop, int v)
+{
+ icalvalue *value;
+
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_integer(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+int icalproperty_get_priority(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_integer(value);
+}
+
+/* FREEBUSY */
+
+icalproperty* icalproperty_new_freebusy(struct icalperiodtype v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_FREEBUSY_PROPERTY);
+
+
+ icalproperty_set_freebusy((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_freebusy(struct icalperiodtype v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_FREEBUSY_PROPERTY);
+
+
+ icalproperty_set_freebusy((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_freebusy(icalproperty* prop, struct icalperiodtype v)
+{
+ icalvalue *value;
+
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_period(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+struct icalperiodtype icalproperty_get_freebusy(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_period(value);
+}
+
+/* DTSTART */
+
+icalproperty* icalproperty_new_dtstart(struct icaltimetype v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_DTSTART_PROPERTY);
+
+
+ icalproperty_set_dtstart((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_dtstart(struct icaltimetype v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_DTSTART_PROPERTY);
+
+
+ icalproperty_set_dtstart((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_dtstart(icalproperty* prop, struct icaltimetype v)
+{
+ icalvalue *value;
+
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_datetimedate(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+struct icaltimetype icalproperty_get_dtstart(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_datetimedate(value);
+}
+
+/* RECURRENCE-ID */
+
+icalproperty* icalproperty_new_recurrenceid(struct icaltimetype v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_RECURRENCEID_PROPERTY);
+
+
+ icalproperty_set_recurrenceid((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_recurrenceid(struct icaltimetype v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_RECURRENCEID_PROPERTY);
+
+
+ icalproperty_set_recurrenceid((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_recurrenceid(icalproperty* prop, struct icaltimetype v)
+{
+ icalvalue *value;
+
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_datetimedate(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+struct icaltimetype icalproperty_get_recurrenceid(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_datetimedate(value);
+}
+
+/* SUMMARY */
+
+icalproperty* icalproperty_new_summary(char* v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_SUMMARY_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_summary((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_summary(char* v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_SUMMARY_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_summary((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_summary(icalproperty* prop, char* v)
+{
+ icalvalue *value;
+
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_text(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+char* icalproperty_get_summary(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_text(value);
+}
+
+/* DTEND */
+
+icalproperty* icalproperty_new_dtend(struct icaltimetype v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_DTEND_PROPERTY);
+
+
+ icalproperty_set_dtend((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_dtend(struct icaltimetype v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_DTEND_PROPERTY);
+
+
+ icalproperty_set_dtend((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_dtend(icalproperty* prop, struct icaltimetype v)
+{
+ icalvalue *value;
+
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_datetimedate(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+struct icaltimetype icalproperty_get_dtend(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_datetimedate(value);
+}
+
+/* TZNAME */
+
+icalproperty* icalproperty_new_tzname(char* v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_TZNAME_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_tzname((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_tzname(char* v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_TZNAME_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_tzname((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_tzname(icalproperty* prop, char* v)
+{
+ icalvalue *value;
+
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_text(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+char* icalproperty_get_tzname(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_text(value);
+}
+
+/* RDATE */
+
+icalproperty* icalproperty_new_rdate(struct icalperiodtype v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_RDATE_PROPERTY);
+
+
+ icalproperty_set_rdate((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_rdate(struct icalperiodtype v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_RDATE_PROPERTY);
+
+
+ icalproperty_set_rdate((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_rdate(icalproperty* prop, struct icalperiodtype v)
+{
+ icalvalue *value;
+
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_datetimeperiod(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+struct icalperiodtype icalproperty_get_rdate(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_datetimeperiod(value);
+}
+
+/* URL */
+
+icalproperty* icalproperty_new_url(char* v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_URL_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_url((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_url(char* v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_URL_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_url((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_url(icalproperty* prop, char* v)
+{
+ icalvalue *value;
+
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_uri(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+char* icalproperty_get_url(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_uri(value);
+}
+
+/* ATTACH */
+
+icalproperty* icalproperty_new_attach(struct icalattachtype v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_ATTACH_PROPERTY);
+
+
+ icalproperty_set_attach((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_attach(struct icalattachtype v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_ATTACH_PROPERTY);
+
+
+ icalproperty_set_attach((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_attach(icalproperty* prop, struct icalattachtype v)
+{
+ icalvalue *value;
+
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_attach(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+struct icalattachtype icalproperty_get_attach(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_attach(value);
+}
+
+/* X-LIC-CLUSTERCOUNT */
+
+icalproperty* icalproperty_new_xlicclustercount(int v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_XLICCLUSTERCOUNT_PROPERTY);
+
+
+ icalproperty_set_xlicclustercount((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_xlicclustercount(int v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_XLICCLUSTERCOUNT_PROPERTY);
+
+
+ icalproperty_set_xlicclustercount((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_xlicclustercount(icalproperty* prop, int v)
+{
+ icalvalue *value;
+
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_integer(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+int icalproperty_get_xlicclustercount(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_integer(value);
+}
+
+/* EXRULE */
+
+icalproperty* icalproperty_new_exrule(struct icalrecurrencetype v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_EXRULE_PROPERTY);
+
+
+ icalproperty_set_exrule((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_exrule(struct icalrecurrencetype v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_EXRULE_PROPERTY);
+
+
+ icalproperty_set_exrule((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_exrule(icalproperty* prop, struct icalrecurrencetype v)
+{
+ icalvalue *value;
+
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_recur(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+struct icalrecurrencetype icalproperty_get_exrule(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_recur(value);
+}
+
+/* QUERY */
+
+icalproperty* icalproperty_new_query(char* v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_QUERY_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_query((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_query(char* v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_QUERY_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_query((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_query(icalproperty* prop, char* v)
+{
+ icalvalue *value;
+
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_query(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+char* icalproperty_get_query(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_query(value);
+}
+
+/* PERCENT-COMPLETE */
+
+icalproperty* icalproperty_new_percentcomplete(int v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_PERCENTCOMPLETE_PROPERTY);
+
+
+ icalproperty_set_percentcomplete((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_percentcomplete(int v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_PERCENTCOMPLETE_PROPERTY);
+
+
+ icalproperty_set_percentcomplete((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_percentcomplete(icalproperty* prop, int v)
+{
+ icalvalue *value;
+
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_integer(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+int icalproperty_get_percentcomplete(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_integer(value);
+}
+
+/* CALSCALE */
+
+icalproperty* icalproperty_new_calscale(char* v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_CALSCALE_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_calscale((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_calscale(char* v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_CALSCALE_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_calscale((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_calscale(icalproperty* prop, char* v)
+{
+ icalvalue *value;
+
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_text(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+char* icalproperty_get_calscale(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_text(value);
+}
+
+/* CREATED */
+
+icalproperty* icalproperty_new_created(struct icaltimetype v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_CREATED_PROPERTY);
+
+
+ icalproperty_set_created((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_created(struct icaltimetype v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_CREATED_PROPERTY);
+
+
+ icalproperty_set_created((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_created(icalproperty* prop, struct icaltimetype v)
+{
+ icalvalue *value;
+
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_datetime(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+struct icaltimetype icalproperty_get_created(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_datetime(value);
+}
+
+/* GEO */
+
+icalproperty* icalproperty_new_geo(struct icalgeotype v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_GEO_PROPERTY);
+
+
+ icalproperty_set_geo((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_geo(struct icalgeotype v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_GEO_PROPERTY);
+
+
+ icalproperty_set_geo((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_geo(icalproperty* prop, struct icalgeotype v)
+{
+ icalvalue *value;
+
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_geo(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+struct icalgeotype icalproperty_get_geo(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_geo(value);
+}
+
+/* COMPLETED */
+
+icalproperty* icalproperty_new_completed(struct icaltimetype v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_COMPLETED_PROPERTY);
+
+
+ icalproperty_set_completed((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_completed(struct icaltimetype v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_COMPLETED_PROPERTY);
+
+
+ icalproperty_set_completed((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_completed(icalproperty* prop, struct icaltimetype v)
+{
+ icalvalue *value;
+
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_datetime(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+struct icaltimetype icalproperty_get_completed(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_datetime(value);
+}
+
+/* DTSTAMP */
+
+icalproperty* icalproperty_new_dtstamp(struct icaltimetype v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_DTSTAMP_PROPERTY);
+
+
+ icalproperty_set_dtstamp((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_dtstamp(struct icaltimetype v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_DTSTAMP_PROPERTY);
+
+
+ icalproperty_set_dtstamp((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_dtstamp(icalproperty* prop, struct icaltimetype v)
+{
+ icalvalue *value;
+
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_datetime(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+struct icaltimetype icalproperty_get_dtstamp(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_datetime(value);
+}
+
+/* DUE */
+
+icalproperty* icalproperty_new_due(struct icaltimetype v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_DUE_PROPERTY);
+
+
+ icalproperty_set_due((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_due(struct icaltimetype v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_DUE_PROPERTY);
+
+
+ icalproperty_set_due((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_due(icalproperty* prop, struct icaltimetype v)
+{
+ icalvalue *value;
+
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_datetimedate(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+struct icaltimetype icalproperty_get_due(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_datetimedate(value);
+}
+
+/* ACTION */
+
+icalproperty* icalproperty_new_action(char* v)
+{
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_ACTION_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_action((icalproperty*)impl,v);
+
+ return (icalproperty*)impl;
+}
+
+icalproperty* icalproperty_vanew_action(char* v, ...)
+{
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_ACTION_PROPERTY);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+
+ icalproperty_set_action((icalproperty*)impl,v);
+
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+
+ return (icalproperty*)impl;
+}
+
+void icalproperty_set_action(icalproperty* prop, char* v)
+{
+ icalvalue *value;
+
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ value = icalvalue_new_text(v);
+
+ icalproperty_set_value(prop,value);
+
+}
+
+char* icalproperty_get_action(icalproperty* prop)
+{
+ icalvalue *value;
+ icalerror_check_arg( (prop!=0),"prop");
+
+ value = icalproperty_get_value(prop);
+
+ return icalvalue_get_text(value);
+}
diff --git a/libical/src/libical/icalproperty.h b/libical/src/libical/icalproperty.h
new file mode 100644
index 0000000000..2cd28fe179
--- /dev/null
+++ b/libical/src/libical/icalproperty.h
@@ -0,0 +1,368 @@
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: icalderivedproperties.{c,h}
+ CREATOR: eric 09 May 1999
+
+ $Id$
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+
+ ======================================================================*/
+
+
+#ifndef ICALPROPERTY_H
+#define ICALPROPERTY_H
+
+#include <time.h>
+
+typedef void icalproperty;
+
+icalproperty* icalproperty_new(icalproperty_kind kind);
+
+icalproperty* icalproperty_new_clone(icalproperty * prop);
+
+icalproperty* icalproperty_new_from_string(char* str);
+
+char* icalproperty_as_ical_string(icalproperty* prop);
+
+void icalproperty_free(icalproperty* prop);
+
+icalproperty_kind icalproperty_isa(icalproperty* property);
+int icalproperty_isa_property(void* property);
+
+void icalproperty_add_parameter(icalproperty* prop,icalparameter* parameter);
+
+void icalproperty_remove_parameter(icalproperty* prop,
+ icalparameter_kind kind);
+
+int icalproperty_count_parameters(icalproperty* prop);
+
+/* Iterate through the parameters */
+icalparameter* icalproperty_get_first_parameter(icalproperty* prop,
+ icalparameter_kind kind);
+icalparameter* icalproperty_get_next_parameter(icalproperty* prop,
+ icalparameter_kind kind);
+/* Access the value of the property */
+void icalproperty_set_value(icalproperty* prop, icalvalue* value);
+icalvalue* icalproperty_get_value(icalproperty* prop);
+
+/* Deal with X properties */
+
+void icalproperty_set_x_name(icalproperty* prop, char* name);
+char* icalproperty_get_x_name(icalproperty* prop);
+
+
+/* Everything below this line is machine generated. Do not edit. */
+
+/* METHOD */
+icalproperty* icalproperty_new_method(icalproperty_method v);
+icalproperty* icalproperty_vanew_method(icalproperty_method v, ...);
+void icalproperty_set_method(icalproperty* prop, icalproperty_method v);
+icalproperty_method icalproperty_get_method(icalproperty* prop);
+
+/* LAST-MODIFIED */
+icalproperty* icalproperty_new_lastmodified(struct icaltimetype v);
+icalproperty* icalproperty_vanew_lastmodified(struct icaltimetype v, ...);
+void icalproperty_set_lastmodified(icalproperty* prop, struct icaltimetype v);
+struct icaltimetype icalproperty_get_lastmodified(icalproperty* prop);
+
+/* UID */
+icalproperty* icalproperty_new_uid(char* v);
+icalproperty* icalproperty_vanew_uid(char* v, ...);
+void icalproperty_set_uid(icalproperty* prop, char* v);
+char* icalproperty_get_uid(icalproperty* prop);
+
+/* PRODID */
+icalproperty* icalproperty_new_prodid(char* v);
+icalproperty* icalproperty_vanew_prodid(char* v, ...);
+void icalproperty_set_prodid(icalproperty* prop, char* v);
+char* icalproperty_get_prodid(icalproperty* prop);
+
+/* STATUS */
+icalproperty* icalproperty_new_status(char* v);
+icalproperty* icalproperty_vanew_status(char* v, ...);
+void icalproperty_set_status(icalproperty* prop, char* v);
+char* icalproperty_get_status(icalproperty* prop);
+
+/* DESCRIPTION */
+icalproperty* icalproperty_new_description(char* v);
+icalproperty* icalproperty_vanew_description(char* v, ...);
+void icalproperty_set_description(icalproperty* prop, char* v);
+char* icalproperty_get_description(icalproperty* prop);
+
+/* DURATION */
+icalproperty* icalproperty_new_duration(struct icaldurationtype v);
+icalproperty* icalproperty_vanew_duration(struct icaldurationtype v, ...);
+void icalproperty_set_duration(icalproperty* prop, struct icaldurationtype v);
+struct icaldurationtype icalproperty_get_duration(icalproperty* prop);
+
+/* CATEGORIES */
+icalproperty* icalproperty_new_categories(char* v);
+icalproperty* icalproperty_vanew_categories(char* v, ...);
+void icalproperty_set_categories(icalproperty* prop, char* v);
+char* icalproperty_get_categories(icalproperty* prop);
+
+/* VERSION */
+icalproperty* icalproperty_new_version(char* v);
+icalproperty* icalproperty_vanew_version(char* v, ...);
+void icalproperty_set_version(icalproperty* prop, char* v);
+char* icalproperty_get_version(icalproperty* prop);
+
+/* TZOFFSETFROM */
+icalproperty* icalproperty_new_tzoffsetfrom(int v);
+icalproperty* icalproperty_vanew_tzoffsetfrom(int v, ...);
+void icalproperty_set_tzoffsetfrom(icalproperty* prop, int v);
+int icalproperty_get_tzoffsetfrom(icalproperty* prop);
+
+/* RRULE */
+icalproperty* icalproperty_new_rrule(struct icalrecurrencetype v);
+icalproperty* icalproperty_vanew_rrule(struct icalrecurrencetype v, ...);
+void icalproperty_set_rrule(icalproperty* prop, struct icalrecurrencetype v);
+struct icalrecurrencetype icalproperty_get_rrule(icalproperty* prop);
+
+/* ATTENDEE */
+icalproperty* icalproperty_new_attendee(char* v);
+icalproperty* icalproperty_vanew_attendee(char* v, ...);
+void icalproperty_set_attendee(icalproperty* prop, char* v);
+char* icalproperty_get_attendee(icalproperty* prop);
+
+/* CONTACT */
+icalproperty* icalproperty_new_contact(char* v);
+icalproperty* icalproperty_vanew_contact(char* v, ...);
+void icalproperty_set_contact(icalproperty* prop, char* v);
+char* icalproperty_get_contact(icalproperty* prop);
+
+/* RELATED-TO */
+icalproperty* icalproperty_new_relatedto(char* v);
+icalproperty* icalproperty_vanew_relatedto(char* v, ...);
+void icalproperty_set_relatedto(icalproperty* prop, char* v);
+char* icalproperty_get_relatedto(icalproperty* prop);
+
+/* ORGANIZER */
+icalproperty* icalproperty_new_organizer(char* v);
+icalproperty* icalproperty_vanew_organizer(char* v, ...);
+void icalproperty_set_organizer(icalproperty* prop, char* v);
+char* icalproperty_get_organizer(icalproperty* prop);
+
+/* COMMENT */
+icalproperty* icalproperty_new_comment(char* v);
+icalproperty* icalproperty_vanew_comment(char* v, ...);
+void icalproperty_set_comment(icalproperty* prop, char* v);
+char* icalproperty_get_comment(icalproperty* prop);
+
+/* TRIGGER */
+icalproperty* icalproperty_new_trigger(union icaltriggertype v);
+icalproperty* icalproperty_vanew_trigger(union icaltriggertype v, ...);
+void icalproperty_set_trigger(icalproperty* prop, union icaltriggertype v);
+union icaltriggertype icalproperty_get_trigger(icalproperty* prop);
+
+/* X-LIC-ERROR */
+icalproperty* icalproperty_new_xlicerror(char* v);
+icalproperty* icalproperty_vanew_xlicerror(char* v, ...);
+void icalproperty_set_xlicerror(icalproperty* prop, char* v);
+char* icalproperty_get_xlicerror(icalproperty* prop);
+
+/* CLASS */
+icalproperty* icalproperty_new_class(char* v);
+icalproperty* icalproperty_vanew_class(char* v, ...);
+void icalproperty_set_class(icalproperty* prop, char* v);
+char* icalproperty_get_class(icalproperty* prop);
+
+/* TZOFFSETTO */
+icalproperty* icalproperty_new_tzoffsetto(int v);
+icalproperty* icalproperty_vanew_tzoffsetto(int v, ...);
+void icalproperty_set_tzoffsetto(icalproperty* prop, int v);
+int icalproperty_get_tzoffsetto(icalproperty* prop);
+
+/* TRANSP */
+icalproperty* icalproperty_new_transp(char* v);
+icalproperty* icalproperty_vanew_transp(char* v, ...);
+void icalproperty_set_transp(icalproperty* prop, char* v);
+char* icalproperty_get_transp(icalproperty* prop);
+
+/* SEQUENCE */
+icalproperty* icalproperty_new_sequence(int v);
+icalproperty* icalproperty_vanew_sequence(int v, ...);
+void icalproperty_set_sequence(icalproperty* prop, int v);
+int icalproperty_get_sequence(icalproperty* prop);
+
+/* LOCATION */
+icalproperty* icalproperty_new_location(char* v);
+icalproperty* icalproperty_vanew_location(char* v, ...);
+void icalproperty_set_location(icalproperty* prop, char* v);
+char* icalproperty_get_location(icalproperty* prop);
+
+/* REQUEST-STATUS */
+icalproperty* icalproperty_new_requeststatus(char* v);
+icalproperty* icalproperty_vanew_requeststatus(char* v, ...);
+void icalproperty_set_requeststatus(icalproperty* prop, char* v);
+char* icalproperty_get_requeststatus(icalproperty* prop);
+
+/* EXDATE */
+icalproperty* icalproperty_new_exdate(struct icaltimetype v);
+icalproperty* icalproperty_vanew_exdate(struct icaltimetype v, ...);
+void icalproperty_set_exdate(icalproperty* prop, struct icaltimetype v);
+struct icaltimetype icalproperty_get_exdate(icalproperty* prop);
+
+/* TZID */
+icalproperty* icalproperty_new_tzid(char* v);
+icalproperty* icalproperty_vanew_tzid(char* v, ...);
+void icalproperty_set_tzid(icalproperty* prop, char* v);
+char* icalproperty_get_tzid(icalproperty* prop);
+
+/* RESOURCES */
+icalproperty* icalproperty_new_resources(char* v);
+icalproperty* icalproperty_vanew_resources(char* v, ...);
+void icalproperty_set_resources(icalproperty* prop, char* v);
+char* icalproperty_get_resources(icalproperty* prop);
+
+/* TZURL */
+icalproperty* icalproperty_new_tzurl(char* v);
+icalproperty* icalproperty_vanew_tzurl(char* v, ...);
+void icalproperty_set_tzurl(icalproperty* prop, char* v);
+char* icalproperty_get_tzurl(icalproperty* prop);
+
+/* REPEAT */
+icalproperty* icalproperty_new_repeat(int v);
+icalproperty* icalproperty_vanew_repeat(int v, ...);
+void icalproperty_set_repeat(icalproperty* prop, int v);
+int icalproperty_get_repeat(icalproperty* prop);
+
+/* PRIORITY */
+icalproperty* icalproperty_new_priority(int v);
+icalproperty* icalproperty_vanew_priority(int v, ...);
+void icalproperty_set_priority(icalproperty* prop, int v);
+int icalproperty_get_priority(icalproperty* prop);
+
+/* FREEBUSY */
+icalproperty* icalproperty_new_freebusy(struct icalperiodtype v);
+icalproperty* icalproperty_vanew_freebusy(struct icalperiodtype v, ...);
+void icalproperty_set_freebusy(icalproperty* prop, struct icalperiodtype v);
+struct icalperiodtype icalproperty_get_freebusy(icalproperty* prop);
+
+/* DTSTART */
+icalproperty* icalproperty_new_dtstart(struct icaltimetype v);
+icalproperty* icalproperty_vanew_dtstart(struct icaltimetype v, ...);
+void icalproperty_set_dtstart(icalproperty* prop, struct icaltimetype v);
+struct icaltimetype icalproperty_get_dtstart(icalproperty* prop);
+
+/* RECURRENCE-ID */
+icalproperty* icalproperty_new_recurrenceid(struct icaltimetype v);
+icalproperty* icalproperty_vanew_recurrenceid(struct icaltimetype v, ...);
+void icalproperty_set_recurrenceid(icalproperty* prop, struct icaltimetype v);
+struct icaltimetype icalproperty_get_recurrenceid(icalproperty* prop);
+
+/* SUMMARY */
+icalproperty* icalproperty_new_summary(char* v);
+icalproperty* icalproperty_vanew_summary(char* v, ...);
+void icalproperty_set_summary(icalproperty* prop, char* v);
+char* icalproperty_get_summary(icalproperty* prop);
+
+/* DTEND */
+icalproperty* icalproperty_new_dtend(struct icaltimetype v);
+icalproperty* icalproperty_vanew_dtend(struct icaltimetype v, ...);
+void icalproperty_set_dtend(icalproperty* prop, struct icaltimetype v);
+struct icaltimetype icalproperty_get_dtend(icalproperty* prop);
+
+/* TZNAME */
+icalproperty* icalproperty_new_tzname(char* v);
+icalproperty* icalproperty_vanew_tzname(char* v, ...);
+void icalproperty_set_tzname(icalproperty* prop, char* v);
+char* icalproperty_get_tzname(icalproperty* prop);
+
+/* RDATE */
+icalproperty* icalproperty_new_rdate(struct icalperiodtype v);
+icalproperty* icalproperty_vanew_rdate(struct icalperiodtype v, ...);
+void icalproperty_set_rdate(icalproperty* prop, struct icalperiodtype v);
+struct icalperiodtype icalproperty_get_rdate(icalproperty* prop);
+
+/* URL */
+icalproperty* icalproperty_new_url(char* v);
+icalproperty* icalproperty_vanew_url(char* v, ...);
+void icalproperty_set_url(icalproperty* prop, char* v);
+char* icalproperty_get_url(icalproperty* prop);
+
+/* ATTACH */
+icalproperty* icalproperty_new_attach(struct icalattachtype v);
+icalproperty* icalproperty_vanew_attach(struct icalattachtype v, ...);
+void icalproperty_set_attach(icalproperty* prop, struct icalattachtype v);
+struct icalattachtype icalproperty_get_attach(icalproperty* prop);
+
+/* X-LIC-CLUSTERCOUNT */
+icalproperty* icalproperty_new_xlicclustercount(int v);
+icalproperty* icalproperty_vanew_xlicclustercount(int v, ...);
+void icalproperty_set_xlicclustercount(icalproperty* prop, int v);
+int icalproperty_get_xlicclustercount(icalproperty* prop);
+
+/* EXRULE */
+icalproperty* icalproperty_new_exrule(struct icalrecurrencetype v);
+icalproperty* icalproperty_vanew_exrule(struct icalrecurrencetype v, ...);
+void icalproperty_set_exrule(icalproperty* prop, struct icalrecurrencetype v);
+struct icalrecurrencetype icalproperty_get_exrule(icalproperty* prop);
+
+/* QUERY */
+icalproperty* icalproperty_new_query(char* v);
+icalproperty* icalproperty_vanew_query(char* v, ...);
+void icalproperty_set_query(icalproperty* prop, char* v);
+char* icalproperty_get_query(icalproperty* prop);
+
+/* PERCENT-COMPLETE */
+icalproperty* icalproperty_new_percentcomplete(int v);
+icalproperty* icalproperty_vanew_percentcomplete(int v, ...);
+void icalproperty_set_percentcomplete(icalproperty* prop, int v);
+int icalproperty_get_percentcomplete(icalproperty* prop);
+
+/* CALSCALE */
+icalproperty* icalproperty_new_calscale(char* v);
+icalproperty* icalproperty_vanew_calscale(char* v, ...);
+void icalproperty_set_calscale(icalproperty* prop, char* v);
+char* icalproperty_get_calscale(icalproperty* prop);
+
+/* CREATED */
+icalproperty* icalproperty_new_created(struct icaltimetype v);
+icalproperty* icalproperty_vanew_created(struct icaltimetype v, ...);
+void icalproperty_set_created(icalproperty* prop, struct icaltimetype v);
+struct icaltimetype icalproperty_get_created(icalproperty* prop);
+
+/* GEO */
+icalproperty* icalproperty_new_geo(struct icalgeotype v);
+icalproperty* icalproperty_vanew_geo(struct icalgeotype v, ...);
+void icalproperty_set_geo(icalproperty* prop, struct icalgeotype v);
+struct icalgeotype icalproperty_get_geo(icalproperty* prop);
+
+/* COMPLETED */
+icalproperty* icalproperty_new_completed(struct icaltimetype v);
+icalproperty* icalproperty_vanew_completed(struct icaltimetype v, ...);
+void icalproperty_set_completed(icalproperty* prop, struct icaltimetype v);
+struct icaltimetype icalproperty_get_completed(icalproperty* prop);
+
+/* DTSTAMP */
+icalproperty* icalproperty_new_dtstamp(struct icaltimetype v);
+icalproperty* icalproperty_vanew_dtstamp(struct icaltimetype v, ...);
+void icalproperty_set_dtstamp(icalproperty* prop, struct icaltimetype v);
+struct icaltimetype icalproperty_get_dtstamp(icalproperty* prop);
+
+/* DUE */
+icalproperty* icalproperty_new_due(struct icaltimetype v);
+icalproperty* icalproperty_vanew_due(struct icaltimetype v, ...);
+void icalproperty_set_due(icalproperty* prop, struct icaltimetype v);
+struct icaltimetype icalproperty_get_due(icalproperty* prop);
+
+/* ACTION */
+icalproperty* icalproperty_new_action(char* v);
+icalproperty* icalproperty_vanew_action(char* v, ...);
+void icalproperty_set_action(icalproperty* prop, char* v);
+char* icalproperty_get_action(icalproperty* prop);
+#endif ICALPROPERTY_H
diff --git a/libical/src/libical/icalrestriction.c b/libical/src/libical/icalrestriction.c
new file mode 100644
index 0000000000..d5ffb784ef
--- /dev/null
+++ b/libical/src/libical/icalrestriction.c
@@ -0,0 +1,1590 @@
+/* -*- Mode: C -*- */
+/* ======================================================================
+ File: icalrestriction.c
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+
+ ======================================================================*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "icalenums.h"
+#include "icalrestriction.h"
+
+#define TMP_BUF_SIZE 1024
+
+/* Define the structs for the restrictions. these data are filled out
+in machine generated code below */
+
+typedef int (*restriction_func)(icalcomponent* comp);
+
+typedef struct icalrestriction_property_record {
+ icalproperty_method method;
+ icalcomponent_kind component;
+ icalproperty_kind property;
+ icalrestriction_kind restriction;
+ restriction_func function;
+} icalrestriction_property_record;
+
+
+typedef struct icalrestriction_component_record {
+ icalproperty_method method;
+ icalcomponent_kind component;
+ icalcomponent_kind subcomponent;
+ icalrestriction_kind restriction;
+ restriction_func function;
+} icalrestriction_component_record;
+
+icalrestriction_component_record icalrestriction_component_records[];
+icalrestriction_property_record icalrestriction_property_records[];
+
+/* The each row gives the result of comparing a restriction against a
+ count. The columns in each row represent 0,1,2+. '-1' indicates
+ 'invalid, 'don't care' or 'needs more analysis' So, for
+ ICAL_RESTRICTION_ONE, if there is 1 of a property with that
+ restriction, it passes, but if there are 0 or 2+, it fails. */
+
+char compare_map[ICAL_RESTRICTION_UNKNOWN+1][3] = {
+ { 1, 1, 1},/*ICAL_RESTRICTION_NONE*/
+ { 1, 0, 0},/*ICAL_RESTRICTION_ZERO*/
+ { 0, 1, 0},/*ICAL_RESTRICTION_ONE*/
+ { 1, 1, 1},/*ICAL_RESTRICTION_ZEROPLUS*/
+ { 0, 1, 1},/*ICAL_RESTRICTION_ONEPLUS*/
+ { 1, 1, 0},/*ICAL_RESTRICTION_ZEROORONE*/
+ { 1, 1, 0},/*ICAL_RESTRICTION_ONEEXCLUSIVE*/
+ { 1, 1, 0},/*ICAL_RESTRICTION_ONEMUTUAL*/
+ { 1, 1, 1} /*ICAL_RESTRICTION_UNKNOWN*/
+};
+
+char restr_string_map[ICAL_RESTRICTION_UNKNOWN+1][60] = {
+ "unknown number",/*ICAL_RESTRICTION_NONE*/
+ "0",/*ICAL_RESTRICTION_ZERO*/
+ "1",/*ICAL_RESTRICTION_ONE*/
+ "zero or more",/*ICAL_RESTRICTION_ZEROPLUS*/
+ "one or more" ,/*ICAL_RESTRICTION_ONEPLUS*/
+ "zero or more",/*ICAL_RESTRICTION_ZEROORONE*/
+ "zero or one, exclusive with another property",/*ICAL_RESTRICTION_ONEEXCLUSIVE*/
+ "zero or one, mutual with another property",/*ICAL_RESTRICTION_ONEMUTUAL*/
+ "unknown number" /*ICAL_RESTRICTION_UNKNOWN*/
+};
+
+
+int
+icalrestriction_compare(icalrestriction_kind restr, int count){
+
+ if ( restr < ICAL_RESTRICTION_NONE || restr > ICAL_RESTRICTION_UNKNOWN
+ || count < 0){
+ return -1;
+ }
+
+ if (count > 2) {
+ count = 2;
+ }
+
+ return compare_map[restr][count];
+
+}
+
+int icalrestriction_check_component(icalproperty_method method,
+ icalcomponent* comp)
+{
+ icalproperty_kind kind;
+ icalcomponent_kind comp_kind;
+ icalrestriction_kind restr;
+ int count;
+ int compare;
+ int valid = 1;
+
+ comp_kind = icalcomponent_isa(comp);
+
+ /* Check all of the properties in this component */
+
+ for(kind = ICAL_ANY_PROPERTY+1; kind != ICAL_NO_PROPERTY; kind++){
+ count = icalcomponent_count_properties(comp, kind);
+
+ restr = icalrestriction_get_property_restriction(method,
+ comp_kind,
+ kind);
+
+
+ if(restr == ICAL_RESTRICTION_ONEEXCLUSIVE ) {
+ /* HACK. Treat this as a 0/1 restriction */
+ restr = ICAL_RESTRICTION_ZEROORONE;
+ compare = icalrestriction_compare(restr,count);
+ } else if (restr == ICAL_RESTRICTION_ONEMUTUAL ) {
+ /* HACK. Treat this as a 0/1 restriction */
+ restr = ICAL_RESTRICTION_ZEROORONE;
+ compare = icalrestriction_compare(restr,count);
+ } else {
+ compare = icalrestriction_compare(restr,count);
+ }
+
+ assert(compare != -1);
+
+
+ if (compare == 0){
+ char temp[TMP_BUF_SIZE];
+
+ snprintf(temp, TMP_BUF_SIZE,"Failed iTIP restrictions for property %s. Expected %s instances of the property and got %d",
+ icalenum_property_kind_to_string(kind),
+ restr_string_map[restr], count);
+
+ icalcomponent_add_property
+ (comp,
+ icalproperty_vanew_xlicerror(
+ temp,
+ icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_INVALIDITIP),
+ 0));
+ }
+
+
+ valid = valid && compare;
+ }
+
+
+
+ return valid;
+
+
+}
+
+int icalrestriction_check(icalcomponent* outer_comp)
+{
+ icalcomponent_kind comp_kind;
+ icalproperty_method method;
+ icalcomponent* inner_comp;
+ icalproperty *method_prop;
+ int valid;
+
+ icalerror_check_arg_rz( (outer_comp!=0), "outer comp");
+
+
+ /* Get the Method value from the outer component */
+
+ comp_kind = icalcomponent_isa(outer_comp);
+
+ if (comp_kind != ICAL_VCALENDAR_COMPONENT){
+ icalerror_set_errno(ICAL_BADARG_ERROR);
+ return 0;
+ }
+
+ method_prop = icalcomponent_get_first_property(outer_comp,
+ ICAL_METHOD_PROPERTY);
+
+ if (method_prop == 0){
+ method = ICAL_METHOD_NONE;
+ } else {
+ method = icalproperty_get_method(method_prop);
+ }
+
+
+ /* Check the VCALENDAR wrapper */
+ valid = icalrestriction_check_component(ICAL_METHOD_NONE,outer_comp);
+
+
+ /* Now check the inner components */
+
+ for(inner_comp= icalcomponent_get_first_component(outer_comp,
+ ICAL_ANY_COMPONENT);
+ inner_comp != 0;
+ inner_comp= icalcomponent_get_next_component(outer_comp,
+ ICAL_ANY_COMPONENT)){
+
+ valid = valid && icalrestriction_check_component(method,inner_comp);
+
+ }
+
+
+ return valid;
+
+}
+
+icalrestriction_kind
+icalrestriction_get_property_restriction(icalproperty_method method,
+ icalcomponent_kind component,
+ icalproperty_kind property)
+{
+ int i;
+
+ for(i = 0;
+ icalrestriction_property_records[i].restriction != ICAL_RESTRICTION_NONE;
+ i++){
+
+ if (method == icalrestriction_property_records[i].method &&
+ component == icalrestriction_property_records[i].component &&
+ property == icalrestriction_property_records[i].property ){
+ return icalrestriction_property_records[i].restriction;
+ }
+ }
+
+ return ICAL_RESTRICTION_UNKNOWN;
+}
+
+icalrestriction_kind
+icalrestriction_get_component_restriction(icalproperty_method method,
+ icalcomponent_kind component,
+ icalcomponent_kind subcomponent)
+{
+
+ int i;
+
+ for(i = 0;
+ icalrestriction_component_records[i].restriction != ICAL_RESTRICTION_NONE;
+ i++){
+
+ if (method == icalrestriction_component_records[i].method &&
+ component == icalrestriction_component_records[i].component &&
+ subcomponent == icalrestriction_component_records[i].subcomponent ){
+ return icalrestriction_component_records[i].restriction;
+ }
+ }
+
+ return ICAL_RESTRICTION_UNKNOWN;
+}
+
+/* Everything below this line is machine generated. Do not edit. */
+icalrestriction_property_record icalrestriction_property_records[] = {
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ONEPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ONEPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ONEPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ONEPLUS},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ONEPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ONEPLUS},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ONEPLUS},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ONEPLUS},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ONEPLUS},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_NONE,ICAL_VCALENDAR_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VEVENT_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTODO_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ONEEXCLUSIVE},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VJOURNAL_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VFREEBUSY_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_VTIMEZONE_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XSTANDARD_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDAYLIGHT_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ONEMUTUAL},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ONEMUTUAL},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XAUDIOALARM_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ONEMUTUAL},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ONEMUTUAL},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XDISPLAYALARM_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ONEPLUS},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ONEMUTUAL},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ONEMUTUAL},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XEMAILALARM_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_ACTION_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_ATTACH_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_ATTENDEE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_CALSCALE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_CATEGORIES_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_CLASS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_COMMENT_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_COMPLETED_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_CONTACT_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_CREATED_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_DESCRIPTION_PROPERTY,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_DTEND_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_DTSTAMP_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_DTSTART_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_DUE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_DURATION_PROPERTY,ICAL_RESTRICTION_ONEMUTUAL},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_EXDATE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_EXRULE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_FREEBUSY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_GEO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_LASTMODIFIED_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_LOCATION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_METHOD_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_ORGANIZER_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_PERCENTCOMPLETE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_PRIORITY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_PRODID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_RDATE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_RECURRENCEID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_RELATEDTO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_REPEAT_PROPERTY,ICAL_RESTRICTION_ONEMUTUAL},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_REQUESTSTATUS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_RESOURCES_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_RRULE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_SEQUENCE_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_STATUS_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_SUMMARY_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_TRANSP_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_TRIGGER_PROPERTY,ICAL_RESTRICTION_ONE},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_TZID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_TZNAME_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_TZOFFSETFROM_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_TZOFFSETTO_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_TZURL_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_UID_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_NONE,ICAL_NO_COMPONENT,ICAL_NO_PROPERTY,ICAL_RESTRICTION_NONE}
+};
+icalrestriction_component_record icalrestriction_component_records[] = {
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REQUEST,ICAL_VEVENT_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REPLY,ICAL_VEVENT_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_ADD,ICAL_VEVENT_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_CANCEL,ICAL_VEVENT_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VEVENT_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_COUNTER,ICAL_VEVENT_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VEVENT_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VFREEBUSY_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REQUEST,ICAL_VFREEBUSY_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REPLY,ICAL_VFREEBUSY_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VTODO_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REQUEST,ICAL_VTODO_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REPLY,ICAL_VTODO_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_VJOURNAL_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_ADD,ICAL_VTODO_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_CANCEL,ICAL_VTODO_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_REFRESH,ICAL_VTODO_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_COUNTER,ICAL_VTODO_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_DECLINECOUNTER,ICAL_VTODO_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_PUBLISH,ICAL_VJOURNAL_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROORONE},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_ADD,ICAL_VJOURNAL_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_VTIMEZONE_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_X_COMPONENT,ICAL_RESTRICTION_ZEROPLUS},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO},
+ {ICAL_METHOD_NONE,ICAL_NO_COMPONENT,ICAL_NO_COMPONENT,ICAL_RESTRICTION_NONE}
+};
diff --git a/libical/src/libical/icalrestriction.h b/libical/src/libical/icalrestriction.h
new file mode 100644
index 0000000000..ca4beeea7b
--- /dev/null
+++ b/libical/src/libical/icalrestriction.h
@@ -0,0 +1,72 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalrestriction.h
+ CREATOR: eric 24 April 1999
+
+ $Id$
+
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The original author is Eric Busboom
+ The original code is icalrestriction.h
+
+ Contributions from:
+ Graham Davison (g.m.davison@computer.org)
+
+
+======================================================================*/
+
+#include "ical.h"
+
+#ifndef ICALRESTRICTION_H
+#define ICALRESTRICTION_H
+
+/* These must stay in this order for icalrestriction_compare to work */
+typedef enum icalrestriction_kind {
+ ICAL_RESTRICTION_NONE=0, /* 0 */
+ ICAL_RESTRICTION_ZERO, /* 1 */
+ ICAL_RESTRICTION_ONE, /* 2 */
+ ICAL_RESTRICTION_ZEROPLUS, /* 3 */
+ ICAL_RESTRICTION_ONEPLUS, /* 4 */
+ ICAL_RESTRICTION_ZEROORONE, /* 5 */
+ ICAL_RESTRICTION_ONEEXCLUSIVE, /* 6 */
+ ICAL_RESTRICTION_ONEMUTUAL, /* 7 */
+ ICAL_RESTRICTION_UNKNOWN /* 8 */
+} icalrestriction_kind;
+
+int
+icalrestriction_compare(icalrestriction_kind restr, int count);
+
+icalrestriction_kind
+icalrestriction_get_property_restriction(icalproperty_method method,
+ icalcomponent_kind component,
+ icalproperty_kind property);
+
+icalrestriction_kind
+icalrestriction_get_component_restriction(icalproperty_method method,
+ icalcomponent_kind component,
+ icalcomponent_kind subcomponent);
+
+int
+icalrestriction_is_parameter_allowed(icalproperty_kind property,
+ icalparameter_kind parameter);
+
+int icalrestriction_check(icalcomponent* comp);
+
+
+#endif /* !ICALRESTRICTION_H */
+
+
+
diff --git a/libical/src/libical/icaltypes.c b/libical/src/libical/icaltypes.c
new file mode 100644
index 0000000000..25e0e12b48
--- /dev/null
+++ b/libical/src/libical/icaltypes.c
@@ -0,0 +1,305 @@
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: icaltypes.c
+ CREATOR: eric 16 May 1999
+
+ $Id$
+ $Locker$
+
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The original author is Eric Busboom
+ The original code is icaltypes.c
+
+ ======================================================================*/
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "icaltypes.h"
+#include "icalerror.h"
+#include "icalmemory.h"
+#include <stdlib.h> /* for malloc */
+#include <errno.h> /* for errno */
+#include <string.h> /* for strdup */
+#include <assert.h>
+#include <limits.h> /* for SHRT_MAX */
+
+#define TEMP_MAX 1024
+
+void*
+icalattachtype_get_data (struct icalattachtype* type);
+
+struct icalattachtype*
+icalattachtype_new()
+{
+ struct icalattachtype* v;
+
+ if ( ( v = (struct icalattachtype*)
+ malloc(sizeof(struct icalattachtype))) == 0) {
+ errno = ENOMEM;
+ return 0;
+ }
+
+ v->refcount = 1;
+
+ v->binary = 0;
+ v->owns_binary = 0;
+
+ v->base64 = 0;
+ v->owns_base64 = 0;
+
+ v->url = 0;
+
+ return v;
+}
+
+
+void
+icalattachtype_free(struct icalattachtype* v)
+{
+ icalerror_check_arg( (v!=0),"v");
+
+ v->refcount--;
+
+ if (v->refcount <= 0){
+
+ if (v->base64 != 0 && v->owns_base64 != 0){
+ free(v->base64);
+ }
+
+ if (v->binary != 0 && v->owns_binary != 0){
+ free(v->binary);
+ }
+
+ if (v->url != 0){
+ free(v->url);
+ }
+
+ free(v);
+ }
+}
+
+void icalattachtype_add_reference(struct icalattachtype* v)
+{
+ icalerror_check_arg( (v!=0),"v");
+ v->refcount++;
+}
+
+void icalattachtype_set_url(struct icalattachtype* v, char* url)
+{
+ icalerror_check_arg( (v!=0),"v");
+
+ if (v->url != 0){
+ free (v->url);
+ }
+
+ v->url = strdup(url);
+
+ /* HACK This routine should do something if strdup returns NULL */
+
+}
+
+char* icalattachtype_get_url(struct icalattachtype* v)
+{
+ icalerror_check_arg( (v!=0),"v");
+ return v->url;
+}
+
+void icalattachtype_set_base64(struct icalattachtype* v, char* base64,
+ int owns)
+{
+ icalerror_check_arg( (v!=0),"v");
+
+ v->base64 = base64;
+ v->owns_base64 = !(owns != 0 );
+
+}
+
+char* icalattachtype_get_base64(struct icalattachtype* v)
+{
+ icalerror_check_arg( (v!=0),"v");
+ return v->base64;
+}
+
+void icalattachtype_set_binary(struct icalattachtype* v, char* binary,
+ int owns)
+{
+ icalerror_check_arg( (v!=0),"v");
+
+ v->binary = binary;
+ v->owns_binary = !(owns != 0 );
+
+}
+
+void* icalattachtype_get_binary(struct icalattachtype* v)
+{
+ icalerror_check_arg( (v!=0),"v");
+ return v->binary;
+}
+
+
+
+time_t
+icalperiodtype_duration (struct icalperiodtype period);
+
+
+time_t
+icalperiodtype_end (struct icalperiodtype period);
+
+struct icaltimetype
+icaltimetype_from_timet(time_t v, int date)
+{
+ struct icaltimetype tt;
+ struct tm t;
+ time_t tm = time(&v);
+
+/* HACK Does not properly consider timezone */
+ t = *(gmtime(&tm));
+
+ tt.second = t.tm_sec;
+ tt.minute = t.tm_min;
+ tt.hour = t.tm_hour;
+ tt.day = t.tm_mday;
+ tt.month = t.tm_mon + 1;
+ tt.year = t.tm_year+ 1900;
+
+ tt.is_utc = 1;
+ tt.is_date = date;
+
+ return tt;
+}
+
+/* From Russel Steinthal */
+time_t icaldurationtype_as_timet(struct icaldurationtype dur)
+{
+ return (time_t) (dur.seconds +
+ (60 * dur.minutes) +
+ (60 * 60 * dur.hours) +
+ (60 * 60 * 24 * dur.days) +
+ (60 * 60 * 24 * 7 * dur.weeks));
+}
+
+
+struct icaldurationtype icaldurationtype_from_timet(time_t t)
+{
+ struct icaldurationtype dur;
+ time_t used = 0;
+
+ dur.weeks = (t - used) / (60 * 60 * 24 * 7);
+ used += dur.weeks * (60 * 60 * 24 * 7);
+ dur.days = (t - used) / (60 * 60 * 24);
+ used += dur.days * (60 * 60 * 24);
+ dur.hours = (t - used) / (60 * 60);
+ used += dur.hours * (60 * 60);
+ dur.minutes = (t - used) / (60);
+ used += dur.minutes * (60);
+ dur.seconds = (t - used);
+
+ return dur;
+}
+
+
+void icalrecurrencetype_clear(struct icalrecurrencetype *recur)
+{
+ memset(recur,ICAL_RECURRENCE_ARRAY_MAX_BYTE,
+ sizeof(struct icalrecurrencetype));
+
+ recur->week_start = ICAL_NO_WEEKDAY;
+ recur->freq = ICAL_NO_RECURRENCE;
+ recur->interval = 0;
+ recur->until.year = 0;
+ recur->count = 0;
+}
+
+
+struct icalreqstattype icalreqstattype_from_string(char* str)
+{
+ char *p1,*p2;
+ size_t len;
+ struct icalreqstattype stat;
+ int major, minor;
+
+ icalerror_check_arg((str != 0),"str");
+
+ stat.code = ICAL_UNKNOWN_STATUS;
+ stat.debug = 0;
+
+ stat.desc = 0;
+
+ /* Get the status numbers */
+
+ sscanf(str, "%d.%d",&major, &minor);
+
+ if (major <= 0 || minor < 0){
+ icalerror_set_errno(ICAL_BADARG_ERROR);
+ return stat;
+ }
+
+ stat.code = icalenum_num_to_reqstat(major, minor);
+
+ if (stat.code == ICAL_UNKNOWN_STATUS){
+ icalerror_set_errno(ICAL_BADARG_ERROR);
+ return stat;
+ }
+
+
+ p1 = strchr(str,';');
+
+ if (p1 == 0){
+ icalerror_set_errno(ICAL_BADARG_ERROR);
+ return stat;
+ }
+
+ /* Just ignore the second clause; it will be taken from inside the library
+ */
+
+
+
+ p2 = strchr(p1+1,';');
+ if (p2 != 0 && *p2 != 0){
+ stat.debug = p2+1;
+ }
+
+ return stat;
+
+}
+
+char* icalreqstattype_as_string(struct icalreqstattype stat)
+{
+ char format[20];
+ char *temp;
+
+ temp = (char*)icalmemory_tmp_buffer(TEMP_MAX);
+
+ icalerror_check_arg_rz((stat.code != ICAL_UNKNOWN_STATUS),"Status");
+
+ if (stat.desc == 0){
+ stat.desc = icalenum_reqstat_desc(stat.code);
+ }
+
+ if(stat.debug != 0){
+ snprintf(temp,TEMP_MAX,"%d.%d;%s;%s", icalenum_reqstat_major(stat.code),
+ icalenum_reqstat_minor(stat.code),
+ stat.desc, stat.debug);
+
+ } else {
+ snprintf(temp,TEMP_MAX,"%d.%d;%s", icalenum_reqstat_major(stat.code),
+ icalenum_reqstat_minor(stat.code),
+ stat.desc);
+ }
+
+ return temp;
+}
diff --git a/libical/src/libical/icaltypes.h b/libical/src/libical/icaltypes.h
new file mode 100644
index 0000000000..77a67fae80
--- /dev/null
+++ b/libical/src/libical/icaltypes.h
@@ -0,0 +1,182 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icaltypes.h
+ CREATOR: eric 20 March 1999
+
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The original author is Eric Busboom
+ The original code is icaltypes.h
+
+======================================================================*/
+
+#ifndef ICALTYPES_H
+#define ICALTYPES_H
+
+#include <time.h>
+#include "icalenums.h" /* for recurrence enums */
+
+/* This type type should probably be an opaque type... */
+struct icalattachtype
+{
+ void* binary;
+ int owns_binary;
+
+ char* base64;
+ int owns_base64;
+
+ char* url;
+
+ int refcount;
+
+};
+
+/* converts base64 to binary, fetches url and stores as binary, or
+ just returns data */
+
+struct icalattachtype* icalattachtype_new();
+void icalattachtype_add_reference(struct icalattachtype* v);
+void icalattachtype_free(struct icalattachtype* v);
+
+void icalattachtype_set_url(struct icalattachtype* v, char* url);
+char* icalattachtype_get_url(struct icalattachtype* v);
+
+void icalattachtype_set_base64(struct icalattachtype* v, char* base64,
+ int owns);
+char* icalattachtype_get_base64(struct icalattachtype* v);
+
+void icalattachtype_set_binary(struct icalattachtype* v, char* binary,
+ int owns);
+void* icalattachtype_get_binary(struct icalattachtype* v);
+
+struct icalgeotype
+{
+ float lat;
+ float lon;
+};
+
+struct icaltimetype
+{
+ int year;
+ int month;
+ int day;
+ int hour;
+ int minute;
+ int second;
+
+ int is_utc; /* 1-> time is in UTC timezone */
+
+ int is_date; /* 1 -> interpret this as date. */
+};
+
+struct icaltimetype icaltimetype_from_timet(time_t v, int is_date);
+
+
+/* See RFC 2445 Section 4.3.10, RECUR Value, for an explaination of
+ the values and fields in struct icalrecurrencetype */
+
+
+struct icalrecurrencetype
+{
+ icalrecurrencetype_frequency freq;
+
+
+ /* until and count are mutually exclusive. */
+ struct icaltimetype until;
+ int count;
+
+ short interval;
+
+ icalrecurrencetype_weekday week_start;
+
+ /* The BY* parameters can each take a list of values. Here I
+ * assume that the list of values will not be larger than the
+ * range of the value -- that is, the client will not name a
+ * value more than once.
+
+ * Each of the lists is terminated with the value SHRT_MAX
+ * unless the the list is full. */
+
+ short by_second[61];
+ short by_minute[61];
+ short by_hour[25];
+ short by_day[8];
+ short by_month_day[32];
+ short by_year_day[367];
+ short by_week_no[54];
+ short by_month[13];
+ short by_set_pos[367];
+};
+
+
+void icalrecurrencetype_clear(struct icalrecurrencetype *r);
+
+struct icaldurationtype
+{
+ unsigned int days;
+ unsigned int weeks;
+ unsigned int hours;
+ unsigned int minutes;
+ unsigned int seconds;
+};
+
+struct icaldurationtype icaldurationtype_from_timet(time_t t);
+time_t icaldurationtype_as_timet(struct icaldurationtype duration);
+
+/* Return the next occurance of 'r' after the time specified by 'after' */
+struct icaltimetype icalrecurrencetype_next_occurance(
+ struct icalrecurrencetype *r,
+ struct icaltimetype *after);
+
+
+struct icalperiodtype
+{
+ struct icaltimetype start; /* Must be absolute */
+ struct icaltimetype end; /* Must be absolute */
+ struct icaldurationtype duration;
+};
+
+time_t icalperiodtype_duration(struct icalperiodtype period);
+time_t icalperiodtype_end(struct icalperiodtype period);
+
+union icaltriggertype
+{
+ struct icaltimetype time;
+ struct icaldurationtype duration;
+};
+
+
+/* struct icalreqstattype. This struct contains two string pointers,
+but don't try to free either of them. The "desc" string is a pointer
+to a static table inside the library. Don't try to free it. The
+"debug" string is a pointer into the string that the called passed
+into to icalreqstattype_from_string. Don't try to free it either, and
+don't use it after the original string has been freed.
+
+BTW, you would get that original string from
+*icalproperty_get_requeststatus() or icalvalue_get_text(), when
+operating on a the value of a request_status property. */
+
+struct icalreqstattype {
+
+ icalrequeststatus code;
+ char* desc;
+ char* debug;
+};
+
+struct icalreqstattype icalreqstattype_from_string(char* str);
+char* icalreqstattype_as_string(struct icalreqstattype);
+
+#endif /* !ICALTYPES_H */
diff --git a/libical/src/libical/icalvalue.c b/libical/src/libical/icalvalue.c
new file mode 100644
index 0000000000..ec332a0f04
--- /dev/null
+++ b/libical/src/libical/icalvalue.c
@@ -0,0 +1,2039 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalvalue.c
+ CREATOR: eric 02 May 1999
+
+ $Id$
+
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The original author is Eric Busboom
+ The original code is icalvalue.c
+
+ Contributions from:
+ Graham Davison (g.m.davison@computer.org)
+
+
+======================================================================*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+
+#include "ical.h"
+#include "icalerror.h"
+#include "icalmemory.h"
+#include "icalparser.h"
+#include "icalenums.h"
+
+#include <stdlib.h> /* for malloc */
+#include <stdio.h> /* for sprintf */
+#include <string.h> /* For memset, others */
+#include <stddef.h> /* For offsetof() macro */
+#include <errno.h>
+#include <time.h> /* for mktime */
+#include <stdlib.h> /* for atoi and atof */
+#include <limits.h> /* for SHRT_MAX */
+
+#if _MAC_OS_
+#include "strdup.h"
+#endif
+
+#define TMP_BUF_SIZE 1024
+
+void print_datetime_to_string(char* str, struct icaltimetype *data);
+void print_date_to_string(char* str, struct icaltimetype *data);
+void print_time_to_string(char* str, struct icaltimetype *data);
+void print_recur_to_string(char* str, struct icaltimetype *data);
+
+struct icalvalue_impl {
+ icalvalue_kind kind;
+ char id[5];
+ int size;
+ icalproperty* parent;
+
+ union data {
+ struct icalattachtype v_attach;
+ /* void *v_binary; */ /* use v_attach */
+ char *v_string;
+ /*char *v_text;*/
+ /*char *v_caladdress;*/
+ /*char *v_uri;*/
+ float v_float;
+ int v_int;
+ /*int v_boolean;*/
+ /*int v_integer;*/
+ struct icaldurationtype v_duration;
+ /*int v_utcoffset;*/
+
+ struct icalperiodtype v_period;
+ /*struct icalperiodtype v_datetimeperiod;*/
+ struct icalgeotype v_geo;
+ /*time_t v_time;*/
+ struct icaltimetype v_time;
+ /*struct icaltimetype v_date;*/
+ /*struct icaltimetype v_datetime;*/
+ /*struct icaltimetype v_datetimedate;*/
+
+ /* struct icalrecurrencetype was once a value in this
+ union, but it contributes 2000 bytes to every*/
+
+ struct icalrecurrencetype *v_recur;
+ union icaltriggertype v_trigger;
+ icalproperty_method v_method;
+
+ } data;
+};
+
+struct icalvalue_impl* icalvalue_new_impl(icalvalue_kind kind){
+
+ struct icalvalue_impl* v;
+
+ if ( ( v = (struct icalvalue_impl*)
+ malloc(sizeof(struct icalvalue_impl))) == 0) {
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return 0;
+ }
+
+ strcpy(v->id,"val");
+
+ v->kind = kind;
+ v->size = 0;
+ v->parent = 0;
+ memset(&(v->data),0,sizeof(v->data));
+
+ return v;
+
+}
+
+
+
+icalvalue*
+icalvalue_new (icalvalue_kind kind)
+{
+ return (icalvalue*)icalvalue_new_impl(kind);
+}
+
+icalvalue* icalvalue_new_clone(icalvalue* value){
+
+ struct icalvalue_impl* new;
+ struct icalvalue_impl* old = (struct icalvalue_impl*)value;
+
+ new = icalvalue_new_impl(old->kind);
+
+ if (new == 0){
+ return 0;
+ }
+
+
+ strcpy(new->id, old->id);
+ new->kind = old->kind;
+ new->size = old->size;
+
+ switch (new->kind){
+
+ /* The contents of the attach value may or may not be owned by the
+ * library. */
+ case ICAL_ATTACH_VALUE:
+ case ICAL_BINARY_VALUE:
+ {
+ /* HACK ugh. I don't feel like impleenting this */
+ }
+
+ case ICAL_STRING_VALUE:
+ case ICAL_TEXT_VALUE:
+ case ICAL_CALADDRESS_VALUE:
+ case ICAL_URI_VALUE:
+ {
+ if (old->data.v_string != 0) {
+ new->data.v_string=strdup(old->data.v_string);
+
+ if ( new->data.v_string == 0 ) {
+ return 0;
+ }
+
+ }
+ break;
+ }
+ case ICAL_RECUR_VALUE:
+ {
+ if(old->data.v_recur != 0){
+ new->data.v_recur = malloc(sizeof(struct icalrecurrencetype));
+
+ if(new->data.v_recur == 0){
+ return 0;
+ }
+
+ memcpy( new->data.v_recur, old->data.v_recur,
+ sizeof(struct icalrecurrencetype));
+ }
+ break;
+ }
+
+ default:
+ {
+ /* all of the other types are stored as values, not
+ pointers, so we can just copy the whole structure. */
+
+ new->data = old->data;
+ }
+ }
+
+ return new;
+}
+
+icalvalue* icalvalue_new_from_string_with_error(icalvalue_kind kind,char* str,icalproperty** error)
+{
+
+ icalvalue *value = 0;
+
+ icalerror_check_arg_rz(str!=0,"str");
+
+ if (error != 0){
+ *error = 0;
+ }
+
+ switch (kind){
+
+ case ICAL_ATTACH_VALUE:
+ {
+ /* HACK */
+ value = 0;
+
+ if (error != 0){
+ char temp[TMP_BUF_SIZE];
+ sprintf(temp,"ATTACH Values are not implemented");
+ *error = icalproperty_vanew_xlicerror(
+ temp,
+ icalparameter_new_xlicerrortype(
+ ICAL_XLICERRORTYPE_VALUEPARSEERROR),
+ 0);
+ }
+
+ icalerror_warn("Parsing ATTACH properties is unimplmeneted");
+ break;
+ }
+
+ case ICAL_BINARY_VALUE:
+ {
+ /* HACK */
+ value = 0;
+
+ if (error != 0){
+ char temp[TMP_BUF_SIZE];
+ sprintf(temp,"BINARY Values are not implemented");
+ *error = icalproperty_vanew_xlicerror(
+ temp,
+ icalparameter_new_xlicerrortype(
+ ICAL_XLICERRORTYPE_VALUEPARSEERROR),
+ 0);
+ }
+
+ icalerror_warn("Parsing BINARY values is unimplmeneted");
+ break;
+ }
+
+ case ICAL_BOOLEAN_VALUE:
+ {
+ /* HACK */
+ value = 0;
+
+ if (error != 0){
+ char temp[TMP_BUF_SIZE];
+ sprintf(temp,"BOOLEAN Values are not implemented");
+ *error = icalproperty_vanew_xlicerror(
+ temp,
+ icalparameter_new_xlicerrortype(
+ ICAL_XLICERRORTYPE_VALUEPARSEERROR),
+ 0);
+ }
+
+ icalerror_warn("Parsing BOOLEAN values is unimplmeneted");
+ break;
+ }
+
+ case ICAL_INTEGER_VALUE:
+ {
+ value = icalvalue_new_integer(atoi(str));
+ break;
+ }
+
+ case ICAL_FLOAT_VALUE:
+ {
+ value = icalvalue_new_float(atof(str));
+ break;
+ }
+
+ case ICAL_UTCOFFSET_VALUE:
+ {
+ value = icalparser_parse_value(kind,str,(icalcomponent*)0);
+ break;
+ }
+
+ case ICAL_TEXT_VALUE:
+ {
+ value = icalvalue_new_text(str);
+ break;
+ }
+
+
+ case ICAL_STRING_VALUE:
+ {
+ value = icalvalue_new_string(str);
+ break;
+ }
+
+ case ICAL_CALADDRESS_VALUE:
+ {
+ value = icalvalue_new_caladdress(str);
+ break;
+ }
+
+ case ICAL_URI_VALUE:
+ {
+ value = icalvalue_new_uri(str);
+ break;
+ }
+
+ case ICAL_METHOD_VALUE:
+ {
+ icalproperty_method method = icalenum_string_to_method(str);
+ value = icalvalue_new_method(method);
+ break;
+
+ }
+ case ICAL_GEO_VALUE:
+ {
+ value = 0;
+ /* HACK */
+
+ if (error != 0){
+ char temp[TMP_BUF_SIZE];
+ sprintf(temp,"GEO Values are not implemented");
+ *error = icalproperty_vanew_xlicerror(
+ temp,
+ icalparameter_new_xlicerrortype(
+ ICAL_XLICERRORTYPE_VALUEPARSEERROR),
+ 0);
+ }
+
+ /*icalerror_warn("Parsing GEO properties is unimplmeneted");*/
+
+ break;
+ }
+
+ case ICAL_RECUR_VALUE:
+ case ICAL_DATE_VALUE:
+ case ICAL_DATETIME_VALUE:
+ case ICAL_DATETIMEDATE_VALUE:
+ case ICAL_DATETIMEPERIOD_VALUE:
+ case ICAL_TIME_VALUE:
+ case ICAL_DURATION_VALUE:
+ case ICAL_PERIOD_VALUE:
+ case ICAL_TRIGGER_VALUE:
+ {
+ value = icalparser_parse_value(kind,str,error);
+ break;
+ }
+
+ default:
+ {
+
+ if (error != 0 ){
+ char temp[TMP_BUF_SIZE];
+
+ snprintf(temp,TMP_BUF_SIZE,"Unknown type for \'%s\'",str);
+
+ *error = icalproperty_vanew_xlicerror(
+ temp,
+ icalparameter_new_xlicerrortype(
+ ICAL_XLICERRORTYPE_VALUEPARSEERROR),
+ 0);
+ }
+
+ icalerror_warn("icalvalue_new_from_string got an unknown value type");
+ value=0;
+ }
+ }
+
+
+ if (error != 0 && *error == 0 && value == 0){
+ char temp[TMP_BUF_SIZE];
+
+ snprintf(temp,TMP_BUF_SIZE,"Failed to parse value: \'%s\'",str);
+
+ *error = icalproperty_vanew_xlicerror(
+ temp,
+ icalparameter_new_xlicerrortype(
+ ICAL_XLICERRORTYPE_VALUEPARSEERROR),
+ 0);
+ }
+
+
+ return value;
+
+}
+
+icalvalue* icalvalue_new_from_string(icalvalue_kind kind,char* str)
+{
+ return icalvalue_new_from_string_with_error(kind,str,(icalproperty*)0);
+}
+
+
+
+void
+icalvalue_free (icalvalue* value)
+{
+ struct icalvalue_impl* v = (struct icalvalue_impl*)value;
+
+ icalerror_check_arg_rv((value != 0),"value");
+
+#ifdef ICAL_FREE_ON_LIST_IS_ERROR
+ icalerror_assert( (v->parent ==0),"This value is still attached to a property");
+
+#else
+ if(v->parent !=0){
+ return;
+ }
+#endif
+
+
+ switch (v->kind){
+ case ICAL_BINARY_VALUE:
+ case ICAL_ATTACH_VALUE: {
+ /* HACK ugh. This will be tough to implement */
+ }
+ case ICAL_TEXT_VALUE:
+ case ICAL_CALADDRESS_VALUE:
+ case ICAL_URI_VALUE:
+ {
+ if (v->data.v_string != 0) {
+ free(v->data.v_string);
+ v->data.v_string = 0;
+ }
+ break;
+ }
+ case ICAL_RECUR_VALUE:
+ {
+ if(v->data.v_recur != 0){
+ free(v->data.v_recur);
+ v->data.v_recur = 0;
+ }
+ break;
+ }
+
+ default:
+ {
+ /* Nothing to do */
+ }
+ }
+
+ v->kind = ICAL_NO_VALUE;
+ v->size = 0;
+ v->parent = 0;
+ memset(&(v->data),0,sizeof(v->data));
+ v->id[0] = 'X';
+ free(v);
+}
+
+int
+icalvalue_is_valid (icalvalue* value)
+{
+ /*struct icalvalue_impl* v = (struct icalvalue_impl*)value;*/
+
+ if(value == 0){
+ return 0;
+ }
+
+ return 1;
+}
+
+char* icalvalue_binary_as_ical_string(icalvalue* value) {
+
+ char* data;
+ char* str;
+ icalerror_check_arg_rz( (value!=0),"value");
+ data = icalvalue_get_binary(value);
+
+ str = (char*)icalmemory_tmp_buffer(60);
+ sprintf(str,"icalvalue_binary_as_ical_string is not implemented yet");
+
+ return str;
+}
+
+
+char* icalvalue_int_as_ical_string(icalvalue* value) {
+
+ int data;
+ char* str = (char*)icalmemory_tmp_buffer(2);
+ icalerror_check_arg_rz( (value!=0),"value");
+ data = icalvalue_get_integer(value);
+
+ sprintf(str,"%d",data);
+
+ return str;
+}
+
+char* icalvalue_utcoffset_as_ical_string(icalvalue* value)
+{
+ int data,h,m,s;
+ char sign;
+ char* str = (char*)icalmemory_tmp_buffer(9);
+ icalerror_check_arg_rz( (value!=0),"value");
+ data = icalvalue_get_utcoffset(value);
+
+ if (abs(data) == data){
+ sign = '+';
+ } else {
+ sign = '-';
+ }
+
+ h = data/3600;
+ m = (data - (h*3600))/ 60;
+ s = (data - (h*3600) - (m*60));
+
+ sprintf(str,"%c%02d%02d%02d",sign,abs(h),abs(m),abs(s));
+
+ return str;
+}
+
+char* icalvalue_string_as_ical_string(icalvalue* value) {
+
+ char* data;
+ char* str = 0;
+ icalerror_check_arg_rz( (value!=0),"value");
+ data = ((struct icalvalue_impl*)value)->data.v_string;
+
+ str = (char*)icalmemory_tmp_buffer(strlen(data)+1);
+
+ strcpy(str,data);
+
+ return str;
+}
+
+
+char* icalvalue_recur_as_ical_string(icalvalue* value)
+{
+ char* str;
+ char *str_p;
+ size_t buf_sz = 200;
+ char temp[20];
+ int i,j;
+ struct icalvalue_impl *impl = (struct icalvalue_impl*)value;
+ struct icalrecurrencetype *recur = impl->data.v_recur;
+
+ struct { char* str;size_t offset; short limit; } recurmap[] =
+ {
+ {";BYSECOND=",offsetof(struct icalrecurrencetype,by_second),60},
+ {";BYMINUTE=",offsetof(struct icalrecurrencetype,by_minute),60},
+ {";BYHOUR=",offsetof(struct icalrecurrencetype,by_hour),24},
+ {";BYDAY=",offsetof(struct icalrecurrencetype,by_day),7},
+ {";BYMONTHDAY=",offsetof(struct icalrecurrencetype,by_month_day),31},
+ {";BYYEARDAY=",offsetof(struct icalrecurrencetype,by_year_day),366},
+ {";BYWEEKNO=",offsetof(struct icalrecurrencetype,by_week_no),52},
+ {";BYMONTH=",offsetof(struct icalrecurrencetype,by_month),12},
+ {";BYSETPOS=",offsetof(struct icalrecurrencetype,by_set_pos),366},
+ {0,0,0},
+ };
+
+
+
+ icalerror_check_arg_rz((value != 0),"value");
+
+ if(recur->freq == ICAL_NO_RECURRENCE){
+ return 0;
+ }
+
+ str = (char*)icalmemory_tmp_buffer(buf_sz);
+ str_p = str;
+
+ icalmemory_append_string(&str,&str_p,&buf_sz,"FREQ=");
+ icalmemory_append_string(&str,&str_p,&buf_sz,
+ icalenum_recurrence_to_string(recur->freq));
+
+ if(recur->until.year != 0){
+
+ temp[0] = 0;
+ print_datetime_to_string(temp,&(recur->until));
+
+ icalmemory_append_string(&str,&str_p,&buf_sz,";UNTIL=");
+ icalmemory_append_string(&str,&str_p,&buf_sz, temp);
+ }
+
+ if(recur->count != 0){
+ sprintf(temp,"%d",recur->count);
+ icalmemory_append_string(&str,&str_p,&buf_sz,";COUNT=");
+ icalmemory_append_string(&str,&str_p,&buf_sz, temp);
+ }
+
+ if(recur->interval != 0){
+ sprintf(temp,"%d",recur->interval);
+ icalmemory_append_string(&str,&str_p,&buf_sz,";INTERVAL=");
+ icalmemory_append_string(&str,&str_p,&buf_sz, temp);
+ }
+
+ for(j =0; recurmap[j].str != 0; j++){
+ short* array = (short*)(recurmap[j].offset+ (size_t)recur);
+ short limit = recurmap[j].limit;
+
+ /* Skip unused arrays */
+ if( array[0] != ICAL_RECURRENCE_ARRAY_MAX ) {
+
+ icalmemory_append_string(&str,&str_p,&buf_sz,recurmap[j].str);
+
+ for(i=0; i< limit && array[i] != ICAL_RECURRENCE_ARRAY_MAX;
+ i++){
+ if (j == 3) { /* BYDAY */
+ icalmemory_append_string(&str,&str_p,&buf_sz,
+ icalenum_weekday_to_string(array[i]));
+ } else {
+ sprintf(temp,"%d",array[i]);
+ icalmemory_append_string(&str,&str_p,&buf_sz, temp);
+ }
+
+ if( (i+1)<limit &&array[i+1]
+ != ICAL_RECURRENCE_ARRAY_MAX){
+ icalmemory_append_char(&str,&str_p,&buf_sz,',');
+ }
+ }
+ }
+ }
+
+ return str;
+}
+
+char* icalvalue_text_as_ical_string(icalvalue* value) {
+
+ char *str;
+ char *str_p;
+ char *rtrn;
+ char *p;
+ size_t buf_sz;
+ int line_length;
+
+ line_length = 0;
+
+ buf_sz = strlen(((struct icalvalue_impl*)value)->data.v_string)+1;
+
+ str_p = str = (char*)icalmemory_new_buffer(buf_sz);
+
+ if (str_p == 0){
+ return 0;
+ }
+
+ for(p=((struct icalvalue_impl*)value)->data.v_string; *p!=0; p++){
+
+ switch(*p){
+ case '\n': {
+ icalmemory_append_string(&str,&str_p,&buf_sz,"\\n");
+ line_length+=3;
+ break;
+ }
+
+ case '\t': {
+ icalmemory_append_string(&str,&str_p,&buf_sz,"\\t");
+ line_length+=3;
+ break;
+ }
+ case '\r': {
+ icalmemory_append_string(&str,&str_p,&buf_sz,"\\r");
+ line_length+=3;
+ break;
+ }
+ case '\b': {
+ icalmemory_append_string(&str,&str_p,&buf_sz,"\\b");
+ line_length+=3;
+ break;
+ }
+ case '\f': {
+ icalmemory_append_string(&str,&str_p,&buf_sz,"\\f");
+ line_length+=3;
+ break;
+ }
+
+ case ';':
+ case ',':{
+ icalmemory_append_char(&str,&str_p,&buf_sz,'\\');
+ icalmemory_append_char(&str,&str_p,&buf_sz,*p);
+ line_length+=3;
+ break;
+ }
+
+ case '"':{
+ icalmemory_append_char(&str,&str_p,&buf_sz,'\\');
+ icalmemory_append_char(&str,&str_p,&buf_sz,*p);
+ line_length+=3;
+ break;
+ }
+
+ default: {
+ icalmemory_append_char(&str,&str_p,&buf_sz,*p);
+ line_length++;
+ }
+ }
+
+ if (line_length > 65 && *p == ' '){
+ icalmemory_append_string(&str,&str_p,&buf_sz,"\n ");
+ line_length=0;
+ }
+
+
+ if (line_length > 75){
+ icalmemory_append_string(&str,&str_p,&buf_sz,"\n ");
+ line_length=0;
+ }
+
+ }
+
+ /* Assume the last character is not a '\0' and add one. We could
+ check *str_p != 0, but that would be an uninitialized memory
+ read. */
+
+
+ icalmemory_append_char(&str,&str_p,&buf_sz,'\0');
+
+ rtrn = icalmemory_tmp_copy(str);
+
+ icalmemory_free_buffer(str);
+
+ return rtrn;
+}
+
+
+char* icalvalue_attach_as_ical_string(icalvalue* value) {
+
+ struct icalattachtype a;
+ char * str;
+
+ icalerror_check_arg_rz( (value!=0),"value");
+
+ a = icalvalue_get_attach(value);
+
+ if (a.binary != 0) {
+ return icalvalue_binary_as_ical_string(value);
+ } else if (a.base64 != 0) {
+ str = (char*)icalmemory_tmp_buffer(strlen(a.base64)+1);
+ strcpy(str,a.base64);
+ return str;
+ } else if (a.url != 0){
+ return icalvalue_string_as_ical_string(value);
+ } else {
+ icalerrno = ICAL_MALFORMEDDATA_ERROR;
+ return 0;
+ }
+}
+
+void append_duration_segment(char** buf, char** buf_ptr, size_t* buf_size,
+ char* sep, unsigned int value) {
+
+ char temp[TMP_BUF_SIZE];
+
+ sprintf(temp,"%d",value);
+
+ icalmemory_append_string(buf, buf_ptr, buf_size, temp);
+ icalmemory_append_string(buf, buf_ptr, buf_size, sep);
+
+}
+
+char* icalvalue_duration_as_ical_string(icalvalue* value) {
+
+ struct icaldurationtype data;
+ char *buf, *output_line;
+ size_t buf_size = 256;
+ char* buf_ptr = 0;
+
+ icalerror_check_arg_rz( (value!=0),"value");
+ data = icalvalue_get_duration(value);
+
+ buf = (char*)icalmemory_new_buffer(buf_size);
+ buf_ptr = buf;
+
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, "P");
+
+
+ if (data.weeks != 0 ) {
+ append_duration_segment(&buf, &buf_ptr, &buf_size, "W", data.weeks);
+ }
+
+ if (data.days != 0 ) {
+ append_duration_segment(&buf, &buf_ptr, &buf_size, "D", data.days);
+ }
+
+ if (data.hours != 0 || data.minutes != 0 || data.seconds != 0) {
+
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, "T");
+
+ if (data.hours != 0 ) {
+ append_duration_segment(&buf, &buf_ptr, &buf_size, "H", data.hours);
+ }
+ if (data.minutes != 0 ) {
+ append_duration_segment(&buf, &buf_ptr, &buf_size, "M", data.minutes);
+ }
+ if (data.seconds != 0 ) {
+ append_duration_segment(&buf, &buf_ptr, &buf_size, "S", data.seconds);
+ }
+
+ }
+
+ output_line = icalmemory_tmp_copy(buf);
+ icalmemory_free_buffer(buf);
+
+ return output_line;
+
+
+}
+
+void print_time_to_string(char* str, struct icaltimetype *data)
+{
+ char temp[20];
+
+ if (data->is_utc == 1){
+ sprintf(temp,"%02d%02d%02dZ",data->hour,data->minute,data->second);
+ } else {
+ sprintf(temp,"%02d%02d%02d",data->hour,data->minute,data->second);
+ }
+
+ strcat(str,temp);
+}
+
+
+char* icalvalue_time_as_ical_string(icalvalue* value) {
+
+ struct icaltimetype data;
+ char* str;
+ icalerror_check_arg_rz( (value!=0),"value");
+ data = icalvalue_get_time(value);
+
+ str = (char*)icalmemory_tmp_buffer(8);
+
+ str[0] = 0;
+ print_time_to_string(str,&data);
+
+ return str;
+}
+
+void print_date_to_string(char* str, struct icaltimetype *data)
+{
+ char temp[20];
+
+ sprintf(temp,"%04d%02d%02d",data->year,data->month,data->day);
+
+ strcat(str,temp);
+}
+
+char* icalvalue_date_as_ical_string(icalvalue* value) {
+
+ struct icaltimetype data;
+ char* str;
+ icalerror_check_arg_rz( (value!=0),"value");
+ data = icalvalue_get_date(value);
+
+ str = (char*)icalmemory_tmp_buffer(9);
+
+ str[0] = 0;
+ print_date_to_string(str,&data);
+
+ return str;
+}
+
+void print_datetime_to_string(char* str, struct icaltimetype *data)
+{
+ print_date_to_string(str,data);
+ strcat(str,"T");
+ print_time_to_string(str,data);
+
+}
+
+char* icalvalue_datetime_as_ical_string(icalvalue* value) {
+
+ struct icaltimetype data;
+ char* str;
+ icalerror_check_arg_rz( (value!=0),"value");
+ data = icalvalue_get_date(value);
+
+ str = (char*)icalmemory_tmp_buffer(20);
+
+ str[0] = 0;
+
+ print_datetime_to_string(str,&data);
+
+ return str;
+
+}
+
+
+char* icalvalue_datetimedate_as_ical_string(icalvalue* value) {
+
+ struct icaltimetype data;
+ icalerror_check_arg_rz( (value!=0),"value");
+ data = icalvalue_get_datetime(value);
+
+ if (data.is_date == 1){
+ return icalvalue_date_as_ical_string(value);
+ } else {
+ return icalvalue_datetime_as_ical_string(value);
+ }
+}
+
+
+char* icalvalue_float_as_ical_string(icalvalue* value) {
+
+ float data;
+ char* str;
+ icalerror_check_arg_rz( (value!=0),"value");
+ data = icalvalue_get_float(value);
+
+ str = (char*)icalmemory_tmp_buffer(15);
+
+ sprintf(str,"%f",data);
+
+ return str;
+}
+
+char* icalvalue_geo_as_ical_string(icalvalue* value) {
+
+ struct icalgeotype data;
+ char* str;
+ icalerror_check_arg_rz( (value!=0),"value");
+
+ data = icalvalue_get_geo(value);
+
+ str = (char*)icalmemory_tmp_buffer(25);
+
+ sprintf(str,"%f;%f",data.lat,data.lon);
+
+ return str;
+}
+
+char* icalvalue_datetimeperiod_as_ical_string(icalvalue* value) {
+
+ struct icalperiodtype data;
+ char* str;
+ icalerror_check_arg_rz( (value!=0),"value");
+ data = icalvalue_get_datetimeperiod(value);
+
+ str = (char*)icalmemory_tmp_buffer(60);
+
+ if( data.end.second == -1){
+ /* This is a DATE-TIME value, since there is no end value */
+ icalvalue *v= icalvalue_new_datetime(data.start);
+
+ strcpy(str,icalvalue_datetime_as_ical_string(v));
+
+ free(v);
+
+ } else {
+ icalvalue *v1 = icalvalue_new_datetime(data.start);
+ icalvalue *v2 = icalvalue_new_datetime(data.end);
+
+ sprintf(str,"%s/%s",
+ icalvalue_datetime_as_ical_string(v1),
+ icalvalue_datetime_as_ical_string(v2)
+ );
+
+ free(v1);
+ free(v2);
+
+ }
+
+ return str;
+}
+
+char* icalvalue_period_as_ical_string(icalvalue* value) {
+
+ struct icalperiodtype data;
+ char* str;
+ icalvalue *s,*e;
+
+ icalerror_check_arg_rz( (value!=0),"value");
+ data = icalvalue_get_period(value);
+
+ str = (char*)icalmemory_tmp_buffer(60);
+
+ s = icalvalue_new_datetime(data.start);
+
+ if (data.end.second != -1){
+ /* use the end date */
+ e = icalvalue_new_datetime(data.end);
+
+ sprintf(str,"%s/%s",
+ icalvalue_datetime_as_ical_string(s),
+ icalvalue_datetime_as_ical_string(e)
+ );
+
+
+ } else {
+ /* use the duration */
+ e = icalvalue_new_duration(data.duration);
+
+ sprintf(str,"%s/%s",
+ icalvalue_datetime_as_ical_string(s),
+ icalvalue_duration_as_ical_string(e)
+ );
+
+ }
+
+ icalvalue_free(e);
+ icalvalue_free(s);
+ return str;
+}
+
+char* icalvalue_trigger_as_ical_string(icalvalue* value) {
+
+ union icaltriggertype data;
+ char* str;
+ icalerror_check_arg_rz( (value!=0),"value");
+ data = icalvalue_get_trigger(value);
+
+ str = (char*)icalmemory_tmp_buffer(60);
+ sprintf(str,"icalvalue_trigger_as_ical_string is not implemented yet");
+
+ return str;
+}
+
+char*
+icalvalue_as_ical_string (icalvalue* value)
+{
+ struct icalvalue_impl* v = (struct icalvalue_impl*)value;
+
+ v=v;
+
+ if(value == 0){
+ return 0;
+ }
+
+ switch (v->kind){
+
+ case ICAL_ATTACH_VALUE:
+ return icalvalue_attach_as_ical_string(value);
+
+ case ICAL_BINARY_VALUE:
+ return icalvalue_binary_as_ical_string(value);
+
+ case ICAL_BOOLEAN_VALUE:
+ case ICAL_INTEGER_VALUE:
+ return icalvalue_int_as_ical_string(value);
+
+ case ICAL_UTCOFFSET_VALUE:
+ return icalvalue_utcoffset_as_ical_string(value);
+
+ case ICAL_TEXT_VALUE:
+ return icalvalue_text_as_ical_string(value);
+
+ case ICAL_STRING_VALUE:
+ case ICAL_URI_VALUE:
+ case ICAL_CALADDRESS_VALUE:
+ return icalvalue_string_as_ical_string(value);
+
+ case ICAL_DATE_VALUE:
+ return icalvalue_date_as_ical_string(value);
+ case ICAL_DATETIME_VALUE:
+ return icalvalue_datetime_as_ical_string(value);
+ case ICAL_DATETIMEDATE_VALUE:
+ return icalvalue_datetimedate_as_ical_string(value);
+ case ICAL_DURATION_VALUE:
+ return icalvalue_duration_as_ical_string(value);
+ case ICAL_TIME_VALUE:
+ return icalvalue_time_as_ical_string(value);
+
+ case ICAL_PERIOD_VALUE:
+ return icalvalue_period_as_ical_string(value);
+ case ICAL_DATETIMEPERIOD_VALUE:
+ return icalvalue_datetimeperiod_as_ical_string(value);
+
+ case ICAL_FLOAT_VALUE:
+ return icalvalue_float_as_ical_string(value);
+
+ case ICAL_GEO_VALUE:
+ return icalvalue_geo_as_ical_string(value);
+
+ case ICAL_RECUR_VALUE:
+ return icalvalue_recur_as_ical_string(value);
+
+ case ICAL_TRIGGER_VALUE:
+ return icalvalue_trigger_as_ical_string(value);
+
+ case ICAL_METHOD_VALUE:
+ return icalenum_method_to_string(v->data.v_method);
+
+ case ICAL_NO_VALUE:
+ default:
+ {
+ return 0;
+ }
+ }
+}
+
+
+icalvalue_kind
+icalvalue_isa (icalvalue* value)
+{
+ struct icalvalue_impl* v = (struct icalvalue_impl*)value;
+
+ if(value == 0){
+ return ICAL_NO_VALUE;
+ }
+
+ return v->kind;
+}
+
+
+int
+icalvalue_isa_value (void* value)
+{
+ struct icalvalue_impl *impl = (struct icalvalue_impl *)value;
+
+ icalerror_check_arg_rz( (value!=0), "value");
+
+ if (strcmp(impl->id,"val") == 0) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+
+icalparameter_xliccomparetype
+icalvalue_compare(icalvalue* a, icalvalue *b)
+{
+ struct icalvalue_impl *impla = (struct icalvalue_impl *)a;
+ struct icalvalue_impl *implb = (struct icalvalue_impl *)b;
+
+ icalerror_check_arg_rz( (a!=0), "a");
+ icalerror_check_arg_rz( (b!=0), "b");
+
+ /* Not the same type; they can only be unequal */
+ if (icalvalue_isa(a) != icalvalue_isa(b)){
+ return ICAL_XLICCOMPARETYPE_NOTEQUAL;
+ }
+
+ switch (icalvalue_isa(a)){
+
+ case ICAL_ATTACH_VALUE:
+ case ICAL_BINARY_VALUE:
+
+ case ICAL_BOOLEAN_VALUE:
+ {
+ if (icalvalue_get_boolean(a) == icalvalue_get_boolean(b)){
+ return ICAL_XLICCOMPARETYPE_EQUAL;
+ } else {
+ return ICAL_XLICCOMPARETYPE_NOTEQUAL;
+ }
+ }
+
+ case ICAL_FLOAT_VALUE:
+ {
+ if (impla->data.v_float > implb->data.v_float){
+ return ICAL_XLICCOMPARETYPE_GREATER;
+ } else if (impla->data.v_float < implb->data.v_float){
+ return ICAL_XLICCOMPARETYPE_LESS;
+ } else {
+ return ICAL_XLICCOMPARETYPE_EQUAL;
+ }
+ }
+
+ case ICAL_INTEGER_VALUE:
+ case ICAL_UTCOFFSET_VALUE:
+ {
+ if (impla->data.v_int > implb->data.v_int){
+ return ICAL_XLICCOMPARETYPE_GREATER;
+ } else if (impla->data.v_int < implb->data.v_int){
+ return ICAL_XLICCOMPARETYPE_LESS;
+ } else {
+ return ICAL_XLICCOMPARETYPE_EQUAL;
+ }
+ }
+
+ case ICAL_TEXT_VALUE:
+ case ICAL_URI_VALUE:
+ case ICAL_CALADDRESS_VALUE:
+ case ICAL_TRIGGER_VALUE:
+ case ICAL_DATE_VALUE:
+ case ICAL_DATETIME_VALUE:
+ case ICAL_DATETIMEDATE_VALUE:
+ case ICAL_DURATION_VALUE: /* HACK. Not correct for DURATION */
+ case ICAL_TIME_VALUE:
+ case ICAL_DATETIMEPERIOD_VALUE:
+ {
+ int r;
+
+ r = strcmp(icalvalue_as_ical_string(a),
+ icalvalue_as_ical_string(b));
+
+ if (r > 0) {
+ return ICAL_XLICCOMPARETYPE_GREATER;
+ } else if (r < 0){
+ return ICAL_XLICCOMPARETYPE_LESS;
+ } else {
+ return 0;
+ }
+
+
+ }
+
+ case ICAL_METHOD_VALUE:
+ {
+ if (icalvalue_get_method(a) == icalvalue_get_method(b)){
+ return ICAL_XLICCOMPARETYPE_EQUAL;
+ } else {
+ return ICAL_XLICCOMPARETYPE_NOTEQUAL;
+ }
+
+ }
+ case ICAL_PERIOD_VALUE:
+ case ICAL_GEO_VALUE:
+ case ICAL_RECUR_VALUE:
+ case ICAL_NO_VALUE:
+ default:
+ {
+ icalerror_warn("Comparison not implemented for value type");
+ return ICAL_XLICCOMPARETYPE_REGEX+1; /* HACK */
+ }
+ }
+
+}
+
+void icalvalue_set_parent(icalvalue* value,
+ icalproperty* property)
+{
+ struct icalvalue_impl* v = (struct icalvalue_impl*)value;
+
+ v->parent = property;
+
+}
+
+icalproperty* icalvalue_get_parent(icalvalue* value)
+{
+ struct icalvalue_impl* v = (struct icalvalue_impl*)value;
+
+
+ return v->parent;
+}
+
+
+
+/* Recur is a special case, so it is not auto generated. Well,
+ actually, it is auto-generated, but you will have to manually
+ remove the auto-generated version after each generation. */
+icalvalue*
+icalvalue_new_recur (struct icalrecurrencetype v)
+{
+ struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_RECUR_VALUE);
+
+ icalvalue_set_recur((icalvalue*)impl,v);
+
+ return (icalvalue*)impl;
+}
+
+void
+icalvalue_set_recur(icalvalue* value, struct icalrecurrencetype v)
+{
+ struct icalvalue_impl* impl;
+
+ icalerror_check_arg_rv( (value!=0),"value");
+ icalerror_check_value_type(value, ICAL_RECUR_VALUE);
+
+ impl = (struct icalvalue_impl*)value;
+
+ if (impl->data.v_recur != 0){
+ free(impl->data.v_recur);
+ impl->data.v_recur = 0;
+ }
+
+ impl->data.v_recur = malloc(sizeof(struct icalrecurrencetype));
+
+ if (impl->data.v_recur == 0){
+ icalerror_set_errno(ICAL_ALLOCATION_ERROR);
+ return;
+ } else {
+ memcpy(impl->data.v_recur, &v, sizeof(struct icalrecurrencetype));
+ }
+
+}
+
+struct icalrecurrencetype
+icalvalue_get_recur(icalvalue* value)
+{
+ icalerror_check_arg( (value!=0),"value");
+ icalerror_check_value_type(value, ICAL_RECUR_VALUE);
+
+ return *(((struct icalvalue_impl*)value)->data.v_recur);
+}
+
+
+
+
+/* The remaining interfaces are 'new', 'set' and 'get' for each of the value
+ types */
+
+
+/* Everything below this line is machine generated. Do not edit. */
+
+icalvalue*
+icalvalue_new_attach (struct icalattachtype v)
+{
+ struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_ATTACH_VALUE);
+
+
+ icalvalue_set_attach((icalvalue*)impl,v);
+
+ return (icalvalue*)impl;
+}
+
+void
+icalvalue_set_attach(icalvalue* value, struct icalattachtype v)
+{
+ struct icalvalue_impl* impl;
+
+ icalerror_check_arg_rv( (value!=0),"value");
+
+ icalerror_check_value_type(value, ICAL_ATTACH_VALUE);
+
+ impl = (struct icalvalue_impl*)value;
+ impl->data.v_attach = v;
+}
+
+struct icalattachtype
+icalvalue_get_attach(icalvalue* value)
+{
+ icalerror_check_arg( (value!=0),"value");
+ icalerror_check_value_type(value, ICAL_ATTACH_VALUE);
+
+ return ((struct icalvalue_impl*)value)->data.v_attach;
+}
+
+
+icalvalue*
+icalvalue_new_binary (char* v)
+{
+ struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_BINARY_VALUE);
+
+ icalerror_check_arg_rz( (v!=0),"v");
+
+ icalvalue_set_binary((icalvalue*)impl,v);
+
+ return (icalvalue*)impl;
+}
+
+void
+icalvalue_set_binary(icalvalue* value, char* v)
+{
+ struct icalvalue_impl* impl;
+
+ icalerror_check_arg_rv( (value!=0),"value");
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ icalerror_check_value_type(value, ICAL_BINARY_VALUE);
+
+ impl = (struct icalvalue_impl*)value;
+ impl->data.v_string = strdup(v);
+
+ if (impl->data.v_string == 0){
+ errno = ENOMEM;
+ }
+
+}
+
+char*
+icalvalue_get_binary(icalvalue* value)
+{
+ icalerror_check_arg( (value!=0),"value");
+ icalerror_check_value_type(value, ICAL_BINARY_VALUE);
+
+ return ((struct icalvalue_impl*)value)->data.v_string;
+}
+
+
+icalvalue*
+icalvalue_new_boolean (int v)
+{
+ struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_BOOLEAN_VALUE);
+
+
+ icalvalue_set_boolean((icalvalue*)impl,v);
+
+ return (icalvalue*)impl;
+}
+
+void
+icalvalue_set_boolean(icalvalue* value, int v)
+{
+ struct icalvalue_impl* impl;
+
+ icalerror_check_arg_rv( (value!=0),"value");
+
+ icalerror_check_value_type(value, ICAL_BOOLEAN_VALUE);
+
+ impl = (struct icalvalue_impl*)value;
+ impl->data.v_int = v;
+}
+
+int
+icalvalue_get_boolean(icalvalue* value)
+{
+ icalerror_check_arg( (value!=0),"value");
+ icalerror_check_value_type(value, ICAL_BOOLEAN_VALUE);
+
+ return ((struct icalvalue_impl*)value)->data.v_int;
+}
+
+
+icalvalue*
+icalvalue_new_caladdress (char* v)
+{
+ struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_CALADDRESS_VALUE);
+
+ icalerror_check_arg_rz( (v!=0),"v");
+
+ icalvalue_set_caladdress((icalvalue*)impl,v);
+
+ return (icalvalue*)impl;
+}
+
+void
+icalvalue_set_caladdress(icalvalue* value, char* v)
+{
+ struct icalvalue_impl* impl;
+
+ icalerror_check_arg_rv( (value!=0),"value");
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ icalerror_check_value_type(value, ICAL_CALADDRESS_VALUE);
+
+ impl = (struct icalvalue_impl*)value;
+ impl->data.v_string = strdup(v);
+
+ if (impl->data.v_string == 0){
+ errno = ENOMEM;
+ }
+
+}
+
+char*
+icalvalue_get_caladdress(icalvalue* value)
+{
+ icalerror_check_arg( (value!=0),"value");
+ icalerror_check_value_type(value, ICAL_CALADDRESS_VALUE);
+
+ return ((struct icalvalue_impl*)value)->data.v_string;
+}
+
+
+icalvalue*
+icalvalue_new_date (struct icaltimetype v)
+{
+ struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_DATE_VALUE);
+
+
+ icalvalue_set_date((icalvalue*)impl,v);
+
+ return (icalvalue*)impl;
+}
+
+void
+icalvalue_set_date(icalvalue* value, struct icaltimetype v)
+{
+ struct icalvalue_impl* impl;
+
+ icalerror_check_arg_rv( (value!=0),"value");
+
+ icalerror_check_value_type(value, ICAL_DATE_VALUE);
+
+ impl = (struct icalvalue_impl*)value;
+ impl->data.v_time = v;
+}
+
+struct icaltimetype
+icalvalue_get_date(icalvalue* value)
+{
+ icalerror_check_arg( (value!=0),"value");
+ icalerror_check_value_type(value, ICAL_DATE_VALUE);
+
+ return ((struct icalvalue_impl*)value)->data.v_time;
+}
+
+
+icalvalue*
+icalvalue_new_datetime (struct icaltimetype v)
+{
+ struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_DATETIME_VALUE);
+
+
+ icalvalue_set_datetime((icalvalue*)impl,v);
+
+ return (icalvalue*)impl;
+}
+
+void
+icalvalue_set_datetime(icalvalue* value, struct icaltimetype v)
+{
+ struct icalvalue_impl* impl;
+
+ icalerror_check_arg_rv( (value!=0),"value");
+
+ icalerror_check_value_type(value, ICAL_DATETIME_VALUE);
+
+ impl = (struct icalvalue_impl*)value;
+ impl->data.v_time = v;
+}
+
+struct icaltimetype
+icalvalue_get_datetime(icalvalue* value)
+{
+ icalerror_check_arg( (value!=0),"value");
+ icalerror_check_value_type(value, ICAL_DATETIME_VALUE);
+
+ return ((struct icalvalue_impl*)value)->data.v_time;
+}
+
+
+icalvalue*
+icalvalue_new_datetimedate (struct icaltimetype v)
+{
+ struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_DATETIMEDATE_VALUE);
+
+
+ icalvalue_set_datetimedate((icalvalue*)impl,v);
+
+ return (icalvalue*)impl;
+}
+
+void
+icalvalue_set_datetimedate(icalvalue* value, struct icaltimetype v)
+{
+ struct icalvalue_impl* impl;
+
+ icalerror_check_arg_rv( (value!=0),"value");
+
+ icalerror_check_value_type(value, ICAL_DATETIMEDATE_VALUE);
+
+ impl = (struct icalvalue_impl*)value;
+ impl->data.v_time = v;
+}
+
+struct icaltimetype
+icalvalue_get_datetimedate(icalvalue* value)
+{
+ icalerror_check_arg( (value!=0),"value");
+ icalerror_check_value_type(value, ICAL_DATETIMEDATE_VALUE);
+
+ return ((struct icalvalue_impl*)value)->data.v_time;
+}
+
+
+icalvalue*
+icalvalue_new_datetimeperiod (struct icalperiodtype v)
+{
+ struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_DATETIMEPERIOD_VALUE);
+
+
+ icalvalue_set_datetimeperiod((icalvalue*)impl,v);
+
+ return (icalvalue*)impl;
+}
+
+void
+icalvalue_set_datetimeperiod(icalvalue* value, struct icalperiodtype v)
+{
+ struct icalvalue_impl* impl;
+
+ icalerror_check_arg_rv( (value!=0),"value");
+
+ icalerror_check_value_type(value, ICAL_DATETIMEPERIOD_VALUE);
+
+ impl = (struct icalvalue_impl*)value;
+ impl->data.v_period = v;
+}
+
+struct icalperiodtype
+icalvalue_get_datetimeperiod(icalvalue* value)
+{
+ icalerror_check_arg( (value!=0),"value");
+ icalerror_check_value_type(value, ICAL_DATETIMEPERIOD_VALUE);
+
+ return ((struct icalvalue_impl*)value)->data.v_period;
+}
+
+
+icalvalue*
+icalvalue_new_duration (struct icaldurationtype v)
+{
+ struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_DURATION_VALUE);
+
+
+ icalvalue_set_duration((icalvalue*)impl,v);
+
+ return (icalvalue*)impl;
+}
+
+void
+icalvalue_set_duration(icalvalue* value, struct icaldurationtype v)
+{
+ struct icalvalue_impl* impl;
+
+ icalerror_check_arg_rv( (value!=0),"value");
+
+ icalerror_check_value_type(value, ICAL_DURATION_VALUE);
+
+ impl = (struct icalvalue_impl*)value;
+ impl->data.v_duration = v;
+}
+
+struct icaldurationtype
+icalvalue_get_duration(icalvalue* value)
+{
+ icalerror_check_arg( (value!=0),"value");
+ icalerror_check_value_type(value, ICAL_DURATION_VALUE);
+
+ return ((struct icalvalue_impl*)value)->data.v_duration;
+}
+
+
+icalvalue*
+icalvalue_new_float (float v)
+{
+ struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_FLOAT_VALUE);
+
+
+ icalvalue_set_float((icalvalue*)impl,v);
+
+ return (icalvalue*)impl;
+}
+
+void
+icalvalue_set_float(icalvalue* value, float v)
+{
+ struct icalvalue_impl* impl;
+
+ icalerror_check_arg_rv( (value!=0),"value");
+
+ icalerror_check_value_type(value, ICAL_FLOAT_VALUE);
+
+ impl = (struct icalvalue_impl*)value;
+ impl->data.v_float = v;
+}
+
+float
+icalvalue_get_float(icalvalue* value)
+{
+ icalerror_check_arg( (value!=0),"value");
+ icalerror_check_value_type(value, ICAL_FLOAT_VALUE);
+
+ return ((struct icalvalue_impl*)value)->data.v_float;
+}
+
+
+icalvalue*
+icalvalue_new_geo (struct icalgeotype v)
+{
+ struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_GEO_VALUE);
+
+
+ icalvalue_set_geo((icalvalue*)impl,v);
+
+ return (icalvalue*)impl;
+}
+
+void
+icalvalue_set_geo(icalvalue* value, struct icalgeotype v)
+{
+ struct icalvalue_impl* impl;
+
+ icalerror_check_arg_rv( (value!=0),"value");
+
+ icalerror_check_value_type(value, ICAL_GEO_VALUE);
+
+ impl = (struct icalvalue_impl*)value;
+ impl->data.v_geo = v;
+}
+
+struct icalgeotype
+icalvalue_get_geo(icalvalue* value)
+{
+ icalerror_check_arg( (value!=0),"value");
+ icalerror_check_value_type(value, ICAL_GEO_VALUE);
+
+ return ((struct icalvalue_impl*)value)->data.v_geo;
+}
+
+
+icalvalue*
+icalvalue_new_integer (int v)
+{
+ struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_INTEGER_VALUE);
+
+
+ icalvalue_set_integer((icalvalue*)impl,v);
+
+ return (icalvalue*)impl;
+}
+
+void
+icalvalue_set_integer(icalvalue* value, int v)
+{
+ struct icalvalue_impl* impl;
+
+ icalerror_check_arg_rv( (value!=0),"value");
+
+ icalerror_check_value_type(value, ICAL_INTEGER_VALUE);
+
+ impl = (struct icalvalue_impl*)value;
+ impl->data.v_int = v;
+}
+
+int
+icalvalue_get_integer(icalvalue* value)
+{
+ icalerror_check_arg( (value!=0),"value");
+ icalerror_check_value_type(value, ICAL_INTEGER_VALUE);
+
+ return ((struct icalvalue_impl*)value)->data.v_int;
+}
+
+
+icalvalue*
+icalvalue_new_method (icalproperty_method v)
+{
+ struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_METHOD_VALUE);
+
+
+ icalvalue_set_method((icalvalue*)impl,v);
+
+ return (icalvalue*)impl;
+}
+
+void
+icalvalue_set_method(icalvalue* value, icalproperty_method v)
+{
+ struct icalvalue_impl* impl;
+
+ icalerror_check_arg_rv( (value!=0),"value");
+
+ icalerror_check_value_type(value, ICAL_METHOD_VALUE);
+
+ impl = (struct icalvalue_impl*)value;
+ impl->data.v_method = v;
+}
+
+icalproperty_method
+icalvalue_get_method(icalvalue* value)
+{
+ icalerror_check_arg( (value!=0),"value");
+ icalerror_check_value_type(value, ICAL_METHOD_VALUE);
+
+ return ((struct icalvalue_impl*)value)->data.v_method;
+}
+
+
+icalvalue*
+icalvalue_new_period (struct icalperiodtype v)
+{
+ struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_PERIOD_VALUE);
+
+
+ icalvalue_set_period((icalvalue*)impl,v);
+
+ return (icalvalue*)impl;
+}
+
+void
+icalvalue_set_period(icalvalue* value, struct icalperiodtype v)
+{
+ struct icalvalue_impl* impl;
+
+ icalerror_check_arg_rv( (value!=0),"value");
+
+ icalerror_check_value_type(value, ICAL_PERIOD_VALUE);
+
+ impl = (struct icalvalue_impl*)value;
+ impl->data.v_period = v;
+}
+
+struct icalperiodtype
+icalvalue_get_period(icalvalue* value)
+{
+ icalerror_check_arg( (value!=0),"value");
+ icalerror_check_value_type(value, ICAL_PERIOD_VALUE);
+
+ return ((struct icalvalue_impl*)value)->data.v_period;
+}
+
+
+icalvalue*
+icalvalue_new_string (char* v)
+{
+ struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_STRING_VALUE);
+
+ icalerror_check_arg_rz( (v!=0),"v");
+
+ icalvalue_set_string((icalvalue*)impl,v);
+
+ return (icalvalue*)impl;
+}
+
+void
+icalvalue_set_string(icalvalue* value, char* v)
+{
+ struct icalvalue_impl* impl;
+
+ icalerror_check_arg_rv( (value!=0),"value");
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ icalerror_check_value_type(value, ICAL_STRING_VALUE);
+
+ impl = (struct icalvalue_impl*)value;
+ impl->data.v_string = strdup(v);
+
+ if (impl->data.v_string == 0){
+ errno = ENOMEM;
+ }
+
+}
+
+char*
+icalvalue_get_string(icalvalue* value)
+{
+ icalerror_check_arg( (value!=0),"value");
+ icalerror_check_value_type(value, ICAL_STRING_VALUE);
+
+ return ((struct icalvalue_impl*)value)->data.v_string;
+}
+
+
+icalvalue*
+icalvalue_new_text (char* v)
+{
+ struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_TEXT_VALUE);
+
+ icalerror_check_arg_rz( (v!=0),"v");
+
+ icalvalue_set_text((icalvalue*)impl,v);
+
+ return (icalvalue*)impl;
+}
+
+void
+icalvalue_set_text(icalvalue* value, char* v)
+{
+ struct icalvalue_impl* impl;
+
+ icalerror_check_arg_rv( (value!=0),"value");
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ icalerror_check_value_type(value, ICAL_TEXT_VALUE);
+
+ impl = (struct icalvalue_impl*)value;
+ impl->data.v_string = strdup(v);
+
+ if (impl->data.v_string == 0){
+ errno = ENOMEM;
+ }
+
+}
+
+char*
+icalvalue_get_text(icalvalue* value)
+{
+ icalerror_check_arg( (value!=0),"value");
+ icalerror_check_value_type(value, ICAL_TEXT_VALUE);
+
+ return ((struct icalvalue_impl*)value)->data.v_string;
+}
+
+
+icalvalue*
+icalvalue_new_time (struct icaltimetype v)
+{
+ struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_TIME_VALUE);
+
+
+ icalvalue_set_time((icalvalue*)impl,v);
+
+ return (icalvalue*)impl;
+}
+
+void
+icalvalue_set_time(icalvalue* value, struct icaltimetype v)
+{
+ struct icalvalue_impl* impl;
+
+ icalerror_check_arg_rv( (value!=0),"value");
+
+ icalerror_check_value_type(value, ICAL_TIME_VALUE);
+
+ impl = (struct icalvalue_impl*)value;
+ impl->data.v_time = v;
+}
+
+struct icaltimetype
+icalvalue_get_time(icalvalue* value)
+{
+ icalerror_check_arg( (value!=0),"value");
+ icalerror_check_value_type(value, ICAL_TIME_VALUE);
+
+ return ((struct icalvalue_impl*)value)->data.v_time;
+}
+
+
+icalvalue*
+icalvalue_new_trigger (union icaltriggertype v)
+{
+ struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_TRIGGER_VALUE);
+
+
+ icalvalue_set_trigger((icalvalue*)impl,v);
+
+ return (icalvalue*)impl;
+}
+
+void
+icalvalue_set_trigger(icalvalue* value, union icaltriggertype v)
+{
+ struct icalvalue_impl* impl;
+
+ icalerror_check_arg_rv( (value!=0),"value");
+
+ icalerror_check_value_type(value, ICAL_TRIGGER_VALUE);
+
+ impl = (struct icalvalue_impl*)value;
+ impl->data.v_trigger = v;
+}
+
+union icaltriggertype
+icalvalue_get_trigger(icalvalue* value)
+{
+ icalerror_check_arg( (value!=0),"value");
+ icalerror_check_value_type(value, ICAL_TRIGGER_VALUE);
+
+ return ((struct icalvalue_impl*)value)->data.v_trigger;
+}
+
+
+icalvalue*
+icalvalue_new_uri (char* v)
+{
+ struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_URI_VALUE);
+
+ icalerror_check_arg_rz( (v!=0),"v");
+
+ icalvalue_set_uri((icalvalue*)impl,v);
+
+ return (icalvalue*)impl;
+}
+
+void
+icalvalue_set_uri(icalvalue* value, char* v)
+{
+ struct icalvalue_impl* impl;
+
+ icalerror_check_arg_rv( (value!=0),"value");
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ icalerror_check_value_type(value, ICAL_URI_VALUE);
+
+ impl = (struct icalvalue_impl*)value;
+ impl->data.v_string = strdup(v);
+
+ if (impl->data.v_string == 0){
+ errno = ENOMEM;
+ }
+
+}
+
+char*
+icalvalue_get_uri(icalvalue* value)
+{
+ icalerror_check_arg( (value!=0),"value");
+ icalerror_check_value_type(value, ICAL_URI_VALUE);
+
+ return ((struct icalvalue_impl*)value)->data.v_string;
+}
+
+
+icalvalue*
+icalvalue_new_utcoffset (int v)
+{
+ struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_UTCOFFSET_VALUE);
+
+
+ icalvalue_set_utcoffset((icalvalue*)impl,v);
+
+ return (icalvalue*)impl;
+}
+
+void
+icalvalue_set_utcoffset(icalvalue* value, int v)
+{
+ struct icalvalue_impl* impl;
+
+ icalerror_check_arg_rv( (value!=0),"value");
+
+ icalerror_check_value_type(value, ICAL_UTCOFFSET_VALUE);
+
+ impl = (struct icalvalue_impl*)value;
+ impl->data.v_int = v;
+}
+
+int
+icalvalue_get_utcoffset(icalvalue* value)
+{
+ icalerror_check_arg( (value!=0),"value");
+ icalerror_check_value_type(value, ICAL_UTCOFFSET_VALUE);
+
+ return ((struct icalvalue_impl*)value)->data.v_int;
+}
+
+
+icalvalue*
+icalvalue_new_query (char* v)
+{
+ struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_QUERY_VALUE);
+
+ icalerror_check_arg_rz( (v!=0),"v");
+
+ icalvalue_set_query((icalvalue*)impl,v);
+
+ return (icalvalue*)impl;
+}
+
+void
+icalvalue_set_query(icalvalue* value, char* v)
+{
+ struct icalvalue_impl* impl;
+
+ icalerror_check_arg_rv( (value!=0),"value");
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ icalerror_check_value_type(value, ICAL_QUERY_VALUE);
+
+ impl = (struct icalvalue_impl*)value;
+ impl->data.v_string = strdup(v);
+
+ if (impl->data.v_string == 0){
+ errno = ENOMEM;
+ }
+
+}
+
+char*
+icalvalue_get_query(icalvalue* value)
+{
+ icalerror_check_arg( (value!=0),"value");
+ icalerror_check_value_type(value, ICAL_QUERY_VALUE);
+
+ return ((struct icalvalue_impl*)value)->data.v_string;
+}
+
diff --git a/libical/src/libical/icalvalue.h b/libical/src/libical/icalvalue.h
new file mode 100644
index 0000000000..ec7457d6aa
--- /dev/null
+++ b/libical/src/libical/icalvalue.h
@@ -0,0 +1,169 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalvalue.h
+ CREATOR: eric 20 March 1999
+
+
+ $Id$
+ $Locker$
+
+
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The original author is Eric Busboom
+ The original code is icalvalue.h
+
+ ======================================================================*/
+
+#ifndef ICALVALUE_H
+#define ICALVALUE_H
+
+#include <time.h>
+#include "icalenums.h"
+#include "icaltypes.h"
+
+typedef void icalvalue;
+
+icalvalue* icalvalue_new(icalvalue_kind kind);
+
+icalvalue* icalvalue_new_clone(icalvalue* value);
+
+icalvalue* icalvalue_new_from_string(icalvalue_kind kind, char* str);
+
+void icalvalue_free(icalvalue* value);
+
+int icalvalue_is_valid(icalvalue* value);
+
+char* icalvalue_as_ical_string(icalvalue* value);
+
+icalvalue_kind icalvalue_isa(icalvalue* value);
+
+int icalvalue_isa_value(void*);
+
+icalparameter_xliccomparetype
+icalvalue_compare(icalvalue* a, icalvalue *b);
+
+/* Everything below this line is machine generated. Do not edit. */
+/* ATTACH # Non-std */
+icalvalue* icalvalue_new_attach(struct icalattachtype v);
+struct icalattachtype icalvalue_get_attach(icalvalue* value);
+void icalvalue_set_attach(icalvalue* value, struct icalattachtype v);
+
+/* BINARY */
+icalvalue* icalvalue_new_binary(char* v);
+char* icalvalue_get_binary(icalvalue* value);
+void icalvalue_set_binary(icalvalue* value, char* v);
+
+/* BOOLEAN */
+icalvalue* icalvalue_new_boolean(int v);
+int icalvalue_get_boolean(icalvalue* value);
+void icalvalue_set_boolean(icalvalue* value, int v);
+
+/* CAL-ADDRESS */
+icalvalue* icalvalue_new_caladdress(char* v);
+char* icalvalue_get_caladdress(icalvalue* value);
+void icalvalue_set_caladdress(icalvalue* value, char* v);
+
+/* DATE */
+icalvalue* icalvalue_new_date(struct icaltimetype v);
+struct icaltimetype icalvalue_get_date(icalvalue* value);
+void icalvalue_set_date(icalvalue* value, struct icaltimetype v);
+
+/* DATE-TIME */
+icalvalue* icalvalue_new_datetime(struct icaltimetype v);
+struct icaltimetype icalvalue_get_datetime(icalvalue* value);
+void icalvalue_set_datetime(icalvalue* value, struct icaltimetype v);
+
+/* DATE-TIME-DATE # Non-std */
+icalvalue* icalvalue_new_datetimedate(struct icaltimetype v);
+struct icaltimetype icalvalue_get_datetimedate(icalvalue* value);
+void icalvalue_set_datetimedate(icalvalue* value, struct icaltimetype v);
+
+/* DATE-TIME-PERIOD # Non-std */
+icalvalue* icalvalue_new_datetimeperiod(struct icalperiodtype v);
+struct icalperiodtype icalvalue_get_datetimeperiod(icalvalue* value);
+void icalvalue_set_datetimeperiod(icalvalue* value, struct icalperiodtype v);
+
+/* DURATION */
+icalvalue* icalvalue_new_duration(struct icaldurationtype v);
+struct icaldurationtype icalvalue_get_duration(icalvalue* value);
+void icalvalue_set_duration(icalvalue* value, struct icaldurationtype v);
+
+/* FLOAT */
+icalvalue* icalvalue_new_float(float v);
+float icalvalue_get_float(icalvalue* value);
+void icalvalue_set_float(icalvalue* value, float v);
+
+/* GEO # Non-std */
+icalvalue* icalvalue_new_geo(struct icalgeotype v);
+struct icalgeotype icalvalue_get_geo(icalvalue* value);
+void icalvalue_set_geo(icalvalue* value, struct icalgeotype v);
+
+/* INTEGER */
+icalvalue* icalvalue_new_integer(int v);
+int icalvalue_get_integer(icalvalue* value);
+void icalvalue_set_integer(icalvalue* value, int v);
+
+/* METHOD # Non-std */
+icalvalue* icalvalue_new_method(icalproperty_method v);
+icalproperty_method icalvalue_get_method(icalvalue* value);
+void icalvalue_set_method(icalvalue* value, icalproperty_method v);
+
+/* PERIOD */
+icalvalue* icalvalue_new_period(struct icalperiodtype v);
+struct icalperiodtype icalvalue_get_period(icalvalue* value);
+void icalvalue_set_period(icalvalue* value, struct icalperiodtype v);
+
+/* RECUR */
+icalvalue* icalvalue_new_recur(struct icalrecurrencetype v);
+struct icalrecurrencetype icalvalue_get_recur(icalvalue* value);
+void icalvalue_set_recur(icalvalue* value, struct icalrecurrencetype v);
+
+/* STRING # Non-std */
+icalvalue* icalvalue_new_string(char* v);
+char* icalvalue_get_string(icalvalue* value);
+void icalvalue_set_string(icalvalue* value, char* v);
+
+/* TEXT */
+icalvalue* icalvalue_new_text(char* v);
+char* icalvalue_get_text(icalvalue* value);
+void icalvalue_set_text(icalvalue* value, char* v);
+
+/* TIME */
+icalvalue* icalvalue_new_time(struct icaltimetype v);
+struct icaltimetype icalvalue_get_time(icalvalue* value);
+void icalvalue_set_time(icalvalue* value, struct icaltimetype v);
+
+/* TRIGGER # Non-std */
+icalvalue* icalvalue_new_trigger(union icaltriggertype v);
+union icaltriggertype icalvalue_get_trigger(icalvalue* value);
+void icalvalue_set_trigger(icalvalue* value, union icaltriggertype v);
+
+/* URI */
+icalvalue* icalvalue_new_uri(char* v);
+char* icalvalue_get_uri(icalvalue* value);
+void icalvalue_set_uri(icalvalue* value, char* v);
+
+/* UTC-OFFSET */
+icalvalue* icalvalue_new_utcoffset(int v);
+int icalvalue_get_utcoffset(icalvalue* value);
+void icalvalue_set_utcoffset(icalvalue* value, int v);
+
+/* QUERY */
+icalvalue* icalvalue_new_query(char* v);
+char* icalvalue_get_query(icalvalue* value);
+void icalvalue_set_query(icalvalue* value, char* v);
+
+#endif ICALVALUE_H
diff --git a/libical/src/libical/icalvcal.h b/libical/src/libical/icalvcal.h
new file mode 100644
index 0000000000..3a1098e6c2
--- /dev/null
+++ b/libical/src/libical/icalvcal.h
@@ -0,0 +1,39 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalvcal.h
+ CREATOR: eric 13 January 2000
+
+
+ $Id$
+ $Locker$
+
+ (C) COPYRIGHT 2000 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The Original Code is eric. The Initial Developer of the Original
+ Code is Eric Busboom
+
+
+======================================================================*/
+
+#ifndef ICALVCAL_H
+#define ICALVCAL_H
+
+VCalObject* icalvcal_new_vcal_from_ical(icalcomponent* component);
+icalcomponent* icalvcal_new_ical_from_vcal(VCalObject* vcal);
+
+
+#endif /* !ICALVCAL_H */
+
+
+
diff --git a/libical/src/libical/icalversion.h.in b/libical/src/libical/icalversion.h.in
new file mode 100644
index 0000000000..aaeeed6666
--- /dev/null
+++ b/libical/src/libical/icalversion.h.in
@@ -0,0 +1,3 @@
+
+#define ICAL_PACKAGE "@PACKAGE@"
+#define ICAL_VERSION "@VERSION@"
diff --git a/libical/src/libical/icalyacc.y b/libical/src/libical/icalyacc.y
new file mode 100644
index 0000000000..cffcec96d6
--- /dev/null
+++ b/libical/src/libical/icalyacc.y
@@ -0,0 +1,480 @@
+%{
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: icalitip.y
+ CREATOR: eric 10 June 1999
+
+ DESCRIPTION:
+
+ $Id: icalyacc.y,v 1.3 2000/05/15 06:18:18 ericb Exp $
+ $Locker: $
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The original author is Eric Busboom
+ The original code is icalitip.y
+
+
+
+ ================================b======================================*/
+
+#include <stdlib.h>
+#include <string.h> /* for strdup() */
+#include <limits.h> /* for SHRT_MAX*/
+#include "icalparser.h"
+#include "ical.h"
+#include "pvl.h"
+#define YYERROR_VERBOSE
+#define YYDEBUG 1
+
+
+icalvalue *icalparser_yy_value; /* Current Value */
+
+/* Globals for UTCOFFSET values */
+int utc;
+int utc_b;
+int utcsign;
+
+/* Globals for DURATION values */
+struct icaldurationtype duration;
+
+/* Globals for RECUR values */
+struct icalrecurrencetype recur;
+short skiplist[367];
+short skippos;
+
+void copy_list(short* array, size_t size);
+void clear_recur();
+void add_prop(icalproperty_kind);
+void icalparser_fill_date(struct tm* t, char* dstr);
+void icalparser_fill_time(struct tm* t, char* tstr);
+void set_value_type(icalvalue_kind kind);
+void set_parser_value_state();
+struct icaltimetype fill_datetime(char* d, char* t);
+void ical_yy_error(char *s); /* Don't know why I need this.... */
+/*int yylex(void); /* Or this. */
+
+
+
+/* Set the state of the lexer so it will interpret values ( iCAL
+ VALUEs, that is, ) correctly. */
+
+%}
+
+%union {
+ float v_float;
+ int v_int;
+ char* v_string;
+
+ /* Renaming hack */
+#define yymaxdepth ical_yy_maxdepth
+#define yyparse ical_yy_parse
+#define yylex ical_yy_lex
+#define yyerror ical_yy_error
+#define yylval ical_yy_lval
+#define yychar ical_yy_char
+#define yydebug ical_yy_debug
+#define yypact ical_yy_pact
+#define yyr1 ical_yy_r1
+#define yyr2 ical_yy_r2
+#define yydef ical_yy_def
+#define yychk ical_yy_chk
+#define yypgo ical_yy_pgo
+#define yyact ical_yy_act
+#define yyexca ical_yy_exca
+#define yyerrflag ical_yy_errflag
+#define yynerrs ical_yy_nerrs
+#define yyps ical_yy_ps
+#define yypv ical_yy_pv
+#define yys ical_yy_s
+#define yy_yys ical_yy_yys
+#define yystate ical_yy_state
+#define yytmp ical_yy_tmp
+#define yyv ical_yy_v
+#define yy_yyv ical_yy_yyv
+#define yyval ical_yy_val
+#define yylloc ical_yy_lloc
+#define yyreds ical_yy_reds
+#define yytoks ical_yy_toks
+#define yylhs ical_yy_yylhs
+#define yylen ical_yy_yylen
+#define yydefred ical_yy_yydefred
+#define yydgoto ical_yy_yydgoto
+#define yydefred ical_yy_yydefred
+#define yydgoto ical_yy_yydgoto
+#define yysindex ical_yy_yysindex
+#define yyrindex ical_yy_yyrindex
+#define yygindex ical_yy_yygindex
+#define yytable ical_yy_yytable
+#define yycheck ical_yy_yycheck
+#define yyname ical_yy_yyname
+#define yyrule ical_yy_yyrule
+
+
+
+}
+
+%token <v_string> DIGITS
+%token <v_int> INTNUMBER
+%token <v_float> FLOATNUMBER
+%token <v_string> STRING
+%token EOL EQUALS CHARACTER COLON COMMA SEMICOLON TIMESEPERATOR
+
+%token TRUE FALSE
+
+%token FREQ BYDAY BYHOUR BYMINUTE BYMONTH BYMONTHDAY BYSECOND BYSETPOS BYWEEKNO
+%token BYYEARDAY DAILY MINUTELY MONTHLY SECONDLY WEEKLY HOURLY YEARLY
+%token INTERVAL COUNT UNTIL WKST MO SA SU TU WE TH FR
+
+%token BIT8 ACCEPTED ADD AUDIO BASE64 BINARY BOOLEAN BUSY BUSYTENTATIVE
+%token BUSYUNAVAILABLE CALADDRESS CANCEL CANCELLED CHAIR CHILD COMPLETED
+%token CONFIDENTIAL CONFIRMED COUNTER DATE DATETIME DECLINECOUNTER DECLINED
+%token DELEGATED DISPLAY DRAFT DURATION EMAIL END FINAL FLOAT FREE GREGORIAN
+%token GROUP INDIVIDUAL INPROCESS INTEGER NEEDSACTION NONPARTICIPANT
+%token OPAQUE OPTPARTICIPANT PARENT PERIOD PRIVATE PROCEDURE PUBLIC PUBLISH
+%token RECUR REFRESH REPLY REQPARTICIPANT REQUEST RESOURCE ROOM SIBLING
+%token START TENTATIVE TEXT THISANDFUTURE THISANDPRIOR TIME TRANSPAENT
+%token UNKNOWN UTCOFFSET XNAME
+
+%token ALTREP CN CUTYPE DAYLIGHT DIR ENCODING EVENT FBTYPE FMTTYPE LANGUAGE
+%token MEMBER PARTSTAT RANGE RELATED RELTYPE ROLE RSVP SENTBY STANDARD URI
+
+%token TIME_CHAR UTC_CHAR
+
+
+%%
+
+value:
+ binary_value
+ | boolean_value
+ | date_value
+ | datetime_value
+ | duration_value
+ | period_value
+ | recur_value
+ | utcoffset_value
+ | error {
+ icalparser_yy_value = 0;
+ icalparser_clear_flex_input();
+ yyclearin;
+ }
+
+binary_value: "unimplemented2"
+
+boolean_value:
+ TRUE
+ { icalparser_yy_value = icalvalue_new_boolean(1); }
+ | FALSE
+ { icalparser_yy_value = icalvalue_new_boolean(0); }
+
+date_value: DIGITS
+ {
+ struct icaltimetype stm;
+
+ stm = fill_datetime($1,0);
+
+ stm.hour = -1;
+ stm.minute = -1;
+ stm.second = -1;
+ stm.is_utc = 0;
+ stm.is_date = 1;
+
+ icalparser_yy_value = icalvalue_new_date(stm);
+ }
+
+utc_char:
+ /*empty*/ {utc = 0;}
+ | UTC_CHAR {utc = 1;}
+
+/* This is used in the period_value, where there may be two utc characters per rule. */
+utc_char_b:
+ /*empty*/ {utc_b = 0;}
+ | UTC_CHAR {utc_b = 1;}
+
+datetime_value:
+ DIGITS TIME_CHAR DIGITS utc_char
+ {
+ struct icaltimetype stm;
+ stm = fill_datetime($1, $3);
+ stm.is_utc = utc;
+ stm.is_date = 0;
+
+ icalparser_yy_value =
+ icalvalue_new_datetime(stm);
+ }
+
+
+/* Duration */
+
+
+dur_date: dur_day
+ | dur_day dur_time
+
+dur_week: DIGITS 'W'
+ {
+ duration.weeks = atoi($1);
+ }
+
+dur_time: TIME_CHAR dur_hour
+ {
+ }
+ | TIME_CHAR dur_minute
+ {
+ }
+ | TIME_CHAR dur_second
+ {
+ }
+
+dur_hour: DIGITS 'H'
+ {
+ duration.hours = atoi($1);
+ }
+ | DIGITS 'H' dur_minute
+ {
+ duration.hours = atoi($1);
+ }
+
+dur_minute: DIGITS 'M'
+ {
+ duration.minutes = atoi($1);
+ }
+ | DIGITS 'M' dur_second
+ {
+ duration.minutes = atoi($1);
+ }
+
+dur_second: DIGITS 'S'
+ {
+ duration.seconds = atoi($1);
+ }
+
+dur_day: DIGITS 'D'
+ {
+ duration.days = atoi($1);
+ }
+
+dur_prefix: /* empty */
+ {
+ }
+ | '+'
+ {
+ }
+ | '-'
+ {
+ }
+
+duration_value: dur_prefix 'P' dur_date
+ {
+ icalparser_yy_value = icalvalue_new_duration(duration);
+ memset(&duration,0, sizeof(duration));
+ }
+ | dur_prefix 'P' dur_time
+ {
+ icalparser_yy_value = icalvalue_new_duration(duration);
+ memset(&duration,0, sizeof(duration));
+ }
+ | dur_prefix 'P' dur_week
+ {
+ icalparser_yy_value = icalvalue_new_duration(duration);
+ memset(&duration,0, sizeof(duration));
+ }
+
+
+/* Period */
+
+period_value: DIGITS TIME_CHAR DIGITS utc_char '/' DIGITS TIME_CHAR DIGITS utc_char_b
+ {
+ struct icalperiodtype p;
+
+ p.start = fill_datetime($1,$3);
+ p.start.is_utc = utc;
+ p.start.is_date = 0;
+
+
+ p.end = fill_datetime($6,$8);
+ p.end.is_utc = utc_b;
+ p.end.is_date = 0;
+
+ p.duration.days = -1;
+ p.duration.weeks = -1;
+ p.duration.hours = -1;
+ p.duration.minutes = -1;
+ p.duration.seconds = -1;
+
+ icalparser_yy_value = icalvalue_new_period(p);
+ }
+ | DIGITS TIME_CHAR DIGITS utc_char '/' duration_value
+ {
+ struct icalperiodtype p;
+
+ p.start = fill_datetime($1,$3);
+ p.start.is_utc = utc;
+ p.start.is_date = 0;
+
+ p.end.year = -1;
+ p.end.month = -1;
+ p.end.day = -1;
+ p.end.hour = -1;
+ p.end.minute = -1;
+ p.end.second = -1;
+
+ /* The duration_value rule setes the global 'duration'
+ variable, but it also creates a new value in
+ icalparser_yy_value. So, free that, then copy
+ 'duration' into the icalperiodtype struct. */
+
+ p.duration = icalvalue_get_duration(icalparser_yy_value);
+ icalvalue_free(icalparser_yy_value);
+ icalparser_yy_value = 0;
+
+ icalparser_yy_value = icalvalue_new_period(p);
+
+ }
+
+
+
+/* Recur */
+
+recur_start:
+ FREQ EQUALS SECONDLY {clear_recur();recur.freq = ICAL_SECONDLY_RECURRENCE;}
+ | FREQ EQUALS MINUTELY {clear_recur();recur.freq = ICAL_MINUTELY_RECURRENCE;}
+ | FREQ EQUALS HOURLY {clear_recur();recur.freq = ICAL_HOURLY_RECURRENCE;}
+ | FREQ EQUALS DAILY {clear_recur();recur.freq = ICAL_DAILY_RECURRENCE;}
+ | FREQ EQUALS WEEKLY {clear_recur();recur.freq = ICAL_WEEKLY_RECURRENCE;}
+ | FREQ EQUALS MONTHLY {clear_recur();recur.freq = ICAL_MONTHLY_RECURRENCE;}
+ | FREQ EQUALS YEARLY {clear_recur();recur.freq = ICAL_YEARLY_RECURRENCE;}
+ ;
+
+
+weekday:
+ SU { skiplist[skippos]=ICAL_SUNDAY_WEEKDAY; if( skippos<8) skippos++;}
+ | MO { skiplist[skippos]=ICAL_MONDAY_WEEKDAY;if( skippos<8) skippos++;}
+ | TU { skiplist[skippos]=ICAL_TUESDAY_WEEKDAY;if( skippos<8) skippos++;}
+ | WE { skiplist[skippos]=ICAL_WEDNESDAY_WEEKDAY;if( skippos<8) skippos++;}
+ | TH { skiplist[skippos]=ICAL_THURSDAY_WEEKDAY;if( skippos<8) skippos++;}
+ | FR { skiplist[skippos]=ICAL_FRIDAY_WEEKDAY;if( skippos<8) skippos++;}
+ | SA { skiplist[skippos]=ICAL_SATURDAY_WEEKDAY;if( skippos<8) skippos++;}
+ ;
+
+
+weekday_list:
+ weekday
+ | DIGITS weekday { } /* HACK Incorectly handles int in BYDAY */
+ | weekday_list COMMA weekday
+
+
+recur_list:
+ DIGITS { skiplist[skippos] = atoi($1); skippos++;}
+ | recur_list COMMA DIGITS { skiplist[skippos] = atoi($3); if (skippos<367) skippos++;}
+ ;
+
+recur_skip:
+ INTERVAL EQUALS DIGITS {recur.interval = atoi($3);}
+ | WKST EQUALS SU {recur.week_start = ICAL_SUNDAY_WEEKDAY;}
+ | WKST EQUALS MO {recur.week_start = ICAL_MONDAY_WEEKDAY;}
+ | WKST EQUALS TU {recur.week_start = ICAL_TUESDAY_WEEKDAY;}
+ | WKST EQUALS WE {recur.week_start = ICAL_WEDNESDAY_WEEKDAY;}
+ | WKST EQUALS TH {recur.week_start = ICAL_THURSDAY_WEEKDAY;}
+ | WKST EQUALS FR {recur.week_start = ICAL_FRIDAY_WEEKDAY;}
+ | WKST EQUALS SA {recur.week_start = ICAL_SATURDAY_WEEKDAY;}
+ | BYSECOND EQUALS recur_list{copy_list(recur.by_second,60);}
+ | BYMINUTE EQUALS recur_list{copy_list(recur.by_minute,60);}
+ | BYHOUR EQUALS recur_list{copy_list(recur.by_hour,24);}
+ | BYDAY EQUALS weekday_list{copy_list(recur.by_day,7);}
+ | BYMONTH EQUALS recur_list{copy_list(recur.by_month,12);}
+ | BYMONTHDAY EQUALS recur_list{copy_list(recur.by_month_day,31);}
+ | BYYEARDAY EQUALS recur_list{copy_list(recur.by_year_day,366);}
+ | BYWEEKNO EQUALS recur_list{copy_list(recur.by_week_no,53);}
+ | BYSETPOS EQUALS recur_list{copy_list(recur.by_set_pos,366);}
+ | UNTIL EQUALS datetime_value
+ { recur.until = icalvalue_get_datetime(icalparser_yy_value);
+ icalvalue_free(icalparser_yy_value); icalparser_yy_value=0;}
+ | UNTIL EQUALS date_value
+ { recur.until = icalvalue_get_date(icalparser_yy_value);
+ icalvalue_free(icalparser_yy_value); icalparser_yy_value=0;}
+ | COUNT EQUALS DIGITS
+ { recur.count = atoi($3); }
+ ;
+
+recur_skip_list:
+ /* empty */
+ | recur_skip_list SEMICOLON recur_skip
+
+recur_value:
+ recur_start recur_skip_list
+ { icalparser_yy_value = icalvalue_new_recur(recur); }
+
+
+
+/* UTC Offset */
+
+plusminus: '+' { utcsign = 1; }
+ | '-' { utcsign = -1; }
+
+utcoffset_value:
+ plusminus INTNUMBER INTNUMBER
+ {
+ icalparser_yy_value = icalvalue_new_utcoffset( utcsign * ($2*3600) + ($3*60) );
+ }
+
+ | plusminus INTNUMBER INTNUMBER INTNUMBER
+ {
+ icalparser_yy_value = icalvalue_new_utcoffset(utcsign * ($2*3600) + ($3*60) +($4));
+ }
+
+
+
+%%
+
+
+void clear_recur()
+{
+ memset(&skiplist, ICAL_RECURRENCE_ARRAY_MAX_BYTE, sizeof(skiplist));
+ skippos = 0;
+
+ icalrecurrencetype_clear(&recur);
+}
+
+void copy_list(short* array, size_t size)
+{
+ memcpy(array, skiplist, size*sizeof(short));
+ memset(&skiplist,ICAL_RECURRENCE_ARRAY_MAX_BYTE, sizeof(skiplist));
+ skippos = 0;
+}
+
+struct icaltimetype fill_datetime(char* datestr, char* timestr)
+{
+ struct icaltimetype stm;
+
+ memset(&stm,0,sizeof(stm));
+
+ if (datestr != 0){
+ sscanf(datestr,"%4d%2d%2d",&(stm.year), &(stm.month),
+ &(stm.day));
+ }
+
+ if (timestr != 0){
+ sscanf(timestr,"%2d%2d%2d", &(stm.hour), &(stm.minute),
+ &(stm.second));
+ }
+
+ return stm;
+
+}
+
+void yyerror(char* s)
+{
+ /*fprintf(stderr,"Parse error \'%s\'\n", s);*/
+}
+
diff --git a/libical/src/libical/locking.c b/libical/src/libical/locking.c
new file mode 100644
index 0000000000..0376bc2bec
--- /dev/null
+++ b/libical/src/libical/locking.c
@@ -0,0 +1,143 @@
+
+/*
+ I Stole this from:
+ http://www.cis.temple.edu/~ingargio/old/cis307s96/readings/rwlockexample.html
+
+ CIS 307: An example using Read/Write File Locks
+ [fcntl.h], [fcntl.c], [fcntlmain.c]
+
+In Stevens "Advanced Programming in the Unix Environment" we see ways to use
+the Unix service fcntl to lock portions of a file for reading and writing in
+the manner stated in the Reader and Writer problem [any number of readers at
+a time, but writers must operate alone]. Here we have three files that adapt
+and use the code from Stevens:
+
+*fcntl.h: Specification of the locking functions.
+*fcntl.c: Implementation of the locking functions.
+*fcntlmain.c: Driver that does a simple test of the locking functions.
+
+WARNING: A file lock request which is blocked can be interrupted by a
+signal. In this case the lock operation returns EINTR. Thus we may think we
+got a lock when we really don't. A solution is to block signals when
+locking. Another solution is to test the value returned by the lock
+operation and relock if the value is EINTR. Another solution, which we adopt
+here, is to do nothing about it.
+
+/* fcntl.c -- Defines mutexes in terms of read/write locks on files.
+ * (code is mostly from Stevens: Advanced Programming in the
+ * Unix environment. See from page 367 on.
+ * filerwlock, filerwlockCreate, filerwlockDelete,
+ * filerwreadlock, filerwlongreadlock, filerwlongunlock,
+ * filerwlockUnlock
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+int lock_reg(int, int, int, off_t, int, off_t);
+
+#define read_lock(fd, offset, whence, len) \
+ lock_reg(fd, F_SETLK, F_RDLCK, offset, whence, len)
+
+#define readw_lock(fd, offset, whence, len) \
+ lock_reg(fd, F_SETLKW, F_RDLCK, offset, whence, len)
+
+#define write_lock(fd, offset, whence, len) \
+ lock_reg(fd, F_SETLK, F_WRLCK, offset, whence, len)
+
+#define writew_lock(fd, offset, whence, len) \
+ lock_reg(fd, F_SETLKW, F_WRLCK, offset, whence, len)
+
+#define un_lock(fd, offset, whence, len) \
+ lock_reg(fd, F_SETLK, F_UNLCK, offset, whence, len)
+
+pid_t lock_test(int, int , off_t , int , off_t );
+
+#define is_readlock(fd, offset, whence, len) \
+ lock_test(fd, F_RDLCK, offset, whence, len)
+
+#define is_writelock(fd, offset, whence, len) \
+ lock_test(fd, F_WRLCK, offset, whence, len)
+
+int lock_reg(int fd, int cmd, int type, off_t offset, int whence, off_t len)
+{
+ struct flock lock;
+ lock.l_type = type; /* F_RDLCK, F_WRLCK, F_UNLCK */
+ lock.l_start = offset; /* byte offset relative to l_whence */
+ lock.l_whence = whence; /* SEEK_SET, SEEK_CUR, SEEK_END */
+ lock.l_len = len; /* #bytes (0 means to EOF) */
+ return (fcntl(fd, cmd, &lock));
+}
+
+pid_t lock_test(int fd, int type, off_t offset, int whence, off_t len)
+{
+ struct flock lock;
+ lock.l_type = type; /* F_RDLCK or F_WRLCK */
+ lock.l_start = offset; /* byte offset relative to l_whence */
+ lock.l_whence = whence; /* SEEK_SET, SEEK_CUR, SEEK_END */
+ lock.l_len = len; /* #bytes (0 means to EOF) */
+ if (fcntl(fd,F_GETLK,&lock) < 0){
+ perror("fcntl"); exit(1);}
+ if (lock.l_type == F_UNLCK)
+ return (0); /* false, region is not locked by another process */
+ return (lock.l_pid); /* true, return pid of lock owner */
+}
+
+typedef struct {
+ int fd;
+ int n;} filerwlock;
+
+/* Create N read/write locks and returns the id of this cluster of locks. */
+filerwlock * filerwlockCreate(char *filename, int n) {
+ filerwlock *fl = (filerwlock *)malloc(sizeof(filerwlock));
+ if (((fl->fd) = open(filename, O_RDWR | O_CREAT | O_TRUNC, S_IWUSR)) < 0) {
+ perror("open");
+ exit(1);}
+ fl->n = n;
+ return fl;
+ }
+
+/* Delete the cluster of read/write locks associated with fl. */
+int filerwlockDelete(filerwlock *fl) {
+ if (close(fl->fd) < 0) {
+ perror("close");
+ exit(1);}
+ return free(fl);
+ }
+
+/* Given the read/write lock cluster fl, lock its ith element */
+int filerwreadlock(filerwlock *fl, int i) {
+ if ((i < 0) | (i >= fl->n)) {
+ printf("filerwlockLock needs i in range 0 .. %d\n", (fl->n)-1);
+ exit(0);}
+ readw_lock(fl->fd, i, SEEK_SET, 1);
+ }
+
+int filerwwritelock(filerwlock *fl, int i) {
+ if ((i < 0) | (i >= fl->n)) {
+ printf("filerwlockLock needs i in range 0 .. %d\n", (fl->n)-1);
+ exit(0);}
+ writew_lock(fl->fd, i, SEEK_SET, 1);
+ }
+
+/* Given the lock cluster fl, unlock its ith element */
+int filerwunlock(filerwlock *fl, int i){
+
+ if ((i < 0) | (i >= fl->n)) {
+ printf("filerwlockUnlock needs i in range 0 .. %d\n", (fl->n)-1);
+ exit(0);}
+ un_lock(fl->fd, i, SEEK_SET, 1);
+ }
+
+/* Given the lock cluster fl, it read locks all its elements */
+int filerwlongreadlock(filerwlock *fl) {
+ readw_lock(fl->fd, 0, SEEK_SET, fl->n);
+}
+
+/* Given the lock cluster fl, it unlocks all its elements */
+int filerwlongunlock(filerwlock *fl) {
+ un_lock(fl->fd, 0, SEEK_SET, fl->n);
+}
+
diff --git a/libical/src/libical/pvl.c b/libical/src/libical/pvl.c
new file mode 100644
index 0000000000..d5225a541e
--- /dev/null
+++ b/libical/src/libical/pvl.c
@@ -0,0 +1,768 @@
+/*======================================================================
+ FILE: pvl.c
+ CREATOR: eric November, 1995
+
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+======================================================================*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "pvl.h"
+#include <errno.h>
+#include <assert.h>
+#include <stdlib.h>
+
+
+
+/*
+ struct pvl_list_t
+
+ The list structure. This is the hanlde for the entire list
+
+ This type is also private. Use pvl_list instead
+
+ */
+
+typedef struct pvl_list_t
+{
+ int MAGIC; /* Magic Identifier */
+ struct pvl_elem_t *head; /* Head of list */
+ struct pvl_elem_t *tail; /* Tail of list */
+ int count; /* Number of items in the list */
+ struct pvl_elem_t *p; /* Pointer used for iterators */
+} pvl_list_t;
+
+
+
+
+/* This global is incremented for each call to pvl_new_element(); it gives each
+ * list a unique identifer */
+
+int pvl_elem_count = 0;
+int pvl_list_count = 0;
+
+
+/*----------------------------------------------------------------------
+ Function: pvl_list pvl_newlist()
+
+ Purpose:
+
+ Creates a new list, clears the pointers and assigns a magic number
+
+ Returns:
+
+ Pointer to the new list
+ 0 if there is no available memory.
+ *----------------------------------------------------------------------*/
+
+pvl_list
+pvl_newlist()
+{
+ struct pvl_list_t *L;
+
+ if ( ( L = (struct pvl_list_t*)malloc(sizeof(struct pvl_list_t))) == 0)
+ {
+ errno = ENOMEM;
+ return 0;
+ }
+
+ L->MAGIC = pvl_list_count;
+ pvl_list_count++;
+ L->head = 0;
+ L->tail = 0;
+ L->count = 0;
+ L->p = 0;
+
+ return L;
+}
+
+void
+pvl_free(pvl_list l)
+{
+ struct pvl_list_t *L = (struct pvl_list_t *)l;
+
+ pvl_clear(l);
+
+ free(L);
+}
+
+/*----------------------------------------------------------------------
+ Function: pvl_new_element(void *d, struct pvl_elem_t *next,struct pvl_elem_t *prior)
+
+ Purpose:
+ Creates a new list element, assigns a magic number, and assigns
+ the next and previous pointers.
+
+ Passing in the next and previous points may seem odd, but it allos the user
+ to set them while keeping the internal data hidden. In nearly all cases,
+ the user is the pvl library itself.
+
+ Parameters:
+
+ d The data item to be stored in the list
+ next Pointer value to assign to the member "next"
+ prior Pointer value to assign to the member "prior"
+
+ Returns:
+
+ A pointer to the new element.
+ 0 if there is no memory available.
+
+ *----------------------------------------------------------------------*/
+
+pvl_elem
+pvl_new_element(void *d, pvl_elem next,pvl_elem prior)
+{
+ struct pvl_elem_t *E;
+
+ if ( ( E = (struct pvl_elem_t*)malloc(sizeof(struct pvl_elem_t))) == 0)
+ {
+ errno = ENOMEM;
+ return 0;
+ }
+
+ E->MAGIC = pvl_elem_count++;
+ E->d = d;
+ E->next = next;
+ E->prior = prior;
+
+ return (pvl_elem)E;
+}
+
+/*----------------------------------------------------------------------
+ Function: pvl_unshift(pvl_list l,void *d)
+
+ Purpose:
+
+ Add a new element to the from of the list
+
+ Parameters:
+
+ l The list to add the item to
+ d Pointer to the item to add
+
+ Returns:
+ *----------------------------------------------------------------------*/
+
+void
+pvl_unshift(pvl_list l,void *d)
+{
+ struct pvl_list_t *L = (struct pvl_list_t *)l;
+ struct pvl_elem_t *E = pvl_new_element(d,L->head,0);
+
+ if (E->next != 0)
+ {
+ /* Link the head node to it */
+ E->next->prior = E;
+ }
+
+ /* move the head */
+ L->head = E;
+
+ /* maybe move the tail */
+
+ if (L->tail == 0)
+ {
+ L->tail = E;
+ }
+
+ L->count++;
+}
+
+/*----------------------------------------------------------------------
+ Function: pvl_shift(pvl_list l)
+
+ Purpose:
+
+ Remove an element from the front of the list
+
+ Parameters:
+
+ l The list to operate on
+
+ Returns:
+ *----------------------------------------------------------------------*/
+
+void*
+pvl_shift(pvl_list l)
+{
+ struct pvl_list_t *L = (struct pvl_list_t *)l;
+
+ if (L->head == 0)
+ {
+ return 0;
+ }
+
+ return pvl_remove(l,(void*)L->head);
+
+}
+
+/*----------------------------------------------------------------------
+ Function: void pvl_push(pvl_list l,void *d)
+
+ Purpose:
+
+ Add a new item to the tail of the list
+
+ Paramters:
+
+ l The list to operate on
+ d Pointer to the item to add
+
+ Returns:
+ *----------------------------------------------------------------------*/
+
+void
+pvl_push(pvl_list l,void *d)
+{
+ struct pvl_list_t *L = (struct pvl_list_t *)l;
+ struct pvl_elem_t *E = pvl_new_element(d,0,L->tail);
+
+ /* These are done in pvl_new_element
+ E->next = 0;
+ E->prior = L->tail;
+ */
+
+ if (L->tail != 0)
+ {
+ L->tail->next = E;
+ }
+
+ if (L->head == 0)
+ {
+ L->head = E;
+ }
+
+ L->tail = E;
+
+ L->count++;
+
+}
+
+/*----------------------------------------------------------------------
+ Function: void* pvl_pop(pvl_list l)
+
+ Purpose:
+
+ Remove an element from the tail of the list
+
+ Paramters:
+
+ l The list to operate on
+
+ Returns:
+ *----------------------------------------------------------------------*/
+
+void*
+pvl_pop(pvl_list l)
+{
+
+ struct pvl_list_t *L = (struct pvl_list_t *)l;
+
+ if ( L->tail == 0)
+ {
+ return 0;
+ }
+
+ return pvl_remove(l,(void*) L->tail);;
+
+}
+
+
+/*----------------------------------------------------------------------
+ Function: void pvl_insert_ordered(pvl_list l,pvl_comparef f,void *d)
+
+ Purpose:
+
+ Add a new item to a list that is ordered by a comparison function.
+ This routine assumes that the list is properly ordered.
+
+ l The list to operate on
+ f Pointer to a comparison function
+ d Pointer to data to pass to the comparison function
+
+ Returns:
+
+ void
+
+ *----------------------------------------------------------------------*/
+
+void
+pvl_insert_ordered(pvl_list l,pvl_comparef f,void *d)
+{
+ struct pvl_list_t *L = (struct pvl_list_t *)l;
+
+ struct pvl_elem_t *P;
+
+ L->count++;
+
+ /* Empty list, add to head */
+
+ if(L->head == 0)
+ {
+ pvl_unshift(l,d);
+ return;
+ }
+
+ /* smaller than head, add to head */
+
+ if ( ((*f)(d,L->head->d)) < 0)
+ {
+ pvl_unshift(l,d);
+ return;
+ }
+
+ /* larger than tail, add to tail */
+ if ( (*f)(d,L->tail->d) > 0)
+ {
+ pvl_push(l,d);
+ return;
+ }
+
+
+ /* Search for the first element that is smaller, and add before it */
+
+ for (P=L->head; P != 0; P = P->next)
+ {
+ if ( (*f)(P->d,d) > 0)
+ {
+ pvl_insert_before(l,P,d);
+ return;
+ }
+ }
+
+ /* badness, choke */
+
+ assert(0);
+
+}
+
+/*----------------------------------------------------------------------
+ Function: void pvl_insert_after(pvl_list l,pvl_elem p,void *d)
+
+ Purpose:
+
+ Add a new item after the referenced element.
+
+ Parameters:
+
+ l The list to operate on
+ p The list element to add the item after
+ d Pointer to the item to add.
+
+ Returns:
+
+ void
+
+ *----------------------------------------------------------------------*/
+
+void
+pvl_insert_after(pvl_list l,pvl_elem p,void *d)
+{
+ struct pvl_list_t *L = (struct pvl_list_t *)l;
+ struct pvl_elem_t *P = (struct pvl_elem_t *)p;
+ struct pvl_elem_t *E = 0;
+
+ L->count++;
+
+ if (P == 0)
+ {
+ pvl_unshift(l,d);
+ return;
+ }
+
+ if ( P == L->tail)
+ {
+ E = pvl_new_element(d,0,P);
+ L->tail = E;
+ E->prior->next = E;
+ }
+ else
+ {
+ E = pvl_new_element(d,P->next,P);
+ E->next->prior = E;
+ E->prior->next = E;
+ }
+}
+
+/*----------------------------------------------------------------------
+ Function: void pvl_insert_before(pvl_list l,pvl_elem p,void *d)
+
+ Purpose:
+
+ Add an item after a referenced item
+
+ Parameters:
+
+ l The list to operate on
+ p The list element to add the item before
+ d Pointer to the data to be added.
+
+ Returns:
+ *----------------------------------------------------------------------*/
+
+void
+pvl_insert_before(pvl_list l,pvl_elem p,void *d)
+{
+ struct pvl_list_t *L = (struct pvl_list_t *)l;
+ struct pvl_elem_t *P = (struct pvl_elem_t *)p;
+ struct pvl_elem_t *E = 0;
+
+ L->count++;
+
+ if (P == 0)
+ {
+ pvl_unshift(l,d);
+ return;
+ }
+
+ if ( P == L->head)
+ {
+ E = pvl_new_element(d,P,0);
+ E->next->prior = E;
+ L->head = E;
+ }
+ else
+ {
+ E = pvl_new_element(d,P,P->prior);
+ E->prior->next = E;
+ E->next->prior = E;
+ }
+}
+
+/*----------------------------------------------------------------------
+ Function: void pvl_remove(pvl_list l,pvl_elem e)
+
+ Purpose:
+
+ Remove the referenced item from the list
+
+ This routine will free the element, but not the data item that the
+ element contains.
+
+ Parameters:
+
+ l The list to operate on
+ e The element to remove.
+
+ Returns:
+ *----------------------------------------------------------------------*/
+
+void*
+pvl_remove(pvl_list l,pvl_elem e)
+{
+ struct pvl_list_t *L = (struct pvl_list_t *)l;
+ struct pvl_elem_t *E = (struct pvl_elem_t *)e;
+ void* data;
+
+ if (E == L->head)
+ {
+ if (E->next != 0)
+ {
+ E->next->prior = 0;
+ L->head = E->next;
+ } else {
+ /* E Also points to tail -> only one element in list */
+ L->tail = 0;
+ L->head = 0;
+ }
+ }
+ else if (E == L->tail)
+ {
+ if (E->prior != 0)
+ {
+ E->prior->next = 0;
+ L->tail = E->prior;
+ } else {
+ /* E points to the head, so it was the last element */
+ /* This case should be taken care of in the previous clause */
+ L->head = 0;
+ L->tail = 0;
+ }
+ }
+ else
+ {
+ E->prior->next = E->next;
+ E->next->prior = E->prior;
+ }
+
+
+ L->count--;
+
+ data = E->d;
+
+ free(E);
+
+ return data;
+
+}
+
+/*----------------------------------------------------------------------
+ Function: pvl_elem pvl_find(pvl_list l,pvl_findf f,void* v)
+
+ Purpose:
+
+ Return a pointer to data that satisfies a function
+
+ This routine will interate through the entire list and call the
+ find function for each item. It will break and return a pointer to the
+ data that causes the find function to return 1.
+
+ Parameters:
+
+ l The list to operate on
+ f Pointer to the find function
+ v Pointer to constant data to pass into the function
+
+ Returns:
+
+ Pointer to the element that the find function found.
+
+ *----------------------------------------------------------------------*/
+
+pvl_elem
+pvl_find(pvl_list l,pvl_findf f,void* v)
+{
+ pvl_elem e;
+
+ for (e=pvl_head(l); e!= 0; e = pvl_next(e))
+ {
+ if ( (*f)(((struct pvl_elem_t *)e)->d,v) == 1)
+ {
+ /* Save this elem for a call to find_next */
+ ((struct pvl_list_t *)l)->p = e;
+ return e;
+ }
+ }
+
+ return 0;
+
+}
+/*----------------------------------------------------------------------
+ Function: void* pvl_find_next(pvl_list l,pvl_findf f,void* v)
+
+ Purpose:
+
+ Like pvl_find(), but continues the search where the last find() or
+ find_next() left off
+
+ Parameters:
+
+ l The list to operate on
+ f Pointer to the find function
+ v Pointer to constant data to pass into the function
+
+ Returns:
+
+ Pointer to the element that the find function found.
+
+ *----------------------------------------------------------------------*/
+
+pvl_elem
+pvl_find_next(pvl_list l,pvl_findf f,void* v)
+{
+
+ pvl_elem e;
+
+ for (e=pvl_head(l); e!= 0; e = pvl_next(e))
+ {
+ if ( (*f)(((struct pvl_elem_t *)e)->d,v) == 1)
+ {
+ /* Save this elem for a call to find_next */
+ ((struct pvl_list_t *)l)->p = e;
+ return e;
+ }
+ }
+
+ return 0;
+
+}
+
+/*----------------------------------------------------------------------
+ Function: void pvl_clear(pvl_list l)
+
+ Purpose:
+
+ Remove the all the elements in the list. The does not free the data items
+ the elements hold.
+
+
+ Returns:
+ *----------------------------------------------------------------------*/
+
+void
+pvl_clear(pvl_list l)
+{
+ pvl_elem e = pvl_head(l);
+ pvl_elem next;
+
+ if (e == 0) {
+ return;
+ }
+
+ while(e != 0)
+ {
+ next = pvl_next(e);
+ pvl_remove(l,e);
+ e = next;
+ }
+}
+
+/*----------------------------------------------------------------------
+ Function: int pvl_count(pvl_list l)
+
+ Purpose:
+
+ Returns the number of items in the list.
+
+ Returns:
+ *----------------------------------------------------------------------*/
+
+int
+pvl_count(pvl_list l)
+{
+ struct pvl_list_t *L = (struct pvl_list_t *)l;
+
+ return L->count;
+}
+
+
+/*----------------------------------------------------------------------
+ Function: pvl_elem pvl_next(pvl_elem e)
+
+ Purpose:
+ Returns a pointer to the given element
+
+ Returns:
+ *----------------------------------------------------------------------*/
+
+pvl_elem
+pvl_next(pvl_elem e)
+{
+ struct pvl_elem_t *E = (struct pvl_elem_t *)e;
+
+ if (E == 0){
+ return 0;
+ }
+
+ return (pvl_elem)E->next;
+}
+
+/*----------------------------------------------------------------------
+ Function: pvl_elem pvl_prior(pvl_elem e)
+
+ Purpose:
+
+ Returns a pointer to the element previous to the element given.
+
+ Returns:
+ *----------------------------------------------------------------------*/
+
+pvl_elem
+pvl_prior(pvl_elem e)
+{
+ struct pvl_elem_t *E = (struct pvl_elem_t *)e;
+
+ return (pvl_elem)E->prior;
+}
+
+/*----------------------------------------------------------------------
+ Function: pvl_elem pvl_head(pvl_list l )
+
+ Purpose:
+
+ Returns a pointer to the first item in the list.
+
+ Returns:
+ *----------------------------------------------------------------------*/
+pvl_elem
+pvl_head(pvl_list l )
+{
+ struct pvl_list_t *L = (struct pvl_list_t *)l;
+
+ return (pvl_elem)L->head;
+}
+
+/*----------------------------------------------------------------------
+ Function: pvl_elem pvl_tail(pvl_list l)
+
+ Purpose:
+
+ Returns a pointer to the last item in the list.
+
+ Returns:
+ *----------------------------------------------------------------------*/
+pvl_elem
+pvl_tail(pvl_list l)
+{
+ struct pvl_list_t *L = (struct pvl_list_t *)l;
+ return (pvl_elem)L->tail;
+}
+
+/*----------------------------------------------------------------------
+ Function:
+
+
+ Purpose:
+
+
+ Returns:
+ *----------------------------------------------------------------------*/
+
+#ifndef PVL_USE_MACROS
+void*
+pvl_data(pvl_elem e)
+{
+ struct pvl_elem_t *E = (struct pvl_elem_t *)e;
+
+ if ( e == 0){
+ return 0;
+ }
+
+ return E->d;
+}
+#endif
+
+/*----------------------------------------------------------------------
+ Function: void pvl_apply(pvl_list l,pvl_applyf f, void *v)
+
+ Purpose:
+
+ Call a function for every item in the list.
+
+ Paramters:
+
+ l The list to operate on
+ f Pointer to the function to call
+ v Data to pass to the function on every iteration
+
+ Returns:
+
+ void
+ *----------------------------------------------------------------------*/
+
+void
+pvl_apply(pvl_list l,pvl_applyf f, void *v)
+{
+ pvl_elem e;
+
+ for (e=pvl_head(l); e!= 0; e = pvl_next(e))
+ {
+ (*f)(((struct pvl_elem_t *)e)->d,v);
+ }
+
+}
diff --git a/libical/src/libical/pvl.h b/libical/src/libical/pvl.h
new file mode 100644
index 0000000000..8113f7495a
--- /dev/null
+++ b/libical/src/libical/pvl.h
@@ -0,0 +1,104 @@
+/*======================================================================
+ FILE: pvl.h
+ CREATOR: eric November, 1995
+
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+======================================================================*/
+
+/*
+ struct pvl_elem_t
+
+ This type is private. Always use pvl_elem instead
+
+ */
+
+#ifndef __PVL_H__
+#define __PVL_H__
+
+typedef void* pvl_list;
+typedef void* pvl_elem;
+
+typedef struct pvl_elem_t
+{
+ int MAGIC; /* Magic Identifier */
+ void *d; /* Pointer to data user is storing */
+ struct pvl_elem_t *next; /* Next element */
+ struct pvl_elem_t *prior; /* prior element */
+} pvl_elem_t;
+
+
+
+/* This global is incremented for each call to pvl_new_element(); it gives each
+ * list a unique identifer */
+
+extern int pvl_elem_count;
+extern int pvl_list_count;
+
+/* Create new lists or elements */
+pvl_elem pvl_new_element(void* d, pvl_elem next,pvl_elem prior);
+pvl_list pvl_newlist();
+void pvl_free(pvl_list);
+
+/* Add, remove, or get the head of the list */
+void pvl_unshift(pvl_list l,void *d);
+void* pvl_shift(pvl_list l);
+pvl_elem pvl_head(pvl_list);
+
+/* Add, remove or get the tail of the list */
+void pvl_push(pvl_list l,void *d);
+void* pvl_pop(pvl_list l);
+pvl_elem pvl_tail(pvl_list);
+
+/* Insert elements in random places */
+typedef int (*pvl_comparef)(void* a, void* b); /* a, b are of the data type*/
+void pvl_insert_ordered(pvl_list l,pvl_comparef f,void *d);
+void pvl_insert_after(pvl_list l,pvl_elem e,void *d);
+void pvl_insert_before(pvl_list l,pvl_elem e,void *d);
+
+/* Remove an element, or clear the entire list */
+void* pvl_remove(pvl_list,pvl_elem); /* Remove element, return data */
+void pvl_clear(pvl_list); /* Remove all elements, de-allocate all data */
+
+int pvl_count(pvl_list);
+
+/* Navagate the list */
+pvl_elem pvl_next(pvl_elem e);
+pvl_elem pvl_prior(pvl_elem e);
+
+/* get the data in the list */
+#ifndef PVL_USE_MACROS
+void* pvl_data(pvl_elem);
+#else
+#define pvl_data(x) x==0 ? 0 : ((struct pvl_elem_t *)x)->d;
+#endif
+
+
+/* Find an element for which a function returns true */
+typedef int (*pvl_findf)(void* a, void* b); /*a is list elem, b is other data*/
+pvl_elem pvl_find(pvl_list l,pvl_findf f,void* v);
+pvl_elem pvl_find_next(pvl_list l,pvl_findf f,void* v);
+
+/* Pass each element in the list to a function */
+typedef void (*pvl_applyf)(void* a, void* b); /*a is list elem, b is other data*/
+void pvl_apply(pvl_list l,pvl_applyf f, void *v);
+
+
+#endif /* __PVL_H__ */
+
+
+
+
+
diff --git a/libical/src/libical/testlocks.c b/libical/src/libical/testlocks.c
new file mode 100644
index 0000000000..d3e9e55cec
--- /dev/null
+++ b/libical/src/libical/testlocks.c
@@ -0,0 +1,70 @@
+/* This is just a driver to test the filerwlock objects defined in fcntl.c */
+/* MAXCHILD processes are forked. They take turns in using LOCKSSIZE locks.*/
+/* I compiled the program as follows */
+/* cc fcntlmain.c fcntl.c -o fcntlmain */
+/* and then run the image fcntlmain. */
+/* Notice that after the program has run I find the file "mylock" in my */
+/* directory. Not very desirable. Perhaps there is a way to avoid that? */
+
+#include <stdio.h>
+#include <sys/types.h>
+#include "fcntl.h"
+
+#define LOCKFILE "mylock"
+#define LOCKSSIZE 5
+#define MAXCHILD 4
+
+void child (int self);
+
+pid_t cldrn[4];
+filerwlock *fl;
+
+int
+main(void){
+ int i;
+
+ fl = filerwlockCreate(LOCKFILE, LOCKSSIZE);
+
+ for (i=0;i < MAXCHILD; i++) {
+ if ((cldrn[i]=fork()) < 0) {
+ perror("fork");
+ exit(1);}
+ if (cldrn[i]==0)
+ child(i);
+ }
+ for (i=0; i < MAXCHILD; i++)
+ wait();
+
+ filerwlockDelete(fl);
+ exit(0);
+}
+
+void child (int self) {
+ int i, j;
+ char s[256];
+ for (j=0; j<8; j++) {
+
+ if (self == 0) {
+ filerwwritelock(fl,1);
+ } else if (self == (MAXCHILD-1)) {
+ filerwlongreadlock(fl);
+ } else {
+ filerwreadlock(fl,1);
+ }
+
+ printf("Child %d starts to sleep on lock %d\n", self, 1);
+
+ sleep(3);
+
+ printf("Child %d ends sleep on lock %d\n", self, 1);
+
+ if (self == (MAXCHILD-1)) {
+ filerwlongunlock(fl);
+ } else {
+ filerwunlock(fl,1);
+ }
+
+ sleep(1);
+ }
+ exit(0);
+}
diff --git a/libical/src/libicalss/.cvsignore b/libical/src/libicalss/.cvsignore
new file mode 100644
index 0000000000..732c1577b6
--- /dev/null
+++ b/libical/src/libicalss/.cvsignore
@@ -0,0 +1,6 @@
+Makefile
+.deps
+Makefile.in
+*.lo
+*.la
+.libs \ No newline at end of file
diff --git a/libical/src/libicalss/Makefile.am b/libical/src/libicalss/Makefile.am
new file mode 100644
index 0000000000..ea37380688
--- /dev/null
+++ b/libical/src/libicalss/Makefile.am
@@ -0,0 +1,23 @@
+
+
+#noinst_LTLIBRARIES = libicalss.la
+lib_LTLIBRARIES = libicalss.la
+
+libicalss_la_SOURCES =\
+ icalcalendar.c \
+ icalcalendar.h \
+ icalcluster.c \
+ icalcluster.h \
+ icalstore.c \
+ icalstore.h
+
+include_HEADERS =\
+ icalcalendar.h \
+ icalcluster.h \
+ icalstore.h
+
+
+INCLUDES = \
+ -I $(srcdir)/../libical/ \
+ -I ../libical
+
diff --git a/libical/src/libicalss/icalcalendar.c b/libical/src/libicalss/icalcalendar.c
new file mode 100644
index 0000000000..0f2231b1d7
--- /dev/null
+++ b/libical/src/libicalss/icalcalendar.c
@@ -0,0 +1,268 @@
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: icalcalendar.c
+ CREATOR: eric 23 December 1999
+
+ $Id$
+ $Locker$
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The Original Code is eric. The Initial Developer of the Original
+ Code is Eric Busboom
+
+
+ ======================================================================*/
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+
+#include "icalcalendar.h"
+#include "icalcluster.h"
+#include <limits.h>
+#include <sys/stat.h> /* For mkdir, stat */
+#include <sys/types.h> /* For mkdir */
+#include <fcntl.h> /* For mkdir */
+#include <unistd.h> /* For mkdir, stat */
+#include <stdlib.h> /* for malloc */
+#include <string.h> /* for strcat */
+#include <errno.h>
+
+#define BOOKED_DIR "booked"
+#define INCOMING_FILE "incoming.ics"
+#define PROP_FILE "properties.ics"
+#define FBLIST_FILE "freebusy.ics"
+
+struct icalcalendar_impl
+{
+ char* dir;
+ icalcomponent* freebusy;
+ icalcomponent* properties;
+ icalstore* booked;
+ icalstore* incoming;
+};
+
+struct icalcalendar_impl* icalcalendar_new_impl()
+{
+ struct icalcalendar_impl* impl;
+
+ if ( ( impl = (struct icalcalendar_impl*)
+ malloc(sizeof(struct icalcalendar_impl))) == 0) {
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return 0;
+ }
+
+ return impl;
+}
+
+
+icalerrorenum icalcalendar_create(struct icalcalendar_impl* impl)
+{
+ char path[PATH_MAX];
+ struct stat sbuf;
+ int r;
+
+ icalerror_check_arg_re((impl != 0),"impl",ICAL_BADARG_ERROR);
+
+ path[0] = '\0';
+ strcpy(path,impl->dir);
+ strcat(path,"/");
+ strcat(path,BOOKED_DIR);
+
+ r = stat(path,&sbuf);
+
+ if( r != 0 && errno == ENOENT){
+
+ if(mkdir(path,0777)!=0){
+ icalerror_set_errno(ICAL_FILE_ERROR);
+ return ICAL_FILE_ERROR;
+ }
+ }
+
+ return ICAL_NO_ERROR;
+}
+
+icalcalendar* icalcalendar_new(char* dir)
+{
+ struct icalcalendar_impl* impl;
+
+ icalerror_check_arg_rz((dir != 0),"dir");
+
+ impl = icalcalendar_new_impl();
+
+ if (impl == 0){
+ return 0;
+ }
+
+ impl->dir = (char*)strdup(dir);
+ impl->freebusy = 0;
+ impl->properties = 0;
+ impl->booked = 0;
+ impl->incoming = 0;
+
+ if (icalcalendar_create(impl) != ICAL_NO_ERROR){
+ free(impl);
+ return 0;
+ }
+
+ return impl;
+}
+
+void icalcalendar_free(icalcalendar* calendar)
+{
+
+ struct icalcalendar_impl *impl = (struct icalcalendar_impl*)calendar;
+
+ if (impl->dir !=0){
+ free(impl->dir);
+ }
+
+ if (impl->freebusy !=0){
+ icalcluster_free(impl->freebusy);
+ }
+
+ if (impl->properties !=0){
+ icalcluster_free(impl->properties);
+ }
+
+ if (impl->booked !=0){
+ icalstore_free(impl->booked);
+ }
+
+ if (impl->incoming !=0){
+ icalstore_free(impl->incoming);
+ }
+
+ impl->dir = 0;
+ impl->freebusy = 0;
+ impl->properties = 0;
+ impl->booked = 0;
+ impl->incoming = 0;
+
+
+ free(impl);
+}
+
+
+int icalcalendar_lock(icalcalendar* calendar)
+{
+ struct icalcalendar_impl *impl = (struct icalcalendar_impl*)calendar;
+ icalerror_check_arg_rz((impl != 0),"impl");
+ return 0;
+}
+
+int icalcalendar_unlock(icalcalendar* calendar)
+{
+ struct icalcalendar_impl *impl = (struct icalcalendar_impl*)calendar;
+ icalerror_check_arg_rz((impl != 0),"impl");
+ return 0;
+}
+
+int icalcalendar_islocked(icalcalendar* calendar)
+{
+ struct icalcalendar_impl *impl = (struct icalcalendar_impl*)calendar;
+ icalerror_check_arg_rz((impl != 0),"impl");
+ return 0;
+}
+
+int icalcalendar_ownlock(icalcalendar* calendar)
+{
+ struct icalcalendar_impl *impl = (struct icalcalendar_impl*)calendar;
+ icalerror_check_arg_rz((impl != 0),"impl");
+ return 0;
+}
+
+icalstore* icalcalendar_get_booked(icalcalendar* calendar)
+{
+ struct icalcalendar_impl *impl = (struct icalcalendar_impl*)calendar;
+ char dir[PATH_MAX];
+
+ icalerror_check_arg_rz((impl != 0),"impl");
+
+ dir[0] = '\0';
+ strcpy(dir,impl->dir);
+ strcat(dir,"/");
+ strcat(dir,BOOKED_DIR);
+
+ if (impl->booked == 0){
+ icalerror_clear_errno();
+ impl->booked = icalstore_new(dir);
+ assert(icalerrno == ICAL_NO_ERROR);
+ }
+
+ return impl->booked;
+
+}
+
+icalcluster* icalcalendar_get_incoming(icalcalendar* calendar)
+{
+ char path[PATH_MAX];
+ struct icalcalendar_impl *impl = (struct icalcalendar_impl*)calendar;
+ icalerror_check_arg_rz((impl != 0),"impl");
+
+ path[0] = '\0';
+ strcpy(path,impl->dir);
+ strcat(path,"/");
+ strcat(path,INCOMING_FILE);
+
+ if (impl->properties == 0){
+ impl->properties = icalcluster_new(path);
+ }
+
+ return impl->properties;
+}
+
+icalcluster* icalcalendar_get_properties(icalcalendar* calendar)
+{
+ char path[PATH_MAX];
+ struct icalcalendar_impl *impl = (struct icalcalendar_impl*)calendar;
+ icalerror_check_arg_rz((impl != 0),"impl");
+
+ path[0] = '\0';
+ strcpy(path,impl->dir);
+ strcat(path,"/");
+ strcat(path,PROP_FILE);
+
+ if (impl->properties == 0){
+ impl->properties = icalcluster_new(path);
+ }
+
+ return impl->properties;
+}
+
+icalcluster* icalcalendar_get_freebusy(icalcalendar* calendar)
+{
+ char path[PATH_MAX];
+ struct icalcalendar_impl *impl = (struct icalcalendar_impl*)calendar;
+ icalerror_check_arg_rz((impl != 0),"impl");
+
+ path[0] = '\0';
+ strcpy(path,impl->dir);
+ strcat(path,"/");
+ strcat(path,FBLIST_FILE);
+
+
+ if (impl->freebusy == 0){
+ impl->freebusy = icalcluster_new(path);
+ }
+
+ return impl->freebusy;
+}
+
+
+
+
diff --git a/libical/src/libicalss/icalcalendar.h b/libical/src/libicalss/icalcalendar.h
new file mode 100644
index 0000000000..90e7b33c22
--- /dev/null
+++ b/libical/src/libicalss/icalcalendar.h
@@ -0,0 +1,68 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalcalendar.h
+ CREATOR: eric 23 December 1999
+
+
+ $Id$
+ $Locker$
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The Original Code is eric. The Initial Developer of the Original
+ Code is Eric Busboom
+
+
+======================================================================*/
+
+#ifndef ICALCALENDAR_H
+#define ICALCALENDAR_H
+
+#include "ical.h"
+#include "icalstore.h"
+#include "icalcluster.h"
+
+/* icalcalendar
+ * Routines for storing calendar data in a file system. The calendar
+ * has two icalstores, one for incoming components and one for booked
+ * components. It also has interfaces to access the free/busy list
+ * and a list of calendar properties */
+
+typedef void icalcalendar;
+
+icalcalendar* icalcalendar_new(char* dir);
+
+void icalcalendar_free(icalcalendar* calendar);
+
+int icalcalendar_lock(icalcalendar* calendar);
+
+int icalcalendar_unlock(icalcalendar* calendar);
+
+int icalcalendar_islocked(icalcalendar* calendar);
+
+int icalcalendar_ownlock(icalcalendar* calendar);
+
+icalstore* icalcalendar_get_booked(icalcalendar* calendar);
+
+icalcluster* icalcalendar_get_incoming(icalcalendar* calendar);
+
+icalcluster* icalcalendar_get_properties(icalcalendar* calendar);
+
+icalcluster* icalcalendar_get_freebusy(icalcalendar* calendar);
+
+
+#endif /* !ICALCALENDAR_H */
+
+
+
diff --git a/libical/src/libicalss/icalcluster.c b/libical/src/libicalss/icalcluster.c
new file mode 100644
index 0000000000..36bdccc743
--- /dev/null
+++ b/libical/src/libicalss/icalcluster.c
@@ -0,0 +1,423 @@
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: icalcluster.c
+ CREATOR: eric 23 December 1999
+
+ $Id$
+ $Locker$
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The Original Code is eric. The Initial Developer of the Original
+ Code is Eric Busboom
+
+
+ ======================================================================*/
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+
+#include "icalcluster.h"
+#include <errno.h>
+#include <limits.h> /* For PATH_MAX */
+#include <sys/stat.h> /* for stat */
+#include <unistd.h> /* for stat, getpid */
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h> /* for fcntl */
+#include <unistd.h> /* for fcntl */
+
+icalerrorenum icalcluster_create_cluster(char *path);
+
+struct icalcluster_impl {
+ char *path;
+ icalcomponent* cluster;
+ int changed;
+ FILE* stream;
+};
+
+icalcluster* icalcluster_new_impl()
+{
+ struct icalcluster_impl* comp;
+
+ if ( ( comp = (struct icalcluster_impl*)
+ malloc(sizeof(struct icalcluster_impl))) == 0) {
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ errno = ENOMEM;
+ return 0;
+ }
+
+ return comp;
+}
+
+char* read_from_file(char *s, size_t size, void *d)
+{
+ char *c = fgets(s,size, (FILE*)d);
+ return c;
+}
+
+icalcluster* icalcluster_new(char* path)
+{
+ struct icalcluster_impl *impl = icalcluster_new_impl();
+ struct stat sbuf;
+ int createclusterfile = 0;
+ icalerrorenum error = ICAL_NO_ERROR;
+ icalparser *parser;
+ struct icaltimetype tt;
+ off_t cluster_file_size;
+
+ memset(&tt,0,sizeof(struct icaltimetype));
+
+ icalerror_clear_errno();
+ icalerror_check_arg_rz( (path!=0), "path");
+
+ if (impl == 0){
+ return 0;
+ }
+
+ /*impl->path = strdup(path); icalcluster_load does this */
+ impl->changed = 0;
+
+ impl->cluster = 0;
+
+ impl->path = 0;
+ impl->stream = 0;
+
+ /* Check if the path already exists and if it is a regular file*/
+ if (stat(path,&sbuf) != 0){
+
+ /* A file by the given name does not exist, or there was
+ another error */
+ cluster_file_size = 0;
+ if (errno == ENOENT) {
+ /* It was because the file does not exist */
+ createclusterfile = 1;
+ } else {
+ /* It was because of another error */
+ icalerror_set_errno(ICAL_FILE_ERROR);
+ return 0;
+ }
+ } else {
+ /* A file by the given name exists, but is it a regular file */
+
+ if (!S_ISREG(sbuf.st_mode)){
+ /* Nope, not a directory */
+ icalerror_set_errno(ICAL_FILE_ERROR);
+ return 0;
+ } else {
+ /* Lets assume that it is a file of the right type */
+ cluster_file_size = sbuf.st_size;
+ createclusterfile = 0;
+ }
+ }
+
+ /* if cluster does not already exist, create it */
+
+ if (createclusterfile == 1) {
+ error = icalcluster_create_cluster(path);
+
+ if (error != ICAL_NO_ERROR){
+ icalerror_set_errno(error);
+ return 0;
+ }
+ }
+
+ impl->path = (char*)strdup(path);
+
+ errno = 0;
+ impl->stream = fopen(impl->path,"r");
+
+ if (impl->stream ==0 || errno != 0){
+ impl->cluster = 0;
+ icalerror_set_errno(ICAL_FILE_ERROR); /* Redundant, actually */
+ return 0;
+ }
+
+ icalcluster_lock(impl);
+
+ if(cluster_file_size > 0){
+ parser = icalparser_new();
+ icalparser_set_gen_data(parser,impl->stream);
+ impl->cluster = icalparser_parse(parser,read_from_file);
+ icalparser_free(parser);
+
+ if (icalcomponent_isa(impl->cluster) != ICAL_XROOT_COMPONENT){
+ /* The parser got a single component, so it did not put it in
+ an XROOT. */
+ icalcomponent *cl = impl->cluster;
+ impl->cluster = icalcomponent_new(ICAL_XROOT_COMPONENT);
+ icalcomponent_add_component(impl->cluster,cl);
+ }
+
+ } else {
+
+ impl->cluster = icalcomponent_new(ICAL_XROOT_COMPONENT);
+ }
+
+ if (impl->cluster == 0){
+ icalerror_set_errno(ICAL_PARSE_ERROR);
+ return 0;
+ }
+
+ if (error != ICAL_NO_ERROR){
+ return 0;
+ }
+
+ return impl;
+}
+
+void icalcluster_free(icalcluster* cluster)
+{
+ struct icalcluster_impl *impl = (struct icalcluster_impl*)cluster;
+
+ icalerror_check_arg_rv((cluster!=0),"cluster");
+
+ if (impl->cluster != 0){
+ icalcluster_commit(cluster);
+ icalcomponent_free(impl->cluster);
+ impl->cluster=0;
+ }
+
+ if(impl->path != 0){
+ free(impl->path);
+ impl->path = 0;
+ }
+
+ if(impl->stream != 0){
+ icalcluster_unlock(impl);
+ fclose(impl->stream);
+ impl->stream = 0;
+ }
+
+ free(impl);
+}
+
+char* icalcluster_path(icalcluster* cluster)
+{
+ struct icalcluster_impl *impl = (struct icalcluster_impl*)cluster;
+ icalerror_check_arg_rz((cluster!=0),"cluster");
+
+ return impl->path;
+}
+
+
+int icalcluster_lock(icalcluster *cluster)
+{
+ struct icalcluster_impl *impl = (struct icalcluster_impl*)cluster;
+ struct flock lock;
+ int fd;
+
+ icalerror_check_arg_rz((impl->stream!=0),"impl->stream");
+
+ fd = fileno(impl->stream);
+
+ lock.l_type = F_WRLCK; /* F_RDLCK, F_WRLCK, F_UNLCK */
+ lock.l_start = 0; /* byte offset relative to l_whence */
+ lock.l_whence = SEEK_SET; /* SEEK_SET, SEEK_CUR, SEEK_END */
+ lock.l_len = 0; /* #bytes (0 means to EOF) */
+
+ return (fcntl(fd, F_SETLKW, &lock));
+}
+
+int icalcluster_unlock(icalcluster *cluster)
+{
+ struct icalcluster_impl *impl = (struct icalcluster_impl*)cluster;
+ int fd;
+ struct flock lock;
+ icalerror_check_arg_rz((impl->stream!=0),"impl->stream");
+
+ fd = fileno(impl->stream);
+
+ lock.l_type = F_WRLCK; /* F_RDLCK, F_WRLCK, F_UNLCK */
+ lock.l_start = 0; /* byte offset relative to l_whence */
+ lock.l_whence = SEEK_SET; /* SEEK_SET, SEEK_CUR, SEEK_END */
+ lock.l_len = 0; /* #bytes (0 means to EOF) */
+
+ return (fcntl(fd, F_UNLCK, &lock));
+
+}
+
+icalerrorenum icalcluster_create_cluster(char *path)
+{
+
+ FILE* f;
+ int r;
+ icalcomponent *c;
+
+ icalerror_clear_errno();
+
+ f = fopen(path,"w");
+
+ if (f == 0){
+ icalerror_set_errno(ICAL_FILE_ERROR);
+ return ICAL_FILE_ERROR;
+ }
+
+
+ /* This used to write data to the file... */
+
+
+ fclose(f);
+
+ return ICAL_NO_ERROR;
+}
+
+icalerrorenum icalcluster_commit(icalcluster* cluster)
+{
+ FILE *f;
+ char tmp[PATH_MAX]; /* HACK Buffer overflow potential */
+ char *str;
+ icalparser *parser;
+ icalcomponent *c;
+
+ struct icalcluster_impl *impl = (struct icalcluster_impl*)cluster;
+
+ icalerror_check_arg_re((impl!=0),"cluster",ICAL_BADARG_ERROR);
+
+ if (impl->changed == 0 ){
+ return ICAL_NO_ERROR;
+ }
+
+#ifdef ICAL_SAFESAVES
+ snprintf(tmp,PATH_MAX,"%s-tmp",impl->path);
+#else
+ strcpy(tmp,impl->path);
+#endif
+
+ if ( (f = fopen(tmp,"w")) < 0 ){
+ icalerror_set_errno(ICAL_FILE_ERROR);
+ return ICAL_FILE_ERROR;
+ }
+
+ for(c = icalcomponent_get_first_component(impl->cluster,ICAL_ANY_COMPONENT);
+ c != 0;
+ c = icalcomponent_get_next_component(impl->cluster,ICAL_ANY_COMPONENT)){
+
+ str = icalcomponent_as_ical_string(c);
+
+ if ( fwrite(str,sizeof(char),strlen(str),f) < strlen(str)){
+ fclose(f);
+ return ICAL_FILE_ERROR;
+ }
+ }
+
+ fclose(f);
+ impl->changed = 0;
+
+#ifdef ICAL_SAFESAVES
+ rename(tmp,impl->path); /* HACK, should check for error here */
+#endif
+
+ return ICAL_NO_ERROR;
+
+}
+
+void icalcluster_mark(icalcluster* cluster){
+
+ struct icalcluster_impl *impl = (struct icalcluster_impl*)cluster;
+
+ icalerror_check_arg_rv((impl!=0),"cluster");
+
+ impl->changed = 1;
+
+}
+
+icalcomponent* icalcluster_get_component(icalcluster* cluster){
+ struct icalcluster_impl *impl = (struct icalcluster_impl*)cluster;
+
+ icalerror_check_arg_re((impl!=0),"cluster",ICAL_BADARG_ERROR);
+
+ return impl->cluster;
+}
+
+
+/* manipulate the components in the cluster */
+
+icalerrorenum icalcluster_add_component(icalcluster *cluster,
+ icalcomponent* child)
+{
+ struct icalcluster_impl* impl = (struct icalcluster_impl*)cluster;
+
+ icalerror_check_arg_rv((cluster!=0),"cluster");
+ icalerror_check_arg_rv((child!=0),"child");
+
+ icalcomponent_add_component(impl->cluster,child);
+
+ icalcluster_mark(cluster);
+
+ return ICAL_NO_ERROR;
+
+}
+
+icalerrorenum icalcluster_remove_component(icalcluster *cluster,
+ icalcomponent* child)
+{
+ struct icalcluster_impl* impl = (struct icalcluster_impl*)cluster;
+
+ icalerror_check_arg_rv((cluster!=0),"cluster");
+ icalerror_check_arg_rv((child!=0),"child");
+
+ icalcomponent_remove_component(impl->cluster,child);
+
+ icalcluster_mark(cluster);
+
+ return ICAL_NO_ERROR;
+}
+
+int icalcluster_count_components(icalcluster *cluster,
+ icalcomponent_kind kind)
+{
+ struct icalcluster_impl* impl = (struct icalcluster_impl*)cluster;
+
+ if(cluster == 0){
+ icalerror_set_errno(ICAL_BADARG_ERROR);
+ return -1;
+ }
+
+ return icalcomponent_count_components(impl->cluster,kind);
+}
+
+/* Iterate through components */
+icalcomponent* icalcluster_get_current_component (icalcluster* cluster)
+{
+ struct icalcluster_impl* impl = (struct icalcluster_impl*)cluster;
+
+ icalerror_check_arg_rz((cluster!=0),"cluster");
+
+ return icalcomponent_get_current_component(impl->cluster);
+}
+
+icalcomponent* icalcluster_get_first_component(icalcluster* cluster,
+ icalcomponent_kind kind)
+{
+ struct icalcluster_impl* impl = (struct icalcluster_impl*)cluster;
+
+ icalerror_check_arg_rz((cluster!=0),"cluster");
+
+ return icalcomponent_get_first_component(impl->cluster,kind);
+}
+
+icalcomponent* icalcluster_get_next_component(icalcluster* cluster,
+ icalcomponent_kind kind)
+{
+ struct icalcluster_impl* impl = (struct icalcluster_impl*)cluster;
+
+ icalerror_check_arg_rz((cluster!=0),"cluster");
+
+ return icalcomponent_get_next_component(impl->cluster,kind);
+}
+
diff --git a/libical/src/libicalss/icalcluster.h b/libical/src/libicalss/icalcluster.h
new file mode 100644
index 0000000000..39fe542027
--- /dev/null
+++ b/libical/src/libicalss/icalcluster.h
@@ -0,0 +1,73 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalcluster.h
+ CREATOR: eric 23 December 1999
+
+
+ $Id$
+ $Locker$
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The Original Code is eric. The Initial Developer of the Original
+ Code is Eric Busboom
+
+
+======================================================================*/
+
+#ifndef ICALCLUSTER_H
+#define ICALCLUSTER_H
+
+#include "ical.h"
+
+typedef void icalcluster;
+
+
+icalcluster* icalcluster_new(char* path);
+void icalcluster_free(icalcluster* cluster);
+
+char* icalcluster_path(icalcluster* cluster);
+
+/* Return a reference to the internal component. */
+icalcomponent* icalcluster_get_component(icalcluster* cluster);
+
+/* Mark the cluster as changed, so it will be written to disk when it
+ is freed*/
+void icalcluster_mark(icalcluster* cluster);
+
+/* Write the cluster data back to disk */
+icalerrorenum icalcluster_commit(icalcluster* cluster);
+
+/* manipulate the components in the cluster */
+icalerrorenum icalcluster_add_component(icalcomponent* parent,
+ icalcomponent* child);
+
+icalerrorenum icalcluster_remove_component(icalcomponent* parent,
+ icalcomponent* child);
+
+int icalcluster_count_components(icalcomponent* component,
+ icalcomponent_kind kind);
+
+/* Iterate through components */
+icalcomponent* icalcluster_get_current_component (icalcomponent* component);
+
+icalcomponent* icalcluster_get_first_component(icalcomponent* component,
+ icalcomponent_kind kind);
+icalcomponent* icalcluster_get_next_component(icalcomponent* component,
+ icalcomponent_kind kind);
+
+#endif /* !ICALCLUSTER_H */
+
+
+
diff --git a/libical/src/libicalss/icalcomponent.h b/libical/src/libicalss/icalcomponent.h
new file mode 100644
index 0000000000..9e0e9f5a9f
--- /dev/null
+++ b/libical/src/libicalss/icalcomponent.h
@@ -0,0 +1,115 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalcomponent.h
+ CREATOR: eric 20 March 1999
+
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The original author is Eric Busboom
+ The original code is icalcomponent.h
+
+======================================================================*/
+
+#ifndef ICALCOMPONENT_H
+#define ICALCOMPONENT_H
+
+#include "icalproperty.h"
+#include "icalvalue.h"
+#include "icalenums.h" /* defines icalcomponent_kind */
+
+typedef void icalcomponent;
+
+icalcomponent* icalcomponent_new(icalcomponent_kind kind);
+icalcomponent* icalcomponent_new_clone(icalcomponent* component);
+icalcomponent* icalcomponent_new_from_string(char* str);
+icalcomponent* icalcomponent_vanew(icalcomponent_kind kind, ...);
+void icalcomponent_free(icalcomponent* component);
+
+char* icalcomponent_as_ical_string(icalcomponent* component);
+
+int icalcomponent_is_valid(icalcomponent* component);
+
+icalcomponent_kind icalcomponent_isa(icalcomponent* component);
+
+int icalcomponent_isa_component (void* component);
+
+/*
+ * Working with properties
+ */
+
+void icalcomponent_add_property(icalcomponent* component,
+ icalproperty* property);
+
+void icalcomponent_remove_property(icalcomponent* component,
+ icalproperty* property);
+
+int icalcomponent_count_properties(icalcomponent* component,
+ icalproperty_kind kind);
+
+/* Iterate through the properties */
+icalproperty* icalcomponent_get_current_property(icalcomponent* component);
+
+icalproperty* icalcomponent_get_first_property(icalcomponent* component,
+ icalproperty_kind kind);
+icalproperty* icalcomponent_get_next_property(icalcomponent* component,
+ icalproperty_kind kind);
+
+/* Return a null-terminated array of icalproperties*/
+
+icalproperty** icalcomponent_get_properties(icalcomponent* component,
+ icalproperty_kind kind);
+
+
+/*
+ * Working with components
+ */
+
+
+void icalcomponent_add_component(icalcomponent* parent,
+ icalcomponent* child);
+
+void icalcomponent_remove_component(icalcomponent* parent,
+ icalcomponent* child);
+
+int icalcomponent_count_components(icalcomponent* component,
+ icalcomponent_kind kind);
+
+/* Iterate through components */
+icalcomponent* icalcomponent_get_current_component (icalcomponent* component);
+
+icalcomponent* icalcomponent_get_first_component(icalcomponent* component,
+ icalcomponent_kind kind);
+icalcomponent* icalcomponent_get_next_component(icalcomponent* component,
+ icalcomponent_kind kind);
+
+/* Return a null-terminated array of icalproperties*/
+icalproperty** icalcomponent_get_component(icalcomponent* component,
+ icalproperty_kind kind);
+
+/* Working with embedded error properties */
+
+int icalcomponent_count_errors(icalcomponent* component);
+void icalcomponent_strip_errors(icalcomponent* component);
+
+
+/* Internal operations. You don't see these... */
+icalcomponent* icalcomponent_get_parent(icalcomponent* component);
+void icalcomponent_set_parent(icalcomponent* component,
+ icalcomponent* parent);
+
+#endif /* !ICALCOMPONENT_H */
+
+
+
diff --git a/libical/src/libicalss/icalstore.c b/libical/src/libicalss/icalstore.c
new file mode 100644
index 0000000000..382464e476
--- /dev/null
+++ b/libical/src/libicalss/icalstore.c
@@ -0,0 +1,858 @@
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: icalstore.c
+ CREATOR: eric 28 November 1999
+
+ $Id$
+ $Locker$
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The Original Code is eric. The Initial Developer of the Original
+ Code is Eric Busboom
+
+
+ ======================================================================*/
+
+
+/*
+
+ icalstore manages a database of ical components and offers
+ interfaces for reading, writting and searching for components.
+
+ icalstore groups components in to clusters based on their DTSTART
+ time -- all components that start in the same month are grouped
+ together in a single file. All files in a sotre are kept in a single
+ directory. ( If a component does not have DTSTART, the store uses
+ DTSTAMP or CREATE )
+
+ The primary interfaces are icalstore_first and icalstore_next. These
+ routine iterate through all of the components in the store, subject
+ to the current gauge. A gauge is an icalcomponent that is tested
+ against other componets for a match. If a gauge has been set with
+ icalstore_select, icalstore_first and icalstore_next will only
+ return componentes that match the gauge.
+
+ The Store generated UIDs for all objects that are stored if they do
+ not already have a UID. The UID is the name of the cluster (month &
+ year as MMYYYY) plus a unique serial number. The serial number is
+ stored as a property of the cluster.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+
+#include "ical.h"
+#include "icalstore.h"
+#include "pvl.h"
+#include "icalerror.h"
+#include "icalparser.h"
+#include "icalcluster.h"
+
+#include <limits.h>
+#include <dirent.h> /* for opendir() */
+#include <errno.h>
+#include <sys/types.h> /* for opendir() */
+#include <sys/stat.h> /* for stat */
+#include <unistd.h> /* for stat, getpid */
+#include <time.h> /* for clock() */
+#include <stdlib.h> /* for rand(), srand() */
+#include <sys/utsname.h> /* for uname */
+#include <string.h> /* for strdup */
+
+
+struct icalstore_impl
+{
+ char* dir;
+ icalcomponent* gauge;
+ icalcluster* cluster;
+ int first_component;
+ pvl_list directory;
+ pvl_elem directory_iterator;
+};
+
+struct icalstore_impl* icalstore_new_impl()
+{
+ struct icalstore_impl* comp;
+
+ if ( ( comp = (struct icalstore_impl*)
+ malloc(sizeof(struct icalstore_impl))) == 0) {
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return 0;
+ }
+
+ return comp;
+}
+
+void icalstore_lock(char* dir)
+{
+}
+
+
+void icalstore_unlock(char* dir)
+{
+}
+
+/* Load the contents of the store directory into the store's internal directory list*/
+icalerrorenum icalstore_read_directory(struct icalstore_impl* impl)
+{
+ struct dirent *de;
+ DIR* dp;
+ char *str;
+
+ dp = opendir(impl->dir);
+
+ if ( dp == 0) {
+ icalerror_set_errno(ICAL_FILE_ERROR);
+ return ICAL_FILE_ERROR;
+ }
+
+ /* clear contents of directory list */
+ while((str = pvl_pop(impl->directory))){
+ free(str);
+ }
+
+ /* load all of the cluster names in the directory list */
+ for(de = readdir(dp);
+ de != 0;
+ de = readdir(dp)){
+
+ /* Remove known directory names '.' and '..'*/
+ if (strcmp(de->d_name,".") == 0 ||
+ strcmp(de->d_name,"..") == 0 ){
+ continue;
+ }
+
+ pvl_push(impl->directory, (void*)strdup(de->d_name));
+ }
+
+ closedir(dp);
+
+ return ICAL_NO_ERROR;
+}
+
+icalstore* icalstore_new(char* dir)
+{
+ struct icalstore_impl *impl = icalstore_new_impl();
+ struct stat sbuf;
+
+ if (impl == 0){
+ return 0;
+ }
+
+ icalerror_check_arg_rz( (dir!=0), "dir");
+
+ if (stat(dir,&sbuf) != 0){
+ icalerror_set_errno(ICAL_FILE_ERROR);
+ return 0;
+ }
+
+ /* dir is not the name of a direectory*/
+ if (!S_ISDIR(sbuf.st_mode)){
+ icalerror_set_errno(ICAL_USAGE_ERROR);
+ return 0;
+ }
+
+ icalstore_lock(dir);
+
+ impl = icalstore_new_impl();
+
+ if (impl ==0){
+ icalerror_set_errno(ICAL_ALLOCATION_ERROR);
+ return 0;
+ }
+
+ impl->directory = pvl_newlist();
+ impl->directory_iterator = 0;
+ impl->dir = (char*)strdup(dir);
+ impl->gauge = 0;
+ impl->first_component = 0;
+ impl->cluster = 0;
+
+ icalstore_read_directory(impl);
+
+ return (icalstore*) impl;
+}
+
+void icalstore_free(icalstore* s)
+{
+ struct icalstore_impl *impl = (struct icalstore_impl*)s;
+ char* str;
+
+ icalstore_unlock(impl->dir);
+
+ if(impl->dir !=0){
+ free(impl->dir);
+ }
+
+ if(impl->gauge !=0){
+ icalcomponent_free(impl->gauge);
+ }
+
+ if(impl->cluster !=0){
+ icalcluster_free(impl->cluster);
+ }
+
+ while(impl->directory !=0 && (str=pvl_pop(impl->directory)) != 0){
+ free(str);
+ }
+
+ if(impl->directory != 0){
+ pvl_free(impl->directory);
+ }
+
+ impl->directory = 0;
+ impl->directory_iterator = 0;
+ impl->dir = 0;
+ impl->gauge = 0;
+ impl->first_component = 0;
+
+ free(impl);
+
+}
+
+/* icalstore_next_uid_number updates a serial number in the Store
+ directory in a file called SEQUENCE */
+
+int icalstore_next_uid_number(icalstore* store)
+{
+ struct icalstore_impl *impl = (struct icalstore_impl*)store;
+ char sequence = 0;
+ char temp[128];
+ char filename[PATH_MAX];
+ char *r;
+ FILE *f;
+ struct stat sbuf;
+
+ icalerror_check_arg_rz( (store!=0), "store");
+
+ sprintf(filename,"%s/%s",impl->dir,"SEQUENCE");
+
+ /* Create the file if it does not exist.*/
+ if (stat(filename,&sbuf) == -1 || !S_ISREG(sbuf.st_mode)){
+
+ f = fopen(filename,"w");
+ if (f != 0){
+ fprintf(f,"0");
+ fclose(f);
+ } else {
+ icalerror_warn("Can't create SEQUENCE file in icalstore_next_uid_number");
+ return 0;
+ }
+
+ }
+
+ if ( (f = fopen(filename,"r+")) != 0){
+
+ rewind(f);
+ r = fgets(temp,128,f);
+
+ if (r == 0){
+ sequence = 1;
+ } else {
+ sequence = atoi(temp)+1;
+ }
+
+ rewind(f);
+
+ fprintf(f,"%d",sequence);
+
+ fclose(f);
+
+ return sequence;
+
+ } else {
+ icalerror_warn("Can't create SEQUENCE file in icalstore_next_uid_number");
+ return 0;
+ }
+
+}
+
+icalerrorenum icalstore_next_cluster(icalstore* store)
+{
+ struct icalstore_impl *impl = (struct icalstore_impl*)store;
+ char path[PATH_MAX];
+
+ if (impl->directory_iterator == 0){
+ icalerror_set_errno(ICAL_INTERNAL_ERROR);
+ return ICAL_INTERNAL_ERROR;
+ }
+ impl->directory_iterator = pvl_next(impl->directory_iterator);
+
+ if (impl->directory_iterator == 0){
+ /* There are no more clusters */
+ impl->cluster = 0;
+ return ICAL_NO_ERROR;
+ }
+
+ sprintf(path,"%s/%s",impl->dir,(char*)pvl_data(impl->directory_iterator));
+
+ icalcluster_free(impl->cluster);
+
+ impl->cluster = icalcluster_new(path);
+
+ return icalerrno;
+}
+
+void icalstore_add_uid(icalstore* store, icalstore* comp)
+{
+ char uidstring[PATH_MAX];
+ icalproperty *uid;
+ struct utsname unamebuf;
+
+ icalerror_check_arg_rv( (store!=0), "store");
+ icalerror_check_arg_rv( (comp!=0), "comp");
+
+ uid = icalcomponent_get_first_property(comp,ICAL_UID_PROPERTY);
+
+ if (uid == 0) {
+
+ uname(&unamebuf);
+
+ sprintf(uidstring,"%d-%s",(int)getpid(),unamebuf.nodename);
+
+ uid = icalproperty_new_uid(uidstring);
+ icalcomponent_add_property(comp,uid);
+ } else {
+
+ strcpy(uidstring,icalproperty_get_uid(uid));
+ }
+}
+
+
+/* This assumes that the top level component is a VCALENDAR, and there
+ is an inner component of type VEVENT, VTODO or VJOURNAL. The inner
+ component must have a DTSTART property */
+
+icalerrorenum icalstore_add_component(icalstore* store, icalstore* comp)
+{
+ struct icalstore_impl *impl;
+ char clustername[PATH_MAX];
+ icalproperty *dt, *count;
+ icalvalue *v;
+ struct icaltimetype tm;
+ icalerrorenum error = ICAL_NO_ERROR;
+ icalcomponent *inner;
+
+ impl = (struct icalstore_impl*)store;
+ icalerror_check_arg_rz( (store!=0), "store");
+ icalerror_check_arg_rz( (comp!=0), "comp");
+
+ errno = 0;
+
+ icalstore_add_uid(store,comp);
+
+ /* Determine which cluster this object belongs in. This is a HACK */
+
+ for(inner = icalcomponent_get_first_component(comp,ICAL_ANY_COMPONENT);
+ inner != 0;
+ inner = icalcomponent_get_next_component(comp,ICAL_ANY_COMPONENT)){
+
+ dt = icalcomponent_get_first_property(inner,ICAL_DTSTART_PROPERTY);
+
+ if (dt != 0){
+ break;
+ }
+ }
+
+ if (dt == 0){
+ icalerror_warn("The component does not have a DTSTART property, so it cannot be added to the store");
+ icalerror_set_errno(ICAL_BADARG_ERROR);
+ return ICAL_BADARG_ERROR;
+ }
+
+ v = icalproperty_get_value(dt);
+
+ tm = icalvalue_get_datetime(v);
+
+ snprintf(clustername,PATH_MAX,"%s/%04d%02d",impl->dir,tm.year,tm.month);
+
+ /* Load the cluster and insert the object */
+
+ if(impl->cluster != 0 &&
+ strcmp(clustername,icalcluster_path(impl->cluster)) != 0 ){
+ icalcluster_free(impl->cluster);
+ impl->cluster = 0;
+ }
+
+ if (impl->cluster == 0){
+ impl->cluster = icalcluster_new(clustername);
+
+ if (impl->cluster == 0){
+ error = icalerrno;
+ }
+ }
+
+ if (error != ICAL_NO_ERROR){
+ icalerror_set_errno(error);
+ return error;
+ }
+
+ /* Add the component to the cluster */
+
+ icalcluster_add_component(impl->cluster,comp);
+
+
+ /* Increment the clusters count value */
+ count = icalcomponent_get_first_property(
+ icalcluster_get_component(impl->cluster),
+ ICAL_XLICCLUSTERCOUNT_PROPERTY);
+
+ if (count == 0){
+ icalerror_set_errno(ICAL_INTERNAL_ERROR);
+ return ICAL_INTERNAL_ERROR;
+ }
+
+ icalproperty_set_xlicclustercount(count,
+ icalproperty_get_xlicclustercount(count)+1);
+
+
+ icalcluster_mark(impl->cluster);
+
+ return ICAL_NO_ERROR;
+}
+
+/* Remove a component in the current cluster */
+icalerrorenum icalstore_remove_component(icalstore* store, icalstore* comp)
+{
+ struct icalstore_impl *impl = (struct icalstore_impl*)store;
+ icalproperty *count;
+
+ icalerror_check_arg_re((store!=0),"store",ICAL_BADARG_ERROR);
+ icalerror_check_arg_re((comp!=0),"comp",ICAL_BADARG_ERROR);
+ icalerror_check_arg_re((impl->cluster!=0),"Cluster pointer",ICAL_USAGE_ERROR);
+
+/* HACK The following code should be used to ensure that the component
+ the caller is trying to remove is actually in the cluster, but it
+ resets the internal iterators, which immediately ends any loops over
+ the cluster the caller may have in progress
+
+ for(c = icalcluster_get_first_component(
+ impl->cluster,
+ ICAL_ANY_COMPONENT);
+ c != 0;
+ c = icalcluster_get_next_component(
+ impl->cluster,
+ ICAL_ANY_COMPONENT)){
+
+ if (c == comp){
+ found = 1;
+ }
+
+ }
+
+ if (found != 1){
+ icalerror_warn("icalstore_remove_component: component is not part of current cluster");
+ icalerror_set_errno(ICAL_USAGE_ERROR);
+ return ICAL_USAGE_ERROR;
+ }
+
+*/
+
+ icalcluster_remove_component(impl->cluster,
+ comp);
+
+ icalcluster_mark(impl->cluster);
+
+ /* Decrement the clusters count value */
+ count = icalcomponent_get_first_property(
+ icalcluster_get_component(impl->cluster),
+ ICAL_XLICCLUSTERCOUNT_PROPERTY);
+
+ if (count == 0){
+ icalerror_set_errno(ICAL_INTERNAL_ERROR);
+ return ICAL_INTERNAL_ERROR;
+ }
+
+ icalproperty_set_xlicclustercount(count,
+ icalproperty_get_xlicclustercount(count)-1);
+
+ return ICAL_NO_ERROR;
+}
+
+/* Convert a VQUERY component into a gauge */
+icalcomponent* icalstore_make_gauge(icalcomponent* query);
+
+/* icalstore_test compares a component against a gauge, and returns
+ true if the component passes the test
+
+ The gauge is a VCALENDAR component that specifies how to test the
+ target components. The guage holds a collection of VEVENT, VTODO or
+ VJOURNAL sub-components. Each of the sub-components has a
+ collection of properties that are compared to corresponding
+ properties in the target component, according to the
+ X-LIC-COMPARETYPE parameters to the gauge's properties.
+
+ When a gauge has several sub-components, the results of testing the
+ target against each of them is ORed together - the target
+ component will pass if it matches any of the sub-components in the
+ gauge. However, the results of matching the proeprties in a
+ sub-component are ANDed -- the target must match every property in
+ a gauge sub-component to match the sub-component.
+
+ Here is an example:
+
+ BEGIN:XROOT
+ BEGIN:VCOMPONENT
+ BEGIN:VEVENT
+ DTSTART;X-LIC-COMPARETYPE=LESS:19981025T020000
+ ORGANIZER;X-LIC-COMPARETYPE=EQUAL:mrbig@host.com
+ END:VEVENT
+ BEGIN:VEVENT
+ LOCATION;X-LIC-COMPARETYPE=EQUAL:McNary's Pub
+ END:VEVENT
+ END:VCALENDAR
+ END:XROOT
+
+ This gauge has two sub-components; one which will match a VEVENT
+ based on start time, and organizer, and another that matches based
+ on LOCATION. A target component will pass the test if it matched
+ either of the sub-components.
+
+ */
+
+
+int icalstore_test_recurse(icalcomponent* comp, icalcomponent* gauge)
+{
+ int pass = 1,localpass = 0;
+ icalproperty *p;
+ icalcomponent *child,*subgauge;
+ icalcomponent_kind gaugekind, compkind;
+
+ icalerror_check_arg_rz( (comp!=0), "comp");
+ icalerror_check_arg_rz( (gauge!=0), "gauge");
+
+ gaugekind = icalcomponent_isa(gauge);
+ compkind = icalcomponent_isa(comp);
+
+ if( ! (gaugekind == compkind || gaugekind == ICAL_ANY_COMPONENT) ){
+ return 0;
+ }
+
+ /* Test properties. For each property in the gauge, search through
+ the component for a similar property. If one is found, compare
+ the two properties value with the comparison specified in the
+ gauge with the X-LIC-COMPARETYPE parameter */
+
+ for(p = icalcomponent_get_first_property(gauge,ICAL_ANY_PROPERTY);
+ p != 0;
+ p = icalcomponent_get_next_property(gauge,ICAL_ANY_PROPERTY)){
+
+ icalproperty* targetprop;
+ icalparameter* compareparam;
+ icalparameter_xliccomparetype compare;
+ int rel; /* The relationship between the gauge and target values.*/
+
+ /* Extract the comparison type from the gauge. If there is no
+ comparison type, assume that it is "EQUAL" */
+
+ compareparam = icalproperty_get_first_parameter(
+ p,
+ ICAL_XLICCOMPARETYPE_PARAMETER);
+
+ if (compareparam!=0){
+ compare = icalparameter_get_xliccomparetype(compareparam);
+ } else {
+ compare = ICAL_XLICCOMPARETYPE_EQUAL;
+ }
+
+ /* Find a property in the component that has the same type
+ as the gauge property. HACK -- multiples of a single
+ property type in the gauge will match only the first
+ instance in the component */
+
+ targetprop = icalcomponent_get_first_property(comp,
+ icalproperty_isa(p));
+
+ if(targetprop != 0){
+
+ /* Compare the values of the gauge property and the target
+ property */
+
+ rel = icalvalue_compare(icalproperty_get_value(p),
+ icalproperty_get_value(targetprop));
+
+ /* Now see if the comparison is equavalent to the comparison
+ specified in the gauge */
+
+ if (rel == compare){
+ localpass++;
+ } else if (compare == ICAL_XLICCOMPARETYPE_LESSEQUAL &&
+ ( rel == ICAL_XLICCOMPARETYPE_LESS ||
+ rel == ICAL_XLICCOMPARETYPE_EQUAL)) {
+ localpass++;
+ } else if (compare == ICAL_XLICCOMPARETYPE_GREATEREQUAL &&
+ ( rel == ICAL_XLICCOMPARETYPE_GREATER ||
+ rel == ICAL_XLICCOMPARETYPE_EQUAL)) {
+ localpass++;
+ } else if (compare == ICAL_XLICCOMPARETYPE_NOTEQUAL &&
+ ( rel == ICAL_XLICCOMPARETYPE_GREATER ||
+ rel == ICAL_XLICCOMPARETYPE_LESS)) {
+ localpass++;
+ } else {
+ localpass = 0;
+ }
+
+ pass = pass && (localpass>0);
+ }
+ }
+
+ /* Test subcomponents. Look for a child component that has a
+ counterpart in the gauge. If one is found, recursively call
+ icalstore_test */
+
+ for(subgauge = icalcomponent_get_first_component(gauge,ICAL_ANY_COMPONENT);
+ subgauge != 0;
+ subgauge = icalcomponent_get_next_component(gauge,ICAL_ANY_COMPONENT)){
+
+ gaugekind = icalcomponent_isa(subgauge);
+
+ if (gaugekind == ICAL_ANY_COMPONENT){
+ child = icalcomponent_get_first_component(comp,ICAL_ANY_COMPONENT);
+ } else {
+ child = icalcomponent_get_first_component(comp,gaugekind);
+ }
+
+ if(child !=0){
+ localpass = icalstore_test_recurse(child,subgauge);
+ pass = pass && localpass;
+ } else {
+ pass = 0;
+ }
+ }
+
+ return pass;
+}
+
+/* guagecontainer is an XROOT component that holds several gauges. The
+ results of comparing against these gauges are ORed together in this
+ routine */
+int icalstore_test(icalcomponent* comp, icalcomponent* gaugecontainer)
+{
+ int pass = 0;
+ icalcomponent *gauge;
+
+ icalerror_check_arg_rz( (comp!=0), "comp");
+ icalerror_check_arg_rz( (gauge!=0), "gauge");
+
+ for(gauge = icalcomponent_get_first_component(gaugecontainer,ICAL_ANY_COMPONENT);
+ gauge != 0;
+ gauge = icalcomponent_get_next_component(gaugecontainer,ICAL_ANY_COMPONENT)){
+
+ pass += icalstore_test_recurse(comp, gauge);
+ }
+
+ return pass>0;
+
+}
+
+icalcomponent* icalstore_query(icalstore* store, icalstore* query);
+
+
+icalcomponent* icalstore_fetch(icalstore* store, char* uid)
+{
+ icalcomponent *gauge;
+ icalcomponent *old_gauge;
+ icalcomponent *c;
+ struct icalstore_impl *impl = (struct icalstore_impl*)store;
+
+ icalerror_check_arg_rz( (store!=0), "store");
+ icalerror_check_arg_rz( (uid!=0), "uid");
+
+ gauge =
+ icalcomponent_vanew(
+ ICAL_VCALENDAR_COMPONENT,
+ icalcomponent_vanew(
+ ICAL_VEVENT_COMPONENT,
+ icalproperty_vanew_uid(
+ uid,
+ icalparameter_new_xliccomparetype(
+ ICAL_XLICCOMPARETYPE_EQUAL),
+ 0),
+ 0),
+ 0);
+
+ old_gauge = impl->gauge;
+ impl->gauge = gauge;
+
+ c= icalstore_get_first_component(store);
+
+ impl->gauge = old_gauge;
+
+ icalcomponent_free(gauge);
+
+ return c;
+}
+
+
+int icalstore_has_uid(icalstore* store, char* uid)
+{
+ icalcomponent *c;
+
+ icalerror_check_arg_rz( (store!=0), "store");
+ icalerror_check_arg_rz( (uid!=0), "uid");
+
+ /* HACK. This is a temporary implementation. _has_uid should use a
+ database, and _fetch should use _has_uid, not the other way
+ around */
+ c = icalstore_fetch(store,uid);
+
+ return c!=0;
+
+}
+
+
+icalerrorenum icalstore_select(icalstore* store, icalcomponent* gauge)
+{
+ struct icalstore_impl *impl = (struct icalstore_impl*)store;
+
+ icalerror_check_arg_re( (store!=0), "store",ICAL_BADARG_ERROR);
+ icalerror_check_arg_re( (gauge!=0), "gauge",ICAL_BADARG_ERROR);
+
+ if (!icalcomponent_is_valid(gauge)){
+ return ICAL_BADARG_ERROR;
+ }
+
+ impl->gauge = gauge;
+
+ return ICAL_NO_ERROR;
+}
+
+
+
+icalcomponent* icalstore_get_first_component(icalstore* store)
+{
+ struct icalstore_impl *impl = (struct icalstore_impl*)store;
+ icalerrorenum error;
+ char path[PATH_MAX];
+
+ error = icalstore_read_directory(impl);
+
+ if (error != ICAL_NO_ERROR){
+ icalerror_set_errno(error);
+ return 0;
+ }
+
+ impl->directory_iterator = pvl_head(impl->directory);
+
+ if (impl->directory_iterator == 0){
+ icalerror_set_errno(error);
+ return 0;
+ }
+
+ sprintf(path,"%s/%s",impl->dir,(char*)pvl_data(impl->directory_iterator));
+
+ /* If the next cluster we need is different than the current cluster,
+ delete the current one and get a new one */
+
+ if(impl->cluster != 0 && strcmp(path,icalcluster_path(impl->cluster)) != 0 ){
+ icalcluster_free(impl->cluster);
+ impl->cluster = 0;
+ }
+
+ if (impl->cluster == 0){
+ impl->cluster = icalcluster_new(path);
+
+ if (impl->cluster == 0){
+ error = icalerrno;
+ }
+ }
+
+ if (error != ICAL_NO_ERROR){
+ icalerror_set_errno(error);
+ return 0;
+ }
+
+ impl->first_component = 1;
+
+ return icalstore_get_next_component(store);
+}
+
+icalcomponent* icalstore_get_next_component(icalstore* store)
+{
+ struct icalstore_impl *impl;
+ icalcomponent *c;
+ icalerrorenum error;
+
+ icalerror_check_arg_rz( (store!=0), "store");
+
+ impl = (struct icalstore_impl*)store;
+
+ if(impl->cluster == 0){
+
+ icalerror_warn("icalstore_get_next_component called with a NULL cluster (Caller must call icalstore_get_first_component first");
+ icalerror_set_errno(ICAL_USAGE_ERROR);
+ return 0;
+
+ }
+
+ /* Set the component iterator for the following for loop */
+ if (impl->first_component == 1){
+ icalcluster_get_first_component(
+ impl->cluster,
+ ICAL_ANY_COMPONENT);
+ impl->first_component = 0;
+ } else {
+ icalcluster_get_next_component(
+ impl->cluster,
+ ICAL_ANY_COMPONENT);
+ }
+
+
+ while(1){
+ /* Iterate through all of the objects in the cluster*/
+ for( c = icalcluster_get_current_component(
+ impl->cluster);
+ c != 0;
+ c = icalcluster_get_next_component(
+ impl->cluster,
+ ICAL_ANY_COMPONENT)){
+
+ /* If there is a gauge defined and the component does not
+ pass the gauge, skip the rest of the loop */
+ if (impl->gauge != 0 && icalstore_test(c,impl->gauge) == 0){
+ continue;
+ }
+
+ /* Either there is no gauge, or the component passed the
+ gauge, so return it*/
+
+ return c;
+ }
+
+ /* Fell through the loop, so the component we want is not
+ in this cluster. Load a new cluster and try again.*/
+
+ error = icalstore_next_cluster(store);
+
+ if(impl->cluster == 0 || error != ICAL_NO_ERROR){
+ /* No more clusters */
+ return 0;
+ } else {
+ c = icalcluster_get_first_component(
+ impl->cluster,
+ ICAL_ANY_COMPONENT);
+ }
+ }
+}
+
+
+
+
+
+
+
diff --git a/libical/src/libicalss/icalstore.h b/libical/src/libicalss/icalstore.h
new file mode 100644
index 0000000000..13e0a182b5
--- /dev/null
+++ b/libical/src/libicalss/icalstore.h
@@ -0,0 +1,78 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalstore.h
+ CREATOR: eric 28 November 1999
+
+
+ $Id$
+ $Locker$
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The Original Code is eric. The Initial Developer of the Original
+ Code is Eric Busboom
+
+
+======================================================================*/
+
+#ifndef ICALSTORE_H
+#define ICALSTORE_H
+
+#include "ical.h"
+#include "icalerror.h"
+typedef void icalstore;
+
+/* icalstore Routines for storing, fetching, and searching for ical
+ * objects in a database */
+
+icalstore* icalstore_new(char* dir);
+
+void icalstore_free(icalstore* store);
+
+/* Add a new component to the store */
+icalerrorenum icalstore_add_component(icalstore* store, icalstore* comp);
+
+/* Remove a component from the store */
+icalerrorenum icalstore_remove_component(icalstore* store, icalstore* comp);
+
+/* Restrict the component returned by icalstore_first, _next to those
+ that pass the gauge */
+icalerrorenum icalstore_select(icalstore* store, icalcomponent* gauge);
+
+/* Return true if a component passes the gauge */
+int icalstore_test(icalcomponent* comp, icalcomponent* gauge);
+
+/* Clear the restrictions set by icalstore_select */
+void icalstore_clear(icalstore* store);
+
+/* Get a single component by uid */
+icalcomponent* icalstore_fetch(icalstore* store, char* uid);
+
+/* Return true of the store has an object with the given UID */
+int icalstore_has_uid(icalstore* store, char* uid);
+
+/* Return the first component in the store, or first that passes the gauge.*/
+icalcomponent* icalstore_get_first_component(icalstore* store);
+
+/* Return the next component in the store, or next that passes the gauge.*/
+icalcomponent* icalstore_get_next_component(icalstore* store);
+
+
+int icalstore_next_uid_number(icalstore* store);
+
+
+#endif /* !ICALSTORE_H */
+
+
+
diff --git a/libical/src/pvl/Makefile b/libical/src/pvl/Makefile
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/libical/src/pvl/Makefile
diff --git a/libical/src/test/.cvsignore b/libical/src/test/.cvsignore
new file mode 100644
index 0000000000..6b1e8fab06
--- /dev/null
+++ b/libical/src/test/.cvsignore
@@ -0,0 +1,11 @@
+Makefile
+usecases
+copycluster
+regression
+icalparser
+findobj
+.deps
+.libs
+parser
+storage
+Makefile.in
diff --git a/libical/src/test/Makefile.am b/libical/src/test/Makefile.am
new file mode 100644
index 0000000000..50810f4b95
--- /dev/null
+++ b/libical/src/test/Makefile.am
@@ -0,0 +1,12 @@
+
+noinst_PROGRAMS = usecases copycluster regression parser findobj storage
+
+LDADD = ../libical/libical.la ../libicalss/libicalss.la
+INCLUDES = -I$(srcdir) -I$(srcdir)/../libical -I$(srcdir)/../libicalss -I../libical
+
+findobj_SOURCES = findobj.c
+usecases_SOURCES = usecases.c
+copycluster_SOURCES = copycluster.c
+regression_SOURCES = regression.c
+parser_SOURCES = icaltestparser.c
+storage_SOURCES = storage.c \ No newline at end of file
diff --git a/libical/src/test/alice/booked/199706 b/libical/src/test/alice/booked/199706
new file mode 100644
index 0000000000..8ad5c7d8b1
--- /dev/null
+++ b/libical/src/test/alice/booked/199706
@@ -0,0 +1,317 @@
+BEGIN:VCALENDAR
+X-LIC-CLUSTERCOUNT
+ :13
+DTSTART
+ :00000000T000000
+DTEND
+ :00000000T000000
+BEGIN:VEVENT
+ORGANIZER
+ :mailto:a@example.com
+COMMENT
+ :DUKES forfeit the game
+SEQUENCE
+ :2
+UID
+ :0981234-1234234-23@example.com
+DTSTAMP
+ :19970613T190000Z
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+ATTENDEE
+ ;PARTSTAT=ACCEPTED
+ :Mailto:B@example.com
+ORGANIZER
+ :MAILTO:A@example.com
+UID
+ :calsrv.example.com-873970198738777@example.com
+SEQUENCE
+ :0
+REQUEST-STATUS
+ :2.0\;Success
+DTSTAMP
+ :19970612T190000Z
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+COMMENT
+ :Sorry
+COMMENT
+ : I cannot change this meeting time
+UID
+ :calsrv.example.com-873970198738777@example.com
+SEQUENCE
+ :0
+DTSTAMP
+ :19970614T190000Z
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+ORGANIZER
+ :MAILTO:A@Example.com
+ATTENDEE
+ ;PARTSTAT=DELEGATED
+ ;DELEGATED-TO="Mailto:E@example.com"
+ :Mailto:C@example.com
+UID
+ :calsrv.example.com-873970198738777@example.com
+SEQUENCE
+ :0
+REQUEST-STATUS
+ :2.0\;Success
+DTSTAMP
+ :19970611T190000Z
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+ORGANIZER
+ :MAILTO:A@Example.com
+ATTENDEE
+ ;PARTSTAT=ACCEPTED
+ ;DELEGATED-FROM="Mailto:C@example.com"
+ :Mailto:E@example.com
+ATTENDEE
+ ;PARTSTAT=DELEGATED
+ ;DELEGATED-TO="Mailto:E@example.com"
+ :Mailto:C@example.com
+UID
+ :calsrv.example.com-873970198738777@example.com
+SEQUENCE
+ :0
+REQUEST-STATUS
+ :2.0\;Success
+DTSTAMP
+ :19970614T190000Z
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+ORGANIZER
+ :MAILTO:A@Example.com
+ATTENDEE
+ ;PARTSTAT=DELEGATED
+ ;DELEGATED-TO="Mailto:E@example.com"
+ :Mailto:C@example.com
+ATTENDEE
+ ;PARTSTAT=DECLINED
+ ;DELEGATED-FROM="Mailto:C@example.com"
+ :Mailto:E@example.com
+COMMENT
+ :Sorry
+COMMENT
+ : I will be out of town at that time.
+UID
+ :calsrv.example.com-873970198738777@example.com
+SEQUENCE
+ :0
+REQUEST-STATUS
+ :2.0\;Success
+DTSTAMP
+ :19970614T190000Z
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ :A@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'Mailto'
+ATTENDEE
+ :Mailto:B@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ :Mailto:C@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ :Mailto:D@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+COMMENT
+ :Mr. B cannot attend. It's raining. Lets cancel.
+UID
+ :calsrv.example.com-873970198738777@example.com
+SEQUENCE
+ :1
+STATUS
+ :CANCELLED
+DTSTAMP
+ :19970613T190000Z
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ :mailto:B@example.com
+COMMENT
+ :You're off the hook for this meeting
+UID
+ :calsrv.example.com-873970198738777@example.com
+DTSTAMP
+ :19970613T193000Z
+SEQUENCE
+ :1
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :guid-1@host1.com
+SEQUENCE
+ :0
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
+ :Can't parse as RECUR value in RRULE property. Removing entire property:
+ 'FREQ=MONTHLY\;BYMONTHDAY=1\;UNTIL=19980901T210000Z'
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ :Mailto:B@example.com
+ATTENDEE
+ :Mailto:C@example.com
+ATTENDEE
+ :Mailto:D@example.com
+DESCRIPTION
+ :IETF-C&S Conference Call
+CLASS
+ :PUBLIC
+SUMMARY
+ :IETF Calendaring Working Group Meeting
+DTSTART
+ :19970601T210000Z
+DTEND
+ :19970601T220000Z
+LOCATION
+ :Conference Call
+DTSTAMP
+ :19970526T083000Z
+STATUS
+ :CONFIRMED
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :guid-1@host1.com
+SEQUENCE
+ :0
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
+ :Can't parse as RECUR value in RRULE property. Removing entire property:
+ 'FREQ=MONTHLY\;BYMONTHDAY=1'
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:C@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:D@example.com
+DESCRIPTION
+ :IETF-C&S Conference Call
+CLASS
+ :PUBLIC
+SUMMARY
+ :IETF Calendaring Working Group Meeting
+DTSTART
+ :19970601T210000Z
+DTEND
+ :19970601T220000Z
+DTSTAMP
+ :19970602T094000Z
+LOCATION
+ :Conference Call
+STATUS
+ :CONFIRMED
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PROPERTY_PARSE_ERROR
+ :Parse error in property name: 'FOO'
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ :Mailto:B@example.com
+REQUEST-STATUS
+ :2.8\;Repeating event ignored. Scheduled as a single event\;RRULE
+REQUEST-STATUS
+ :3.0\;Invalid Property Name\;FOO
+UID
+ :guid-1@host1.com
+SEQUENCE
+ :0
+DTSTAMP
+ :19970603T094000Z
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ :Mailto:B@example.com
+ATTENDEE
+ :Mailto:C@example.com
+ATTENDEE
+ :Mailto:D@example.com
+UID
+ : guid-1-12345@host1.com
+DTSTAMP
+ :19970603T094000
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ :Mailto:B@example.com
+UID
+ :acme-12345@host1.com
+DTSTAMP
+ :19970603T094000
+LAST-MODIFIED
+ :20000209T060028Z
+END:VEVENT
+END:VCALENDAR
diff --git a/libical/src/test/alice/booked/199707 b/libical/src/test/alice/booked/199707
new file mode 100644
index 0000000000..c52d27aa91
--- /dev/null
+++ b/libical/src/test/alice/booked/199707
@@ -0,0 +1,701 @@
+BEGIN:VCALENDAR
+X-LIC-CLUSTERCOUNT
+ :19
+DTSTART
+ :00000000T000000
+DTEND
+ :00000000T000000
+BEGIN:VEVENT
+ORGANIZER
+ :mailto:a@example.com
+DTSTART
+ :19970701T200000Z
+DTSTAMP
+ :19970611T190000Z
+SUMMARY
+ :ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
+UID
+ :0981234-1234234-23@example.com
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+ORGANIZER
+ :mailto:a@example.com
+DTSTAMP
+ :19970612T190000Z
+DTSTART
+ :19970701T210000Z
+DTEND
+ :19970701T230000Z
+SEQUENCE
+ :1
+UID
+ :0981234-1234234-23@example.com
+SUMMARY
+ :ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+ORGANIZER
+ :mailto:a@example.com
+ATTACH
+ :http://www.dukes.com/
+CATEGORIES
+ :SPORTS EVENT
+CATEGORIES
+ :ENTERTAINMENT
+CLASS
+ :PRIVATE
+DESCRIPTION
+ :MIDWAY STADIUM\nBig time game. MUST see.\nExpected duration:2 hours\n
+DTEND
+ ;TZID=America-Chicago
+ :19970701T180000
+DTSTART
+ ;TZID=America-Chicago
+ :19970702T160000
+DTSTAMP
+ :19970614T190000Z
+STATUS
+ :CONFIRMED
+LOCATION
+ :http://www.midwaystadium.com/
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter value: 'VALUE=America-Chicago'
+PRIORITY
+ :2
+RESOURCES
+ :SCOREBOARD
+SEQUENCE
+ :3
+SUMMARY
+ :ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
+UID
+ :0981234-1234234-23@example.com
+RELATED-TO
+ :0981234-1234234-14@example.com
+LAST-MODIFIED
+ :20000209T060027Z
+BEGIN:VALARM
+TRIGGER
+ :PT2H
+ACTION
+ :DISPLAY
+DESCRIPTION
+ :You should be leaving for the game now.
+END:VALARM
+BEGIN:VALARM
+TRIGGER
+ :PT30M
+ACTION
+ :AUDIO
+END:VALARM
+END:VEVENT
+BEGIN:VEVENT
+ORGANIZER
+ :mailto:a@example.com
+DTSTAMP
+ :19970614T190000Z
+UID
+ :0981234-1234234-23@example.com
+DTSTART
+ ;VALUE=DATE
+ :19970714
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
+ :Can't parse as RECUR value in RRULE property. Removing entire property:
+ 'FREQ=YEARLY\;INTERVAL=1'
+SUMMARY
+ : Bastille Day
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ ;CN=BIG A
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ ;CN=B
+ :Mailto:B@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ ;RSVP=TRUE
+ ;CN=C
+ :Mailto:C@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ ;RSVP=TRUE
+ ;CN=Hal
+ :Mailto:D@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ ;RSVP=FALSE
+ :conf_Big@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=ROOM'
+ATTENDEE
+ ;ROLE=NON-PARTICIPANT
+ ;RSVP=FALSE
+ :Mailto:E@example.com
+DTSTAMP
+ :19970611T190000Z
+DTSTART
+ :19970701T200000Z
+DTEND
+ :19970701T200000Z
+SUMMARY
+ :Conference
+UID
+ :calsrv.example.com-873970198738777@example.com
+SEQUENCE
+ :0
+STATUS
+ :CONFIRMED
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:C@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ ;RSVP=TRUE
+ ;CN=Hal
+ :Mailto:D@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ ;ROLE=NON-PARTICIPANT
+ ;RSVP=FALSE
+ ;CUTYPE=ROOM
+ :Mailto:Conf@example.com
+ATTENDEE
+ ;ROLE=NON-PARTICIPANT
+ ;RSVP=FALSE
+ :Mailto:E@example.com
+DTSTART
+ :19970701T180000Z
+DTEND
+ :19970701T190000Z
+SUMMARY
+ :Phone Conference
+UID
+ :calsrv.example.com-873970198738777@example.com
+SEQUENCE
+ :1
+DTSTAMP
+ :19970613T190000Z
+STATUS
+ :CONFIRMED
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:C@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+DTSTART
+ :19970701T190000Z
+DTEND
+ :19970701T200000Z
+SUMMARY
+ :Discuss the Merits of the election results
+LOCATION
+ :Green Conference Room
+UID
+ :calsrv.example.com-873970198738777a@example.com
+SEQUENCE
+ :0
+DTSTAMP
+ :19970611T190000Z
+STATUS
+ :CONFIRMED
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:C@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+DTSTART
+ :19970701T160000Z
+DTEND
+ :19970701T190000Z
+DTSTAMP
+ :19970612T190000Z
+SUMMARY
+ :Discuss the Merits of the election results
+LOCATION
+ :Green Conference Room
+COMMENT
+ :This time works much better and I think the big conference room is
+ too big
+UID
+ :calsrv.example.com-873970198738777a@example.com
+SEQUENCE
+ :0
+DTSTAMP
+ :19970611T190000Z
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:C@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+DTSTAMP
+ :19970613T190000Z
+DTSTART
+ :19970701T160000Z
+DTEND
+ :19970701T190000Z
+SUMMARY
+ :Discuss the Merits of the election results - changed to meet B's schedule
+LOCATION
+ :Green Conference Room
+UID
+ :calsrv.example.com-873970198738777@example.com
+SEQUENCE
+ :1
+STATUS
+ :CONFIRMED
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;PARTSTAT=DELEGATED
+ ;DELEGATED-TO="Mailto:E@example.com"
+ :Mailto:C@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ ;DELEGATED-FROM="Mailto:C@example.com"
+ :Mailto:E@example.com
+DTSTART
+ :19970701T180000Z
+DTEND
+ :19970701T200000Z
+SUMMARY
+ :Phone Conference
+UID
+ :calsrv.example.com-873970198738777@example.com
+SEQUENCE
+ :0
+STATUS
+ :CONFIRMED
+DTSTAMP
+ :19970611T190000Z
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+ORGANIZER
+ :MAILTO:A@Example.com
+ATTENDEE
+ ;PARTSTAT=DECLINED
+ ;DELEGATED-FROM="Mailto:C@example.com"
+ :Mailto:E@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:C@example.com
+UID
+ :calsrv.example.com-873970198738777@example.com
+SEQUENCE
+ :0
+SUMMARY
+ :Phone Conference
+DTSTART
+ :19970701T180000Z
+DTEND
+ :19970701T200000Z
+DTSTAMP
+ :19970614T200000Z
+COMMENT
+ :DELEGATE (ATTENDEE Mailto:E@example.com) DECLINED YOURINVITATION
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ :Mailto:C@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ :Mailto:D@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ :CR_Big@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=ROOM'
+ATTENDEE
+ ;ROLE=NON-PARTICIPANT
+ ;RSVP=FALSE
+ :Mailto:E@example.com
+DTSTAMP
+ :19970611T190000Z
+DTSTART
+ :19970701T200000Z
+DTEND
+ :19970701T203000Z
+SUMMARY
+ :Phone Conference
+UID
+ :calsrv.example.com-873970198738777@example.com
+SEQUENCE
+ :2
+STATUS
+ :CONFIRMED
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+ORGANIZER
+ :Mailto:B@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ :Mailto:B@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'STATUS=ACCEPTED'
+ATTENDEE
+ :Mailto:C@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ :Mailto:D@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+DTSTAMP
+ :19970611T190000Z
+DTSTART
+ :19970701T200000Z
+DTEND
+ :19970701T203000Z
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
+ :Can't parse as RECUR value in RRULE property. Removing entire property:
+ 'FREQ=WEEKLY'
+SUMMARY
+ :Phone Conference
+UID
+ :123456@example.com
+SEQUENCE
+ :1
+STATUS
+ :CONFIRMED
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :A@example.COM
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ ;RSVP=TRUE
+ :B@example.fr
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ ;RSVP=TRUE
+ :c@example.jp
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+DTSTAMP
+ :19970613T190030Z
+DTSTART
+ ;TZID=America-SanJose
+ :19970701T140000
+DTEND
+ ;TZID=America-SanJose
+ :19970701T150000
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
+ :Can't parse as RECUR value in RRULE property. Removing entire property:
+ 'FREQ=WEEKLY\;INTERVAL=20\;WKST=SU\;BYDAY=TU'
+RDATE
+ ;TZID=America-SanJose
+ :19970910T140000
+EXDATE
+ ;TZID=America-SanJose
+ :19970909T140000
+EXDATE
+ ;TZID=America-SanJose
+ :19971028T140000
+SUMMARY
+ :Weekly Phone Conference
+UID
+ :calsrv.example.com-873970198738777@example.com
+SEQUENCE
+ :0
+STATUS
+ :CONFIRMED
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :guid-1@host1com
+RECURRENCE-ID
+ :19970701T210000Z
+SEQUENCE
+ :1
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ :Mailto:B@example.com
+ATTENDEE
+ :Mailto:C@example.com
+ATTENDEE
+ :Mailto:D@example.com
+DESCRIPTION
+ :IETF-C&S Conference Call
+CLASS
+ :PUBLIC
+SUMMARY
+ :IETF Calendaring Working Group Meeting
+DTSTART
+ :19970703T210000Z
+DTEND
+ :19970703T220000Z
+LOCATION
+ :Conference Call
+DTSTAMP
+ :19970626T093000Z
+STATUS
+ :CONFIRMED
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :guid-1@host1.com
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ :Mailto:B@example.com
+ATTENDEE
+ :Mailto:C@example.com
+ATTENDEE
+ :Mailto:D@example.com
+RECURRENCE-ID
+ :19970801T210000Z
+SEQUENCE
+ :2
+STATUS
+ :CANCELLED
+DTSTAMP
+ :19970721T093000Z
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :guid-1@host1.com
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ :Mailto:B@example.com
+ATTENDEE
+ :Mailto:C@example.com
+ATTENDEE
+ :Mailto:D@example.com
+DTSTAMP
+ :19970721T103000Z
+STATUS
+ :CANCELLED
+SEQUENCE
+ :3
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :123456789@host1.com
+SEQUENCE
+ :4
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:C@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:D@example.com
+DESCRIPTION
+ :IETF-C&S Conference Call
+CLASS
+ :PUBLIC
+SUMMARY
+ :IETF Calendaring Working Group Meeting
+DTSTART
+ :19970715T210000Z
+DTEND
+ :19970715T220000Z
+LOCATION
+ :Conference Call
+DTSTAMP
+ :19970629T093000Z
+STATUS
+ :CONFIRMED
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :guid-1@host1.com
+RECURRENCE-ID
+ :19970715T210000Z
+SEQUENCE
+ :4
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;RSVP=TRUE
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:C@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:D@example.com
+DESCRIPTION
+ :IETF-C&S Conference Call
+CLASS
+ :PUBLIC
+SUMMARY
+ :IETF Calendaring Working Group Meeting
+DTSTART
+ :19970715T220000Z
+DTEND
+ :19970715T230000Z
+LOCATION
+ :Conference Call
+COMMENT
+ :May we bump this by an hour? I have a conflict
+DTSTAMP
+ :19970629T094000Z
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+END:VCALENDAR
diff --git a/libical/src/test/alice/booked/199708 b/libical/src/test/alice/booked/199708
new file mode 100644
index 0000000000..2db95cabcf
--- /dev/null
+++ b/libical/src/test/alice/booked/199708
@@ -0,0 +1,45 @@
+BEGIN:VCALENDAR
+X-LIC-CLUSTERCOUNT
+ :1
+DTSTART
+ :00000000T000000
+DTEND
+ :00000000T000000
+BEGIN:VEVENT
+UID
+ :acme-12345@host1.com
+SEQUENCE
+ :3
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
+ :Can't parse as RECUR value in RRULE property. Removing entire property:
+ 'FREQ=WEEKLY'
+RDATE
+ ;VALUE=PERIOD
+ :19970819T210000Z/19970081T220000Z
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ :Mailto:B@example.com
+DESCRIPTION
+ :IETF-C&S Conference Call
+SUMMARY
+ :IETF Calendaring Working Group Meeting
+DTSTART
+ :19970801T210000Z
+DTEND
+ :19970801T220000Z
+RECURRENCE-ID
+ :19970809T210000Z
+DTSTAMP
+ :19970726T083000
+STATUS
+ :CONFIRMED
+LAST-MODIFIED
+ :20000209T060028Z
+END:VEVENT
+END:VCALENDAR
diff --git a/libical/src/test/alice/booked/199709 b/libical/src/test/alice/booked/199709
new file mode 100644
index 0000000000..30a4471bde
--- /dev/null
+++ b/libical/src/test/alice/booked/199709
@@ -0,0 +1,58 @@
+BEGIN:VCALENDAR
+X-LIC-CLUSTERCOUNT
+ :1
+DTSTART
+ :00000000T000000
+DTEND
+ :00000000T000000
+BEGIN:VEVENT
+UID
+ :guid-1@host1.com
+RECURRENCE-ID
+ :19970901T210000Z
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'THISANDFUTURE'
+SEQUENCE
+ :3
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:C@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:D@example.com
+DESCRIPTION
+ :IETF-C&S Discussion
+CLASS
+ :PUBLIC
+SUMMARY
+ :IETF Calendaring Working Group Meeting
+DTSTART
+ :19970901T210000Z
+DTEND
+ :19970901T220000Z
+LOCATION
+ :Building 32
+LOCATION
+ : Microsoft
+LOCATION
+ : Seattle
+LOCATION
+ : WA
+DTSTAMP
+ :19970526T083000Z
+STATUS
+ :CONFIRMED
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+END:VCALENDAR
diff --git a/libical/src/test/alice/booked/199803 b/libical/src/test/alice/booked/199803
new file mode 100644
index 0000000000..4b673d7ccc
--- /dev/null
+++ b/libical/src/test/alice/booked/199803
@@ -0,0 +1,241 @@
+BEGIN:VCALENDAR
+X-LIC-CLUSTERCOUNT
+ :7
+DTSTART
+ :00000000T000000
+DTEND
+ :00000000T000000
+BEGIN:VEVENT
+UID
+ :123456789@host1.com
+SEQUENCE
+ :0
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
+ :Can't parse as RECUR value in RRULE property. Removing entire property:
+ 'WKST=SU\;BYDAY=TU\;FREQ=WEEKLY'
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+SUMMARY
+ :Review Accounts
+DTSTART
+ :19980303T210000Z
+DTEND
+ :19980303T220000Z
+LOCATION
+ :The White Room
+DTSTAMP
+ :19980301T093000Z
+STATUS
+ :CONFIRMED
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :123456789@host1.com
+SEQUENCE
+ :7
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
+ :Can't parse as RECUR value in RRULE property. Removing entire property:
+ 'WKST=SU\;BYDAY=TH\;FREQ=WEEKLY'
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+SUMMARY
+ :Review Accounts
+DTSTART
+ :19980303T210000Z
+DTEND
+ :19980303T220000Z
+DTSTAMP
+ :19980303T193000Z
+LOCATION
+ :The Usual conference room
+STATUS
+ :CONFIRMED
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :123456789@host1.com
+SEQUENCE
+ :7
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
+ :Can't parse as RECUR value in RRULE property. Removing entire property:
+ 'WKST=SU\;BYDAY=TU'
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+SUMMARY
+ :Review Accounts
+DTSTART
+ :19980303T210000Z
+DTEND
+ :19980303T220000Z
+DTSTAMP
+ :19980303T193000Z
+LOCATION
+ :The White Room
+STATUS
+ :CONFIRMED
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :123456789@host1.com
+SEQUENCE
+ :0
+RDATE
+ :19980304T180000Z
+RDATE
+ :19980311T180000Z
+RDATE
+ :19980318T180000Z
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+SUMMARY
+ :Review Accounts
+DTSTART
+ :19980304T180000Z
+DTEND
+ :19980304T200000Z
+DTSTAMP
+ :19980303T193000Z
+LOCATION
+ :Conference Room A
+STATUS
+ :CONFIRMED
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :123456789@host1.com
+SEQUENCE
+ :1
+RECURRENCE-ID
+ :19980311T180000Z
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+SUMMARY
+ :Review Accounts
+DTSTART
+ :19980311T160000Z
+DTEND
+ :19980311T180000Z
+DTSTAMP
+ :19980306T193000Z
+LOCATION
+ :The Small conference room
+STATUS
+ :CONFIRMED
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :123456789@host1.com
+SEQUENCE
+ :2
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+SUMMARY
+ :Review Accounts
+DTSTART
+ :19980315T180000Z
+DTEND
+ :19980315T200000Z
+DTSTAMP
+ :19980307T193000Z
+LOCATION
+ :Conference Room A
+STATUS
+ :CONFIRMED
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :123456789@host1.com
+SEQUENCE
+ :2
+RDATE
+ :19980304T180000Z
+RDATE
+ :19980311T160000Z
+RDATE
+ :19980315T180000Z
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=COMPONENT_PARSE_ERROR
+ :Got a data line\, but could not find a property name or component
+ begin tag: 'Error! Bookmark not defined.'
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+SUMMARY
+ :Review Accounts
+DTSTART
+ :19980304T180000Z
+DTEND
+ :19980304T200000Z
+DTSTAMP
+ :19980303T193000Z
+LOCATION
+ :Conference Room A
+STATUS
+ :CONFIRMED
+LAST-MODIFIED
+ :20000209T060027Z
+END:VEVENT
+END:VCALENDAR
diff --git a/libical/src/test/alice/incoming.ics b/libical/src/test/alice/incoming.ics
new file mode 100644
index 0000000000..c25b6b11c3
--- /dev/null
+++ b/libical/src/test/alice/incoming.ics
@@ -0,0 +1,2164 @@
+BEGIN:VCALENDAR
+X-LIC-CLUSTERCOUNT
+ :0
+DTSTART
+ :00000000T000000
+DTEND
+ :00000000T000000
+BEGIN:VCALENDAR
+METHOD
+ :PUBLISH
+PRODID
+ :-//ACME/DesktopCalendar//EN
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+ORGANIZER
+ :mailto:a@example.com
+DTSTART
+ :19970701T200000Z
+DTSTAMP
+ :19970611T190000Z
+SUMMARY
+ :ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
+UID
+ :0981234-1234234-23@example.com
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD
+ :PUBLISH
+VERSION
+ :2.0
+PRODID
+ :-//ACME/DesktopCalendar//EN
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+ORGANIZER
+ :mailto:a@example.com
+DTSTAMP
+ :19970612T190000Z
+DTSTART
+ :19970701T210000Z
+DTEND
+ :19970701T230000Z
+SEQUENCE
+ :1
+UID
+ :0981234-1234234-23@example.com
+SUMMARY
+ :ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD
+ :CANCEL
+VERSION
+ :2.0
+PRODID
+ :-//ACME/DesktopCalendar//EN
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+ORGANIZER
+ :mailto:a@example.com
+COMMENT
+ :DUKES forfeit the game
+SEQUENCE
+ :2
+UID
+ :0981234-1234234-23@example.com
+DTSTAMP
+ :19970613T190000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID
+ :-//ACME/DesktopCalendar//EN
+METHOD
+ :PUBLISH
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PROPERTY_PARSE_ERROR
+ :Parse error in property name: 'SCALE'
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VTIMEZONE
+TZID
+ :America-Chicago
+TZURL
+ :http://zones.stds_r_us.net/tz/America-Chicago
+BEGIN:STANDARD
+DTSTART
+ :19671029T020000
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
+ :Can't parse as RECUR value in RRULE property. Removing entire property:
+ 'FREQ=YEARLY\;BYDAY=-1SU\;BYMONTH=10'
+TZOFFSETFROM
+ :-050000
+TZOFFSETTO
+ :-060000
+TZNAME
+ :CST
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART
+ :19870405T020000
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
+ :Can't parse as RECUR value in RRULE property. Removing entire property:
+ 'FREQ=YEARLY\;BYDAY=1SU\;BYMONTH=4'
+TZOFFSETFROM
+ :-060000
+TZOFFSETTO
+ :-050000
+TZNAME
+ :CDT
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+ORGANIZER
+ :mailto:a@example.com
+ATTACH
+ :http://www.dukes.com/
+CATEGORIES
+ :SPORTS EVENT
+CATEGORIES
+ :ENTERTAINMENT
+CLASS
+ :PRIVATE
+DESCRIPTION
+ :MIDWAY STADIUM\nBig time game. MUST see.\nExpected duration:2 hours\n
+DTEND
+ ;TZID=America-Chicago
+ :19970701T180000
+DTSTART
+ ;TZID=America-Chicago
+ :19970702T160000
+DTSTAMP
+ :19970614T190000Z
+STATUS
+ :CONFIRMED
+LOCATION
+ :http://www.midwaystadium.com/
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter value: 'VALUE=America-Chicago'
+PRIORITY
+ :2
+RESOURCES
+ :SCOREBOARD
+SEQUENCE
+ :3
+SUMMARY
+ :ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
+UID
+ :0981234-1234234-23@example.com
+RELATED-TO
+ :0981234-1234234-14@example.com
+BEGIN:VALARM
+TRIGGER
+ :PT2H
+ACTION
+ :DISPLAY
+DESCRIPTION
+ :You should be leaving for the game now.
+END:VALARM
+BEGIN:VALARM
+TRIGGER
+ :PT30M
+ACTION
+ :AUDIO
+END:VALARM
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID
+ :-//ACME/DesktopCalendar//EN
+METHOD
+ :PUBLISH
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+ORGANIZER
+ :mailto:a@example.com
+DTSTAMP
+ :19970614T190000Z
+UID
+ :0981234-1234234-23@example.com
+DTSTART
+ ;VALUE=DATE
+ :19970714
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
+ :Can't parse as RECUR value in RRULE property. Removing entire property:
+ 'FREQ=YEARLY\;INTERVAL=1'
+SUMMARY
+ : Bastille Day
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID
+ :-//ACME/DesktopCalendar//EN
+METHOD
+ :REQUEST
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ ;CN=BIG A
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ ;CN=B
+ :Mailto:B@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ ;RSVP=TRUE
+ ;CN=C
+ :Mailto:C@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ ;RSVP=TRUE
+ ;CN=Hal
+ :Mailto:D@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ ;RSVP=FALSE
+ :conf_Big@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=ROOM'
+ATTENDEE
+ ;ROLE=NON-PARTICIPANT
+ ;RSVP=FALSE
+ :Mailto:E@example.com
+DTSTAMP
+ :19970611T190000Z
+DTSTART
+ :19970701T200000Z
+DTEND
+ :19970701T200000Z
+SUMMARY
+ :Conference
+UID
+ :calsrv.example.com-873970198738777@example.com
+SEQUENCE
+ :0
+STATUS
+ :CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID
+ :-//ACME/DesktopCalendar//EN
+METHOD
+ :REPLY
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+ATTENDEE
+ ;PARTSTAT=ACCEPTED
+ :Mailto:B@example.com
+ORGANIZER
+ :MAILTO:A@example.com
+UID
+ :calsrv.example.com-873970198738777@example.com
+SEQUENCE
+ :0
+REQUEST-STATUS
+ :2.0\;Success
+DTSTAMP
+ :19970612T190000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID
+ :-//ACME/DesktopCalendar//EN
+METHOD
+ :REQUEST
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:C@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ ;RSVP=TRUE
+ ;CN=Hal
+ :Mailto:D@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ ;ROLE=NON-PARTICIPANT
+ ;RSVP=FALSE
+ ;CUTYPE=ROOM
+ :Mailto:Conf@example.com
+ATTENDEE
+ ;ROLE=NON-PARTICIPANT
+ ;RSVP=FALSE
+ :Mailto:E@example.com
+DTSTART
+ :19970701T180000Z
+DTEND
+ :19970701T190000Z
+SUMMARY
+ :Phone Conference
+UID
+ :calsrv.example.com-873970198738777@example.com
+SEQUENCE
+ :1
+DTSTAMP
+ :19970613T190000Z
+STATUS
+ :CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID
+ :-//ACME/DesktopCalendar//EN
+METHOD
+ :REQUEST
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:C@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+DTSTART
+ :19970701T190000Z
+DTEND
+ :19970701T200000Z
+SUMMARY
+ :Discuss the Merits of the election results
+LOCATION
+ :Green Conference Room
+UID
+ :calsrv.example.com-873970198738777a@example.com
+SEQUENCE
+ :0
+DTSTAMP
+ :19970611T190000Z
+STATUS
+ :CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID
+ :-//ACME/DesktopCalendar//EN
+METHOD
+ :COUNTER
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:C@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+DTSTART
+ :19970701T160000Z
+DTEND
+ :19970701T190000Z
+DTSTAMP
+ :19970612T190000Z
+SUMMARY
+ :Discuss the Merits of the election results
+LOCATION
+ :Green Conference Room
+COMMENT
+ :This time works much better and I think the big conference room is
+ too big
+UID
+ :calsrv.example.com-873970198738777a@example.com
+SEQUENCE
+ :0
+DTSTAMP
+ :19970611T190000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID
+ :-//ACME/DesktopCalendar//EN
+METHOD
+ :REQUEST
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:C@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+DTSTAMP
+ :19970613T190000Z
+DTSTART
+ :19970701T160000Z
+DTEND
+ :19970701T190000Z
+SUMMARY
+ :Discuss the Merits of the election results - changed to meet B's schedule
+LOCATION
+ :Green Conference Room
+UID
+ :calsrv.example.com-873970198738777@example.com
+SEQUENCE
+ :1
+STATUS
+ :CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID
+ :-//ACME/DesktopCalendar//EN
+METHOD
+ :DECLINECOUNTER
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+COMMENT
+ :Sorry
+COMMENT
+ : I cannot change this meeting time
+UID
+ :calsrv.example.com-873970198738777@example.com
+SEQUENCE
+ :0
+DTSTAMP
+ :19970614T190000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID
+ :-//ACME/DesktopCalendar//EN
+METHOD
+ :REPLY
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+ORGANIZER
+ :MAILTO:A@Example.com
+ATTENDEE
+ ;PARTSTAT=DELEGATED
+ ;DELEGATED-TO="Mailto:E@example.com"
+ :Mailto:C@example.com
+UID
+ :calsrv.example.com-873970198738777@example.com
+SEQUENCE
+ :0
+REQUEST-STATUS
+ :2.0\;Success
+DTSTAMP
+ :19970611T190000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID
+ :-//ACME/DesktopCalendar//EN
+METHOD
+ :REQUEST
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;PARTSTAT=DELEGATED
+ ;DELEGATED-TO="Mailto:E@example.com"
+ :Mailto:C@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ ;DELEGATED-FROM="Mailto:C@example.com"
+ :Mailto:E@example.com
+DTSTART
+ :19970701T180000Z
+DTEND
+ :19970701T200000Z
+SUMMARY
+ :Phone Conference
+UID
+ :calsrv.example.com-873970198738777@example.com
+SEQUENCE
+ :0
+STATUS
+ :CONFIRMED
+DTSTAMP
+ :19970611T190000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID
+ :-//ACME/DesktopCalendar//EN
+METHOD
+ :REPLY
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+ORGANIZER
+ :MAILTO:A@Example.com
+ATTENDEE
+ ;PARTSTAT=ACCEPTED
+ ;DELEGATED-FROM="Mailto:C@example.com"
+ :Mailto:E@example.com
+ATTENDEE
+ ;PARTSTAT=DELEGATED
+ ;DELEGATED-TO="Mailto:E@example.com"
+ :Mailto:C@example.com
+UID
+ :calsrv.example.com-873970198738777@example.com
+SEQUENCE
+ :0
+REQUEST-STATUS
+ :2.0\;Success
+DTSTAMP
+ :19970614T190000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID
+ :-//ACME/DesktopCalendar//EN
+METHOD
+ :REPLY
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+ORGANIZER
+ :MAILTO:A@Example.com
+ATTENDEE
+ ;PARTSTAT=DELEGATED
+ ;DELEGATED-TO="Mailto:E@example.com"
+ :Mailto:C@example.com
+ATTENDEE
+ ;PARTSTAT=DECLINED
+ ;DELEGATED-FROM="Mailto:C@example.com"
+ :Mailto:E@example.com
+COMMENT
+ :Sorry
+COMMENT
+ : I will be out of town at that time.
+UID
+ :calsrv.example.com-873970198738777@example.com
+SEQUENCE
+ :0
+REQUEST-STATUS
+ :2.0\;Success
+DTSTAMP
+ :19970614T190000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID
+ :-//ACME/DesktopCalendar//EN
+METHOD
+ :REQUEST
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+ORGANIZER
+ :MAILTO:A@Example.com
+ATTENDEE
+ ;PARTSTAT=DECLINED
+ ;DELEGATED-FROM="Mailto:C@example.com"
+ :Mailto:E@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:C@example.com
+UID
+ :calsrv.example.com-873970198738777@example.com
+SEQUENCE
+ :0
+SUMMARY
+ :Phone Conference
+DTSTART
+ :19970701T180000Z
+DTEND
+ :19970701T200000Z
+DTSTAMP
+ :19970614T200000Z
+COMMENT
+ :DELEGATE (ATTENDEE Mailto:E@example.com) DECLINED YOURINVITATION
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID
+ :-//ACME/DesktopCalendar//EN
+METHOD
+ :CANCEL
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ :A@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'Mailto'
+ATTENDEE
+ :Mailto:B@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ :Mailto:C@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ :Mailto:D@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+COMMENT
+ :Mr. B cannot attend. It's raining. Lets cancel.
+UID
+ :calsrv.example.com-873970198738777@example.com
+SEQUENCE
+ :1
+STATUS
+ :CANCELLED
+DTSTAMP
+ :19970613T190000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID
+ :-//ACME/DesktopCalendar//EN
+METHOD
+ :CANCEL
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ :mailto:B@example.com
+COMMENT
+ :You're off the hook for this meeting
+UID
+ :calsrv.example.com-873970198738777@example.com
+DTSTAMP
+ :19970613T193000Z
+SEQUENCE
+ :1
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID
+ :-//ACME/DesktopCalendar//EN
+METHOD
+ :REQUEST
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ :Mailto:C@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ :Mailto:D@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ :CR_Big@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=ROOM'
+ATTENDEE
+ ;ROLE=NON-PARTICIPANT
+ ;RSVP=FALSE
+ :Mailto:E@example.com
+DTSTAMP
+ :19970611T190000Z
+DTSTART
+ :19970701T200000Z
+DTEND
+ :19970701T203000Z
+SUMMARY
+ :Phone Conference
+UID
+ :calsrv.example.com-873970198738777@example.com
+SEQUENCE
+ :2
+STATUS
+ :CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID
+ :-//ACME/DesktopCalendar//EN
+METHOD
+ :REQUEST
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+ORGANIZER
+ :Mailto:B@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ :Mailto:B@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'STATUS=ACCEPTED'
+ATTENDEE
+ :Mailto:C@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ :Mailto:D@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+DTSTAMP
+ :19970611T190000Z
+DTSTART
+ :19970701T200000Z
+DTEND
+ :19970701T203000Z
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
+ :Can't parse as RECUR value in RRULE property. Removing entire property:
+ 'FREQ=WEEKLY'
+SUMMARY
+ :Phone Conference
+UID
+ :123456@example.com
+SEQUENCE
+ :1
+STATUS
+ :CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID
+ :-//ACME/DesktopCalendar//EN
+VERSION
+ :2.0
+METHOD
+ :PUBLISH
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VFREEBUSY
+DTSTAMP
+ :19980101T124100Z
+ORGANIZER
+ :MAILTO:A@Example.com
+DTSTART
+ :19980101T124200Z
+DTEND
+ :19980107T124200Z
+FREEBUSY
+ :19980101T180000Z/19980101T190000Z
+FREEBUSY
+ :19980103T020000Z/19980103T050000Z
+FREEBUSY
+ :19980107T020000Z/19980107T050000Z
+FREEBUSY
+ :19980113T000000Z/19980113T010000Z
+FREEBUSY
+ :19980115T190000Z/19980115T200000Z
+FREEBUSY
+ :19980115T220000Z/19980115T230000Z
+FREEBUSY
+ :19980116T013000Z/19980116T043000Z
+END:VFREEBUSY
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID
+ :-//ACME/DesktopCalendar//EN
+METHOD
+ :REQUEST
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VFREEBUSY
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ :Mailto:A@example.com
+ATTENDEE
+ :Mailto:B@example.com
+ATTENDEE
+ :Mailto:C@example.com
+DTSTAMP
+ :19970613T190000Z
+DTSTART
+ :19970701T080000Z
+DTEND
+ :19970701T200000
+UID
+ :calsrv.example.com-873970198738777@example.com
+END:VFREEBUSY
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID
+ :-//ACME/DesktopCalendar//EN
+METHOD
+ :REPLY
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VFREEBUSY
+ORGANIZER
+ :MAILTO:A@example.com
+ATTENDEE
+ :Mailto:B@example.com
+DTSTART
+ :19970701T080000Z
+DTEND
+ :19970701T200000Z
+UID
+ :calsrv.example.com-873970198738777@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
+ :Can't parse as PERIOD value in FREEBUSY property. Removing entire
+ property: '19970701T090000Z/PT1H'
+DTSTAMP
+ :19970613T190030Z
+END:VFREEBUSY
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID
+ :-//ACME/DesktopCalendar//EN
+METHOD
+ :REQUEST
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VTIMEZONE
+TZID
+ :America-SanJose
+TZURL
+ :http://zones.stds_r_us.net/tz/America-SanJose
+BEGIN:STANDARD
+DTSTART
+ :19671029T020000
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
+ :Can't parse as RECUR value in RRULE property. Removing entire property:
+ 'FREQ=YEARLY\;BYDAY=-1SU\;BYMONTH=10'
+TZOFFSETFROM
+ :-070000
+TZOFFSETTO
+ :-080000
+TZNAME
+ :PST
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART
+ :19870405T020000
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
+ :Can't parse as RECUR value in RRULE property. Removing entire property:
+ 'FREQ=YEARLY\;BYDAY=1SU\;BYMONTH=4'
+TZOFFSETFROM
+ :-080000
+TZOFFSETTO
+ :-070000
+TZNAME
+ :PDT
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :A@example.COM
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ ;RSVP=TRUE
+ :B@example.fr
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ ;RSVP=TRUE
+ :c@example.jp
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+DTSTAMP
+ :19970613T190030Z
+DTSTART
+ ;TZID=America-SanJose
+ :19970701T140000
+DTEND
+ ;TZID=America-SanJose
+ :19970701T150000
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
+ :Can't parse as RECUR value in RRULE property. Removing entire property:
+ 'FREQ=WEEKLY\;INTERVAL=20\;WKST=SU\;BYDAY=TU'
+RDATE
+ ;TZID=America-SanJose
+ :19970910T140000
+EXDATE
+ ;TZID=America-SanJose
+ :19970909T140000
+EXDATE
+ ;TZID=America-SanJose
+ :19971028T140000
+SUMMARY
+ :Weekly Phone Conference
+UID
+ :calsrv.example.com-873970198738777@example.com
+SEQUENCE
+ :0
+STATUS
+ :CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD
+ :REQUEST
+PRODID
+ :-//RDU Software//NONSGML HandCal//EN
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+UID
+ :guid-1@host1.com
+SEQUENCE
+ :0
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
+ :Can't parse as RECUR value in RRULE property. Removing entire property:
+ 'FREQ=MONTHLY\;BYMONTHDAY=1\;UNTIL=19980901T210000Z'
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ :Mailto:B@example.com
+ATTENDEE
+ :Mailto:C@example.com
+ATTENDEE
+ :Mailto:D@example.com
+DESCRIPTION
+ :IETF-C&S Conference Call
+CLASS
+ :PUBLIC
+SUMMARY
+ :IETF Calendaring Working Group Meeting
+DTSTART
+ :19970601T210000Z
+DTEND
+ :19970601T220000Z
+LOCATION
+ :Conference Call
+DTSTAMP
+ :19970526T083000Z
+STATUS
+ :CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD
+ :REQUEST
+PRODID
+ :-//RDU Software//NONSGML HandCal//EN
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+UID
+ :guid-1@host1com
+RECURRENCE-ID
+ :19970701T210000Z
+SEQUENCE
+ :1
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ :Mailto:B@example.com
+ATTENDEE
+ :Mailto:C@example.com
+ATTENDEE
+ :Mailto:D@example.com
+DESCRIPTION
+ :IETF-C&S Conference Call
+CLASS
+ :PUBLIC
+SUMMARY
+ :IETF Calendaring Working Group Meeting
+DTSTART
+ :19970703T210000Z
+DTEND
+ :19970703T220000Z
+LOCATION
+ :Conference Call
+DTSTAMP
+ :19970626T093000Z
+STATUS
+ :CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD
+ :CANCEL
+PRODID
+ :-//RDU Software//NONSGML HandCal//EN
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+UID
+ :guid-1@host1.com
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ :Mailto:B@example.com
+ATTENDEE
+ :Mailto:C@example.com
+ATTENDEE
+ :Mailto:D@example.com
+RECURRENCE-ID
+ :19970801T210000Z
+SEQUENCE
+ :2
+STATUS
+ :CANCELLED
+DTSTAMP
+ :19970721T093000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD
+ :CANCEL
+PRODID
+ :-//RDU Software//NONSGML HandCal//EN
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+UID
+ :guid-1@host1.com
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ :Mailto:B@example.com
+ATTENDEE
+ :Mailto:C@example.com
+ATTENDEE
+ :Mailto:D@example.com
+DTSTAMP
+ :19970721T103000Z
+STATUS
+ :CANCELLED
+SEQUENCE
+ :3
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD
+ :REQUEST
+PRODID
+ :-//RDU Software//NONSGML HandCal//EN
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+UID
+ :guid-1@host1.com
+RECURRENCE-ID
+ :19970901T210000Z
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'THISANDFUTURE'
+SEQUENCE
+ :3
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:C@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:D@example.com
+DESCRIPTION
+ :IETF-C&S Discussion
+CLASS
+ :PUBLIC
+SUMMARY
+ :IETF Calendaring Working Group Meeting
+DTSTART
+ :19970901T210000Z
+DTEND
+ :19970901T220000Z
+LOCATION
+ :Building 32
+LOCATION
+ : Microsoft
+LOCATION
+ : Seattle
+LOCATION
+ : WA
+DTSTAMP
+ :19970526T083000Z
+STATUS
+ :CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD
+ :ADD
+PRODID
+ :-//RDU Software//NONSGML HandCal//EN
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+UID
+ :123456789@host1.com
+SEQUENCE
+ :4
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:C@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:D@example.com
+DESCRIPTION
+ :IETF-C&S Conference Call
+CLASS
+ :PUBLIC
+SUMMARY
+ :IETF Calendaring Working Group Meeting
+DTSTART
+ :19970715T210000Z
+DTEND
+ :19970715T220000Z
+LOCATION
+ :Conference Call
+DTSTAMP
+ :19970629T093000Z
+STATUS
+ :CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD
+ :REQUEST
+PRODID
+ :-//RDU Software//NONSGML HandCal//EN
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+UID
+ :123456789@host1.com
+SEQUENCE
+ :0
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
+ :Can't parse as RECUR value in RRULE property. Removing entire property:
+ 'WKST=SU\;BYDAY=TU\;FREQ=WEEKLY'
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+SUMMARY
+ :Review Accounts
+DTSTART
+ :19980303T210000Z
+DTEND
+ :19980303T220000Z
+LOCATION
+ :The White Room
+DTSTAMP
+ :19980301T093000Z
+STATUS
+ :CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD
+ :ADD
+PRODID
+ :-//RDU Software//NONSGML HandCal//EN
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+UID
+ :123456789@host1.com
+SEQUENCE
+ :7
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
+ :Can't parse as RECUR value in RRULE property. Removing entire property:
+ 'WKST=SU\;BYDAY=TH\;FREQ=WEEKLY'
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+SUMMARY
+ :Review Accounts
+DTSTART
+ :19980303T210000Z
+DTEND
+ :19980303T220000Z
+DTSTAMP
+ :19980303T193000Z
+LOCATION
+ :The Usual conference room
+STATUS
+ :CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD
+ :REQUEST
+PRODID
+ :-//RDU Software//NONSGML HandCal//EN
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+UID
+ :123456789@host1.com
+SEQUENCE
+ :7
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
+ :Can't parse as RECUR value in RRULE property. Removing entire property:
+ 'WKST=SU\;BYDAY=TU'
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+SUMMARY
+ :Review Accounts
+DTSTART
+ :19980303T210000Z
+DTEND
+ :19980303T220000Z
+DTSTAMP
+ :19980303T193000Z
+LOCATION
+ :The White Room
+STATUS
+ :CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD
+ :REQUEST
+PRODID
+ :-//RDU Software//NONSGML HandCal//EN
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+UID
+ :123456789@host1.com
+SEQUENCE
+ :0
+RDATE
+ :19980304T180000Z
+RDATE
+ :19980311T180000Z
+RDATE
+ :19980318T180000Z
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+SUMMARY
+ :Review Accounts
+DTSTART
+ :19980304T180000Z
+DTEND
+ :19980304T200000Z
+DTSTAMP
+ :19980303T193000Z
+LOCATION
+ :Conference Room A
+STATUS
+ :CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD
+ :REQUEST
+PRODID
+ :-//RDU Software//NONSGML HandCal//EN
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+UID
+ :123456789@host1.com
+SEQUENCE
+ :1
+RECURRENCE-ID
+ :19980311T180000Z
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+SUMMARY
+ :Review Accounts
+DTSTART
+ :19980311T160000Z
+DTEND
+ :19980311T180000Z
+DTSTAMP
+ :19980306T193000Z
+LOCATION
+ :The Small conference room
+STATUS
+ :CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD
+ :ADD
+PRODID
+ :-//RDU Software//NONSGML HandCal//EN
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+UID
+ :123456789@host1.com
+SEQUENCE
+ :2
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+SUMMARY
+ :Review Accounts
+DTSTART
+ :19980315T180000Z
+DTEND
+ :19980315T200000Z
+DTSTAMP
+ :19980307T193000Z
+LOCATION
+ :Conference Room A
+STATUS
+ :CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD
+ :REQUEST
+PRODID
+ :-//RDU Software//NONSGML HandCal//EN
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+UID
+ :123456789@host1.com
+SEQUENCE
+ :2
+RDATE
+ :19980304T180000Z
+RDATE
+ :19980311T160000Z
+RDATE
+ :19980315T180000Z
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=COMPONENT_PARSE_ERROR
+ :Got a data line\, but could not find a property name or component
+ begin tag: 'Error! Bookmark not defined.'
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+SUMMARY
+ :Review Accounts
+DTSTART
+ :19980304T180000Z
+DTEND
+ :19980304T200000Z
+DTSTAMP
+ :19980303T193000Z
+LOCATION
+ :Conference Room A
+STATUS
+ :CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=COMPONENT_PARSE_ERROR
+ :Got a data line\, but could not find a property name or component
+ begin tag: 'Error! Bookmark not defined.'
+SEQUENCE
+ :2
+RECURRENCE-ID
+ :19980311T160000Z
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=COMPONENT_PARSE_ERROR
+ :Got a data line\, but could not find a property name or component
+ begin tag: 'Error! Bookmark not defined.'
+ATTENDEE
+ :ROLE=CHAIR;Error! Bookmark not defined.
+ATTENDEE
+ :Error! Bookmark not defined.
+SUMMARY
+ :Review Accounts
+DTSTART
+ :19980311T160000Z
+DTEND
+ :19980304T180000Z
+DTSTAMP
+ :19980306T193000Z
+LOCATION
+ :The Small conference room
+STATUS
+ :CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD
+ :COUNTER
+PRODID
+ :-//RDU Software//NONSGML HandCal//EN
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+UID
+ :guid-1@host1.com
+RECURRENCE-ID
+ :19970715T210000Z
+SEQUENCE
+ :4
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;RSVP=TRUE
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:C@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:D@example.com
+DESCRIPTION
+ :IETF-C&S Conference Call
+CLASS
+ :PUBLIC
+SUMMARY
+ :IETF Calendaring Working Group Meeting
+DTSTART
+ :19970715T220000Z
+DTEND
+ :19970715T230000Z
+LOCATION
+ :Conference Call
+COMMENT
+ :May we bump this by an hour? I have a conflict
+DTSTAMP
+ :19970629T094000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD
+ :REQUEST
+PRODID
+ :-//RDU Software//NONSGML HandCal//EN
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+UID
+ :guid-1@host1.com
+SEQUENCE
+ :0
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
+ :Can't parse as RECUR value in RRULE property. Removing entire property:
+ 'FREQ=MONTHLY\;BYMONTHDAY=1'
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:C@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:D@example.com
+DESCRIPTION
+ :IETF-C&S Conference Call
+CLASS
+ :PUBLIC
+SUMMARY
+ :IETF Calendaring Working Group Meeting
+DTSTART
+ :19970601T210000Z
+DTEND
+ :19970601T220000Z
+DTSTAMP
+ :19970602T094000Z
+LOCATION
+ :Conference Call
+STATUS
+ :CONFIRMED
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PROPERTY_PARSE_ERROR
+ :Parse error in property name: 'FOO'
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID
+ :-//RDU Software//NONSGML HandCal//EN
+METHOD
+ :REPLY
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ :Mailto:B@example.com
+REQUEST-STATUS
+ :2.8\;Repeating event ignored. Scheduled as a single event\;RRULE
+REQUEST-STATUS
+ :3.0\;Invalid Property Name\;FOO
+UID
+ :guid-1@host1.com
+SEQUENCE
+ :0
+DTSTAMP
+ :19970603T094000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID
+ :-//ACME/DesktopCalendar//EN
+METHOD
+ :REQUEST
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VTODO
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:C@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:D@example.com
+DTSTART
+ :19970701T170000Z
+DUE
+ :19970722T170000Z
+PRIORITY
+ :1
+SUMMARY
+ :Create the requirements document
+UID
+ :calsrv.example.com-873970198738777-00@example.com
+SEQUENCE
+ :0
+DTSTAMP
+ :19970717T200000Z
+STATUS
+ :Needs Action
+END:VTODO
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID
+ :-//ACME/DesktopCalendar//EN
+METHOD
+ :REPLY
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VTODO
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;PARTSTAT=ACCEPTED
+ :Mailto:B@example.com
+UID
+ :calsrv.example.com-873970198738777-00@example.com
+COMMENT
+ :I'll send you my input by e-mail
+SEQUENCE
+ :0
+DTSTAMP
+ :19970717T203000Z
+REQUEST-STATUS
+ :2.0\;Success
+END:VTODO
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID
+ :-//ACME/DesktopCalendar//EN
+METHOD
+ :REQUEST
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VTODO
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:D@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+UID
+ :calsrv.example.com-873970198738777-00@example.com
+SUMMARY
+ :Create the requirements document
+PRIORITY
+ :1
+SEQUENCE
+ :0
+STATUS
+ :IN-PROCESS
+DTSTART
+ :19970701T170000Z
+DTSTAMP
+ :19970717T230000Z
+END:VTODO
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID
+ :-//ACME/DesktopCalendar//EN
+METHOD
+ :REPLY
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VTODO
+ORGANIZER
+ :MAILTO:A@example.com
+ATTENDEE
+ ;PARTSTAT=IN-PROCESS
+ :Mailto:B@example.com
+PERCENT-COMPLETE
+ :75
+UID
+ :calsrv.example.com-873970198738777-00@example.com
+DTSTAMP
+ :19970717T233000Z
+SEQUENCE
+ :0
+END:VTODO
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID
+ :-//ACME/DesktopCalendar//EN
+METHOD
+ :REPLY
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VTODO
+ORGANIZER
+ :MAILTO:A@example.com
+ATTENDEE
+ ;PARTSTAT=COMPLETED
+ :Mailto:D@example.com
+UID
+ :calsrv.example.com-873970198738777-00@example.com
+DTSTAMP
+ :19970717T233000Z
+SEQUENCE
+ :0
+END:VTODO
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID
+ :-//ACME/DesktopCalendar//EN
+METHOD
+ :REQUEST
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VTODO
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ ;PARTSTAT=ACCEPTED
+ :Mailto:B@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ ;PARTSTAT=IN-PROCESS
+ :Mailto:D@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+DTSTART
+ :19970701T170000Z
+DUE
+ :19970722T170000Z
+PRIORITY
+ :1
+SUMMARY
+ :Create the requirements document
+UID
+ :calsrv.example.com-873970198738777-00@example.com
+SEQUENCE
+ :1
+DTSTAMP
+ :19970718T100000Z
+STATUS
+ :IN-PROGRESS
+PERCENT-COMPLETE
+ :40
+END:VTODO
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID
+ :-//ACME/DesktopCalendar//EN
+METHOD
+ :REQUEST
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VTODO
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ :Mailto:A@example.com
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:B@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+ATTENDEE
+ ;RSVP=TRUE
+ :Mailto:D@example.com
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=PARAMETER_PARSE_ERROR
+ :Can't parse parameter name: 'TYPE=INDIVIDUAL'
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
+ :Can't parse as RECUR value in RRULE property. Removing entire property:
+ 'FREQ=MONTHLY\;COUNT=10\;BYDAY=1FR'
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
+ :Can't parse as DATE-TIME value in DTSTART property. Removing entire
+ property: '19980101T100000-0700'
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
+ :Can't parse as DATE-TIME value in DUE property. Removing entire property:
+ '19980103T100000-0700'
+SUMMARY
+ :Send Status Reports to Area Managers
+UID
+ :calsrv.example.com-873970198738777-00@example.com
+SEQUENCE
+ :0
+DTSTAMP
+ :19970717T200000Z
+STATUS
+ :NEEDS ACTION
+PRIORITY
+ :1
+END:VTODO
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID
+ :-//ACME/DesktopCalendar//EN
+METHOD
+ :REPLY
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VTODO
+ATTENDEE
+ ;PARTSTAT=IN-PROCESS
+ :Mailto:B@example.com
+PERCENT-COMPLETE
+ :75
+UID
+ :calsrv.example.com-873970198738777-00@example.com
+DTSTAMP
+ :19970717T233000Z
+RECURRENCE-ID
+ :19980101T170000Z
+SEQUENCE
+ :1
+END:VTODO
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD
+ :PUBLISH
+PRODID
+ :-//ACME/DesktopCalendar//EN
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VJOURNAL
+DTSTART
+ :19971002T200000Z
+ORGANIZER
+ :MAILTO:A@Example.com
+SUMMARY
+ :Phone conference minutes
+DESCRIPTION
+ :The editors meeting was held on October 1
+DESCRIPTION
+ : 1997. Details are in the attached document.
+UID
+ :0981234-1234234-2410@example.com
+RELATED-TO
+ :0981234-1234234-2402-35@example.com
+ATTACH
+ :ftp://ftp.example.com/pub/ed/minutes100197.txt
+END:VJOURNAL
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID
+ :-//RDU Software//NONSGML HandCal//EN
+METHOD
+ :REFRESH
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ :Mailto:B@example.com
+ATTENDEE
+ :Mailto:C@example.com
+ATTENDEE
+ :Mailto:D@example.com
+UID
+ : guid-1-12345@host1.com
+DTSTAMP
+ :19970603T094000
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD
+ :REQUEST
+PRODID
+ :-//RDU Software//NONSGML HandCal//EN
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+UID
+ :acme-12345@host1.com
+SEQUENCE
+ :3
+X-LIC-ERROR
+ ;X-LIC-ERRORTYPE=VALUE_PARSE_ERROR
+ :Can't parse as RECUR value in RRULE property. Removing entire property:
+ 'FREQ=WEEKLY'
+RDATE
+ ;VALUE=PERIOD
+ :19970819T210000Z/19970081T220000Z
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ ;ROLE=CHAIR
+ ;PARTSTAT=ACCEPTED
+ :Mailto:A@example.com
+ATTENDEE
+ :Mailto:B@example.com
+DESCRIPTION
+ :IETF-C&S Conference Call
+SUMMARY
+ :IETF Calendaring Working Group Meeting
+DTSTART
+ :19970801T210000Z
+DTEND
+ :19970801T220000Z
+RECURRENCE-ID
+ :19970809T210000Z
+DTSTAMP
+ :19970726T083000
+STATUS
+ :CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID
+ :-//RDU Software//NONSGML HandCal//EN
+METHOD
+ :REFRESH
+VERSION
+ :2.0
+X-LIC-SENDER
+ :eric@busboom.org
+BEGIN:VEVENT
+ORGANIZER
+ :Mailto:A@example.com
+ATTENDEE
+ :Mailto:B@example.com
+UID
+ :acme-12345@host1.com
+DTSTAMP
+ :19970603T094000
+END:VEVENT
+END:VCALENDAR
+END:VCALENDAR
diff --git a/libical/src/test/copycluster.c b/libical/src/test/copycluster.c
new file mode 100644
index 0000000000..b059130c13
--- /dev/null
+++ b/libical/src/test/copycluster.c
@@ -0,0 +1,113 @@
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: copycluster.c
+ CREATOR: eric 15 January 2000
+
+ $Id$
+ $Locker$
+
+ (C) COPYRIGHT 2000 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The Original Code is eric. The Initial Developer of the Original
+ Code is Eric Busboom
+
+
+ ======================================================================*/
+
+#include <stdio.h> /* for printf */
+#include "ical.h"
+#include "icalcluster.h"
+#include <errno.h>
+#include <string.h> /* For strerror */
+#include "icalrestriction.h"
+
+/* This program copies a file that holds iCal components to an other file. */
+
+
+void usage(char* arg0) {
+ printf("usage: %s cluster-file1 cluster-file2\n",arg0);
+}
+
+int main(int c, char *argv[]){
+
+ icalcluster *clusterin, *clusterout;
+ icalcomponent *itr;
+ int count=0;
+ int tostdout = 0;
+
+ if(c < 2 || c > 3){
+ usage(argv[0]);
+ exit(1);
+ }
+
+ if (c == 2){
+ tostdout = 1;
+ }
+
+ clusterin = icalcluster_new(argv[1]);
+
+ if (clusterin == 0){
+ printf("Could not open input cluster \"%s\"",argv[1]);
+
+ exit(1);
+ }
+
+ if (!tostdout){
+ clusterout = icalcluster_new(argv[2]);
+ if (clusterout == 0){
+ printf("Could not open output cluster \"%s\"\n",argv[2]);
+ exit(1);
+ }
+ }
+
+
+ for (itr = icalcluster_get_first_component(clusterin,
+ ICAL_ANY_COMPONENT);
+ itr != 0;
+ itr = icalcluster_get_next_component(clusterin,
+ ICAL_ANY_COMPONENT)){
+
+ icalrestriction_check(itr);
+
+ if (itr != 0){
+
+ if(tostdout){
+
+ printf("--------------\n%s\n",icalcomponent_as_ical_string(itr));
+ } else {
+
+ icalcluster_add_component(clusterout,
+ icalcomponent_new_clone(itr));
+ }
+
+ count++;
+
+ } else {
+ printf("Got NULL component");
+ }
+ }
+
+
+ printf("Transfered %d components\n",count);
+
+ icalcluster_free(clusterin);
+
+ if (!tostdout){
+ icalcluster_mark(clusterout);
+ icalcluster_free(clusterout);
+ }
+
+ return 0;
+}
+
diff --git a/libical/src/test/findobj.c b/libical/src/test/findobj.c
new file mode 100644
index 0000000000..e7ec59169a
--- /dev/null
+++ b/libical/src/test/findobj.c
@@ -0,0 +1,71 @@
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: findobj.c
+ CREATOR: eric 11 February 2000
+
+ $Id$
+ $Locker$
+
+ (C) COPYRIGHT 2000 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The Original Code is eric. The Initial Developer of the Original
+ Code is Eric Busboom
+
+
+ ======================================================================*/
+
+#include <stdio.h> /* for printf */
+#include "ical.h"
+#include "icalcalendar.h"
+#include <errno.h>
+#include <string.h> /* For strerror */
+#include "icalrestriction.h"
+
+/* This program finds an object stored in a calendar */
+
+void usage(char* arg0) {
+ printf("usage: %s calendar-dir uid\n",arg0);
+}
+
+int main(int c, char *argv[]){
+
+ icalcalendar *cal;
+ icalstore *booked;
+ icalcomponent *itr;
+
+ if(c < 2 || c > 3){
+ usage(argv[0]);
+ exit(1);
+ }
+
+ cal = icalcalendar_new(argv[1]);
+
+ if(cal == 0){
+ fprintf(stderr,"%s: error in opening calendar \"%s\": %s. errno is \"%s\"\n",
+ argv[0],argv[1],icalerror_strerror(icalerrno),
+ strerror(errno));
+ }
+
+ booked = icalcalendar_get_booked(cal);
+
+ itr = icalstore_fetch(booked,argv[2]);
+
+
+ if(itr != 0){
+ printf("%s",icalcomponent_as_ical_string(itr));
+ }
+
+ return 0;
+}
+
diff --git a/libical/src/test/icaltestparser.c b/libical/src/test/icaltestparser.c
new file mode 100644
index 0000000000..3f07fcd044
--- /dev/null
+++ b/libical/src/test/icaltestparser.c
@@ -0,0 +1,123 @@
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: icaltestparser.c
+ CREATOR: eric 20 June 1999
+
+ $Id$
+ $Locker$
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The original author is Eric Busboom
+ The original code is icaltestparser.c
+
+
+ (C) COPYRIGHT 1999 The Software Studio.
+ http://www.softwarestudio.org
+
+ ======================================================================*/
+
+#include <stdio.h>
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#include "ical.h"
+
+#include <stdlib.h>
+
+char str[] = "BEGIN:VCALENDAR\
+PRODID:\"-//RDU Software//NONSGML HandCal//EN\"\
+VERSION:2.0\
+BEGIN:VTIMEZONE\
+TZID:US-Eastern\
+BEGIN:STANDARD\
+DTSTART:19990404T020000\
+RDATE:19990u404xT020000\
+TZOFFSETFROM:-0500\
+TZOFFSETTO:-0400\
+END:STANDARD\
+BEGIN:DAYLIGHT\
+DTSTART:19990404T020000\
+RDATE:19990404T020000\
+TZOFFSETFROM:-0500\
+TZOFFSETTO:-0400\
+TZNAME:EDT\
+Dkjhgri:derhvnv;\
+BEGIN:dfkjh\
+END:dfdfkjh\
+END:DAYLIGHT\
+END:VTIMEZONE\
+BEGIN:VEVENT\
+GEO:Bongo\
+DTSTAMP:19980309T231000Z\
+UID:guid-1.host1.com\
+ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com\
+ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP\
+ :MAILTO:employee-A@host.com\
+DESCRIPTION:Project XYZ Review Meeting\
+CATEGORIES:MEETING\
+CLASS:PUBLIC\
+CREATED:19980309T130000Z\
+SUMMARY:XYZ Project Review\
+DTSTART;TZID=US-Eastern:19980312T083000\
+DTEND;TZID=US-Eastern:19980312T093000\
+LOCATION:1CP Conference Room 4350\
+END:VEVENT\
+END:VCALENDAR\
+";
+
+extern int yydebug;
+
+/* Have the parser fetch data from stdin */
+
+char* read_stream(char *s, size_t size, void *d)
+{
+ char *c = fgets(s,size, (FILE*)d);
+
+ return c;
+
+}
+
+
+
+int main(int argc, char* argv[])
+{
+
+ int lineno = 0;
+ char* line;
+ FILE* stream;
+ icalcomponent *c;
+ icalparser *parser = icalparser_new();
+
+ stream = fopen(argv[1],"r");
+
+ assert(stream != 0);
+
+ icalparser_set_gen_data(parser,stream);
+
+ do{
+
+ line = icalparser_get_line(parser,read_stream);
+
+ c = icalparser_add_line(parser,line);
+
+ if (c != 0){
+ icalcomponent_convert_errors(c);
+ printf("%s",icalcomponent_as_ical_string(c));
+ icalparser_claim(parser);
+ printf("\n---------------\n");
+ icalcomponent_free(c);
+ }
+
+ } while ( line != 0);
+
+
+}
diff --git a/libical/src/test/regression.c b/libical/src/test/regression.c
new file mode 100644
index 0000000000..7b1606d432
--- /dev/null
+++ b/libical/src/test/regression.c
@@ -0,0 +1,1334 @@
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: usecases.c
+ CREATOR: eric 03 April 1999
+
+ DESCRIPTION:
+
+ $Id$
+ $Locker$
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The original author is Eric Busboom
+ The original code is usecases.c
+
+
+ ======================================================================*/
+
+#include "ical.h"
+#include <assert.h>
+#include <string.h> /* for strdup */
+#include <stdlib.h> /* for malloc */
+#include <stdio.h> /* for printf */
+#include <time.h> /* for time() */
+#include "icalmemory.h"
+#include "icalstore.h"
+#include "icalcluster.h"
+#include "icalerror.h"
+#include "icalrestriction.h"
+#include "icalcalendar.h"
+
+/* This example creates and minipulates the ical object that appears
+ * in rfc 2445, page 137 */
+
+char str[] = "BEGIN:VCALENDAR\
+PRODID:\"-//RDU Software//NONSGML HandCal//EN\"\
+VERSION:2.0\
+BEGIN:VTIMEZONE\
+TZID:US-Eastern\
+BEGIN:STANDARD\
+DTSTART:19981025T020000\
+RDATE:19981025T020000\
+TZOFFSETFROM:-0400\
+TZOFFSETTO:-0500\
+TZNAME:EST\
+END:STANDARD\
+BEGIN:DAYLIGHT\
+DTSTART:19990404T020000\
+RDATE:19990404T020000\
+TZOFFSETFROM:-0500\
+TZOFFSETTO:-0400\
+TZNAME:EDT\
+END:DAYLIGHT\
+END:VTIMEZONE\
+BEGIN:VEVENT\
+DTSTAMP:19980309T231000Z\
+UID:guid-1.host1.com\
+ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com\
+ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:MAILTO:employee-A@host.com\
+DESCRIPTION:Project XYZ Review Meeting\
+CATEGORIES:MEETING\
+CLASS:PUBLIC\
+CREATED:19980309T130000Z\
+SUMMARY:XYZ Project Review\
+DTSTART;TZID=US-Eastern:19980312T083000\
+DTEND;TZID=US-Eastern:19980312T093000\
+LOCATION:1CP Conference Room 4350\
+END:VEVENT\
+BEGIN:BOOGA\
+DTSTAMP:19980309T231000Z\
+X-LIC-FOO:Booga\
+DTSTOMP:19980309T231000Z\
+UID:guid-1.host1.com\
+END:BOOGA\
+END:VCALENDAR";
+
+
+icalcomponent* create_simple_component()
+{
+
+ icalcomponent* calendar;
+ struct icalperiodtype rtime;
+
+ rtime.start = icaltimetype_from_timet( time(0),0);
+ rtime.end = icaltimetype_from_timet( time(0),0);
+
+ rtime.end.hour++;
+
+
+
+ /* Create calendar and add properties */
+ calendar = icalcomponent_new(ICAL_VCALENDAR_COMPONENT);
+
+
+ icalcomponent_add_property(
+ calendar,
+ icalproperty_new_version("2.0")
+ );
+
+ printf("%s\n",icalcomponent_as_ical_string(calendar));
+
+ return calendar;
+
+}
+
+/* Create a new component */
+icalcomponent* create_new_component()
+{
+
+ icalcomponent* calendar;
+ icalcomponent* timezone;
+ icalcomponent* tzc;
+ icalcomponent* event;
+ struct icaltimetype atime = icaltimetype_from_timet( time(0),0);
+ struct icalperiodtype rtime;
+ icalproperty* property;
+
+ rtime.start = icaltimetype_from_timet( time(0),0);
+ rtime.end = icaltimetype_from_timet( time(0),0);
+
+ rtime.end.hour++;
+
+
+
+ /* Create calendar and add properties */
+ calendar = icalcomponent_new(ICAL_VCALENDAR_COMPONENT);
+
+
+ icalcomponent_add_property(
+ calendar,
+ icalproperty_new_version("2.0")
+ );
+
+ icalcomponent_add_property(
+ calendar,
+ icalproperty_new_prodid("-//RDU Software//NONSGML HandCal//EN")
+ );
+
+ /* Create a timezone object and add it to the calendar */
+
+ timezone = icalcomponent_new(ICAL_VTIMEZONE_COMPONENT);
+
+ icalcomponent_add_property(
+ timezone,
+ icalproperty_new_tzid("US_Eastern")
+ );
+
+ /* Add a sub-component of the timezone */
+ tzc = icalcomponent_new(ICAL_XDAYLIGHT_COMPONENT);
+
+ icalcomponent_add_property(
+ tzc,
+ icalproperty_new_dtstart(atime)
+ );
+
+ icalcomponent_add_property(
+ tzc,
+ icalproperty_new_rdate(rtime)
+ );
+
+ icalcomponent_add_property(
+ tzc,
+ icalproperty_new_tzoffsetfrom(-4.0)
+ );
+
+ icalcomponent_add_property(
+ tzc,
+ icalproperty_new_tzoffsetto(-5.0)
+ );
+
+ icalcomponent_add_property(
+ tzc,
+ icalproperty_new_tzname("EST")
+ );
+
+ icalcomponent_add_component(timezone,tzc);
+
+ icalcomponent_add_component(calendar,timezone);
+
+ /* Add a second subcomponent */
+ tzc = icalcomponent_new(ICAL_XSTANDARD_COMPONENT);
+
+ icalcomponent_add_property(
+ tzc,
+ icalproperty_new_dtstart(atime)
+ );
+
+ icalcomponent_add_property(
+ tzc,
+ icalproperty_new_rdate(rtime)
+ );
+
+ icalcomponent_add_property(
+ tzc,
+ icalproperty_new_tzoffsetfrom(-4.0)
+ );
+
+ icalcomponent_add_property(
+ tzc,
+ icalproperty_new_tzoffsetto(-5.0)
+ );
+
+ icalcomponent_add_property(
+ tzc,
+ icalproperty_new_tzname("EST")
+ );
+
+ icalcomponent_add_component(timezone,tzc);
+
+ /* Add an event */
+
+ event = icalcomponent_new(ICAL_VEVENT_COMPONENT);
+
+ icalcomponent_add_property(
+ event,
+ icalproperty_new_dtstamp(atime)
+ );
+
+ icalcomponent_add_property(
+ event,
+ icalproperty_new_uid("guid-1.host1.com")
+ );
+
+ /* add a property that has parameters */
+ property = icalproperty_new_organizer("mrbig@host.com");
+
+ icalproperty_add_parameter(
+ property,
+ icalparameter_new_role(ICAL_ROLE_CHAIR)
+ );
+
+ icalcomponent_add_property(event,property);
+
+ /* add another property that has parameters */
+ property = icalproperty_new_attendee("employee-A@host.com");
+
+ icalproperty_add_parameter(
+ property,
+ icalparameter_new_role(ICAL_ROLE_REQPARTICIPANT)
+ );
+
+ icalproperty_add_parameter(
+ property,
+ icalparameter_new_rsvp(1)
+ );
+
+ icalproperty_add_parameter(
+ property,
+ icalparameter_new_cutype(ICAL_CUTYPE_GROUP)
+ );
+
+ icalcomponent_add_property(event,property);
+
+
+ /* more properties */
+
+ icalcomponent_add_property(
+ event,
+ icalproperty_new_description("Project XYZ Review Meeting")
+ );
+
+ icalcomponent_add_property(
+ event,
+ icalproperty_new_categories("MEETING")
+ );
+
+ icalcomponent_add_property(
+ event,
+ icalproperty_new_class("PUBLIC")
+ );
+
+ icalcomponent_add_property(
+ event,
+ icalproperty_new_created(atime)
+ );
+
+ icalcomponent_add_property(
+ event,
+ icalproperty_new_summary("XYZ Project Review")
+ );
+
+
+ property = icalproperty_new_dtstart(atime);
+
+ icalproperty_add_parameter(
+ property,
+ icalparameter_new_tzid("US-Eastern")
+ );
+
+ icalcomponent_add_property(event,property);
+
+
+ property = icalproperty_new_dtend(atime);
+
+ icalproperty_add_parameter(
+ property,
+ icalparameter_new_tzid("US-Eastern")
+ );
+
+ icalcomponent_add_property(event,property);
+
+ icalcomponent_add_property(
+ event,
+ icalproperty_new_location("1CP Conference Room 4350")
+ );
+
+ icalcomponent_add_component(calendar,event);
+
+ printf("%s\n",icalcomponent_as_ical_string(calendar));
+
+ icalcomponent_free(calendar);
+
+ return 0;
+}
+
+
+/* Create a new component, using the va_args list */
+
+icalcomponent* create_new_component_with_va_args()
+{
+
+ icalcomponent* calendar;
+ struct icaltimetype atime = icaltimetype_from_timet( time(0),0);
+ struct icalperiodtype rtime;
+
+ rtime.start = icaltimetype_from_timet( time(0),0);
+ rtime.end = icaltimetype_from_timet( time(0),0);
+
+ rtime.end.hour++;
+
+ calendar =
+ icalcomponent_vanew(
+ ICAL_VCALENDAR_COMPONENT,
+ icalproperty_new_version("2.0"),
+ icalproperty_new_prodid("-//RDU Software//NONSGML HandCal//EN"),
+ icalcomponent_vanew(
+ ICAL_VTIMEZONE_COMPONENT,
+ icalproperty_new_tzid("US_Eastern"),
+ icalcomponent_vanew(
+ ICAL_XDAYLIGHT_COMPONENT,
+ icalproperty_new_dtstart(atime),
+ icalproperty_new_rdate(rtime),
+ icalproperty_new_tzoffsetfrom(-4.0),
+ icalproperty_new_tzoffsetto(-5.0),
+ icalproperty_new_tzname("EST"),
+ 0
+ ),
+ icalcomponent_vanew(
+ ICAL_XSTANDARD_COMPONENT,
+ icalproperty_new_dtstart(atime),
+ icalproperty_new_rdate(rtime),
+ icalproperty_new_tzoffsetfrom(-5.0),
+ icalproperty_new_tzoffsetto(-4.0),
+ icalproperty_new_tzname("EST"),
+ 0
+ ),
+ 0
+ ),
+ icalcomponent_vanew(
+ ICAL_VEVENT_COMPONENT,
+ icalproperty_new_dtstamp(atime),
+ icalproperty_new_uid("guid-1.host1.com"),
+ icalproperty_vanew_organizer(
+ "mrbig@host.com",
+ icalparameter_new_role(ICAL_ROLE_CHAIR),
+ 0
+ ),
+ icalproperty_vanew_attendee(
+ "employee-A@host.com",
+ icalparameter_new_role(ICAL_ROLE_REQPARTICIPANT),
+ icalparameter_new_rsvp(1),
+ icalparameter_new_cutype(ICAL_CUTYPE_GROUP),
+ 0
+ ),
+ icalproperty_new_description("Project XYZ Review Meeting"),
+ icalproperty_new_categories("MEETING"),
+ icalproperty_new_class("PUBLIC"),
+ icalproperty_new_created(atime),
+ icalproperty_new_summary("XYZ Project Review"),
+ icalproperty_vanew_dtstart(
+ atime,
+ icalparameter_new_tzid("US-Eastern"),
+ 0
+ ),
+ icalproperty_vanew_dtend(
+ atime,
+ icalparameter_new_tzid("US-Eastern"),
+ 0
+ ),
+ icalproperty_new_location("1CP Conference Room 4350"),
+ 0
+ ),
+ 0
+ );
+
+ printf("%s\n",icalcomponent_as_ical_string(calendar));
+
+
+ icalcomponent_free(calendar);
+
+ return 0;
+}
+
+
+/* Return a list of all attendees who are required. */
+
+char** get_required_attendees(icalproperty* event)
+{
+ icalproperty* p;
+ icalparameter* parameter;
+
+ char **attendees;
+ int max = 10;
+ int c = 0;
+
+ attendees = malloc(max * (sizeof (char *)));
+
+ assert(event != 0);
+ assert(icalcomponent_isa(event) == ICAL_VEVENT_COMPONENT);
+
+ for(
+ p = icalcomponent_get_first_property(event,ICAL_ATTENDEE_PROPERTY);
+ p != 0;
+ p = icalcomponent_get_next_property(event,ICAL_ATTENDEE_PROPERTY)
+ ) {
+
+ parameter = icalproperty_get_first_parameter(p,ICAL_ROLE_PARAMETER);
+
+ if ( icalparameter_get_role(parameter) == ICAL_ROLE_REQPARTICIPANT)
+ {
+ attendees[c++] = strdup(icalproperty_get_attendee(p));
+
+ if (c >= max) {
+ max *= 2;
+ attendees = realloc(attendees, max * (sizeof (char *)));
+ }
+
+ }
+ }
+
+ return attendees;
+}
+
+/* If an attendee has a PARTSTAT of NEEDSACTION or has no PARTSTAT
+ parameter, change it to TENTATIVE. */
+
+void update_attendees(icalproperty* event)
+{
+ icalproperty* p;
+ icalparameter* parameter;
+
+
+ assert(event != 0);
+ assert(icalcomponent_isa(event) == ICAL_VEVENT_COMPONENT);
+
+ for(
+ p = icalcomponent_get_first_property(event,ICAL_ATTENDEE_PROPERTY);
+ p != 0;
+ p = icalcomponent_get_next_property(event,ICAL_ATTENDEE_PROPERTY)
+ ) {
+
+ parameter = icalproperty_get_first_parameter(p,ICAL_PARTSTAT_PARAMETER);
+
+ if (parameter == 0) {
+
+ icalproperty_add_parameter(
+ p,
+ icalparameter_new_partstat(ICAL_PARTSTAT_TENTATIVE)
+ );
+
+ } else if (icalparameter_get_partstat(parameter) == ICAL_PARTSTAT_NEEDSACTION) {
+
+ icalproperty_remove_parameter(p,ICAL_PARTSTAT_PARAMETER);
+
+ icalparameter_free(parameter);
+
+ icalproperty_add_parameter(
+ p,
+ icalparameter_new_partstat(ICAL_PARTSTAT_TENTATIVE)
+ );
+ }
+
+ }
+}
+
+
+void test_values()
+{
+ icalvalue *v;
+ icalvalue *copy;
+
+ v = icalvalue_new_caladdress("cap://value/1");
+ printf("caladdress 1: %s\n",icalvalue_get_caladdress(v));
+ icalvalue_set_caladdress(v,"cap://value/2");
+ printf("caladdress 2: %s\n",icalvalue_get_caladdress(v));
+ printf("String: %s\n",icalvalue_as_ical_string(v));
+
+ copy = icalvalue_new_clone(v);
+ printf("Clone: %s\n",icalvalue_as_ical_string(v));
+ icalvalue_free(v);
+ icalvalue_free(copy);
+
+
+ v = icalvalue_new_boolean(1);
+ printf("caladdress 1: %d\n",icalvalue_get_boolean(v));
+ icalvalue_set_boolean(v,2);
+ printf("caladdress 2: %d\n",icalvalue_get_boolean(v));
+ printf("String: %s\n",icalvalue_as_ical_string(v));
+
+ copy = icalvalue_new_clone(v);
+ printf("Clone: %s\n",icalvalue_as_ical_string(v));
+ icalvalue_free(v);
+ icalvalue_free(copy);
+
+
+ v = icalvalue_new_date(icaltimetype_from_timet( time(0),0));
+ printf("date 1: %s\n",icalvalue_as_ical_string(v));
+ icalvalue_set_date(v,icaltimetype_from_timet( time(0)+3600,0));
+ printf("date 2: %s\n",icalvalue_as_ical_string(v));
+
+ copy = icalvalue_new_clone(v);
+ printf("Clone: %s\n",icalvalue_as_ical_string(v));
+ icalvalue_free(v);
+ icalvalue_free(copy);
+
+
+ v = icalvalue_new(-1);
+
+ printf("Invalid type: %p\n",v);
+
+ if (v!=0) icalvalue_free(v);
+
+
+ /* v = icalvalue_new_caladdress(0);
+
+ printf("Bad string: %p\n",v);
+
+ if (v!=0) icalvalue_free(v); */
+
+}
+
+void test_properties()
+{
+ icalproperty *prop;
+ icalparameter *param;
+
+ icalproperty *clone;
+
+ prop = icalproperty_vanew_comment(
+ "Another Comment",
+ icalparameter_new_cn("A Common Name 1"),
+ icalparameter_new_cn("A Common Name 2"),
+ icalparameter_new_cn("A Common Name 3"),
+ icalparameter_new_cn("A Common Name 4"),
+ 0);
+
+ for(param = icalproperty_get_first_parameter(prop,ICAL_ANY_PARAMETER);
+ param != 0;
+ param = icalproperty_get_next_parameter(prop,ICAL_ANY_PARAMETER)) {
+
+ printf("Prop parameter: %s\n",icalparameter_get_cn(param));
+ }
+
+ printf("Prop value: %s\n",icalproperty_get_comment(prop));
+
+
+ printf("As iCAL string:\n %s\n",icalproperty_as_ical_string(prop));
+
+ clone = icalproperty_new_clone(prop);
+
+ printf("Clone:\n %s\n",icalproperty_as_ical_string(prop));
+
+ icalproperty_free(clone);
+ icalproperty_free(prop);
+
+ prop = icalproperty_new(-1);
+
+ printf("Invalid type: %p\n",prop);
+
+ if (prop!=0) icalproperty_free(prop);
+
+ /*
+ prop = icalproperty_new_method(0);
+
+ printf("Bad string: %p\n",prop);
+
+
+ if (prop!=0) icalproperty_free(prop);
+ */
+}
+
+void test_parameters()
+{
+ icalparameter *p;
+
+ p = icalparameter_new_cn("A Common Name");
+
+ printf("Common Name: %s\n",icalparameter_get_cn(p));
+
+ printf("As String: %s\n",icalparameter_as_ical_string(p));
+
+ icalparameter_free(p);
+}
+
+
+void test_components()
+{
+
+ icalcomponent* c;
+ icalcomponent* child;
+
+ c = icalcomponent_vanew(
+ ICAL_VCALENDAR_COMPONENT,
+ icalproperty_new_version("2.0"),
+ icalproperty_new_prodid("-//RDU Software//NONSGML HandCal//EN"),
+ icalproperty_vanew_comment(
+ "A Comment",
+ icalparameter_new_cn("A Common Name 1"),
+ 0),
+ icalcomponent_vanew(
+ ICAL_VEVENT_COMPONENT,
+ icalproperty_new_version("2.0"),
+ icalproperty_new_description("This is an event"),
+ icalproperty_vanew_comment(
+ "Another Comment",
+ icalparameter_new_cn("A Common Name 1"),
+ icalparameter_new_cn("A Common Name 2"),
+ icalparameter_new_cn("A Common Name 3"),
+ icalparameter_new_cn("A Common Name 4"),
+ 0),
+ icalproperty_vanew_xlicerror(
+ "This is only a test",
+ icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_COMPONENTPARSEERROR),
+ 0),
+
+ 0
+ ),
+ 0
+ );
+
+ printf("Original Component:\n%s\n\n",icalcomponent_as_ical_string(c));
+
+ child = icalcomponent_get_first_component(c,ICAL_VEVENT_COMPONENT);
+
+ printf("Child Component:\n%s\n\n",icalcomponent_as_ical_string(child));
+
+ icalcomponent_free(c);
+
+}
+
+void test_memory()
+{
+ size_t bufsize = 256;
+ char *p;
+
+ char S1[] = "1) When in the Course of human events, ";
+ char S2[] = "2) it becomes necessary for one people to dissolve the political bands which have connected them with another, ";
+ char S3[] = "3) and to assume among the powers of the earth, ";
+ char S4[] = "4) the separate and equal station to which the Laws of Nature and of Nature's God entitle them, ";
+ char S5[] = "5) a decent respect to the opinions of mankind requires that they ";
+ char S6[] = "6) should declare the causes which impel them to the separation. ";
+ char S7[] = "7) We hold these truths to be self-evident, ";
+ char S8[] = "8) that all men are created equal, ";
+
+/* char S9[] = "9) that they are endowed by their Creator with certain unalienable Rights, ";
+ char S10[] = "10) that among these are Life, Liberty, and the pursuit of Happiness. ";
+ char S11[] = "11) That to secure these rights, Governments are instituted among Men, ";
+ char S12[] = "12) deriving their just powers from the consent of the governed. ";
+*/
+
+
+ char *f, *b1, *b2, *b3, *b4, *b5, *b6, *b7, *b8;
+
+ #define BUFSIZE 1024
+
+
+ f = icalmemory_new_buffer(bufsize);
+ p = f;
+ b1 = icalmemory_tmp_buffer(BUFSIZE);
+ strcpy(b1, S1);
+ icalmemory_append_string(&f, &p, &bufsize, b1);
+
+ b2 = icalmemory_tmp_buffer(BUFSIZE);
+ strcpy(b2, S2);
+ icalmemory_append_string(&f, &p, &bufsize, b2);
+
+ b3 = icalmemory_tmp_buffer(BUFSIZE);
+ strcpy(b3, S3);
+ icalmemory_append_string(&f, &p, &bufsize, b3);
+
+ b4 = icalmemory_tmp_buffer(BUFSIZE);
+ strcpy(b4, S4);
+ icalmemory_append_string(&f, &p, &bufsize, b4);
+
+ b5 = icalmemory_tmp_buffer(BUFSIZE);
+ strcpy(b5, S5);
+ icalmemory_append_string(&f, &p, &bufsize, b5);
+
+ b6 = icalmemory_tmp_buffer(BUFSIZE);
+ strcpy(b6, S6);
+ icalmemory_append_string(&f, &p, &bufsize, b6);
+
+ b7 = icalmemory_tmp_buffer(BUFSIZE);
+ strcpy(b7, S7);
+ icalmemory_append_string(&f, &p, &bufsize, b7);
+
+ b8 = icalmemory_tmp_buffer(BUFSIZE);
+ strcpy(b8, S8);
+ icalmemory_append_string(&f, &p, &bufsize, b8);
+
+
+ printf("1: %p %s \n",b1,b1);
+ printf("2: %p %s\n",b2,b2);
+ printf("3: %p %s\n",b3,b3);
+ printf("4: %p %s\n",b4,b4);
+ printf("5: %p %s\n",b5,b5);
+ printf("6: %p %s\n",b6,b6);
+ printf("7: %p %s\n",b7,b7);
+ printf("8: %p %s\n",b8,b8);
+
+
+ printf("Final: %s\n", f);
+
+ printf("Final buffer size: %d\n",bufsize);
+
+ free(f);
+
+ bufsize = 4;
+ f = icalmemory_new_buffer(bufsize);
+ p = f;
+
+ icalmemory_append_char(&f, &p, &bufsize, 'a');
+ icalmemory_append_char(&f, &p, &bufsize, 'b');
+ icalmemory_append_char(&f, &p, &bufsize, 'c');
+ icalmemory_append_char(&f, &p, &bufsize, 'd');
+ icalmemory_append_char(&f, &p, &bufsize, 'e');
+ icalmemory_append_char(&f, &p, &bufsize, 'f');
+ icalmemory_append_char(&f, &p, &bufsize, 'g');
+ icalmemory_append_char(&f, &p, &bufsize, 'h');
+ icalmemory_append_char(&f, &p, &bufsize, 'i');
+ icalmemory_append_char(&f, &p, &bufsize, 'j');
+ icalmemory_append_char(&f, &p, &bufsize, 'a');
+ icalmemory_append_char(&f, &p, &bufsize, 'b');
+ icalmemory_append_char(&f, &p, &bufsize, 'c');
+ icalmemory_append_char(&f, &p, &bufsize, 'd');
+ icalmemory_append_char(&f, &p, &bufsize, 'e');
+ icalmemory_append_char(&f, &p, &bufsize, 'f');
+ icalmemory_append_char(&f, &p, &bufsize, 'g');
+ icalmemory_append_char(&f, &p, &bufsize, 'h');
+ icalmemory_append_char(&f, &p, &bufsize, 'i');
+ icalmemory_append_char(&f, &p, &bufsize, 'j');
+
+ printf("Char-by-Char buffer: %s\n", f);
+
+}
+
+
+int test_store()
+{
+
+ icalcomponent *c, *gauge;
+ icalerrorenum error;
+ icalcomponent *next, *itr;
+ icalcluster* cluster;
+ struct icalperiodtype rtime;
+ icalstore *s = icalstore_new("store");
+ int i;
+
+ rtime.start = icaltimetype_from_timet( time(0),0);
+
+ cluster = icalcluster_new("clusterin.vcd");
+
+ if (cluster == 0){
+ printf("Failed to create cluster: %s\n",icalerror_strerror(icalerrno));
+ return 0;
+ }
+
+#define NUMCOMP 4
+
+ /* Duplicate every component in the cluster NUMCOMP times */
+
+ icalerror_clear_errno();
+
+ for (i = 1; i<NUMCOMP+1; i++){
+
+ /*rtime.start.month = i%12;*/
+ rtime.start.month = i;
+ rtime.end = rtime.start;
+ rtime.end.hour++;
+
+ for (itr = icalcluster_get_first_component(cluster,
+ ICAL_ANY_COMPONENT);
+ itr != 0;
+ itr = icalcluster_get_next_component(cluster,
+ ICAL_ANY_COMPONENT)){
+ icalcomponent *clone;
+ icalproperty *p;
+
+
+ if(icalcomponent_isa(itr) != ICAL_VEVENT_COMPONENT){
+ continue;
+ }
+
+ assert(itr != 0);
+
+ /* Change the dtstart and dtend times in the component
+ pointed to by Itr*/
+
+ clone = icalcomponent_new_clone(itr);
+ assert(icalerrno == ICAL_NO_ERROR);
+ assert(clone !=0);
+
+ /* DTSTART*/
+ p = icalcomponent_get_first_property(clone,ICAL_DTSTART_PROPERTY);
+ assert(icalerrno == ICAL_NO_ERROR);
+
+ if (p == 0){
+ p = icalproperty_new_dtstart(rtime.start);
+ icalcomponent_add_property(clone,p);
+ } else {
+ icalproperty_set_dtstart(p,rtime.start);
+ }
+ assert(icalerrno == ICAL_NO_ERROR);
+
+ /* DTEND*/
+ p = icalcomponent_get_first_property(clone,ICAL_DTEND_PROPERTY);
+ assert(icalerrno == ICAL_NO_ERROR);
+
+ if (p == 0){
+ p = icalproperty_new_dtstart(rtime.end);
+ icalcomponent_add_property(clone,p);
+ } else {
+ icalproperty_set_dtstart(p,rtime.end);
+ }
+ assert(icalerrno == ICAL_NO_ERROR);
+
+ printf("\n----------\n%s\n---------\n",icalcomponent_as_ical_string(clone));
+
+ error = icalstore_add_component(s,clone);
+
+ assert(icalerrno == ICAL_NO_ERROR);
+
+ }
+
+ }
+
+ gauge =
+ icalcomponent_vanew(
+ ICAL_VCALENDAR_COMPONENT,
+ icalcomponent_vanew(
+ ICAL_VEVENT_COMPONENT,
+ icalproperty_vanew_summary(
+ "Submit Income Taxes",
+ icalparameter_new_xliccomparetype(ICAL_XLICCOMPARETYPE_EQUAL),
+ 0),
+ 0),
+ icalcomponent_vanew(
+ ICAL_VEVENT_COMPONENT,
+ icalproperty_vanew_summary(
+ "Bastille Day Party",
+ icalparameter_new_xliccomparetype(ICAL_XLICCOMPARETYPE_EQUAL),
+ 0),
+ 0),
+ 0);
+
+#if 0
+
+
+ icalstore_select(s,gauge);
+
+ for(c = icalstore_first(s); c != 0; c = icalstore_next(s)){
+
+ printf("Got one! (%d)\n", count++);
+
+ if (c != 0){
+ printf("%s", icalcomponent_as_ical_string(c));;
+ if (icalstore_store(s2,c) == 0){
+ printf("Failed to write!\n");
+ }
+ icalcomponent_free(c);
+ } else {
+ printf("Failed to get component\n");
+ }
+ }
+
+
+ icalstore_free(s2);
+#endif
+
+
+ for(c = icalstore_get_first_component(s);
+ c != 0;
+ c = next){
+
+ next = icalstore_get_next_component(s);
+
+ if (c != 0){
+ /*icalstore_remove_component(s,c);*/
+ printf("%s", icalcomponent_as_ical_string(c));;
+ } else {
+ printf("Failed to get component\n");
+ }
+
+
+ }
+
+ icalstore_free(s);
+ return 0;
+}
+
+int test_compare()
+{
+ icalvalue *v1, *v2;
+ icalcomponent *c, *gauge;
+
+ v1 = icalvalue_new_caladdress("cap://value/1");
+ v2 = icalvalue_new_clone(v1);
+
+ printf("%d\n",icalvalue_compare(v1,v2));
+
+ v1 = icalvalue_new_caladdress("A");
+ v2 = icalvalue_new_caladdress("B");
+
+ printf("%d\n",icalvalue_compare(v1,v2));
+
+ v1 = icalvalue_new_caladdress("B");
+ v2 = icalvalue_new_caladdress("A");
+
+ printf("%d\n",icalvalue_compare(v1,v2));
+
+ v1 = icalvalue_new_integer(5);
+ v2 = icalvalue_new_integer(5);
+
+ printf("%d\n",icalvalue_compare(v1,v2));
+
+ v1 = icalvalue_new_integer(5);
+ v2 = icalvalue_new_integer(10);
+
+ printf("%d\n",icalvalue_compare(v1,v2));
+
+ v1 = icalvalue_new_integer(10);
+ v2 = icalvalue_new_integer(5);
+
+ printf("%d\n",icalvalue_compare(v1,v2));
+
+
+ gauge =
+ icalcomponent_vanew(
+ ICAL_VCALENDAR_COMPONENT,
+ icalcomponent_vanew(
+ ICAL_VEVENT_COMPONENT,
+ icalproperty_vanew_comment(
+ "Comment",
+ icalparameter_new_xliccomparetype(ICAL_XLICCOMPARETYPE_EQUAL),
+ 0),
+ 0),
+ 0);
+
+ c = icalcomponent_vanew(
+ ICAL_VEVENT_COMPONENT,
+ icalproperty_vanew_comment(
+ "Comment",
+ 0),
+ 0);
+
+ printf("%s",icalcomponent_as_ical_string(gauge));
+
+ printf("%d\n",icalstore_test(c,gauge));
+
+ return 0;
+}
+
+void test_restriction()
+{
+ icalcomponent *comp;
+ struct icaltimetype atime = icaltimetype_from_timet( time(0),0);
+ int valid;
+
+ struct icalperiodtype rtime;
+
+ rtime.start = icaltimetype_from_timet( time(0),0);
+ rtime.end = icaltimetype_from_timet( time(0),0);
+
+ rtime.end.hour++;
+
+
+ /* Property restrictions */
+ assert(icalrestriction_get_property_restriction(
+ ICAL_METHOD_PUBLISH,
+ ICAL_VEVENT_COMPONENT,
+ ICAL_SEQUENCE_PROPERTY) == 5); /* ZEROORONE -> 5 */
+
+ assert(icalrestriction_get_property_restriction(
+ ICAL_METHOD_PUBLISH,
+ ICAL_VEVENT_COMPONENT,
+ ICAL_ATTACH_PROPERTY)==3); /* ZEROPLUS -> 3 */
+
+ assert(icalrestriction_get_property_restriction(
+ ICAL_METHOD_DECLINECOUNTER,
+ ICAL_VEVENT_COMPONENT,
+ ICAL_SEQUENCE_PROPERTY)==1); /* ZERO -> 1 */
+
+ /* Component restrictions */
+ assert(icalrestriction_get_component_restriction(
+ ICAL_METHOD_PUBLISH,
+ ICAL_VJOURNAL_COMPONENT,
+ ICAL_X_COMPONENT) == 3); /* ZEROPLUS */
+
+ assert(icalrestriction_get_component_restriction(
+ ICAL_METHOD_CANCEL,
+ ICAL_VJOURNAL_COMPONENT,
+ ICAL_VEVENT_COMPONENT) == 1); /* ZERO */
+
+ comp =
+ icalcomponent_vanew(
+ ICAL_VCALENDAR_COMPONENT,
+ icalproperty_new_version("2.0"),
+ icalproperty_new_prodid("-//RDU Software//NONSGML HandCal//EN"),
+ icalproperty_new_method(ICAL_METHOD_REQUEST),
+ icalcomponent_vanew(
+ ICAL_VTIMEZONE_COMPONENT,
+ icalproperty_new_tzid("US_Eastern"),
+ icalcomponent_vanew(
+ ICAL_XDAYLIGHT_COMPONENT,
+ icalproperty_new_dtstart(atime),
+ icalproperty_new_rdate(rtime),
+ icalproperty_new_tzoffsetfrom(-4.0),
+ icalproperty_new_tzoffsetto(-5.0),
+ icalproperty_new_tzname("EST"),
+ 0
+ ),
+ icalcomponent_vanew(
+ ICAL_XSTANDARD_COMPONENT,
+ icalproperty_new_dtstart(atime),
+ icalproperty_new_rdate(rtime),
+ icalproperty_new_tzoffsetfrom(-5.0),
+ icalproperty_new_tzoffsetto(-4.0),
+ icalproperty_new_tzname("EST"),
+ 0
+ ),
+ 0
+ ),
+ icalcomponent_vanew(
+ ICAL_VEVENT_COMPONENT,
+ icalproperty_new_dtstamp(atime),
+ icalproperty_new_uid("guid-1.host1.com"),
+ icalproperty_vanew_organizer(
+ "mrbig@host.com",
+ icalparameter_new_role(ICAL_ROLE_CHAIR),
+ 0
+ ),
+ icalproperty_vanew_attendee(
+ "employee-A@host.com",
+ icalparameter_new_role(ICAL_ROLE_REQPARTICIPANT),
+ icalparameter_new_rsvp(1),
+ icalparameter_new_cutype(ICAL_CUTYPE_GROUP),
+ 0
+ ),
+ icalproperty_new_description("Project XYZ Review Meeting"),
+ icalproperty_new_categories("MEETING"),
+ icalproperty_new_class("PUBLIC"),
+ icalproperty_new_created(atime),
+ icalproperty_new_summary("XYZ Project Review"),
+/* icalproperty_vanew_dtstart(
+ atime,
+ icalparameter_new_tzid("US-Eastern"),
+ 0
+ ),*/
+ icalproperty_vanew_dtend(
+ atime,
+ icalparameter_new_tzid("US-Eastern"),
+ 0
+ ),
+ icalproperty_new_location("1CP Conference Room 4350"),
+ 0
+ ),
+ 0
+ );
+
+ valid = icalrestriction_check(comp);
+
+ printf("#### %d ####\n%s\n",valid, icalcomponent_as_ical_string(comp));
+
+}
+
+void test_calendar()
+{
+ icalcomponent *comp;
+ icalcluster *c;
+ icalstore *s;
+ icalcalendar* calendar = icalcalendar_new("calendar");
+ icalerrorenum error;
+ struct icaltimetype atime = icaltimetype_from_timet( time(0),0);
+
+ comp = icalcomponent_vanew(
+ ICAL_VEVENT_COMPONENT,
+ icalproperty_new_version("2.0"),
+ icalproperty_new_description("This is an event"),
+ icalproperty_new_dtstart(atime),
+ icalproperty_vanew_comment(
+ "Another Comment",
+ icalparameter_new_cn("A Common Name 1"),
+ icalparameter_new_cn("A Common Name 2"),
+ icalparameter_new_cn("A Common Name 3"),
+ icalparameter_new_cn("A Common Name 4"),
+ 0),
+ icalproperty_vanew_xlicerror(
+ "This is only a test",
+ icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_COMPONENTPARSEERROR),
+ 0),
+
+ 0);
+
+
+ s = icalcalendar_get_booked(calendar);
+
+ error = icalstore_add_component(s,comp);
+
+ assert(error == ICAL_NO_ERROR);
+
+ c = icalcalendar_get_properties(calendar);
+
+ error = icalcluster_add_component(c,icalcomponent_new_clone(comp));
+
+ assert(error == ICAL_NO_ERROR);
+
+ icalcalendar_free(calendar);
+
+}
+
+void test_recur()
+{
+ icalvalue *v;
+
+ v = icalvalue_new_from_string(ICAL_RECUR_VALUE,
+ "FREQ=DAILY;COUNT=5;BYDAY=MO,TU,WE,TH,FR");
+
+ printf("%s\n",icalvalue_as_ical_string(v));
+
+ v = icalvalue_new_from_string(ICAL_RECUR_VALUE,
+ "FREQ=YEARLY;UNTIL=123456T123456;BYSETPOS=-1,2");
+
+ printf("%s\n",icalvalue_as_ical_string(v));
+
+ v = icalvalue_new_from_string(ICAL_RECUR_VALUE,
+ "FREQ=YEARLY;UNTIL=123456T123456;INTERVAL=2;BYMONTH=1;BYDAY=SU;BYHOUR=8,9;BYMINUTE=30");
+
+ printf("%s\n",icalvalue_as_ical_string(v));
+
+ v = icalvalue_new_from_string(ICAL_RECUR_VALUE,
+ "FREQ=MONTHLY;BYDAY=-1MO,TU,WE,TH,FR");
+
+ printf("%s\n",icalvalue_as_ical_string(v));
+
+ v = icalvalue_new_from_string(ICAL_RECUR_VALUE,
+ "FREQ=WEEKLY;INTERVAL=20;WKST=SU;BYDAY=TU");
+
+ printf("%s\n",icalvalue_as_ical_string(v));
+
+}
+
+void test_duration()
+{
+
+ icalvalue *v;
+
+ v = icalvalue_new_from_string(ICAL_DURATION_VALUE,
+ "PT8H30M");
+
+ printf("%s\n",icalvalue_as_ical_string(v));
+
+ icalvalue_free(v);
+ v = icalvalue_new_from_string(ICAL_PERIOD_VALUE,
+ "19971015T050000Z/PT8H30M");
+
+ printf("%s\n",icalvalue_as_ical_string(v));
+
+ icalvalue_free(v);
+ v = icalvalue_new_from_string(ICAL_PERIOD_VALUE,
+ "19971015T050000Z/19971015T060000Z");
+
+ printf("%s\n",icalvalue_as_ical_string(v));
+ icalvalue_free(v);
+
+
+}
+
+
+void test_strings(){
+
+ icalvalue *v;
+
+ v = icalvalue_new_text("foo;bar;bats");
+
+ printf("%s\n",icalvalue_as_ical_string(v));
+
+ icalvalue_free(v);
+
+ v = icalvalue_new_text("foo\\;b\nar\\;ba\tts");
+
+ printf("%s\n",icalvalue_as_ical_string(v));
+
+ icalvalue_free(v);
+
+
+}
+
+void test_requeststat()
+{
+ icalrequeststatus s;
+ struct icalreqstattype st, st2;
+ char temp[1024];
+
+ s = icalenum_num_to_reqstat(2,1);
+
+ assert(s == ICAL_2_1_FALLBACK_STATUS);
+
+ assert(icalenum_reqstat_major(s) == 2);
+ assert(icalenum_reqstat_minor(s) == 1);
+
+ printf("2.1: %s\n",icalenum_reqstat_desc(s));
+
+ st.code = s;
+ st.debug = "booga";
+ st.desc = 0;
+
+ printf("%s\n",icalreqstattype_as_string(st));
+
+ st.desc = " A non-standard description";
+
+ printf("%s\n",icalreqstattype_as_string(st));
+
+
+ st.desc = 0;
+
+ sprintf(temp,"%s\n",icalreqstattype_as_string(st));
+
+
+ st2 = icalreqstattype_from_string("2.1;Success but fallback taken on one or more property values.;booga");
+
+ printf("%d -- %d -- %s -- %s\n",icalenum_reqstat_major(st2.code),
+ icalenum_reqstat_minor(st2.code),
+ icalenum_reqstat_desc(st2.code),
+ st2.debug);
+
+ st2 = icalreqstattype_from_string("2.1;Success but fallback taken on one or more property values.;booga");
+ printf("%s\n",icalreqstattype_as_string(st2));
+
+ st2 = icalreqstattype_from_string("2.1;Success but fallback taken on one or more property values.;");
+ printf("%s\n",icalreqstattype_as_string(st2));
+
+ st2 = icalreqstattype_from_string("2.1;Success but fallback taken on one or more property values.");
+ printf("%s\n",icalreqstattype_as_string(st2));
+
+ st2 = icalreqstattype_from_string("2.1;");
+ printf("%s\n",icalreqstattype_as_string(st2));
+
+ st2 = icalreqstattype_from_string("2.1");
+ printf("%s\n",icalreqstattype_as_string(st2));
+
+ st2 = icalreqstattype_from_string("16.4");
+ assert(st2.code == ICAL_UNKNOWN_STATUS);
+
+ st2 = icalreqstattype_from_string("1.");
+ assert(st2.code == ICAL_UNKNOWN_STATUS);
+
+}
+
+
+int main(int argc, char *argv[])
+{
+
+
+ printf("\n------------Test Restriction---------------\n");
+ test_restriction();
+
+ exit(0);
+
+ printf("\n------------Test request status-------\n");
+ test_requeststat();
+
+
+ printf("\n------------Test strings---------------\n");
+ test_strings();
+
+ printf("\n------------Test recur---------------\n");
+ test_recur();
+
+ printf("\n------------Test duration---------------\n");
+ test_duration();
+
+ printf("\n------------Test Compare---------------\n");
+ test_compare();
+
+ printf("\n------------Test Memory---------------\n");
+ test_memory();
+
+ printf("\n------------Test Values---------------\n");
+ test_values();
+
+ printf("\n------------Test Parameters-----------\n");
+ test_parameters();
+
+ printf("\n------------Test Properties-----------\n");
+ test_properties();
+
+ printf("\n------------Test Components ----------\n");
+ test_components();
+
+ printf("\n------------Create Components --------\n");
+ create_new_component();
+
+ printf("\n----- Create Components with vaargs ---\n");
+ create_new_component_with_va_args();
+
+
+
+
+ return 0;
+}
+
+
+
diff --git a/libical/src/test/storage.c b/libical/src/test/storage.c
new file mode 100644
index 0000000000..f6d0dd69e5
--- /dev/null
+++ b/libical/src/test/storage.c
@@ -0,0 +1,460 @@
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: usecases.c
+ CREATOR: eric 03 April 1999
+
+ DESCRIPTION:
+
+ $Id$
+ $Locker$
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The original author is Eric Busboom
+ The original code is usecases.c
+
+
+ ======================================================================*/
+
+#include "ical.h"
+#include <assert.h>
+#include <string.h> /* for strdup */
+#include <stdlib.h> /* for malloc */
+#include <stdio.h> /* for printf */
+#include <time.h> /* for time() */
+#include "icalmemory.h"
+#include "icalstore.h"
+#include "icalcluster.h"
+#include "icalerror.h"
+#include "icalrestriction.h"
+#include "icalcalendar.h"
+
+/* This example creates and minipulates the ical object that appears
+ * in rfc 2445, page 137 */
+
+char str[] = "BEGIN:VCALENDAR\n\
+PRODID:\"-//RDU Software//NONSGML HandCal//EN\"\n\
+VERSION:2.0\n\
+BEGIN:VTIMEZONE\n\
+TZID:US-Eastern\n\
+BEGIN:STANDARD\n\
+DTSTART:19981025T020000\n\
+RDATE:19981025T020000\n\
+TZOFFSETFROM:-0400\n\
+TZOFFSETTO:-0500\n\
+TZNAME:EST\n\
+END:STANDARD\n\
+BEGIN:DAYLIGHT\n\
+DTSTART:19990404T020000\n\
+RDATE:19990404T020000\n\
+TZOFFSETFROM:-0500\n\
+TZOFFSETTO:-0400\n\
+TZNAME:EDT\n\
+END:DAYLIGHT\n\
+END:VTIMEZONE\n\
+BEGIN:VEVENT\n\
+DTSTAMP:19980309T231000Z\n\
+UID:guid-1.host1.com\n\
+ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com\n\
+ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:MAILTO:employee-A@host.com\n\
+DESCRIPTION:Project XYZ Review Meeting\n\
+CATEGORIES:MEETING\n\
+CLASS:PUBLIC\n\
+CREATED:19980309T130000Z\n\
+SUMMARY:XYZ Project Review\n\
+DTSTART;TZID=US-Eastern:19980312T083000\n\
+DTEND;TZID=US-Eastern:19980312T093000\n\
+LOCATION:1CP Conference Room 4350\n\
+END:VEVENT\n\
+BEGIN:BOOGA\n\
+DTSTAMP:19980309T231000Z\n\
+X-LIC-FOO:Booga\n\
+DTSTOMP:19980309T231000Z\n\
+UID:guid-1.host1.com\n\
+END:BOOGA\n\
+END:VCALENDAR";
+
+char str2[] = "BEGIN:VCALENDAR\n\
+PRODID:\"-//RDU Software//NONSGML HandCal//EN\"\n\
+VERSION:2.0\n\
+BEGIN:VEVENT\n\
+DTSTAMP:19980309T231000Z\n\
+UID:guid-1.host1.com\n\
+ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com\n\
+ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:MAILTO:employee-A@host.com\n\
+DESCRIPTION:Project XYZ Review Meeting\n\
+CATEGORIES:MEETING\n\
+CLASS:PUBLIC\n\
+CREATED:19980309T130000Z\n\
+SUMMARY:XYZ Project Review\n\
+DTSTART;TZID=US-Eastern:19980312T083000\n\
+DTEND;TZID=US-Eastern:19980312T093000\n\
+LOCATION:1CP Conference Room 4350\n\
+END:VEVENT\n\
+END:VCALENDAR\n\
+";
+
+
+void test_cluster()
+{
+ icalcluster *cin, *cout;
+ int month = 0;
+ int count=0;
+ struct icaltimetype start, end;
+ icalcomponent *c,*clone, *itr;
+
+ start = icaltimetype_from_timet( time(0),0);
+ end = start;
+ end.hour++;
+
+ cout = icalcluster_new("clusterout.ics");
+ assert(cout != 0);
+
+ c = icalparser_parse_string(str2);
+ assert(c != 0);
+
+ for(month = 1; month < 2; month++){
+ icalcomponent *event;
+ icalproperty *dtstart, *dtend;
+
+ cout = icalcluster_new("clusterout.ics");
+ assert(cout != 0);
+
+ start.month = month;
+ end.month = month;
+
+ clone = icalcomponent_new_clone(c);
+ assert(clone !=0);
+ event = icalcomponent_get_first_component(clone,ICAL_VEVENT_COMPONENT);
+ assert(event != 0);
+
+ dtstart = icalcomponent_get_first_property(event,ICAL_DTSTART_PROPERTY);
+ assert(dtstart!=0);
+ icalproperty_set_dtstart(dtstart,start);
+
+ dtend = icalcomponent_get_first_property(event,ICAL_DTEND_PROPERTY);
+ assert(dtend!=0);
+ icalproperty_set_dtend(dtend,end);
+
+ icalcluster_add_component(cout,clone);
+ icalcluster_commit(cout);
+
+ icalcluster_free(cout);
+
+ }
+
+
+ /* Print them out */
+
+
+ cout = icalcluster_new("clusterout.ics");
+ assert(cout != 0);
+
+ for (itr = icalcluster_get_first_component(cout,
+ ICAL_ANY_COMPONENT);
+ itr != 0;
+ itr = icalcluster_get_next_component(cout,
+ ICAL_ANY_COMPONENT)){
+
+ icalcomponent *event;
+ icalproperty *dtstart, *dtend;
+
+ count++;
+
+ event = icalcomponent_get_first_component(itr,ICAL_VEVENT_COMPONENT);
+
+ dtstart = icalcomponent_get_first_property(event,ICAL_DTSTART_PROPERTY);
+ dtend = icalcomponent_get_first_property(event,ICAL_DTEND_PROPERTY);
+
+ printf("%d %s %s\n",count, icalproperty_as_ical_string(dtstart),
+ icalproperty_as_ical_string(dtend));
+
+ }
+
+ /* Remove all of them */
+
+ icalcluster_free(cout);
+
+ cout = icalcluster_new("clusterout.ics");
+ assert(cout != 0);
+
+ for (itr = icalcluster_get_first_component(cout,
+ ICAL_ANY_COMPONENT);
+ itr != 0;
+ itr = icalcluster_get_next_component(cout,
+ ICAL_ANY_COMPONENT)){
+
+
+ icalcluster_remove_component(cout, itr);
+ }
+
+ icalcluster_free(cout);
+
+
+ /* Print them out again */
+
+ cout = icalcluster_new("clusterout.ics");
+ assert(cout != 0);
+ count =0;
+
+ for (itr = icalcluster_get_first_component(cout,
+ ICAL_ANY_COMPONENT);
+ itr != 0;
+ itr = icalcluster_get_next_component(cout,
+ ICAL_ANY_COMPONENT)){
+
+ icalcomponent *event;
+ icalproperty *dtstart, *dtend;
+
+ count++;
+
+ event = icalcomponent_get_first_component(itr,ICAL_VEVENT_COMPONENT);
+
+ dtstart = icalcomponent_get_first_property(event,ICAL_DTSTART_PROPERTY);
+ dtend = icalcomponent_get_first_property(event,ICAL_DTEND_PROPERTY);
+
+ printf("%d %s %s\n",count, icalproperty_as_ical_string(dtstart),
+ icalproperty_as_ical_string(dtend));
+
+ }
+
+ icalcluster_free(cout);
+
+
+}
+
+
+
+int test_store()
+{
+
+ icalcomponent *c, *gauge;
+ icalerrorenum error;
+ icalcomponent *next, *itr;
+ icalcluster* cluster;
+ struct icalperiodtype rtime;
+ icalstore *s = icalstore_new("store");
+ int i;
+
+ assert(s != 0);
+
+ rtime.start = icaltimetype_from_timet( time(0),0);
+
+ cluster = icalcluster_new("clusterout.ics");
+
+ assert(cluster != 0);
+
+#define NUMCOMP 4
+
+ /* Duplicate every component in the cluster NUMCOMP times */
+
+ icalerror_clear_errno();
+
+ for (i = 1; i<NUMCOMP+1; i++){
+
+ /*rtime.start.month = i%12;*/
+ rtime.start.month = i;
+ rtime.end = rtime.start;
+ rtime.end.hour++;
+
+ for (itr = icalcluster_get_first_component(cluster,
+ ICAL_ANY_COMPONENT);
+ itr != 0;
+ itr = icalcluster_get_next_component(cluster,
+ ICAL_ANY_COMPONENT)){
+ icalcomponent *clone, *inner;
+ icalproperty *p;
+
+ inner = icalcomponent_get_first_component(itr,ICAL_VEVENT_COMPONENT);
+ if (inner == 0){
+ continue;
+ }
+
+ /* Change the dtstart and dtend times in the component
+ pointed to by Itr*/
+
+ clone = icalcomponent_new_clone(itr);
+ inner = icalcomponent_get_first_component(itr,ICAL_VEVENT_COMPONENT);
+
+ assert(icalerrno == ICAL_NO_ERROR);
+ assert(inner !=0);
+
+ /* DTSTART*/
+ p = icalcomponent_get_first_property(inner,ICAL_DTSTART_PROPERTY);
+ assert(icalerrno == ICAL_NO_ERROR);
+
+ if (p == 0){
+ p = icalproperty_new_dtstart(rtime.start);
+ icalcomponent_add_property(inner,p);
+ } else {
+ icalproperty_set_dtstart(p,rtime.start);
+ }
+ assert(icalerrno == ICAL_NO_ERROR);
+
+ /* DTEND*/
+ p = icalcomponent_get_first_property(inner,ICAL_DTEND_PROPERTY);
+ assert(icalerrno == ICAL_NO_ERROR);
+
+ if (p == 0){
+ p = icalproperty_new_dtstart(rtime.end);
+ icalcomponent_add_property(inner,p);
+ } else {
+ icalproperty_set_dtstart(p,rtime.end);
+ }
+ assert(icalerrno == ICAL_NO_ERROR);
+
+ printf("\n----------\n%s\n---------\n",icalcomponent_as_ical_string(inner));
+
+ error = icalstore_add_component(s,inner);
+
+ assert(icalerrno == ICAL_NO_ERROR);
+
+ }
+
+ }
+
+ gauge =
+ icalcomponent_vanew(
+ ICAL_VCALENDAR_COMPONENT,
+ icalcomponent_vanew(
+ ICAL_VEVENT_COMPONENT,
+ icalproperty_vanew_summary(
+ "Submit Income Taxes",
+ icalparameter_new_xliccomparetype(ICAL_XLICCOMPARETYPE_EQUAL),
+ 0),
+ 0),
+ icalcomponent_vanew(
+ ICAL_VEVENT_COMPONENT,
+ icalproperty_vanew_summary(
+ "Bastille Day Party",
+ icalparameter_new_xliccomparetype(ICAL_XLICCOMPARETYPE_EQUAL),
+ 0),
+ 0),
+ 0);
+
+#if 0
+
+
+ icalstore_select(s,gauge);
+
+ for(c = icalstore_first(s); c != 0; c = icalstore_next(s)){
+
+ printf("Got one! (%d)\n", count++);
+
+ if (c != 0){
+ printf("%s", icalcomponent_as_ical_string(c));;
+ if (icalstore_store(s2,c) == 0){
+ printf("Failed to write!\n");
+ }
+ icalcomponent_free(c);
+ } else {
+ printf("Failed to get component\n");
+ }
+ }
+
+
+ icalstore_free(s2);
+#endif
+
+
+ for(c = icalstore_get_first_component(s);
+ c != 0;
+ c = next){
+
+ next = icalstore_get_next_component(s);
+
+ if (c != 0){
+ /*icalstore_remove_component(s,c);*/
+ printf("%s", icalcomponent_as_ical_string(c));;
+ } else {
+ printf("Failed to get component\n");
+ }
+
+
+ }
+
+ icalstore_free(s);
+ return 0;
+}
+
+void test_calendar()
+{
+ icalcomponent *comp;
+ icalcluster *c;
+ icalstore *s;
+ icalcalendar* calendar = icalcalendar_new("calendar");
+ icalerrorenum error;
+ struct icaltimetype atime = icaltimetype_from_timet( time(0),0);
+
+ comp = icalcomponent_vanew(
+ ICAL_VEVENT_COMPONENT,
+ icalproperty_new_version("2.0"),
+ icalproperty_new_description("This is an event"),
+ icalproperty_new_dtstart(atime),
+ icalproperty_vanew_comment(
+ "Another Comment",
+ icalparameter_new_cn("A Common Name 1"),
+ icalparameter_new_cn("A Common Name 2"),
+ icalparameter_new_cn("A Common Name 3"),
+ icalparameter_new_cn("A Common Name 4"),
+ 0),
+ icalproperty_vanew_xlicerror(
+ "This is only a test",
+ icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_COMPONENTPARSEERROR),
+ 0),
+
+ 0);
+
+
+ s = icalcalendar_get_booked(calendar);
+
+ error = icalstore_add_component(s,comp);
+
+ assert(error == ICAL_NO_ERROR);
+
+ c = icalcalendar_get_properties(calendar);
+
+ error = icalcluster_add_component(c,icalcomponent_new_clone(comp));
+
+ assert(error == ICAL_NO_ERROR);
+
+ icalcalendar_free(calendar);
+
+}
+
+
+int main(int argc, char *argv[])
+{
+
+
+ printf("\n------------Test Cluster---------------\n");
+ test_cluster();
+
+#if 0
+
+ printf("\n------------Test Store---------------\n");
+ test_store();
+
+
+
+ printf("\n------------Test Calendar---------------\n");
+ test_calendar();
+
+#endif
+
+ return 0;
+}
+
+
+
diff --git a/libical/src/test/test-component.icd b/libical/src/test/test-component.icd
new file mode 100644
index 0000000000..3fe2995a83
--- /dev/null
+++ b/libical/src/test/test-component.icd
@@ -0,0 +1,23 @@
+BEGIN:VCALENDAR
+X-LIC-CLUSTERCOUNT
+ :0
+DTSTART
+ :00000000T000000
+DTEND
+ :00000000T000000
+BEGIN:VCALENDAR
+PRODID:-//RDU Software//NONSGML HandCal//EN
+METHOD:REPLY
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:Mailto:A@example.com
+ATTENDEE:Mailto:B@example.com
+REQUEST-STATUS:2.8;Repeating event ignored. Scheduled as a single
+ event;RRULE
+REQUEST-STATUS:3.0;Invalid Property Name;FOO
+UID:guid-1@host1.com
+SEQUENCE:0
+DTSTAMP:19970603T094000Z
+END:VEVENT
+END:VCALENDAR
+END:VCALENDAR
diff --git a/libical/src/test/usecases.c b/libical/src/test/usecases.c
new file mode 100644
index 0000000000..05c295197f
--- /dev/null
+++ b/libical/src/test/usecases.c
@@ -0,0 +1,553 @@
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: usecases.c
+ CREATOR: eric 03 April 1999
+
+ DESCRIPTION:
+
+ $Id$
+ $Locker$
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The original author is Eric Busboom
+ The original code is usecases.c
+
+
+ ======================================================================*/
+
+#include "ical.h"
+#include <assert.h>
+#include <string.h> /* for strdup */
+#include <stdlib.h> /* for malloc */
+#include <stdio.h> /* for printf */
+#include <time.h> /* for time() */
+#include "icalmemory.h"
+
+/*
+
+ Here is the example iCal object that the examples routines in this
+ file will use:
+
+ BEGIN:VCALENDAR
+ PRODID:-//RDU Software//NONSGML HandCal//EN
+ VERSION:2.0
+ BEGIN:VTIMEZONE
+ BEGIN:VEVENT
+ DTSTAMP:19980309T231000Z
+ UID:guid-1.host1.com
+ ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com
+ ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:
+ MAILTO:employee-A@host.com
+ DESCRIPTION:Project XYZ Review Meeting
+ CREATED:19980309T130000Z
+ SUMMARY:XYZ Project Review
+ DTSTART;TZID=US-Eastern:19980312T083000
+ DTEND;TZID=US-Eastern:19980312T093000
+ END:VEVENT
+ END:VCALENDAR
+
+*/
+
+char str[] = "BEGIN:VCALENDAR\
+PRODID:\"-//RDU Software//NONSGML HandCal//EN\"\
+VERSION:2.0\
+BEGIN:VEVENT\
+DTSTAMP:19980309T231000Z\
+UID:guid-1.host1.com\
+ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com\
+ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:MAILTO:employee-A@host.com\
+DESCRIPTION:Project XYZ Review Meeting\
+CATEGORIES:MEETING\
+CREATED:19980309T130000Z\
+SUMMARY:XYZ Project Review\
+DTSTART;TZID=US-Eastern:19980312T083000\
+DTEND;TZID=US-Eastern:19980312T093000\
+END:VEVENT\
+END:VCALENDAR";
+
+/* Creating iCal Components
+
+ There are two ways to create new component in libical. You can
+ build the component from primitive parts, or you can create it
+ from a string.
+
+ There are two variations of the API for building the component from
+ primitive parts. In the first variation, you add each parameter and
+ value to a property, and then add each property to a
+ component. This results in a long series of function calls. This
+ style is show in create_new_component()
+
+ The second variation uses vargs lists to nest many primitive part
+ constructors, resulting in a compact, neatly formated way to create
+ components. This style is shown in create_new_component_with_va_args()
+
+
+
+*/
+
+icalcomponent* create_new_component()
+{
+
+ /* variable definitions */
+ icalcomponent* calendar;
+ icalcomponent* event;
+ struct icaltimetype atime = icaltimetype_from_timet( time(0),0);
+ struct icalperiodtype rtime;
+ icalproperty* property;
+
+ /* Define a time type that will use as data later. */
+ rtime.start = icaltimetype_from_timet( time(0),0);
+ rtime.end = icaltimetype_from_timet( time(0),0);
+ rtime.end.hour++;
+
+ /* Create calendar and add properties */
+
+ calendar = icalcomponent_new(ICAL_VCALENDAR_COMPONENT);
+
+ /* Nearly every libical function call has the same general
+ form. The first part of the name defines the 'class' for the
+ function, and the first argument will be a pointer to a struct
+ of that class. So, icalcomponent_ functions will all take
+ icalcomponent* as their first argument. */
+
+ /* The next call creates a new proeprty and immediately adds it to the
+ 'calendar' component. */
+
+ icalcomponent_add_property(
+ calendar,
+ icalproperty_new_version(strdup("2.0"))
+ );
+
+ /* Note the use of strdup() in the previous and next call. All
+ properties constructors for properties with value types of
+ TEXT will take control of the string you pass into them. Since
+ the string '2.0' is a static string, we need to duplicate it in
+ new memory before giving it to the property */
+
+ /* Here is the short version of the memory rules:
+
+ If the routine name has "new" in it:
+ Caller owns the returned memory.
+ If you pass in a string, the routine takes the memory.
+
+ If the routine name has "add" in it:
+ The routine takes control of the component, property,
+ parameter or value memory.
+
+ If the routine returns a string ( "get" and "as_ical_string" )
+ The library owns the returned memory.
+
+ There are more rules, so refer to the documentation for more
+ details.
+
+ */
+
+ icalcomponent_add_property(
+ calendar,
+ icalproperty_new_prodid(strdup("-//RDU Software//NONSGML HandCal//EN"))
+ );
+
+ /* Add an event */
+
+ event = icalcomponent_new(ICAL_VEVENT_COMPONENT);
+
+ icalcomponent_add_property(
+ event,
+ icalproperty_new_dtstamp(atime)
+ );
+
+ /* In the previous call, atime is a struct, and it is passed in by value.
+ This is how all compound types of values are handled. */
+
+ icalcomponent_add_property(
+ event,
+ icalproperty_new_uid(strdup("guid-1.host1.com"))
+ );
+
+ /* add a property that has parameters */
+ property = icalproperty_new_organizer(strdup("mrbig@host.com"));
+
+ icalproperty_add_parameter(
+ property,
+ icalparameter_new_role(ICAL_ROLE_CHAIR)
+ );
+
+ icalcomponent_add_property(event,property);
+
+ /* In this style of component creation, you need to use an extra
+ call to add parameters to properties, but the form of this
+ operation is the same as adding a property to a component */
+
+ /* add another property that has parameters */
+ property = icalproperty_new_attendee(strdup("employee-A@host.com"));
+
+ icalproperty_add_parameter(
+ property,
+ icalparameter_new_role(ICAL_ROLE_REQPARTICIPANT)
+ );
+
+ icalproperty_add_parameter(
+ property,
+ icalparameter_new_rsvp(1)
+ );
+
+ icalproperty_add_parameter(
+ property,
+ icalparameter_new_cutype(ICAL_CUTYPE_GROUP)
+ );
+
+ icalcomponent_add_property(event,property);
+
+
+ /* more properties */
+
+ icalcomponent_add_property(
+ event,
+ icalproperty_new_description(strdup("Project XYZ Review Meeting"))
+ );
+
+ icalcomponent_add_property(
+ event,
+ icalproperty_new_categories(strdup("MEETING"))
+ );
+
+ icalcomponent_add_property(
+ event,
+ icalproperty_new_class(strdup("PUBLIC"))
+ );
+
+ icalcomponent_add_property(
+ event,
+ icalproperty_new_created(atime)
+ );
+
+ icalcomponent_add_property(
+ event,
+ icalproperty_new_summary(strdup("XYZ Project Review"))
+ );
+
+ property = icalproperty_new_dtstart(atime);
+
+ icalproperty_add_parameter(
+ property,
+ icalparameter_new_tzid(strdup("US-Eastern"))
+ );
+
+ icalcomponent_add_property(event,property);
+
+
+ property = icalproperty_new_dtend(atime);
+
+ icalproperty_add_parameter(
+ property,
+ icalparameter_new_tzid(strdup("US-Eastern"))
+ );
+
+ icalcomponent_add_property(event,property);
+
+ icalcomponent_add_property(
+ event,
+ icalproperty_new_location(strdup("1CP Conference Room 4350"))
+ );
+
+ icalcomponent_add_component(calendar,event);
+
+ return calendar;
+}
+
+
+/* Now, create the same component as in the previous routine, but use
+the constructor style. */
+
+icalcomponent* create_new_component_with_va_args()
+{
+
+ /* This is a similar set up to the last routine */
+ icalcomponent* calendar;
+ struct icaltimetype atime = icaltimetype_from_timet( time(0),0);
+ struct icalperiodtype rtime;
+
+ rtime.start = icaltimetype_from_timet( time(0),0);
+ rtime.end = icaltimetype_from_timet( time(0),0);
+ rtime.end.hour++;
+
+ /* Some of these routines are the same as those in the previous
+ routine, but we've also added several 'vanew' routines. These
+ 'vanew' routines take a list of properties, parameters or
+ values and add each of them to the parent property or
+ component. */
+
+ calendar =
+ icalcomponent_vanew(
+ ICAL_VCALENDAR_COMPONENT,
+ icalproperty_new_version(strdup("2.0")),
+ icalproperty_new_prodid(strdup("-//RDU Software//NONSGML HandCal//EN")),
+ icalcomponent_vanew(
+ ICAL_VEVENT_COMPONENT,
+ icalproperty_new_dtstamp(atime),
+ icalproperty_new_uid(strdup("guid-1.host1.com")),
+ icalproperty_vanew_organizer(
+ strdup("mrbig@host.com"),
+ icalparameter_new_role(ICAL_ROLE_CHAIR),
+ 0
+ ),
+ icalproperty_vanew_attendee(
+ strdup("employee-A@host.com"),
+ icalparameter_new_role(ICAL_ROLE_REQPARTICIPANT),
+ icalparameter_new_rsvp(1),
+ icalparameter_new_cutype(ICAL_CUTYPE_GROUP),
+ 0
+ ),
+ icalproperty_new_description(strdup("Project XYZ Review Meeting")),
+ icalproperty_new_categories(strdup("MEETING")),
+ icalproperty_new_class(strdup("PUBLIC")),
+ icalproperty_new_created(atime),
+ icalproperty_new_summary(strdup("XYZ Project Review")),
+ icalproperty_vanew_dtstart(
+ atime,
+ icalparameter_new_tzid(strdup("US-Eastern")),
+ 0
+ ),
+ icalproperty_vanew_dtend(
+ atime,
+ icalparameter_new_tzid(strdup("US-Eastern")),
+ 0
+ ),
+ icalproperty_new_location(strdup("1CP Conference Room 4350")),
+ 0
+ ),
+ 0
+ );
+
+
+ /* Note that properties with no parameters can use the regular
+ 'new' constructor, while those with parameters use the 'vanew'
+ constructor. And, be sure that the last argument in the 'vanew'
+ call is a zero. Without, your program will probably crash. */
+
+ return calendar;
+}
+
+
+/* Now, lets try to get a particular parameter out of a
+ component. This routine will return a list of strings of all
+ attendees who are required. Note that this routine assumes that the
+ component that we pass in is a VEVENT; the top level component we
+ created in the above two routines is a VCALENDAR */
+
+char *attendees[10];
+#define MAX_ATTENDEES 10;
+
+char** get_required_attendees(icalcomponent* event)
+{
+ icalproperty* p;
+ icalparameter* parameter;
+ int c=0;
+
+ assert(event != 0);
+ assert(icalcomponent_isa(event) == ICAL_VEVENT_COMPONENT);
+
+ /* This loop iterates over all of the ATTENDEE properties in the
+ event */
+
+ /* Yes, the iteration routines save their state in the event
+ struct, so the are not thread safe unless you lock the whole
+ event. */
+
+ for(
+ p = icalcomponent_get_first_property(event,ICAL_ATTENDEE_PROPERTY);
+ p != 0;
+ p = icalcomponent_get_next_property(event,ICAL_ATTENDEE_PROPERTY)
+ ) {
+
+ /* Get the first ROLE parameter in the property. There should
+ only be one, so we wont bother to iterate over them. */
+
+ parameter = icalproperty_get_first_parameter(p,ICAL_ROLE_PARAMETER);
+
+ /* If the parameter indicates the participant is required, get
+ the attendees name and stick a copy of it into the output
+ array */
+
+ if ( icalparameter_get_role(parameter) == ICAL_ROLE_REQPARTICIPANT)
+ {
+ attendees[c++] = strdup(icalproperty_get_attendee(p));
+ }
+ }
+
+ return attendees;
+}
+
+/* Here is a similar example. If an attendee has a PARTSTAT of
+ NEEDSACTION or has no PARTSTAT parameter, change it to
+ TENTATIVE. */
+
+void update_attendees(icalcomponent* event)
+{
+ icalproperty* p;
+ icalparameter* parameter;
+
+ assert(event != 0);
+ assert(icalcomponent_isa(event) == ICAL_VEVENT_COMPONENT);
+
+ for(
+ p = icalcomponent_get_first_property(event,ICAL_ATTENDEE_PROPERTY);
+ p != 0;
+ p = icalcomponent_get_next_property(event,ICAL_ATTENDEE_PROPERTY)
+ ) {
+
+ parameter = icalproperty_get_first_parameter(p,ICAL_PARTSTAT_PARAMETER);
+
+ if (parameter == 0) {
+
+ /* There was no PARTSTAT parameter, so add one. */
+ icalproperty_add_parameter(
+ p,
+ icalparameter_new_partstat(ICAL_PARTSTAT_TENTATIVE)
+ );
+
+ } else if (icalparameter_get_partstat(parameter) == ICAL_PARTSTAT_NEEDSACTION) {
+ /* Remove the NEEDSACTION parameter and replace it with
+ TENTATIVE */
+
+ icalproperty_remove_parameter(p,ICAL_PARTSTAT_PARAMETER);
+
+ /* Don't forget to free it */
+ icalparameter_free(parameter);
+
+ /* Add a new one */
+ icalproperty_add_parameter(
+ p,
+ icalparameter_new_partstat(ICAL_PARTSTAT_TENTATIVE)
+ );
+ }
+
+ }
+}
+
+/* Here are some examples of manipulating properties */
+
+void test_properties()
+{
+ icalproperty *prop;
+ icalparameter *param;
+ icalvalue *value;
+
+ icalproperty *clone;
+
+ /* Create a new property */
+ prop = icalproperty_vanew_comment(
+ strdup("Another Comment"),
+ icalparameter_new_cn("A Common Name 1"),
+ icalparameter_new_cn("A Common Name 2"),
+ icalparameter_new_cn("A Common Name 3"),
+ icalparameter_new_cn("A Common Name 4"),
+ 0);
+
+ /* Iterate through all of the parameters in the property */
+ for(param = icalproperty_get_first_parameter(prop,ICAL_ANY_PROPERTY);
+ param != 0;
+ param = icalproperty_get_next_parameter(prop,ICAL_ANY_PROPERTY)) {
+
+ printf("Prop parameter: %s\n",icalparameter_get_cn(param));
+ }
+
+ /* Get a string representation of the property's value */
+ printf("Prop value: %s\n",icalproperty_get_comment(prop));
+
+ /* Spit out the property in its RFC 2445 representation */
+ printf("As iCAL string:\n %s\n",icalproperty_as_ical_string(prop));
+
+ /* Make a copy of the property. Caller owns the memory */
+ clone = icalproperty_new_clone(prop);
+
+ /* Get a reference to the value within the clone property */
+ value = icalproperty_get_value(clone);
+
+ printf("Value: %s",icalvalue_as_ical_string(value));
+
+ /* Free the original and the clone */
+ icalproperty_free(clone);
+ icalproperty_free(prop);
+
+}
+
+
+
+/* Here are some ways to work with values. */
+void test_values()
+{
+ icalvalue *v;
+ icalvalue *copy;
+
+ v = icalvalue_new_caladdress(strdup("cap://value/1"));
+ printf("caladdress 1: %s\n",icalvalue_get_caladdress(v));
+
+ icalvalue_set_caladdress(v,strdup("cap://value/2"));
+ printf("caladdress 2: %s\n",icalvalue_get_caladdress(v));
+ printf("String: %s\n",icalvalue_as_ical_string(v));
+
+ copy = icalvalue_new_clone(v);
+ printf("Clone: %s\n",icalvalue_as_ical_string(v));
+ icalvalue_free(v);
+ icalvalue_free(copy);
+
+
+}
+
+void test_parameters()
+{
+ icalparameter *p;
+
+ p = icalparameter_new_cn("A Common Name");
+
+ printf("Common Name: %s\n",icalparameter_get_cn(p));
+
+ printf("As String: %s\n",icalparameter_as_ical_string(p));
+}
+
+
+int main(int argc, char *argv[])
+{
+ icalcomponent *c1;
+ icalcomponent *c2;
+ icalcomponent *vevent;
+ char **attendees;
+
+ c1 = create_new_component();
+ c2 = create_new_component_with_va_args();
+
+ /* Extract the VEVENT component from the component */
+
+ vevent = icalcomponent_get_first_component(c1,ICAL_VEVENT_COMPONENT);
+
+ attendees = get_required_attendees(vevent);
+
+ printf("Attendees: %s\n",attendees[0]);
+
+ /* Now print out the component as a string. Remember that the
+ library retains control of the memory returned by
+ icalcomponent_as_ical_string. Do not sotre references to it or
+ try to free it. It is stored on an internal ring buffer,and the
+ library will eventuall reclaim it. */
+
+ printf("%s\n",icalcomponent_as_ical_string(c1));
+
+ return 0;
+
+}
+
+
+
diff --git a/libical/test-data/.cvsignore b/libical/test-data/.cvsignore
new file mode 100644
index 0000000000..b840c21800
--- /dev/null
+++ b/libical/test-data/.cvsignore
@@ -0,0 +1,2 @@
+Makefile.in
+Makefile \ No newline at end of file
diff --git a/libical/test-data/0 b/libical/test-data/0
new file mode 100644
index 0000000000..e30493fcc0
--- /dev/null
+++ b/libical/test-data/0
@@ -0,0 +1,21 @@
+BEGIN:VCALENDAR
+PRODID:-//GNOME//NONSGML GnomeCalendar//EN
+VERSION:0.0.1
+BEGIN:VEVENT
+UID:20000216T083142-31506-500-2714-0@twitch
+SEQUENCE:0
+DTSTART:19970714T170000
+DTEND:19970715T035959
+DCREATED:19691231T160000
+LAST-MODIFIED:20000216T083142
+SUMMARY:Bastille Day Party
+STATUS:NEEDS ACTION
+CLASS:PUBLIC
+PRIORITY:0
+TRANSP:0
+X-PILOTID:0
+X-PILOTSTAT:1
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libical/test-data/1 b/libical/test-data/1
new file mode 100644
index 0000000000..213b37d916
--- /dev/null
+++ b/libical/test-data/1
@@ -0,0 +1,36 @@
+BEGIN:VCALENDAR
+PRODID:"-//RDU Software//NONSGML HandCal//EN"
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:US-Eastern
+BEGIN:STANDARD
+DTSTART:19981025T020000
+RDATE:19981025T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19990404T020000
+RDATE:19990404T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:19980309T231000Z
+UID:guid-1.host1.com
+ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com
+ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:MAILTO:employee-A@host.com
+DESCRIPTION:Project XYZ Review Meeting
+CATEGORIES:MEETING
+CLASS:PUBLIC
+CREATED:19980309T130000Z
+SUMMARY:XYZ Project Review
+DTSTART;TZID=US-Eastern:19980312T083000
+DTEND;TZID=US-Eastern:19980312T093000
+LOCATION:1CP Conference Room 4350
+END:VEVENT
+END:VCALENDAR
+
diff --git a/libical/test-data/1.1 b/libical/test-data/1.1
new file mode 100644
index 0000000000..a7c92c33bd
--- /dev/null
+++ b/libical/test-data/1.1
@@ -0,0 +1,13 @@
+BEGIN:VCALENDAR
+DURATION:P15DT5H0M20S
+DURATION:P7W
+URL;CN=John Smith:http://example.com/urivalue.html
+X-SKI-TITLE;RSVP=TRUE: This is an extension property
+SUMMARY:"No Property"
+SUMMARY;RSVP=TRUE;RSVP=FALSE:Calendaring Interoperability Planning Meeting
+SUMMARY;ALTREP=This is an xname:altrep
+SUMMARY;CUTYPE=DESCRIPTION is a keyword:Xname parameter
+DTEND:19990605
+DTSTART:19990605T103012
+CATEGORIES;RSVP=TRUE;RSVP=FALSE:one,two
+END:VCALENDAR
diff --git a/libical/test-data/2 b/libical/test-data/2
new file mode 100644
index 0000000000..50ba609ab3
--- /dev/null
+++ b/libical/test-data/2
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+METHOD:xyz
+VERSION:2.0
+PRODID:-//ABC Corporation//NONSGML
+ My Product//EN
+BEGIN:VEVENT
+DTSTAMP:19970324T1200Z
+SEQUENCE:0
+UID:uid3@host1.com
+ORGANIZER:MAILTO:jdoe@host1.com
+ATTENDEE;RSVP=TRUE:MAILTO:jsmith@host1.com
+DTSTART:19970324T123000Z
+DTEND:19970324T210000Z
+CATEGORIES:MEETING,PROJECT
+CLASS:PUBLIC
+SUMMARY:Calendaring Interoperability Planning Meeting
+DESCRIPTION:Discuss how we can test c&s interoperability\n
+ using iCalendar and other IETF standards.
+LOCATION:LDB Lobby
+ATTACH;FMTTYPE=application/postscript:ftp://xyzCorp.com/pub/conf/bkgrnd.ps
+END:VEVENT
+END:VCALENDAR
diff --git a/libical/test-data/2445.ics b/libical/test-data/2445.ics
new file mode 100644
index 0000000000..1168324d88
--- /dev/null
+++ b/libical/test-data/2445.ics
@@ -0,0 +1,329 @@
+BEGIN:VCALENDAR
+X-LIC-CLUSTERCOUNT
+ :0
+DTSTART
+ :00000000T000000
+DTEND
+ :00000000T000000
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//hacksw/handcal//NONSGML v1.0//EN
+BEGIN:VEVENT
+DTSTART:19970714T170000Z
+DTEND:19970715T035959Z
+SUMMARY:Bastille Day Party
+END:VEVENT
+END:VCALENDAR
+
+BEGIN:VEVENT
+UID:19970901T130000Z-123401@host.com
+DTSTAMP:19970901T1300Z
+DTSTART:19970903T163000Z
+DTEND:19970903T190000Z
+SUMMARY:Annual Employee Review
+CLASS:PRIVATE
+CATEGORIES:BUSINESS,HUMAN RESOURCES
+END:VEVENT
+
+BEGIN:VEVENT
+UID:19970901T130000Z-123402@host.com
+DTSTAMP:19970901T1300Z
+DTSTART:19970401T163000Z
+DTEND:19970402T010000Z
+SUMMARY:Laurel is in sensitivity awareness class.
+CLASS:PUBLIC
+CATEGORIES:BUSINESS,HUMAN RESOURCES
+TRANSP:TRANSPARENT
+END:VEVENT
+
+BEGIN:VEVENT
+UID:19970901T130000Z-123403@host.com
+DTSTAMP:19970901T1300Z
+DTSTART:19971102
+SUMMARY:Our Blissful Anniversary
+CLASS:CONFIDENTIAL
+CATEGORIES:ANNIVERSARY,PERSONAL,SPECIAL OCCASION
+RRULE:FREQ=YEARLY
+END:VEVENT
+
+BEGIN:VTODO
+UID:19970901T130000Z-123404@host.com
+DTSTAMP:19970901T1300Z
+DTSTART:19970415T133000Z
+DUE:19970416T045959Z
+SUMMARY:1996 Income Tax Preparation
+CLASS:CONFIDENTIAL
+CATEGORIES:FAMILY,FINANCE
+PRIORITY:1
+STATUS:NEEDS-ACTION
+END:VTODO
+BEGIN:VJOURNAL
+UID:19970901T130000Z-123405@host.com
+DTSTAMP:19970901T1300Z
+DTSTART;VALUE=DATE:19970317
+SUMMARY:Staff meeting minutes
+DESCRIPTION:1. Staff meeting: Participants include Joe\, Lisa
+ and Bob. Aurora project plans were reviewed. There is currently
+ no budget reserves for this project. Lisa will escalate to
+ management. Next meeting on Tuesday.\n
+ 2. Telephone Conference: ABC Corp. sales representative called
+ to discuss new printer. Promised to get us a demo by Friday.\n
+ 3. Henry Miller (Handsoff Insurance): Car was totaled by tree.
+ Is looking into a loaner car. 654-2323 (tel).
+END:VJOURNAL
+BEGIN:VFREEBUSY
+ORGANIZER:MAILTO:jane_doe@host1.com
+ATTENDEE:MAILTO:john_public@host2.com
+DTSTART:19971015T050000Z
+DTEND:19971016T050000Z
+DTSTAMP:19970901T083000Z
+END:VFREEBUSY
+BEGIN:VFREEBUSY
+ORGANIZER:MAILTO:jane_doe@host1.com
+ATTENDEE:MAILTO:john_public@host2.com
+DTSTAMP:19970901T100000Z
+FREEBUSY;VALUE=PERIOD:19971015T050000Z/PT8H30M,
+ 19971015T160000Z/PT5H30M,19971015T223000Z/PT6H30M
+URL:http://host2.com/pub/busy/jpublic-01.ifb
+COMMENT:This iCalendar file contains busy time information for
+ the next three months.
+END:VFREEBUSY
+BEGIN:VFREEBUSY
+ORGANIZER:jsmith@host.com
+DTSTART:19980313T141711Z
+DTEND:19980410T141711Z
+FREEBUSY:19980314T233000Z/19980315T003000Z
+FREEBUSY:19980316T153000Z/19980316T163000Z
+FREEBUSY:19980318T030000Z/19980318T040000Z
+URL:http://www.host.com/calendar/busytime/jsmith.ifb
+END:VFREEBUSY
+BEGIN:VTIMEZONE
+TZID:US-Eastern
+LAST-MODIFIED:19870101T000000Z
+BEGIN:STANDARD
+DTSTART:19971026T020000
+RDATE:19971026T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19971026T020000
+RDATE:19970406T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VTIMEZONE
+TZID:US-Eastern
+LAST-MODIFIED:19870101T000000Z
+TZURL:http://zones.stds_r_us.net/tz/US-Eastern
+BEGIN:STANDARD
+DTSTART:19671029T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19870405T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VTIMEZONE
+TZID:US--Fictitious-Eastern
+LAST-MODIFIED:19870101T000000Z
+BEGIN:STANDARD
+DTSTART:19671029T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19870405T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4;UNTIL=19980404T070000Z
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VTIMEZONE
+TZID:US--Fictitious-Eastern
+LAST-MODIFIED:19870101T000000Z
+BEGIN:STANDARD
+DTSTART:19671029T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19870405T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4;UNTIL=19980404T070000Z
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+DTSTART:19990424T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=4
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VALARM
+TRIGGER;VALUE=DATE-TIME:19970317T133000Z
+REPEAT:4
+DURATION:PT15M
+ACTION:AUDIO
+ATTACH;FMTTYPE=audio/basic:ftp://host.com/pub/sounds/bell-01.aud
+END:VALARM
+BEGIN:VALARM
+TRIGGER:-PT30M
+REPEAT:2
+DURATION:PT15M
+ACTION:DISPLAY
+DESCRIPTION:Breakfast meeting with executive\n
+ team at 8:30 AM EST.
+END:VALARM
+BEGIN:VALARM
+TRIGGER:-P2D
+ACTION:EMAIL
+ATTENDEE:MAILTO:john_doe@host.com
+SUMMARY:*** REMINDER: SEND AGENDA FOR WEEKLY STAFF MEETING ***
+DESCRIPTION:A draft agenda needs to be sent out to the attendees
+ to the weekly managers meeting (MGR-LIST). Attached is a
+ pointer the document template for the agenda file.
+ATTACH;FMTTYPE=application/binary:http://host.com/templates/agen
+ da.doc
+END:VALARM
+BEGIN:VALARM
+TRIGGER;VALUE=DATE-TIME:19980101T050000Z
+REPEAT:23
+DURATION:PT1H
+ACTION:PROCEDURE
+ATTACH;FMTTYPE=application/binary:ftp://host.com/novo-
+ procs/felizano.exe
+END:VALARM
+BEGIN:VCALENDAR
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:US-Eastern
+BEGIN:STANDARD
+DTSTART:19981025T020000
+RDATE:19981025T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19990404T020000
+RDATE:19990404T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:19980309T231000Z
+UID:guid-1.host1.com
+ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com
+ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:
+ MAILTO:employee-A@host.com
+DESCRIPTION:Project XYZ Review Meeting
+CATEGORIES:MEETING
+CLASS:PUBLIC
+CREATED:19980309T130000Z
+SUMMARY:XYZ Project Review
+DTSTART;TZID=US-Eastern:19980312T083000
+DTEND;TZID=US-Eastern:19980312T093000
+LOCATION:1CP Conference Room 4350
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:xyz
+VERSION:2.0
+PRODID:-//ABC Corporation//NONSGML My Product//EN
+BEGIN:VEVENT
+DTSTAMP:19970324T1200Z
+SEQUENCE:0
+UID:uid3@host1.com
+ORGANIZER:MAILTO:jdoe@host1.com
+ATTENDEE;RSVP=TRUE:MAILTO:jsmith@host1.com
+DTSTART:19970324T123000Z
+DTEND:19970324T210000Z
+CATEGORIES:MEETING,PROJECT
+CLASS:PUBLIC
+SUMMARY:Calendaring Interoperability Planning Meeting
+DESCRIPTION:Discuss how we can test c&s interoperability\n
+ using iCalendar and other IETF standards.
+LOCATION:LDB Lobby
+ATTACH;FMTTYPE=application/postscript:ftp://xyzCorp.com/pub/
+ conf/bkgrnd.ps
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//ABC Corporation//NONSGML My Product//EN
+BEGIN:VTODO
+DTSTAMP:19980130T134500Z
+SEQUENCE:2
+UID:uid4@host1.com
+ORGANIZER:MAILTO:unclesam@us.gov
+ATTENDEE;PARTSTAT=ACCEPTED:MAILTO:jqpublic@host.com
+DUE:19980415T235959
+STATUS:NEEDS-ACTION
+SUMMARY:Submit Income Taxes
+BEGIN:VALARM
+ACTION:AUDIO
+TRIGGER;VALUE=DATE-TIME:19980403T120000Z
+ATTACH;FMTTYPE=audio/basic:http://host.com/pub/audio-
+ files/ssbanner.aud
+REPEAT:4
+DURATION:PT1H
+END:VALARM
+END:VTODO
+END:VCALENDAR
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//ABC Corporation//NONSGML My Product//EN
+BEGIN:VJOURNAL
+DTSTAMP:19970324T120000Z
+UID:uid5@host1.com
+ORGANIZER:MAILTO:jsmith@host.com
+STATUS:DRAFT
+CLASS:PUBLIC
+CATEGORIES:Project Report, XYZ, Weekly Meeting
+DESCRIPTION:Project xyz Review Meeting Minutes\n
+ Agenda\n1. Review of project version 1.0 requirements.\n2.
+ Definition of project processes.\n3. Review of project schedule.\n
+ Participants: John Smith, Jane Doe, Jim Dandy\n-It was
+ decided that the requirements need to be signed off by
+ product marketing.\n-Project processes were accepted.\n
+ -Project schedule needs to account for scheduled holidays
+ and employee vacation time. Check with HR for specific
+ dates.\n-New schedule will be distributed by Friday.\n-
+ Next weeks meeting is cancelled. No meeting until 3/23.
+END:VJOURNAL
+END:VCALENDAR
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//RDU Software//NONSGML HandCal//EN
+BEGIN:VFREEBUSY
+ORGANIZER:MAILTO:jsmith@host.com
+DTSTART:19980313T141711Z
+DTEND:19980410T141711Z
+FREEBUSY:19980314T233000Z/19980315T003000Z
+FREEBUSY:19980316T153000Z/19980316T163000Z
+FREEBUSY:19980318T030000Z/19980318T040000Z
+URL:http://www.host.com/calendar/busytime/jsmith.ifb
+END:VFREEBUSY
+END:VCALENDAR
+END:VCALENDAR \ No newline at end of file
diff --git a/libical/test-data/2445.vcd b/libical/test-data/2445.vcd
new file mode 100644
index 0000000000..1168324d88
--- /dev/null
+++ b/libical/test-data/2445.vcd
@@ -0,0 +1,329 @@
+BEGIN:VCALENDAR
+X-LIC-CLUSTERCOUNT
+ :0
+DTSTART
+ :00000000T000000
+DTEND
+ :00000000T000000
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//hacksw/handcal//NONSGML v1.0//EN
+BEGIN:VEVENT
+DTSTART:19970714T170000Z
+DTEND:19970715T035959Z
+SUMMARY:Bastille Day Party
+END:VEVENT
+END:VCALENDAR
+
+BEGIN:VEVENT
+UID:19970901T130000Z-123401@host.com
+DTSTAMP:19970901T1300Z
+DTSTART:19970903T163000Z
+DTEND:19970903T190000Z
+SUMMARY:Annual Employee Review
+CLASS:PRIVATE
+CATEGORIES:BUSINESS,HUMAN RESOURCES
+END:VEVENT
+
+BEGIN:VEVENT
+UID:19970901T130000Z-123402@host.com
+DTSTAMP:19970901T1300Z
+DTSTART:19970401T163000Z
+DTEND:19970402T010000Z
+SUMMARY:Laurel is in sensitivity awareness class.
+CLASS:PUBLIC
+CATEGORIES:BUSINESS,HUMAN RESOURCES
+TRANSP:TRANSPARENT
+END:VEVENT
+
+BEGIN:VEVENT
+UID:19970901T130000Z-123403@host.com
+DTSTAMP:19970901T1300Z
+DTSTART:19971102
+SUMMARY:Our Blissful Anniversary
+CLASS:CONFIDENTIAL
+CATEGORIES:ANNIVERSARY,PERSONAL,SPECIAL OCCASION
+RRULE:FREQ=YEARLY
+END:VEVENT
+
+BEGIN:VTODO
+UID:19970901T130000Z-123404@host.com
+DTSTAMP:19970901T1300Z
+DTSTART:19970415T133000Z
+DUE:19970416T045959Z
+SUMMARY:1996 Income Tax Preparation
+CLASS:CONFIDENTIAL
+CATEGORIES:FAMILY,FINANCE
+PRIORITY:1
+STATUS:NEEDS-ACTION
+END:VTODO
+BEGIN:VJOURNAL
+UID:19970901T130000Z-123405@host.com
+DTSTAMP:19970901T1300Z
+DTSTART;VALUE=DATE:19970317
+SUMMARY:Staff meeting minutes
+DESCRIPTION:1. Staff meeting: Participants include Joe\, Lisa
+ and Bob. Aurora project plans were reviewed. There is currently
+ no budget reserves for this project. Lisa will escalate to
+ management. Next meeting on Tuesday.\n
+ 2. Telephone Conference: ABC Corp. sales representative called
+ to discuss new printer. Promised to get us a demo by Friday.\n
+ 3. Henry Miller (Handsoff Insurance): Car was totaled by tree.
+ Is looking into a loaner car. 654-2323 (tel).
+END:VJOURNAL
+BEGIN:VFREEBUSY
+ORGANIZER:MAILTO:jane_doe@host1.com
+ATTENDEE:MAILTO:john_public@host2.com
+DTSTART:19971015T050000Z
+DTEND:19971016T050000Z
+DTSTAMP:19970901T083000Z
+END:VFREEBUSY
+BEGIN:VFREEBUSY
+ORGANIZER:MAILTO:jane_doe@host1.com
+ATTENDEE:MAILTO:john_public@host2.com
+DTSTAMP:19970901T100000Z
+FREEBUSY;VALUE=PERIOD:19971015T050000Z/PT8H30M,
+ 19971015T160000Z/PT5H30M,19971015T223000Z/PT6H30M
+URL:http://host2.com/pub/busy/jpublic-01.ifb
+COMMENT:This iCalendar file contains busy time information for
+ the next three months.
+END:VFREEBUSY
+BEGIN:VFREEBUSY
+ORGANIZER:jsmith@host.com
+DTSTART:19980313T141711Z
+DTEND:19980410T141711Z
+FREEBUSY:19980314T233000Z/19980315T003000Z
+FREEBUSY:19980316T153000Z/19980316T163000Z
+FREEBUSY:19980318T030000Z/19980318T040000Z
+URL:http://www.host.com/calendar/busytime/jsmith.ifb
+END:VFREEBUSY
+BEGIN:VTIMEZONE
+TZID:US-Eastern
+LAST-MODIFIED:19870101T000000Z
+BEGIN:STANDARD
+DTSTART:19971026T020000
+RDATE:19971026T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19971026T020000
+RDATE:19970406T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VTIMEZONE
+TZID:US-Eastern
+LAST-MODIFIED:19870101T000000Z
+TZURL:http://zones.stds_r_us.net/tz/US-Eastern
+BEGIN:STANDARD
+DTSTART:19671029T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19870405T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VTIMEZONE
+TZID:US--Fictitious-Eastern
+LAST-MODIFIED:19870101T000000Z
+BEGIN:STANDARD
+DTSTART:19671029T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19870405T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4;UNTIL=19980404T070000Z
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VTIMEZONE
+TZID:US--Fictitious-Eastern
+LAST-MODIFIED:19870101T000000Z
+BEGIN:STANDARD
+DTSTART:19671029T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19870405T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4;UNTIL=19980404T070000Z
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+DTSTART:19990424T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=4
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VALARM
+TRIGGER;VALUE=DATE-TIME:19970317T133000Z
+REPEAT:4
+DURATION:PT15M
+ACTION:AUDIO
+ATTACH;FMTTYPE=audio/basic:ftp://host.com/pub/sounds/bell-01.aud
+END:VALARM
+BEGIN:VALARM
+TRIGGER:-PT30M
+REPEAT:2
+DURATION:PT15M
+ACTION:DISPLAY
+DESCRIPTION:Breakfast meeting with executive\n
+ team at 8:30 AM EST.
+END:VALARM
+BEGIN:VALARM
+TRIGGER:-P2D
+ACTION:EMAIL
+ATTENDEE:MAILTO:john_doe@host.com
+SUMMARY:*** REMINDER: SEND AGENDA FOR WEEKLY STAFF MEETING ***
+DESCRIPTION:A draft agenda needs to be sent out to the attendees
+ to the weekly managers meeting (MGR-LIST). Attached is a
+ pointer the document template for the agenda file.
+ATTACH;FMTTYPE=application/binary:http://host.com/templates/agen
+ da.doc
+END:VALARM
+BEGIN:VALARM
+TRIGGER;VALUE=DATE-TIME:19980101T050000Z
+REPEAT:23
+DURATION:PT1H
+ACTION:PROCEDURE
+ATTACH;FMTTYPE=application/binary:ftp://host.com/novo-
+ procs/felizano.exe
+END:VALARM
+BEGIN:VCALENDAR
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:US-Eastern
+BEGIN:STANDARD
+DTSTART:19981025T020000
+RDATE:19981025T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19990404T020000
+RDATE:19990404T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:19980309T231000Z
+UID:guid-1.host1.com
+ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com
+ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:
+ MAILTO:employee-A@host.com
+DESCRIPTION:Project XYZ Review Meeting
+CATEGORIES:MEETING
+CLASS:PUBLIC
+CREATED:19980309T130000Z
+SUMMARY:XYZ Project Review
+DTSTART;TZID=US-Eastern:19980312T083000
+DTEND;TZID=US-Eastern:19980312T093000
+LOCATION:1CP Conference Room 4350
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:xyz
+VERSION:2.0
+PRODID:-//ABC Corporation//NONSGML My Product//EN
+BEGIN:VEVENT
+DTSTAMP:19970324T1200Z
+SEQUENCE:0
+UID:uid3@host1.com
+ORGANIZER:MAILTO:jdoe@host1.com
+ATTENDEE;RSVP=TRUE:MAILTO:jsmith@host1.com
+DTSTART:19970324T123000Z
+DTEND:19970324T210000Z
+CATEGORIES:MEETING,PROJECT
+CLASS:PUBLIC
+SUMMARY:Calendaring Interoperability Planning Meeting
+DESCRIPTION:Discuss how we can test c&s interoperability\n
+ using iCalendar and other IETF standards.
+LOCATION:LDB Lobby
+ATTACH;FMTTYPE=application/postscript:ftp://xyzCorp.com/pub/
+ conf/bkgrnd.ps
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//ABC Corporation//NONSGML My Product//EN
+BEGIN:VTODO
+DTSTAMP:19980130T134500Z
+SEQUENCE:2
+UID:uid4@host1.com
+ORGANIZER:MAILTO:unclesam@us.gov
+ATTENDEE;PARTSTAT=ACCEPTED:MAILTO:jqpublic@host.com
+DUE:19980415T235959
+STATUS:NEEDS-ACTION
+SUMMARY:Submit Income Taxes
+BEGIN:VALARM
+ACTION:AUDIO
+TRIGGER;VALUE=DATE-TIME:19980403T120000Z
+ATTACH;FMTTYPE=audio/basic:http://host.com/pub/audio-
+ files/ssbanner.aud
+REPEAT:4
+DURATION:PT1H
+END:VALARM
+END:VTODO
+END:VCALENDAR
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//ABC Corporation//NONSGML My Product//EN
+BEGIN:VJOURNAL
+DTSTAMP:19970324T120000Z
+UID:uid5@host1.com
+ORGANIZER:MAILTO:jsmith@host.com
+STATUS:DRAFT
+CLASS:PUBLIC
+CATEGORIES:Project Report, XYZ, Weekly Meeting
+DESCRIPTION:Project xyz Review Meeting Minutes\n
+ Agenda\n1. Review of project version 1.0 requirements.\n2.
+ Definition of project processes.\n3. Review of project schedule.\n
+ Participants: John Smith, Jane Doe, Jim Dandy\n-It was
+ decided that the requirements need to be signed off by
+ product marketing.\n-Project processes were accepted.\n
+ -Project schedule needs to account for scheduled holidays
+ and employee vacation time. Check with HR for specific
+ dates.\n-New schedule will be distributed by Friday.\n-
+ Next weeks meeting is cancelled. No meeting until 3/23.
+END:VJOURNAL
+END:VCALENDAR
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//RDU Software//NONSGML HandCal//EN
+BEGIN:VFREEBUSY
+ORGANIZER:MAILTO:jsmith@host.com
+DTSTART:19980313T141711Z
+DTEND:19980410T141711Z
+FREEBUSY:19980314T233000Z/19980315T003000Z
+FREEBUSY:19980316T153000Z/19980316T163000Z
+FREEBUSY:19980318T030000Z/19980318T040000Z
+URL:http://www.host.com/calendar/busytime/jsmith.ifb
+END:VFREEBUSY
+END:VCALENDAR
+END:VCALENDAR \ No newline at end of file
diff --git a/libical/test-data/2446.ics b/libical/test-data/2446.ics
new file mode 100644
index 0000000000..679f6c7920
--- /dev/null
+++ b/libical/test-data/2446.ics
@@ -0,0 +1,1007 @@
+BEGIN:VCALENDAR
+X-LIC-CLUSTERCOUNT
+ :0
+DTSTART
+ :00000000T000000
+DTEND
+ :00000000T000000
+BEGIN:VCALENDAR
+METHOD:PUBLISH
+PRODID:-//ACME/DesktopCalendar//EN
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:mailto:a@example.com
+DTSTART:19970701T200000Z
+DTSTAMP:19970611T190000Z
+SUMMARY:ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
+UID:0981234-1234234-23@example.com
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:PUBLISH
+VERSION:2.0
+PRODID:-//ACME/DesktopCalendar//EN
+BEGIN:VEVENT
+ORGANIZER:mailto:a@example.com
+DTSTAMP:19970612T190000Z
+DTSTART:19970701T210000Z
+DTEND:19970701T230000Z
+SEQUENCE:1
+UID:0981234-1234234-23@example.com
+SUMMARY:ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:CANCEL
+VERSION:2.0
+PRODID:-//ACME/DesktopCalendar//EN
+BEGIN:VEVENT
+ORGANIZER:mailto:a@example.com
+COMMENT:DUKES forfeit the game
+SEQUENCE:2
+UID:0981234-1234234-23@example.com
+DTSTAMP:19970613T190000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:PUBLISH
+SCALE:GREGORIAN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:America-Chicago
+TZURL:http://zones.stds_r_us.net/tz/America-Chicago
+BEGIN:STANDARD
+DTSTART:19671029T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19870405T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+ORGANIZER:mailto:a@example.com
+ATTACH:http://www.dukes.com/
+CATEGORIES:SPORTS EVENT,ENTERTAINMENT
+CLASS:PRIVATE
+DESCRIPTION:MIDWAY STADIUM\n
+ Big time game. MUST see.\n
+ Expected duration:2 hours\n
+DTEND;TZID=America-Chicago:19970701T180000
+DTSTART;TZID=America-Chicago:19970702T160000
+DTSTAMP:19970614T190000Z
+STATUS:CONFIRMED
+LOCATION;VALUE=URI:http://www.midwaystadium.com/
+PRIORITY:2
+RESOURCES:SCOREBOARD
+SEQUENCE:3
+SUMMARY:ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
+UID:0981234-1234234-23@example.com
+RELATED-TO:0981234-1234234-14@example.com
+BEGIN:VALARM
+TRIGGER:-PT2H
+ACTION:DISPLAY
+DESCRIPTION:You should be leaving for the game now.
+END:VALARM
+BEGIN:VALARM
+TRIGGER:-PT30M
+ACTION:AUDIO
+END:VALARM
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:PUBLISH
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:mailto:a@example.com
+DTSTAMP:19970614T190000Z
+UID:0981234-1234234-23@example.com
+DTSTART;VALUE=DATE:19970714
+RRULE:FREQ=YEARLY;INTERVAL=1
+SUMMARY: Bastille Day
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;CN=BIG A:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=B:Mailto:B@example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=C:Mailto:C@example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal:Mailto:D@example.com
+ATTENDEE;RSVP=FALSE;CUTYPE=ROOM:conf_Big@example.com
+ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE:Mailto:E@example.com
+DTSTAMP:19970611T190000Z
+DTSTART:19970701T200000Z
+DTEND:19970701T2000000Z
+SUMMARY:Conference
+UID:calsrv.example.com-873970198738777@example.com
+SEQUENCE:0
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REPLY
+VERSION:2.0
+BEGIN:VEVENT
+ATTENDEE;PARTSTAT=ACCEPTED:Mailto:B@example.com
+ORGANIZER:MAILTO:A@example.com
+UID:calsrv.example.com-873970198738777@example.com
+SEQUENCE:0
+REQUEST-STATUS:2.0;Success
+DTSTAMP:19970612T190000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:C@example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal:Mailto:D@example.com
+ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE;
+ CUTYPE=ROOM:Mailto:Conf@example.com
+ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE:Mailto:E@example.com
+DTSTART:19970701T180000Z
+DTEND:19970701T190000Z
+SUMMARY:Phone Conference
+UID:calsrv.example.com-873970198738777@example.com
+SEQUENCE:1
+DTSTAMP:19970613T190000Z
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:C@example.com
+DTSTART:19970701T190000Z
+DTEND:19970701T200000Z
+SUMMARY:Discuss the Merits of the election results
+LOCATION:Green Conference Room
+UID:calsrv.example.com-873970198738777a@example.com
+SEQUENCE:0
+DTSTAMP:19970611T190000Z
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:COUNTER
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:C@example.com
+DTSTART:19970701T160000Z
+DTEND:19970701T190000Z
+DTSTAMP:19970612T190000Z
+SUMMARY:Discuss the Merits of the election results
+LOCATION:Green Conference Room
+COMMENT:This time works much better and I think the big conference
+ room is too big
+UID:calsrv.example.com-873970198738777a@example.com
+SEQUENCE:0
+DTSTAMP:19970611T190000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:C@example.com
+DTSTAMP:19970613T190000Z
+DTSTART:19970701T160000Z
+DTEND:19970701T190000Z
+SUMMARY:Discuss the Merits of the election results - changed to
+ meet B's schedule
+LOCATION:Green Conference Room
+UID:calsrv.example.com-873970198738777@example.com
+SEQUENCE:1
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:DECLINECOUNTER
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com
+COMMENT:Sorry, I cannot change this meeting time
+UID:calsrv.example.com-873970198738777@example.com
+SEQUENCE:0
+DTSTAMP:19970614T190000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REPLY
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:MAILTO:A@Example.com
+ATTENDEE;PARTSTAT=DELEGATED;DELEGATED-
+ TO="Mailto:E@example.com":Mailto:C@example.com
+UID:calsrv.example.com-873970198738777@example.com
+SEQUENCE:0
+REQUEST-STATUS:2.0;Success
+DTSTAMP:19970611T190000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;PARTSTAT=DELEGATED;DELEGATED-
+ TO="Mailto:E@example.com":Mailto:C@example.com
+ATTENDEE;RSVP=TRUE;
+ DELEGATED-FROM="Mailto:C@example.com":Mailto:E@example.com
+DTSTART:19970701T180000Z
+DTEND:19970701T200000Z
+SUMMARY:Phone Conference
+UID:calsrv.example.com-873970198738777@example.com
+SEQUENCE:0
+STATUS:CONFIRMED
+DTSTAMP:19970611T190000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REPLY
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:MAILTO:A@Example.com
+ATTENDEE;PARTSTAT=ACCEPTED;DELEGATED-
+ FROM="Mailto:C@example.com":Mailto:E@example.com
+ATTENDEE;PARTSTAT=DELEGATED;
+ DELEGATED-TO="Mailto:E@example.com":Mailto:C@example.com
+UID:calsrv.example.com-873970198738777@example.com
+SEQUENCE:0
+REQUEST-STATUS:2.0;Success
+DTSTAMP:19970614T190000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REPLY
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:MAILTO:A@Example.com
+ATTENDEE;PARTSTAT=DELEGATED;
+ DELEGATED-TO="Mailto:E@example.com":Mailto:C@example.com
+ATTENDEE;PARTSTAT=DECLINED;
+ DELEGATED-FROM="Mailto:C@example.com":Mailto:E@example.com
+COMMENT:Sorry, I will be out of town at that time.
+UID:calsrv.example.com-873970198738777@example.com
+SEQUENCE:0
+REQUEST-STATUS:2.0;Success
+DTSTAMP:19970614T190000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:MAILTO:A@Example.com
+ATTENDEE;PARTSTAT=DECLINED;
+ DELEGATED-FROM="Mailto:C@example.com":Mailto:E@example.com
+ATTENDEE;RSVP=TRUE:Mailto:C@example.com
+UID:calsrv.example.com-873970198738777@example.com
+SEQUENCE:0
+SUMMARY:Phone Conference
+DTSTART:19970701T180000Z
+DTEND:19970701T200000Z
+DTSTAMP:19970614T200000Z
+COMMENT:DELEGATE (ATTENDEE Mailto:E@example.com) DECLINED YOUR
+ INVITATION
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:CANCEL
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:A@example.com
+ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:B@example.com
+ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:C@example.com
+ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:D@example.com
+COMMENT:Mr. B cannot attend. It's raining. Lets cancel.
+UID:calsrv.example.com-873970198738777@example.com
+SEQUENCE:1
+STATUS:CANCELLED
+DTSTAMP:19970613T190000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:CANCEL
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:Mailto:A@example.com
+ATTENDEE:mailto:B@example.com
+COMMENT:You're off the hook for this meeting
+UID:calsrv.example.com-873970198738777@example.com
+DTSTAMP:19970613T193000Z
+SEQUENCE:1
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:C@example.com
+ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:D@example.com
+ATTENDEE;CUTYPE=ROOM:CR_Big@example.com
+ATTENDEE;ROLE=NON-PARTICIPANT;
+ RSVP=FALSE:Mailto:E@example.com
+DTSTAMP:19970611T190000Z
+DTSTART:19970701T200000Z
+DTEND:19970701T203000Z
+SUMMARY:Phone Conference
+UID:calsrv.example.com-873970198738777@example.com
+SEQUENCE:2
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:Mailto:B@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:B@example.com
+ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:C@example.com
+ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:D@example.com
+DTSTAMP:19970611T190000Z
+DTSTART:19970701T200000Z
+DTEND:19970701T203000Z
+RRULE:FREQ=WEEKLY
+SUMMARY:Phone Conference
+UID:123456@example.com
+SEQUENCE:1
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+VERSION:2.0
+METHOD:PUBLISH
+BEGIN:VFREEBUSY
+DTSTAMP:19980101T124100Z
+ORGANIZER:MAILTO:A@Example.com
+DTSTART:19980101T124200Z
+DTEND:19980107T124200Z
+FREEBUSY:19980101T180000Z/19980101T190000Z
+FREEBUSY:19980103T020000Z/19980103T050000Z
+FREEBUSY:19980107T020000Z/19980107T050000Z
+FREEBUSY:19980113T000000Z/19980113T010000Z
+FREEBUSY:19980115T190000Z/19980115T200000Z
+FREEBUSY:19980115T220000Z/19980115T230000Z
+FREEBUSY:19980116T013000Z/19980116T043000Z
+END:VFREEBUSY
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VFREEBUSY
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR:Mailto:A@example.com
+ATTENDEE:Mailto:B@example.com
+ATTENDEE:Mailto:C@example.com
+DTSTAMP:19970613T190000Z
+DTSTART:19970701T080000Z
+DTEND:19970701T200000
+UID:calsrv.example.com-873970198738777@example.com
+END:VFREEBUSY
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REPLY
+VERSION:2.0
+BEGIN:VFREEBUSY
+ORGANIZER:MAILTO:A@example.com
+ATTENDEE:Mailto:B@example.com
+DTSTART:19970701T080000Z
+DTEND:19970701T200000Z
+UID:calsrv.example.com-873970198738777@example.com
+FREEBUSY:19970701T090000Z/PT1H,19970701T140000Z/PT30M
+DTSTAMP:19970613T190030Z
+END:VFREEBUSY
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:America-SanJose
+TZURL:http://zones.stds_r_us.net/tz/America-SanJose
+BEGIN:STANDARD
+DTSTART:19671029T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0800
+TZNAME:PST
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19870405T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+TZNAME:PDT
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;CUTYPE=INDIVIDUAL:A@example.COM
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:B@example.fr
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:c@example.jp
+DTSTAMP:19970613T190030Z
+DTSTART;TZID=America-SanJose:19970701T140000
+DTEND;TZID=America-SanJose:19970701T150000
+RRULE:FREQ=WEEKLY;INTERVAL=20;WKST=SU;BYDAY=TU
+RDATE;TZID=America-SanJose:19970910T140000
+EXDATE;TZID=America-SanJose:19970909T140000
+EXDATE;TZID=America-SanJose:19971028T140000
+SUMMARY:Weekly Phone Conference
+UID:calsrv.example.com-873970198738777@example.com
+SEQUENCE:0
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:REQUEST
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:guid-1@host1.com
+SEQUENCE:0
+RRULE:FREQ=MONTHLY;BYMONTHDAY=1;UNTIL=19980901T210000Z
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE:Mailto:B@example.com
+ATTENDEE:Mailto:C@example.com
+ATTENDEE:Mailto:D@example.com
+DESCRIPTION:IETF-C&S Conference Call
+CLASS:PUBLIC
+SUMMARY:IETF Calendaring Working Group Meeting
+DTSTART:19970601T210000Z
+DTEND:19970601T220000Z
+LOCATION:Conference Call
+DTSTAMP:19970526T083000Z
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:REQUEST
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:guid-1@host1com
+RECURRENCE-ID:19970701T210000Z
+SEQUENCE:1
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE:Mailto:B@example.com
+ATTENDEE:Mailto:C@example.com
+ATTENDEE:Mailto:D@example.com
+DESCRIPTION:IETF-C&S Conference Call
+CLASS:PUBLIC
+SUMMARY:IETF Calendaring Working Group Meeting
+DTSTART:19970703T210000Z
+DTEND:19970703T220000Z
+LOCATION:Conference Call
+DTSTAMP:19970626T093000Z
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:CANCEL
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:guid-1@host1.com
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE:Mailto:B@example.com
+ATTENDEE:Mailto:C@example.com
+ATTENDEE:Mailto:D@example.com
+RECURRENCE-ID:19970801T210000Z
+SEQUENCE:2
+STATUS:CANCELLED
+DTSTAMP:19970721T093000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:CANCEL
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:guid-1@host1.com
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE:Mailto:B@example.com
+ATTENDEE:Mailto:C@example.com
+ATTENDEE:Mailto:D@example.com
+DTSTAMP:19970721T103000Z
+STATUS:CANCELLED
+SEQUENCE:3
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:REQUEST
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:guid-1@host1.com
+RECURRENCE-ID;RANGE=THISANDFUTURE:19970901T210000Z
+SEQUENCE:3
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE:Mailto:B@example.com
+ATTENDEE;RSVP=TRUE:Mailto:C@example.com
+ATTENDEE;RSVP=TRUE:Mailto:D@example.com
+DESCRIPTION:IETF-C&S Discussion
+CLASS:PUBLIC
+SUMMARY:IETF Calendaring Working Group Meeting
+DTSTART:19970901T210000Z
+DTEND:19970901T220000Z
+LOCATION:Building 32, Microsoft, Seattle, WA
+DTSTAMP:19970526T083000Z
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:ADD
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:123456789@host1.com
+SEQUENCE:4
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE:Mailto:B@example.com
+ATTENDEE;RSVP=TRUE:Mailto:C@example.com
+ATTENDEE;RSVP=TRUE:Mailto:D@example.com
+DESCRIPTION:IETF-C&S Conference Call
+CLASS:PUBLIC
+SUMMARY:IETF Calendaring Working Group Meeting
+DTSTART:19970715T210000Z
+DTEND:19970715T220000Z
+LOCATION:Conference Call
+DTSTAMP:19970629T093000Z
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:REQUEST
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:123456789@host1.com
+SEQUENCE:0
+RRULE:FREQ=WEEKLY;WKST=SU;BYDAY=TU
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE:Mailto:B@example.com
+SUMMARY:Review Accounts
+DTSTART:19980303T210000Z
+DTEND:19980303T220000Z
+LOCATION:The White Room
+DTSTAMP:19980301T093000Z
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:ADD
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:123456789@host1.com
+SEQUENCE:7
+RRULE:WKST=SU;BYDAY=TH;FREQ=WEEKLY
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE:Mailto:B@example.com
+SUMMARY:Review Accounts
+DTSTART:19980303T210000Z
+DTEND:19980303T220000Z
+DTSTAMP:19980303T193000Z
+LOCATION:The Usual conference room
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:REQUEST
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:123456789@host1.com
+SEQUENCE:7
+RRULE:WKST=SU;BYDAY=TU,TH;FREQ=WEEKLY
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE:Mailto:B@example.com
+SUMMARY:Review Accounts
+DTSTART:19980303T210000Z
+DTEND:19980303T220000Z
+DTSTAMP:19980303T193000Z
+LOCATION:The White Room
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:REQUEST
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:123456789@host1.com
+SEQUENCE:0
+RDATE:19980304T180000Z
+RDATE:19980311T180000Z
+RDATE:19980318T180000Z
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE:Mailto:B@example.com
+SUMMARY:Review Accounts
+DTSTART:19980304T180000Z
+DTEND:19980304T200000Z
+DTSTAMP:19980303T193000Z
+LOCATION:Conference Room A
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:REQUEST
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:123456789@host1.com
+SEQUENCE:1
+RECURRENCE-ID:19980311T180000Z
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE:Mailto:B@example.com
+SUMMARY:Review Accounts
+DTSTART:19980311T160000Z
+DTEND:19980311T180000Z
+DTSTAMP:19980306T193000Z
+LOCATION:The Small conference room
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:ADD
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:123456789@host1.com
+SEQUENCE:2
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE:Mailto:B@example.com
+SUMMARY:Review Accounts
+DTSTART:19980315T180000Z
+DTEND:19980315T200000Z
+DTSTAMP:19980307T193000Z
+LOCATION:Conference Room A
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:REQUEST
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:123456789@host1.com
+SEQUENCE:2
+RDATE:19980304T180000Z
+RDATE:19980311T160000Z
+RDATE:19980315T180000Z
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE:Mailto:B@example.com
+SUMMARY:Review Accounts
+DTSTART:19980304T180000Z
+DTEND:19980304T200000Z
+DTSTAMP:19980303T193000Z
+LOCATION:Conference Room A
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SEQUENCE:2
+RECURRENCE-ID:19980311T160000Z
+ATTENDEE;ROLE=CHAIR;RSVP=TRUE:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE:Mailto:B@example.com
+SUMMARY:Review Accounts
+DTSTART:19980311T160000Z
+DTEND:19980304T180000Z
+DTSTAMP:19980306T193000Z
+LOCATION:The Small conference room
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:COUNTER
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:guid-1@host1.com
+RECURRENCE-ID:19970715T210000Z
+SEQUENCE:4
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;RSVP=TRUE:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE:Mailto:B@example.com
+ATTENDEE;RSVP=TRUE:Mailto:C@example.com
+ATTENDEE;RSVP=TRUE:Mailto:D@example.com
+DESCRIPTION:IETF-C&S Conference Call
+CLASS:PUBLIC
+SUMMARY:IETF Calendaring Working Group Meeting
+DTSTART:19970715T220000Z
+DTEND:19970715T230000Z
+LOCATION:Conference Call
+COMMENT:May we bump this by an hour? I have a conflict
+DTSTAMP:19970629T094000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:REQUEST
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:guid-1@host1.com
+SEQUENCE:0
+RRULE:FREQ=MONTHLY;BYMONTHDAY=1
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE:Mailto:B@example.com
+ATTENDEE;RSVP=TRUE:Mailto:C@example.com
+ATTENDEE;RSVP=TRUE:Mailto:D@example.com
+DESCRIPTION:IETF-C&S Conference Call
+CLASS:PUBLIC
+SUMMARY:IETF Calendaring Working Group Meeting
+DTSTART:19970601T210000Z
+DTEND:19970601T220000Z
+DTSTAMP:19970602T094000Z
+LOCATION:Conference Call
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//RDU Software//NONSGML HandCal//EN
+METHOD:REPLY
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:Mailto:A@example.com
+ATTENDEE:Mailto:B@example.com
+REQUEST-STATUS:2.8;Repeating event ignored. Scheduled as a single
+ event;RRULE
+REQUEST-STATUS:3.0;Invalid Property Name;FOO
+UID:guid-1@host1.com
+SEQUENCE:0
+DTSTAMP:19970603T094000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VTODO
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE:Mailto:B@example.com
+ATTENDEE;RSVP=TRUE:Mailto:C@example.com
+ATTENDEE;RSVP=TRUE:Mailto:D@example.com
+DTSTART:19970701T170000Z
+DUE:19970722T170000Z
+PRIORITY:1
+SUMMARY:Create the requirements document
+UID:calsrv.example.com-873970198738777-00@example.com
+SEQUENCE:0
+DTSTAMP:19970717T200000Z
+STATUS:Needs Action
+END:VTODO
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REPLY
+VERSION:2.0
+BEGIN:VTODO
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;PARTSTAT=ACCEPTED:Mailto:B@example.com
+UID:calsrv.example.com-873970198738777-00@example.com
+COMMENT:I'll send you my input by e-mail
+SEQUENCE:0
+DTSTAMP:19970717T203000Z
+REQUEST-STATUS:2.0;Success
+END:VTODO
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VTODO
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:D@example.com
+UID:calsrv.example.com-873970198738777-00@example.com
+SUMMARY:Create the requirements document
+PRIORITY:1
+SEQUENCE:0
+STATUS:IN-PROCESS
+DTSTART:19970701T170000Z
+DTSTAMP:19970717T230000Z
+END:VTODO
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REPLY
+VERSION:2.0
+BEGIN:VTODO
+ORGANIZER:MAILTO:A@example.com
+ATTENDEE;PARTSTAT=IN-PROCESS:Mailto:B@example.com
+PERCENT-COMPLETE:75
+UID:calsrv.example.com-873970198738777-00@example.com
+DTSTAMP:19970717T233000Z
+SEQUENCE:0
+END:VTODO
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REPLY
+VERSION:2.0
+BEGIN:VTODO
+ORGANIZER:MAILTO:A@example.com
+ATTENDEE;PARTSTAT=COMPLETED:Mailto:D@example.com
+UID:calsrv.example.com-873970198738777-00@example.com
+DTSTAMP:19970717T233000Z
+SEQUENCE:0
+END:VTODO
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VTODO
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE;PARTSTAT=ACCEPTED;CUTYPE=INDIVIDUAL:Mailto:B@example.com
+ATTENDEE;PARTSTAT=IN-PROCESS;CUTYPE=INDIVIDUAL:Mailto:D@example.com
+DTSTART:19970701T170000Z
+DUE:19970722T170000Z
+PRIORITY:1
+SUMMARY:Create the requirements document
+UID:calsrv.example.com-873970198738777-00@example.com
+SEQUENCE:1
+DTSTAMP:19970718T100000Z
+STATUS:IN-PROGRESS
+PERCENT-COMPLETE:40
+END:VTODO
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VTODO
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:D@example.com
+RRULE:FREQ=MONTHLY;COUNT=10;BYDAY=1FR
+DTSTART:19980101T100000
+DUE:19980103T100000
+SUMMARY:Send Status Reports to Area Managers
+UID:calsrv.example.com-873970198738777-00@example.com
+SEQUENCE:0
+DTSTAMP:19970717T200000Z
+STATUS:NEEDS ACTION
+PRIORITY:1
+END:VTODO
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REPLY
+VERSION:2.0
+BEGIN:VTODO
+ATTENDEE;PARTSTAT=IN-PROCESS:Mailto:B@example.com
+PERCENT-COMPLETE:75
+UID:calsrv.example.com-873970198738777-00@example.com
+DTSTAMP:19970717T233000Z
+RECURRENCE-ID:19980101T170000Z
+SEQUENCE:1
+END:VTODO
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:PUBLISH
+PRODID:-//ACME/DesktopCalendar//EN
+VERSION:2.0
+BEGIN:VJOURNAL
+DTSTART:19971002T200000Z
+ORGANIZER:MAILTO:A@Example.com
+SUMMARY:Phone conference minutes
+DESCRIPTION:The editors meeting was held on October 1, 1997.
+ Details are in the attached document.
+UID:0981234-1234234-2410@example.com
+RELATED-TO:0981234-1234234-2402-35@example.com
+ATTACH:ftp://ftp.example.com/pub/ed/minutes100197.txt
+END:VJOURNAL
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//RDU Software//NONSGML HandCal//EN
+METHOD:REFRESH
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE:Mailto:B@example.com
+ATTENDEE:Mailto:C@example.com
+ATTENDEE:Mailto:D@example.com
+UID: guid-1-12345@host1.com
+DTSTAMP:19970603T094000
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:REQUEST
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:acme-12345@host1.com
+SEQUENCE:3
+RRULE:FREQ=WEEKLY
+RDATE;VALUE=PERIOD:19970819T210000Z/199700819T220000Z
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE:Mailto:B@example.com
+DESCRIPTION:IETF-C&S Conference Call
+SUMMARY:IETF Calendaring Working Group Meeting
+DTSTART:19970801T210000Z
+DTEND:19970801T220000Z
+RECURRENCE-ID:19970809T210000Z
+DTSTAMP:19970726T083000
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//RDU Software//NONSGML HandCal//EN
+METHOD:REFRESH
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:Mailto:A@example.com
+ATTENDEE:Mailto:B@example.com
+UID:acme-12345@host1.com
+DTSTAMP:19970603T094000
+END:VEVENT
+END:VCALENDAR
+END:VCALENDAR \ No newline at end of file
diff --git a/libical/test-data/2446.vcd b/libical/test-data/2446.vcd
new file mode 100644
index 0000000000..679f6c7920
--- /dev/null
+++ b/libical/test-data/2446.vcd
@@ -0,0 +1,1007 @@
+BEGIN:VCALENDAR
+X-LIC-CLUSTERCOUNT
+ :0
+DTSTART
+ :00000000T000000
+DTEND
+ :00000000T000000
+BEGIN:VCALENDAR
+METHOD:PUBLISH
+PRODID:-//ACME/DesktopCalendar//EN
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:mailto:a@example.com
+DTSTART:19970701T200000Z
+DTSTAMP:19970611T190000Z
+SUMMARY:ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
+UID:0981234-1234234-23@example.com
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:PUBLISH
+VERSION:2.0
+PRODID:-//ACME/DesktopCalendar//EN
+BEGIN:VEVENT
+ORGANIZER:mailto:a@example.com
+DTSTAMP:19970612T190000Z
+DTSTART:19970701T210000Z
+DTEND:19970701T230000Z
+SEQUENCE:1
+UID:0981234-1234234-23@example.com
+SUMMARY:ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:CANCEL
+VERSION:2.0
+PRODID:-//ACME/DesktopCalendar//EN
+BEGIN:VEVENT
+ORGANIZER:mailto:a@example.com
+COMMENT:DUKES forfeit the game
+SEQUENCE:2
+UID:0981234-1234234-23@example.com
+DTSTAMP:19970613T190000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:PUBLISH
+SCALE:GREGORIAN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:America-Chicago
+TZURL:http://zones.stds_r_us.net/tz/America-Chicago
+BEGIN:STANDARD
+DTSTART:19671029T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19870405T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+ORGANIZER:mailto:a@example.com
+ATTACH:http://www.dukes.com/
+CATEGORIES:SPORTS EVENT,ENTERTAINMENT
+CLASS:PRIVATE
+DESCRIPTION:MIDWAY STADIUM\n
+ Big time game. MUST see.\n
+ Expected duration:2 hours\n
+DTEND;TZID=America-Chicago:19970701T180000
+DTSTART;TZID=America-Chicago:19970702T160000
+DTSTAMP:19970614T190000Z
+STATUS:CONFIRMED
+LOCATION;VALUE=URI:http://www.midwaystadium.com/
+PRIORITY:2
+RESOURCES:SCOREBOARD
+SEQUENCE:3
+SUMMARY:ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
+UID:0981234-1234234-23@example.com
+RELATED-TO:0981234-1234234-14@example.com
+BEGIN:VALARM
+TRIGGER:-PT2H
+ACTION:DISPLAY
+DESCRIPTION:You should be leaving for the game now.
+END:VALARM
+BEGIN:VALARM
+TRIGGER:-PT30M
+ACTION:AUDIO
+END:VALARM
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:PUBLISH
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:mailto:a@example.com
+DTSTAMP:19970614T190000Z
+UID:0981234-1234234-23@example.com
+DTSTART;VALUE=DATE:19970714
+RRULE:FREQ=YEARLY;INTERVAL=1
+SUMMARY: Bastille Day
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;CN=BIG A:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=B:Mailto:B@example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=C:Mailto:C@example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal:Mailto:D@example.com
+ATTENDEE;RSVP=FALSE;CUTYPE=ROOM:conf_Big@example.com
+ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE:Mailto:E@example.com
+DTSTAMP:19970611T190000Z
+DTSTART:19970701T200000Z
+DTEND:19970701T2000000Z
+SUMMARY:Conference
+UID:calsrv.example.com-873970198738777@example.com
+SEQUENCE:0
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REPLY
+VERSION:2.0
+BEGIN:VEVENT
+ATTENDEE;PARTSTAT=ACCEPTED:Mailto:B@example.com
+ORGANIZER:MAILTO:A@example.com
+UID:calsrv.example.com-873970198738777@example.com
+SEQUENCE:0
+REQUEST-STATUS:2.0;Success
+DTSTAMP:19970612T190000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:C@example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal:Mailto:D@example.com
+ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE;
+ CUTYPE=ROOM:Mailto:Conf@example.com
+ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE:Mailto:E@example.com
+DTSTART:19970701T180000Z
+DTEND:19970701T190000Z
+SUMMARY:Phone Conference
+UID:calsrv.example.com-873970198738777@example.com
+SEQUENCE:1
+DTSTAMP:19970613T190000Z
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:C@example.com
+DTSTART:19970701T190000Z
+DTEND:19970701T200000Z
+SUMMARY:Discuss the Merits of the election results
+LOCATION:Green Conference Room
+UID:calsrv.example.com-873970198738777a@example.com
+SEQUENCE:0
+DTSTAMP:19970611T190000Z
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:COUNTER
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:C@example.com
+DTSTART:19970701T160000Z
+DTEND:19970701T190000Z
+DTSTAMP:19970612T190000Z
+SUMMARY:Discuss the Merits of the election results
+LOCATION:Green Conference Room
+COMMENT:This time works much better and I think the big conference
+ room is too big
+UID:calsrv.example.com-873970198738777a@example.com
+SEQUENCE:0
+DTSTAMP:19970611T190000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:C@example.com
+DTSTAMP:19970613T190000Z
+DTSTART:19970701T160000Z
+DTEND:19970701T190000Z
+SUMMARY:Discuss the Merits of the election results - changed to
+ meet B's schedule
+LOCATION:Green Conference Room
+UID:calsrv.example.com-873970198738777@example.com
+SEQUENCE:1
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:DECLINECOUNTER
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com
+COMMENT:Sorry, I cannot change this meeting time
+UID:calsrv.example.com-873970198738777@example.com
+SEQUENCE:0
+DTSTAMP:19970614T190000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REPLY
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:MAILTO:A@Example.com
+ATTENDEE;PARTSTAT=DELEGATED;DELEGATED-
+ TO="Mailto:E@example.com":Mailto:C@example.com
+UID:calsrv.example.com-873970198738777@example.com
+SEQUENCE:0
+REQUEST-STATUS:2.0;Success
+DTSTAMP:19970611T190000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;PARTSTAT=DELEGATED;DELEGATED-
+ TO="Mailto:E@example.com":Mailto:C@example.com
+ATTENDEE;RSVP=TRUE;
+ DELEGATED-FROM="Mailto:C@example.com":Mailto:E@example.com
+DTSTART:19970701T180000Z
+DTEND:19970701T200000Z
+SUMMARY:Phone Conference
+UID:calsrv.example.com-873970198738777@example.com
+SEQUENCE:0
+STATUS:CONFIRMED
+DTSTAMP:19970611T190000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REPLY
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:MAILTO:A@Example.com
+ATTENDEE;PARTSTAT=ACCEPTED;DELEGATED-
+ FROM="Mailto:C@example.com":Mailto:E@example.com
+ATTENDEE;PARTSTAT=DELEGATED;
+ DELEGATED-TO="Mailto:E@example.com":Mailto:C@example.com
+UID:calsrv.example.com-873970198738777@example.com
+SEQUENCE:0
+REQUEST-STATUS:2.0;Success
+DTSTAMP:19970614T190000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REPLY
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:MAILTO:A@Example.com
+ATTENDEE;PARTSTAT=DELEGATED;
+ DELEGATED-TO="Mailto:E@example.com":Mailto:C@example.com
+ATTENDEE;PARTSTAT=DECLINED;
+ DELEGATED-FROM="Mailto:C@example.com":Mailto:E@example.com
+COMMENT:Sorry, I will be out of town at that time.
+UID:calsrv.example.com-873970198738777@example.com
+SEQUENCE:0
+REQUEST-STATUS:2.0;Success
+DTSTAMP:19970614T190000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:MAILTO:A@Example.com
+ATTENDEE;PARTSTAT=DECLINED;
+ DELEGATED-FROM="Mailto:C@example.com":Mailto:E@example.com
+ATTENDEE;RSVP=TRUE:Mailto:C@example.com
+UID:calsrv.example.com-873970198738777@example.com
+SEQUENCE:0
+SUMMARY:Phone Conference
+DTSTART:19970701T180000Z
+DTEND:19970701T200000Z
+DTSTAMP:19970614T200000Z
+COMMENT:DELEGATE (ATTENDEE Mailto:E@example.com) DECLINED YOUR
+ INVITATION
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:CANCEL
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:A@example.com
+ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:B@example.com
+ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:C@example.com
+ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:D@example.com
+COMMENT:Mr. B cannot attend. It's raining. Lets cancel.
+UID:calsrv.example.com-873970198738777@example.com
+SEQUENCE:1
+STATUS:CANCELLED
+DTSTAMP:19970613T190000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:CANCEL
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:Mailto:A@example.com
+ATTENDEE:mailto:B@example.com
+COMMENT:You're off the hook for this meeting
+UID:calsrv.example.com-873970198738777@example.com
+DTSTAMP:19970613T193000Z
+SEQUENCE:1
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:C@example.com
+ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:D@example.com
+ATTENDEE;CUTYPE=ROOM:CR_Big@example.com
+ATTENDEE;ROLE=NON-PARTICIPANT;
+ RSVP=FALSE:Mailto:E@example.com
+DTSTAMP:19970611T190000Z
+DTSTART:19970701T200000Z
+DTEND:19970701T203000Z
+SUMMARY:Phone Conference
+UID:calsrv.example.com-873970198738777@example.com
+SEQUENCE:2
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:Mailto:B@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:B@example.com
+ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:C@example.com
+ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:D@example.com
+DTSTAMP:19970611T190000Z
+DTSTART:19970701T200000Z
+DTEND:19970701T203000Z
+RRULE:FREQ=WEEKLY
+SUMMARY:Phone Conference
+UID:123456@example.com
+SEQUENCE:1
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+VERSION:2.0
+METHOD:PUBLISH
+BEGIN:VFREEBUSY
+DTSTAMP:19980101T124100Z
+ORGANIZER:MAILTO:A@Example.com
+DTSTART:19980101T124200Z
+DTEND:19980107T124200Z
+FREEBUSY:19980101T180000Z/19980101T190000Z
+FREEBUSY:19980103T020000Z/19980103T050000Z
+FREEBUSY:19980107T020000Z/19980107T050000Z
+FREEBUSY:19980113T000000Z/19980113T010000Z
+FREEBUSY:19980115T190000Z/19980115T200000Z
+FREEBUSY:19980115T220000Z/19980115T230000Z
+FREEBUSY:19980116T013000Z/19980116T043000Z
+END:VFREEBUSY
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VFREEBUSY
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR:Mailto:A@example.com
+ATTENDEE:Mailto:B@example.com
+ATTENDEE:Mailto:C@example.com
+DTSTAMP:19970613T190000Z
+DTSTART:19970701T080000Z
+DTEND:19970701T200000
+UID:calsrv.example.com-873970198738777@example.com
+END:VFREEBUSY
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REPLY
+VERSION:2.0
+BEGIN:VFREEBUSY
+ORGANIZER:MAILTO:A@example.com
+ATTENDEE:Mailto:B@example.com
+DTSTART:19970701T080000Z
+DTEND:19970701T200000Z
+UID:calsrv.example.com-873970198738777@example.com
+FREEBUSY:19970701T090000Z/PT1H,19970701T140000Z/PT30M
+DTSTAMP:19970613T190030Z
+END:VFREEBUSY
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:America-SanJose
+TZURL:http://zones.stds_r_us.net/tz/America-SanJose
+BEGIN:STANDARD
+DTSTART:19671029T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0800
+TZNAME:PST
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19870405T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+TZNAME:PDT
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;CUTYPE=INDIVIDUAL:A@example.COM
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:B@example.fr
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:c@example.jp
+DTSTAMP:19970613T190030Z
+DTSTART;TZID=America-SanJose:19970701T140000
+DTEND;TZID=America-SanJose:19970701T150000
+RRULE:FREQ=WEEKLY;INTERVAL=20;WKST=SU;BYDAY=TU
+RDATE;TZID=America-SanJose:19970910T140000
+EXDATE;TZID=America-SanJose:19970909T140000
+EXDATE;TZID=America-SanJose:19971028T140000
+SUMMARY:Weekly Phone Conference
+UID:calsrv.example.com-873970198738777@example.com
+SEQUENCE:0
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:REQUEST
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:guid-1@host1.com
+SEQUENCE:0
+RRULE:FREQ=MONTHLY;BYMONTHDAY=1;UNTIL=19980901T210000Z
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE:Mailto:B@example.com
+ATTENDEE:Mailto:C@example.com
+ATTENDEE:Mailto:D@example.com
+DESCRIPTION:IETF-C&S Conference Call
+CLASS:PUBLIC
+SUMMARY:IETF Calendaring Working Group Meeting
+DTSTART:19970601T210000Z
+DTEND:19970601T220000Z
+LOCATION:Conference Call
+DTSTAMP:19970526T083000Z
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:REQUEST
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:guid-1@host1com
+RECURRENCE-ID:19970701T210000Z
+SEQUENCE:1
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE:Mailto:B@example.com
+ATTENDEE:Mailto:C@example.com
+ATTENDEE:Mailto:D@example.com
+DESCRIPTION:IETF-C&S Conference Call
+CLASS:PUBLIC
+SUMMARY:IETF Calendaring Working Group Meeting
+DTSTART:19970703T210000Z
+DTEND:19970703T220000Z
+LOCATION:Conference Call
+DTSTAMP:19970626T093000Z
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:CANCEL
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:guid-1@host1.com
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE:Mailto:B@example.com
+ATTENDEE:Mailto:C@example.com
+ATTENDEE:Mailto:D@example.com
+RECURRENCE-ID:19970801T210000Z
+SEQUENCE:2
+STATUS:CANCELLED
+DTSTAMP:19970721T093000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:CANCEL
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:guid-1@host1.com
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE:Mailto:B@example.com
+ATTENDEE:Mailto:C@example.com
+ATTENDEE:Mailto:D@example.com
+DTSTAMP:19970721T103000Z
+STATUS:CANCELLED
+SEQUENCE:3
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:REQUEST
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:guid-1@host1.com
+RECURRENCE-ID;RANGE=THISANDFUTURE:19970901T210000Z
+SEQUENCE:3
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE:Mailto:B@example.com
+ATTENDEE;RSVP=TRUE:Mailto:C@example.com
+ATTENDEE;RSVP=TRUE:Mailto:D@example.com
+DESCRIPTION:IETF-C&S Discussion
+CLASS:PUBLIC
+SUMMARY:IETF Calendaring Working Group Meeting
+DTSTART:19970901T210000Z
+DTEND:19970901T220000Z
+LOCATION:Building 32, Microsoft, Seattle, WA
+DTSTAMP:19970526T083000Z
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:ADD
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:123456789@host1.com
+SEQUENCE:4
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE:Mailto:B@example.com
+ATTENDEE;RSVP=TRUE:Mailto:C@example.com
+ATTENDEE;RSVP=TRUE:Mailto:D@example.com
+DESCRIPTION:IETF-C&S Conference Call
+CLASS:PUBLIC
+SUMMARY:IETF Calendaring Working Group Meeting
+DTSTART:19970715T210000Z
+DTEND:19970715T220000Z
+LOCATION:Conference Call
+DTSTAMP:19970629T093000Z
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:REQUEST
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:123456789@host1.com
+SEQUENCE:0
+RRULE:FREQ=WEEKLY;WKST=SU;BYDAY=TU
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE:Mailto:B@example.com
+SUMMARY:Review Accounts
+DTSTART:19980303T210000Z
+DTEND:19980303T220000Z
+LOCATION:The White Room
+DTSTAMP:19980301T093000Z
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:ADD
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:123456789@host1.com
+SEQUENCE:7
+RRULE:WKST=SU;BYDAY=TH;FREQ=WEEKLY
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE:Mailto:B@example.com
+SUMMARY:Review Accounts
+DTSTART:19980303T210000Z
+DTEND:19980303T220000Z
+DTSTAMP:19980303T193000Z
+LOCATION:The Usual conference room
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:REQUEST
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:123456789@host1.com
+SEQUENCE:7
+RRULE:WKST=SU;BYDAY=TU,TH;FREQ=WEEKLY
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE:Mailto:B@example.com
+SUMMARY:Review Accounts
+DTSTART:19980303T210000Z
+DTEND:19980303T220000Z
+DTSTAMP:19980303T193000Z
+LOCATION:The White Room
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:REQUEST
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:123456789@host1.com
+SEQUENCE:0
+RDATE:19980304T180000Z
+RDATE:19980311T180000Z
+RDATE:19980318T180000Z
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE:Mailto:B@example.com
+SUMMARY:Review Accounts
+DTSTART:19980304T180000Z
+DTEND:19980304T200000Z
+DTSTAMP:19980303T193000Z
+LOCATION:Conference Room A
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:REQUEST
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:123456789@host1.com
+SEQUENCE:1
+RECURRENCE-ID:19980311T180000Z
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE:Mailto:B@example.com
+SUMMARY:Review Accounts
+DTSTART:19980311T160000Z
+DTEND:19980311T180000Z
+DTSTAMP:19980306T193000Z
+LOCATION:The Small conference room
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:ADD
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:123456789@host1.com
+SEQUENCE:2
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE:Mailto:B@example.com
+SUMMARY:Review Accounts
+DTSTART:19980315T180000Z
+DTEND:19980315T200000Z
+DTSTAMP:19980307T193000Z
+LOCATION:Conference Room A
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:REQUEST
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:123456789@host1.com
+SEQUENCE:2
+RDATE:19980304T180000Z
+RDATE:19980311T160000Z
+RDATE:19980315T180000Z
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE:Mailto:B@example.com
+SUMMARY:Review Accounts
+DTSTART:19980304T180000Z
+DTEND:19980304T200000Z
+DTSTAMP:19980303T193000Z
+LOCATION:Conference Room A
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SEQUENCE:2
+RECURRENCE-ID:19980311T160000Z
+ATTENDEE;ROLE=CHAIR;RSVP=TRUE:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE:Mailto:B@example.com
+SUMMARY:Review Accounts
+DTSTART:19980311T160000Z
+DTEND:19980304T180000Z
+DTSTAMP:19980306T193000Z
+LOCATION:The Small conference room
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:COUNTER
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:guid-1@host1.com
+RECURRENCE-ID:19970715T210000Z
+SEQUENCE:4
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;RSVP=TRUE:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE:Mailto:B@example.com
+ATTENDEE;RSVP=TRUE:Mailto:C@example.com
+ATTENDEE;RSVP=TRUE:Mailto:D@example.com
+DESCRIPTION:IETF-C&S Conference Call
+CLASS:PUBLIC
+SUMMARY:IETF Calendaring Working Group Meeting
+DTSTART:19970715T220000Z
+DTEND:19970715T230000Z
+LOCATION:Conference Call
+COMMENT:May we bump this by an hour? I have a conflict
+DTSTAMP:19970629T094000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:REQUEST
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:guid-1@host1.com
+SEQUENCE:0
+RRULE:FREQ=MONTHLY;BYMONTHDAY=1
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE:Mailto:B@example.com
+ATTENDEE;RSVP=TRUE:Mailto:C@example.com
+ATTENDEE;RSVP=TRUE:Mailto:D@example.com
+DESCRIPTION:IETF-C&S Conference Call
+CLASS:PUBLIC
+SUMMARY:IETF Calendaring Working Group Meeting
+DTSTART:19970601T210000Z
+DTEND:19970601T220000Z
+DTSTAMP:19970602T094000Z
+LOCATION:Conference Call
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//RDU Software//NONSGML HandCal//EN
+METHOD:REPLY
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:Mailto:A@example.com
+ATTENDEE:Mailto:B@example.com
+REQUEST-STATUS:2.8;Repeating event ignored. Scheduled as a single
+ event;RRULE
+REQUEST-STATUS:3.0;Invalid Property Name;FOO
+UID:guid-1@host1.com
+SEQUENCE:0
+DTSTAMP:19970603T094000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VTODO
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE:Mailto:B@example.com
+ATTENDEE;RSVP=TRUE:Mailto:C@example.com
+ATTENDEE;RSVP=TRUE:Mailto:D@example.com
+DTSTART:19970701T170000Z
+DUE:19970722T170000Z
+PRIORITY:1
+SUMMARY:Create the requirements document
+UID:calsrv.example.com-873970198738777-00@example.com
+SEQUENCE:0
+DTSTAMP:19970717T200000Z
+STATUS:Needs Action
+END:VTODO
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REPLY
+VERSION:2.0
+BEGIN:VTODO
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;PARTSTAT=ACCEPTED:Mailto:B@example.com
+UID:calsrv.example.com-873970198738777-00@example.com
+COMMENT:I'll send you my input by e-mail
+SEQUENCE:0
+DTSTAMP:19970717T203000Z
+REQUEST-STATUS:2.0;Success
+END:VTODO
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VTODO
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:D@example.com
+UID:calsrv.example.com-873970198738777-00@example.com
+SUMMARY:Create the requirements document
+PRIORITY:1
+SEQUENCE:0
+STATUS:IN-PROCESS
+DTSTART:19970701T170000Z
+DTSTAMP:19970717T230000Z
+END:VTODO
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REPLY
+VERSION:2.0
+BEGIN:VTODO
+ORGANIZER:MAILTO:A@example.com
+ATTENDEE;PARTSTAT=IN-PROCESS:Mailto:B@example.com
+PERCENT-COMPLETE:75
+UID:calsrv.example.com-873970198738777-00@example.com
+DTSTAMP:19970717T233000Z
+SEQUENCE:0
+END:VTODO
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REPLY
+VERSION:2.0
+BEGIN:VTODO
+ORGANIZER:MAILTO:A@example.com
+ATTENDEE;PARTSTAT=COMPLETED:Mailto:D@example.com
+UID:calsrv.example.com-873970198738777-00@example.com
+DTSTAMP:19970717T233000Z
+SEQUENCE:0
+END:VTODO
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VTODO
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE;PARTSTAT=ACCEPTED;CUTYPE=INDIVIDUAL:Mailto:B@example.com
+ATTENDEE;PARTSTAT=IN-PROCESS;CUTYPE=INDIVIDUAL:Mailto:D@example.com
+DTSTART:19970701T170000Z
+DUE:19970722T170000Z
+PRIORITY:1
+SUMMARY:Create the requirements document
+UID:calsrv.example.com-873970198738777-00@example.com
+SEQUENCE:1
+DTSTAMP:19970718T100000Z
+STATUS:IN-PROGRESS
+PERCENT-COMPLETE:40
+END:VTODO
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VTODO
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR:Mailto:A@example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:D@example.com
+RRULE:FREQ=MONTHLY;COUNT=10;BYDAY=1FR
+DTSTART:19980101T100000
+DUE:19980103T100000
+SUMMARY:Send Status Reports to Area Managers
+UID:calsrv.example.com-873970198738777-00@example.com
+SEQUENCE:0
+DTSTAMP:19970717T200000Z
+STATUS:NEEDS ACTION
+PRIORITY:1
+END:VTODO
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REPLY
+VERSION:2.0
+BEGIN:VTODO
+ATTENDEE;PARTSTAT=IN-PROCESS:Mailto:B@example.com
+PERCENT-COMPLETE:75
+UID:calsrv.example.com-873970198738777-00@example.com
+DTSTAMP:19970717T233000Z
+RECURRENCE-ID:19980101T170000Z
+SEQUENCE:1
+END:VTODO
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:PUBLISH
+PRODID:-//ACME/DesktopCalendar//EN
+VERSION:2.0
+BEGIN:VJOURNAL
+DTSTART:19971002T200000Z
+ORGANIZER:MAILTO:A@Example.com
+SUMMARY:Phone conference minutes
+DESCRIPTION:The editors meeting was held on October 1, 1997.
+ Details are in the attached document.
+UID:0981234-1234234-2410@example.com
+RELATED-TO:0981234-1234234-2402-35@example.com
+ATTACH:ftp://ftp.example.com/pub/ed/minutes100197.txt
+END:VJOURNAL
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//RDU Software//NONSGML HandCal//EN
+METHOD:REFRESH
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE:Mailto:B@example.com
+ATTENDEE:Mailto:C@example.com
+ATTENDEE:Mailto:D@example.com
+UID: guid-1-12345@host1.com
+DTSTAMP:19970603T094000
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:REQUEST
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:acme-12345@host1.com
+SEQUENCE:3
+RRULE:FREQ=WEEKLY
+RDATE;VALUE=PERIOD:19970819T210000Z/199700819T220000Z
+ORGANIZER:Mailto:A@example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
+ATTENDEE:Mailto:B@example.com
+DESCRIPTION:IETF-C&S Conference Call
+SUMMARY:IETF Calendaring Working Group Meeting
+DTSTART:19970801T210000Z
+DTEND:19970801T220000Z
+RECURRENCE-ID:19970809T210000Z
+DTSTAMP:19970726T083000
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//RDU Software//NONSGML HandCal//EN
+METHOD:REFRESH
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:Mailto:A@example.com
+ATTENDEE:Mailto:B@example.com
+UID:acme-12345@host1.com
+DTSTAMP:19970603T094000
+END:VEVENT
+END:VCALENDAR
+END:VCALENDAR \ No newline at end of file
diff --git a/libical/test-data/3 b/libical/test-data/3
new file mode 100644
index 0000000000..008373ebfa
--- /dev/null
+++ b/libical/test-data/3
@@ -0,0 +1,21 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//ABC Corporation//NONSGML My Product//EN
+BEGIN:VTODO
+DTSTAMP:19980130T134500Z
+SEQUENCE:2
+UID:uid4@host1.com
+ORGANIZER:MAILTO:unclesam@us.gov
+ATTENDEE;PARTSTAT=ACCEPTED:MAILTO:jqpublic@host.com
+DUE:19980415T235959
+STATUS:NEEDS-ACTION
+SUMMARY:Submit Income Taxes
+BEGIN:VALARM
+ACTION:AUDIO
+TRIGGER;VALUE=DATE-TIME:19980403T120000
+ATTACH;FMTTYPE=audio/basic:http://host.com/pub/audio-files/ssbanner.aud
+REPEAT:4
+DURATION:PT1H
+END:VALARM
+END:VTODO
+END:VCALENDAR
diff --git a/libical/test-data/4 b/libical/test-data/4
new file mode 100644
index 0000000000..59c3d6917b
--- /dev/null
+++ b/libical/test-data/4
@@ -0,0 +1,23 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//ABC Corporation//NONSGML My Product//EN
+BEGIN:VJOURNAL
+DTSTAMP:19970324T120000Z
+UID:uid5@host1.com
+ORGANIZER:MAILTO:jsmith@host.com
+STATUS:DRAFT
+CLASS:PUBLIC
+CATEGORIES:Project Report, XYZ: Weekly Meeting
+DESCRIPTION:Project xyz Review Meeting Minutes\n
+ Agenda\n1. Review of project version 1.0 requirements.\n2.
+ Definition
+ of project processes.\n3. Review of project schedule.\n
+ Participants: John Smith\, Jane Doe\, Jim Dandy\n-It was
+ decided that the requirements need to be signed off by
+ product marketing.\n-Project processes were accepted.\n
+ -Project schedule needs to account for scheduled holidays
+ and employee vacation time. Check with HR for specific
+ dates.\n-New schedule will be distributed by Friday.\n-
+ Next weeks meeting is cancelled. No meeting until 3/23.
+END:VJOURNAL
+END:VCALENDAR
diff --git a/libical/test-data/5 b/libical/test-data/5
new file mode 100644
index 0000000000..ba1fd09f7f
--- /dev/null
+++ b/libical/test-data/5
@@ -0,0 +1,16 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//RDU Software//NONSGML HandCal//EN
+BEGIN:VFREEBUSY
+ORGANIZER:MAILTO:jsmith@host.com
+DTSTART:19980313T141711Z
+DTEND:19980410T141711
+FREEBUSY:19980314T233000Z/19980315T003000Z
+FREEBUSY:19980316T153000Z/19980316T163000Z
+FREEBUSY:19980318T030000/19980318T040000,19980318T030000/19980318T040000
+URL:http://www.host.com/calendar/busytime/jsmith.ifb
+END:VFREEBUSY
+END:VCALENDAR
+
+
+
diff --git a/libical/test-data/6 b/libical/test-data/6
new file mode 100644
index 0000000000..e0214b5021
--- /dev/null
+++ b/libical/test-data/6
@@ -0,0 +1,21 @@
+BEGIN:VCALENDAR
+PRODID:-//GNOME//NONSGML GnomeCalendar//EN
+VERSION:0.0.1
+BEGIN:VEVENT
+UID:0981234-1234234-23@example.com
+SEQUENCE:0
+DTSTART:19970701T200000
+DTEND:19691231T160000
+DCREATED:19691231T160000
+LAST-MODIFIED:20000216T083225
+SUMMARY:ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
+STATUS:NEEDS ACTION
+CLASS:PUBLIC
+PRIORITY:0
+TRANSP:0
+X-PILOTID:0
+X-PILOTSTAT:1
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libical/test-data/7 b/libical/test-data/7
new file mode 100644
index 0000000000..0a255fc514
--- /dev/null
+++ b/libical/test-data/7
@@ -0,0 +1,14 @@
+BEGIN:VCALENDAR
+METHOD:PUBLISH
+VERSION:2.0
+PRODID:-//ACME/DesktopCalendar//EN
+BEGIN:VEVENT
+ORGANIZER:mailto:a@example.com
+DTSTAMP:19970612T190000Z
+DTSTART:19970701T210000Z
+DTEND:19970701T230000Z
+SEQUENCE:1
+UID:0981234-1234234-23@example.com
+SUMMARY:ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
+END:VEVENT
+END:VCALENDAR
diff --git a/libical/test-data/Makefile.am b/libical/test-data/Makefile.am
new file mode 100644
index 0000000000..bf2079606c
--- /dev/null
+++ b/libical/test-data/Makefile.am
@@ -0,0 +1,13 @@
+EXTRA_DIST = \
+0 \
+1 \
+1.1 \
+2 \
+2445.ics \
+2446.ics \
+3 \
+4 \
+5 \
+6 \
+7 \
+smallcluster.ics \ No newline at end of file
diff --git a/libical/test-data/smallcluster.ics b/libical/test-data/smallcluster.ics
new file mode 100644
index 0000000000..c4e2dbae50
--- /dev/null
+++ b/libical/test-data/smallcluster.ics
@@ -0,0 +1,18 @@
+BEGIN:VCALENDAR
+X-LIC-CLUSTERCOUNT
+ :0
+DTSTART
+ :00000000T000000
+DTEND
+ :00000000T000000
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//hacksw/handcal//NONSGML v1.0//EN
+BEGIN:VEVENT
+DTSTART:19970714T170000Z
+DTEND:19970715T035959Z
+SUMMARY:Bastille Day Party
+RRULE:FREQ=YEARLY;UNTIL=123456T123456;BYSETPOS=-1,2,-3,4,-5,6,-7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,4,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54;BYSECOND=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,4,25,26
+END:VEVENT
+END:VCALENDAR
+END:VCALENDAR
diff --git a/libical/test-data/smallcluster.vcd b/libical/test-data/smallcluster.vcd
new file mode 100644
index 0000000000..c4e2dbae50
--- /dev/null
+++ b/libical/test-data/smallcluster.vcd
@@ -0,0 +1,18 @@
+BEGIN:VCALENDAR
+X-LIC-CLUSTERCOUNT
+ :0
+DTSTART
+ :00000000T000000
+DTEND
+ :00000000T000000
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//hacksw/handcal//NONSGML v1.0//EN
+BEGIN:VEVENT
+DTSTART:19970714T170000Z
+DTEND:19970715T035959Z
+SUMMARY:Bastille Day Party
+RRULE:FREQ=YEARLY;UNTIL=123456T123456;BYSETPOS=-1,2,-3,4,-5,6,-7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,4,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54;BYSECOND=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,4,25,26
+END:VEVENT
+END:VCALENDAR
+END:VCALENDAR