widl: Update to current Wine version.

Signed-off-by: Jacek Caban <jacek@codeweavers.com>
diff --git a/mingw-w64-tools/widl/include/basetsd.h b/mingw-w64-tools/widl/include/basetsd.h
index 7087b59..761af4d 100644
--- a/mingw-w64-tools/widl/include/basetsd.h
+++ b/mingw-w64-tools/widl/include/basetsd.h
@@ -275,6 +275,10 @@
 # undef  WORDS_BIGENDIAN
 #elif defined(__x86_64__)
 # undef  WORDS_BIGENDIAN
+#elif defined(__powerpc64__) && defined(__BIG_ENDIAN__)
+# define WORDS_BIGENDIAN
+#elif defined(__powerpc64__)
+# undef  WORDS_BIGENDIAN
 #elif defined(__powerpc__)
 # define WORDS_BIGENDIAN
 #elif defined(__ALPHA__)
diff --git a/mingw-w64-tools/widl/include/winnt.h b/mingw-w64-tools/widl/include/winnt.h
index 5b3efe6..8feb2e5 100644
--- a/mingw-w64-tools/widl/include/winnt.h
+++ b/mingw-w64-tools/widl/include/winnt.h
@@ -110,6 +110,8 @@
 #ifndef DECLSPEC_SELECTANY
 #if defined(_MSC_VER) && (_MSC_VER >= 1100)
 #define DECLSPEC_SELECTANY __declspec(selectany)
+#elif defined(__MINGW32__)
+#define DECLSPEC_SELECTANY __attribute__((selectany))
 #else
 #define DECLSPEC_SELECTANY
 #endif
@@ -4321,17 +4323,16 @@
 #define LUA_TOKEN                    0x4
 #define WRITE_RESTRICTED             0x8
 
-#define TOKEN_TOKEN_ADJUST_DEFAULT   0x0080
-#define TOKEN_ADJUST_GROUPS          0x0040
-#define TOKEN_ADJUST_PRIVILEGES      0x0020
-#define TOKEN_ADJUST_SESSIONID       0x0100
 #define TOKEN_ASSIGN_PRIMARY         0x0001
 #define TOKEN_DUPLICATE              0x0002
-#define TOKEN_EXECUTE                STANDARD_RIGHTS_EXECUTE
 #define TOKEN_IMPERSONATE            0x0004
 #define TOKEN_QUERY                  0x0008
 #define TOKEN_QUERY_SOURCE           0x0010
+#define TOKEN_ADJUST_PRIVILEGES      0x0020
+#define TOKEN_ADJUST_GROUPS          0x0040
 #define TOKEN_ADJUST_DEFAULT         0x0080
+#define TOKEN_ADJUST_SESSIONID       0x0100
+#define TOKEN_EXECUTE                STANDARD_RIGHTS_EXECUTE
 #define TOKEN_READ                   (STANDARD_RIGHTS_READ|TOKEN_QUERY)
 #define TOKEN_WRITE                  (STANDARD_RIGHTS_WRITE     | \
 					TOKEN_ADJUST_PRIVILEGES | \
@@ -5414,7 +5415,8 @@
 #define JOB_OBJECT_QUERY                    0x0004
 #define JOB_OBJECT_TERMINATE                0x0008
 #define JOB_OBJECT_SET_SECURITY_ATTRIBUTES  0x0010
-#define JOB_OBJECT_ALL_ACCESS               (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x1f)
+#define JOB_OBJECT_IMPERSONATE              0x0020
+#define JOB_OBJECT_ALL_ACCESS               (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3f)
 
 #define TIMER_QUERY_STATE          0x0001
 #define TIMER_MODIFY_STATE         0x0002
diff --git a/mingw-w64-tools/widl/src/header.c b/mingw-w64-tools/widl/src/header.c
index ad205df..e639499 100644
--- a/mingw-w64-tools/widl/src/header.c
+++ b/mingw-w64-tools/widl/src/header.c
@@ -185,6 +185,10 @@
 {
     static char *buffer;
     free( buffer );
+    if (is_attr( v->attrs, ATTR_EVENTADD ))
+        return buffer = strmake( "add_%s", v->name );
+    if (is_attr( v->attrs, ATTR_EVENTREMOVE ))
+        return buffer = strmake( "remove_%s", v->name );
     if (is_attr( v->attrs, ATTR_PROPGET ))
         return buffer = strmake( "get_%s", v->name );
     if (is_attr( v->attrs, ATTR_PROPPUT ))
@@ -1698,6 +1702,7 @@
 {
     expr_t *contract = get_attrp(runtimeclass->attrs, ATTR_CONTRACT);
     char *name, *c_name;
+    size_t i, len;
     name = format_namespace(runtimeclass->namespace, "", ".", runtimeclass->name, NULL);
     c_name = format_namespace(runtimeclass->namespace, "", "_", runtimeclass->name, NULL);
     fprintf(header, "/*\n");
@@ -1706,6 +1711,14 @@
     if (contract) write_apicontract_guard_start(header, contract);
     fprintf(header, "#ifndef RUNTIMECLASS_%s_DEFINED\n", c_name);
     fprintf(header, "#define RUNTIMECLASS_%s_DEFINED\n", c_name);
+    fprintf(header, "#if defined(_MSC_VER) || defined(__MINGW32__)\n");
+    /* FIXME: MIDL generates extern const here but GCC warns if extern is initialized */
+    fprintf(header, "const DECLSPEC_SELECTANY WCHAR RuntimeClass_%s[] = L\"%s\";\n", c_name, name);
+    fprintf(header, "#else\n");
+    fprintf(header, "static const WCHAR RuntimeClass_%s[] = {", c_name);
+    for (i = 0, len = strlen(name); i < len; ++i) fprintf(header, "'%c',", name[i]);
+    fprintf(header, "0};\n");
+    fprintf(header, "#endif\n");
     fprintf(header, "#endif /* RUNTIMECLASS_%s_DEFINED */\n", c_name);
     free(c_name);
     free(name);
diff --git a/mingw-w64-tools/widl/src/parser.l b/mingw-w64-tools/widl/src/parser.l
index 6bbfed5..7e20d30 100644
--- a/mingw-w64-tools/widl/src/parser.l
+++ b/mingw-w64-tools/widl/src/parser.l
@@ -359,9 +359,12 @@
 	{"encode",                      tENCODE,                    0},
 	{"endpoint",                    tENDPOINT,                  0},
 	{"entry",                       tENTRY,                     0},
+	{"eventadd",                    tEVENTADD,                  1},
+	{"eventremove",                 tEVENTREMOVE,               1},
 	{"exclusiveto",                 tEXCLUSIVETO,               1},
 	{"explicit_handle",             tEXPLICITHANDLE,            0},
 	{"fault_status",                tFAULTSTATUS,               0},
+	{"flags",                       tFLAGS,                     1},
 	{"force_allocate",              tFORCEALLOCATE,             0},
 	{"free",                        tFREE,                      0},
 	{"handle",                      tHANDLE,                    0},
diff --git a/mingw-w64-tools/widl/src/parser.tab.c b/mingw-w64-tools/widl/src/parser.tab.c
index def57b8..d4a09b3 100644
--- a/mingw-w64-tools/widl/src/parser.tab.c
+++ b/mingw-w64-tools/widl/src/parser.tab.c
@@ -152,8 +152,7 @@
 static warning_list_t *append_warning(warning_list_t *, int);
 
 static type_t *reg_typedefs(decl_spec_t *decl_spec, var_list_t *names, attr_list_t *attrs);
-static type_t *find_type_or_error(const char *name, int t);
-static type_t *find_type_or_error2(char *name, int t);
+static type_t *find_type_or_error(const char *name);
 
 static var_t *reg_const(var_t *var);
 
@@ -165,7 +164,6 @@
 static void check_arg_attrs(const var_t *arg);
 static void check_statements(const statement_list_t *stmts, int is_inside_library);
 static void check_all_user_types(const statement_list_t *stmts);
-static attr_list_t *check_iface_attrs(const char *name, attr_list_t *attrs);
 static attr_list_t *check_function_attrs(const char *name, attr_list_t *attrs);
 static attr_list_t *check_typedef_attrs(attr_list_t *attrs);
 static attr_list_t *check_enum_attrs(attr_list_t *attrs);
@@ -174,14 +172,8 @@
 static attr_list_t *check_union_attrs(attr_list_t *attrs);
 static attr_list_t *check_field_attrs(const char *name, attr_list_t *attrs);
 static attr_list_t *check_library_attrs(const char *name, attr_list_t *attrs);
-static attr_list_t *check_dispiface_attrs(const char *name, attr_list_t *attrs);
-static attr_list_t *check_module_attrs(const char *name, attr_list_t *attrs);
-static attr_list_t *check_coclass_attrs(const char *name, attr_list_t *attrs);
-static attr_list_t *check_runtimeclass_attrs(const char *name, attr_list_t *attrs);
-static attr_list_t *check_apicontract_attrs(const char *name, attr_list_t *attrs);
 const char *get_attr_display_name(enum attr_type type);
 static void add_explicit_handle_if_necessary(const type_t *iface, var_t *func);
-static void check_def(const type_t *t);
 
 static void check_async_uuid(type_t *iface);
 
@@ -210,7 +202,7 @@
 static typelib_t *current_typelib;
 
 
-#line 214 "tools/widl/parser.tab.c"
+#line 206 "tools/widl/parser.tab.c"
 
 # ifndef YY_CAST
 #  ifdef __cplusplus
@@ -325,133 +317,136 @@
     tENTRY = 329,                  /* tENTRY  */
     tENUM = 330,                   /* tENUM  */
     tERRORSTATUST = 331,           /* tERRORSTATUST  */
-    tEXCLUSIVETO = 332,            /* tEXCLUSIVETO  */
-    tEXPLICITHANDLE = 333,         /* tEXPLICITHANDLE  */
-    tEXTERN = 334,                 /* tEXTERN  */
-    tFALSE = 335,                  /* tFALSE  */
-    tFASTCALL = 336,               /* tFASTCALL  */
-    tFAULTSTATUS = 337,            /* tFAULTSTATUS  */
-    tFLOAT = 338,                  /* tFLOAT  */
-    tFORCEALLOCATE = 339,          /* tFORCEALLOCATE  */
-    tHANDLE = 340,                 /* tHANDLE  */
-    tHANDLET = 341,                /* tHANDLET  */
-    tHELPCONTEXT = 342,            /* tHELPCONTEXT  */
-    tHELPFILE = 343,               /* tHELPFILE  */
-    tHELPSTRING = 344,             /* tHELPSTRING  */
-    tHELPSTRINGCONTEXT = 345,      /* tHELPSTRINGCONTEXT  */
-    tHELPSTRINGDLL = 346,          /* tHELPSTRINGDLL  */
-    tHIDDEN = 347,                 /* tHIDDEN  */
-    tHYPER = 348,                  /* tHYPER  */
-    tID = 349,                     /* tID  */
-    tIDEMPOTENT = 350,             /* tIDEMPOTENT  */
-    tIGNORE = 351,                 /* tIGNORE  */
-    tIIDIS = 352,                  /* tIIDIS  */
-    tIMMEDIATEBIND = 353,          /* tIMMEDIATEBIND  */
-    tIMPLICITHANDLE = 354,         /* tIMPLICITHANDLE  */
-    tIMPORT = 355,                 /* tIMPORT  */
-    tIMPORTLIB = 356,              /* tIMPORTLIB  */
-    tIN = 357,                     /* tIN  */
-    tIN_LINE = 358,                /* tIN_LINE  */
-    tINLINE = 359,                 /* tINLINE  */
-    tINPUTSYNC = 360,              /* tINPUTSYNC  */
-    tINT = 361,                    /* tINT  */
-    tINT32 = 362,                  /* tINT32  */
-    tINT3264 = 363,                /* tINT3264  */
-    tINT64 = 364,                  /* tINT64  */
-    tINTERFACE = 365,              /* tINTERFACE  */
-    tLCID = 366,                   /* tLCID  */
-    tLENGTHIS = 367,               /* tLENGTHIS  */
-    tLIBRARY = 368,                /* tLIBRARY  */
-    tLICENSED = 369,               /* tLICENSED  */
-    tLOCAL = 370,                  /* tLOCAL  */
-    tLONG = 371,                   /* tLONG  */
-    tMARSHALINGBEHAVIOR = 372,     /* tMARSHALINGBEHAVIOR  */
-    tMAYBE = 373,                  /* tMAYBE  */
-    tMESSAGE = 374,                /* tMESSAGE  */
-    tMETHODS = 375,                /* tMETHODS  */
-    tMODULE = 376,                 /* tMODULE  */
-    tMTA = 377,                    /* tMTA  */
-    tNAMESPACE = 378,              /* tNAMESPACE  */
-    tNOCODE = 379,                 /* tNOCODE  */
-    tNONBROWSABLE = 380,           /* tNONBROWSABLE  */
-    tNONCREATABLE = 381,           /* tNONCREATABLE  */
-    tNONE = 382,                   /* tNONE  */
-    tNONEXTENSIBLE = 383,          /* tNONEXTENSIBLE  */
-    tNOTIFY = 384,                 /* tNOTIFY  */
-    tNOTIFYFLAG = 385,             /* tNOTIFYFLAG  */
-    tNULL = 386,                   /* tNULL  */
-    tOBJECT = 387,                 /* tOBJECT  */
-    tODL = 388,                    /* tODL  */
-    tOLEAUTOMATION = 389,          /* tOLEAUTOMATION  */
-    tOPTIMIZE = 390,               /* tOPTIMIZE  */
-    tOPTIONAL = 391,               /* tOPTIONAL  */
-    tOUT = 392,                    /* tOUT  */
-    tPARTIALIGNORE = 393,          /* tPARTIALIGNORE  */
-    tPASCAL = 394,                 /* tPASCAL  */
-    tPOINTERDEFAULT = 395,         /* tPOINTERDEFAULT  */
-    tPRAGMA_WARNING = 396,         /* tPRAGMA_WARNING  */
-    tPROGID = 397,                 /* tPROGID  */
-    tPROPERTIES = 398,             /* tPROPERTIES  */
-    tPROPGET = 399,                /* tPROPGET  */
-    tPROPPUT = 400,                /* tPROPPUT  */
-    tPROPPUTREF = 401,             /* tPROPPUTREF  */
-    tPROXY = 402,                  /* tPROXY  */
-    tPTR = 403,                    /* tPTR  */
-    tPUBLIC = 404,                 /* tPUBLIC  */
-    tRANGE = 405,                  /* tRANGE  */
-    tREADONLY = 406,               /* tREADONLY  */
-    tREF = 407,                    /* tREF  */
-    tREGISTER = 408,               /* tREGISTER  */
-    tREPRESENTAS = 409,            /* tREPRESENTAS  */
-    tREQUESTEDIT = 410,            /* tREQUESTEDIT  */
-    tRESTRICTED = 411,             /* tRESTRICTED  */
-    tRETVAL = 412,                 /* tRETVAL  */
-    tRUNTIMECLASS = 413,           /* tRUNTIMECLASS  */
-    tSAFEARRAY = 414,              /* tSAFEARRAY  */
-    tSHORT = 415,                  /* tSHORT  */
-    tSIGNED = 416,                 /* tSIGNED  */
-    tSINGLENODE = 417,             /* tSINGLENODE  */
-    tSIZEIS = 418,                 /* tSIZEIS  */
-    tSIZEOF = 419,                 /* tSIZEOF  */
-    tSMALL = 420,                  /* tSMALL  */
-    tSOURCE = 421,                 /* tSOURCE  */
-    tSTANDARD = 422,               /* tSTANDARD  */
-    tSTATIC = 423,                 /* tSTATIC  */
-    tSTDCALL = 424,                /* tSTDCALL  */
-    tSTRICTCONTEXTHANDLE = 425,    /* tSTRICTCONTEXTHANDLE  */
-    tSTRING = 426,                 /* tSTRING  */
-    tSTRUCT = 427,                 /* tSTRUCT  */
-    tSWITCH = 428,                 /* tSWITCH  */
-    tSWITCHIS = 429,               /* tSWITCHIS  */
-    tSWITCHTYPE = 430,             /* tSWITCHTYPE  */
-    tTHREADING = 431,              /* tTHREADING  */
-    tTRANSMITAS = 432,             /* tTRANSMITAS  */
-    tTRUE = 433,                   /* tTRUE  */
-    tTYPEDEF = 434,                /* tTYPEDEF  */
-    tUIDEFAULT = 435,              /* tUIDEFAULT  */
-    tUNION = 436,                  /* tUNION  */
-    tUNIQUE = 437,                 /* tUNIQUE  */
-    tUNSIGNED = 438,               /* tUNSIGNED  */
-    tUSESGETLASTERROR = 439,       /* tUSESGETLASTERROR  */
-    tUSERMARSHAL = 440,            /* tUSERMARSHAL  */
-    tUUID = 441,                   /* tUUID  */
-    tV1ENUM = 442,                 /* tV1ENUM  */
-    tVARARG = 443,                 /* tVARARG  */
-    tVERSION = 444,                /* tVERSION  */
-    tVIPROGID = 445,               /* tVIPROGID  */
-    tVOID = 446,                   /* tVOID  */
-    tWCHAR = 447,                  /* tWCHAR  */
-    tWIREMARSHAL = 448,            /* tWIREMARSHAL  */
-    tAPARTMENT = 449,              /* tAPARTMENT  */
-    tNEUTRAL = 450,                /* tNEUTRAL  */
-    tSINGLE = 451,                 /* tSINGLE  */
-    tFREE = 452,                   /* tFREE  */
-    tBOTH = 453,                   /* tBOTH  */
-    CAST = 454,                    /* CAST  */
-    PPTR = 455,                    /* PPTR  */
-    POS = 456,                     /* POS  */
-    NEG = 457,                     /* NEG  */
-    ADDRESSOF = 458                /* ADDRESSOF  */
+    tEVENTADD = 332,               /* tEVENTADD  */
+    tEVENTREMOVE = 333,            /* tEVENTREMOVE  */
+    tEXCLUSIVETO = 334,            /* tEXCLUSIVETO  */
+    tEXPLICITHANDLE = 335,         /* tEXPLICITHANDLE  */
+    tEXTERN = 336,                 /* tEXTERN  */
+    tFALSE = 337,                  /* tFALSE  */
+    tFASTCALL = 338,               /* tFASTCALL  */
+    tFAULTSTATUS = 339,            /* tFAULTSTATUS  */
+    tFLAGS = 340,                  /* tFLAGS  */
+    tFLOAT = 341,                  /* tFLOAT  */
+    tFORCEALLOCATE = 342,          /* tFORCEALLOCATE  */
+    tHANDLE = 343,                 /* tHANDLE  */
+    tHANDLET = 344,                /* tHANDLET  */
+    tHELPCONTEXT = 345,            /* tHELPCONTEXT  */
+    tHELPFILE = 346,               /* tHELPFILE  */
+    tHELPSTRING = 347,             /* tHELPSTRING  */
+    tHELPSTRINGCONTEXT = 348,      /* tHELPSTRINGCONTEXT  */
+    tHELPSTRINGDLL = 349,          /* tHELPSTRINGDLL  */
+    tHIDDEN = 350,                 /* tHIDDEN  */
+    tHYPER = 351,                  /* tHYPER  */
+    tID = 352,                     /* tID  */
+    tIDEMPOTENT = 353,             /* tIDEMPOTENT  */
+    tIGNORE = 354,                 /* tIGNORE  */
+    tIIDIS = 355,                  /* tIIDIS  */
+    tIMMEDIATEBIND = 356,          /* tIMMEDIATEBIND  */
+    tIMPLICITHANDLE = 357,         /* tIMPLICITHANDLE  */
+    tIMPORT = 358,                 /* tIMPORT  */
+    tIMPORTLIB = 359,              /* tIMPORTLIB  */
+    tIN = 360,                     /* tIN  */
+    tIN_LINE = 361,                /* tIN_LINE  */
+    tINLINE = 362,                 /* tINLINE  */
+    tINPUTSYNC = 363,              /* tINPUTSYNC  */
+    tINT = 364,                    /* tINT  */
+    tINT32 = 365,                  /* tINT32  */
+    tINT3264 = 366,                /* tINT3264  */
+    tINT64 = 367,                  /* tINT64  */
+    tINTERFACE = 368,              /* tINTERFACE  */
+    tLCID = 369,                   /* tLCID  */
+    tLENGTHIS = 370,               /* tLENGTHIS  */
+    tLIBRARY = 371,                /* tLIBRARY  */
+    tLICENSED = 372,               /* tLICENSED  */
+    tLOCAL = 373,                  /* tLOCAL  */
+    tLONG = 374,                   /* tLONG  */
+    tMARSHALINGBEHAVIOR = 375,     /* tMARSHALINGBEHAVIOR  */
+    tMAYBE = 376,                  /* tMAYBE  */
+    tMESSAGE = 377,                /* tMESSAGE  */
+    tMETHODS = 378,                /* tMETHODS  */
+    tMODULE = 379,                 /* tMODULE  */
+    tMTA = 380,                    /* tMTA  */
+    tNAMESPACE = 381,              /* tNAMESPACE  */
+    tNOCODE = 382,                 /* tNOCODE  */
+    tNONBROWSABLE = 383,           /* tNONBROWSABLE  */
+    tNONCREATABLE = 384,           /* tNONCREATABLE  */
+    tNONE = 385,                   /* tNONE  */
+    tNONEXTENSIBLE = 386,          /* tNONEXTENSIBLE  */
+    tNOTIFY = 387,                 /* tNOTIFY  */
+    tNOTIFYFLAG = 388,             /* tNOTIFYFLAG  */
+    tNULL = 389,                   /* tNULL  */
+    tOBJECT = 390,                 /* tOBJECT  */
+    tODL = 391,                    /* tODL  */
+    tOLEAUTOMATION = 392,          /* tOLEAUTOMATION  */
+    tOPTIMIZE = 393,               /* tOPTIMIZE  */
+    tOPTIONAL = 394,               /* tOPTIONAL  */
+    tOUT = 395,                    /* tOUT  */
+    tPARTIALIGNORE = 396,          /* tPARTIALIGNORE  */
+    tPASCAL = 397,                 /* tPASCAL  */
+    tPOINTERDEFAULT = 398,         /* tPOINTERDEFAULT  */
+    tPRAGMA_WARNING = 399,         /* tPRAGMA_WARNING  */
+    tPROGID = 400,                 /* tPROGID  */
+    tPROPERTIES = 401,             /* tPROPERTIES  */
+    tPROPGET = 402,                /* tPROPGET  */
+    tPROPPUT = 403,                /* tPROPPUT  */
+    tPROPPUTREF = 404,             /* tPROPPUTREF  */
+    tPROXY = 405,                  /* tPROXY  */
+    tPTR = 406,                    /* tPTR  */
+    tPUBLIC = 407,                 /* tPUBLIC  */
+    tRANGE = 408,                  /* tRANGE  */
+    tREADONLY = 409,               /* tREADONLY  */
+    tREF = 410,                    /* tREF  */
+    tREGISTER = 411,               /* tREGISTER  */
+    tREPRESENTAS = 412,            /* tREPRESENTAS  */
+    tREQUESTEDIT = 413,            /* tREQUESTEDIT  */
+    tRESTRICTED = 414,             /* tRESTRICTED  */
+    tRETVAL = 415,                 /* tRETVAL  */
+    tRUNTIMECLASS = 416,           /* tRUNTIMECLASS  */
+    tSAFEARRAY = 417,              /* tSAFEARRAY  */
+    tSHORT = 418,                  /* tSHORT  */
+    tSIGNED = 419,                 /* tSIGNED  */
+    tSINGLENODE = 420,             /* tSINGLENODE  */
+    tSIZEIS = 421,                 /* tSIZEIS  */
+    tSIZEOF = 422,                 /* tSIZEOF  */
+    tSMALL = 423,                  /* tSMALL  */
+    tSOURCE = 424,                 /* tSOURCE  */
+    tSTANDARD = 425,               /* tSTANDARD  */
+    tSTATIC = 426,                 /* tSTATIC  */
+    tSTDCALL = 427,                /* tSTDCALL  */
+    tSTRICTCONTEXTHANDLE = 428,    /* tSTRICTCONTEXTHANDLE  */
+    tSTRING = 429,                 /* tSTRING  */
+    tSTRUCT = 430,                 /* tSTRUCT  */
+    tSWITCH = 431,                 /* tSWITCH  */
+    tSWITCHIS = 432,               /* tSWITCHIS  */
+    tSWITCHTYPE = 433,             /* tSWITCHTYPE  */
+    tTHREADING = 434,              /* tTHREADING  */
+    tTRANSMITAS = 435,             /* tTRANSMITAS  */
+    tTRUE = 436,                   /* tTRUE  */
+    tTYPEDEF = 437,                /* tTYPEDEF  */
+    tUIDEFAULT = 438,              /* tUIDEFAULT  */
+    tUNION = 439,                  /* tUNION  */
+    tUNIQUE = 440,                 /* tUNIQUE  */
+    tUNSIGNED = 441,               /* tUNSIGNED  */
+    tUSESGETLASTERROR = 442,       /* tUSESGETLASTERROR  */
+    tUSERMARSHAL = 443,            /* tUSERMARSHAL  */
+    tUUID = 444,                   /* tUUID  */
+    tV1ENUM = 445,                 /* tV1ENUM  */
+    tVARARG = 446,                 /* tVARARG  */
+    tVERSION = 447,                /* tVERSION  */
+    tVIPROGID = 448,               /* tVIPROGID  */
+    tVOID = 449,                   /* tVOID  */
+    tWCHAR = 450,                  /* tWCHAR  */
+    tWIREMARSHAL = 451,            /* tWIREMARSHAL  */
+    tAPARTMENT = 452,              /* tAPARTMENT  */
+    tNEUTRAL = 453,                /* tNEUTRAL  */
+    tSINGLE = 454,                 /* tSINGLE  */
+    tFREE = 455,                   /* tFREE  */
+    tBOTH = 456,                   /* tBOTH  */
+    CAST = 457,                    /* CAST  */
+    PPTR = 458,                    /* PPTR  */
+    POS = 459,                     /* POS  */
+    NEG = 460,                     /* NEG  */
+    ADDRESSOF = 461                /* ADDRESSOF  */
   };
   typedef enum yytokentype yytoken_kind_t;
 #endif
@@ -460,7 +455,7 @@
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 union YYSTYPE
 {
-#line 136 "tools/widl/parser.y"
+#line 128 "tools/widl/parser.y"
 
 	attr_t *attr;
 	attr_list_t *attr_list;
@@ -489,7 +484,7 @@
 	enum type_qualifier type_qualifier;
 	enum function_specifier function_specifier;
 
-#line 493 "tools/widl/parser.tab.c"
+#line 488 "tools/widl/parser.tab.c"
 
 };
 typedef union YYSTYPE YYSTYPE;
@@ -584,284 +579,285 @@
   YYSYMBOL_tENTRY = 74,                    /* tENTRY  */
   YYSYMBOL_tENUM = 75,                     /* tENUM  */
   YYSYMBOL_tERRORSTATUST = 76,             /* tERRORSTATUST  */
-  YYSYMBOL_tEXCLUSIVETO = 77,              /* tEXCLUSIVETO  */
-  YYSYMBOL_tEXPLICITHANDLE = 78,           /* tEXPLICITHANDLE  */
-  YYSYMBOL_tEXTERN = 79,                   /* tEXTERN  */
-  YYSYMBOL_tFALSE = 80,                    /* tFALSE  */
-  YYSYMBOL_tFASTCALL = 81,                 /* tFASTCALL  */
-  YYSYMBOL_tFAULTSTATUS = 82,              /* tFAULTSTATUS  */
-  YYSYMBOL_tFLOAT = 83,                    /* tFLOAT  */
-  YYSYMBOL_tFORCEALLOCATE = 84,            /* tFORCEALLOCATE  */
-  YYSYMBOL_tHANDLE = 85,                   /* tHANDLE  */
-  YYSYMBOL_tHANDLET = 86,                  /* tHANDLET  */
-  YYSYMBOL_tHELPCONTEXT = 87,              /* tHELPCONTEXT  */
-  YYSYMBOL_tHELPFILE = 88,                 /* tHELPFILE  */
-  YYSYMBOL_tHELPSTRING = 89,               /* tHELPSTRING  */
-  YYSYMBOL_tHELPSTRINGCONTEXT = 90,        /* tHELPSTRINGCONTEXT  */
-  YYSYMBOL_tHELPSTRINGDLL = 91,            /* tHELPSTRINGDLL  */
-  YYSYMBOL_tHIDDEN = 92,                   /* tHIDDEN  */
-  YYSYMBOL_tHYPER = 93,                    /* tHYPER  */
-  YYSYMBOL_tID = 94,                       /* tID  */
-  YYSYMBOL_tIDEMPOTENT = 95,               /* tIDEMPOTENT  */
-  YYSYMBOL_tIGNORE = 96,                   /* tIGNORE  */
-  YYSYMBOL_tIIDIS = 97,                    /* tIIDIS  */
-  YYSYMBOL_tIMMEDIATEBIND = 98,            /* tIMMEDIATEBIND  */
-  YYSYMBOL_tIMPLICITHANDLE = 99,           /* tIMPLICITHANDLE  */
-  YYSYMBOL_tIMPORT = 100,                  /* tIMPORT  */
-  YYSYMBOL_tIMPORTLIB = 101,               /* tIMPORTLIB  */
-  YYSYMBOL_tIN = 102,                      /* tIN  */
-  YYSYMBOL_tIN_LINE = 103,                 /* tIN_LINE  */
-  YYSYMBOL_tINLINE = 104,                  /* tINLINE  */
-  YYSYMBOL_tINPUTSYNC = 105,               /* tINPUTSYNC  */
-  YYSYMBOL_tINT = 106,                     /* tINT  */
-  YYSYMBOL_tINT32 = 107,                   /* tINT32  */
-  YYSYMBOL_tINT3264 = 108,                 /* tINT3264  */
-  YYSYMBOL_tINT64 = 109,                   /* tINT64  */
-  YYSYMBOL_tINTERFACE = 110,               /* tINTERFACE  */
-  YYSYMBOL_tLCID = 111,                    /* tLCID  */
-  YYSYMBOL_tLENGTHIS = 112,                /* tLENGTHIS  */
-  YYSYMBOL_tLIBRARY = 113,                 /* tLIBRARY  */
-  YYSYMBOL_tLICENSED = 114,                /* tLICENSED  */
-  YYSYMBOL_tLOCAL = 115,                   /* tLOCAL  */
-  YYSYMBOL_tLONG = 116,                    /* tLONG  */
-  YYSYMBOL_tMARSHALINGBEHAVIOR = 117,      /* tMARSHALINGBEHAVIOR  */
-  YYSYMBOL_tMAYBE = 118,                   /* tMAYBE  */
-  YYSYMBOL_tMESSAGE = 119,                 /* tMESSAGE  */
-  YYSYMBOL_tMETHODS = 120,                 /* tMETHODS  */
-  YYSYMBOL_tMODULE = 121,                  /* tMODULE  */
-  YYSYMBOL_tMTA = 122,                     /* tMTA  */
-  YYSYMBOL_tNAMESPACE = 123,               /* tNAMESPACE  */
-  YYSYMBOL_tNOCODE = 124,                  /* tNOCODE  */
-  YYSYMBOL_tNONBROWSABLE = 125,            /* tNONBROWSABLE  */
-  YYSYMBOL_tNONCREATABLE = 126,            /* tNONCREATABLE  */
-  YYSYMBOL_tNONE = 127,                    /* tNONE  */
-  YYSYMBOL_tNONEXTENSIBLE = 128,           /* tNONEXTENSIBLE  */
-  YYSYMBOL_tNOTIFY = 129,                  /* tNOTIFY  */
-  YYSYMBOL_tNOTIFYFLAG = 130,              /* tNOTIFYFLAG  */
-  YYSYMBOL_tNULL = 131,                    /* tNULL  */
-  YYSYMBOL_tOBJECT = 132,                  /* tOBJECT  */
-  YYSYMBOL_tODL = 133,                     /* tODL  */
-  YYSYMBOL_tOLEAUTOMATION = 134,           /* tOLEAUTOMATION  */
-  YYSYMBOL_tOPTIMIZE = 135,                /* tOPTIMIZE  */
-  YYSYMBOL_tOPTIONAL = 136,                /* tOPTIONAL  */
-  YYSYMBOL_tOUT = 137,                     /* tOUT  */
-  YYSYMBOL_tPARTIALIGNORE = 138,           /* tPARTIALIGNORE  */
-  YYSYMBOL_tPASCAL = 139,                  /* tPASCAL  */
-  YYSYMBOL_tPOINTERDEFAULT = 140,          /* tPOINTERDEFAULT  */
-  YYSYMBOL_tPRAGMA_WARNING = 141,          /* tPRAGMA_WARNING  */
-  YYSYMBOL_tPROGID = 142,                  /* tPROGID  */
-  YYSYMBOL_tPROPERTIES = 143,              /* tPROPERTIES  */
-  YYSYMBOL_tPROPGET = 144,                 /* tPROPGET  */
-  YYSYMBOL_tPROPPUT = 145,                 /* tPROPPUT  */
-  YYSYMBOL_tPROPPUTREF = 146,              /* tPROPPUTREF  */
-  YYSYMBOL_tPROXY = 147,                   /* tPROXY  */
-  YYSYMBOL_tPTR = 148,                     /* tPTR  */
-  YYSYMBOL_tPUBLIC = 149,                  /* tPUBLIC  */
-  YYSYMBOL_tRANGE = 150,                   /* tRANGE  */
-  YYSYMBOL_tREADONLY = 151,                /* tREADONLY  */
-  YYSYMBOL_tREF = 152,                     /* tREF  */
-  YYSYMBOL_tREGISTER = 153,                /* tREGISTER  */
-  YYSYMBOL_tREPRESENTAS = 154,             /* tREPRESENTAS  */
-  YYSYMBOL_tREQUESTEDIT = 155,             /* tREQUESTEDIT  */
-  YYSYMBOL_tRESTRICTED = 156,              /* tRESTRICTED  */
-  YYSYMBOL_tRETVAL = 157,                  /* tRETVAL  */
-  YYSYMBOL_tRUNTIMECLASS = 158,            /* tRUNTIMECLASS  */
-  YYSYMBOL_tSAFEARRAY = 159,               /* tSAFEARRAY  */
-  YYSYMBOL_tSHORT = 160,                   /* tSHORT  */
-  YYSYMBOL_tSIGNED = 161,                  /* tSIGNED  */
-  YYSYMBOL_tSINGLENODE = 162,              /* tSINGLENODE  */
-  YYSYMBOL_tSIZEIS = 163,                  /* tSIZEIS  */
-  YYSYMBOL_tSIZEOF = 164,                  /* tSIZEOF  */
-  YYSYMBOL_tSMALL = 165,                   /* tSMALL  */
-  YYSYMBOL_tSOURCE = 166,                  /* tSOURCE  */
-  YYSYMBOL_tSTANDARD = 167,                /* tSTANDARD  */
-  YYSYMBOL_tSTATIC = 168,                  /* tSTATIC  */
-  YYSYMBOL_tSTDCALL = 169,                 /* tSTDCALL  */
-  YYSYMBOL_tSTRICTCONTEXTHANDLE = 170,     /* tSTRICTCONTEXTHANDLE  */
-  YYSYMBOL_tSTRING = 171,                  /* tSTRING  */
-  YYSYMBOL_tSTRUCT = 172,                  /* tSTRUCT  */
-  YYSYMBOL_tSWITCH = 173,                  /* tSWITCH  */
-  YYSYMBOL_tSWITCHIS = 174,                /* tSWITCHIS  */
-  YYSYMBOL_tSWITCHTYPE = 175,              /* tSWITCHTYPE  */
-  YYSYMBOL_tTHREADING = 176,               /* tTHREADING  */
-  YYSYMBOL_tTRANSMITAS = 177,              /* tTRANSMITAS  */
-  YYSYMBOL_tTRUE = 178,                    /* tTRUE  */
-  YYSYMBOL_tTYPEDEF = 179,                 /* tTYPEDEF  */
-  YYSYMBOL_tUIDEFAULT = 180,               /* tUIDEFAULT  */
-  YYSYMBOL_tUNION = 181,                   /* tUNION  */
-  YYSYMBOL_tUNIQUE = 182,                  /* tUNIQUE  */
-  YYSYMBOL_tUNSIGNED = 183,                /* tUNSIGNED  */
-  YYSYMBOL_tUSESGETLASTERROR = 184,        /* tUSESGETLASTERROR  */
-  YYSYMBOL_tUSERMARSHAL = 185,             /* tUSERMARSHAL  */
-  YYSYMBOL_tUUID = 186,                    /* tUUID  */
-  YYSYMBOL_tV1ENUM = 187,                  /* tV1ENUM  */
-  YYSYMBOL_tVARARG = 188,                  /* tVARARG  */
-  YYSYMBOL_tVERSION = 189,                 /* tVERSION  */
-  YYSYMBOL_tVIPROGID = 190,                /* tVIPROGID  */
-  YYSYMBOL_tVOID = 191,                    /* tVOID  */
-  YYSYMBOL_tWCHAR = 192,                   /* tWCHAR  */
-  YYSYMBOL_tWIREMARSHAL = 193,             /* tWIREMARSHAL  */
-  YYSYMBOL_tAPARTMENT = 194,               /* tAPARTMENT  */
-  YYSYMBOL_tNEUTRAL = 195,                 /* tNEUTRAL  */
-  YYSYMBOL_tSINGLE = 196,                  /* tSINGLE  */
-  YYSYMBOL_tFREE = 197,                    /* tFREE  */
-  YYSYMBOL_tBOTH = 198,                    /* tBOTH  */
-  YYSYMBOL_199_ = 199,                     /* ','  */
-  YYSYMBOL_200_ = 200,                     /* '?'  */
-  YYSYMBOL_201_ = 201,                     /* ':'  */
-  YYSYMBOL_202_ = 202,                     /* '|'  */
-  YYSYMBOL_203_ = 203,                     /* '^'  */
-  YYSYMBOL_204_ = 204,                     /* '&'  */
-  YYSYMBOL_205_ = 205,                     /* '<'  */
-  YYSYMBOL_206_ = 206,                     /* '>'  */
-  YYSYMBOL_207_ = 207,                     /* '-'  */
-  YYSYMBOL_208_ = 208,                     /* '+'  */
-  YYSYMBOL_209_ = 209,                     /* '*'  */
-  YYSYMBOL_210_ = 210,                     /* '/'  */
-  YYSYMBOL_211_ = 211,                     /* '%'  */
-  YYSYMBOL_212_ = 212,                     /* '!'  */
-  YYSYMBOL_213_ = 213,                     /* '~'  */
-  YYSYMBOL_CAST = 214,                     /* CAST  */
-  YYSYMBOL_PPTR = 215,                     /* PPTR  */
-  YYSYMBOL_POS = 216,                      /* POS  */
-  YYSYMBOL_NEG = 217,                      /* NEG  */
-  YYSYMBOL_ADDRESSOF = 218,                /* ADDRESSOF  */
-  YYSYMBOL_219_ = 219,                     /* '.'  */
-  YYSYMBOL_220_ = 220,                     /* '['  */
-  YYSYMBOL_221_ = 221,                     /* ']'  */
-  YYSYMBOL_222_ = 222,                     /* '{'  */
-  YYSYMBOL_223_ = 223,                     /* '}'  */
-  YYSYMBOL_224_ = 224,                     /* ';'  */
-  YYSYMBOL_225_ = 225,                     /* '('  */
-  YYSYMBOL_226_ = 226,                     /* ')'  */
-  YYSYMBOL_227_ = 227,                     /* '='  */
-  YYSYMBOL_YYACCEPT = 228,                 /* $accept  */
-  YYSYMBOL_input = 229,                    /* input  */
-  YYSYMBOL_m_acf = 230,                    /* m_acf  */
-  YYSYMBOL_gbl_statements = 231,           /* gbl_statements  */
-  YYSYMBOL_232_1 = 232,                    /* $@1  */
-  YYSYMBOL_imp_statements = 233,           /* imp_statements  */
-  YYSYMBOL_234_2 = 234,                    /* $@2  */
-  YYSYMBOL_int_statements = 235,           /* int_statements  */
-  YYSYMBOL_semicolon_opt = 236,            /* semicolon_opt  */
-  YYSYMBOL_statement = 237,                /* statement  */
-  YYSYMBOL_pragma_warning = 238,           /* pragma_warning  */
-  YYSYMBOL_warnings = 239,                 /* warnings  */
-  YYSYMBOL_typedecl = 240,                 /* typedecl  */
-  YYSYMBOL_cppquote = 241,                 /* cppquote  */
-  YYSYMBOL_import_start = 242,             /* import_start  */
-  YYSYMBOL_import = 243,                   /* import  */
-  YYSYMBOL_importlib = 244,                /* importlib  */
-  YYSYMBOL_libraryhdr = 245,               /* libraryhdr  */
-  YYSYMBOL_library_start = 246,            /* library_start  */
-  YYSYMBOL_librarydef = 247,               /* librarydef  */
-  YYSYMBOL_m_args = 248,                   /* m_args  */
-  YYSYMBOL_arg_list = 249,                 /* arg_list  */
-  YYSYMBOL_args = 250,                     /* args  */
-  YYSYMBOL_arg = 251,                      /* arg  */
-  YYSYMBOL_array = 252,                    /* array  */
-  YYSYMBOL_m_attributes = 253,             /* m_attributes  */
-  YYSYMBOL_attributes = 254,               /* attributes  */
-  YYSYMBOL_attrib_list = 255,              /* attrib_list  */
-  YYSYMBOL_str_list = 256,                 /* str_list  */
-  YYSYMBOL_marshaling_behavior = 257,      /* marshaling_behavior  */
-  YYSYMBOL_contract_ver = 258,             /* contract_ver  */
-  YYSYMBOL_contract_req = 259,             /* contract_req  */
-  YYSYMBOL_attribute = 260,                /* attribute  */
-  YYSYMBOL_uuid_string = 261,              /* uuid_string  */
-  YYSYMBOL_callconv = 262,                 /* callconv  */
-  YYSYMBOL_cases = 263,                    /* cases  */
-  YYSYMBOL_case = 264,                     /* case  */
-  YYSYMBOL_enums = 265,                    /* enums  */
-  YYSYMBOL_enum_list = 266,                /* enum_list  */
-  YYSYMBOL_enum_member = 267,              /* enum_member  */
-  YYSYMBOL_enum = 268,                     /* enum  */
-  YYSYMBOL_enumdef = 269,                  /* enumdef  */
-  YYSYMBOL_m_exprs = 270,                  /* m_exprs  */
-  YYSYMBOL_m_expr = 271,                   /* m_expr  */
-  YYSYMBOL_expr = 272,                     /* expr  */
-  YYSYMBOL_expr_list_int_const = 273,      /* expr_list_int_const  */
-  YYSYMBOL_expr_int_const = 274,           /* expr_int_const  */
-  YYSYMBOL_expr_const = 275,               /* expr_const  */
-  YYSYMBOL_fields = 276,                   /* fields  */
-  YYSYMBOL_field = 277,                    /* field  */
-  YYSYMBOL_ne_union_field = 278,           /* ne_union_field  */
-  YYSYMBOL_ne_union_fields = 279,          /* ne_union_fields  */
-  YYSYMBOL_union_field = 280,              /* union_field  */
-  YYSYMBOL_s_field = 281,                  /* s_field  */
-  YYSYMBOL_funcdef = 282,                  /* funcdef  */
-  YYSYMBOL_declaration = 283,              /* declaration  */
-  YYSYMBOL_m_ident = 284,                  /* m_ident  */
-  YYSYMBOL_t_ident = 285,                  /* t_ident  */
-  YYSYMBOL_ident = 286,                    /* ident  */
-  YYSYMBOL_base_type = 287,                /* base_type  */
-  YYSYMBOL_m_int = 288,                    /* m_int  */
-  YYSYMBOL_int_std = 289,                  /* int_std  */
-  YYSYMBOL_qualified_seq = 290,            /* qualified_seq  */
-  YYSYMBOL_291_3 = 291,                    /* $@3  */
-  YYSYMBOL_qualified_type = 292,           /* qualified_type  */
-  YYSYMBOL_293_4 = 293,                    /* $@4  */
-  YYSYMBOL_coclass = 294,                  /* coclass  */
-  YYSYMBOL_coclasshdr = 295,               /* coclasshdr  */
-  YYSYMBOL_coclassdef = 296,               /* coclassdef  */
-  YYSYMBOL_runtimeclass = 297,             /* runtimeclass  */
-  YYSYMBOL_runtimeclass_hdr = 298,         /* runtimeclass_hdr  */
-  YYSYMBOL_runtimeclass_def = 299,         /* runtimeclass_def  */
-  YYSYMBOL_apicontract = 300,              /* apicontract  */
-  YYSYMBOL_namespacedef = 301,             /* namespacedef  */
-  YYSYMBOL_class_interfaces = 302,         /* class_interfaces  */
-  YYSYMBOL_class_interface = 303,          /* class_interface  */
-  YYSYMBOL_dispinterface = 304,            /* dispinterface  */
-  YYSYMBOL_dispinterfacehdr = 305,         /* dispinterfacehdr  */
-  YYSYMBOL_dispint_props = 306,            /* dispint_props  */
-  YYSYMBOL_dispint_meths = 307,            /* dispint_meths  */
-  YYSYMBOL_dispinterfacedef = 308,         /* dispinterfacedef  */
-  YYSYMBOL_inherit = 309,                  /* inherit  */
-  YYSYMBOL_interface = 310,                /* interface  */
-  YYSYMBOL_interfacehdr = 311,             /* interfacehdr  */
-  YYSYMBOL_interfacedef = 312,             /* interfacedef  */
-  YYSYMBOL_interfacedec = 313,             /* interfacedec  */
-  YYSYMBOL_module = 314,                   /* module  */
-  YYSYMBOL_modulehdr = 315,                /* modulehdr  */
-  YYSYMBOL_moduledef = 316,                /* moduledef  */
-  YYSYMBOL_storage_cls_spec = 317,         /* storage_cls_spec  */
-  YYSYMBOL_function_specifier = 318,       /* function_specifier  */
-  YYSYMBOL_type_qualifier = 319,           /* type_qualifier  */
-  YYSYMBOL_m_type_qual_list = 320,         /* m_type_qual_list  */
-  YYSYMBOL_decl_spec = 321,                /* decl_spec  */
-  YYSYMBOL_m_decl_spec_no_type = 322,      /* m_decl_spec_no_type  */
-  YYSYMBOL_decl_spec_no_type = 323,        /* decl_spec_no_type  */
-  YYSYMBOL_declarator = 324,               /* declarator  */
-  YYSYMBOL_direct_declarator = 325,        /* direct_declarator  */
-  YYSYMBOL_abstract_declarator = 326,      /* abstract_declarator  */
-  YYSYMBOL_abstract_declarator_no_direct = 327, /* abstract_declarator_no_direct  */
-  YYSYMBOL_m_abstract_declarator = 328,    /* m_abstract_declarator  */
-  YYSYMBOL_abstract_direct_declarator = 329, /* abstract_direct_declarator  */
-  YYSYMBOL_any_declarator = 330,           /* any_declarator  */
-  YYSYMBOL_any_declarator_no_direct = 331, /* any_declarator_no_direct  */
-  YYSYMBOL_m_any_declarator = 332,         /* m_any_declarator  */
-  YYSYMBOL_any_direct_declarator = 333,    /* any_direct_declarator  */
-  YYSYMBOL_declarator_list = 334,          /* declarator_list  */
-  YYSYMBOL_m_bitfield = 335,               /* m_bitfield  */
-  YYSYMBOL_struct_declarator = 336,        /* struct_declarator  */
-  YYSYMBOL_struct_declarator_list = 337,   /* struct_declarator_list  */
-  YYSYMBOL_init_declarator = 338,          /* init_declarator  */
-  YYSYMBOL_threading_type = 339,           /* threading_type  */
-  YYSYMBOL_pointer_type = 340,             /* pointer_type  */
-  YYSYMBOL_structdef = 341,                /* structdef  */
-  YYSYMBOL_type = 342,                     /* type  */
-  YYSYMBOL_typedef = 343,                  /* typedef  */
-  YYSYMBOL_uniondef = 344,                 /* uniondef  */
-  YYSYMBOL_version = 345,                  /* version  */
-  YYSYMBOL_acf_statements = 346,           /* acf_statements  */
-  YYSYMBOL_acf_int_statements = 347,       /* acf_int_statements  */
-  YYSYMBOL_acf_int_statement = 348,        /* acf_int_statement  */
-  YYSYMBOL_acf_interface = 349,            /* acf_interface  */
-  YYSYMBOL_acf_attributes = 350,           /* acf_attributes  */
-  YYSYMBOL_acf_attribute_list = 351,       /* acf_attribute_list  */
-  YYSYMBOL_acf_attribute = 352,            /* acf_attribute  */
-  YYSYMBOL_allocate_option_list = 353,     /* allocate_option_list  */
-  YYSYMBOL_allocate_option = 354           /* allocate_option  */
+  YYSYMBOL_tEVENTADD = 77,                 /* tEVENTADD  */
+  YYSYMBOL_tEVENTREMOVE = 78,              /* tEVENTREMOVE  */
+  YYSYMBOL_tEXCLUSIVETO = 79,              /* tEXCLUSIVETO  */
+  YYSYMBOL_tEXPLICITHANDLE = 80,           /* tEXPLICITHANDLE  */
+  YYSYMBOL_tEXTERN = 81,                   /* tEXTERN  */
+  YYSYMBOL_tFALSE = 82,                    /* tFALSE  */
+  YYSYMBOL_tFASTCALL = 83,                 /* tFASTCALL  */
+  YYSYMBOL_tFAULTSTATUS = 84,              /* tFAULTSTATUS  */
+  YYSYMBOL_tFLAGS = 85,                    /* tFLAGS  */
+  YYSYMBOL_tFLOAT = 86,                    /* tFLOAT  */
+  YYSYMBOL_tFORCEALLOCATE = 87,            /* tFORCEALLOCATE  */
+  YYSYMBOL_tHANDLE = 88,                   /* tHANDLE  */
+  YYSYMBOL_tHANDLET = 89,                  /* tHANDLET  */
+  YYSYMBOL_tHELPCONTEXT = 90,              /* tHELPCONTEXT  */
+  YYSYMBOL_tHELPFILE = 91,                 /* tHELPFILE  */
+  YYSYMBOL_tHELPSTRING = 92,               /* tHELPSTRING  */
+  YYSYMBOL_tHELPSTRINGCONTEXT = 93,        /* tHELPSTRINGCONTEXT  */
+  YYSYMBOL_tHELPSTRINGDLL = 94,            /* tHELPSTRINGDLL  */
+  YYSYMBOL_tHIDDEN = 95,                   /* tHIDDEN  */
+  YYSYMBOL_tHYPER = 96,                    /* tHYPER  */
+  YYSYMBOL_tID = 97,                       /* tID  */
+  YYSYMBOL_tIDEMPOTENT = 98,               /* tIDEMPOTENT  */
+  YYSYMBOL_tIGNORE = 99,                   /* tIGNORE  */
+  YYSYMBOL_tIIDIS = 100,                   /* tIIDIS  */
+  YYSYMBOL_tIMMEDIATEBIND = 101,           /* tIMMEDIATEBIND  */
+  YYSYMBOL_tIMPLICITHANDLE = 102,          /* tIMPLICITHANDLE  */
+  YYSYMBOL_tIMPORT = 103,                  /* tIMPORT  */
+  YYSYMBOL_tIMPORTLIB = 104,               /* tIMPORTLIB  */
+  YYSYMBOL_tIN = 105,                      /* tIN  */
+  YYSYMBOL_tIN_LINE = 106,                 /* tIN_LINE  */
+  YYSYMBOL_tINLINE = 107,                  /* tINLINE  */
+  YYSYMBOL_tINPUTSYNC = 108,               /* tINPUTSYNC  */
+  YYSYMBOL_tINT = 109,                     /* tINT  */
+  YYSYMBOL_tINT32 = 110,                   /* tINT32  */
+  YYSYMBOL_tINT3264 = 111,                 /* tINT3264  */
+  YYSYMBOL_tINT64 = 112,                   /* tINT64  */
+  YYSYMBOL_tINTERFACE = 113,               /* tINTERFACE  */
+  YYSYMBOL_tLCID = 114,                    /* tLCID  */
+  YYSYMBOL_tLENGTHIS = 115,                /* tLENGTHIS  */
+  YYSYMBOL_tLIBRARY = 116,                 /* tLIBRARY  */
+  YYSYMBOL_tLICENSED = 117,                /* tLICENSED  */
+  YYSYMBOL_tLOCAL = 118,                   /* tLOCAL  */
+  YYSYMBOL_tLONG = 119,                    /* tLONG  */
+  YYSYMBOL_tMARSHALINGBEHAVIOR = 120,      /* tMARSHALINGBEHAVIOR  */
+  YYSYMBOL_tMAYBE = 121,                   /* tMAYBE  */
+  YYSYMBOL_tMESSAGE = 122,                 /* tMESSAGE  */
+  YYSYMBOL_tMETHODS = 123,                 /* tMETHODS  */
+  YYSYMBOL_tMODULE = 124,                  /* tMODULE  */
+  YYSYMBOL_tMTA = 125,                     /* tMTA  */
+  YYSYMBOL_tNAMESPACE = 126,               /* tNAMESPACE  */
+  YYSYMBOL_tNOCODE = 127,                  /* tNOCODE  */
+  YYSYMBOL_tNONBROWSABLE = 128,            /* tNONBROWSABLE  */
+  YYSYMBOL_tNONCREATABLE = 129,            /* tNONCREATABLE  */
+  YYSYMBOL_tNONE = 130,                    /* tNONE  */
+  YYSYMBOL_tNONEXTENSIBLE = 131,           /* tNONEXTENSIBLE  */
+  YYSYMBOL_tNOTIFY = 132,                  /* tNOTIFY  */
+  YYSYMBOL_tNOTIFYFLAG = 133,              /* tNOTIFYFLAG  */
+  YYSYMBOL_tNULL = 134,                    /* tNULL  */
+  YYSYMBOL_tOBJECT = 135,                  /* tOBJECT  */
+  YYSYMBOL_tODL = 136,                     /* tODL  */
+  YYSYMBOL_tOLEAUTOMATION = 137,           /* tOLEAUTOMATION  */
+  YYSYMBOL_tOPTIMIZE = 138,                /* tOPTIMIZE  */
+  YYSYMBOL_tOPTIONAL = 139,                /* tOPTIONAL  */
+  YYSYMBOL_tOUT = 140,                     /* tOUT  */
+  YYSYMBOL_tPARTIALIGNORE = 141,           /* tPARTIALIGNORE  */
+  YYSYMBOL_tPASCAL = 142,                  /* tPASCAL  */
+  YYSYMBOL_tPOINTERDEFAULT = 143,          /* tPOINTERDEFAULT  */
+  YYSYMBOL_tPRAGMA_WARNING = 144,          /* tPRAGMA_WARNING  */
+  YYSYMBOL_tPROGID = 145,                  /* tPROGID  */
+  YYSYMBOL_tPROPERTIES = 146,              /* tPROPERTIES  */
+  YYSYMBOL_tPROPGET = 147,                 /* tPROPGET  */
+  YYSYMBOL_tPROPPUT = 148,                 /* tPROPPUT  */
+  YYSYMBOL_tPROPPUTREF = 149,              /* tPROPPUTREF  */
+  YYSYMBOL_tPROXY = 150,                   /* tPROXY  */
+  YYSYMBOL_tPTR = 151,                     /* tPTR  */
+  YYSYMBOL_tPUBLIC = 152,                  /* tPUBLIC  */
+  YYSYMBOL_tRANGE = 153,                   /* tRANGE  */
+  YYSYMBOL_tREADONLY = 154,                /* tREADONLY  */
+  YYSYMBOL_tREF = 155,                     /* tREF  */
+  YYSYMBOL_tREGISTER = 156,                /* tREGISTER  */
+  YYSYMBOL_tREPRESENTAS = 157,             /* tREPRESENTAS  */
+  YYSYMBOL_tREQUESTEDIT = 158,             /* tREQUESTEDIT  */
+  YYSYMBOL_tRESTRICTED = 159,              /* tRESTRICTED  */
+  YYSYMBOL_tRETVAL = 160,                  /* tRETVAL  */
+  YYSYMBOL_tRUNTIMECLASS = 161,            /* tRUNTIMECLASS  */
+  YYSYMBOL_tSAFEARRAY = 162,               /* tSAFEARRAY  */
+  YYSYMBOL_tSHORT = 163,                   /* tSHORT  */
+  YYSYMBOL_tSIGNED = 164,                  /* tSIGNED  */
+  YYSYMBOL_tSINGLENODE = 165,              /* tSINGLENODE  */
+  YYSYMBOL_tSIZEIS = 166,                  /* tSIZEIS  */
+  YYSYMBOL_tSIZEOF = 167,                  /* tSIZEOF  */
+  YYSYMBOL_tSMALL = 168,                   /* tSMALL  */
+  YYSYMBOL_tSOURCE = 169,                  /* tSOURCE  */
+  YYSYMBOL_tSTANDARD = 170,                /* tSTANDARD  */
+  YYSYMBOL_tSTATIC = 171,                  /* tSTATIC  */
+  YYSYMBOL_tSTDCALL = 172,                 /* tSTDCALL  */
+  YYSYMBOL_tSTRICTCONTEXTHANDLE = 173,     /* tSTRICTCONTEXTHANDLE  */
+  YYSYMBOL_tSTRING = 174,                  /* tSTRING  */
+  YYSYMBOL_tSTRUCT = 175,                  /* tSTRUCT  */
+  YYSYMBOL_tSWITCH = 176,                  /* tSWITCH  */
+  YYSYMBOL_tSWITCHIS = 177,                /* tSWITCHIS  */
+  YYSYMBOL_tSWITCHTYPE = 178,              /* tSWITCHTYPE  */
+  YYSYMBOL_tTHREADING = 179,               /* tTHREADING  */
+  YYSYMBOL_tTRANSMITAS = 180,              /* tTRANSMITAS  */
+  YYSYMBOL_tTRUE = 181,                    /* tTRUE  */
+  YYSYMBOL_tTYPEDEF = 182,                 /* tTYPEDEF  */
+  YYSYMBOL_tUIDEFAULT = 183,               /* tUIDEFAULT  */
+  YYSYMBOL_tUNION = 184,                   /* tUNION  */
+  YYSYMBOL_tUNIQUE = 185,                  /* tUNIQUE  */
+  YYSYMBOL_tUNSIGNED = 186,                /* tUNSIGNED  */
+  YYSYMBOL_tUSESGETLASTERROR = 187,        /* tUSESGETLASTERROR  */
+  YYSYMBOL_tUSERMARSHAL = 188,             /* tUSERMARSHAL  */
+  YYSYMBOL_tUUID = 189,                    /* tUUID  */
+  YYSYMBOL_tV1ENUM = 190,                  /* tV1ENUM  */
+  YYSYMBOL_tVARARG = 191,                  /* tVARARG  */
+  YYSYMBOL_tVERSION = 192,                 /* tVERSION  */
+  YYSYMBOL_tVIPROGID = 193,                /* tVIPROGID  */
+  YYSYMBOL_tVOID = 194,                    /* tVOID  */
+  YYSYMBOL_tWCHAR = 195,                   /* tWCHAR  */
+  YYSYMBOL_tWIREMARSHAL = 196,             /* tWIREMARSHAL  */
+  YYSYMBOL_tAPARTMENT = 197,               /* tAPARTMENT  */
+  YYSYMBOL_tNEUTRAL = 198,                 /* tNEUTRAL  */
+  YYSYMBOL_tSINGLE = 199,                  /* tSINGLE  */
+  YYSYMBOL_tFREE = 200,                    /* tFREE  */
+  YYSYMBOL_tBOTH = 201,                    /* tBOTH  */
+  YYSYMBOL_202_ = 202,                     /* ','  */
+  YYSYMBOL_203_ = 203,                     /* '?'  */
+  YYSYMBOL_204_ = 204,                     /* ':'  */
+  YYSYMBOL_205_ = 205,                     /* '|'  */
+  YYSYMBOL_206_ = 206,                     /* '^'  */
+  YYSYMBOL_207_ = 207,                     /* '&'  */
+  YYSYMBOL_208_ = 208,                     /* '<'  */
+  YYSYMBOL_209_ = 209,                     /* '>'  */
+  YYSYMBOL_210_ = 210,                     /* '-'  */
+  YYSYMBOL_211_ = 211,                     /* '+'  */
+  YYSYMBOL_212_ = 212,                     /* '*'  */
+  YYSYMBOL_213_ = 213,                     /* '/'  */
+  YYSYMBOL_214_ = 214,                     /* '%'  */
+  YYSYMBOL_215_ = 215,                     /* '!'  */
+  YYSYMBOL_216_ = 216,                     /* '~'  */
+  YYSYMBOL_CAST = 217,                     /* CAST  */
+  YYSYMBOL_PPTR = 218,                     /* PPTR  */
+  YYSYMBOL_POS = 219,                      /* POS  */
+  YYSYMBOL_NEG = 220,                      /* NEG  */
+  YYSYMBOL_ADDRESSOF = 221,                /* ADDRESSOF  */
+  YYSYMBOL_222_ = 222,                     /* '.'  */
+  YYSYMBOL_223_ = 223,                     /* '['  */
+  YYSYMBOL_224_ = 224,                     /* ']'  */
+  YYSYMBOL_225_ = 225,                     /* '{'  */
+  YYSYMBOL_226_ = 226,                     /* '}'  */
+  YYSYMBOL_227_ = 227,                     /* ';'  */
+  YYSYMBOL_228_ = 228,                     /* '('  */
+  YYSYMBOL_229_ = 229,                     /* ')'  */
+  YYSYMBOL_230_ = 230,                     /* '='  */
+  YYSYMBOL_YYACCEPT = 231,                 /* $accept  */
+  YYSYMBOL_input = 232,                    /* input  */
+  YYSYMBOL_m_acf = 233,                    /* m_acf  */
+  YYSYMBOL_gbl_statements = 234,           /* gbl_statements  */
+  YYSYMBOL_235_1 = 235,                    /* $@1  */
+  YYSYMBOL_imp_statements = 236,           /* imp_statements  */
+  YYSYMBOL_237_2 = 237,                    /* $@2  */
+  YYSYMBOL_int_statements = 238,           /* int_statements  */
+  YYSYMBOL_semicolon_opt = 239,            /* semicolon_opt  */
+  YYSYMBOL_statement = 240,                /* statement  */
+  YYSYMBOL_pragma_warning = 241,           /* pragma_warning  */
+  YYSYMBOL_warnings = 242,                 /* warnings  */
+  YYSYMBOL_typedecl = 243,                 /* typedecl  */
+  YYSYMBOL_cppquote = 244,                 /* cppquote  */
+  YYSYMBOL_import_start = 245,             /* import_start  */
+  YYSYMBOL_import = 246,                   /* import  */
+  YYSYMBOL_importlib = 247,                /* importlib  */
+  YYSYMBOL_libraryhdr = 248,               /* libraryhdr  */
+  YYSYMBOL_library_start = 249,            /* library_start  */
+  YYSYMBOL_librarydef = 250,               /* librarydef  */
+  YYSYMBOL_m_args = 251,                   /* m_args  */
+  YYSYMBOL_arg_list = 252,                 /* arg_list  */
+  YYSYMBOL_args = 253,                     /* args  */
+  YYSYMBOL_arg = 254,                      /* arg  */
+  YYSYMBOL_array = 255,                    /* array  */
+  YYSYMBOL_m_attributes = 256,             /* m_attributes  */
+  YYSYMBOL_attributes = 257,               /* attributes  */
+  YYSYMBOL_attrib_list = 258,              /* attrib_list  */
+  YYSYMBOL_str_list = 259,                 /* str_list  */
+  YYSYMBOL_marshaling_behavior = 260,      /* marshaling_behavior  */
+  YYSYMBOL_contract_ver = 261,             /* contract_ver  */
+  YYSYMBOL_contract_req = 262,             /* contract_req  */
+  YYSYMBOL_attribute = 263,                /* attribute  */
+  YYSYMBOL_uuid_string = 264,              /* uuid_string  */
+  YYSYMBOL_callconv = 265,                 /* callconv  */
+  YYSYMBOL_cases = 266,                    /* cases  */
+  YYSYMBOL_case = 267,                     /* case  */
+  YYSYMBOL_enums = 268,                    /* enums  */
+  YYSYMBOL_enum_list = 269,                /* enum_list  */
+  YYSYMBOL_enum_member = 270,              /* enum_member  */
+  YYSYMBOL_enum = 271,                     /* enum  */
+  YYSYMBOL_enumdef = 272,                  /* enumdef  */
+  YYSYMBOL_m_exprs = 273,                  /* m_exprs  */
+  YYSYMBOL_m_expr = 274,                   /* m_expr  */
+  YYSYMBOL_expr = 275,                     /* expr  */
+  YYSYMBOL_expr_list_int_const = 276,      /* expr_list_int_const  */
+  YYSYMBOL_expr_int_const = 277,           /* expr_int_const  */
+  YYSYMBOL_expr_const = 278,               /* expr_const  */
+  YYSYMBOL_fields = 279,                   /* fields  */
+  YYSYMBOL_field = 280,                    /* field  */
+  YYSYMBOL_ne_union_field = 281,           /* ne_union_field  */
+  YYSYMBOL_ne_union_fields = 282,          /* ne_union_fields  */
+  YYSYMBOL_union_field = 283,              /* union_field  */
+  YYSYMBOL_s_field = 284,                  /* s_field  */
+  YYSYMBOL_funcdef = 285,                  /* funcdef  */
+  YYSYMBOL_declaration = 286,              /* declaration  */
+  YYSYMBOL_m_ident = 287,                  /* m_ident  */
+  YYSYMBOL_m_typename = 288,               /* m_typename  */
+  YYSYMBOL_typename = 289,                 /* typename  */
+  YYSYMBOL_ident = 290,                    /* ident  */
+  YYSYMBOL_base_type = 291,                /* base_type  */
+  YYSYMBOL_m_int = 292,                    /* m_int  */
+  YYSYMBOL_int_std = 293,                  /* int_std  */
+  YYSYMBOL_qualified_seq = 294,            /* qualified_seq  */
+  YYSYMBOL_295_3 = 295,                    /* $@3  */
+  YYSYMBOL_qualified_type = 296,           /* qualified_type  */
+  YYSYMBOL_297_4 = 297,                    /* $@4  */
+  YYSYMBOL_coclass = 298,                  /* coclass  */
+  YYSYMBOL_coclassdef = 299,               /* coclassdef  */
+  YYSYMBOL_runtimeclass = 300,             /* runtimeclass  */
+  YYSYMBOL_runtimeclass_def = 301,         /* runtimeclass_def  */
+  YYSYMBOL_apicontract = 302,              /* apicontract  */
+  YYSYMBOL_apicontract_def = 303,          /* apicontract_def  */
+  YYSYMBOL_namespacedef = 304,             /* namespacedef  */
+  YYSYMBOL_class_interfaces = 305,         /* class_interfaces  */
+  YYSYMBOL_class_interface = 306,          /* class_interface  */
+  YYSYMBOL_dispinterface = 307,            /* dispinterface  */
+  YYSYMBOL_dispattributes = 308,           /* dispattributes  */
+  YYSYMBOL_dispint_props = 309,            /* dispint_props  */
+  YYSYMBOL_dispint_meths = 310,            /* dispint_meths  */
+  YYSYMBOL_dispinterfacedef = 311,         /* dispinterfacedef  */
+  YYSYMBOL_inherit = 312,                  /* inherit  */
+  YYSYMBOL_interface = 313,                /* interface  */
+  YYSYMBOL_interfacedef = 314,             /* interfacedef  */
+  YYSYMBOL_interfaceref = 315,             /* interfaceref  */
+  YYSYMBOL_module = 316,                   /* module  */
+  YYSYMBOL_moduledef = 317,                /* moduledef  */
+  YYSYMBOL_storage_cls_spec = 318,         /* storage_cls_spec  */
+  YYSYMBOL_function_specifier = 319,       /* function_specifier  */
+  YYSYMBOL_type_qualifier = 320,           /* type_qualifier  */
+  YYSYMBOL_m_type_qual_list = 321,         /* m_type_qual_list  */
+  YYSYMBOL_decl_spec = 322,                /* decl_spec  */
+  YYSYMBOL_m_decl_spec_no_type = 323,      /* m_decl_spec_no_type  */
+  YYSYMBOL_decl_spec_no_type = 324,        /* decl_spec_no_type  */
+  YYSYMBOL_declarator = 325,               /* declarator  */
+  YYSYMBOL_direct_declarator = 326,        /* direct_declarator  */
+  YYSYMBOL_abstract_declarator = 327,      /* abstract_declarator  */
+  YYSYMBOL_abstract_declarator_no_direct = 328, /* abstract_declarator_no_direct  */
+  YYSYMBOL_m_abstract_declarator = 329,    /* m_abstract_declarator  */
+  YYSYMBOL_abstract_direct_declarator = 330, /* abstract_direct_declarator  */
+  YYSYMBOL_any_declarator = 331,           /* any_declarator  */
+  YYSYMBOL_any_declarator_no_direct = 332, /* any_declarator_no_direct  */
+  YYSYMBOL_m_any_declarator = 333,         /* m_any_declarator  */
+  YYSYMBOL_any_direct_declarator = 334,    /* any_direct_declarator  */
+  YYSYMBOL_declarator_list = 335,          /* declarator_list  */
+  YYSYMBOL_m_bitfield = 336,               /* m_bitfield  */
+  YYSYMBOL_struct_declarator = 337,        /* struct_declarator  */
+  YYSYMBOL_struct_declarator_list = 338,   /* struct_declarator_list  */
+  YYSYMBOL_init_declarator = 339,          /* init_declarator  */
+  YYSYMBOL_threading_type = 340,           /* threading_type  */
+  YYSYMBOL_pointer_type = 341,             /* pointer_type  */
+  YYSYMBOL_structdef = 342,                /* structdef  */
+  YYSYMBOL_type = 343,                     /* type  */
+  YYSYMBOL_typedef = 344,                  /* typedef  */
+  YYSYMBOL_uniondef = 345,                 /* uniondef  */
+  YYSYMBOL_version = 346,                  /* version  */
+  YYSYMBOL_acf_statements = 347,           /* acf_statements  */
+  YYSYMBOL_acf_int_statements = 348,       /* acf_int_statements  */
+  YYSYMBOL_acf_int_statement = 349,        /* acf_int_statement  */
+  YYSYMBOL_acf_interface = 350,            /* acf_interface  */
+  YYSYMBOL_acf_attributes = 351,           /* acf_attributes  */
+  YYSYMBOL_acf_attribute_list = 352,       /* acf_attribute_list  */
+  YYSYMBOL_acf_attribute = 353,            /* acf_attribute  */
+  YYSYMBOL_allocate_option_list = 354,     /* allocate_option_list  */
+  YYSYMBOL_allocate_option = 355           /* allocate_option  */
 };
 typedef enum yysymbol_kind_t yysymbol_kind_t;
 
@@ -1171,19 +1167,19 @@
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  3
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   3307
+#define YYLAST   3585
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  228
+#define YYNTOKENS  231
 /* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  127
+#define YYNNTS  125
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  448
+#define YYNRULES  446
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  797
+#define YYNSTATES  802
 
 /* YYMAXUTOK -- Last valid token kind.  */
-#define YYMAXUTOK   458
+#define YYMAXUTOK   461
 
 
 /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
@@ -1200,16 +1196,16 @@
        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,   212,     2,     2,     2,   211,   204,     2,
-     225,   226,   209,   208,   199,   207,   219,   210,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,   201,   224,
-     205,   227,   206,   200,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,   215,     2,     2,     2,   214,   207,     2,
+     228,   229,   212,   211,   202,   210,   222,   213,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,   204,   227,
+     208,   230,   209,   203,     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,   220,     2,   221,   203,     2,     2,     2,     2,     2,
+       2,   223,     2,   224,   206,     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,   222,   202,   223,   213,     2,     2,     2,
+       2,     2,     2,   225,   205,   226,   216,     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,
@@ -1242,58 +1238,59 @@
      165,   166,   167,   168,   169,   170,   171,   172,   173,   174,
      175,   176,   177,   178,   179,   180,   181,   182,   183,   184,
      185,   186,   187,   188,   189,   190,   191,   192,   193,   194,
-     195,   196,   197,   198,   214,   215,   216,   217,   218
+     195,   196,   197,   198,   199,   200,   201,   217,   218,   219,
+     220,   221
 };
 
 #if YYDEBUG
   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 static const yytype_int16 yyrline[] =
 {
-       0,   341,   341,   355,   355,   357,   358,   358,   360,   361,
-     362,   365,   368,   370,   371,   373,   374,   375,   378,   379,
-     380,   380,   382,   383,   384,   387,   389,   390,   392,   393,
-     394,   395,   398,   399,   402,   403,   407,   408,   409,   410,
-     411,   412,   413,   416,   427,   428,   432,   433,   434,   435,
-     436,   437,   438,   439,   440,   443,   445,   453,   459,   463,
-     464,   466,   470,   474,   475,   478,   479,   482,   483,   487,
-     492,   499,   503,   504,   507,   508,   512,   515,   516,   517,
-     520,   521,   525,   526,   527,   531,   532,   535,   541,   542,
-     543,   544,   545,   546,   547,   548,   549,   550,   551,   552,
-     553,   554,   555,   556,   557,   558,   559,   560,   561,   562,
-     563,   564,   565,   566,   567,   568,   569,   570,   571,   572,
-     573,   574,   577,   578,   579,   580,   581,   582,   583,   584,
-     585,   586,   587,   588,   589,   590,   591,   592,   593,   594,
-     595,   596,   597,   598,   599,   600,   602,   603,   604,   605,
-     606,   607,   608,   609,   610,   611,   612,   613,   614,   615,
-     616,   617,   618,   619,   620,   621,   622,   623,   624,   628,
-     629,   630,   631,   632,   633,   634,   635,   636,   637,   638,
-     639,   640,   641,   642,   643,   644,   645,   646,   647,   648,
-     649,   650,   651,   655,   656,   661,   662,   663,   664,   667,
-     668,   671,   675,   681,   682,   683,   686,   690,   702,   707,
-     711,   716,   719,   720,   723,   724,   727,   728,   729,   730,
-     731,   732,   733,   734,   735,   736,   737,   738,   739,   740,
-     741,   742,   743,   744,   745,   746,   747,   748,   749,   750,
-     751,   752,   753,   754,   755,   756,   757,   758,   759,   760,
-     761,   762,   763,   764,   766,   768,   769,   772,   773,   776,
-     782,   788,   789,   792,   797,   804,   805,   808,   809,   813,
-     814,   817,   821,   827,   835,   839,   844,   845,   848,   849,
-     850,   853,   855,   858,   859,   860,   861,   862,   863,   864,
-     865,   866,   867,   868,   871,   872,   875,   876,   877,   878,
-     879,   880,   881,   882,   883,   887,   888,   888,   892,   893,
-     893,   896,   897,   905,   911,   916,   917,   924,   930,   934,
-     941,   942,   945,   946,   950,   953,   954,   957,   966,   967,
-     970,   971,   974,   980,   986,   987,   990,   991,   994,  1001,
-    1010,  1015,  1019,  1020,  1023,  1024,  1027,  1032,  1039,  1040,
-    1041,  1045,  1049,  1052,  1053,  1056,  1057,  1061,  1062,  1066,
-    1067,  1068,  1072,  1074,  1075,  1079,  1080,  1081,  1082,  1087,
-    1089,  1090,  1095,  1097,  1101,  1102,  1107,  1108,  1109,  1110,
-    1114,  1122,  1124,  1125,  1130,  1132,  1136,  1137,  1144,  1145,
-    1146,  1147,  1148,  1152,  1159,  1160,  1163,  1164,  1167,  1174,
-    1175,  1180,  1181,  1185,  1186,  1187,  1188,  1189,  1190,  1194,
-    1195,  1196,  1199,  1202,  1203,  1204,  1205,  1206,  1207,  1208,
-    1209,  1210,  1211,  1214,  1221,  1223,  1229,  1230,  1231,  1235,
-    1236,  1240,  1241,  1245,  1252,  1261,  1262,  1266,  1267,  1271,
-    1273,  1274,  1275,  1279,  1280,  1285,  1286,  1287,  1288
+       0,   337,   337,   351,   351,   353,   354,   354,   356,   357,
+     358,   359,   362,   365,   366,   368,   369,   371,   372,   373,
+     376,   377,   378,   379,   379,   381,   382,   383,   386,   387,
+     389,   390,   392,   393,   394,   395,   398,   399,   402,   403,
+     407,   408,   409,   410,   411,   412,   413,   416,   427,   428,
+     432,   433,   434,   435,   436,   437,   438,   439,   440,   443,
+     445,   453,   459,   463,   465,   469,   473,   474,   477,   478,
+     481,   482,   486,   491,   498,   502,   503,   506,   507,   511,
+     514,   515,   516,   519,   520,   524,   525,   526,   530,   531,
+     534,   540,   541,   542,   543,   544,   545,   546,   547,   548,
+     549,   550,   551,   552,   553,   554,   555,   556,   557,   558,
+     559,   560,   561,   562,   563,   564,   565,   566,   567,   568,
+     569,   570,   571,   572,   573,   574,   575,   578,   579,   580,
+     581,   582,   583,   584,   585,   586,   587,   588,   589,   590,
+     591,   592,   593,   594,   595,   596,   597,   598,   599,   600,
+     601,   602,   604,   605,   606,   607,   608,   609,   610,   611,
+     612,   613,   614,   615,   616,   617,   618,   619,   620,   621,
+     622,   623,   624,   625,   626,   630,   631,   632,   633,   634,
+     635,   636,   637,   638,   639,   640,   641,   642,   643,   644,
+     645,   646,   647,   648,   649,   650,   651,   652,   653,   657,
+     658,   663,   664,   665,   666,   669,   670,   673,   677,   683,
+     684,   685,   688,   692,   704,   709,   713,   718,   721,   722,
+     725,   726,   729,   730,   731,   732,   733,   734,   735,   736,
+     737,   738,   739,   740,   741,   742,   743,   744,   745,   746,
+     747,   748,   749,   750,   751,   752,   753,   754,   755,   756,
+     757,   758,   759,   760,   761,   762,   763,   764,   765,   766,
+     768,   770,   771,   774,   775,   778,   784,   790,   791,   794,
+     799,   806,   807,   810,   811,   815,   816,   819,   823,   829,
+     837,   841,   846,   847,   850,   851,   854,   855,   858,   861,
+     862,   863,   864,   865,   866,   867,   868,   869,   870,   871,
+     874,   875,   878,   879,   880,   881,   882,   883,   884,   885,
+     886,   890,   891,   891,   895,   896,   896,   899,   902,   906,
+     909,   913,   916,   920,   921,   924,   925,   929,   932,   935,
+     938,   939,   942,   943,   947,   949,   953,   954,   957,   960,
+     966,   969,   973,   974,   977,   980,   985,   986,   987,   991,
+     995,   998,   999,  1002,  1003,  1007,  1008,  1012,  1013,  1014,
+    1018,  1020,  1021,  1025,  1026,  1027,  1028,  1033,  1035,  1036,
+    1041,  1043,  1047,  1048,  1053,  1054,  1055,  1056,  1060,  1068,
+    1070,  1071,  1076,  1078,  1082,  1083,  1090,  1091,  1092,  1093,
+    1094,  1098,  1105,  1106,  1109,  1110,  1113,  1120,  1121,  1126,
+    1127,  1131,  1132,  1133,  1134,  1135,  1136,  1140,  1141,  1142,
+    1145,  1148,  1149,  1150,  1151,  1152,  1153,  1154,  1155,  1156,
+    1157,  1160,  1167,  1169,  1175,  1176,  1177,  1181,  1182,  1186,
+    1187,  1191,  1198,  1207,  1208,  1212,  1213,  1217,  1219,  1220,
+    1221,  1225,  1226,  1231,  1232,  1233,  1234
 };
 #endif
 
@@ -1324,27 +1321,27 @@
   "tDEFAULTVALUE", "tDEFAULTVTABLE", "tDISABLECONSISTENCYCHECK",
   "tDISPLAYBIND", "tDISPINTERFACE", "tDLLNAME", "tDONTFREE", "tDOUBLE",
   "tDUAL", "tENABLEALLOCATE", "tENCODE", "tENDPOINT", "tENTRY", "tENUM",
-  "tERRORSTATUST", "tEXCLUSIVETO", "tEXPLICITHANDLE", "tEXTERN", "tFALSE",
-  "tFASTCALL", "tFAULTSTATUS", "tFLOAT", "tFORCEALLOCATE", "tHANDLE",
-  "tHANDLET", "tHELPCONTEXT", "tHELPFILE", "tHELPSTRING",
-  "tHELPSTRINGCONTEXT", "tHELPSTRINGDLL", "tHIDDEN", "tHYPER", "tID",
-  "tIDEMPOTENT", "tIGNORE", "tIIDIS", "tIMMEDIATEBIND", "tIMPLICITHANDLE",
-  "tIMPORT", "tIMPORTLIB", "tIN", "tIN_LINE", "tINLINE", "tINPUTSYNC",
-  "tINT", "tINT32", "tINT3264", "tINT64", "tINTERFACE", "tLCID",
-  "tLENGTHIS", "tLIBRARY", "tLICENSED", "tLOCAL", "tLONG",
-  "tMARSHALINGBEHAVIOR", "tMAYBE", "tMESSAGE", "tMETHODS", "tMODULE",
-  "tMTA", "tNAMESPACE", "tNOCODE", "tNONBROWSABLE", "tNONCREATABLE",
-  "tNONE", "tNONEXTENSIBLE", "tNOTIFY", "tNOTIFYFLAG", "tNULL", "tOBJECT",
-  "tODL", "tOLEAUTOMATION", "tOPTIMIZE", "tOPTIONAL", "tOUT",
-  "tPARTIALIGNORE", "tPASCAL", "tPOINTERDEFAULT", "tPRAGMA_WARNING",
-  "tPROGID", "tPROPERTIES", "tPROPGET", "tPROPPUT", "tPROPPUTREF",
-  "tPROXY", "tPTR", "tPUBLIC", "tRANGE", "tREADONLY", "tREF", "tREGISTER",
-  "tREPRESENTAS", "tREQUESTEDIT", "tRESTRICTED", "tRETVAL",
-  "tRUNTIMECLASS", "tSAFEARRAY", "tSHORT", "tSIGNED", "tSINGLENODE",
-  "tSIZEIS", "tSIZEOF", "tSMALL", "tSOURCE", "tSTANDARD", "tSTATIC",
-  "tSTDCALL", "tSTRICTCONTEXTHANDLE", "tSTRING", "tSTRUCT", "tSWITCH",
-  "tSWITCHIS", "tSWITCHTYPE", "tTHREADING", "tTRANSMITAS", "tTRUE",
-  "tTYPEDEF", "tUIDEFAULT", "tUNION", "tUNIQUE", "tUNSIGNED",
+  "tERRORSTATUST", "tEVENTADD", "tEVENTREMOVE", "tEXCLUSIVETO",
+  "tEXPLICITHANDLE", "tEXTERN", "tFALSE", "tFASTCALL", "tFAULTSTATUS",
+  "tFLAGS", "tFLOAT", "tFORCEALLOCATE", "tHANDLE", "tHANDLET",
+  "tHELPCONTEXT", "tHELPFILE", "tHELPSTRING", "tHELPSTRINGCONTEXT",
+  "tHELPSTRINGDLL", "tHIDDEN", "tHYPER", "tID", "tIDEMPOTENT", "tIGNORE",
+  "tIIDIS", "tIMMEDIATEBIND", "tIMPLICITHANDLE", "tIMPORT", "tIMPORTLIB",
+  "tIN", "tIN_LINE", "tINLINE", "tINPUTSYNC", "tINT", "tINT32", "tINT3264",
+  "tINT64", "tINTERFACE", "tLCID", "tLENGTHIS", "tLIBRARY", "tLICENSED",
+  "tLOCAL", "tLONG", "tMARSHALINGBEHAVIOR", "tMAYBE", "tMESSAGE",
+  "tMETHODS", "tMODULE", "tMTA", "tNAMESPACE", "tNOCODE", "tNONBROWSABLE",
+  "tNONCREATABLE", "tNONE", "tNONEXTENSIBLE", "tNOTIFY", "tNOTIFYFLAG",
+  "tNULL", "tOBJECT", "tODL", "tOLEAUTOMATION", "tOPTIMIZE", "tOPTIONAL",
+  "tOUT", "tPARTIALIGNORE", "tPASCAL", "tPOINTERDEFAULT",
+  "tPRAGMA_WARNING", "tPROGID", "tPROPERTIES", "tPROPGET", "tPROPPUT",
+  "tPROPPUTREF", "tPROXY", "tPTR", "tPUBLIC", "tRANGE", "tREADONLY",
+  "tREF", "tREGISTER", "tREPRESENTAS", "tREQUESTEDIT", "tRESTRICTED",
+  "tRETVAL", "tRUNTIMECLASS", "tSAFEARRAY", "tSHORT", "tSIGNED",
+  "tSINGLENODE", "tSIZEIS", "tSIZEOF", "tSMALL", "tSOURCE", "tSTANDARD",
+  "tSTATIC", "tSTDCALL", "tSTRICTCONTEXTHANDLE", "tSTRING", "tSTRUCT",
+  "tSWITCH", "tSWITCHIS", "tSWITCHTYPE", "tTHREADING", "tTRANSMITAS",
+  "tTRUE", "tTYPEDEF", "tUIDEFAULT", "tUNION", "tUNIQUE", "tUNSIGNED",
   "tUSESGETLASTERROR", "tUSERMARSHAL", "tUUID", "tV1ENUM", "tVARARG",
   "tVERSION", "tVIPROGID", "tVOID", "tWCHAR", "tWIREMARSHAL", "tAPARTMENT",
   "tNEUTRAL", "tSINGLE", "tFREE", "tBOTH", "','", "'?'", "':'", "'|'",
@@ -1361,14 +1358,14 @@
   "enum_member", "enum", "enumdef", "m_exprs", "m_expr", "expr",
   "expr_list_int_const", "expr_int_const", "expr_const", "fields", "field",
   "ne_union_field", "ne_union_fields", "union_field", "s_field", "funcdef",
-  "declaration", "m_ident", "t_ident", "ident", "base_type", "m_int",
-  "int_std", "qualified_seq", "$@3", "qualified_type", "$@4", "coclass",
-  "coclasshdr", "coclassdef", "runtimeclass", "runtimeclass_hdr",
-  "runtimeclass_def", "apicontract", "namespacedef", "class_interfaces",
-  "class_interface", "dispinterface", "dispinterfacehdr", "dispint_props",
+  "declaration", "m_ident", "m_typename", "typename", "ident", "base_type",
+  "m_int", "int_std", "qualified_seq", "$@3", "qualified_type", "$@4",
+  "coclass", "coclassdef", "runtimeclass", "runtimeclass_def",
+  "apicontract", "apicontract_def", "namespacedef", "class_interfaces",
+  "class_interface", "dispinterface", "dispattributes", "dispint_props",
   "dispint_meths", "dispinterfacedef", "inherit", "interface",
-  "interfacehdr", "interfacedef", "interfacedec", "module", "modulehdr",
-  "moduledef", "storage_cls_spec", "function_specifier", "type_qualifier",
+  "interfacedef", "interfaceref", "module", "moduledef",
+  "storage_cls_spec", "function_specifier", "type_qualifier",
   "m_type_qual_list", "decl_spec", "m_decl_spec_no_type",
   "decl_spec_no_type", "declarator", "direct_declarator",
   "abstract_declarator", "abstract_declarator_no_direct",
@@ -1413,19 +1410,20 @@
      415,   416,   417,   418,   419,   420,   421,   422,   423,   424,
      425,   426,   427,   428,   429,   430,   431,   432,   433,   434,
      435,   436,   437,   438,   439,   440,   441,   442,   443,   444,
-     445,   446,   447,   448,   449,   450,   451,   452,   453,    44,
-      63,    58,   124,    94,    38,    60,    62,    45,    43,    42,
-      47,    37,    33,   126,   454,   455,   456,   457,   458,    46,
-      91,    93,   123,   125,    59,    40,    41,    61
+     445,   446,   447,   448,   449,   450,   451,   452,   453,   454,
+     455,   456,    44,    63,    58,   124,    94,    38,    60,    62,
+      45,    43,    42,    47,    37,    33,   126,   457,   458,   459,
+     460,   461,    46,    91,    93,   123,   125,    59,    40,    41,
+      61
 };
 #endif
 
-#define YYPACT_NINF (-618)
+#define YYPACT_NINF (-617)
 
 #define yypact_value_is_default(Yyn) \
   ((Yyn) == YYPACT_NINF)
 
-#define YYTABLE_NINF (-436)
+#define YYTABLE_NINF (-434)
 
 #define yytable_value_is_error(Yyn) \
   0
@@ -1434,86 +1432,87 @@
      STATE-NUM.  */
 static const yytype_int16 yypact[] =
 {
-    -618,    71,  1776,  -618,  -618,  -618,  -136,   -68,  -618,  -618,
-    -618,   185,  -618,  -121,   229,  -618,   263,  -618,  -618,  -618,
-    -618,    35,   117,  -618,  -618,  -618,  -618,  -618,   299,    35,
-     164,   -51,  -618,   306,   -47,    35,   325,  -618,  -618,   315,
-     318,   325,  -618,  -618,  3114,  -618,  -618,  -618,   -35,  -618,
-    -618,  -618,  -618,  -618,   -23,  2774,   -26,   -11,  -618,  -618,
-    -618,     4,   -45,  -618,    15,    -3,  -618,    51,    36,    55,
-      54,    58,    70,    37,  -618,  -618,    88,  -618,    -5,    -5,
-      -5,    81,  2962,    90,    -5,    98,   104,  -618,    40,  -618,
-     -68,   195,  -618,  -618,   322,  -618,  -618,   105,  -618,   115,
-    -618,  -618,   114,  -618,  -618,  -618,  -618,  -618,   360,  -618,
-    -618,  2962,  -618,  -618,   109,   153,  -107,  -101,  -618,  -618,
-     158,  -618,  -618,   159,  -618,  -618,  -618,   170,   174,  -618,
-    -618,  -618,  -618,  -618,   175,   180,  -618,   197,  -618,  -618,
-    -618,  -618,   202,  -618,  -618,  -618,   210,  -618,  -618,  -618,
-     211,   212,   213,  -618,  -618,  -618,  -618,   215,   217,   225,
-     235,   236,  -618,   237,  -618,  -618,   239,  -618,   240,  -618,
-    -618,   241,   243,  -618,  -618,   244,  -618,  -618,  -618,  -618,
-    -618,  -618,  -618,  -618,  -618,  -618,  -618,   245,  -618,  -618,
-    -618,   246,   247,  -618,  -618,  -618,  -618,  -618,  -618,   248,
-    -618,  -618,   252,  -618,  -618,  -618,   253,  -618,  -618,  -618,
-     255,   256,   257,   259,  -618,  -618,  -618,   261,   264,  -618,
-    -618,   266,   267,   268,   -53,  -618,  -618,  -618,  1926,   887,
-     274,   480,   356,   359,   363,   366,   369,   273,   301,  -618,
-    -618,  -618,  -618,  -618,    81,   302,   304,  -618,  -618,  -618,
-    -618,  -618,  -618,  -618,  -618,   -58,  -618,  -618,  -618,   194,
-     307,  -618,  -618,  -618,  -618,  -618,  -618,  -618,  -618,  -618,
-    -618,  -618,  -618,    81,    81,  -618,   305,  -150,  -618,  -618,
-    -618,    -5,  -618,  -618,  -618,   384,   308,  -618,  -618,  -618,
-     -46,  -618,  -618,   483,   309,    -9,  -618,   330,   310,  -618,
-     312,  -618,   524,   230,   385,   742,  2868,   531,   230,   742,
-     529,   530,   742,  2868,   742,   532,   533,   742,   536,   742,
-     742,  2381,   742,   742,    12,   537,   -59,   538,   742,  2962,
-     742,   742,  2962,   258,  2962,  2962,   230,    83,   539,  2962,
-    3114,   321,  -618,   327,  -618,  -618,  -618,   326,  -618,   329,
-    -618,   331,   332,  -618,  -618,  -618,    58,  2868,  -618,   334,
-     335,  -618,  -618,  -618,  -618,   335,   -93,  -618,  -618,    32,
-      34,  -618,   357,   -94,   336,   339,  -618,  -618,  1304,    56,
-     337,  -618,   742,   616,  2381,  -618,  -618,   343,  -618,  -618,
-      91,    40,  -618,   342,  -618,   385,   344,   367,   338,  -618,
-     562,  -618,    66,   274,    72,   347,  -618,  -618,   348,   349,
-    -618,  -618,  -618,  -618,  -618,  -618,  -618,  -618,  -618,   345,
-    -618,   742,   742,   742,   742,   742,   742,   605,  2626,   -88,
-    -618,   350,   378,   361,   352,   380,  2626,   355,   358,  -618,
-     -83,   362,   364,   365,   370,   371,   372,   374,   375,  1347,
-     376,  2868,    76,   379,   -57,  -618,  2626,  -618,  -618,  -618,
-     381,   383,   392,   394,   386,   395,   -54,  2388,   414,  -618,
-    -618,  -618,  -618,  -618,  -618,   415,   417,   419,   423,   368,
-    -618,   426,   429,   430,  -618,  3114,   573,  -618,  -618,  -618,
-    -618,  -618,    81,   434,    58,    21,  -618,    58,  1165,  -618,
-     403,  2868,   382,  1658,   436,   486,  1422,    58,  -618,  2868,
-    -618,  -618,  -618,  -618,   696,  -618,  2482,   435,   454,  -618,
-    -618,  -618,  -618,  -618,  -618,  -618,   -39,  -618,  -618,   481,
-    -618,  -618,    80,   742,  -618,    18,  -618,  2868,  -618,   446,
-    -618,   449,  -618,   451,  -618,  -618,  -618,  2868,    27,    27,
-      27,    27,    27,    27,  2415,   254,   742,   742,   673,   742,
-     742,   742,   742,   742,   742,   742,   742,   742,   742,   742,
-     742,   742,   742,   742,   742,   742,   674,   742,   742,  -618,
-    -618,   531,   671,  -618,   742,  -618,  -618,   669,  -618,  -618,
-    -618,  -618,  -618,  -618,  -618,  -618,  -618,  -618,  -618,    76,
-    -618,  2051,  -618,    76,  -618,  -618,  -618,   -85,  -618,   742,
-    -618,  -618,  -618,  -618,  -618,   742,  -618,  -618,  -618,  -618,
-    -618,  -618,  -618,  -618,   675,  -618,  -618,  -618,  -618,   457,
-    -618,  -618,   487,  -618,  -618,  -618,  -618,  -618,  -618,    81,
-     204,  -618,  -618,  2868,   463,  -618,  -618,  -618,    58,  -618,
-    -618,  -618,  -618,  2287,   384,    91,  -618,   469,   467,   481,
-    -618,  -618,  -618,  -618,    76,   468,   385,  -618,  -618,   254,
-    -618,  -618,  2169,  -618,   254,  -618,   471,   -24,   206,   206,
-    -618,   880,   880,   200,   200,   647,   427,  2558,  1780,  2094,
-    1017,   200,   200,   106,   106,    27,    27,    27,  -618,  2504,
-    -618,  -618,  -618,   474,  -618,  -618,    52,  -618,   475,    76,
-     476,  -618,  2381,  -618,  -618,   489,  -618,    58,  1026,    81,
-    -618,  -618,  1540,  -618,  -618,  -618,  -618,  -618,   688,  -618,
-    -618,   493,  -618,   -69,  -618,   495,  -618,   492,    53,  -618,
-     498,    76,   500,  -618,   742,  2381,  -618,   742,  -618,  -618,
-    -618,    52,  -618,  -618,  -618,   501,  -618,  -618,  -618,  -618,
-      58,   504,   742,  -618,    76,  -618,  -618,  -618,  -618,    52,
-    -618,  -618,  -618,    27,   506,  2626,  -618,  -618,  -618,  -618,
-    -618,  -618,     8,  -618,  -618,   742,   540,  -618,  -618,   541,
-     -92,   -92,  -618,  -618,   509,  -618,  -618
+    -617,    99,  1980,  -617,  -617,  -617,   -29,   -64,    95,  -617,
+    -617,  -617,    95,  -617,   -79,    95,  -617,   103,  -617,  -617,
+    -617,  -617,    49,   154,  -617,  -617,  -617,  -617,  -617,    95,
+      49,   140,   -27,  -617,    95,   -22,    49,   530,  -617,  -617,
+     236,   269,   530,  -617,  -617,  3389,  -617,  -617,  -617,   -12,
+    -617,  -617,  -617,  -617,  -617,    37,  3001,    -4,    26,  -617,
+    -617,  -617,    36,  -617,    46,  -617,    67,  -617,    34,    68,
+     218,    73,    96,  -617,  -617,    91,    91,    91,   172,  3234,
+     102,    91,   114,   115,  -617,    57,  -617,   -64,   232,  -617,
+    -617,  -617,  -617,   336,  -617,    88,   134,  -617,  -617,  -617,
+     135,  -617,  -617,  -617,  -617,   366,  -617,  3234,  -617,  -617,
+     106,   148,   -93,  -122,  -617,  -617,   146,  -617,  -617,   165,
+    -617,  -617,  -617,   166,   171,  -617,  -617,  -617,  -617,  -617,
+     173,   174,  -617,   175,  -617,  -617,  -617,  -617,   181,  -617,
+    -617,  -617,   183,  -617,  -617,  -617,   184,   187,  -617,  -617,
+     190,  -617,  -617,  -617,  -617,  -617,   191,   193,   196,   198,
+     201,  -617,   202,  -617,  -617,   204,  -617,   211,  -617,  -617,
+     212,   213,  -617,  -617,   214,  -617,  -617,  -617,  -617,  -617,
+    -617,  -617,  -617,  -617,  -617,  -617,   215,  -617,  -617,  -617,
+     216,   217,  -617,  -617,  -617,  -617,  -617,  -617,   220,  -617,
+    -617,   221,  -617,  -617,  -617,   222,  -617,  -617,  -617,   223,
+     225,   226,   227,  -617,  -617,  -617,   228,   229,  -617,  -617,
+     230,   231,   234,   -61,  -617,  -617,  -617,  2153,  1077,   159,
+     334,    95,    95,   360,   365,   195,   233,   238,   239,   241,
+     248,   245,   172,   244,   246,  -617,  -617,  -617,  -617,  -617,
+    -617,   250,  -617,  -617,  -617,  -617,  -617,  -617,  -617,  -617,
+    -617,  -617,  -617,  -617,   172,   172,  -617,  -617,   247,  -136,
+    -617,  -617,  -617,    91,  -617,  -617,  -617,   383,   251,  -617,
+    -617,  -617,   -46,  -617,  -617,   475,   254,   -66,  -617,   278,
+     255,  -617,   257,  -617,   477,   192,    95,   533,  3122,   479,
+     192,   533,   499,   501,   533,  3122,   533,   505,   506,   533,
+     507,   533,   533,  2644,   533,   533,    50,   509,   -62,   512,
+     533,  3234,   533,   533,  3234,   -73,  3234,  3234,   192,   282,
+     513,  3234,  3389,   302,  -617,   299,  -617,  -617,  -617,   301,
+    -617,   303,  -617,   304,  -617,   308,   307,   310,  -617,  -617,
+      73,  3122,  -617,   313,  -617,  -617,   313,   -92,  -617,  -617,
+    -617,   309,   265,   314,  -617,  -617,  -617,   -32,   104,   317,
+    -617,   533,   110,  2644,  -617,  -617,   326,  -617,  -617,    48,
+      57,  -617,   324,  -617,    95,   327,   352,   328,  -617,   550,
+    -617,    -9,   159,    55,   331,  -617,  -617,   332,   333,  -617,
+    -617,  -617,  -617,  -617,  -617,  -617,  -617,  -617,   335,  -617,
+     533,   533,   533,   533,   533,   533,   890,  2852,   -98,  -617,
+     338,   363,   347,   341,   372,  2852,   348,   349,  -617,   -63,
+     350,   351,   355,   357,   359,   362,   364,   367,   589,   369,
+    3122,   107,   370,   -58,  -617,  2852,  -617,  -617,  -617,   371,
+     373,   374,   385,   379,   387,   -48,   735,   388,  -617,  -617,
+    -617,  -617,  -617,  -617,   390,   391,   392,   393,   354,  -617,
+     395,   405,   406,  -617,  3389,   579,  -617,  -617,  -617,  -617,
+    -617,  -617,  -617,   172,    60,    83,    73,   376,  -617,  -617,
+    1496,  1363,   434,   -49,   416,  -617,  -617,  -617,  -617,   340,
+    -617,  2637,   417,   443,  -617,  -617,  -617,  -617,  -617,  -617,
+    -617,   -47,  -617,  -617,   412,  -617,  -617,   101,   533,  -617,
+      27,  -617,  3122,  -617,  3122,   418,  -617,   424,  -617,   425,
+    -617,  -617,  -617,  3122,    29,    29,    29,    29,    29,    29,
+     805,   476,   533,   533,   650,   533,   533,   533,   533,   533,
+     533,   533,   533,   533,   533,   533,   533,   533,   533,   533,
+     533,   533,   651,   533,   533,  -617,  -617,   479,   648,  -617,
+     533,  -617,  -617,   646,  -617,  -617,  -617,  -617,  -617,  -617,
+    -617,  -617,  -617,  -617,  -617,   107,  -617,  2281,  -617,   107,
+    -617,  -617,  -617,  -133,  -617,   533,  -617,  -617,  -617,  -617,
+    -617,   533,  -617,  -617,  -617,  -617,  -617,  -617,  -617,  -617,
+     652,  -617,  -617,  -617,  -617,   429,  -617,  -617,   458,    73,
+      25,  -617,    73,  -617,   558,  1617,    73,  -617,  3122,  -617,
+    -617,   460,   439,  1859,   444,  -617,  -617,  -617,  2523,   383,
+      48,  -617,   446,   445,   412,  -617,  -617,  -617,  -617,   107,
+     447,   172,   169,    95,  -617,  -617,   476,  -617,  -617,  2402,
+    -617,   476,  -617,   448,  -126,   224,   224,  -617,   167,   167,
+     194,   194,  2684,  2804,  2770,  1071,   828,  1899,   194,   194,
+     144,   144,    29,    29,    29,  -617,  2748,  -617,  -617,  -617,
+     449,  -617,  -617,    52,  -617,   450,   107,   451,  -617,  2644,
+    -617,  -617,   452,  -617,    73,  1220,   172,  -617,    95,    95,
+     455,  -617,  -617,    73,  -617,  -617,  -617,  -617,  3122,   459,
+    -617,  -617,  -617,  -617,  -617,  -617,   667,  -617,  -617,   471,
+    -617,    -5,  -617,  -617,   462,  -617,   456,   253,  -617,   461,
+     107,   463,  -617,   533,  2644,  -617,   533,  -617,  -617,  -617,
+      52,  -617,  -617,  -617,   465,  -617,  -617,  -617,  -617,  -617,
+    -617,  -617,  1738,  -617,  -617,   464,   533,  -617,   107,  -617,
+    -617,  -617,  -617,    52,  -617,  -617,  -617,    29,   466,  2852,
+    -617,  -617,    73,  -617,  -617,  -617,    -8,  -617,  -617,  -617,
+     533,   492,  -617,  -617,   497,   -23,   -23,  -617,  -617,   481,
+    -617,  -617
 };
 
   /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -1521,122 +1520,123 @@
      means the default is an error.  */
 static const yytype_int16 yydefact[] =
 {
-       5,     0,     3,     1,    41,   308,     0,   429,   291,   283,
-     302,     0,   352,     0,     0,   290,   278,   292,   348,   289,
-     293,   294,     0,   351,   296,   303,   304,   301,     0,   294,
-       0,     0,   350,     0,     0,   294,     0,   298,   349,   278,
-     278,   288,   413,   284,    88,     2,    17,    42,     0,    36,
-      18,    39,    18,    16,     0,    75,   416,     0,   415,   285,
-     414,     0,     0,    11,     0,     0,    14,     0,     0,     0,
-       0,    34,     0,   334,     9,     8,     0,    15,   357,   357,
-     357,     0,     0,   418,   357,     0,   420,   309,     0,     4,
-     429,     0,   311,   312,     0,   325,   326,   417,   280,     0,
-     295,   300,     0,   336,   337,   299,   320,   321,     0,   315,
-     316,     0,   297,   286,   419,     0,   421,     0,   287,    89,
-       0,    91,    92,     0,    93,    94,    95,     0,     0,    98,
-      99,   100,   101,   102,     0,     0,   105,     0,   107,   108,
-     109,   110,     0,   112,   113,   114,     0,   116,   117,   118,
-       0,     0,     0,   122,   123,   124,   125,     0,     0,     0,
-       0,     0,   131,     0,   133,   134,     0,   136,     0,   138,
-     139,   142,     0,   143,   144,     0,   146,   147,   148,   149,
-     150,   151,   152,   153,   154,   155,   156,     0,   158,   159,
-     160,     0,     0,   163,   164,   165,   166,   411,   167,     0,
-     169,   409,     0,   171,   172,   173,     0,   175,   176,   177,
-       0,     0,     0,     0,   182,   410,   183,     0,     0,   187,
-     188,     0,     0,     0,     0,    77,   192,    37,    74,    74,
-      74,     0,   278,     0,     0,   278,   278,     0,   416,   313,
-     317,   327,   338,   346,     0,   418,   420,    38,    10,   322,
-      13,   322,    12,     6,   343,     0,    35,   341,   342,     0,
-       0,    32,   361,   358,   360,   359,   281,   282,   195,   196,
-     197,   198,   353,     0,     0,   365,   401,   364,   275,   416,
-     418,   357,   420,   355,    40,     0,     0,   441,   440,   442,
-       0,   437,   430,     0,     0,    74,    56,     0,     0,   261,
-       0,   267,     0,     0,     0,     0,     0,     0,     0,     0,
+       5,     0,     3,     1,    45,   314,     0,   427,     0,   297,
+     289,   308,     0,   350,     0,     0,   296,   284,   298,   346,
+     295,   299,   300,     0,   349,   302,   309,   310,   307,     0,
+     300,     0,     0,   348,     0,     0,   300,     0,   304,   347,
+     284,   284,   294,   411,   290,    91,     2,    19,    46,     0,
+      40,    20,    43,    20,    18,     0,    78,   414,     0,   413,
+     291,   412,     0,    12,     0,    16,     0,    14,     0,     0,
+       0,    38,     0,    10,    17,   355,   355,   355,     0,     0,
+     416,   355,     0,   418,   315,     0,     4,   427,     0,   286,
+     287,   321,   317,     0,   328,   415,     0,   285,   301,   306,
+       0,   338,   305,   323,   324,     0,   319,     0,   303,   292,
+     417,     0,   419,     0,   293,    92,     0,    94,    95,     0,
+      96,    97,    98,     0,     0,   101,   102,   103,   104,   105,
+       0,     0,   108,     0,   110,   111,   112,   113,     0,   115,
+     116,   117,     0,   119,   120,   121,     0,     0,   124,   125,
+       0,   127,   128,   129,   130,   131,     0,     0,     0,     0,
+       0,   137,     0,   139,   140,     0,   142,     0,   144,   145,
+     148,     0,   149,   150,     0,   152,   153,   154,   155,   156,
+     157,   158,   159,   160,   161,   162,     0,   164,   165,   166,
+       0,     0,   169,   170,   171,   172,   409,   173,     0,   175,
+     407,     0,   177,   178,   179,     0,   181,   182,   183,     0,
+       0,     0,     0,   188,   408,   189,     0,     0,   193,   194,
+       0,     0,     0,     0,    80,   198,    41,    77,    77,    77,
+     284,     0,     0,   284,   284,     0,   414,     0,     0,     0,
+     336,     0,     0,   416,   418,    42,    11,    15,    13,     6,
+       9,     0,    39,   341,     8,   359,   356,   358,   357,   201,
+     202,   203,   204,   351,     0,     0,   288,   363,   399,   362,
+     281,   414,   416,   355,   418,   353,    44,     0,     0,   439,
+     438,   440,     0,   435,   428,     0,     0,    77,    60,     0,
+       0,   267,     0,   273,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   214,     0,     0,     0,     0,     0,     0,
-     214,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-      88,    76,    57,     0,    29,    30,    31,     0,    24,     0,
-      27,     0,     0,    22,    19,    28,    34,     0,    75,     0,
-     417,    59,    60,   344,   345,   419,   421,    61,   274,    74,
-      74,     5,     0,    74,     0,     0,   335,    32,    74,     0,
-       0,   363,     0,     0,    63,   367,   356,     0,   305,   310,
-       0,     0,   436,     0,    55,     0,     0,   205,   210,   206,
-       0,   422,    74,    74,    74,     0,   194,   193,     0,     0,
-     225,   216,   217,   218,   222,   223,   224,   219,   220,     0,
-     221,     0,     0,     0,     0,     0,     0,     0,   259,     0,
-     257,     0,     0,    85,     0,     0,   260,     0,     0,    80,
+       0,     0,     0,     0,     0,   220,     0,     0,     0,     0,
+       0,     0,   220,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    91,    79,    61,     0,    33,    34,    35,     0,
+      27,     0,    31,     0,    29,     0,     0,     0,    25,    32,
+      38,     0,    78,   415,    63,   344,   417,   419,    64,   325,
+     325,     0,     0,     0,    36,   280,     5,     0,     0,     0,
+     361,     0,     0,    66,   365,   354,     0,   311,   316,     0,
+       0,   434,     0,    59,     0,     0,   211,   216,   212,     0,
+     420,    77,    77,    77,     0,   200,   199,     0,     0,   231,
+     222,   223,   224,   228,   229,   230,   225,   226,     0,   227,
+       0,     0,     0,     0,     0,     0,     0,   265,     0,   263,
+       0,     0,    88,     0,     0,   266,     0,     0,    83,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   386,     0,     0,   212,   215,    82,    83,    84,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   408,
-     403,   404,   405,   406,   407,     0,     0,     0,     0,   426,
-     428,     0,     0,     0,    78,    88,     0,    23,    26,    25,
-      20,    62,     0,     0,    34,     0,   323,    34,    74,   328,
-       0,     0,     0,     0,     0,     0,    74,    34,    33,    75,
-     354,   362,   366,   402,     0,    73,     0,     0,    67,    64,
-      65,   306,   447,   445,   448,   446,     0,   443,   438,   431,
-     208,   211,    74,     0,    44,     0,   412,     0,   262,     0,
-     424,    75,   268,     0,    90,   186,    96,     0,   249,   248,
-     247,   250,   245,   246,     0,   374,     0,     0,     0,     0,
+       0,   384,     0,     0,   218,   221,    85,    86,    87,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   406,   401,
+     402,   403,   404,   405,     0,     0,     0,     0,   424,   426,
+       0,     0,     0,    81,    91,     0,    26,    30,    28,    23,
+      22,    21,    65,     0,    77,    77,    38,     0,   337,    36,
+      77,    77,     0,    77,     0,   352,   360,   364,   400,     0,
+      76,     0,     0,    70,    67,    68,   312,   445,   443,   446,
+     444,     0,   441,   436,   429,   214,   217,    77,     0,    48,
+       0,   410,     0,   268,     0,     0,   422,    78,   274,     0,
+      93,   192,    99,     0,   255,   254,   253,   256,   251,   252,
+       0,   372,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,    97,
-     103,     0,     0,   104,     0,   111,   115,     0,   119,   120,
-     121,   126,   127,   128,   129,   130,   132,   135,   137,   386,
-     353,    63,   391,   386,   388,   387,    70,   383,   141,   214,
-     140,   145,   157,   161,   162,     0,   170,   174,   178,   179,
-     181,   180,   184,   185,     0,   189,   190,   191,    79,     0,
-      18,   394,   423,   319,   314,   324,   318,     7,   330,     0,
-     418,   329,   332,     0,     0,   273,   333,    32,    34,   347,
-      72,    71,   368,     0,     0,     0,   439,   435,     0,   431,
-     207,   209,    45,    43,     0,   420,   276,   266,   265,   374,
-     256,   353,    63,   378,   374,   375,     0,   371,   238,   239,
-     251,   232,   233,   236,   237,   227,   228,     0,   229,   230,
-     231,   235,   234,   241,   240,   243,   244,   242,   252,     0,
-     258,    87,    86,     0,    81,    69,   386,   353,     0,   386,
-       0,   382,    63,   390,   213,     0,   427,    34,    74,     0,
-     271,   331,    74,   339,    68,    66,   307,   444,     0,   434,
-     432,   396,   399,     0,   264,     0,   277,     0,   374,   353,
-       0,   386,     0,   370,     0,    63,   377,     0,   255,   106,
-     381,   386,   392,   385,   389,     0,   168,    58,    21,   395,
-      34,     0,     0,   398,     0,   263,   199,   254,   369,   386,
-     379,   373,   376,   253,     0,   226,   384,   393,   340,   433,
-     397,   400,     0,   372,   380,     0,     0,   425,   200,     0,
-      74,    74,   270,   202,     0,   201,   269
+       0,     0,     0,     0,     0,   100,   106,     0,     0,   107,
+       0,   114,   118,     0,   122,   123,   126,   132,   133,   134,
+     135,   136,   138,   141,   143,   384,   351,    66,   389,   384,
+     386,   385,    73,   381,   147,   220,   146,   151,   163,   167,
+     168,     0,   176,   180,   184,   185,   187,   186,   190,   191,
+       0,   195,   196,   197,    82,     0,    20,   392,   421,    38,
+       0,   326,    38,   322,     0,    77,    38,    37,    78,     7,
+     330,     0,     0,     0,     0,    75,    74,   366,     0,     0,
+       0,   437,   433,     0,   429,   213,   215,    49,    47,     0,
+     418,     0,   416,   282,   272,   271,   372,   262,   351,    66,
+     376,   372,   373,     0,   369,   244,   245,   257,   238,   239,
+     242,   243,   233,   234,     0,   235,   236,   237,   241,   240,
+     247,   246,   249,   250,   248,   258,     0,   264,    90,    89,
+       0,    84,    72,   384,   351,     0,   384,     0,   380,    66,
+     388,   219,     0,   425,    38,    77,     0,   318,     0,     0,
+       0,   320,    36,    38,   345,   332,   331,   334,     0,     0,
+     279,   335,    71,    69,   313,   442,     0,   432,   430,   394,
+     397,     0,   270,   277,     0,   283,     0,   372,   351,     0,
+     384,     0,   368,     0,    66,   375,     0,   261,   109,   379,
+     384,   390,   383,   387,     0,   174,    62,    24,   393,   343,
+     342,   327,    77,   339,   333,     0,     0,   396,     0,   269,
+     205,   260,   367,   384,   377,   371,   374,   259,     0,   232,
+     382,   391,    38,   431,   395,   398,     0,   370,   378,   340,
+       0,     0,   423,   206,     0,    77,    77,   276,   208,     0,
+     207,   275
 };
 
   /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -618,  -618,  -618,   373,  -618,   -48,  -618,  -364,  -336,     0,
-    -618,  -618,  -618,  -618,  -618,   232,  -618,  -618,  -618,    16,
-    -563,  -618,  -618,  -288,  -271,  -219,    -2,  -618,  -618,  -618,
-     149,  -618,  -299,  -226,   -80,  -618,  -618,  -618,  -618,  -618,
-     207,    13,   404,   129,  -217,  -618,  -285,  -304,  -618,  -618,
-    -618,  -618,   -43,  -296,  -618,   260,  -618,    24,   -71,  -618,
-      59,   140,    86,  -618,   496,  -618,     5,  -618,    17,    10,
-    -618,    19,    20,    22,   505,  -618,   691,  -618,  -618,  -618,
-    -618,  -618,   -32,  -618,    25,    14,  -618,  -618,    26,  -618,
-    -618,  -365,  -527,   -50,   -44,   -30,  -243,  -618,  -618,  -618,
-    -616,  -618,  -617,  -618,  -312,  -618,  -618,  -618,    -7,  -618,
-     515,  -618,   441,     1,   -65,  -618,     7,  -618,   670,   102,
-    -618,  -618,   111,  -618,   387,  -618,   107
+    -617,  -617,  -617,   344,  -617,   -50,  -617,  -458,  -321,     8,
+    -617,  -617,  -617,  -617,  -617,    78,  -617,  -617,  -617,    14,
+    -523,  -617,  -617,  -283,  -233,  -224,    -2,  -617,  -617,  -617,
+     139,  -617,  -267,  -158,   -69,  -617,  -617,  -617,  -617,  -617,
+     199,     2,   396,   118,   361,  -617,  -261,  -266,  -617,  -617,
+    -617,  -617,   -81,  -314,  -617,    84,  -617,    32,     3,   -56,
+    -617,    58,   108,    80,  -617,   358,  -617,     6,    15,    10,
+      17,    11,    19,    21,   368,  -617,    12,  -617,  -617,  -617,
+    -617,  -617,     5,    22,  -617,  -617,    23,  -617,  -617,  -340,
+    -547,   -55,   -35,    -6,  -238,  -617,  -617,  -617,  -576,  -617,
+    -616,  -617,  -386,  -617,  -617,  -617,   -45,  -617,   480,  -617,
+     403,     0,   -39,  -617,     4,  -617,   637,    81,  -617,  -617,
+      85,  -617,   346,  -617,    89
 };
 
   /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,     1,    45,     2,   371,   228,   630,   378,   257,   344,
-      47,   535,    48,    49,    50,    51,   345,   237,    52,   346,
-     517,   518,   519,   520,   602,    54,   358,   224,   440,   460,
-     434,   431,   225,   408,   603,   782,   788,   396,   397,   398,
-     399,   279,   454,   455,   428,   429,   430,   437,   402,   538,
-     542,   404,   793,   794,   644,    57,   735,    99,   604,    58,
-     101,    59,   389,   654,    60,   285,   347,    62,   348,   349,
-      65,   350,   351,   352,   369,   496,    69,    70,   373,   503,
-      71,   260,    72,    73,   353,   354,   243,    76,   355,    78,
-      79,    80,   379,    81,   262,    82,   276,   277,   675,   742,
-     676,   677,   605,   710,   606,   607,   632,   763,   732,   733,
-     278,   475,   226,   280,    84,    85,   282,   481,    89,   658,
-     659,    90,    91,   290,   291,   526,   527
+      -1,     1,    46,     2,   366,   227,   616,   490,   253,   336,
+      48,   520,    49,    50,    51,    52,   337,   235,    53,   338,
+     502,   503,   504,   505,   588,    55,   352,   223,   429,   449,
+     423,   420,   224,   397,   589,   786,   793,   385,   386,   387,
+     388,   271,   443,   444,   417,   418,   419,   426,   391,   523,
+     528,   393,   798,   799,   719,    58,   734,    96,   266,   590,
+      59,    99,    60,   378,   639,    61,   277,   339,   340,   341,
+     342,   343,   344,   345,   484,   621,   346,    70,   493,   633,
+      71,   363,   347,   348,   710,   241,   349,    75,    76,    77,
+     368,    78,   255,    79,   268,   269,   662,   741,   663,   664,
+     591,   697,   592,   593,   618,   767,   730,   731,   270,   464,
+     225,   272,    81,    82,   274,   470,    86,   643,   644,    87,
+      88,   282,   283,   511,   512
 };
 
   /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
@@ -1644,858 +1644,915 @@
      number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_int16 yytable[] =
 {
-      55,   274,    46,    83,   229,   244,   385,    61,   441,    86,
-     275,   357,    64,   506,   510,    56,    75,   281,    53,    63,
-     491,    66,    67,   242,    68,   662,   500,    74,    77,   443,
-     380,   381,   446,   450,   448,   264,   265,   453,   708,   457,
-     283,   484,  -435,   464,    12,   558,   298,   731,   263,   263,
-     263,   785,    28,   737,   263,   266,   245,   267,   743,   266,
-     239,   267,   246,   115,   117,   240,  -279,   786,   238,   286,
-     383,     3,   300,   706,    18,   384,   395,   502,   513,   266,
-    -279,   267,   435,    87,   266,   372,   267,    14,   105,   197,
-     479,   480,   436,   201,   112,   436,   268,   268,   287,    23,
-     268,    12,    12,   449,    94,    12,   456,   539,   543,   740,
-     478,   578,   288,   456,   467,  -279,   587,   -51,   289,   522,
-     268,   301,   768,   215,   558,   268,    44,   102,    44,  -279,
-     764,    28,   792,   269,   269,   383,   511,   269,   579,   458,
-     712,   100,   609,   588,   738,   609,   340,   731,    32,   755,
-     495,   495,    88,   391,   501,   765,   230,   269,   634,   523,
-     655,   636,   269,    38,   274,   436,   516,   106,   341,   610,
-     107,   649,   617,   275,   108,   392,   113,   249,   111,   459,
-     751,   118,   774,   537,   501,   501,   628,   656,    92,   227,
-      93,   270,   270,   274,   274,   270,   383,   375,   -46,     5,
-       6,   745,   275,   275,   548,   549,   550,   551,   552,   553,
-     554,    44,   769,   247,  -203,   270,   556,   557,   558,   251,
-     270,   271,   271,   374,   558,   271,    55,    55,   248,    83,
-      83,   787,    95,   409,    96,    86,    86,   386,   259,   250,
-     406,    56,    56,   407,   663,   271,   576,   577,   661,   631,
-     271,   263,    44,   524,    44,   494,   432,   497,   253,   115,
-     117,   600,   671,   442,   465,   272,    97,   468,    98,   476,
-     477,   452,   383,   383,   483,   252,   255,   601,   672,   254,
-     703,   273,   256,   722,   673,   600,    44,   705,   525,   536,
-     272,   711,    44,   700,   258,   540,   383,   551,   268,   274,
-      44,   601,   103,  -204,   104,   293,   273,   492,   275,   109,
-     261,   110,   723,   395,   -48,   573,   574,   575,   114,   451,
-      98,   116,   284,    98,   530,   576,   577,  -279,   -50,   -47,
-     715,  -279,   294,   -49,   452,   269,   713,   295,   296,   678,
-     679,   510,   681,   682,   683,   684,   685,   686,   687,   688,
-     689,   690,   691,   692,   693,   694,   695,   696,   697,   360,
-     699,    98,   361,   297,   362,   725,   363,   436,   364,   365,
-      10,    98,   366,   510,    98,   299,   509,   555,   508,    83,
-     469,   757,   451,   302,   303,    86,   510,   387,   266,   388,
-     267,    56,   456,   270,   750,   304,   720,   753,   673,   305,
-     306,   599,   541,   673,   510,   307,   746,   571,   572,   573,
-     574,   575,   274,   571,   572,   573,   574,   575,    21,   576,
-     577,   275,   308,   271,   778,   576,   577,   309,  -272,   771,
-    -272,    24,    25,    26,    27,   310,   311,   312,   313,   776,
-     314,    29,   315,   556,   557,   558,   559,   560,   561,   562,
-     316,   639,   470,   471,   472,   473,   474,   783,   780,   244,
-     317,   318,   319,   671,   320,   321,   322,   673,   323,   324,
-     325,   326,   327,   328,   383,   674,   759,   329,   330,   672,
-     331,   332,   333,   359,   334,    35,   335,   664,   393,   336,
-      37,   337,   338,   339,    44,   367,    55,   669,    46,    83,
-     789,   643,   640,    61,   509,    86,   508,    83,    64,   635,
-     245,    56,    75,    86,    53,    63,   246,    66,    67,    56,
-      68,   709,   238,    74,    77,   -52,   -53,   773,   -54,   377,
-     775,   400,   382,   390,   405,   394,   401,   403,   433,   438,
-     439,   485,   444,   445,   665,   436,   447,   461,   463,   482,
-     487,   452,   486,   488,   490,   489,   493,  -279,   499,   274,
-     504,   505,   521,   512,   529,   533,   532,   531,   275,   534,
-     547,   501,   501,   544,   545,   546,   580,   581,   583,   584,
-     582,   585,   718,   629,   586,   615,    22,   624,   589,   674,
-     590,   591,   741,   244,   674,   736,   592,   593,   594,   451,
-     595,   596,   598,   452,   638,   608,   641,   611,   410,   612,
-       5,     6,   411,   412,   413,   414,   415,   416,   613,   410,
-     614,   616,   452,   411,   412,   413,   414,   415,   416,   566,
-     567,   568,   569,   570,   571,   572,   573,   574,   575,   274,
-     619,   620,     8,   621,     9,   622,   576,   577,   275,   623,
-      10,   451,   625,   653,    12,   626,   627,   633,   674,   646,
-     657,   652,   452,   556,   557,   558,   559,   560,   561,   562,
-     451,   564,   666,   667,    15,   668,   680,   698,   702,   704,
-     232,    17,   716,   717,    18,   417,   719,   721,    19,    88,
-     729,    20,   734,   761,   762,   452,   417,   744,    21,   410,
-     749,   752,   754,   411,   412,   413,   414,   415,   416,    23,
-     451,    24,    25,    26,    27,   756,    55,   766,   767,    83,
-     509,    29,   508,    83,   770,    86,   772,   777,   779,    86,
-     701,    56,   784,   796,   466,    56,   418,   647,   714,   660,
-     726,   790,   791,   451,   498,   410,   241,   418,   795,   411,
-     412,   413,   414,   415,   416,   376,   370,   781,    32,   368,
-     292,   730,   727,   645,    34,    35,    36,   462,   728,   419,
-      37,     0,     0,    38,     0,     0,   417,   235,   528,     0,
-     419,     0,     0,   420,     0,     0,   236,     0,    41,     0,
-       0,     0,     0,     0,   420,     0,    42,    43,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   421,
-       0,     0,   422,   423,   424,     0,     0,   425,   426,     0,
-     421,     0,   417,   422,   423,   514,     0,   418,   425,   426,
-     427,     0,     0,     0,     0,     0,     0,   515,     0,     0,
-       0,   427,     0,     0,     0,     0,     0,     0,     0,   566,
-     567,   568,   569,   570,   571,   572,   573,   574,   575,     0,
-     419,     0,     0,     0,     0,     0,   576,   577,     0,     0,
-       0,     0,     0,   418,   420,     0,     0,     0,     0,     0,
+      56,   242,    80,   228,    57,   351,    83,    72,    62,   265,
+      47,    91,    64,    66,    69,    92,    54,    63,    94,    65,
+      97,    67,   267,    68,    73,    74,   369,   370,   495,   482,
+     439,   625,   101,   729,   647,   790,   374,   106,   430,   693,
+     273,   257,   258,    97,    97,   432,   275,   544,   435,  -433,
+     437,   791,   458,   442,   292,    89,   243,    90,   236,   453,
+     244,   240,   237,   384,   695,   473,   238,   239,   290,   256,
+     256,   256,   111,   113,   631,   256,   507,   446,   525,   529,
+     736,    29,   251,  -286,  -286,   742,   278,   372,   102,   196,
+     372,   708,   373,   200,   108,   699,   259,   372,    89,     3,
+      90,    13,   744,   293,   564,   498,    95,    89,    90,    90,
+      89,   737,    90,   399,   492,   279,   508,   400,   401,   402,
+     403,   404,   405,   214,   459,   460,   461,   462,   463,   280,
+     496,   565,  -286,  -286,   -55,   260,   739,   281,   709,   573,
+      13,   332,   424,   103,   595,   109,   104,   750,   259,    93,
+     114,   259,   729,    13,   595,   640,   380,    45,    98,    85,
+    -209,   772,   544,   333,   100,   623,   574,   522,   524,   524,
+     467,   596,    19,   265,    45,    89,   754,    90,   381,   632,
+     447,   603,   641,   542,   543,   544,   267,   260,   547,   548,
+     260,   773,   406,    84,   261,   265,   265,   768,    24,   692,
+      45,   105,   395,   698,   797,   396,   107,   614,   267,   267,
+     542,   543,   544,   509,    45,   226,   259,   521,   792,   229,
+     448,   778,   769,   -50,   262,    56,    56,    80,    80,    57,
+      57,    83,    83,    97,   354,   355,    97,    97,   375,   110,
+     398,    90,   544,   421,   407,   617,   261,    33,   510,   261,
+     431,   562,   563,   245,   762,   260,   648,   646,   441,   249,
+     620,   620,    39,   246,   586,   111,   113,   256,   487,   524,
+       5,     6,   112,   247,    90,   372,   262,   408,    45,   262,
+     587,   526,   454,    45,    15,   457,   619,   465,   466,   468,
+     469,   409,   472,   384,   248,   250,   483,   259,   707,   265,
+     252,   711,    13,   687,   690,   714,    45,   749,   660,   622,
+     752,   440,   267,  -286,   261,   -51,   263,   410,   441,   586,
+     411,   412,   499,   254,    45,   414,   415,  -210,   515,   -52,
+     372,  -286,   264,   -53,   500,   587,   260,   353,   416,    90,
+     702,   276,   -54,   399,   262,   285,   286,   400,   401,   402,
+     403,   404,   405,   495,   775,   723,   559,   560,   561,   287,
+     700,   541,   288,   356,   780,    90,   562,   563,   357,   289,
+      90,   440,   494,   291,   294,   555,   556,   557,   558,   559,
+     560,   561,    45,   756,   263,   585,   376,   787,   377,   562,
+     563,   527,   763,   295,   296,   261,  -278,   495,  -278,   297,
+     264,   298,   299,   300,   557,   558,   559,   560,   561,   301,
+     495,   302,   303,   733,   265,   304,   562,   563,   305,   306,
+     358,   307,   406,   660,   308,   262,   309,   267,   660,   310,
+     311,   745,   312,   495,   557,   558,   559,   560,   561,   313,
+     314,   315,   316,   317,   318,   319,   562,   563,   320,   321,
+     322,   323,   362,   324,   325,   326,   327,   328,   329,   330,
+     -56,   789,   331,   359,   360,   658,   361,   649,   758,   651,
+     364,   -57,   661,   -58,   407,   367,   372,   371,   656,   379,
+     382,   659,   389,   383,   390,   392,   422,   394,   628,    56,
+      80,    80,    57,    57,    83,    83,    72,    62,   627,    47,
+     784,    64,    66,    69,   660,    54,    63,   408,    65,   427,
+      67,   428,    68,    73,    74,   433,   434,   436,   696,   450,
+     259,   409,   452,   471,   652,   474,   650,   475,   476,   794,
+     477,   478,   441,   479,   480,   486,   399,   481,  -286,   489,
+     400,   401,   402,   403,   404,   405,   497,   410,   506,   514,
+     411,   412,   413,   516,   517,   414,   415,   519,   518,   260,
+     530,   531,   532,   533,   635,   567,   705,   566,   416,   568,
+     569,   524,   524,   242,   570,    11,   610,   571,   572,   575,
+     576,   601,   265,   441,   577,   440,   578,   661,   579,   615,
+     740,   580,   661,   581,   642,   267,   582,   735,   584,   594,
+     597,   624,   598,   599,   441,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   600,   406,   602,   605,   261,   606,
+     607,   608,   609,   628,   611,    80,    22,    57,   243,    83,
+     236,   718,   244,   627,   612,   613,   440,   265,   630,    25,
+      26,    27,    28,   634,   441,   638,   637,   653,   262,    30,
+     267,   654,   655,   667,   685,   689,   691,   440,   704,   703,
+     706,    23,   425,   242,   715,   425,   716,   407,   661,    85,
+     721,   727,   765,   438,   732,   766,   445,   743,   748,   751,
+     753,   755,   761,   445,   456,   771,   764,   770,   658,   441,
+     774,   783,   776,    36,   781,   788,   795,   440,    38,   372,
+     408,   796,   712,    56,   659,    80,   688,    57,   801,    83,
+     491,   759,   760,   701,   409,   800,   645,   720,   455,   724,
+     488,   451,   365,   785,   284,   728,   513,   726,   485,   725,
+       0,     0,   425,   501,     0,     0,     0,     0,     0,     0,
+     410,     0,   440,   411,   412,   413,     0,     0,   414,   415,
+       0,   542,   543,   544,   545,   546,   547,   548,   549,   550,
+     628,   416,    80,     0,    57,     0,    83,     0,     0,     0,
+     627,   534,   535,   536,   537,   538,   539,   540,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     4,     5,     6,     0,     0,   556,   557,   558,     0,
-     421,   561,   562,   422,   423,   424,   419,     0,   425,   426,
-       0,     0,     0,     0,     0,     0,     0,   650,     0,     0,
-     420,   427,     0,     0,     8,     0,     9,     0,     0,     0,
-       0,     0,    10,    11,     0,     0,    12,     0,     0,     0,
-       0,     0,     0,    13,     0,     0,   421,     0,     0,   422,
-     423,   424,     0,    14,   425,   426,    15,     0,     0,     0,
-       0,     0,    16,    17,     0,     0,    18,   427,     0,     0,
-      19,     0,     0,    20,     0,     0,     0,     0,     0,     0,
-      21,     0,     0,     0,     0,     0,     0,    22,   343,     0,
-       0,    23,     0,    24,    25,    26,    27,    28,     0,     0,
-       0,     0,     0,    29,     0,     0,     0,     0,     0,     0,
-      30,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    31,     0,
-       4,     5,     6,   556,   557,   558,   559,   560,   561,   562,
-      32,     0,     0,     0,     0,    33,    34,    35,    36,     0,
-       0,     0,    37,     0,     0,    38,     0,     0,     0,    39,
-       0,     0,     0,     8,     0,     9,     0,     0,    40,     0,
-      41,    10,    11,     0,     0,    12,     0,     0,    42,    43,
-       0,     0,    13,     0,     0,   569,   570,   571,   572,   573,
-     574,   575,    14,     0,     0,    15,     0,     0,     0,   576,
-     577,    16,    17,     0,     0,    18,     0,    44,     0,    19,
-     356,     0,    20,     0,     0,     0,     0,     0,     0,    21,
-       0,     0,     0,     0,     0,     0,    22,   343,     0,     0,
-      23,     0,    24,    25,    26,    27,    28,     0,     0,     0,
-       0,     0,    29,     0,     0,     0,     0,     0,     0,    30,
+       0,     0,   551,     0,   552,   553,   554,   555,   556,   557,
+     558,   559,   560,   561,     0,     0,     0,     0,     0,     0,
+       0,   562,   563,     0,     0,     0,     0,     0,   583,     0,
+       0,   542,   543,   544,   545,   546,   547,   548,   549,   550,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    31,     0,     4,
-       5,     6,     0,     0,     0,     0,     0,     0,     0,    32,
-       0,     0,     0,     0,    33,    34,    35,    36,     0,     0,
-       0,    37,     0,     0,    38,     0,     0,     0,    39,     0,
-       0,     0,     8,     0,     9,     0,     0,    40,     0,    41,
-      10,    11,     0,     0,    12,     0,     0,    42,    43,     0,
-       0,    13,   569,   570,   571,   572,   573,   574,   575,     0,
-       0,    14,     0,     0,    15,     0,   576,   577,     0,     0,
-      16,    17,     0,     0,    18,     0,    44,     0,    19,   758,
-       0,    20,     0,     0,     0,     0,     0,     0,    21,     0,
-       0,     0,     0,     0,     0,    22,     0,     0,     0,    23,
-       0,    24,    25,    26,    27,    28,     0,     0,     0,     0,
-       0,    29,     0,     0,     0,     0,     0,     0,    30,     0,
+       0,     0,     0,     0,   542,   543,   544,   545,   546,   547,
+     548,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     537,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,    31,     0,     4,     5,
-       6,     0,     0,     0,     0,     0,     0,     0,    32,     0,
-       0,     0,     0,    33,    34,    35,    36,     0,     0,     0,
-      37,     0,     0,    38,     0,     0,     0,    39,     0,     0,
-       0,     8,     0,     9,     0,     0,    40,     0,    41,    10,
-       0,     0,     0,    12,     0,     0,    42,    43,     0,     0,
-      13,     0,     0,   556,   557,   558,   559,   560,   561,   562,
-     563,   564,     0,    15,     0,     0,     0,     0,     0,    16,
-      17,     0,     0,    18,     0,    44,     0,    19,   637,     0,
-      20,     0,     0,     0,     0,     0,     0,    21,     0,     0,
-       0,     0,     0,     0,    22,     0,     0,     0,    23,     0,
-      24,    25,    26,    27,     0,     0,     0,     0,     0,     0,
-      29,     0,     0,     0,     0,     0,     4,     5,     6,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    31,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    32,     0,     8,
-       0,     9,     0,    34,    35,    36,     0,    10,     0,    37,
-       0,    12,    38,     0,     0,     0,    39,     0,    13,     0,
-       0,     0,     0,     0,     0,    40,     0,    41,     0,     0,
-       0,    15,     0,     0,     0,    42,    43,    16,    17,     0,
-       0,    18,     0,     0,     0,    19,     0,     0,    20,     0,
-       0,     0,     0,     0,     0,    21,     0,     0,     0,     0,
-       0,     0,    22,     0,    44,     0,    23,   507,    24,    25,
-      26,    27,     0,     0,     0,     0,     0,     0,    29,     0,
-       0,     0,     0,     0,     4,     5,     6,   565,     0,   566,
-     567,   568,   569,   570,   571,   572,   573,   574,   575,     0,
-       0,     0,     0,    31,     0,     0,   576,   577,     0,     0,
-       0,     0,     0,   597,     0,    32,     0,     8,     0,     9,
-       0,    34,    35,    36,     0,    10,     0,    37,     0,    12,
-      38,     0,     0,     0,    39,     0,    13,     0,     0,     0,
-       0,     0,     0,    40,     0,    41,     0,     0,     0,    15,
-       0,     0,     0,    42,    43,    16,    17,     0,     0,    18,
-       0,     0,     0,    19,     0,     0,    20,     0,     0,     0,
-       0,     0,     0,    21,     0,     0,     0,     0,     0,     0,
-      22,     0,    44,     0,    23,   648,    24,    25,    26,    27,
-       0,     0,     0,     0,     0,     0,    29,     0,     0,     0,
-       0,     0,     0,     5,     6,     0,     0,     0,     0,     0,
+       0,     0,     0,   399,     0,     5,     6,   400,   401,   402,
+     403,   404,   405,   665,   666,     0,   668,   669,   670,   671,
+     672,   673,   674,   675,   676,   677,   678,   679,   680,   681,
+     682,   683,   684,     0,   686,     0,     0,     9,     0,    10,
+       0,   425,     0,     0,     0,    11,     0,     0,   551,    13,
+     552,   553,   554,   555,   556,   557,   558,   559,   560,   561,
+       0,     0,     0,     0,     0,     0,   445,   562,   563,    16,
+       0,     0,     0,     0,   604,   230,    18,     0,     0,     0,
+       0,    19,   406,     0,     0,     0,    20,     0,     0,    21,
+       0,     0,     0,     0,     0,     0,    22,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    24,     0,    25,
+      26,    27,    28,     0,     0,     0,     0,     0,   551,    30,
+     552,   553,   554,   555,   556,   557,   558,   559,   560,   561,
+       0,     0,     0,     0,   407,     0,     0,   562,   563,     0,
+       0,     0,     0,     0,   657,   554,   555,   556,   557,   558,
+     559,   560,   561,     0,     0,     0,    33,     0,     0,     0,
+     562,   563,    35,    36,    37,     0,     0,   408,    38,     0,
+       0,    39,     0,     0,     0,   233,     0,     0,     0,     0,
+       0,   409,     0,     0,   234,     0,    42,     0,     0,     0,
+       0,     4,     5,     6,    43,    44,     0,   542,   543,   544,
+     545,   546,   547,   548,     0,     0,     0,   410,     0,     0,
+     411,   412,   413,     0,   777,   414,   415,   779,     8,     0,
+       0,     0,     0,     0,     9,     0,    10,     0,   416,     0,
+       0,     0,    11,    12,     0,     0,    13,   425,     0,     0,
+       0,     0,     0,    14,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    15,     0,     0,    16,     0,     0,     0,
+       0,     0,    17,    18,     0,     0,     0,     0,    19,     0,
+       0,     0,     0,    20,     0,     0,    21,     0,     0,     0,
+       0,     0,     0,    22,     0,     0,     0,     0,     0,     0,
+      23,   335,     0,     0,    24,     0,    25,    26,    27,    28,
+      29,     0,     0,     0,     0,     0,    30,     0,     0,     0,
+       0,     0,     0,    31,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    31,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    32,     0,     8,     0,     9,     0,    34,
-      35,    36,     0,    10,     0,    37,     0,    12,    38,     0,
-       0,     0,    39,     0,     0,     0,     0,     0,     0,     0,
-       0,    40,     0,    41,     0,     0,     0,    15,     0,     0,
-       0,    42,    43,   232,    17,     0,     0,    18,     0,     0,
-       0,    19,     0,     0,    20,     0,     0,     0,     0,     0,
-       0,    21,     0,     0,     0,     0,     0,     0,     0,     0,
-      44,     0,    23,   760,    24,    25,    26,    27,     0,     0,
-       0,     0,     0,     0,    29,     0,     0,     0,     0,     0,
-       4,     5,     6,     0,     0,     0,     0,     0,     0,     0,
-       0,     7,     0,     0,     0,     0,   556,   557,   558,   559,
-     560,   561,   562,     0,     0,     0,     0,     0,     0,     0,
-       0,    32,     0,     8,     0,     9,     0,    34,    35,    36,
-       0,    10,    11,    37,     0,    12,    38,     0,     0,     0,
-     235,     0,    13,     0,     0,     0,     0,     0,     0,   236,
-       0,    41,    14,     0,     0,    15,     0,     0,     0,    42,
-      43,    16,    17,     0,     0,    18,     0,     0,     0,    19,
-       0,     0,    20,     0,     0,     0,     0,     0,     0,    21,
-       0,     0,     0,     0,     0,     0,    22,     0,    44,     0,
-      23,   642,    24,    25,    26,    27,    28,     0,     0,     0,
-       0,     0,    29,     0,     0,     0,     0,     0,     0,    30,
+       0,    32,     0,     0,     4,     5,     6,     0,     0,     0,
+       0,     0,     0,    33,     0,     0,     0,     0,    34,    35,
+      36,    37,     0,     0,     0,    38,     0,     0,    39,     0,
+       0,     8,    40,     0,     0,     0,     0,     9,     0,    10,
+       0,    41,     0,    42,     0,    11,    12,     0,     0,    13,
+       0,    43,    44,     0,     0,     0,    14,   553,   554,   555,
+     556,   557,   558,   559,   560,   561,    15,     0,     0,    16,
+       0,     0,     0,   562,   563,    17,    18,     0,     0,     0,
+      45,    19,     0,   350,     0,     0,    20,     0,     0,    21,
+       0,     0,     0,     0,     0,     0,    22,     0,     0,     0,
+       0,     0,     0,    23,   335,     0,     0,    24,     0,    25,
+      26,    27,    28,    29,     0,     0,     0,     0,     0,    30,
+       0,     0,     0,     0,     0,     0,    31,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    31,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,    32,
-       4,     5,     6,     0,    33,    34,    35,    36,     0,     0,
-     342,    37,     0,     0,    38,     0,     0,     0,    39,     0,
-       0,     0,     0,     0,     0,   -74,     0,    40,     0,    41,
-       0,     0,     0,     8,     0,     9,     0,    42,    43,     0,
-       0,    10,    11,     0,     0,    12,     0,     0,     0,     0,
-       0,     0,    13,   567,   568,   569,   570,   571,   572,   573,
-     574,   575,    14,     0,     0,    15,    44,     0,     0,   576,
-     577,    16,    17,     0,     0,    18,     0,     0,     0,    19,
-       0,     0,    20,     0,     0,     0,     0,     0,     0,    21,
-       0,     0,     0,     0,     0,     0,    22,   343,     0,     0,
-      23,     0,    24,    25,    26,    27,    28,     0,     0,     0,
-       0,     0,    29,     0,     0,     0,     0,     0,     0,    30,
-       0,     0,     0,     0,     0,     0,     5,     6,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    31,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,    32,
-       0,     0,     0,     0,    33,    34,    35,    36,     8,     0,
-       9,    37,     0,     0,    38,   268,    10,     0,    39,     0,
-      12,     0,     0,     0,     0,     0,     0,    40,     0,    41,
-     556,   557,   558,   559,   560,   561,   562,    42,    43,     0,
-      15,     0,     0,     0,     0,     0,   232,    17,     0,     0,
-      18,     0,   269,     0,    19,     0,     0,    20,     0,     0,
-       0,     0,     0,     0,    21,     0,    44,     0,     0,     0,
-       0,     0,     0,     0,     0,    23,     0,    24,    25,    26,
-      27,     0,     0,     0,     0,     0,     0,    29,     0,     0,
+       0,     0,     0,     0,    32,     0,     0,     4,     5,     6,
+       0,     0,     0,     0,     0,     0,    33,     0,     0,     0,
+       0,    34,    35,    36,    37,     0,     0,     0,    38,     0,
+       0,    39,     0,     0,     8,    40,     0,     0,     0,     0,
+       9,     0,    10,     0,    41,     0,    42,     0,    11,    12,
+       0,     0,    13,     0,    43,    44,     0,     0,     0,    14,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    15,
+       0,     0,    16,     0,     0,     0,     0,     0,    17,    18,
+       0,     0,     0,    45,    19,     0,   757,     0,     0,    20,
+       0,     0,    21,     0,     0,     0,     0,     0,     0,    22,
+       0,     0,     0,     0,     0,     0,    23,     0,     0,     0,
+      24,     0,    25,    26,    27,    28,    29,     0,     0,     0,
+       0,     0,    30,     0,     0,     0,     0,     0,     0,    31,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       4,     5,     6,     0,     0,     0,     0,    32,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    33,
+       0,     0,     0,     0,    34,    35,    36,    37,     0,     0,
+       0,    38,     0,     9,    39,    10,     0,     0,    40,     0,
+       0,    11,     0,     0,     0,    13,     0,    41,     0,    42,
+       0,     0,    14,     0,     0,     0,     0,    43,    44,     0,
+       0,     0,     0,     0,     0,    16,     0,     0,     0,     0,
+       0,    17,    18,     0,     0,     0,     0,    19,     0,     0,
+       0,     0,    20,     0,     0,    21,    45,     0,     0,   629,
+       0,     0,    22,     0,     0,     0,     0,     0,     0,    23,
+       0,     0,     0,    24,     0,    25,    26,    27,    28,     0,
+       0,     0,     0,     0,     0,    30,     0,     0,     0,     0,
+       0,     4,     5,     6,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+      32,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    33,     0,     9,     0,    10,     0,    35,    36,
+      37,     0,    11,     0,    38,     0,    13,    39,     0,     0,
+       0,    40,     0,    14,     0,     0,     0,     0,     0,     0,
+      41,     0,    42,     0,     0,     0,    16,     0,     0,     0,
+      43,    44,    17,    18,     0,     0,     0,     0,    19,     0,
+       0,     0,     0,    20,     0,     0,    21,     0,     0,     0,
+       0,     0,     0,    22,     0,     0,     0,     0,     0,    45,
+      23,     0,   626,     0,    24,     0,    25,    26,    27,    28,
+       0,     0,     0,     0,     0,     0,    30,     0,     0,     0,
+       0,     0,     4,     5,     6,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,    32,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    33,     0,     9,     0,    10,     0,    35,
+      36,    37,     0,    11,     0,    38,     0,    13,    39,     0,
+       0,     0,    40,     0,    14,     0,     0,     0,     0,     0,
+       0,    41,     0,    42,     0,     0,     0,    16,     0,     0,
+       0,    43,    44,    17,    18,     0,     0,     0,     0,    19,
+       0,     0,     0,     0,    20,     0,     0,    21,     0,     0,
+       0,     0,     0,     0,    22,     0,     0,     0,     0,     0,
+      45,    23,     0,   713,     0,    24,     0,    25,    26,    27,
+      28,     0,     0,     0,     0,     0,     0,    30,     0,     0,
        0,     0,     0,     0,     5,     6,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     270,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,    32,     0,     8,     0,     9,     0,
-      34,    35,    36,   268,    10,     0,    37,     0,    12,    38,
-     271,     0,     0,   235,     0,     0,     0,     0,     0,     0,
-       0,     0,   236,     0,    41,     0,     0,     0,    15,     0,
-       0,     0,    42,    43,   232,    17,     0,     0,    18,     0,
-     269,     0,    19,     0,     0,    20,     0,     0,     0,     0,
-     707,     0,    21,     0,     0,     0,     0,     0,     0,     0,
-       0,    44,     0,    23,     0,    24,    25,    26,    27,     0,
-       0,     0,     0,     0,     0,    29,     0,     0,     0,     0,
-       0,     0,     5,     6,     0,     0,     0,     0,   568,   569,
-     570,   571,   572,   573,   574,   575,     0,     0,   270,     0,
-       0,     0,   724,   576,   577,     0,     0,     0,     0,     0,
-       0,     0,    32,     0,     8,     0,     9,     0,    34,    35,
-      36,     0,    10,     0,    37,     0,    12,    38,   271,     0,
-       0,   235,     0,     0,     0,     0,     0,     0,     0,     0,
-     236,     0,    41,     0,     0,     0,    15,     0,     0,     0,
-      42,    43,   232,    17,     0,     0,    18,     0,     0,     0,
-      19,     0,     0,    20,     0,     0,     0,     0,   739,     0,
-      21,     0,     0,     0,     0,     0,     5,     6,     0,    44,
-       0,    23,     0,    24,    25,    26,    27,     0,     0,     0,
-       0,     0,     0,    29,   556,   557,   558,   559,   560,   561,
-     562,   563,   564,     0,     0,     0,     0,     0,     8,     0,
-       9,     0,     0,     0,     0,     0,    10,     0,     0,     0,
-      12,   556,   557,   558,   559,   560,   561,   562,   563,   564,
-      32,     0,     0,     0,     0,     0,    34,    35,    36,     0,
-      15,     0,    37,     0,     0,    38,   232,    17,     0,   235,
-      18,     0,     0,     0,    19,     0,     0,    20,   236,     0,
-      41,     0,     0,     0,    21,     0,     0,     0,    42,    43,
-       0,     0,     0,     0,     0,    23,     0,    24,    25,    26,
-      27,     0,     0,     0,     0,     0,     0,    29,   556,   557,
-     558,   559,   560,   561,   562,   563,   564,    44,     0,     0,
+       0,     0,    32,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    33,     0,     9,     0,    10,     0,
+      35,    36,    37,     0,    11,     0,    38,     0,    13,    39,
+       0,     0,     0,    40,     0,   542,   543,   544,   545,   546,
+     547,   548,    41,     0,    42,     0,     0,     0,    16,     0,
+       0,     0,    43,    44,   230,    18,     0,     0,     0,     0,
+      19,     0,     0,     0,     0,    20,     0,     0,    21,     0,
+       0,     0,     0,     0,     0,    22,     0,     0,     0,     0,
+       0,    45,     0,     0,   782,     0,    24,     0,    25,    26,
+      27,    28,     0,     0,     0,     0,     0,     0,    30,     0,
+       0,     0,     0,     0,     4,     5,     6,     0,     0,     0,
+       0,     0,     0,     0,     0,     7,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     556,   557,   558,   559,   560,   561,   562,   563,   564,     0,
-       0,     0,     0,     0,    32,     0,     0,     0,     0,     0,
-      34,    35,    36,     0,     0,     0,    37,     0,     0,    38,
-       0,     0,     0,   235,     0,     0,     0,     0,     0,     0,
-       0,     0,   236,     0,    41,     0,     0,     0,     0,     0,
-       0,     0,    42,    43,   556,   557,   558,   559,   560,   561,
-     562,   563,   564,     0,     0,     0,     0,     0,   565,     0,
-     566,   567,   568,   569,   570,   571,   572,   573,   574,   575,
-       0,    44,     0,     0,     0,     0,     0,   576,   577,     0,
-       0,     0,     0,     0,   618,   565,     0,   566,   567,   568,
-     569,   570,   571,   572,   573,   574,   575,     0,     0,     0,
-       0,     0,     0,     0,   576,   577,     0,     0,     0,     0,
-       0,   670,   556,   557,   558,   559,   560,   561,   562,   563,
-     564,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   565,     0,   566,   567,   568,   569,   570,   571,
-     572,   573,   574,   575,     0,     0,     0,     0,     0,     0,
-       0,   576,   577,   651,   565,     0,   566,   567,   568,   569,
-     570,   571,   572,   573,   574,   575,     0,     0,     0,     0,
-       0,     0,     0,   576,   577,   748,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   565,   747,
-     566,   567,   568,   569,   570,   571,   572,   573,   574,   575,
-       0,     0,     0,     0,     0,     0,     0,   576,   577,     5,
-       6,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   231,     0,     0,     0,     0,
-       0,     8,     0,     9,     0,     0,     0,     0,     0,    10,
-      11,     0,     0,    12,     0,     0,   565,     0,   566,   567,
-     568,   569,   570,   571,   572,   573,   574,   575,     0,     0,
-      14,     0,     0,    15,     0,   576,   577,     0,     0,   232,
-      17,     0,     0,    18,     0,     0,     0,    19,     0,     0,
-      20,     0,     0,     0,     0,     0,     0,    21,     0,     0,
-       0,     0,     0,     5,     6,     0,     0,     0,    23,     0,
-      24,    25,    26,    27,    28,     0,     0,   233,     0,     0,
-      29,     0,     0,     0,     0,   234,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     8,     0,     9,     0,     0,
-       0,     0,     0,    10,     0,     0,     0,    12,     0,     0,
+       0,     8,     0,     0,     0,    33,     0,     9,     0,    10,
+       0,    35,    36,    37,     0,    11,    12,    38,     0,    13,
+      39,     0,     0,     0,   233,     0,    14,     0,     0,     0,
+       0,     0,     0,   234,     0,    42,    15,     0,     0,    16,
+       0,     0,     0,    43,    44,    17,    18,     0,     0,     0,
+       0,    19,     0,     0,     0,     0,    20,     0,     0,    21,
+       0,     0,     0,     0,     0,     0,    22,     0,     0,     0,
+       0,     0,    45,    23,     0,   717,     0,    24,     0,    25,
+      26,    27,    28,    29,     0,     0,     0,     0,     0,    30,
+       0,     0,     0,     0,     0,     0,    31,   555,   556,   557,
+     558,   559,   560,   561,     0,     0,     0,     0,     0,     0,
+       0,   562,   563,     0,    32,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    33,     0,     0,     0,
+       0,    34,    35,    36,    37,     0,     0,     0,    38,     0,
+       0,    39,     0,     0,     0,    40,     0,     4,     5,     6,
+       0,     0,   -77,     0,    41,     0,    42,   334,     0,     0,
+       0,     0,     0,     0,    43,    44,     0,     0,     0,     0,
+       0,     0,     0,     0,     8,     0,     0,     0,     0,     0,
+       9,     0,    10,     0,     0,     0,     0,     0,    11,    12,
+       0,     0,    13,    45,     0,     0,     0,     0,     0,    14,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    15,
+       0,     0,    16,     0,     0,     0,     0,     0,    17,    18,
+       0,     0,     0,     0,    19,     0,     0,     0,     0,    20,
+       0,     0,    21,     0,     0,     0,     0,     0,     0,    22,
+       0,     0,     0,     0,     0,     0,    23,   335,     0,     0,
+      24,     0,    25,    26,    27,    28,    29,     0,     0,     0,
+       0,     0,    30,     0,     0,     0,     0,     0,     0,    31,
+       0,     0,     0,     0,     0,     0,     5,     6,     0,     0,
        0,     0,     0,     0,     0,     0,     0,    32,     0,     0,
-       0,     0,    33,    34,    35,    36,     0,    15,     0,    37,
-       0,     0,    38,   232,    17,     0,   235,    18,     0,     0,
-       0,    19,     0,     0,    20,   236,     0,    41,     0,     0,
-       0,    21,     0,     0,     0,    42,    43,     5,     6,     0,
-       0,     0,    23,     0,    24,    25,    26,    27,     0,     0,
-       0,     0,     0,     0,    29,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     8,
-       0,     9,     0,     0,     0,     0,     0,    10,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    33,
+       0,     0,     0,     0,    34,    35,    36,    37,     9,     0,
+      10,    38,     0,     0,    39,   259,    11,     0,    40,     0,
+      13,     0,     0,     0,     0,     0,     0,    41,     0,    42,
+       0,     0,     0,     0,     0,     0,     0,    43,    44,     0,
+      16,     0,     0,     0,     0,     0,   230,    18,     0,     0,
+       0,     0,    19,     0,   260,     0,     0,    20,     0,     0,
+      21,     0,     0,     0,     0,     0,    45,    22,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    24,     0,
+      25,    26,    27,    28,     0,     0,     0,     0,     0,     0,
+      30,     0,     0,     0,     0,     0,     0,     5,     6,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    32,     0,     0,     0,     0,     0,    34,    35,    36,
-       0,    15,     0,    37,     0,     0,    38,   232,    17,     0,
-     235,     0,     0,     0,     0,    19,     0,     0,    20,   236,
-       0,    41,     0,     0,     0,    21,     0,     0,     0,    42,
-      43,     0,     0,     0,     0,     0,     0,     0,    24,    25,
-      26,    27,     0,     0,     0,     0,     0,     0,    29,     0,
+       0,     0,     0,   261,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    33,     0,     9,
+       0,    10,     0,    35,    36,    37,   259,    11,     0,    38,
+       0,    13,    39,   262,     0,     0,   233,     0,     0,     0,
+       0,     0,     0,     0,     0,   234,     0,    42,     0,     0,
+       0,    16,     0,     0,     0,    43,    44,   230,    18,     0,
+       0,     0,     0,    19,     0,   260,     0,     0,    20,     0,
+       0,    21,     0,   694,     0,     0,     0,     0,    22,     0,
+       0,     0,     0,     0,    45,     0,     0,     0,     0,    24,
+       0,    25,    26,    27,    28,     0,     0,     0,     0,     0,
+       0,    30,     0,     0,     0,     0,     0,     0,     5,     6,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   261,     0,     0,     0,   722,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    33,     0,
+       9,     0,    10,     0,    35,    36,    37,     0,    11,     0,
+      38,     0,    13,    39,   262,     0,     0,   233,     0,     0,
+       0,     0,     0,     0,     0,     0,   234,     0,    42,     0,
+       0,     0,    16,     0,     0,     0,    43,    44,   230,    18,
+       0,     0,     0,     0,    19,     0,     0,     0,     0,    20,
+       0,     0,    21,     0,   738,     0,     0,     0,     0,    22,
+       0,     0,     0,     0,     0,    45,     0,     0,     0,     0,
+      24,     0,    25,    26,    27,    28,     0,     0,     0,     0,
+       0,     0,    30,     0,     0,     0,     0,     0,     0,     5,
+       6,     0,     0,   542,   543,   544,   545,   546,   547,   548,
+     549,   550,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    33,
+       0,     9,     0,    10,     0,    35,    36,    37,     0,    11,
+       0,    38,     0,    13,    39,     0,     0,     0,   233,     0,
+     542,   543,   544,   545,   546,   547,   548,   234,   550,    42,
+       0,     0,     0,    16,     0,     0,     0,    43,    44,   230,
+      18,     0,     0,     0,     0,    19,     0,     0,     0,     0,
+      20,     0,     0,    21,     0,     0,     0,     0,     0,     0,
+      22,     0,     0,     0,     0,     0,    45,     0,     0,     0,
+       0,    24,     0,    25,    26,    27,    28,     0,     0,     0,
+       0,     0,     0,    30,   542,   543,   544,   545,   546,   547,
+     548,   549,   550,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   542,   543,   544,   545,
+     546,   547,   548,   549,   550,     0,     0,     0,     0,     0,
+      33,     0,     0,     0,     0,     0,    35,    36,    37,     0,
+       0,     0,    38,     0,     0,    39,     0,     0,     0,   233,
+     542,   543,   544,   545,   546,   547,   548,     0,   234,     0,
+      42,     0,     0,     0,     0,     0,     0,     0,    43,    44,
+     551,     0,   552,   553,   554,   555,   556,   557,   558,   559,
+     560,   561,     0,     0,     0,     0,     0,     0,     0,   562,
+     563,   636,     0,     0,     0,     0,     0,    45,   542,   543,
+     544,   545,   546,   547,   548,   549,   550,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   552,
+     553,   554,   555,   556,   557,   558,   559,   560,   561,     0,
+       0,     0,     0,     0,     0,     0,   562,   563,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    34,    35,    36,     0,     0,     0,    37,     0,     0,
-       0,     0,     0,     0,   235,     0,     0,     0,     0,     0,
-     119,     0,     0,   236,   120,    41,   121,   122,   123,   124,
-     125,     0,   126,    42,    43,   127,     0,   128,     0,     0,
-       0,   129,   130,     0,   131,   132,   133,   134,   135,   136,
-       0,   137,   138,   139,   140,   141,   142,   143,   144,   145,
-       0,   146,     0,     0,   147,   148,   149,   150,   151,     0,
-       0,   152,   153,     0,     0,     0,   154,     0,   155,   156,
-       0,   157,   158,   159,   160,   161,   162,     0,   163,   164,
-     165,   166,   167,   168,     0,     0,   169,     0,     0,   170,
-       0,     0,     0,     0,     0,   171,   172,     0,   173,   174,
-       0,   175,   176,   177,     0,     0,     0,     0,   178,   179,
-     180,     0,   181,   182,   183,     0,   184,   185,   186,   187,
-     188,   189,   190,     0,   191,     0,   192,     0,   193,   194,
-     195,   196,   197,   198,   199,   200,   201,     0,   202,   203,
-     204,   205,     0,     0,     0,     0,     0,   206,     0,     0,
-     207,     0,     0,     0,   208,   209,     0,     0,   210,   211,
-     212,   213,     0,     0,   214,     0,   215,     0,   216,   217,
-     218,   219,   220,   221,   222,     0,     0,   223
+       0,   551,     0,   552,   553,   554,   555,   556,   557,   558,
+     559,   560,   561,     0,     0,     0,     0,     0,     0,     0,
+     562,   563,   747,   551,   746,   552,   553,   554,   555,   556,
+     557,   558,   559,   560,   561,     0,     0,     0,     0,     0,
+       0,     0,   562,   563,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     5,     6,     0,   552,
+     553,   554,   555,   556,   557,   558,   559,   560,   561,     0,
+       0,     0,     0,     0,     0,     0,   562,   563,     0,     0,
+       0,     0,     8,     0,     0,     0,     0,     0,     9,     0,
+      10,     0,     0,     0,     0,     0,    11,    12,     0,     0,
+      13,     0,     0,     0,     0,   551,     0,   552,   553,   554,
+     555,   556,   557,   558,   559,   560,   561,  -329,     0,     0,
+      16,     0,     0,     0,   562,   563,   230,    18,     0,     0,
+       0,     0,    19,     0,     0,     0,     0,    20,     0,     0,
+      21,     0,     0,     0,     0,     0,     0,    22,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    24,     0,
+      25,    26,    27,    28,    29,     0,     0,   231,     0,     0,
+      30,     0,     0,     0,     0,   232,     0,     5,     6,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    33,     0,     9,
+       0,    10,    34,    35,    36,    37,     0,    11,     0,    38,
+       0,    13,    39,     0,     0,     0,   233,     0,     0,     0,
+       0,     0,     0,     0,     0,   234,     0,    42,     0,     0,
+       0,    16,     0,     0,     0,    43,    44,   230,    18,     0,
+       0,     0,     0,    19,     0,     0,     0,     0,    20,     0,
+       0,    21,     0,     0,     0,     0,     0,     0,    22,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    24,
+       0,    25,    26,    27,    28,     0,     0,     0,     0,     5,
+       6,    30,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     9,     0,    10,     0,     0,     0,     0,    33,    11,
+       0,     0,     0,     0,    35,    36,    37,     0,     0,     0,
+      38,     0,     0,    39,     0,     0,     0,   233,     0,     0,
+       0,     0,     0,    16,     0,     0,   234,     0,    42,   230,
+      18,     0,     0,     0,     0,     0,    43,    44,     0,     0,
+      20,     0,     0,    21,     0,     0,     0,     0,     0,     0,
+      22,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    25,    26,    27,    28,     0,     0,     0,
+       0,     0,     0,    30,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    35,    36,    37,     0,
+       0,     0,    38,     0,     0,     0,     0,     0,     0,   233,
+       0,     0,     0,     0,     0,   115,     0,     0,   234,   116,
+      42,   117,   118,   119,   120,   121,     0,   122,    43,    44,
+     123,     0,   124,     0,     0,     0,   125,   126,     0,   127,
+     128,   129,   130,   131,   132,     0,   133,   134,   135,   136,
+     137,   138,   139,   140,   141,     0,   142,     0,     0,   143,
+     144,   145,   146,   147,     0,     0,   148,   149,   150,   151,
+       0,     0,     0,   152,   153,     0,   154,   155,     0,   156,
+     157,   158,   159,   160,   161,     0,   162,   163,   164,   165,
+     166,   167,     0,     0,   168,     0,     0,   169,     0,     0,
+       0,     0,     0,   170,   171,     0,   172,   173,     0,   174,
+     175,   176,     0,     0,     0,     0,   177,   178,   179,     0,
+     180,   181,   182,     0,   183,   184,   185,   186,   187,   188,
+     189,     0,   190,     0,   191,     0,   192,   193,   194,   195,
+     196,   197,   198,   199,   200,     0,   201,   202,   203,   204,
+       0,     0,     0,     0,     0,   205,     0,     0,   206,     0,
+       0,     0,   207,   208,     0,     0,   209,   210,   211,   212,
+       0,     0,   213,     0,   214,     0,   215,   216,   217,   218,
+     219,   220,   221,     0,     0,   222
 };
 
 static const yytype_int16 yycheck[] =
 {
-       2,    81,     2,     2,    52,    55,   277,     2,   312,     2,
-      81,   230,     2,   377,   379,     2,     2,    82,     2,     2,
-     356,     2,     2,    55,     2,     7,   120,     2,     2,   314,
-     273,   274,   317,   321,   319,    79,    80,   322,   601,    27,
-      84,   340,   110,   328,    49,    18,   111,   664,    78,    79,
-      80,    43,   110,   669,    84,     3,    55,     5,   674,     3,
-      55,     5,    55,    39,    40,    55,   173,    59,    55,    29,
-     220,     0,   173,   600,    79,   225,   295,   373,   382,     3,
-     173,     5,   308,   219,     3,   143,     5,    66,    29,   148,
-       7,     8,   309,   152,    35,   312,    44,    44,    58,   104,
-      44,    49,    49,   320,   225,    49,   323,   403,   404,   672,
-     336,   199,    72,   330,   331,   222,   199,   224,    78,    28,
-      44,   222,   738,   182,    18,    44,   220,    10,   220,   222,
-     199,   110,   224,    81,    81,   220,   379,    81,   226,   127,
-     225,   106,   199,   226,   671,   199,   199,   764,   153,   712,
-     369,   370,   220,   199,   373,   224,   179,    81,   494,    68,
-     199,   497,    81,   168,   244,   382,   383,     3,   221,   226,
-       6,   507,   226,   244,   225,   221,    36,   222,   225,   167,
-     707,    41,   745,   402,   403,   404,   485,   226,     3,   224,
-       5,   139,   139,   273,   274,   139,   220,     3,   224,     5,
-       6,   225,   273,   274,   421,   422,   423,   424,   425,   426,
-     427,   220,   739,   224,   223,   139,    16,    17,    18,   222,
-     139,   169,   169,   255,    18,   169,   228,   229,   224,   228,
-     229,   223,     3,   304,     5,   228,   229,   281,   201,   224,
-      10,   228,   229,    13,   226,   169,   219,   220,   533,   492,
-     169,   281,   220,   162,   220,   223,   306,   223,   222,   235,
-     236,   209,   209,   313,   329,   209,     3,   332,     5,   334,
-     335,   321,   220,   220,   339,   224,   222,   225,   225,   224,
-     584,   225,   224,   647,   555,   209,   220,   599,   197,   223,
-     209,   603,   220,   578,   224,   223,   220,   514,    44,   379,
-     220,   225,     3,   223,     5,   110,   225,   357,   379,     3,
-     222,     5,   648,   532,   224,   209,   210,   211,     3,   321,
-       5,     3,   224,     5,   395,   219,   220,   222,   224,   224,
-     615,   222,    10,   224,   384,    81,   607,   222,   224,   556,
-     557,   706,   559,   560,   561,   562,   563,   564,   565,   566,
-     567,   568,   569,   570,   571,   572,   573,   574,   575,     3,
-     577,     5,     3,     3,     5,   653,     3,   584,     5,     3,
-      45,     5,     3,   738,     5,   222,   378,   427,   378,   378,
-     122,   717,   384,   225,   225,   378,   751,     3,     3,     5,
-       5,   378,   609,   139,   706,   225,   639,   709,   669,   225,
-     225,   451,   404,   674,   769,   225,   677,   207,   208,   209,
-     210,   211,   492,   207,   208,   209,   210,   211,    93,   219,
-     220,   492,   225,   169,   760,   219,   220,   225,   224,   741,
-     226,   106,   107,   108,   109,   225,   225,   225,   225,   751,
-     225,   116,   225,    16,    17,    18,    19,    20,    21,    22,
-     225,   501,   194,   195,   196,   197,   198,   769,   762,   509,
-     225,   225,   225,   209,   225,   225,   225,   738,   225,   225,
-     225,   225,   225,   225,   220,   555,   719,   225,   225,   225,
-     225,   225,   225,     3,   225,   160,   225,   537,     5,   225,
-     165,   225,   225,   225,   220,   222,   498,   547,   498,   498,
-     785,   503,   501,   498,   506,   498,   506,   506,   498,   495,
-     509,   498,   498,   506,   498,   498,   509,   498,   498,   506,
-     498,   601,   509,   498,   498,   224,   224,   744,   224,   222,
-     747,   201,   227,   225,    10,   226,   226,   225,     7,    10,
-      10,   220,    10,    10,   537,   762,    10,    10,    10,    10,
-     224,   601,   225,   224,   222,   224,   222,   222,   201,   639,
-     224,   222,   219,   226,   222,   227,   199,   223,   639,     7,
-     225,   790,   791,   226,   226,   226,   226,   199,   226,   199,
-     219,   226,   630,    10,   226,   199,   100,   219,   226,   669,
-     226,   226,   672,   643,   674,   666,   226,   226,   226,   601,
-     226,   226,   226,   653,   201,   226,   224,   226,     3,   226,
-       5,     6,     7,     8,     9,    10,    11,    12,   226,     3,
-     226,   226,   672,     7,     8,     9,    10,    11,    12,   202,
-     203,   204,   205,   206,   207,   208,   209,   210,   211,   719,
-     226,   226,    37,   226,    39,   226,   219,   220,   719,   226,
-      45,   653,   226,   199,    49,   226,   226,   223,   738,   223,
-     179,   226,   712,    16,    17,    18,    19,    20,    21,    22,
-     672,    24,   226,   224,    69,   224,     3,     3,     7,    10,
-      75,    76,     7,   226,    79,    80,   199,   224,    83,   220,
-     223,    86,   224,     5,   201,   745,    80,   226,    93,     3,
-     226,   226,   226,     7,     8,     9,    10,    11,    12,   104,
-     712,   106,   107,   108,   109,   226,   718,   222,   226,   718,
-     722,   116,   722,   722,   226,   718,   226,   226,   224,   722,
-     581,   718,   226,   224,   330,   722,   131,   505,   609,   532,
-     654,   201,   201,   745,   371,     3,    55,   131,   791,     7,
-       8,     9,    10,    11,    12,   259,   251,   764,   153,   244,
-      90,   659,   655,   503,   159,   160,   161,   326,   657,   164,
-     165,    -1,    -1,   168,    -1,    -1,    80,   172,   391,    -1,
-     164,    -1,    -1,   178,    -1,    -1,   181,    -1,   183,    -1,
-      -1,    -1,    -1,    -1,   178,    -1,   191,   192,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   204,
-      -1,    -1,   207,   208,   209,    -1,    -1,   212,   213,    -1,
-     204,    -1,    80,   207,   208,   209,    -1,   131,   212,   213,
-     225,    -1,    -1,    -1,    -1,    -1,    -1,   221,    -1,    -1,
-      -1,   225,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   202,
-     203,   204,   205,   206,   207,   208,   209,   210,   211,    -1,
-     164,    -1,    -1,    -1,    -1,    -1,   219,   220,    -1,    -1,
-      -1,    -1,    -1,   131,   178,    -1,    -1,    -1,    -1,    -1,
+       2,    56,     2,    53,     2,   229,     2,     2,     2,    78,
+       2,     8,     2,     2,     2,    12,     2,     2,    15,     2,
+      17,     2,    78,     2,     2,     2,   264,   265,   368,   350,
+     313,   489,    29,   649,     7,    43,   269,    34,   304,   586,
+      79,    76,    77,    40,    41,   306,    81,    18,   309,   113,
+     311,    59,   125,   314,   176,     3,    56,     5,    56,   320,
+      56,    56,    56,   287,   587,   332,    56,    56,   107,    75,
+      76,    77,    40,    41,   123,    81,    28,    27,   392,   393,
+     656,   113,    70,   176,   176,   661,    29,   223,    30,   151,
+     223,    66,   228,   155,    36,   228,    44,   223,     3,     0,
+       5,    49,   228,   225,   202,   371,     3,     3,     5,     5,
+       3,   658,     5,     3,   146,    58,    68,     7,     8,     9,
+      10,    11,    12,   185,   197,   198,   199,   200,   201,    72,
+     368,   229,   225,   225,   227,    83,   659,    80,   113,   202,
+      49,   202,   300,     3,   202,    37,     6,   694,    44,   228,
+      42,    44,   768,    49,   202,   202,   202,   223,   109,   223,
+     226,   737,    18,   224,    10,   486,   229,   391,   392,   393,
+     328,   229,    81,   242,   223,     3,   699,     5,   224,   493,
+     130,   229,   229,    16,    17,    18,   242,    83,    21,    22,
+      83,   738,    82,   222,   142,   264,   265,   202,   107,   585,
+     223,   228,    10,   589,   227,    13,   228,   474,   264,   265,
+      16,    17,    18,   165,   223,   227,    44,   226,   226,   182,
+     170,   744,   227,   227,   172,   227,   228,   227,   228,   227,
+     228,   227,   228,   230,   231,   232,   233,   234,   273,     3,
+     296,     5,    18,   298,   134,   483,   142,   156,   200,   142,
+     305,   222,   223,   227,   712,    83,   229,   518,   313,   225,
+     484,   485,   171,   227,   212,   233,   234,   273,     3,   493,
+       5,     6,     3,   227,     5,   223,   172,   167,   223,   172,
+     228,   226,   321,   223,    66,   324,   226,   326,   327,     7,
+       8,   181,   331,   517,   227,   227,   351,    44,   619,   368,
+     227,   622,    49,   564,   570,   626,   223,   693,   541,   226,
+     696,   313,   368,   225,   142,   227,   212,   207,   373,   212,
+     210,   211,   212,   227,   223,   215,   216,   226,   384,   227,
+     223,   225,   228,   227,   224,   228,    83,     3,   228,     5,
+     601,   227,   227,     3,   172,   113,    10,     7,     8,     9,
+      10,    11,    12,   693,   740,   638,   212,   213,   214,   225,
+     593,   416,   227,     3,   750,     5,   222,   223,     3,     3,
+       5,   373,   367,   225,   228,   208,   209,   210,   211,   212,
+     213,   214,   223,   704,   212,   440,     3,   773,     5,   222,
+     223,   393,   713,   228,   228,   142,   227,   737,   229,   228,
+     228,   228,   228,   228,   210,   211,   212,   213,   214,   228,
+     750,   228,   228,   651,   483,   228,   222,   223,   228,   228,
+     225,   228,    82,   656,   228,   172,   228,   483,   661,   228,
+     228,   664,   228,   773,   210,   211,   212,   213,   214,   228,
+     228,   228,   228,   228,   228,   228,   222,   223,   228,   228,
+     228,   228,   204,   228,   228,   228,   228,   228,   228,   228,
+     227,   782,   228,   225,   225,   212,   225,   522,   706,   524,
+     225,   227,   541,   227,   134,   225,   223,   230,   533,   228,
+       5,   228,   204,   229,   229,   228,     7,    10,   490,   491,
+     490,   491,   490,   491,   490,   491,   491,   491,   490,   491,
+     766,   491,   491,   491,   737,   491,   491,   167,   491,    10,
+     491,    10,   491,   491,   491,    10,    10,    10,   587,    10,
+      44,   181,    10,    10,   524,   223,   522,   228,   227,   790,
+     227,   227,   587,   225,   227,   226,     3,   227,   225,   225,
+       7,     8,     9,    10,    11,    12,   229,   207,   222,   225,
+     210,   211,   212,   226,   202,   215,   216,     7,   230,    83,
+     229,   229,   229,   228,   224,   202,   616,   229,   228,   222,
+     229,   795,   796,   628,   202,    45,   222,   229,   229,   229,
+     229,   202,   651,   638,   229,   587,   229,   656,   229,    10,
+     659,   229,   661,   229,   182,   651,   229,   653,   229,   229,
+     229,   225,   229,   229,   659,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,   229,    82,   229,   229,   142,   229,
+     229,   229,   229,   625,   229,   625,    96,   625,   628,   625,
+     628,   633,   628,   625,   229,   229,   638,   706,   204,   109,
+     110,   111,   112,   227,   699,   202,   229,   229,   172,   119,
+     706,   227,   227,     3,     3,     7,    10,   659,   229,     7,
+     202,   103,   301,   718,   204,   304,   227,   134,   737,   223,
+     226,   226,     5,   312,   227,   204,   315,   229,   229,   229,
+     229,   229,   227,   322,   323,   229,   227,   225,   212,   744,
+     229,   227,   229,   163,   229,   229,   204,   699,   168,   223,
+     167,   204,   624,   705,   228,   705,   567,   705,   227,   705,
+     366,   708,   709,   595,   181,   796,   517,   633,   322,   639,
+     362,   318,   242,   768,    87,   644,   380,   642,   360,   640,
+      -1,    -1,   371,   372,    -1,    -1,    -1,    -1,    -1,    -1,
+     207,    -1,   744,   210,   211,   212,    -1,    -1,   215,   216,
+      -1,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+     762,   228,   762,    -1,   762,    -1,   762,    -1,    -1,    -1,
+     762,   410,   411,   412,   413,   414,   415,   416,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,     4,     5,     6,    -1,    -1,    16,    17,    18,    -1,
-     204,    21,    22,   207,   208,   209,   164,    -1,   212,   213,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   221,    -1,    -1,
-     178,   225,    -1,    -1,    37,    -1,    39,    -1,    -1,    -1,
-      -1,    -1,    45,    46,    -1,    -1,    49,    -1,    -1,    -1,
-      -1,    -1,    -1,    56,    -1,    -1,   204,    -1,    -1,   207,
-     208,   209,    -1,    66,   212,   213,    69,    -1,    -1,    -1,
-      -1,    -1,    75,    76,    -1,    -1,    79,   225,    -1,    -1,
-      83,    -1,    -1,    86,    -1,    -1,    -1,    -1,    -1,    -1,
-      93,    -1,    -1,    -1,    -1,    -1,    -1,   100,   101,    -1,
-      -1,   104,    -1,   106,   107,   108,   109,   110,    -1,    -1,
-      -1,    -1,    -1,   116,    -1,    -1,    -1,    -1,    -1,    -1,
-     123,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   141,    -1,
-       4,     5,     6,    16,    17,    18,    19,    20,    21,    22,
-     153,    -1,    -1,    -1,    -1,   158,   159,   160,   161,    -1,
-      -1,    -1,   165,    -1,    -1,   168,    -1,    -1,    -1,   172,
-      -1,    -1,    -1,    37,    -1,    39,    -1,    -1,   181,    -1,
-     183,    45,    46,    -1,    -1,    49,    -1,    -1,   191,   192,
-      -1,    -1,    56,    -1,    -1,   205,   206,   207,   208,   209,
-     210,   211,    66,    -1,    -1,    69,    -1,    -1,    -1,   219,
-     220,    75,    76,    -1,    -1,    79,    -1,   220,    -1,    83,
-     223,    -1,    86,    -1,    -1,    -1,    -1,    -1,    -1,    93,
-      -1,    -1,    -1,    -1,    -1,    -1,   100,   101,    -1,    -1,
-     104,    -1,   106,   107,   108,   109,   110,    -1,    -1,    -1,
-      -1,    -1,   116,    -1,    -1,    -1,    -1,    -1,    -1,   123,
+      -1,    -1,   203,    -1,   205,   206,   207,   208,   209,   210,
+     211,   212,   213,   214,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   222,   223,    -1,    -1,    -1,    -1,    -1,   229,    -1,
+      -1,    16,    17,    18,    19,    20,    21,    22,    23,    24,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   141,    -1,     4,
-       5,     6,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   153,
-      -1,    -1,    -1,    -1,   158,   159,   160,   161,    -1,    -1,
-      -1,   165,    -1,    -1,   168,    -1,    -1,    -1,   172,    -1,
-      -1,    -1,    37,    -1,    39,    -1,    -1,   181,    -1,   183,
-      45,    46,    -1,    -1,    49,    -1,    -1,   191,   192,    -1,
-      -1,    56,   205,   206,   207,   208,   209,   210,   211,    -1,
-      -1,    66,    -1,    -1,    69,    -1,   219,   220,    -1,    -1,
-      75,    76,    -1,    -1,    79,    -1,   220,    -1,    83,   223,
-      -1,    86,    -1,    -1,    -1,    -1,    -1,    -1,    93,    -1,
-      -1,    -1,    -1,    -1,    -1,   100,    -1,    -1,    -1,   104,
-      -1,   106,   107,   108,   109,   110,    -1,    -1,    -1,    -1,
-      -1,   116,    -1,    -1,    -1,    -1,    -1,    -1,   123,    -1,
+      -1,    -1,    -1,    -1,    16,    17,    18,    19,    20,    21,
+      22,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     499,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   141,    -1,     4,     5,
-       6,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   153,    -1,
-      -1,    -1,    -1,   158,   159,   160,   161,    -1,    -1,    -1,
-     165,    -1,    -1,   168,    -1,    -1,    -1,   172,    -1,    -1,
-      -1,    37,    -1,    39,    -1,    -1,   181,    -1,   183,    45,
-      -1,    -1,    -1,    49,    -1,    -1,   191,   192,    -1,    -1,
-      56,    -1,    -1,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    -1,    69,    -1,    -1,    -1,    -1,    -1,    75,
-      76,    -1,    -1,    79,    -1,   220,    -1,    83,   223,    -1,
-      86,    -1,    -1,    -1,    -1,    -1,    -1,    93,    -1,    -1,
-      -1,    -1,    -1,    -1,   100,    -1,    -1,    -1,   104,    -1,
-     106,   107,   108,   109,    -1,    -1,    -1,    -1,    -1,    -1,
-     116,    -1,    -1,    -1,    -1,    -1,     4,     5,     6,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   141,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   153,    -1,    37,
-      -1,    39,    -1,   159,   160,   161,    -1,    45,    -1,   165,
-      -1,    49,   168,    -1,    -1,    -1,   172,    -1,    56,    -1,
-      -1,    -1,    -1,    -1,    -1,   181,    -1,   183,    -1,    -1,
-      -1,    69,    -1,    -1,    -1,   191,   192,    75,    76,    -1,
-      -1,    79,    -1,    -1,    -1,    83,    -1,    -1,    86,    -1,
-      -1,    -1,    -1,    -1,    -1,    93,    -1,    -1,    -1,    -1,
-      -1,    -1,   100,    -1,   220,    -1,   104,   223,   106,   107,
-     108,   109,    -1,    -1,    -1,    -1,    -1,    -1,   116,    -1,
-      -1,    -1,    -1,    -1,     4,     5,     6,   200,    -1,   202,
-     203,   204,   205,   206,   207,   208,   209,   210,   211,    -1,
-      -1,    -1,    -1,   141,    -1,    -1,   219,   220,    -1,    -1,
-      -1,    -1,    -1,   226,    -1,   153,    -1,    37,    -1,    39,
-      -1,   159,   160,   161,    -1,    45,    -1,   165,    -1,    49,
-     168,    -1,    -1,    -1,   172,    -1,    56,    -1,    -1,    -1,
-      -1,    -1,    -1,   181,    -1,   183,    -1,    -1,    -1,    69,
-      -1,    -1,    -1,   191,   192,    75,    76,    -1,    -1,    79,
-      -1,    -1,    -1,    83,    -1,    -1,    86,    -1,    -1,    -1,
-      -1,    -1,    -1,    93,    -1,    -1,    -1,    -1,    -1,    -1,
-     100,    -1,   220,    -1,   104,   223,   106,   107,   108,   109,
-      -1,    -1,    -1,    -1,    -1,    -1,   116,    -1,    -1,    -1,
-      -1,    -1,    -1,     5,     6,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,     3,    -1,     5,     6,     7,     8,     9,
+      10,    11,    12,   542,   543,    -1,   545,   546,   547,   548,
+     549,   550,   551,   552,   553,   554,   555,   556,   557,   558,
+     559,   560,   561,    -1,   563,    -1,    -1,    37,    -1,    39,
+      -1,   570,    -1,    -1,    -1,    45,    -1,    -1,   203,    49,
+     205,   206,   207,   208,   209,   210,   211,   212,   213,   214,
+      -1,    -1,    -1,    -1,    -1,    -1,   595,   222,   223,    69,
+      -1,    -1,    -1,    -1,   229,    75,    76,    -1,    -1,    -1,
+      -1,    81,    82,    -1,    -1,    -1,    86,    -1,    -1,    89,
+      -1,    -1,    -1,    -1,    -1,    -1,    96,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   107,    -1,   109,
+     110,   111,   112,    -1,    -1,    -1,    -1,    -1,   203,   119,
+     205,   206,   207,   208,   209,   210,   211,   212,   213,   214,
+      -1,    -1,    -1,    -1,   134,    -1,    -1,   222,   223,    -1,
+      -1,    -1,    -1,    -1,   229,   207,   208,   209,   210,   211,
+     212,   213,   214,    -1,    -1,    -1,   156,    -1,    -1,    -1,
+     222,   223,   162,   163,   164,    -1,    -1,   167,   168,    -1,
+      -1,   171,    -1,    -1,    -1,   175,    -1,    -1,    -1,    -1,
+      -1,   181,    -1,    -1,   184,    -1,   186,    -1,    -1,    -1,
+      -1,     4,     5,     6,   194,   195,    -1,    16,    17,    18,
+      19,    20,    21,    22,    -1,    -1,    -1,   207,    -1,    -1,
+     210,   211,   212,    -1,   743,   215,   216,   746,    31,    -1,
+      -1,    -1,    -1,    -1,    37,    -1,    39,    -1,   228,    -1,
+      -1,    -1,    45,    46,    -1,    -1,    49,   766,    -1,    -1,
+      -1,    -1,    -1,    56,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    66,    -1,    -1,    69,    -1,    -1,    -1,
+      -1,    -1,    75,    76,    -1,    -1,    -1,    -1,    81,    -1,
+      -1,    -1,    -1,    86,    -1,    -1,    89,    -1,    -1,    -1,
+      -1,    -1,    -1,    96,    -1,    -1,    -1,    -1,    -1,    -1,
+     103,   104,    -1,    -1,   107,    -1,   109,   110,   111,   112,
+     113,    -1,    -1,    -1,    -1,    -1,   119,    -1,    -1,    -1,
+      -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   141,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   153,    -1,    37,    -1,    39,    -1,   159,
-     160,   161,    -1,    45,    -1,   165,    -1,    49,   168,    -1,
-      -1,    -1,   172,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   181,    -1,   183,    -1,    -1,    -1,    69,    -1,    -1,
-      -1,   191,   192,    75,    76,    -1,    -1,    79,    -1,    -1,
-      -1,    83,    -1,    -1,    86,    -1,    -1,    -1,    -1,    -1,
-      -1,    93,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     220,    -1,   104,   223,   106,   107,   108,   109,    -1,    -1,
-      -1,    -1,    -1,    -1,   116,    -1,    -1,    -1,    -1,    -1,
-       4,     5,     6,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    15,    -1,    -1,    -1,    -1,    16,    17,    18,    19,
-      20,    21,    22,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   153,    -1,    37,    -1,    39,    -1,   159,   160,   161,
-      -1,    45,    46,   165,    -1,    49,   168,    -1,    -1,    -1,
-     172,    -1,    56,    -1,    -1,    -1,    -1,    -1,    -1,   181,
-      -1,   183,    66,    -1,    -1,    69,    -1,    -1,    -1,   191,
-     192,    75,    76,    -1,    -1,    79,    -1,    -1,    -1,    83,
-      -1,    -1,    86,    -1,    -1,    -1,    -1,    -1,    -1,    93,
-      -1,    -1,    -1,    -1,    -1,    -1,   100,    -1,   220,    -1,
-     104,   223,   106,   107,   108,   109,   110,    -1,    -1,    -1,
-      -1,    -1,   116,    -1,    -1,    -1,    -1,    -1,    -1,   123,
+      -1,   144,    -1,    -1,     4,     5,     6,    -1,    -1,    -1,
+      -1,    -1,    -1,   156,    -1,    -1,    -1,    -1,   161,   162,
+     163,   164,    -1,    -1,    -1,   168,    -1,    -1,   171,    -1,
+      -1,    31,   175,    -1,    -1,    -1,    -1,    37,    -1,    39,
+      -1,   184,    -1,   186,    -1,    45,    46,    -1,    -1,    49,
+      -1,   194,   195,    -1,    -1,    -1,    56,   206,   207,   208,
+     209,   210,   211,   212,   213,   214,    66,    -1,    -1,    69,
+      -1,    -1,    -1,   222,   223,    75,    76,    -1,    -1,    -1,
+     223,    81,    -1,   226,    -1,    -1,    86,    -1,    -1,    89,
+      -1,    -1,    -1,    -1,    -1,    -1,    96,    -1,    -1,    -1,
+      -1,    -1,    -1,   103,   104,    -1,    -1,   107,    -1,   109,
+     110,   111,   112,   113,    -1,    -1,    -1,    -1,    -1,   119,
+      -1,    -1,    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   141,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   153,
-       4,     5,     6,    -1,   158,   159,   160,   161,    -1,    -1,
-      14,   165,    -1,    -1,   168,    -1,    -1,    -1,   172,    -1,
-      -1,    -1,    -1,    -1,    -1,   179,    -1,   181,    -1,   183,
-      -1,    -1,    -1,    37,    -1,    39,    -1,   191,   192,    -1,
-      -1,    45,    46,    -1,    -1,    49,    -1,    -1,    -1,    -1,
-      -1,    -1,    56,   203,   204,   205,   206,   207,   208,   209,
-     210,   211,    66,    -1,    -1,    69,   220,    -1,    -1,   219,
-     220,    75,    76,    -1,    -1,    79,    -1,    -1,    -1,    83,
-      -1,    -1,    86,    -1,    -1,    -1,    -1,    -1,    -1,    93,
-      -1,    -1,    -1,    -1,    -1,    -1,   100,   101,    -1,    -1,
-     104,    -1,   106,   107,   108,   109,   110,    -1,    -1,    -1,
-      -1,    -1,   116,    -1,    -1,    -1,    -1,    -1,    -1,   123,
-      -1,    -1,    -1,    -1,    -1,    -1,     5,     6,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   141,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   153,
-      -1,    -1,    -1,    -1,   158,   159,   160,   161,    37,    -1,
-      39,   165,    -1,    -1,   168,    44,    45,    -1,   172,    -1,
-      49,    -1,    -1,    -1,    -1,    -1,    -1,   181,    -1,   183,
-      16,    17,    18,    19,    20,    21,    22,   191,   192,    -1,
-      69,    -1,    -1,    -1,    -1,    -1,    75,    76,    -1,    -1,
-      79,    -1,    81,    -1,    83,    -1,    -1,    86,    -1,    -1,
-      -1,    -1,    -1,    -1,    93,    -1,   220,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   104,    -1,   106,   107,   108,
-     109,    -1,    -1,    -1,    -1,    -1,    -1,   116,    -1,    -1,
+      -1,    -1,    -1,    -1,   144,    -1,    -1,     4,     5,     6,
+      -1,    -1,    -1,    -1,    -1,    -1,   156,    -1,    -1,    -1,
+      -1,   161,   162,   163,   164,    -1,    -1,    -1,   168,    -1,
+      -1,   171,    -1,    -1,    31,   175,    -1,    -1,    -1,    -1,
+      37,    -1,    39,    -1,   184,    -1,   186,    -1,    45,    46,
+      -1,    -1,    49,    -1,   194,   195,    -1,    -1,    -1,    56,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    66,
+      -1,    -1,    69,    -1,    -1,    -1,    -1,    -1,    75,    76,
+      -1,    -1,    -1,   223,    81,    -1,   226,    -1,    -1,    86,
+      -1,    -1,    89,    -1,    -1,    -1,    -1,    -1,    -1,    96,
+      -1,    -1,    -1,    -1,    -1,    -1,   103,    -1,    -1,    -1,
+     107,    -1,   109,   110,   111,   112,   113,    -1,    -1,    -1,
+      -1,    -1,   119,    -1,    -1,    -1,    -1,    -1,    -1,   126,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       4,     5,     6,    -1,    -1,    -1,    -1,   144,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   156,
+      -1,    -1,    -1,    -1,   161,   162,   163,   164,    -1,    -1,
+      -1,   168,    -1,    37,   171,    39,    -1,    -1,   175,    -1,
+      -1,    45,    -1,    -1,    -1,    49,    -1,   184,    -1,   186,
+      -1,    -1,    56,    -1,    -1,    -1,    -1,   194,   195,    -1,
+      -1,    -1,    -1,    -1,    -1,    69,    -1,    -1,    -1,    -1,
+      -1,    75,    76,    -1,    -1,    -1,    -1,    81,    -1,    -1,
+      -1,    -1,    86,    -1,    -1,    89,   223,    -1,    -1,   226,
+      -1,    -1,    96,    -1,    -1,    -1,    -1,    -1,    -1,   103,
+      -1,    -1,    -1,   107,    -1,   109,   110,   111,   112,    -1,
+      -1,    -1,    -1,    -1,    -1,   119,    -1,    -1,    -1,    -1,
+      -1,     4,     5,     6,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     144,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   156,    -1,    37,    -1,    39,    -1,   162,   163,
+     164,    -1,    45,    -1,   168,    -1,    49,   171,    -1,    -1,
+      -1,   175,    -1,    56,    -1,    -1,    -1,    -1,    -1,    -1,
+     184,    -1,   186,    -1,    -1,    -1,    69,    -1,    -1,    -1,
+     194,   195,    75,    76,    -1,    -1,    -1,    -1,    81,    -1,
+      -1,    -1,    -1,    86,    -1,    -1,    89,    -1,    -1,    -1,
+      -1,    -1,    -1,    96,    -1,    -1,    -1,    -1,    -1,   223,
+     103,    -1,   226,    -1,   107,    -1,   109,   110,   111,   112,
+      -1,    -1,    -1,    -1,    -1,    -1,   119,    -1,    -1,    -1,
+      -1,    -1,     4,     5,     6,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   144,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   156,    -1,    37,    -1,    39,    -1,   162,
+     163,   164,    -1,    45,    -1,   168,    -1,    49,   171,    -1,
+      -1,    -1,   175,    -1,    56,    -1,    -1,    -1,    -1,    -1,
+      -1,   184,    -1,   186,    -1,    -1,    -1,    69,    -1,    -1,
+      -1,   194,   195,    75,    76,    -1,    -1,    -1,    -1,    81,
+      -1,    -1,    -1,    -1,    86,    -1,    -1,    89,    -1,    -1,
+      -1,    -1,    -1,    -1,    96,    -1,    -1,    -1,    -1,    -1,
+     223,   103,    -1,   226,    -1,   107,    -1,   109,   110,   111,
+     112,    -1,    -1,    -1,    -1,    -1,    -1,   119,    -1,    -1,
       -1,    -1,    -1,    -1,     5,     6,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     139,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   153,    -1,    37,    -1,    39,    -1,
-     159,   160,   161,    44,    45,    -1,   165,    -1,    49,   168,
-     169,    -1,    -1,   172,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   181,    -1,   183,    -1,    -1,    -1,    69,    -1,
-      -1,    -1,   191,   192,    75,    76,    -1,    -1,    79,    -1,
-      81,    -1,    83,    -1,    -1,    86,    -1,    -1,    -1,    -1,
-     209,    -1,    93,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   220,    -1,   104,    -1,   106,   107,   108,   109,    -1,
-      -1,    -1,    -1,    -1,    -1,   116,    -1,    -1,    -1,    -1,
-      -1,    -1,     5,     6,    -1,    -1,    -1,    -1,   204,   205,
-     206,   207,   208,   209,   210,   211,    -1,    -1,   139,    -1,
-      -1,    -1,    25,   219,   220,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   153,    -1,    37,    -1,    39,    -1,   159,   160,
-     161,    -1,    45,    -1,   165,    -1,    49,   168,   169,    -1,
-      -1,   172,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     181,    -1,   183,    -1,    -1,    -1,    69,    -1,    -1,    -1,
-     191,   192,    75,    76,    -1,    -1,    79,    -1,    -1,    -1,
-      83,    -1,    -1,    86,    -1,    -1,    -1,    -1,   209,    -1,
-      93,    -1,    -1,    -1,    -1,    -1,     5,     6,    -1,   220,
-      -1,   104,    -1,   106,   107,   108,   109,    -1,    -1,    -1,
-      -1,    -1,    -1,   116,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    -1,    -1,    -1,    -1,    -1,    37,    -1,
-      39,    -1,    -1,    -1,    -1,    -1,    45,    -1,    -1,    -1,
-      49,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-     153,    -1,    -1,    -1,    -1,    -1,   159,   160,   161,    -1,
-      69,    -1,   165,    -1,    -1,   168,    75,    76,    -1,   172,
-      79,    -1,    -1,    -1,    83,    -1,    -1,    86,   181,    -1,
-     183,    -1,    -1,    -1,    93,    -1,    -1,    -1,   191,   192,
-      -1,    -1,    -1,    -1,    -1,   104,    -1,   106,   107,   108,
-     109,    -1,    -1,    -1,    -1,    -1,    -1,   116,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,   220,    -1,    -1,
+      -1,    -1,   144,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   156,    -1,    37,    -1,    39,    -1,
+     162,   163,   164,    -1,    45,    -1,   168,    -1,    49,   171,
+      -1,    -1,    -1,   175,    -1,    16,    17,    18,    19,    20,
+      21,    22,   184,    -1,   186,    -1,    -1,    -1,    69,    -1,
+      -1,    -1,   194,   195,    75,    76,    -1,    -1,    -1,    -1,
+      81,    -1,    -1,    -1,    -1,    86,    -1,    -1,    89,    -1,
+      -1,    -1,    -1,    -1,    -1,    96,    -1,    -1,    -1,    -1,
+      -1,   223,    -1,    -1,   226,    -1,   107,    -1,   109,   110,
+     111,   112,    -1,    -1,    -1,    -1,    -1,    -1,   119,    -1,
+      -1,    -1,    -1,    -1,     4,     5,     6,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    15,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    -1,
-      -1,    -1,    -1,    -1,   153,    -1,    -1,    -1,    -1,    -1,
-     159,   160,   161,    -1,    -1,    -1,   165,    -1,    -1,   168,
-      -1,    -1,    -1,   172,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   181,    -1,   183,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   191,   192,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    -1,    -1,    -1,    -1,    -1,   200,    -1,
-     202,   203,   204,   205,   206,   207,   208,   209,   210,   211,
-      -1,   220,    -1,    -1,    -1,    -1,    -1,   219,   220,    -1,
-      -1,    -1,    -1,    -1,   226,   200,    -1,   202,   203,   204,
-     205,   206,   207,   208,   209,   210,   211,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   219,   220,    -1,    -1,    -1,    -1,
-      -1,   226,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    31,    -1,    -1,    -1,   156,    -1,    37,    -1,    39,
+      -1,   162,   163,   164,    -1,    45,    46,   168,    -1,    49,
+     171,    -1,    -1,    -1,   175,    -1,    56,    -1,    -1,    -1,
+      -1,    -1,    -1,   184,    -1,   186,    66,    -1,    -1,    69,
+      -1,    -1,    -1,   194,   195,    75,    76,    -1,    -1,    -1,
+      -1,    81,    -1,    -1,    -1,    -1,    86,    -1,    -1,    89,
+      -1,    -1,    -1,    -1,    -1,    -1,    96,    -1,    -1,    -1,
+      -1,    -1,   223,   103,    -1,   226,    -1,   107,    -1,   109,
+     110,   111,   112,   113,    -1,    -1,    -1,    -1,    -1,   119,
+      -1,    -1,    -1,    -1,    -1,    -1,   126,   208,   209,   210,
+     211,   212,   213,   214,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   222,   223,    -1,   144,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   156,    -1,    -1,    -1,
+      -1,   161,   162,   163,   164,    -1,    -1,    -1,   168,    -1,
+      -1,   171,    -1,    -1,    -1,   175,    -1,     4,     5,     6,
+      -1,    -1,   182,    -1,   184,    -1,   186,    14,    -1,    -1,
+      -1,    -1,    -1,    -1,   194,   195,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    31,    -1,    -1,    -1,    -1,    -1,
+      37,    -1,    39,    -1,    -1,    -1,    -1,    -1,    45,    46,
+      -1,    -1,    49,   223,    -1,    -1,    -1,    -1,    -1,    56,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    66,
+      -1,    -1,    69,    -1,    -1,    -1,    -1,    -1,    75,    76,
+      -1,    -1,    -1,    -1,    81,    -1,    -1,    -1,    -1,    86,
+      -1,    -1,    89,    -1,    -1,    -1,    -1,    -1,    -1,    96,
+      -1,    -1,    -1,    -1,    -1,    -1,   103,   104,    -1,    -1,
+     107,    -1,   109,   110,   111,   112,   113,    -1,    -1,    -1,
+      -1,    -1,   119,    -1,    -1,    -1,    -1,    -1,    -1,   126,
+      -1,    -1,    -1,    -1,    -1,    -1,     5,     6,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   144,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   156,
+      -1,    -1,    -1,    -1,   161,   162,   163,   164,    37,    -1,
+      39,   168,    -1,    -1,   171,    44,    45,    -1,   175,    -1,
+      49,    -1,    -1,    -1,    -1,    -1,    -1,   184,    -1,   186,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   194,   195,    -1,
+      69,    -1,    -1,    -1,    -1,    -1,    75,    76,    -1,    -1,
+      -1,    -1,    81,    -1,    83,    -1,    -1,    86,    -1,    -1,
+      89,    -1,    -1,    -1,    -1,    -1,   223,    96,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   107,    -1,
+     109,   110,   111,   112,    -1,    -1,    -1,    -1,    -1,    -1,
+     119,    -1,    -1,    -1,    -1,    -1,    -1,     5,     6,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   142,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   156,    -1,    37,
+      -1,    39,    -1,   162,   163,   164,    44,    45,    -1,   168,
+      -1,    49,   171,   172,    -1,    -1,   175,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   184,    -1,   186,    -1,    -1,
+      -1,    69,    -1,    -1,    -1,   194,   195,    75,    76,    -1,
+      -1,    -1,    -1,    81,    -1,    83,    -1,    -1,    86,    -1,
+      -1,    89,    -1,   212,    -1,    -1,    -1,    -1,    96,    -1,
+      -1,    -1,    -1,    -1,   223,    -1,    -1,    -1,    -1,   107,
+      -1,   109,   110,   111,   112,    -1,    -1,    -1,    -1,    -1,
+      -1,   119,    -1,    -1,    -1,    -1,    -1,    -1,     5,     6,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   200,    -1,   202,   203,   204,   205,   206,   207,
-     208,   209,   210,   211,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   219,   220,   221,   200,    -1,   202,   203,   204,   205,
-     206,   207,   208,   209,   210,   211,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   219,   220,   221,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   200,   201,
-     202,   203,   204,   205,   206,   207,   208,   209,   210,   211,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   219,   220,     5,
-       6,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    31,    -1,    -1,    -1,    -1,
-      -1,    37,    -1,    39,    -1,    -1,    -1,    -1,    -1,    45,
-      46,    -1,    -1,    49,    -1,    -1,   200,    -1,   202,   203,
-     204,   205,   206,   207,   208,   209,   210,   211,    -1,    -1,
-      66,    -1,    -1,    69,    -1,   219,   220,    -1,    -1,    75,
-      76,    -1,    -1,    79,    -1,    -1,    -1,    83,    -1,    -1,
-      86,    -1,    -1,    -1,    -1,    -1,    -1,    93,    -1,    -1,
-      -1,    -1,    -1,     5,     6,    -1,    -1,    -1,   104,    -1,
-     106,   107,   108,   109,   110,    -1,    -1,   113,    -1,    -1,
-     116,    -1,    -1,    -1,    -1,   121,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    37,    -1,    39,    -1,    -1,
-      -1,    -1,    -1,    45,    -1,    -1,    -1,    49,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   153,    -1,    -1,
-      -1,    -1,   158,   159,   160,   161,    -1,    69,    -1,   165,
-      -1,    -1,   168,    75,    76,    -1,   172,    79,    -1,    -1,
-      -1,    83,    -1,    -1,    86,   181,    -1,   183,    -1,    -1,
-      -1,    93,    -1,    -1,    -1,   191,   192,     5,     6,    -1,
-      -1,    -1,   104,    -1,   106,   107,   108,   109,    -1,    -1,
-      -1,    -1,    -1,    -1,   116,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    37,
-      -1,    39,    -1,    -1,    -1,    -1,    -1,    45,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   153,    -1,    -1,    -1,    -1,    -1,   159,   160,   161,
-      -1,    69,    -1,   165,    -1,    -1,   168,    75,    76,    -1,
-     172,    -1,    -1,    -1,    -1,    83,    -1,    -1,    86,   181,
-      -1,   183,    -1,    -1,    -1,    93,    -1,    -1,    -1,   191,
-     192,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   106,   107,
-     108,   109,    -1,    -1,    -1,    -1,    -1,    -1,   116,    -1,
+      -1,    -1,    -1,    -1,   142,    -1,    -1,    -1,    25,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   156,    -1,
+      37,    -1,    39,    -1,   162,   163,   164,    -1,    45,    -1,
+     168,    -1,    49,   171,   172,    -1,    -1,   175,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   184,    -1,   186,    -1,
+      -1,    -1,    69,    -1,    -1,    -1,   194,   195,    75,    76,
+      -1,    -1,    -1,    -1,    81,    -1,    -1,    -1,    -1,    86,
+      -1,    -1,    89,    -1,   212,    -1,    -1,    -1,    -1,    96,
+      -1,    -1,    -1,    -1,    -1,   223,    -1,    -1,    -1,    -1,
+     107,    -1,   109,   110,   111,   112,    -1,    -1,    -1,    -1,
+      -1,    -1,   119,    -1,    -1,    -1,    -1,    -1,    -1,     5,
+       6,    -1,    -1,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   156,
+      -1,    37,    -1,    39,    -1,   162,   163,   164,    -1,    45,
+      -1,   168,    -1,    49,   171,    -1,    -1,    -1,   175,    -1,
+      16,    17,    18,    19,    20,    21,    22,   184,    24,   186,
+      -1,    -1,    -1,    69,    -1,    -1,    -1,   194,   195,    75,
+      76,    -1,    -1,    -1,    -1,    81,    -1,    -1,    -1,    -1,
+      86,    -1,    -1,    89,    -1,    -1,    -1,    -1,    -1,    -1,
+      96,    -1,    -1,    -1,    -1,    -1,   223,    -1,    -1,    -1,
+      -1,   107,    -1,   109,   110,   111,   112,    -1,    -1,    -1,
+      -1,    -1,    -1,   119,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    -1,    -1,    -1,    -1,    -1,
+     156,    -1,    -1,    -1,    -1,    -1,   162,   163,   164,    -1,
+      -1,    -1,   168,    -1,    -1,   171,    -1,    -1,    -1,   175,
+      16,    17,    18,    19,    20,    21,    22,    -1,   184,    -1,
+     186,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   194,   195,
+     203,    -1,   205,   206,   207,   208,   209,   210,   211,   212,
+     213,   214,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   222,
+     223,   224,    -1,    -1,    -1,    -1,    -1,   223,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   205,
+     206,   207,   208,   209,   210,   211,   212,   213,   214,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   222,   223,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   159,   160,   161,    -1,    -1,    -1,   165,    -1,    -1,
-      -1,    -1,    -1,    -1,   172,    -1,    -1,    -1,    -1,    -1,
-      26,    -1,    -1,   181,    30,   183,    32,    33,    34,    35,
-      36,    -1,    38,   191,   192,    41,    -1,    43,    -1,    -1,
-      -1,    47,    48,    -1,    50,    51,    52,    53,    54,    55,
-      -1,    57,    58,    59,    60,    61,    62,    63,    64,    65,
-      -1,    67,    -1,    -1,    70,    71,    72,    73,    74,    -1,
-      -1,    77,    78,    -1,    -1,    -1,    82,    -1,    84,    85,
-      -1,    87,    88,    89,    90,    91,    92,    -1,    94,    95,
-      96,    97,    98,    99,    -1,    -1,   102,    -1,    -1,   105,
-      -1,    -1,    -1,    -1,    -1,   111,   112,    -1,   114,   115,
-      -1,   117,   118,   119,    -1,    -1,    -1,    -1,   124,   125,
-     126,    -1,   128,   129,   130,    -1,   132,   133,   134,   135,
-     136,   137,   138,    -1,   140,    -1,   142,    -1,   144,   145,
-     146,   147,   148,   149,   150,   151,   152,    -1,   154,   155,
-     156,   157,    -1,    -1,    -1,    -1,    -1,   163,    -1,    -1,
-     166,    -1,    -1,    -1,   170,   171,    -1,    -1,   174,   175,
-     176,   177,    -1,    -1,   180,    -1,   182,    -1,   184,   185,
-     186,   187,   188,   189,   190,    -1,    -1,   193
+      -1,   203,    -1,   205,   206,   207,   208,   209,   210,   211,
+     212,   213,   214,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     222,   223,   224,   203,   204,   205,   206,   207,   208,   209,
+     210,   211,   212,   213,   214,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   222,   223,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,     5,     6,    -1,   205,
+     206,   207,   208,   209,   210,   211,   212,   213,   214,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   222,   223,    -1,    -1,
+      -1,    -1,    31,    -1,    -1,    -1,    -1,    -1,    37,    -1,
+      39,    -1,    -1,    -1,    -1,    -1,    45,    46,    -1,    -1,
+      49,    -1,    -1,    -1,    -1,   203,    -1,   205,   206,   207,
+     208,   209,   210,   211,   212,   213,   214,    66,    -1,    -1,
+      69,    -1,    -1,    -1,   222,   223,    75,    76,    -1,    -1,
+      -1,    -1,    81,    -1,    -1,    -1,    -1,    86,    -1,    -1,
+      89,    -1,    -1,    -1,    -1,    -1,    -1,    96,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   107,    -1,
+     109,   110,   111,   112,   113,    -1,    -1,   116,    -1,    -1,
+     119,    -1,    -1,    -1,    -1,   124,    -1,     5,     6,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   156,    -1,    37,
+      -1,    39,   161,   162,   163,   164,    -1,    45,    -1,   168,
+      -1,    49,   171,    -1,    -1,    -1,   175,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   184,    -1,   186,    -1,    -1,
+      -1,    69,    -1,    -1,    -1,   194,   195,    75,    76,    -1,
+      -1,    -1,    -1,    81,    -1,    -1,    -1,    -1,    86,    -1,
+      -1,    89,    -1,    -1,    -1,    -1,    -1,    -1,    96,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   107,
+      -1,   109,   110,   111,   112,    -1,    -1,    -1,    -1,     5,
+       6,   119,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    37,    -1,    39,    -1,    -1,    -1,    -1,   156,    45,
+      -1,    -1,    -1,    -1,   162,   163,   164,    -1,    -1,    -1,
+     168,    -1,    -1,   171,    -1,    -1,    -1,   175,    -1,    -1,
+      -1,    -1,    -1,    69,    -1,    -1,   184,    -1,   186,    75,
+      76,    -1,    -1,    -1,    -1,    -1,   194,   195,    -1,    -1,
+      86,    -1,    -1,    89,    -1,    -1,    -1,    -1,    -1,    -1,
+      96,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   109,   110,   111,   112,    -1,    -1,    -1,
+      -1,    -1,    -1,   119,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   162,   163,   164,    -1,
+      -1,    -1,   168,    -1,    -1,    -1,    -1,    -1,    -1,   175,
+      -1,    -1,    -1,    -1,    -1,    26,    -1,    -1,   184,    30,
+     186,    32,    33,    34,    35,    36,    -1,    38,   194,   195,
+      41,    -1,    43,    -1,    -1,    -1,    47,    48,    -1,    50,
+      51,    52,    53,    54,    55,    -1,    57,    58,    59,    60,
+      61,    62,    63,    64,    65,    -1,    67,    -1,    -1,    70,
+      71,    72,    73,    74,    -1,    -1,    77,    78,    79,    80,
+      -1,    -1,    -1,    84,    85,    -1,    87,    88,    -1,    90,
+      91,    92,    93,    94,    95,    -1,    97,    98,    99,   100,
+     101,   102,    -1,    -1,   105,    -1,    -1,   108,    -1,    -1,
+      -1,    -1,    -1,   114,   115,    -1,   117,   118,    -1,   120,
+     121,   122,    -1,    -1,    -1,    -1,   127,   128,   129,    -1,
+     131,   132,   133,    -1,   135,   136,   137,   138,   139,   140,
+     141,    -1,   143,    -1,   145,    -1,   147,   148,   149,   150,
+     151,   152,   153,   154,   155,    -1,   157,   158,   159,   160,
+      -1,    -1,    -1,    -1,    -1,   166,    -1,    -1,   169,    -1,
+      -1,    -1,   173,   174,    -1,    -1,   177,   178,   179,   180,
+      -1,    -1,   183,    -1,   185,    -1,   187,   188,   189,   190,
+     191,   192,   193,    -1,    -1,   196
 };
 
   /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
      symbol of state STATE-NUM.  */
 static const yytype_int16 yystos[] =
 {
-       0,   229,   231,     0,     4,     5,     6,    15,    37,    39,
-      45,    46,    49,    56,    66,    69,    75,    76,    79,    83,
-      86,    93,   100,   104,   106,   107,   108,   109,   110,   116,
-     123,   141,   153,   158,   159,   160,   161,   165,   168,   172,
-     181,   183,   191,   192,   220,   230,   237,   238,   240,   241,
-     242,   243,   246,   247,   253,   254,   269,   283,   287,   289,
-     292,   294,   295,   296,   297,   298,   299,   300,   301,   304,
-     305,   308,   310,   311,   312,   313,   315,   316,   317,   318,
-     319,   321,   323,   341,   342,   343,   344,   219,   220,   346,
-     349,   350,     3,     5,   225,     3,     5,     3,     5,   285,
-     106,   288,    10,     3,     5,   288,     3,     6,   225,     3,
-       5,   225,   288,   289,     3,   285,     3,   285,   289,    26,
-      30,    32,    33,    34,    35,    36,    38,    41,    43,    47,
-      48,    50,    51,    52,    53,    54,    55,    57,    58,    59,
-      60,    61,    62,    63,    64,    65,    67,    70,    71,    72,
-      73,    74,    77,    78,    82,    84,    85,    87,    88,    89,
-      90,    91,    92,    94,    95,    96,    97,    98,    99,   102,
-     105,   111,   112,   114,   115,   117,   118,   119,   124,   125,
-     126,   128,   129,   130,   132,   133,   134,   135,   136,   137,
-     138,   140,   142,   144,   145,   146,   147,   148,   149,   150,
-     151,   152,   154,   155,   156,   157,   163,   166,   170,   171,
-     174,   175,   176,   177,   180,   182,   184,   185,   186,   187,
-     188,   189,   190,   193,   255,   260,   340,   224,   233,   233,
-     179,    31,    75,   113,   121,   172,   181,   245,   269,   294,
-     297,   304,   310,   314,   321,   341,   344,   224,   224,   222,
-     224,   222,   224,   222,   224,   222,   224,   236,   224,   201,
-     309,   222,   322,   323,   322,   322,     3,     5,    44,    81,
-     139,   169,   209,   225,   262,   286,   324,   325,   338,   269,
-     341,   342,   344,   322,   224,   293,    29,    58,    72,    78,
-     351,   352,   346,   110,    10,   222,   224,     3,   342,   222,
-     173,   222,   225,   225,   225,   225,   225,   225,   225,   225,
-     225,   225,   225,   225,   225,   225,   225,   225,   225,   225,
-     225,   225,   225,   225,   225,   225,   225,   225,   225,   225,
-     225,   225,   225,   225,   225,   225,   225,   225,   225,   225,
-     199,   221,    14,   101,   237,   244,   247,   294,   296,   297,
-     299,   300,   301,   312,   313,   316,   223,   253,   254,     3,
-       3,     3,     5,     3,     5,     3,     3,   222,   338,   302,
-     302,   232,   143,   306,   310,     3,   292,   222,   235,   320,
-     324,   324,   227,   220,   225,   252,   322,     3,     5,   290,
-     225,   199,   221,     5,   226,   253,   265,   266,   267,   268,
-     201,   226,   276,   225,   279,    10,    10,    13,   261,   286,
-       3,     7,     8,     9,    10,    11,    12,    80,   131,   164,
-     178,   204,   207,   208,   209,   212,   213,   225,   272,   273,
-     274,   259,   321,     7,   258,   261,   272,   275,    10,    10,
-     256,   275,   321,   274,    10,    10,   274,    10,   274,   272,
-     251,   254,   321,   274,   270,   271,   272,    27,   127,   167,
-     257,    10,   340,    10,   274,   342,   270,   272,   342,   122,
-     194,   195,   196,   197,   198,   339,   342,   342,   261,     7,
-       8,   345,    10,   342,   260,   220,   225,   224,   224,   224,
-     222,   236,   321,   222,   223,   253,   303,   223,   231,   201,
-     120,   253,   281,   307,   224,   222,   235,   223,   237,   254,
-     319,   324,   226,   275,   209,   221,   272,   248,   249,   250,
-     251,   219,    28,    68,   162,   197,   353,   354,   352,   222,
-     286,   223,   199,   227,     7,   239,   223,   253,   277,   281,
-     223,   254,   278,   281,   226,   226,   226,   225,   272,   272,
-     272,   272,   272,   272,   272,   321,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,   200,   202,   203,   204,   205,
-     206,   207,   208,   209,   210,   211,   219,   220,   199,   226,
-     226,   199,   219,   226,   199,   226,   226,   199,   226,   226,
-     226,   226,   226,   226,   226,   226,   226,   226,   226,   321,
-     209,   225,   252,   262,   286,   330,   332,   333,   226,   199,
-     226,   226,   226,   226,   226,   199,   226,   226,   226,   226,
-     226,   226,   226,   226,   219,   226,   226,   226,   260,    10,
-     234,   324,   334,   223,   236,   313,   236,   223,   201,   321,
-     341,   224,   223,   254,   282,   283,   223,   243,   223,   236,
-     221,   221,   226,   199,   291,   199,   226,   179,   347,   348,
-     268,   274,     7,   226,   321,   344,   226,   224,   224,   321,
-     226,   209,   225,   252,   262,   326,   328,   329,   272,   272,
-       3,   272,   272,   272,   272,   272,   272,   272,   272,   272,
-     272,   272,   272,   272,   272,   272,   272,   272,     3,   272,
-     274,   258,     7,   275,    10,   332,   320,   209,   248,   262,
-     331,   332,   225,   252,   271,   274,     7,   226,   233,   199,
-     324,   224,   235,   236,    25,   251,   290,   354,   350,   223,
-     347,   330,   336,   337,   224,   284,   286,   328,   320,   209,
-     248,   262,   327,   328,   226,   225,   252,   201,   221,   226,
-     332,   320,   226,   332,   226,   248,   226,   236,   223,   324,
-     223,     5,   201,   335,   199,   224,   222,   226,   328,   320,
-     226,   332,   226,   272,   248,   272,   332,   226,   236,   224,
-     275,   336,   263,   332,   226,    43,    59,   223,   264,   274,
-     201,   201,   224,   280,   281,   280,   224
+       0,   232,   234,     0,     4,     5,     6,    15,    31,    37,
+      39,    45,    46,    49,    56,    66,    69,    75,    76,    81,
+      86,    89,    96,   103,   107,   109,   110,   111,   112,   113,
+     119,   126,   144,   156,   161,   162,   163,   164,   168,   171,
+     175,   184,   186,   194,   195,   223,   233,   240,   241,   243,
+     244,   245,   246,   249,   250,   256,   257,   272,   286,   291,
+     293,   296,   298,   299,   300,   301,   302,   303,   304,   307,
+     308,   311,   313,   314,   317,   318,   319,   320,   322,   324,
+     342,   343,   344,   345,   222,   223,   347,   350,   351,     3,
+       5,   289,   289,   228,   289,     3,   288,   289,   109,   292,
+      10,   289,   292,     3,     6,   228,   289,   228,   292,   293,
+       3,   288,     3,   288,   293,    26,    30,    32,    33,    34,
+      35,    36,    38,    41,    43,    47,    48,    50,    51,    52,
+      53,    54,    55,    57,    58,    59,    60,    61,    62,    63,
+      64,    65,    67,    70,    71,    72,    73,    74,    77,    78,
+      79,    80,    84,    85,    87,    88,    90,    91,    92,    93,
+      94,    95,    97,    98,    99,   100,   101,   102,   105,   108,
+     114,   115,   117,   118,   120,   121,   122,   127,   128,   129,
+     131,   132,   133,   135,   136,   137,   138,   139,   140,   141,
+     143,   145,   147,   148,   149,   150,   151,   152,   153,   154,
+     155,   157,   158,   159,   160,   166,   169,   173,   174,   177,
+     178,   179,   180,   183,   185,   187,   188,   189,   190,   191,
+     192,   193,   196,   258,   263,   341,   227,   236,   236,   182,
+      75,   116,   124,   175,   184,   248,   272,   298,   300,   302,
+     313,   316,   322,   342,   345,   227,   227,   227,   227,   225,
+     227,   307,   227,   239,   227,   323,   324,   323,   323,    44,
+      83,   142,   172,   212,   228,   265,   289,   290,   325,   326,
+     339,   272,   342,   343,   345,   323,   227,   297,    29,    58,
+      72,    80,   352,   353,   347,   113,    10,   225,   227,     3,
+     343,   225,   176,   225,   228,   228,   228,   228,   228,   228,
+     228,   228,   228,   228,   228,   228,   228,   228,   228,   228,
+     228,   228,   228,   228,   228,   228,   228,   228,   228,   228,
+     228,   228,   228,   228,   228,   228,   228,   228,   228,   228,
+     228,   228,   202,   224,    14,   104,   240,   247,   250,   298,
+     299,   300,   301,   302,   303,   304,   307,   313,   314,   317,
+     226,   256,   257,     3,   289,   289,     3,     3,   225,   225,
+     225,   225,   204,   312,   225,   339,   235,   225,   321,   325,
+     325,   230,   223,   228,   255,   323,     3,     5,   294,   228,
+     202,   224,     5,   229,   256,   268,   269,   270,   271,   204,
+     229,   279,   228,   282,    10,    10,    13,   264,   290,     3,
+       7,     8,     9,    10,    11,    12,    82,   134,   167,   181,
+     207,   210,   211,   212,   215,   216,   228,   275,   276,   277,
+     262,   322,     7,   261,   264,   275,   278,    10,    10,   259,
+     278,   322,   277,    10,    10,   277,    10,   277,   275,   254,
+     257,   322,   277,   273,   274,   275,    27,   130,   170,   260,
+      10,   341,    10,   277,   343,   273,   275,   343,   125,   197,
+     198,   199,   200,   201,   340,   343,   343,   264,     7,     8,
+     346,    10,   343,   263,   223,   228,   227,   227,   227,   225,
+     227,   227,   239,   322,   305,   305,   226,     3,   296,   225,
+     238,   234,   146,   309,   313,   320,   325,   229,   278,   212,
+     224,   275,   251,   252,   253,   254,   222,    28,    68,   165,
+     200,   354,   355,   353,   225,   290,   226,   202,   230,     7,
+     242,   226,   256,   280,   256,   284,   226,   257,   281,   284,
+     229,   229,   229,   228,   275,   275,   275,   275,   275,   275,
+     275,   322,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,   203,   205,   206,   207,   208,   209,   210,   211,   212,
+     213,   214,   222,   223,   202,   229,   229,   202,   222,   229,
+     202,   229,   229,   202,   229,   229,   229,   229,   229,   229,
+     229,   229,   229,   229,   229,   322,   212,   228,   255,   265,
+     290,   331,   333,   334,   229,   202,   229,   229,   229,   229,
+     229,   202,   229,   229,   229,   229,   229,   229,   229,   229,
+     222,   229,   229,   229,   263,    10,   237,   325,   335,   226,
+     256,   306,   226,   239,   225,   238,   226,   240,   257,   226,
+     204,   123,   284,   310,   227,   224,   224,   229,   202,   295,
+     202,   229,   182,   348,   349,   271,   277,     7,   229,   322,
+     345,   322,   342,   229,   227,   227,   322,   229,   212,   228,
+     255,   265,   327,   329,   330,   275,   275,     3,   275,   275,
+     275,   275,   275,   275,   275,   275,   275,   275,   275,   275,
+     275,   275,   275,   275,   275,     3,   275,   277,   261,     7,
+     278,    10,   333,   321,   212,   251,   265,   332,   333,   228,
+     255,   274,   277,     7,   229,   236,   202,   239,    66,   113,
+     315,   239,   246,   226,   239,   204,   227,   226,   257,   285,
+     286,   226,    25,   254,   294,   355,   351,   226,   348,   331,
+     337,   338,   227,   325,   287,   290,   329,   321,   212,   251,
+     265,   328,   329,   229,   228,   255,   204,   224,   229,   333,
+     321,   229,   333,   229,   251,   229,   239,   226,   325,   289,
+     289,   227,   238,   239,   227,     5,   204,   336,   202,   227,
+     225,   229,   329,   321,   229,   333,   229,   275,   251,   275,
+     333,   229,   226,   227,   278,   337,   266,   333,   229,   239,
+      43,    59,   226,   267,   277,   204,   204,   227,   283,   284,
+     283,   227
 };
 
   /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const yytype_int16 yyr1[] =
 {
-       0,   228,   229,   230,   230,   231,   232,   231,   231,   231,
-     231,   231,   231,   231,   231,   231,   231,   231,   233,   233,
-     234,   233,   233,   233,   233,   233,   233,   233,   233,   233,
-     233,   233,   235,   235,   236,   236,   237,   237,   237,   237,
-     237,   237,   237,   238,   239,   239,   240,   240,   240,   240,
-     240,   240,   240,   240,   240,   241,   242,   243,   244,   245,
-     245,   246,   247,   248,   248,   249,   249,   250,   250,   251,
-     251,   252,   252,   252,   253,   253,   254,   255,   255,   255,
-     256,   256,   257,   257,   257,   258,   258,   259,   260,   260,
-     260,   260,   260,   260,   260,   260,   260,   260,   260,   260,
-     260,   260,   260,   260,   260,   260,   260,   260,   260,   260,
-     260,   260,   260,   260,   260,   260,   260,   260,   260,   260,
-     260,   260,   260,   260,   260,   260,   260,   260,   260,   260,
-     260,   260,   260,   260,   260,   260,   260,   260,   260,   260,
-     260,   260,   260,   260,   260,   260,   260,   260,   260,   260,
-     260,   260,   260,   260,   260,   260,   260,   260,   260,   260,
-     260,   260,   260,   260,   260,   260,   260,   260,   260,   260,
-     260,   260,   260,   260,   260,   260,   260,   260,   260,   260,
-     260,   260,   260,   260,   260,   260,   260,   260,   260,   260,
-     260,   260,   260,   261,   261,   262,   262,   262,   262,   263,
-     263,   264,   264,   265,   265,   265,   266,   266,   267,   268,
-     268,   269,   270,   270,   271,   271,   272,   272,   272,   272,
-     272,   272,   272,   272,   272,   272,   272,   272,   272,   272,
-     272,   272,   272,   272,   272,   272,   272,   272,   272,   272,
-     272,   272,   272,   272,   272,   272,   272,   272,   272,   272,
-     272,   272,   272,   272,   272,   272,   272,   273,   273,   274,
-     275,   276,   276,   277,   277,   278,   278,   279,   279,   280,
-     280,   281,   281,   282,   283,   283,   284,   284,   285,   285,
-     285,   286,   286,   287,   287,   287,   287,   287,   287,   287,
-     287,   287,   287,   287,   288,   288,   289,   289,   289,   289,
-     289,   289,   289,   289,   289,   290,   291,   290,   292,   293,
-     292,   294,   294,   295,   296,   297,   297,   298,   299,   300,
-     301,   301,   302,   302,   303,   304,   304,   305,   306,   306,
-     307,   307,   308,   308,   309,   309,   310,   310,   311,   312,
-     312,   312,   313,   313,   314,   314,   315,   316,   317,   317,
-     317,   318,   319,   320,   320,   321,   321,   322,   322,   323,
-     323,   323,   324,   324,   324,   325,   325,   325,   325,   326,
-     326,   326,   327,   327,   328,   328,   329,   329,   329,   329,
-     329,   330,   330,   330,   331,   331,   332,   332,   333,   333,
-     333,   333,   333,   333,   334,   334,   335,   335,   336,   337,
-     337,   338,   338,   339,   339,   339,   339,   339,   339,   340,
-     340,   340,   341,   342,   342,   342,   342,   342,   342,   342,
-     342,   342,   342,   343,   344,   344,   345,   345,   345,   346,
-     346,   347,   347,   348,   349,   350,   350,   351,   351,   352,
-     352,   352,   352,   353,   353,   354,   354,   354,   354
+       0,   231,   232,   233,   233,   234,   235,   234,   234,   234,
+     234,   234,   234,   234,   234,   234,   234,   234,   234,   234,
+     236,   236,   236,   237,   236,   236,   236,   236,   236,   236,
+     236,   236,   236,   236,   236,   236,   238,   238,   239,   239,
+     240,   240,   240,   240,   240,   240,   240,   241,   242,   242,
+     243,   243,   243,   243,   243,   243,   243,   243,   243,   244,
+     245,   246,   247,   248,   249,   250,   251,   251,   252,   252,
+     253,   253,   254,   254,   255,   255,   255,   256,   256,   257,
+     258,   258,   258,   259,   259,   260,   260,   260,   261,   261,
+     262,   263,   263,   263,   263,   263,   263,   263,   263,   263,
+     263,   263,   263,   263,   263,   263,   263,   263,   263,   263,
+     263,   263,   263,   263,   263,   263,   263,   263,   263,   263,
+     263,   263,   263,   263,   263,   263,   263,   263,   263,   263,
+     263,   263,   263,   263,   263,   263,   263,   263,   263,   263,
+     263,   263,   263,   263,   263,   263,   263,   263,   263,   263,
+     263,   263,   263,   263,   263,   263,   263,   263,   263,   263,
+     263,   263,   263,   263,   263,   263,   263,   263,   263,   263,
+     263,   263,   263,   263,   263,   263,   263,   263,   263,   263,
+     263,   263,   263,   263,   263,   263,   263,   263,   263,   263,
+     263,   263,   263,   263,   263,   263,   263,   263,   263,   264,
+     264,   265,   265,   265,   265,   266,   266,   267,   267,   268,
+     268,   268,   269,   269,   270,   271,   271,   272,   273,   273,
+     274,   274,   275,   275,   275,   275,   275,   275,   275,   275,
+     275,   275,   275,   275,   275,   275,   275,   275,   275,   275,
+     275,   275,   275,   275,   275,   275,   275,   275,   275,   275,
+     275,   275,   275,   275,   275,   275,   275,   275,   275,   275,
+     275,   275,   275,   276,   276,   277,   278,   279,   279,   280,
+     280,   281,   281,   282,   282,   283,   283,   284,   284,   285,
+     286,   286,   287,   287,   288,   288,   289,   289,   290,   291,
+     291,   291,   291,   291,   291,   291,   291,   291,   291,   291,
+     292,   292,   293,   293,   293,   293,   293,   293,   293,   293,
+     293,   294,   295,   294,   296,   297,   296,   298,   299,   300,
+     301,   302,   303,   304,   304,   305,   305,   306,   307,   308,
+     309,   309,   310,   310,   311,   311,   312,   312,   313,   314,
+     314,   314,   315,   315,   316,   317,   318,   318,   318,   319,
+     320,   321,   321,   322,   322,   323,   323,   324,   324,   324,
+     325,   325,   325,   326,   326,   326,   326,   327,   327,   327,
+     328,   328,   329,   329,   330,   330,   330,   330,   330,   331,
+     331,   331,   332,   332,   333,   333,   334,   334,   334,   334,
+     334,   334,   335,   335,   336,   336,   337,   338,   338,   339,
+     339,   340,   340,   340,   340,   340,   340,   341,   341,   341,
+     342,   343,   343,   343,   343,   343,   343,   343,   343,   343,
+     343,   344,   345,   345,   346,   346,   346,   347,   347,   348,
+     348,   349,   350,   351,   351,   352,   352,   353,   353,   353,
+     353,   354,   354,   355,   355,   355,   355
 };
 
   /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
 static const yytype_int8 yyr2[] =
 {
-       0,     2,     2,     0,     2,     0,     0,     6,     2,     2,
-       3,     2,     3,     3,     2,     2,     2,     2,     0,     2,
-       0,     6,     2,     3,     2,     3,     3,     2,     2,     2,
-       2,     2,     0,     2,     0,     1,     1,     2,     2,     1,
-       2,     1,     1,     6,     1,     2,     1,     2,     1,     2,
-       1,     2,     2,     2,     2,     4,     3,     3,     5,     2,
-       2,     3,     4,     0,     1,     1,     3,     1,     3,     3,
-       2,     3,     3,     2,     0,     1,     3,     1,     3,     4,
-       1,     3,     1,     1,     1,     1,     3,     3,     0,     1,
-       4,     1,     1,     1,     1,     1,     4,     4,     1,     1,
-       1,     1,     1,     4,     4,     1,     6,     1,     1,     1,
-       1,     4,     1,     1,     1,     4,     1,     1,     1,     4,
-       4,     4,     1,     1,     1,     1,     4,     4,     4,     4,
-       4,     1,     4,     1,     1,     4,     1,     4,     1,     1,
-       4,     4,     1,     1,     1,     4,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     1,     1,     4,     1,     1,
-       1,     4,     4,     1,     1,     1,     1,     1,     6,     1,
-       4,     1,     1,     1,     4,     1,     1,     1,     4,     4,
-       4,     4,     1,     1,     4,     4,     4,     1,     1,     4,
-       4,     4,     1,     1,     1,     1,     1,     1,     1,     0,
-       2,     4,     3,     0,     2,     1,     1,     3,     2,     3,
-       1,     5,     1,     3,     0,     1,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     1,     5,     3,     3,     3,
+       0,     2,     2,     0,     2,     0,     0,     6,     3,     3,
+       2,     3,     2,     3,     2,     3,     2,     2,     2,     2,
+       0,     3,     3,     0,     6,     2,     3,     2,     3,     2,
+       3,     2,     2,     2,     2,     2,     0,     2,     0,     1,
+       1,     2,     2,     1,     2,     1,     1,     6,     1,     2,
+       1,     2,     1,     2,     1,     2,     2,     2,     2,     4,
+       3,     3,     5,     2,     3,     4,     0,     1,     1,     3,
+       1,     3,     3,     2,     3,     3,     2,     0,     1,     3,
+       1,     3,     4,     1,     3,     1,     1,     1,     1,     3,
+       3,     0,     1,     4,     1,     1,     1,     1,     1,     4,
+       4,     1,     1,     1,     1,     1,     4,     4,     1,     6,
+       1,     1,     1,     1,     4,     1,     1,     1,     4,     1,
+       1,     1,     4,     4,     1,     1,     4,     1,     1,     1,
+       1,     1,     4,     4,     4,     4,     4,     1,     4,     1,
+       1,     4,     1,     4,     1,     1,     4,     4,     1,     1,
+       1,     4,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     4,     1,     1,     1,     4,     4,     1,
+       1,     1,     1,     1,     6,     1,     4,     1,     1,     1,
+       4,     1,     1,     1,     4,     4,     4,     4,     1,     1,
+       4,     4,     4,     1,     1,     4,     4,     4,     1,     1,
+       1,     1,     1,     1,     1,     0,     2,     4,     3,     0,
+       2,     1,     1,     3,     2,     3,     1,     5,     1,     3,
+       0,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     5,     3,     3,     3,     3,     3,     3,     3,
        3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
-       3,     3,     3,     3,     3,     2,     2,     2,     2,     2,
-       2,     3,     3,     5,     5,     4,     3,     1,     3,     1,
-       1,     0,     2,     4,     3,     2,     2,     0,     2,     2,
-       1,     3,     2,     1,     3,     2,     0,     1,     0,     1,
-       1,     1,     1,     1,     1,     1,     2,     2,     1,     1,
-       1,     1,     1,     1,     0,     1,     1,     2,     1,     2,
-       2,     1,     1,     1,     1,     1,     0,     4,     1,     0,
-       4,     2,     2,     2,     5,     2,     2,     2,     5,     5,
-       2,     2,     0,     2,     2,     2,     2,     2,     2,     3,
-       2,     3,     5,     5,     0,     2,     2,     2,     2,     6,
-       8,     2,     2,     2,     2,     2,     2,     5,     1,     1,
-       1,     1,     1,     0,     2,     2,     3,     0,     1,     2,
-       2,     2,     3,     2,     1,     1,     3,     2,     4,     3,
-       2,     1,     3,     2,     0,     1,     3,     2,     1,     3,
-       4,     3,     2,     1,     3,     2,     0,     1,     1,     3,
-       2,     1,     3,     4,     1,     3,     0,     2,     2,     1,
-       3,     1,     3,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     5,     1,     1,     1,     1,     2,     1,     2,
-       1,     2,     4,     5,     5,    10,     1,     3,     1,     0,
-       2,     0,     2,     4,     6,     0,     3,     1,     3,     4,
-       1,     1,     1,     1,     3,     1,     1,     1,     1
+       3,     2,     2,     2,     2,     2,     2,     3,     3,     5,
+       5,     4,     3,     1,     3,     1,     1,     0,     2,     4,
+       3,     2,     2,     0,     2,     2,     1,     3,     2,     1,
+       3,     2,     0,     1,     0,     1,     1,     1,     1,     1,
+       1,     1,     2,     2,     1,     1,     1,     1,     1,     1,
+       0,     1,     1,     2,     1,     2,     2,     1,     1,     1,
+       1,     1,     0,     4,     1,     0,     4,     2,     6,     2,
+       6,     2,     5,     2,     2,     0,     2,     3,     2,     1,
+       2,     3,     2,     3,     6,     6,     0,     2,     2,     7,
+       9,     2,     2,     2,     2,     6,     1,     1,     1,     1,
+       1,     0,     2,     2,     3,     0,     1,     2,     2,     2,
+       3,     2,     1,     1,     3,     2,     4,     3,     2,     1,
+       3,     2,     0,     1,     3,     2,     1,     3,     4,     3,
+       2,     1,     3,     2,     0,     1,     1,     3,     2,     1,
+       3,     4,     1,     3,     0,     2,     2,     1,     3,     1,
+       3,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       5,     1,     1,     1,     1,     2,     1,     2,     1,     2,
+       4,     5,     5,    10,     1,     3,     1,     0,     2,     0,
+       2,     4,     6,     0,     3,     1,     3,     4,     1,     1,
+       1,     1,     3,     1,     1,     1,     1
 };
 
 
@@ -3233,7 +3290,7 @@
   switch (yyn)
     {
   case 2: /* input: gbl_statements m_acf  */
-#line 341 "tools/widl/parser.y"
+#line 337 "tools/widl/parser.y"
                                                 { check_statements((yyvsp[-1].stmt_list), FALSE);
 						  check_all_user_types((yyvsp[-1].stmt_list));
 						  write_header((yyvsp[-1].stmt_list));
@@ -3246,236 +3303,260 @@
 						  write_dlldata((yyvsp[-1].stmt_list));
 						  write_local_stubs((yyvsp[-1].stmt_list));
 						}
-#line 3250 "tools/widl/parser.tab.c"
+#line 3307 "tools/widl/parser.tab.c"
     break;
 
   case 5: /* gbl_statements: %empty  */
-#line 357 "tools/widl/parser.y"
+#line 353 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = NULL; }
-#line 3256 "tools/widl/parser.tab.c"
+#line 3313 "tools/widl/parser.tab.c"
     break;
 
   case 6: /* $@1: %empty  */
-#line 358 "tools/widl/parser.y"
+#line 354 "tools/widl/parser.y"
                                           { push_namespace((yyvsp[-1].str)); }
-#line 3262 "tools/widl/parser.tab.c"
+#line 3319 "tools/widl/parser.tab.c"
     break;
 
   case 7: /* gbl_statements: gbl_statements namespacedef '{' $@1 gbl_statements '}'  */
-#line 359 "tools/widl/parser.y"
+#line 355 "tools/widl/parser.y"
                                                 { pop_namespace((yyvsp[-4].str)); (yyval.stmt_list) = append_statements((yyvsp[-5].stmt_list), (yyvsp[-1].stmt_list)); }
-#line 3268 "tools/widl/parser.tab.c"
+#line 3325 "tools/widl/parser.tab.c"
     break;
 
-  case 8: /* gbl_statements: gbl_statements interfacedec  */
-#line 360 "tools/widl/parser.y"
-                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_reference((yyvsp[0].type))); }
-#line 3274 "tools/widl/parser.tab.c"
+  case 8: /* gbl_statements: gbl_statements interface ';'  */
+#line 356 "tools/widl/parser.y"
+                                                { (yyval.stmt_list) = append_statement((yyvsp[-2].stmt_list), make_statement_reference((yyvsp[-1].type))); }
+#line 3331 "tools/widl/parser.tab.c"
     break;
 
-  case 9: /* gbl_statements: gbl_statements interfacedef  */
-#line 361 "tools/widl/parser.y"
+  case 9: /* gbl_statements: gbl_statements dispinterface ';'  */
+#line 357 "tools/widl/parser.y"
+                                                { (yyval.stmt_list) = append_statement((yyvsp[-2].stmt_list), make_statement_reference((yyvsp[-1].type))); }
+#line 3337 "tools/widl/parser.tab.c"
+    break;
+
+  case 10: /* gbl_statements: gbl_statements interfacedef  */
+#line 358 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type))); }
-#line 3280 "tools/widl/parser.tab.c"
+#line 3343 "tools/widl/parser.tab.c"
     break;
 
-  case 10: /* gbl_statements: gbl_statements coclass ';'  */
-#line 362 "tools/widl/parser.y"
+  case 11: /* gbl_statements: gbl_statements coclass ';'  */
+#line 359 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = (yyvsp[-2].stmt_list);
 						  reg_type((yyvsp[-1].type), (yyvsp[-1].type)->name, current_namespace, 0);
 						}
-#line 3288 "tools/widl/parser.tab.c"
+#line 3351 "tools/widl/parser.tab.c"
     break;
 
-  case 11: /* gbl_statements: gbl_statements coclassdef  */
+  case 12: /* gbl_statements: gbl_statements coclassdef  */
+#line 362 "tools/widl/parser.y"
+                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type)));
+						  reg_type((yyvsp[0].type), (yyvsp[0].type)->name, current_namespace, 0);
+						}
+#line 3359 "tools/widl/parser.tab.c"
+    break;
+
+  case 13: /* gbl_statements: gbl_statements apicontract ';'  */
 #line 365 "tools/widl/parser.y"
-                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type)));
-						  reg_type((yyvsp[0].type), (yyvsp[0].type)->name, current_namespace, 0);
-						}
-#line 3296 "tools/widl/parser.tab.c"
+                                                { (yyval.stmt_list) = (yyvsp[-2].stmt_list); reg_type((yyvsp[-1].type), (yyvsp[-1].type)->name, current_namespace, 0); }
+#line 3365 "tools/widl/parser.tab.c"
     break;
 
-  case 12: /* gbl_statements: gbl_statements apicontract ';'  */
+  case 14: /* gbl_statements: gbl_statements apicontract_def  */
+#line 366 "tools/widl/parser.y"
+                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type)));
+						  reg_type((yyvsp[0].type), (yyvsp[0].type)->name, current_namespace, 0); }
+#line 3372 "tools/widl/parser.tab.c"
+    break;
+
+  case 15: /* gbl_statements: gbl_statements runtimeclass ';'  */
 #line 368 "tools/widl/parser.y"
-                                                { (yyval.stmt_list) = append_statement((yyvsp[-2].stmt_list), make_statement_type_decl((yyvsp[-1].type)));
-	                                          reg_type((yyvsp[-1].type), (yyvsp[-1].type)->name, current_namespace, 0); }
-#line 3303 "tools/widl/parser.tab.c"
-    break;
-
-  case 13: /* gbl_statements: gbl_statements runtimeclass ';'  */
-#line 370 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = (yyvsp[-2].stmt_list); reg_type((yyvsp[-1].type), (yyvsp[-1].type)->name, current_namespace, 0); }
-#line 3309 "tools/widl/parser.tab.c"
-    break;
-
-  case 14: /* gbl_statements: gbl_statements runtimeclass_def  */
-#line 371 "tools/widl/parser.y"
-                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type)));
-	                                          reg_type((yyvsp[0].type), (yyvsp[0].type)->name, current_namespace, 0); }
-#line 3316 "tools/widl/parser.tab.c"
-    break;
-
-  case 15: /* gbl_statements: gbl_statements moduledef  */
-#line 373 "tools/widl/parser.y"
-                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_module((yyvsp[0].type))); }
-#line 3322 "tools/widl/parser.tab.c"
-    break;
-
-  case 16: /* gbl_statements: gbl_statements librarydef  */
-#line 374 "tools/widl/parser.y"
-                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_library((yyvsp[0].typelib))); }
-#line 3328 "tools/widl/parser.tab.c"
-    break;
-
-  case 17: /* gbl_statements: gbl_statements statement  */
-#line 375 "tools/widl/parser.y"
-                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), (yyvsp[0].statement)); }
-#line 3334 "tools/widl/parser.tab.c"
-    break;
-
-  case 18: /* imp_statements: %empty  */
-#line 378 "tools/widl/parser.y"
-                                                { (yyval.stmt_list) = NULL; }
-#line 3340 "tools/widl/parser.tab.c"
-    break;
-
-  case 19: /* imp_statements: imp_statements interfacedec  */
-#line 379 "tools/widl/parser.y"
-                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_reference((yyvsp[0].type))); }
-#line 3346 "tools/widl/parser.tab.c"
-    break;
-
-  case 20: /* $@2: %empty  */
-#line 380 "tools/widl/parser.y"
-                                          { push_namespace((yyvsp[-1].str)); }
-#line 3352 "tools/widl/parser.tab.c"
-    break;
-
-  case 21: /* imp_statements: imp_statements namespacedef '{' $@2 imp_statements '}'  */
-#line 381 "tools/widl/parser.y"
-                                                { pop_namespace((yyvsp[-4].str)); (yyval.stmt_list) = append_statements((yyvsp[-5].stmt_list), (yyvsp[-1].stmt_list)); }
-#line 3358 "tools/widl/parser.tab.c"
-    break;
-
-  case 22: /* imp_statements: imp_statements interfacedef  */
-#line 382 "tools/widl/parser.y"
-                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type))); }
-#line 3364 "tools/widl/parser.tab.c"
-    break;
-
-  case 23: /* imp_statements: imp_statements coclass ';'  */
-#line 383 "tools/widl/parser.y"
-                                                { (yyval.stmt_list) = (yyvsp[-2].stmt_list); reg_type((yyvsp[-1].type), (yyvsp[-1].type)->name, current_namespace, 0); }
-#line 3370 "tools/widl/parser.tab.c"
-    break;
-
-  case 24: /* imp_statements: imp_statements coclassdef  */
-#line 384 "tools/widl/parser.y"
-                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type)));
-						  reg_type((yyvsp[0].type), (yyvsp[0].type)->name, current_namespace, 0);
-						}
 #line 3378 "tools/widl/parser.tab.c"
     break;
 
-  case 25: /* imp_statements: imp_statements apicontract ';'  */
-#line 387 "tools/widl/parser.y"
-                                                { (yyval.stmt_list) = append_statement((yyvsp[-2].stmt_list), make_statement_type_decl((yyvsp[-1].type)));
-	                                          reg_type((yyvsp[-1].type), (yyvsp[-1].type)->name, current_namespace, 0); }
+  case 16: /* gbl_statements: gbl_statements runtimeclass_def  */
+#line 369 "tools/widl/parser.y"
+                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type)));
+	                                          reg_type((yyvsp[0].type), (yyvsp[0].type)->name, current_namespace, 0); }
 #line 3385 "tools/widl/parser.tab.c"
     break;
 
-  case 26: /* imp_statements: imp_statements runtimeclass ';'  */
-#line 389 "tools/widl/parser.y"
-                                                { (yyval.stmt_list) = (yyvsp[-2].stmt_list); reg_type((yyvsp[-1].type), (yyvsp[-1].type)->name, current_namespace, 0); }
+  case 17: /* gbl_statements: gbl_statements moduledef  */
+#line 371 "tools/widl/parser.y"
+                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_module((yyvsp[0].type))); }
 #line 3391 "tools/widl/parser.tab.c"
     break;
 
-  case 27: /* imp_statements: imp_statements runtimeclass_def  */
+  case 18: /* gbl_statements: gbl_statements librarydef  */
+#line 372 "tools/widl/parser.y"
+                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_library((yyvsp[0].typelib))); }
+#line 3397 "tools/widl/parser.tab.c"
+    break;
+
+  case 19: /* gbl_statements: gbl_statements statement  */
+#line 373 "tools/widl/parser.y"
+                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), (yyvsp[0].statement)); }
+#line 3403 "tools/widl/parser.tab.c"
+    break;
+
+  case 20: /* imp_statements: %empty  */
+#line 376 "tools/widl/parser.y"
+                                                { (yyval.stmt_list) = NULL; }
+#line 3409 "tools/widl/parser.tab.c"
+    break;
+
+  case 21: /* imp_statements: imp_statements interface ';'  */
+#line 377 "tools/widl/parser.y"
+                                                { (yyval.stmt_list) = append_statement((yyvsp[-2].stmt_list), make_statement_reference((yyvsp[-1].type))); }
+#line 3415 "tools/widl/parser.tab.c"
+    break;
+
+  case 22: /* imp_statements: imp_statements dispinterface ';'  */
+#line 378 "tools/widl/parser.y"
+                                                { (yyval.stmt_list) = append_statement((yyvsp[-2].stmt_list), make_statement_reference((yyvsp[-1].type))); }
+#line 3421 "tools/widl/parser.tab.c"
+    break;
+
+  case 23: /* $@2: %empty  */
+#line 379 "tools/widl/parser.y"
+                                          { push_namespace((yyvsp[-1].str)); }
+#line 3427 "tools/widl/parser.tab.c"
+    break;
+
+  case 24: /* imp_statements: imp_statements namespacedef '{' $@2 imp_statements '}'  */
+#line 380 "tools/widl/parser.y"
+                                                { pop_namespace((yyvsp[-4].str)); (yyval.stmt_list) = append_statements((yyvsp[-5].stmt_list), (yyvsp[-1].stmt_list)); }
+#line 3433 "tools/widl/parser.tab.c"
+    break;
+
+  case 25: /* imp_statements: imp_statements interfacedef  */
+#line 381 "tools/widl/parser.y"
+                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type))); }
+#line 3439 "tools/widl/parser.tab.c"
+    break;
+
+  case 26: /* imp_statements: imp_statements coclass ';'  */
+#line 382 "tools/widl/parser.y"
+                                                { (yyval.stmt_list) = (yyvsp[-2].stmt_list); reg_type((yyvsp[-1].type), (yyvsp[-1].type)->name, current_namespace, 0); }
+#line 3445 "tools/widl/parser.tab.c"
+    break;
+
+  case 27: /* imp_statements: imp_statements coclassdef  */
+#line 383 "tools/widl/parser.y"
+                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type)));
+						  reg_type((yyvsp[0].type), (yyvsp[0].type)->name, current_namespace, 0);
+						}
+#line 3453 "tools/widl/parser.tab.c"
+    break;
+
+  case 28: /* imp_statements: imp_statements apicontract ';'  */
+#line 386 "tools/widl/parser.y"
+                                                { (yyval.stmt_list) = (yyvsp[-2].stmt_list); reg_type((yyvsp[-1].type), (yyvsp[-1].type)->name, current_namespace, 0); }
+#line 3459 "tools/widl/parser.tab.c"
+    break;
+
+  case 29: /* imp_statements: imp_statements apicontract_def  */
+#line 387 "tools/widl/parser.y"
+                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type)));
+						  reg_type((yyvsp[0].type), (yyvsp[0].type)->name, current_namespace, 0); }
+#line 3466 "tools/widl/parser.tab.c"
+    break;
+
+  case 30: /* imp_statements: imp_statements runtimeclass ';'  */
+#line 389 "tools/widl/parser.y"
+                                                { (yyval.stmt_list) = (yyvsp[-2].stmt_list); reg_type((yyvsp[-1].type), (yyvsp[-1].type)->name, current_namespace, 0); }
+#line 3472 "tools/widl/parser.tab.c"
+    break;
+
+  case 31: /* imp_statements: imp_statements runtimeclass_def  */
 #line 390 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type)));
 	                                          reg_type((yyvsp[0].type), (yyvsp[0].type)->name, current_namespace, 0); }
-#line 3398 "tools/widl/parser.tab.c"
+#line 3479 "tools/widl/parser.tab.c"
     break;
 
-  case 28: /* imp_statements: imp_statements moduledef  */
+  case 32: /* imp_statements: imp_statements moduledef  */
 #line 392 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_module((yyvsp[0].type))); }
-#line 3404 "tools/widl/parser.tab.c"
+#line 3485 "tools/widl/parser.tab.c"
     break;
 
-  case 29: /* imp_statements: imp_statements statement  */
+  case 33: /* imp_statements: imp_statements statement  */
 #line 393 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), (yyvsp[0].statement)); }
-#line 3410 "tools/widl/parser.tab.c"
+#line 3491 "tools/widl/parser.tab.c"
     break;
 
-  case 30: /* imp_statements: imp_statements importlib  */
+  case 34: /* imp_statements: imp_statements importlib  */
 #line 394 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_importlib((yyvsp[0].str))); }
-#line 3416 "tools/widl/parser.tab.c"
+#line 3497 "tools/widl/parser.tab.c"
     break;
 
-  case 31: /* imp_statements: imp_statements librarydef  */
+  case 35: /* imp_statements: imp_statements librarydef  */
 #line 395 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_library((yyvsp[0].typelib))); }
-#line 3422 "tools/widl/parser.tab.c"
+#line 3503 "tools/widl/parser.tab.c"
     break;
 
-  case 32: /* int_statements: %empty  */
+  case 36: /* int_statements: %empty  */
 #line 398 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = NULL; }
-#line 3428 "tools/widl/parser.tab.c"
+#line 3509 "tools/widl/parser.tab.c"
     break;
 
-  case 33: /* int_statements: int_statements statement  */
+  case 37: /* int_statements: int_statements statement  */
 #line 399 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), (yyvsp[0].statement)); }
-#line 3434 "tools/widl/parser.tab.c"
+#line 3515 "tools/widl/parser.tab.c"
     break;
 
-  case 36: /* statement: cppquote  */
+  case 40: /* statement: cppquote  */
 #line 407 "tools/widl/parser.y"
                                                 { (yyval.statement) = make_statement_cppquote((yyvsp[0].str)); }
-#line 3440 "tools/widl/parser.tab.c"
+#line 3521 "tools/widl/parser.tab.c"
     break;
 
-  case 37: /* statement: typedecl ';'  */
+  case 41: /* statement: typedecl ';'  */
 #line 408 "tools/widl/parser.y"
                                                 { (yyval.statement) = make_statement_type_decl((yyvsp[-1].type)); }
-#line 3446 "tools/widl/parser.tab.c"
+#line 3527 "tools/widl/parser.tab.c"
     break;
 
-  case 38: /* statement: declaration ';'  */
+  case 42: /* statement: declaration ';'  */
 #line 409 "tools/widl/parser.y"
                                                 { (yyval.statement) = make_statement_declaration((yyvsp[-1].var)); }
-#line 3452 "tools/widl/parser.tab.c"
+#line 3533 "tools/widl/parser.tab.c"
     break;
 
-  case 39: /* statement: import  */
+  case 43: /* statement: import  */
 #line 410 "tools/widl/parser.y"
                                                 { (yyval.statement) = make_statement_import((yyvsp[0].str)); }
-#line 3458 "tools/widl/parser.tab.c"
+#line 3539 "tools/widl/parser.tab.c"
     break;
 
-  case 40: /* statement: typedef ';'  */
+  case 44: /* statement: typedef ';'  */
 #line 411 "tools/widl/parser.y"
                                                 { (yyval.statement) = (yyvsp[-1].statement); }
-#line 3464 "tools/widl/parser.tab.c"
+#line 3545 "tools/widl/parser.tab.c"
     break;
 
-  case 41: /* statement: aPRAGMA  */
+  case 45: /* statement: aPRAGMA  */
 #line 412 "tools/widl/parser.y"
                                                 { (yyval.statement) = make_statement_pragma((yyvsp[0].str)); }
-#line 3470 "tools/widl/parser.tab.c"
+#line 3551 "tools/widl/parser.tab.c"
     break;
 
-  case 42: /* statement: pragma_warning  */
+  case 46: /* statement: pragma_warning  */
 #line 413 "tools/widl/parser.y"
                          { (yyval.statement) = NULL; }
-#line 3476 "tools/widl/parser.tab.c"
+#line 3557 "tools/widl/parser.tab.c"
     break;
 
-  case 43: /* pragma_warning: tPRAGMA_WARNING '(' aIDENTIFIER ':' warnings ')'  */
+  case 47: /* pragma_warning: tPRAGMA_WARNING '(' aIDENTIFIER ':' warnings ')'  */
 #line 417 "tools/widl/parser.y"
                   {
                       int result;
@@ -3484,64 +3565,64 @@
                       if(!result)
                           error_loc("expected \"disable\" or \"enable\"\n");
                   }
-#line 3488 "tools/widl/parser.tab.c"
+#line 3569 "tools/widl/parser.tab.c"
     break;
 
-  case 44: /* warnings: aNUM  */
+  case 48: /* warnings: aNUM  */
 #line 427 "tools/widl/parser.y"
                { (yyval.warning_list) = append_warning(NULL, (yyvsp[0].num)); }
-#line 3494 "tools/widl/parser.tab.c"
+#line 3575 "tools/widl/parser.tab.c"
     break;
 
-  case 45: /* warnings: warnings aNUM  */
+  case 49: /* warnings: warnings aNUM  */
 #line 428 "tools/widl/parser.y"
                         { (yyval.warning_list) = append_warning((yyvsp[-1].warning_list), (yyvsp[0].num)); }
-#line 3500 "tools/widl/parser.tab.c"
+#line 3581 "tools/widl/parser.tab.c"
     break;
 
-  case 47: /* typedecl: tENUM aIDENTIFIER  */
+  case 51: /* typedecl: tENUM aIDENTIFIER  */
 #line 433 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_enum((yyvsp[0].str), current_namespace, FALSE, NULL); }
-#line 3506 "tools/widl/parser.tab.c"
+#line 3587 "tools/widl/parser.tab.c"
     break;
 
-  case 49: /* typedecl: tSTRUCT aIDENTIFIER  */
+  case 53: /* typedecl: tSTRUCT aIDENTIFIER  */
 #line 435 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_struct((yyvsp[0].str), current_namespace, FALSE, NULL); }
-#line 3512 "tools/widl/parser.tab.c"
+#line 3593 "tools/widl/parser.tab.c"
     break;
 
-  case 51: /* typedecl: tUNION aIDENTIFIER  */
+  case 55: /* typedecl: tUNION aIDENTIFIER  */
 #line 437 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_nonencapsulated_union((yyvsp[0].str), FALSE, NULL); }
-#line 3518 "tools/widl/parser.tab.c"
+#line 3599 "tools/widl/parser.tab.c"
     break;
 
-  case 52: /* typedecl: attributes enumdef  */
+  case 56: /* typedecl: attributes enumdef  */
 #line 438 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[0].type); (yyval.type)->attrs = check_enum_attrs((yyvsp[-1].attr_list)); }
-#line 3524 "tools/widl/parser.tab.c"
+#line 3605 "tools/widl/parser.tab.c"
     break;
 
-  case 53: /* typedecl: attributes structdef  */
+  case 57: /* typedecl: attributes structdef  */
 #line 439 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[0].type); (yyval.type)->attrs = check_struct_attrs((yyvsp[-1].attr_list)); }
-#line 3530 "tools/widl/parser.tab.c"
+#line 3611 "tools/widl/parser.tab.c"
     break;
 
-  case 54: /* typedecl: attributes uniondef  */
+  case 58: /* typedecl: attributes uniondef  */
 #line 440 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[0].type); (yyval.type)->attrs = check_union_attrs((yyvsp[-1].attr_list)); }
-#line 3536 "tools/widl/parser.tab.c"
+#line 3617 "tools/widl/parser.tab.c"
     break;
 
-  case 55: /* cppquote: tCPPQUOTE '(' aSTRING ')'  */
+  case 59: /* cppquote: tCPPQUOTE '(' aSTRING ')'  */
 #line 443 "tools/widl/parser.y"
                                                 { (yyval.str) = (yyvsp[-1].str); }
-#line 3542 "tools/widl/parser.tab.c"
+#line 3623 "tools/widl/parser.tab.c"
     break;
 
-  case 56: /* import_start: tIMPORT aSTRING ';'  */
+  case 60: /* import_start: tIMPORT aSTRING ';'  */
 #line 445 "tools/widl/parser.y"
                                                 { assert(yychar == YYEMPTY);
 						  (yyval.import) = xmalloc(sizeof(struct _import_t));
@@ -3549,916 +3630,928 @@
 						  (yyval.import)->import_performed = do_import((yyvsp[-1].str));
 						  if (!(yyval.import)->import_performed) yychar = aEOF;
 						}
-#line 3553 "tools/widl/parser.tab.c"
+#line 3634 "tools/widl/parser.tab.c"
     break;
 
-  case 57: /* import: import_start imp_statements aEOF  */
+  case 61: /* import: import_start imp_statements aEOF  */
 #line 453 "tools/widl/parser.y"
                                                 { (yyval.str) = (yyvsp[-2].import)->name;
 						  if ((yyvsp[-2].import)->import_performed) pop_import();
 						  free((yyvsp[-2].import));
 						}
-#line 3562 "tools/widl/parser.tab.c"
+#line 3643 "tools/widl/parser.tab.c"
     break;
 
-  case 58: /* importlib: tIMPORTLIB '(' aSTRING ')' semicolon_opt  */
+  case 62: /* importlib: tIMPORTLIB '(' aSTRING ')' semicolon_opt  */
 #line 460 "tools/widl/parser.y"
                                                 { (yyval.str) = (yyvsp[-2].str); if(!parse_only) add_importlib((yyvsp[-2].str), current_typelib); }
-#line 3568 "tools/widl/parser.tab.c"
+#line 3649 "tools/widl/parser.tab.c"
     break;
 
-  case 59: /* libraryhdr: tLIBRARY aIDENTIFIER  */
+  case 63: /* libraryhdr: tLIBRARY typename  */
 #line 463 "tools/widl/parser.y"
                                                 { (yyval.str) = (yyvsp[0].str); }
-#line 3574 "tools/widl/parser.tab.c"
+#line 3655 "tools/widl/parser.tab.c"
     break;
 
-  case 60: /* libraryhdr: tLIBRARY aKNOWNTYPE  */
-#line 464 "tools/widl/parser.y"
-                                                { (yyval.str) = (yyvsp[0].str); }
-#line 3580 "tools/widl/parser.tab.c"
-    break;
-
-  case 61: /* library_start: attributes libraryhdr '{'  */
-#line 466 "tools/widl/parser.y"
+  case 64: /* library_start: attributes libraryhdr '{'  */
+#line 465 "tools/widl/parser.y"
                                                 { (yyval.typelib) = make_library((yyvsp[-1].str), check_library_attrs((yyvsp[-1].str), (yyvsp[-2].attr_list)));
 						  if (!parse_only && do_typelib) current_typelib = (yyval.typelib);
 						}
-#line 3588 "tools/widl/parser.tab.c"
+#line 3663 "tools/widl/parser.tab.c"
     break;
 
-  case 62: /* librarydef: library_start imp_statements '}' semicolon_opt  */
-#line 471 "tools/widl/parser.y"
+  case 65: /* librarydef: library_start imp_statements '}' semicolon_opt  */
+#line 470 "tools/widl/parser.y"
                                                 { (yyval.typelib) = (yyvsp[-3].typelib); (yyval.typelib)->stmts = (yyvsp[-2].stmt_list); }
-#line 3594 "tools/widl/parser.tab.c"
+#line 3669 "tools/widl/parser.tab.c"
     break;
 
-  case 63: /* m_args: %empty  */
-#line 474 "tools/widl/parser.y"
+  case 66: /* m_args: %empty  */
+#line 473 "tools/widl/parser.y"
                                                 { (yyval.var_list) = NULL; }
-#line 3600 "tools/widl/parser.tab.c"
+#line 3675 "tools/widl/parser.tab.c"
     break;
 
-  case 65: /* arg_list: arg  */
-#line 478 "tools/widl/parser.y"
+  case 68: /* arg_list: arg  */
+#line 477 "tools/widl/parser.y"
                                                 { check_arg_attrs((yyvsp[0].var)); (yyval.var_list) = append_var( NULL, (yyvsp[0].var) ); }
-#line 3606 "tools/widl/parser.tab.c"
+#line 3681 "tools/widl/parser.tab.c"
     break;
 
-  case 66: /* arg_list: arg_list ',' arg  */
-#line 479 "tools/widl/parser.y"
+  case 69: /* arg_list: arg_list ',' arg  */
+#line 478 "tools/widl/parser.y"
                                                 { check_arg_attrs((yyvsp[0].var)); (yyval.var_list) = append_var( (yyvsp[-2].var_list), (yyvsp[0].var) ); }
-#line 3612 "tools/widl/parser.tab.c"
+#line 3687 "tools/widl/parser.tab.c"
     break;
 
-  case 68: /* args: arg_list ',' ELLIPSIS  */
-#line 483 "tools/widl/parser.y"
+  case 71: /* args: arg_list ',' ELLIPSIS  */
+#line 482 "tools/widl/parser.y"
                                                 { (yyval.var_list) = append_var( (yyvsp[-2].var_list), make_var(strdup("...")) ); }
-#line 3618 "tools/widl/parser.tab.c"
+#line 3693 "tools/widl/parser.tab.c"
     break;
 
-  case 69: /* arg: attributes decl_spec m_any_declarator  */
-#line 487 "tools/widl/parser.y"
+  case 72: /* arg: attributes decl_spec m_any_declarator  */
+#line 486 "tools/widl/parser.y"
                                                 { if ((yyvsp[-1].declspec)->stgclass != STG_NONE && (yyvsp[-1].declspec)->stgclass != STG_REGISTER)
 						    error_loc("invalid storage class for function parameter\n");
 						  (yyval.var) = declare_var((yyvsp[-2].attr_list), (yyvsp[-1].declspec), (yyvsp[0].declarator), TRUE);
 						  free((yyvsp[-1].declspec)); free((yyvsp[0].declarator));
 						}
-#line 3628 "tools/widl/parser.tab.c"
+#line 3703 "tools/widl/parser.tab.c"
     break;
 
-  case 70: /* arg: decl_spec m_any_declarator  */
-#line 492 "tools/widl/parser.y"
+  case 73: /* arg: decl_spec m_any_declarator  */
+#line 491 "tools/widl/parser.y"
                                                 { if ((yyvsp[-1].declspec)->stgclass != STG_NONE && (yyvsp[-1].declspec)->stgclass != STG_REGISTER)
 						    error_loc("invalid storage class for function parameter\n");
 						  (yyval.var) = declare_var(NULL, (yyvsp[-1].declspec), (yyvsp[0].declarator), TRUE);
 						  free((yyvsp[-1].declspec)); free((yyvsp[0].declarator));
 						}
-#line 3638 "tools/widl/parser.tab.c"
+#line 3713 "tools/widl/parser.tab.c"
     break;
 
-  case 71: /* array: '[' expr ']'  */
-#line 499 "tools/widl/parser.y"
+  case 74: /* array: '[' expr ']'  */
+#line 498 "tools/widl/parser.y"
                                                 { (yyval.expr) = (yyvsp[-1].expr);
 						  if (!(yyval.expr)->is_const || (yyval.expr)->cval <= 0)
 						      error_loc("array dimension is not a positive integer constant\n");
 						}
-#line 3647 "tools/widl/parser.tab.c"
+#line 3722 "tools/widl/parser.tab.c"
     break;
 
-  case 72: /* array: '[' '*' ']'  */
+  case 75: /* array: '[' '*' ']'  */
+#line 502 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_expr(EXPR_VOID); }
+#line 3728 "tools/widl/parser.tab.c"
+    break;
+
+  case 76: /* array: '[' ']'  */
 #line 503 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr(EXPR_VOID); }
-#line 3653 "tools/widl/parser.tab.c"
+#line 3734 "tools/widl/parser.tab.c"
     break;
 
-  case 73: /* array: '[' ']'  */
-#line 504 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr(EXPR_VOID); }
-#line 3659 "tools/widl/parser.tab.c"
-    break;
-
-  case 74: /* m_attributes: %empty  */
-#line 507 "tools/widl/parser.y"
+  case 77: /* m_attributes: %empty  */
+#line 506 "tools/widl/parser.y"
                                                 { (yyval.attr_list) = NULL; }
-#line 3665 "tools/widl/parser.tab.c"
+#line 3740 "tools/widl/parser.tab.c"
     break;
 
-  case 76: /* attributes: '[' attrib_list ']'  */
-#line 512 "tools/widl/parser.y"
+  case 79: /* attributes: '[' attrib_list ']'  */
+#line 511 "tools/widl/parser.y"
                                                 { (yyval.attr_list) = (yyvsp[-1].attr_list); }
-#line 3671 "tools/widl/parser.tab.c"
+#line 3746 "tools/widl/parser.tab.c"
     break;
 
-  case 77: /* attrib_list: attribute  */
-#line 515 "tools/widl/parser.y"
+  case 80: /* attrib_list: attribute  */
+#line 514 "tools/widl/parser.y"
                                                 { (yyval.attr_list) = append_attr( NULL, (yyvsp[0].attr) ); }
-#line 3677 "tools/widl/parser.tab.c"
+#line 3752 "tools/widl/parser.tab.c"
     break;
 
-  case 78: /* attrib_list: attrib_list ',' attribute  */
-#line 516 "tools/widl/parser.y"
+  case 81: /* attrib_list: attrib_list ',' attribute  */
+#line 515 "tools/widl/parser.y"
                                                 { (yyval.attr_list) = append_attr( (yyvsp[-2].attr_list), (yyvsp[0].attr) ); }
-#line 3683 "tools/widl/parser.tab.c"
+#line 3758 "tools/widl/parser.tab.c"
     break;
 
-  case 79: /* attrib_list: attrib_list ']' '[' attribute  */
-#line 517 "tools/widl/parser.y"
+  case 82: /* attrib_list: attrib_list ']' '[' attribute  */
+#line 516 "tools/widl/parser.y"
                                                 { (yyval.attr_list) = append_attr( (yyvsp[-3].attr_list), (yyvsp[0].attr) ); }
-#line 3689 "tools/widl/parser.tab.c"
+#line 3764 "tools/widl/parser.tab.c"
     break;
 
-  case 80: /* str_list: aSTRING  */
-#line 520 "tools/widl/parser.y"
+  case 83: /* str_list: aSTRING  */
+#line 519 "tools/widl/parser.y"
                                                 { (yyval.str_list) = append_str( NULL, (yyvsp[0].str) ); }
-#line 3695 "tools/widl/parser.tab.c"
+#line 3770 "tools/widl/parser.tab.c"
     break;
 
-  case 81: /* str_list: str_list ',' aSTRING  */
-#line 521 "tools/widl/parser.y"
+  case 84: /* str_list: str_list ',' aSTRING  */
+#line 520 "tools/widl/parser.y"
                                                 { (yyval.str_list) = append_str( (yyvsp[-2].str_list), (yyvsp[0].str) ); }
-#line 3701 "tools/widl/parser.tab.c"
+#line 3776 "tools/widl/parser.tab.c"
     break;
 
-  case 82: /* marshaling_behavior: tAGILE  */
-#line 525 "tools/widl/parser.y"
+  case 85: /* marshaling_behavior: tAGILE  */
+#line 524 "tools/widl/parser.y"
                                                 { (yyval.num) = MARSHALING_AGILE; }
-#line 3707 "tools/widl/parser.tab.c"
+#line 3782 "tools/widl/parser.tab.c"
     break;
 
-  case 83: /* marshaling_behavior: tNONE  */
-#line 526 "tools/widl/parser.y"
+  case 86: /* marshaling_behavior: tNONE  */
+#line 525 "tools/widl/parser.y"
                                                 { (yyval.num) = MARSHALING_NONE; }
-#line 3713 "tools/widl/parser.tab.c"
+#line 3788 "tools/widl/parser.tab.c"
     break;
 
-  case 84: /* marshaling_behavior: tSTANDARD  */
-#line 527 "tools/widl/parser.y"
+  case 87: /* marshaling_behavior: tSTANDARD  */
+#line 526 "tools/widl/parser.y"
                                                 { (yyval.num) = MARSHALING_STANDARD; }
-#line 3719 "tools/widl/parser.tab.c"
+#line 3794 "tools/widl/parser.tab.c"
     break;
 
-  case 85: /* contract_ver: aNUM  */
-#line 531 "tools/widl/parser.y"
+  case 88: /* contract_ver: aNUM  */
+#line 530 "tools/widl/parser.y"
                                                 { (yyval.num) = MAKEVERSION(0, (yyvsp[0].num)); }
-#line 3725 "tools/widl/parser.tab.c"
+#line 3800 "tools/widl/parser.tab.c"
     break;
 
-  case 86: /* contract_ver: aNUM '.' aNUM  */
-#line 532 "tools/widl/parser.y"
+  case 89: /* contract_ver: aNUM '.' aNUM  */
+#line 531 "tools/widl/parser.y"
                                                 { (yyval.num) = MAKEVERSION((yyvsp[0].num), (yyvsp[-2].num)); }
-#line 3731 "tools/widl/parser.tab.c"
+#line 3806 "tools/widl/parser.tab.c"
     break;
 
-  case 87: /* contract_req: decl_spec ',' contract_ver  */
-#line 535 "tools/widl/parser.y"
+  case 90: /* contract_req: decl_spec ',' contract_ver  */
+#line 534 "tools/widl/parser.y"
                                                 { if ((yyvsp[-2].declspec)->type->type_type != TYPE_APICONTRACT)
 						      error_loc("type %s is not an apicontract\n", (yyvsp[-2].declspec)->type->name);
 						  (yyval.expr) = make_exprl(EXPR_NUM, (yyvsp[0].num));
 						  (yyval.expr) = make_exprt(EXPR_GTREQL, declare_var(NULL, (yyvsp[-2].declspec), make_declarator(NULL), 0), (yyval.expr));
 						}
-#line 3741 "tools/widl/parser.tab.c"
+#line 3816 "tools/widl/parser.tab.c"
     break;
 
-  case 88: /* attribute: %empty  */
-#line 541 "tools/widl/parser.y"
+  case 91: /* attribute: %empty  */
+#line 540 "tools/widl/parser.y"
                                                 { (yyval.attr) = NULL; }
-#line 3747 "tools/widl/parser.tab.c"
+#line 3822 "tools/widl/parser.tab.c"
     break;
 
-  case 89: /* attribute: tAGGREGATABLE  */
-#line 542 "tools/widl/parser.y"
+  case 92: /* attribute: tAGGREGATABLE  */
+#line 541 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_AGGREGATABLE); }
-#line 3753 "tools/widl/parser.tab.c"
+#line 3828 "tools/widl/parser.tab.c"
     break;
 
-  case 90: /* attribute: tANNOTATION '(' aSTRING ')'  */
-#line 543 "tools/widl/parser.y"
+  case 93: /* attribute: tANNOTATION '(' aSTRING ')'  */
+#line 542 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attrp(ATTR_ANNOTATION, (yyvsp[-1].str)); }
-#line 3759 "tools/widl/parser.tab.c"
+#line 3834 "tools/widl/parser.tab.c"
     break;
 
-  case 91: /* attribute: tAPPOBJECT  */
-#line 544 "tools/widl/parser.y"
+  case 94: /* attribute: tAPPOBJECT  */
+#line 543 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_APPOBJECT); }
-#line 3765 "tools/widl/parser.tab.c"
+#line 3840 "tools/widl/parser.tab.c"
     break;
 
-  case 92: /* attribute: tASYNC  */
-#line 545 "tools/widl/parser.y"
+  case 95: /* attribute: tASYNC  */
+#line 544 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_ASYNC); }
-#line 3771 "tools/widl/parser.tab.c"
+#line 3846 "tools/widl/parser.tab.c"
     break;
 
-  case 93: /* attribute: tAUTOHANDLE  */
-#line 546 "tools/widl/parser.y"
+  case 96: /* attribute: tAUTOHANDLE  */
+#line 545 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_AUTO_HANDLE); }
-#line 3777 "tools/widl/parser.tab.c"
+#line 3852 "tools/widl/parser.tab.c"
     break;
 
-  case 94: /* attribute: tBINDABLE  */
-#line 547 "tools/widl/parser.y"
+  case 97: /* attribute: tBINDABLE  */
+#line 546 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_BINDABLE); }
-#line 3783 "tools/widl/parser.tab.c"
+#line 3858 "tools/widl/parser.tab.c"
     break;
 
-  case 95: /* attribute: tBROADCAST  */
-#line 548 "tools/widl/parser.y"
+  case 98: /* attribute: tBROADCAST  */
+#line 547 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_BROADCAST); }
-#line 3789 "tools/widl/parser.tab.c"
+#line 3864 "tools/widl/parser.tab.c"
     break;
 
-  case 96: /* attribute: tCALLAS '(' ident ')'  */
-#line 549 "tools/widl/parser.y"
+  case 99: /* attribute: tCALLAS '(' ident ')'  */
+#line 548 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attrp(ATTR_CALLAS, (yyvsp[-1].var)); }
-#line 3795 "tools/widl/parser.tab.c"
+#line 3870 "tools/widl/parser.tab.c"
     break;
 
-  case 97: /* attribute: tCASE '(' expr_list_int_const ')'  */
-#line 550 "tools/widl/parser.y"
+  case 100: /* attribute: tCASE '(' expr_list_int_const ')'  */
+#line 549 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attrp(ATTR_CASE, (yyvsp[-1].expr_list)); }
-#line 3801 "tools/widl/parser.tab.c"
+#line 3876 "tools/widl/parser.tab.c"
     break;
 
-  case 98: /* attribute: tCODE  */
-#line 551 "tools/widl/parser.y"
+  case 101: /* attribute: tCODE  */
+#line 550 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_CODE); }
-#line 3807 "tools/widl/parser.tab.c"
+#line 3882 "tools/widl/parser.tab.c"
     break;
 
-  case 99: /* attribute: tCOMMSTATUS  */
-#line 552 "tools/widl/parser.y"
+  case 102: /* attribute: tCOMMSTATUS  */
+#line 551 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_COMMSTATUS); }
-#line 3813 "tools/widl/parser.tab.c"
+#line 3888 "tools/widl/parser.tab.c"
     break;
 
-  case 100: /* attribute: tCONTEXTHANDLE  */
-#line 553 "tools/widl/parser.y"
+  case 103: /* attribute: tCONTEXTHANDLE  */
+#line 552 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attrv(ATTR_CONTEXTHANDLE, 0); }
-#line 3819 "tools/widl/parser.tab.c"
+#line 3894 "tools/widl/parser.tab.c"
     break;
 
-  case 101: /* attribute: tCONTEXTHANDLENOSERIALIZE  */
-#line 554 "tools/widl/parser.y"
+  case 104: /* attribute: tCONTEXTHANDLENOSERIALIZE  */
+#line 553 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attrv(ATTR_CONTEXTHANDLE, 0); /* RPC_CONTEXT_HANDLE_DONT_SERIALIZE */ }
-#line 3825 "tools/widl/parser.tab.c"
+#line 3900 "tools/widl/parser.tab.c"
     break;
 
-  case 102: /* attribute: tCONTEXTHANDLESERIALIZE  */
-#line 555 "tools/widl/parser.y"
+  case 105: /* attribute: tCONTEXTHANDLESERIALIZE  */
+#line 554 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attrv(ATTR_CONTEXTHANDLE, 0); /* RPC_CONTEXT_HANDLE_SERIALIZE */ }
-#line 3831 "tools/widl/parser.tab.c"
+#line 3906 "tools/widl/parser.tab.c"
     break;
 
-  case 103: /* attribute: tCONTRACT '(' contract_req ')'  */
-#line 556 "tools/widl/parser.y"
+  case 106: /* attribute: tCONTRACT '(' contract_req ')'  */
+#line 555 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attrp(ATTR_CONTRACT, (yyvsp[-1].expr)); }
-#line 3837 "tools/widl/parser.tab.c"
+#line 3912 "tools/widl/parser.tab.c"
     break;
 
-  case 104: /* attribute: tCONTRACTVERSION '(' contract_ver ')'  */
-#line 557 "tools/widl/parser.y"
+  case 107: /* attribute: tCONTRACTVERSION '(' contract_ver ')'  */
+#line 556 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attrv(ATTR_CONTRACTVERSION, (yyvsp[-1].num)); }
-#line 3843 "tools/widl/parser.tab.c"
+#line 3918 "tools/widl/parser.tab.c"
     break;
 
-  case 105: /* attribute: tCONTROL  */
-#line 558 "tools/widl/parser.y"
+  case 108: /* attribute: tCONTROL  */
+#line 557 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_CONTROL); }
-#line 3849 "tools/widl/parser.tab.c"
+#line 3924 "tools/widl/parser.tab.c"
     break;
 
-  case 106: /* attribute: tCUSTOM '(' uuid_string ',' expr_const ')'  */
-#line 559 "tools/widl/parser.y"
+  case 109: /* attribute: tCUSTOM '(' uuid_string ',' expr_const ')'  */
+#line 558 "tools/widl/parser.y"
                                                      { (yyval.attr) = make_custom_attr((yyvsp[-3].uuid), (yyvsp[-1].expr)); }
-#line 3855 "tools/widl/parser.tab.c"
+#line 3930 "tools/widl/parser.tab.c"
     break;
 
-  case 107: /* attribute: tDECODE  */
-#line 560 "tools/widl/parser.y"
+  case 110: /* attribute: tDECODE  */
+#line 559 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_DECODE); }
-#line 3861 "tools/widl/parser.tab.c"
+#line 3936 "tools/widl/parser.tab.c"
     break;
 
-  case 108: /* attribute: tDEFAULT  */
-#line 561 "tools/widl/parser.y"
+  case 111: /* attribute: tDEFAULT  */
+#line 560 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_DEFAULT); }
-#line 3867 "tools/widl/parser.tab.c"
+#line 3942 "tools/widl/parser.tab.c"
     break;
 
-  case 109: /* attribute: tDEFAULTBIND  */
-#line 562 "tools/widl/parser.y"
+  case 112: /* attribute: tDEFAULTBIND  */
+#line 561 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_DEFAULTBIND); }
-#line 3873 "tools/widl/parser.tab.c"
+#line 3948 "tools/widl/parser.tab.c"
     break;
 
-  case 110: /* attribute: tDEFAULTCOLLELEM  */
-#line 563 "tools/widl/parser.y"
+  case 113: /* attribute: tDEFAULTCOLLELEM  */
+#line 562 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_DEFAULTCOLLELEM); }
-#line 3879 "tools/widl/parser.tab.c"
+#line 3954 "tools/widl/parser.tab.c"
     break;
 
-  case 111: /* attribute: tDEFAULTVALUE '(' expr_const ')'  */
-#line 564 "tools/widl/parser.y"
+  case 114: /* attribute: tDEFAULTVALUE '(' expr_const ')'  */
+#line 563 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attrp(ATTR_DEFAULTVALUE, (yyvsp[-1].expr)); }
-#line 3885 "tools/widl/parser.tab.c"
+#line 3960 "tools/widl/parser.tab.c"
     break;
 
-  case 112: /* attribute: tDEFAULTVTABLE  */
-#line 565 "tools/widl/parser.y"
+  case 115: /* attribute: tDEFAULTVTABLE  */
+#line 564 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_DEFAULTVTABLE); }
-#line 3891 "tools/widl/parser.tab.c"
+#line 3966 "tools/widl/parser.tab.c"
     break;
 
-  case 113: /* attribute: tDISABLECONSISTENCYCHECK  */
-#line 566 "tools/widl/parser.y"
+  case 116: /* attribute: tDISABLECONSISTENCYCHECK  */
+#line 565 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_DISABLECONSISTENCYCHECK); }
-#line 3897 "tools/widl/parser.tab.c"
+#line 3972 "tools/widl/parser.tab.c"
     break;
 
-  case 114: /* attribute: tDISPLAYBIND  */
-#line 567 "tools/widl/parser.y"
+  case 117: /* attribute: tDISPLAYBIND  */
+#line 566 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_DISPLAYBIND); }
-#line 3903 "tools/widl/parser.tab.c"
+#line 3978 "tools/widl/parser.tab.c"
     break;
 
-  case 115: /* attribute: tDLLNAME '(' aSTRING ')'  */
-#line 568 "tools/widl/parser.y"
+  case 118: /* attribute: tDLLNAME '(' aSTRING ')'  */
+#line 567 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attrp(ATTR_DLLNAME, (yyvsp[-1].str)); }
-#line 3909 "tools/widl/parser.tab.c"
+#line 3984 "tools/widl/parser.tab.c"
     break;
 
-  case 116: /* attribute: tDUAL  */
-#line 569 "tools/widl/parser.y"
+  case 119: /* attribute: tDUAL  */
+#line 568 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_DUAL); }
-#line 3915 "tools/widl/parser.tab.c"
+#line 3990 "tools/widl/parser.tab.c"
     break;
 
-  case 117: /* attribute: tENABLEALLOCATE  */
-#line 570 "tools/widl/parser.y"
+  case 120: /* attribute: tENABLEALLOCATE  */
+#line 569 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_ENABLEALLOCATE); }
-#line 3921 "tools/widl/parser.tab.c"
+#line 3996 "tools/widl/parser.tab.c"
     break;
 
-  case 118: /* attribute: tENCODE  */
-#line 571 "tools/widl/parser.y"
+  case 121: /* attribute: tENCODE  */
+#line 570 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_ENCODE); }
-#line 3927 "tools/widl/parser.tab.c"
+#line 4002 "tools/widl/parser.tab.c"
     break;
 
-  case 119: /* attribute: tENDPOINT '(' str_list ')'  */
-#line 572 "tools/widl/parser.y"
+  case 122: /* attribute: tENDPOINT '(' str_list ')'  */
+#line 571 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attrp(ATTR_ENDPOINT, (yyvsp[-1].str_list)); }
-#line 3933 "tools/widl/parser.tab.c"
+#line 4008 "tools/widl/parser.tab.c"
     break;
 
-  case 120: /* attribute: tENTRY '(' expr_const ')'  */
-#line 573 "tools/widl/parser.y"
+  case 123: /* attribute: tENTRY '(' expr_const ')'  */
+#line 572 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attrp(ATTR_ENTRY, (yyvsp[-1].expr)); }
-#line 3939 "tools/widl/parser.tab.c"
+#line 4014 "tools/widl/parser.tab.c"
     break;
 
-  case 121: /* attribute: tEXCLUSIVETO '(' decl_spec ')'  */
+  case 124: /* attribute: tEVENTADD  */
+#line 573 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attr(ATTR_EVENTADD); }
+#line 4020 "tools/widl/parser.tab.c"
+    break;
+
+  case 125: /* attribute: tEVENTREMOVE  */
 #line 574 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attr(ATTR_EVENTREMOVE); }
+#line 4026 "tools/widl/parser.tab.c"
+    break;
+
+  case 126: /* attribute: tEXCLUSIVETO '(' decl_spec ')'  */
+#line 575 "tools/widl/parser.y"
                                                 { if ((yyvsp[-1].declspec)->type->type_type != TYPE_RUNTIMECLASS)
 						      error_loc("type %s is not a runtimeclass\n", (yyvsp[-1].declspec)->type->name);
 						  (yyval.attr) = make_attrp(ATTR_EXCLUSIVETO, (yyvsp[-1].declspec)->type); }
-#line 3947 "tools/widl/parser.tab.c"
+#line 4034 "tools/widl/parser.tab.c"
     break;
 
-  case 122: /* attribute: tEXPLICITHANDLE  */
-#line 577 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_EXPLICIT_HANDLE); }
-#line 3953 "tools/widl/parser.tab.c"
-    break;
-
-  case 123: /* attribute: tFAULTSTATUS  */
+  case 127: /* attribute: tEXPLICITHANDLE  */
 #line 578 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_FAULTSTATUS); }
-#line 3959 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_EXPLICIT_HANDLE); }
+#line 4040 "tools/widl/parser.tab.c"
     break;
 
-  case 124: /* attribute: tFORCEALLOCATE  */
+  case 128: /* attribute: tFAULTSTATUS  */
 #line 579 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_FORCEALLOCATE); }
-#line 3965 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_FAULTSTATUS); }
+#line 4046 "tools/widl/parser.tab.c"
     break;
 
-  case 125: /* attribute: tHANDLE  */
+  case 129: /* attribute: tFLAGS  */
 #line 580 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_HANDLE); }
-#line 3971 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_FLAGS); }
+#line 4052 "tools/widl/parser.tab.c"
     break;
 
-  case 126: /* attribute: tHELPCONTEXT '(' expr_int_const ')'  */
+  case 130: /* attribute: tFORCEALLOCATE  */
 #line 581 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_HELPCONTEXT, (yyvsp[-1].expr)); }
-#line 3977 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_FORCEALLOCATE); }
+#line 4058 "tools/widl/parser.tab.c"
     break;
 
-  case 127: /* attribute: tHELPFILE '(' aSTRING ')'  */
+  case 131: /* attribute: tHANDLE  */
 #line 582 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_HELPFILE, (yyvsp[-1].str)); }
-#line 3983 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_HANDLE); }
+#line 4064 "tools/widl/parser.tab.c"
     break;
 
-  case 128: /* attribute: tHELPSTRING '(' aSTRING ')'  */
+  case 132: /* attribute: tHELPCONTEXT '(' expr_int_const ')'  */
 #line 583 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_HELPSTRING, (yyvsp[-1].str)); }
-#line 3989 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrp(ATTR_HELPCONTEXT, (yyvsp[-1].expr)); }
+#line 4070 "tools/widl/parser.tab.c"
     break;
 
-  case 129: /* attribute: tHELPSTRINGCONTEXT '(' expr_int_const ')'  */
+  case 133: /* attribute: tHELPFILE '(' aSTRING ')'  */
 #line 584 "tools/widl/parser.y"
-                                                        { (yyval.attr) = make_attrp(ATTR_HELPSTRINGCONTEXT, (yyvsp[-1].expr)); }
-#line 3995 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrp(ATTR_HELPFILE, (yyvsp[-1].str)); }
+#line 4076 "tools/widl/parser.tab.c"
     break;
 
-  case 130: /* attribute: tHELPSTRINGDLL '(' aSTRING ')'  */
+  case 134: /* attribute: tHELPSTRING '(' aSTRING ')'  */
 #line 585 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_HELPSTRINGDLL, (yyvsp[-1].str)); }
-#line 4001 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrp(ATTR_HELPSTRING, (yyvsp[-1].str)); }
+#line 4082 "tools/widl/parser.tab.c"
     break;
 
-  case 131: /* attribute: tHIDDEN  */
+  case 135: /* attribute: tHELPSTRINGCONTEXT '(' expr_int_const ')'  */
 #line 586 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_HIDDEN); }
-#line 4007 "tools/widl/parser.tab.c"
+                                                        { (yyval.attr) = make_attrp(ATTR_HELPSTRINGCONTEXT, (yyvsp[-1].expr)); }
+#line 4088 "tools/widl/parser.tab.c"
     break;
 
-  case 132: /* attribute: tID '(' expr_int_const ')'  */
+  case 136: /* attribute: tHELPSTRINGDLL '(' aSTRING ')'  */
 #line 587 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_ID, (yyvsp[-1].expr)); }
-#line 4013 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrp(ATTR_HELPSTRINGDLL, (yyvsp[-1].str)); }
+#line 4094 "tools/widl/parser.tab.c"
     break;
 
-  case 133: /* attribute: tIDEMPOTENT  */
+  case 137: /* attribute: tHIDDEN  */
 #line 588 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_IDEMPOTENT); }
-#line 4019 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_HIDDEN); }
+#line 4100 "tools/widl/parser.tab.c"
     break;
 
-  case 134: /* attribute: tIGNORE  */
+  case 138: /* attribute: tID '(' expr_int_const ')'  */
 #line 589 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_IGNORE); }
-#line 4025 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrp(ATTR_ID, (yyvsp[-1].expr)); }
+#line 4106 "tools/widl/parser.tab.c"
     break;
 
-  case 135: /* attribute: tIIDIS '(' expr ')'  */
+  case 139: /* attribute: tIDEMPOTENT  */
 #line 590 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_IIDIS, (yyvsp[-1].expr)); }
-#line 4031 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_IDEMPOTENT); }
+#line 4112 "tools/widl/parser.tab.c"
     break;
 
-  case 136: /* attribute: tIMMEDIATEBIND  */
+  case 140: /* attribute: tIGNORE  */
 #line 591 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_IMMEDIATEBIND); }
-#line 4037 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_IGNORE); }
+#line 4118 "tools/widl/parser.tab.c"
     break;
 
-  case 137: /* attribute: tIMPLICITHANDLE '(' arg ')'  */
+  case 141: /* attribute: tIIDIS '(' expr ')'  */
 #line 592 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_IMPLICIT_HANDLE, (yyvsp[-1].var)); }
-#line 4043 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrp(ATTR_IIDIS, (yyvsp[-1].expr)); }
+#line 4124 "tools/widl/parser.tab.c"
     break;
 
-  case 138: /* attribute: tIN  */
+  case 142: /* attribute: tIMMEDIATEBIND  */
 #line 593 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_IN); }
-#line 4049 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_IMMEDIATEBIND); }
+#line 4130 "tools/widl/parser.tab.c"
     break;
 
-  case 139: /* attribute: tINPUTSYNC  */
+  case 143: /* attribute: tIMPLICITHANDLE '(' arg ')'  */
 #line 594 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_INPUTSYNC); }
-#line 4055 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrp(ATTR_IMPLICIT_HANDLE, (yyvsp[-1].var)); }
+#line 4136 "tools/widl/parser.tab.c"
     break;
 
-  case 140: /* attribute: tLENGTHIS '(' m_exprs ')'  */
+  case 144: /* attribute: tIN  */
 #line 595 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_LENGTHIS, (yyvsp[-1].expr_list)); }
-#line 4061 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_IN); }
+#line 4142 "tools/widl/parser.tab.c"
     break;
 
-  case 141: /* attribute: tLCID '(' expr_int_const ')'  */
+  case 145: /* attribute: tINPUTSYNC  */
 #line 596 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_LIBLCID, (yyvsp[-1].expr)); }
-#line 4067 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_INPUTSYNC); }
+#line 4148 "tools/widl/parser.tab.c"
     break;
 
-  case 142: /* attribute: tLCID  */
+  case 146: /* attribute: tLENGTHIS '(' m_exprs ')'  */
 #line 597 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_PARAMLCID); }
-#line 4073 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrp(ATTR_LENGTHIS, (yyvsp[-1].expr_list)); }
+#line 4154 "tools/widl/parser.tab.c"
     break;
 
-  case 143: /* attribute: tLICENSED  */
+  case 147: /* attribute: tLCID '(' expr_int_const ')'  */
 #line 598 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_LICENSED); }
-#line 4079 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrp(ATTR_LIBLCID, (yyvsp[-1].expr)); }
+#line 4160 "tools/widl/parser.tab.c"
     break;
 
-  case 144: /* attribute: tLOCAL  */
+  case 148: /* attribute: tLCID  */
 #line 599 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_LOCAL); }
-#line 4085 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_PARAMLCID); }
+#line 4166 "tools/widl/parser.tab.c"
     break;
 
-  case 145: /* attribute: tMARSHALINGBEHAVIOR '(' marshaling_behavior ')'  */
+  case 149: /* attribute: tLICENSED  */
+#line 600 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attr(ATTR_LICENSED); }
+#line 4172 "tools/widl/parser.tab.c"
+    break;
+
+  case 150: /* attribute: tLOCAL  */
 #line 601 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrv(ATTR_MARSHALING_BEHAVIOR, (yyvsp[-1].num)); }
-#line 4091 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_LOCAL); }
+#line 4178 "tools/widl/parser.tab.c"
     break;
 
-  case 146: /* attribute: tMAYBE  */
-#line 602 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_MAYBE); }
-#line 4097 "tools/widl/parser.tab.c"
-    break;
-
-  case 147: /* attribute: tMESSAGE  */
+  case 151: /* attribute: tMARSHALINGBEHAVIOR '(' marshaling_behavior ')'  */
 #line 603 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_MESSAGE); }
-#line 4103 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrv(ATTR_MARSHALING_BEHAVIOR, (yyvsp[-1].num)); }
+#line 4184 "tools/widl/parser.tab.c"
     break;
 
-  case 148: /* attribute: tNOCODE  */
+  case 152: /* attribute: tMAYBE  */
 #line 604 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_NOCODE); }
-#line 4109 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_MAYBE); }
+#line 4190 "tools/widl/parser.tab.c"
     break;
 
-  case 149: /* attribute: tNONBROWSABLE  */
+  case 153: /* attribute: tMESSAGE  */
 #line 605 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_NONBROWSABLE); }
-#line 4115 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_MESSAGE); }
+#line 4196 "tools/widl/parser.tab.c"
     break;
 
-  case 150: /* attribute: tNONCREATABLE  */
+  case 154: /* attribute: tNOCODE  */
 #line 606 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_NONCREATABLE); }
-#line 4121 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_NOCODE); }
+#line 4202 "tools/widl/parser.tab.c"
     break;
 
-  case 151: /* attribute: tNONEXTENSIBLE  */
+  case 155: /* attribute: tNONBROWSABLE  */
 #line 607 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_NONEXTENSIBLE); }
-#line 4127 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_NONBROWSABLE); }
+#line 4208 "tools/widl/parser.tab.c"
     break;
 
-  case 152: /* attribute: tNOTIFY  */
+  case 156: /* attribute: tNONCREATABLE  */
 #line 608 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_NOTIFY); }
-#line 4133 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_NONCREATABLE); }
+#line 4214 "tools/widl/parser.tab.c"
     break;
 
-  case 153: /* attribute: tNOTIFYFLAG  */
+  case 157: /* attribute: tNONEXTENSIBLE  */
 #line 609 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_NOTIFYFLAG); }
-#line 4139 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_NONEXTENSIBLE); }
+#line 4220 "tools/widl/parser.tab.c"
     break;
 
-  case 154: /* attribute: tOBJECT  */
+  case 158: /* attribute: tNOTIFY  */
 #line 610 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_OBJECT); }
-#line 4145 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_NOTIFY); }
+#line 4226 "tools/widl/parser.tab.c"
     break;
 
-  case 155: /* attribute: tODL  */
+  case 159: /* attribute: tNOTIFYFLAG  */
 #line 611 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_ODL); }
-#line 4151 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_NOTIFYFLAG); }
+#line 4232 "tools/widl/parser.tab.c"
     break;
 
-  case 156: /* attribute: tOLEAUTOMATION  */
+  case 160: /* attribute: tOBJECT  */
 #line 612 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_OLEAUTOMATION); }
-#line 4157 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_OBJECT); }
+#line 4238 "tools/widl/parser.tab.c"
     break;
 
-  case 157: /* attribute: tOPTIMIZE '(' aSTRING ')'  */
+  case 161: /* attribute: tODL  */
 #line 613 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_OPTIMIZE, (yyvsp[-1].str)); }
-#line 4163 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_ODL); }
+#line 4244 "tools/widl/parser.tab.c"
     break;
 
-  case 158: /* attribute: tOPTIONAL  */
+  case 162: /* attribute: tOLEAUTOMATION  */
 #line 614 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_OPTIONAL); }
-#line 4169 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_OLEAUTOMATION); }
+#line 4250 "tools/widl/parser.tab.c"
     break;
 
-  case 159: /* attribute: tOUT  */
+  case 163: /* attribute: tOPTIMIZE '(' aSTRING ')'  */
 #line 615 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_OUT); }
-#line 4175 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrp(ATTR_OPTIMIZE, (yyvsp[-1].str)); }
+#line 4256 "tools/widl/parser.tab.c"
     break;
 
-  case 160: /* attribute: tPARTIALIGNORE  */
+  case 164: /* attribute: tOPTIONAL  */
 #line 616 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_PARTIALIGNORE); }
-#line 4181 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_OPTIONAL); }
+#line 4262 "tools/widl/parser.tab.c"
     break;
 
-  case 161: /* attribute: tPOINTERDEFAULT '(' pointer_type ')'  */
+  case 165: /* attribute: tOUT  */
 #line 617 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrv(ATTR_POINTERDEFAULT, (yyvsp[-1].num)); }
-#line 4187 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_OUT); }
+#line 4268 "tools/widl/parser.tab.c"
     break;
 
-  case 162: /* attribute: tPROGID '(' aSTRING ')'  */
+  case 166: /* attribute: tPARTIALIGNORE  */
 #line 618 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_PROGID, (yyvsp[-1].str)); }
-#line 4193 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_PARTIALIGNORE); }
+#line 4274 "tools/widl/parser.tab.c"
     break;
 
-  case 163: /* attribute: tPROPGET  */
+  case 167: /* attribute: tPOINTERDEFAULT '(' pointer_type ')'  */
 #line 619 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_PROPGET); }
-#line 4199 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrv(ATTR_POINTERDEFAULT, (yyvsp[-1].num)); }
+#line 4280 "tools/widl/parser.tab.c"
     break;
 
-  case 164: /* attribute: tPROPPUT  */
+  case 168: /* attribute: tPROGID '(' aSTRING ')'  */
 #line 620 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_PROPPUT); }
-#line 4205 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrp(ATTR_PROGID, (yyvsp[-1].str)); }
+#line 4286 "tools/widl/parser.tab.c"
     break;
 
-  case 165: /* attribute: tPROPPUTREF  */
+  case 169: /* attribute: tPROPGET  */
 #line 621 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_PROPPUTREF); }
-#line 4211 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_PROPGET); }
+#line 4292 "tools/widl/parser.tab.c"
     break;
 
-  case 166: /* attribute: tPROXY  */
+  case 170: /* attribute: tPROPPUT  */
 #line 622 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_PROXY); }
-#line 4217 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_PROPPUT); }
+#line 4298 "tools/widl/parser.tab.c"
     break;
 
-  case 167: /* attribute: tPUBLIC  */
+  case 171: /* attribute: tPROPPUTREF  */
 #line 623 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_PUBLIC); }
-#line 4223 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_PROPPUTREF); }
+#line 4304 "tools/widl/parser.tab.c"
     break;
 
-  case 168: /* attribute: tRANGE '(' expr_int_const ',' expr_int_const ')'  */
+  case 172: /* attribute: tPROXY  */
+#line 624 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attr(ATTR_PROXY); }
+#line 4310 "tools/widl/parser.tab.c"
+    break;
+
+  case 173: /* attribute: tPUBLIC  */
 #line 625 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attr(ATTR_PUBLIC); }
+#line 4316 "tools/widl/parser.tab.c"
+    break;
+
+  case 174: /* attribute: tRANGE '(' expr_int_const ',' expr_int_const ')'  */
+#line 627 "tools/widl/parser.y"
                                                 { expr_list_t *list = append_expr( NULL, (yyvsp[-3].expr) );
 						  list = append_expr( list, (yyvsp[-1].expr) );
 						  (yyval.attr) = make_attrp(ATTR_RANGE, list); }
-#line 4231 "tools/widl/parser.tab.c"
+#line 4324 "tools/widl/parser.tab.c"
     break;
 
-  case 169: /* attribute: tREADONLY  */
-#line 628 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_READONLY); }
-#line 4237 "tools/widl/parser.tab.c"
-    break;
-
-  case 170: /* attribute: tREPRESENTAS '(' type ')'  */
-#line 629 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_REPRESENTAS, (yyvsp[-1].type)); }
-#line 4243 "tools/widl/parser.tab.c"
-    break;
-
-  case 171: /* attribute: tREQUESTEDIT  */
+  case 175: /* attribute: tREADONLY  */
 #line 630 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_REQUESTEDIT); }
-#line 4249 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_READONLY); }
+#line 4330 "tools/widl/parser.tab.c"
     break;
 
-  case 172: /* attribute: tRESTRICTED  */
+  case 176: /* attribute: tREPRESENTAS '(' type ')'  */
 #line 631 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_RESTRICTED); }
-#line 4255 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrp(ATTR_REPRESENTAS, (yyvsp[-1].type)); }
+#line 4336 "tools/widl/parser.tab.c"
     break;
 
-  case 173: /* attribute: tRETVAL  */
+  case 177: /* attribute: tREQUESTEDIT  */
 #line 632 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_RETVAL); }
-#line 4261 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_REQUESTEDIT); }
+#line 4342 "tools/widl/parser.tab.c"
     break;
 
-  case 174: /* attribute: tSIZEIS '(' m_exprs ')'  */
+  case 178: /* attribute: tRESTRICTED  */
 #line 633 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_SIZEIS, (yyvsp[-1].expr_list)); }
-#line 4267 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_RESTRICTED); }
+#line 4348 "tools/widl/parser.tab.c"
     break;
 
-  case 175: /* attribute: tSOURCE  */
+  case 179: /* attribute: tRETVAL  */
 #line 634 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_SOURCE); }
-#line 4273 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_RETVAL); }
+#line 4354 "tools/widl/parser.tab.c"
     break;
 
-  case 176: /* attribute: tSTRICTCONTEXTHANDLE  */
+  case 180: /* attribute: tSIZEIS '(' m_exprs ')'  */
 #line 635 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_STRICTCONTEXTHANDLE); }
-#line 4279 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrp(ATTR_SIZEIS, (yyvsp[-1].expr_list)); }
+#line 4360 "tools/widl/parser.tab.c"
     break;
 
-  case 177: /* attribute: tSTRING  */
+  case 181: /* attribute: tSOURCE  */
 #line 636 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_STRING); }
-#line 4285 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_SOURCE); }
+#line 4366 "tools/widl/parser.tab.c"
     break;
 
-  case 178: /* attribute: tSWITCHIS '(' expr ')'  */
+  case 182: /* attribute: tSTRICTCONTEXTHANDLE  */
 #line 637 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_SWITCHIS, (yyvsp[-1].expr)); }
-#line 4291 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_STRICTCONTEXTHANDLE); }
+#line 4372 "tools/widl/parser.tab.c"
     break;
 
-  case 179: /* attribute: tSWITCHTYPE '(' type ')'  */
+  case 183: /* attribute: tSTRING  */
 #line 638 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_SWITCHTYPE, (yyvsp[-1].type)); }
-#line 4297 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_STRING); }
+#line 4378 "tools/widl/parser.tab.c"
     break;
 
-  case 180: /* attribute: tTRANSMITAS '(' type ')'  */
+  case 184: /* attribute: tSWITCHIS '(' expr ')'  */
 #line 639 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_TRANSMITAS, (yyvsp[-1].type)); }
-#line 4303 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrp(ATTR_SWITCHIS, (yyvsp[-1].expr)); }
+#line 4384 "tools/widl/parser.tab.c"
     break;
 
-  case 181: /* attribute: tTHREADING '(' threading_type ')'  */
+  case 185: /* attribute: tSWITCHTYPE '(' type ')'  */
 #line 640 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrv(ATTR_THREADING, (yyvsp[-1].num)); }
-#line 4309 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrp(ATTR_SWITCHTYPE, (yyvsp[-1].type)); }
+#line 4390 "tools/widl/parser.tab.c"
     break;
 
-  case 182: /* attribute: tUIDEFAULT  */
+  case 186: /* attribute: tTRANSMITAS '(' type ')'  */
 #line 641 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_UIDEFAULT); }
-#line 4315 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrp(ATTR_TRANSMITAS, (yyvsp[-1].type)); }
+#line 4396 "tools/widl/parser.tab.c"
     break;
 
-  case 183: /* attribute: tUSESGETLASTERROR  */
+  case 187: /* attribute: tTHREADING '(' threading_type ')'  */
 #line 642 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_USESGETLASTERROR); }
-#line 4321 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrv(ATTR_THREADING, (yyvsp[-1].num)); }
+#line 4402 "tools/widl/parser.tab.c"
     break;
 
-  case 184: /* attribute: tUSERMARSHAL '(' type ')'  */
+  case 188: /* attribute: tUIDEFAULT  */
 #line 643 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_USERMARSHAL, (yyvsp[-1].type)); }
-#line 4327 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_UIDEFAULT); }
+#line 4408 "tools/widl/parser.tab.c"
     break;
 
-  case 185: /* attribute: tUUID '(' uuid_string ')'  */
+  case 189: /* attribute: tUSESGETLASTERROR  */
 #line 644 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_UUID, (yyvsp[-1].uuid)); }
-#line 4333 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_USESGETLASTERROR); }
+#line 4414 "tools/widl/parser.tab.c"
     break;
 
-  case 186: /* attribute: tASYNCUUID '(' uuid_string ')'  */
+  case 190: /* attribute: tUSERMARSHAL '(' type ')'  */
 #line 645 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_ASYNCUUID, (yyvsp[-1].uuid)); }
-#line 4339 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrp(ATTR_USERMARSHAL, (yyvsp[-1].type)); }
+#line 4420 "tools/widl/parser.tab.c"
     break;
 
-  case 187: /* attribute: tV1ENUM  */
+  case 191: /* attribute: tUUID '(' uuid_string ')'  */
 #line 646 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_V1ENUM); }
-#line 4345 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrp(ATTR_UUID, (yyvsp[-1].uuid)); }
+#line 4426 "tools/widl/parser.tab.c"
     break;
 
-  case 188: /* attribute: tVARARG  */
+  case 192: /* attribute: tASYNCUUID '(' uuid_string ')'  */
 #line 647 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_VARARG); }
-#line 4351 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrp(ATTR_ASYNCUUID, (yyvsp[-1].uuid)); }
+#line 4432 "tools/widl/parser.tab.c"
     break;
 
-  case 189: /* attribute: tVERSION '(' version ')'  */
+  case 193: /* attribute: tV1ENUM  */
 #line 648 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrv(ATTR_VERSION, (yyvsp[-1].num)); }
-#line 4357 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_V1ENUM); }
+#line 4438 "tools/widl/parser.tab.c"
     break;
 
-  case 190: /* attribute: tVIPROGID '(' aSTRING ')'  */
+  case 194: /* attribute: tVARARG  */
 #line 649 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_VIPROGID, (yyvsp[-1].str)); }
-#line 4363 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_VARARG); }
+#line 4444 "tools/widl/parser.tab.c"
     break;
 
-  case 191: /* attribute: tWIREMARSHAL '(' type ')'  */
+  case 195: /* attribute: tVERSION '(' version ')'  */
 #line 650 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_WIREMARSHAL, (yyvsp[-1].type)); }
-#line 4369 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrv(ATTR_VERSION, (yyvsp[-1].num)); }
+#line 4450 "tools/widl/parser.tab.c"
     break;
 
-  case 192: /* attribute: pointer_type  */
+  case 196: /* attribute: tVIPROGID '(' aSTRING ')'  */
 #line 651 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrv(ATTR_POINTERTYPE, (yyvsp[0].num)); }
-#line 4375 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrp(ATTR_VIPROGID, (yyvsp[-1].str)); }
+#line 4456 "tools/widl/parser.tab.c"
     break;
 
-  case 194: /* uuid_string: aSTRING  */
-#line 656 "tools/widl/parser.y"
+  case 197: /* attribute: tWIREMARSHAL '(' type ')'  */
+#line 652 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attrp(ATTR_WIREMARSHAL, (yyvsp[-1].type)); }
+#line 4462 "tools/widl/parser.tab.c"
+    break;
+
+  case 198: /* attribute: pointer_type  */
+#line 653 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attrv(ATTR_POINTERTYPE, (yyvsp[0].num)); }
+#line 4468 "tools/widl/parser.tab.c"
+    break;
+
+  case 200: /* uuid_string: aSTRING  */
+#line 658 "tools/widl/parser.y"
                                                 { if (!is_valid_uuid((yyvsp[0].str)))
 						    error_loc("invalid UUID: %s\n", (yyvsp[0].str));
 						  (yyval.uuid) = parse_uuid((yyvsp[0].str)); }
-#line 4383 "tools/widl/parser.tab.c"
+#line 4476 "tools/widl/parser.tab.c"
     break;
 
-  case 195: /* callconv: tCDECL  */
-#line 661 "tools/widl/parser.y"
-                                                { (yyval.str) = xstrdup("__cdecl"); }
-#line 4389 "tools/widl/parser.tab.c"
-    break;
-
-  case 196: /* callconv: tFASTCALL  */
-#line 662 "tools/widl/parser.y"
-                                                { (yyval.str) = xstrdup("__fastcall"); }
-#line 4395 "tools/widl/parser.tab.c"
-    break;
-
-  case 197: /* callconv: tPASCAL  */
+  case 201: /* callconv: tCDECL  */
 #line 663 "tools/widl/parser.y"
-                                                { (yyval.str) = xstrdup("__pascal"); }
-#line 4401 "tools/widl/parser.tab.c"
+                                                { (yyval.str) = xstrdup("__cdecl"); }
+#line 4482 "tools/widl/parser.tab.c"
     break;
 
-  case 198: /* callconv: tSTDCALL  */
+  case 202: /* callconv: tFASTCALL  */
 #line 664 "tools/widl/parser.y"
+                                                { (yyval.str) = xstrdup("__fastcall"); }
+#line 4488 "tools/widl/parser.tab.c"
+    break;
+
+  case 203: /* callconv: tPASCAL  */
+#line 665 "tools/widl/parser.y"
+                                                { (yyval.str) = xstrdup("__pascal"); }
+#line 4494 "tools/widl/parser.tab.c"
+    break;
+
+  case 204: /* callconv: tSTDCALL  */
+#line 666 "tools/widl/parser.y"
                                                 { (yyval.str) = xstrdup("__stdcall"); }
-#line 4407 "tools/widl/parser.tab.c"
+#line 4500 "tools/widl/parser.tab.c"
     break;
 
-  case 199: /* cases: %empty  */
-#line 667 "tools/widl/parser.y"
+  case 205: /* cases: %empty  */
+#line 669 "tools/widl/parser.y"
                                                 { (yyval.var_list) = NULL; }
-#line 4413 "tools/widl/parser.tab.c"
+#line 4506 "tools/widl/parser.tab.c"
     break;
 
-  case 200: /* cases: cases case  */
-#line 668 "tools/widl/parser.y"
+  case 206: /* cases: cases case  */
+#line 670 "tools/widl/parser.y"
                                                 { (yyval.var_list) = append_var( (yyvsp[-1].var_list), (yyvsp[0].var) ); }
-#line 4419 "tools/widl/parser.tab.c"
+#line 4512 "tools/widl/parser.tab.c"
     break;
 
-  case 201: /* case: tCASE expr_int_const ':' union_field  */
-#line 671 "tools/widl/parser.y"
+  case 207: /* case: tCASE expr_int_const ':' union_field  */
+#line 673 "tools/widl/parser.y"
                                                 { attr_t *a = make_attrp(ATTR_CASE, append_expr( NULL, (yyvsp[-2].expr) ));
 						  (yyval.var) = (yyvsp[0].var); if (!(yyval.var)) (yyval.var) = make_var(NULL);
 						  (yyval.var)->attrs = append_attr( (yyval.var)->attrs, a );
 						}
-#line 4428 "tools/widl/parser.tab.c"
+#line 4521 "tools/widl/parser.tab.c"
     break;
 
-  case 202: /* case: tDEFAULT ':' union_field  */
-#line 675 "tools/widl/parser.y"
+  case 208: /* case: tDEFAULT ':' union_field  */
+#line 677 "tools/widl/parser.y"
                                                 { attr_t *a = make_attr(ATTR_DEFAULT);
 						  (yyval.var) = (yyvsp[0].var); if (!(yyval.var)) (yyval.var) = make_var(NULL);
 						  (yyval.var)->attrs = append_attr( (yyval.var)->attrs, a );
 						}
-#line 4437 "tools/widl/parser.tab.c"
+#line 4530 "tools/widl/parser.tab.c"
     break;
 
-  case 203: /* enums: %empty  */
-#line 681 "tools/widl/parser.y"
+  case 209: /* enums: %empty  */
+#line 683 "tools/widl/parser.y"
                                                 { (yyval.var_list) = NULL; }
-#line 4443 "tools/widl/parser.tab.c"
+#line 4536 "tools/widl/parser.tab.c"
     break;
 
-  case 204: /* enums: enum_list ','  */
-#line 682 "tools/widl/parser.y"
+  case 210: /* enums: enum_list ','  */
+#line 684 "tools/widl/parser.y"
                                                 { (yyval.var_list) = (yyvsp[-1].var_list); }
-#line 4449 "tools/widl/parser.tab.c"
+#line 4542 "tools/widl/parser.tab.c"
     break;
 
-  case 206: /* enum_list: enum  */
-#line 686 "tools/widl/parser.y"
+  case 212: /* enum_list: enum  */
+#line 688 "tools/widl/parser.y"
                                                 { if (!(yyvsp[0].var)->eval)
 						    (yyvsp[0].var)->eval = make_exprl(EXPR_NUM, 0 /* default for first enum entry */);
                                                   (yyval.var_list) = append_var( NULL, (yyvsp[0].var) );
 						}
-#line 4458 "tools/widl/parser.tab.c"
+#line 4551 "tools/widl/parser.tab.c"
     break;
 
-  case 207: /* enum_list: enum_list ',' enum  */
-#line 690 "tools/widl/parser.y"
+  case 213: /* enum_list: enum_list ',' enum  */
+#line 692 "tools/widl/parser.y"
                                                 { if (!(yyvsp[0].var)->eval)
                                                   {
                                                     var_t *last = LIST_ENTRY( list_tail((yyval.var_list)), var_t, entry );
@@ -4469,1463 +4562,1356 @@
                                                   }
                                                   (yyval.var_list) = append_var( (yyvsp[-2].var_list), (yyvsp[0].var) );
 						}
-#line 4473 "tools/widl/parser.tab.c"
+#line 4566 "tools/widl/parser.tab.c"
     break;
 
-  case 208: /* enum_member: m_attributes ident  */
-#line 702 "tools/widl/parser.y"
+  case 214: /* enum_member: m_attributes ident  */
+#line 704 "tools/widl/parser.y"
                                                 { (yyval.var) = (yyvsp[0].var);
 						  (yyval.var)->attrs = check_enum_member_attrs((yyvsp[-1].attr_list));
 						}
-#line 4481 "tools/widl/parser.tab.c"
+#line 4574 "tools/widl/parser.tab.c"
     break;
 
-  case 209: /* enum: enum_member '=' expr_int_const  */
-#line 707 "tools/widl/parser.y"
+  case 215: /* enum: enum_member '=' expr_int_const  */
+#line 709 "tools/widl/parser.y"
                                                 { (yyval.var) = reg_const((yyvsp[-2].var));
 						  (yyval.var)->eval = (yyvsp[0].expr);
                                                   (yyval.var)->declspec.type = type_new_int(TYPE_BASIC_INT, 0);
 						}
-#line 4490 "tools/widl/parser.tab.c"
+#line 4583 "tools/widl/parser.tab.c"
     break;
 
-  case 210: /* enum: enum_member  */
-#line 711 "tools/widl/parser.y"
+  case 216: /* enum: enum_member  */
+#line 713 "tools/widl/parser.y"
                                                 { (yyval.var) = reg_const((yyvsp[0].var));
                                                   (yyval.var)->declspec.type = type_new_int(TYPE_BASIC_INT, 0);
 						}
-#line 4498 "tools/widl/parser.tab.c"
+#line 4591 "tools/widl/parser.tab.c"
     break;
 
-  case 211: /* enumdef: tENUM t_ident '{' enums '}'  */
-#line 716 "tools/widl/parser.y"
+  case 217: /* enumdef: tENUM m_typename '{' enums '}'  */
+#line 718 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_enum((yyvsp[-3].str), current_namespace, TRUE, (yyvsp[-1].var_list)); }
-#line 4504 "tools/widl/parser.tab.c"
+#line 4597 "tools/widl/parser.tab.c"
     break;
 
-  case 212: /* m_exprs: m_expr  */
-#line 719 "tools/widl/parser.y"
+  case 218: /* m_exprs: m_expr  */
+#line 721 "tools/widl/parser.y"
                                                 { (yyval.expr_list) = append_expr( NULL, (yyvsp[0].expr) ); }
-#line 4510 "tools/widl/parser.tab.c"
+#line 4603 "tools/widl/parser.tab.c"
     break;
 
-  case 213: /* m_exprs: m_exprs ',' m_expr  */
-#line 720 "tools/widl/parser.y"
+  case 219: /* m_exprs: m_exprs ',' m_expr  */
+#line 722 "tools/widl/parser.y"
                                                 { (yyval.expr_list) = append_expr( (yyvsp[-2].expr_list), (yyvsp[0].expr) ); }
-#line 4516 "tools/widl/parser.tab.c"
+#line 4609 "tools/widl/parser.tab.c"
     break;
 
-  case 214: /* m_expr: %empty  */
-#line 723 "tools/widl/parser.y"
+  case 220: /* m_expr: %empty  */
+#line 725 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr(EXPR_VOID); }
-#line 4522 "tools/widl/parser.tab.c"
+#line 4615 "tools/widl/parser.tab.c"
     break;
 
-  case 216: /* expr: aNUM  */
-#line 727 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_exprl(EXPR_NUM, (yyvsp[0].num)); }
-#line 4528 "tools/widl/parser.tab.c"
-    break;
-
-  case 217: /* expr: aHEXNUM  */
-#line 728 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_exprl(EXPR_HEXNUM, (yyvsp[0].num)); }
-#line 4534 "tools/widl/parser.tab.c"
-    break;
-
-  case 218: /* expr: aDOUBLE  */
+  case 222: /* expr: aNUM  */
 #line 729 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_exprd(EXPR_DOUBLE, (yyvsp[0].dbl)); }
-#line 4540 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_exprl(EXPR_NUM, (yyvsp[0].num)); }
+#line 4621 "tools/widl/parser.tab.c"
     break;
 
-  case 219: /* expr: tFALSE  */
+  case 223: /* expr: aHEXNUM  */
 #line 730 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_exprl(EXPR_TRUEFALSE, 0); }
-#line 4546 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_exprl(EXPR_HEXNUM, (yyvsp[0].num)); }
+#line 4627 "tools/widl/parser.tab.c"
     break;
 
-  case 220: /* expr: tNULL  */
+  case 224: /* expr: aDOUBLE  */
 #line 731 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_exprl(EXPR_NUM, 0); }
-#line 4552 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_exprd(EXPR_DOUBLE, (yyvsp[0].dbl)); }
+#line 4633 "tools/widl/parser.tab.c"
     break;
 
-  case 221: /* expr: tTRUE  */
+  case 225: /* expr: tFALSE  */
 #line 732 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_exprl(EXPR_TRUEFALSE, 1); }
-#line 4558 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_exprl(EXPR_TRUEFALSE, 0); }
+#line 4639 "tools/widl/parser.tab.c"
     break;
 
-  case 222: /* expr: aSTRING  */
+  case 226: /* expr: tNULL  */
 #line 733 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_exprs(EXPR_STRLIT, (yyvsp[0].str)); }
-#line 4564 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_exprl(EXPR_NUM, 0); }
+#line 4645 "tools/widl/parser.tab.c"
     break;
 
-  case 223: /* expr: aWSTRING  */
+  case 227: /* expr: tTRUE  */
 #line 734 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_exprs(EXPR_WSTRLIT, (yyvsp[0].str)); }
-#line 4570 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_exprl(EXPR_TRUEFALSE, 1); }
+#line 4651 "tools/widl/parser.tab.c"
     break;
 
-  case 224: /* expr: aSQSTRING  */
+  case 228: /* expr: aSTRING  */
 #line 735 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_exprs(EXPR_CHARCONST, (yyvsp[0].str)); }
-#line 4576 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_exprs(EXPR_STRLIT, (yyvsp[0].str)); }
+#line 4657 "tools/widl/parser.tab.c"
     break;
 
-  case 225: /* expr: aIDENTIFIER  */
+  case 229: /* expr: aWSTRING  */
 #line 736 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_exprs(EXPR_IDENTIFIER, (yyvsp[0].str)); }
-#line 4582 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_exprs(EXPR_WSTRLIT, (yyvsp[0].str)); }
+#line 4663 "tools/widl/parser.tab.c"
     break;
 
-  case 226: /* expr: expr '?' expr ':' expr  */
+  case 230: /* expr: aSQSTRING  */
 #line 737 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr3(EXPR_COND, (yyvsp[-4].expr), (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4588 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_exprs(EXPR_CHARCONST, (yyvsp[0].str)); }
+#line 4669 "tools/widl/parser.tab.c"
     break;
 
-  case 227: /* expr: expr LOGICALOR expr  */
+  case 231: /* expr: aIDENTIFIER  */
 #line 738 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_LOGOR, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4594 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_exprs(EXPR_IDENTIFIER, (yyvsp[0].str)); }
+#line 4675 "tools/widl/parser.tab.c"
     break;
 
-  case 228: /* expr: expr LOGICALAND expr  */
+  case 232: /* expr: expr '?' expr ':' expr  */
 #line 739 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_LOGAND, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4600 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_expr3(EXPR_COND, (yyvsp[-4].expr), (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4681 "tools/widl/parser.tab.c"
     break;
 
-  case 229: /* expr: expr '|' expr  */
+  case 233: /* expr: expr LOGICALOR expr  */
 #line 740 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_OR , (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4606 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_expr2(EXPR_LOGOR, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4687 "tools/widl/parser.tab.c"
     break;
 
-  case 230: /* expr: expr '^' expr  */
+  case 234: /* expr: expr LOGICALAND expr  */
 #line 741 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_XOR, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4612 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_expr2(EXPR_LOGAND, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4693 "tools/widl/parser.tab.c"
     break;
 
-  case 231: /* expr: expr '&' expr  */
+  case 235: /* expr: expr '|' expr  */
 #line 742 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_AND, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4618 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_expr2(EXPR_OR , (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4699 "tools/widl/parser.tab.c"
     break;
 
-  case 232: /* expr: expr EQUALITY expr  */
+  case 236: /* expr: expr '^' expr  */
 #line 743 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_EQUALITY, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4624 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_expr2(EXPR_XOR, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4705 "tools/widl/parser.tab.c"
     break;
 
-  case 233: /* expr: expr INEQUALITY expr  */
+  case 237: /* expr: expr '&' expr  */
 #line 744 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_INEQUALITY, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4630 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_expr2(EXPR_AND, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4711 "tools/widl/parser.tab.c"
     break;
 
-  case 234: /* expr: expr '>' expr  */
+  case 238: /* expr: expr EQUALITY expr  */
 #line 745 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_GTR, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4636 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_expr2(EXPR_EQUALITY, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4717 "tools/widl/parser.tab.c"
     break;
 
-  case 235: /* expr: expr '<' expr  */
+  case 239: /* expr: expr INEQUALITY expr  */
 #line 746 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_LESS, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4642 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_expr2(EXPR_INEQUALITY, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4723 "tools/widl/parser.tab.c"
     break;
 
-  case 236: /* expr: expr GREATEREQUAL expr  */
+  case 240: /* expr: expr '>' expr  */
 #line 747 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_GTREQL, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4648 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_expr2(EXPR_GTR, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4729 "tools/widl/parser.tab.c"
     break;
 
-  case 237: /* expr: expr LESSEQUAL expr  */
+  case 241: /* expr: expr '<' expr  */
 #line 748 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_LESSEQL, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4654 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_expr2(EXPR_LESS, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4735 "tools/widl/parser.tab.c"
     break;
 
-  case 238: /* expr: expr SHL expr  */
+  case 242: /* expr: expr GREATEREQUAL expr  */
 #line 749 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_SHL, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4660 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_expr2(EXPR_GTREQL, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4741 "tools/widl/parser.tab.c"
     break;
 
-  case 239: /* expr: expr SHR expr  */
+  case 243: /* expr: expr LESSEQUAL expr  */
 #line 750 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_SHR, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4666 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_expr2(EXPR_LESSEQL, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4747 "tools/widl/parser.tab.c"
     break;
 
-  case 240: /* expr: expr '+' expr  */
+  case 244: /* expr: expr SHL expr  */
 #line 751 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_ADD, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4672 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_expr2(EXPR_SHL, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4753 "tools/widl/parser.tab.c"
     break;
 
-  case 241: /* expr: expr '-' expr  */
+  case 245: /* expr: expr SHR expr  */
 #line 752 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_SUB, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4678 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_expr2(EXPR_SHR, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4759 "tools/widl/parser.tab.c"
     break;
 
-  case 242: /* expr: expr '%' expr  */
+  case 246: /* expr: expr '+' expr  */
 #line 753 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_MOD, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4684 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_expr2(EXPR_ADD, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4765 "tools/widl/parser.tab.c"
     break;
 
-  case 243: /* expr: expr '*' expr  */
+  case 247: /* expr: expr '-' expr  */
 #line 754 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_MUL, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4690 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_expr2(EXPR_SUB, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4771 "tools/widl/parser.tab.c"
     break;
 
-  case 244: /* expr: expr '/' expr  */
+  case 248: /* expr: expr '%' expr  */
 #line 755 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_DIV, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4696 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_expr2(EXPR_MOD, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4777 "tools/widl/parser.tab.c"
     break;
 
-  case 245: /* expr: '!' expr  */
+  case 249: /* expr: expr '*' expr  */
 #line 756 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr1(EXPR_LOGNOT, (yyvsp[0].expr)); }
-#line 4702 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_expr2(EXPR_MUL, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4783 "tools/widl/parser.tab.c"
     break;
 
-  case 246: /* expr: '~' expr  */
+  case 250: /* expr: expr '/' expr  */
 #line 757 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr1(EXPR_NOT, (yyvsp[0].expr)); }
-#line 4708 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_expr2(EXPR_DIV, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4789 "tools/widl/parser.tab.c"
     break;
 
-  case 247: /* expr: '+' expr  */
+  case 251: /* expr: '!' expr  */
 #line 758 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr1(EXPR_POS, (yyvsp[0].expr)); }
-#line 4714 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_expr1(EXPR_LOGNOT, (yyvsp[0].expr)); }
+#line 4795 "tools/widl/parser.tab.c"
     break;
 
-  case 248: /* expr: '-' expr  */
+  case 252: /* expr: '~' expr  */
 #line 759 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr1(EXPR_NEG, (yyvsp[0].expr)); }
-#line 4720 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_expr1(EXPR_NOT, (yyvsp[0].expr)); }
+#line 4801 "tools/widl/parser.tab.c"
     break;
 
-  case 249: /* expr: '&' expr  */
+  case 253: /* expr: '+' expr  */
 #line 760 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr1(EXPR_ADDRESSOF, (yyvsp[0].expr)); }
-#line 4726 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_expr1(EXPR_POS, (yyvsp[0].expr)); }
+#line 4807 "tools/widl/parser.tab.c"
     break;
 
-  case 250: /* expr: '*' expr  */
+  case 254: /* expr: '-' expr  */
 #line 761 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr1(EXPR_PPTR, (yyvsp[0].expr)); }
-#line 4732 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_expr1(EXPR_NEG, (yyvsp[0].expr)); }
+#line 4813 "tools/widl/parser.tab.c"
     break;
 
-  case 251: /* expr: expr MEMBERPTR aIDENTIFIER  */
+  case 255: /* expr: '&' expr  */
 #line 762 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_MEMBER, make_expr1(EXPR_PPTR, (yyvsp[-2].expr)), make_exprs(EXPR_IDENTIFIER, (yyvsp[0].str))); }
-#line 4738 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_expr1(EXPR_ADDRESSOF, (yyvsp[0].expr)); }
+#line 4819 "tools/widl/parser.tab.c"
     break;
 
-  case 252: /* expr: expr '.' aIDENTIFIER  */
+  case 256: /* expr: '*' expr  */
 #line 763 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_MEMBER, (yyvsp[-2].expr), make_exprs(EXPR_IDENTIFIER, (yyvsp[0].str))); }
-#line 4744 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_expr1(EXPR_PPTR, (yyvsp[0].expr)); }
+#line 4825 "tools/widl/parser.tab.c"
     break;
 
-  case 253: /* expr: '(' decl_spec m_abstract_declarator ')' expr  */
+  case 257: /* expr: expr MEMBERPTR aIDENTIFIER  */
+#line 764 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_expr2(EXPR_MEMBER, make_expr1(EXPR_PPTR, (yyvsp[-2].expr)), make_exprs(EXPR_IDENTIFIER, (yyvsp[0].str))); }
+#line 4831 "tools/widl/parser.tab.c"
+    break;
+
+  case 258: /* expr: expr '.' aIDENTIFIER  */
 #line 765 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_exprt(EXPR_CAST, declare_var(NULL, (yyvsp[-3].declspec), (yyvsp[-2].declarator), 0), (yyvsp[0].expr)); free((yyvsp[-3].declspec)); free((yyvsp[-2].declarator)); }
-#line 4750 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_expr2(EXPR_MEMBER, (yyvsp[-2].expr), make_exprs(EXPR_IDENTIFIER, (yyvsp[0].str))); }
+#line 4837 "tools/widl/parser.tab.c"
     break;
 
-  case 254: /* expr: tSIZEOF '(' decl_spec m_abstract_declarator ')'  */
+  case 259: /* expr: '(' decl_spec m_abstract_declarator ')' expr  */
 #line 767 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_exprt(EXPR_SIZEOF, declare_var(NULL, (yyvsp[-2].declspec), (yyvsp[-1].declarator), 0), NULL); free((yyvsp[-2].declspec)); free((yyvsp[-1].declarator)); }
-#line 4756 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_exprt(EXPR_CAST, declare_var(NULL, (yyvsp[-3].declspec), (yyvsp[-2].declarator), 0), (yyvsp[0].expr)); free((yyvsp[-3].declspec)); free((yyvsp[-2].declarator)); }
+#line 4843 "tools/widl/parser.tab.c"
     break;
 
-  case 255: /* expr: expr '[' expr ']'  */
-#line 768 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_ARRAY, (yyvsp[-3].expr), (yyvsp[-1].expr)); }
-#line 4762 "tools/widl/parser.tab.c"
-    break;
-
-  case 256: /* expr: '(' expr ')'  */
+  case 260: /* expr: tSIZEOF '(' decl_spec m_abstract_declarator ')'  */
 #line 769 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_exprt(EXPR_SIZEOF, declare_var(NULL, (yyvsp[-2].declspec), (yyvsp[-1].declarator), 0), NULL); free((yyvsp[-2].declspec)); free((yyvsp[-1].declarator)); }
+#line 4849 "tools/widl/parser.tab.c"
+    break;
+
+  case 261: /* expr: expr '[' expr ']'  */
+#line 770 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_expr2(EXPR_ARRAY, (yyvsp[-3].expr), (yyvsp[-1].expr)); }
+#line 4855 "tools/widl/parser.tab.c"
+    break;
+
+  case 262: /* expr: '(' expr ')'  */
+#line 771 "tools/widl/parser.y"
                                                 { (yyval.expr) = (yyvsp[-1].expr); }
-#line 4768 "tools/widl/parser.tab.c"
+#line 4861 "tools/widl/parser.tab.c"
     break;
 
-  case 257: /* expr_list_int_const: expr_int_const  */
-#line 772 "tools/widl/parser.y"
+  case 263: /* expr_list_int_const: expr_int_const  */
+#line 774 "tools/widl/parser.y"
                                                 { (yyval.expr_list) = append_expr( NULL, (yyvsp[0].expr) ); }
-#line 4774 "tools/widl/parser.tab.c"
+#line 4867 "tools/widl/parser.tab.c"
     break;
 
-  case 258: /* expr_list_int_const: expr_list_int_const ',' expr_int_const  */
-#line 773 "tools/widl/parser.y"
+  case 264: /* expr_list_int_const: expr_list_int_const ',' expr_int_const  */
+#line 775 "tools/widl/parser.y"
                                                         { (yyval.expr_list) = append_expr( (yyvsp[-2].expr_list), (yyvsp[0].expr) ); }
-#line 4780 "tools/widl/parser.tab.c"
+#line 4873 "tools/widl/parser.tab.c"
     break;
 
-  case 259: /* expr_int_const: expr  */
-#line 776 "tools/widl/parser.y"
+  case 265: /* expr_int_const: expr  */
+#line 778 "tools/widl/parser.y"
                                                 { (yyval.expr) = (yyvsp[0].expr);
 						  if (!(yyval.expr)->is_const)
 						      error_loc("expression is not an integer constant\n");
 						}
-#line 4789 "tools/widl/parser.tab.c"
+#line 4882 "tools/widl/parser.tab.c"
     break;
 
-  case 260: /* expr_const: expr  */
-#line 782 "tools/widl/parser.y"
+  case 266: /* expr_const: expr  */
+#line 784 "tools/widl/parser.y"
                                                 { (yyval.expr) = (yyvsp[0].expr);
 						  if (!(yyval.expr)->is_const && (yyval.expr)->type != EXPR_STRLIT && (yyval.expr)->type != EXPR_WSTRLIT)
 						      error_loc("expression is not constant\n");
 						}
-#line 4798 "tools/widl/parser.tab.c"
+#line 4891 "tools/widl/parser.tab.c"
     break;
 
-  case 261: /* fields: %empty  */
-#line 788 "tools/widl/parser.y"
+  case 267: /* fields: %empty  */
+#line 790 "tools/widl/parser.y"
                                                 { (yyval.var_list) = NULL; }
-#line 4804 "tools/widl/parser.tab.c"
+#line 4897 "tools/widl/parser.tab.c"
     break;
 
-  case 262: /* fields: fields field  */
-#line 789 "tools/widl/parser.y"
+  case 268: /* fields: fields field  */
+#line 791 "tools/widl/parser.y"
                                                 { (yyval.var_list) = append_var_list((yyvsp[-1].var_list), (yyvsp[0].var_list)); }
-#line 4810 "tools/widl/parser.tab.c"
+#line 4903 "tools/widl/parser.tab.c"
     break;
 
-  case 263: /* field: m_attributes decl_spec struct_declarator_list ';'  */
-#line 793 "tools/widl/parser.y"
+  case 269: /* field: m_attributes decl_spec struct_declarator_list ';'  */
+#line 795 "tools/widl/parser.y"
                                                 { const char *first = LIST_ENTRY(list_head((yyvsp[-1].declarator_list)), declarator_t, entry)->var->name;
 						  check_field_attrs(first, (yyvsp[-3].attr_list));
 						  (yyval.var_list) = set_var_types((yyvsp[-3].attr_list), (yyvsp[-2].declspec), (yyvsp[-1].declarator_list));
 						}
-#line 4819 "tools/widl/parser.tab.c"
+#line 4912 "tools/widl/parser.tab.c"
     break;
 
-  case 264: /* field: m_attributes uniondef ';'  */
-#line 797 "tools/widl/parser.y"
+  case 270: /* field: m_attributes uniondef ';'  */
+#line 799 "tools/widl/parser.y"
                                                 { var_t *v = make_var(NULL);
 						  v->declspec.type = (yyvsp[-1].type); v->attrs = (yyvsp[-2].attr_list);
 						  (yyval.var_list) = append_var(NULL, v);
 						}
-#line 4828 "tools/widl/parser.tab.c"
+#line 4921 "tools/widl/parser.tab.c"
     break;
 
-  case 265: /* ne_union_field: s_field ';'  */
-#line 804 "tools/widl/parser.y"
+  case 271: /* ne_union_field: s_field ';'  */
+#line 806 "tools/widl/parser.y"
                                                 { (yyval.var) = (yyvsp[-1].var); }
-#line 4834 "tools/widl/parser.tab.c"
+#line 4927 "tools/widl/parser.tab.c"
     break;
 
-  case 266: /* ne_union_field: attributes ';'  */
-#line 805 "tools/widl/parser.y"
+  case 272: /* ne_union_field: attributes ';'  */
+#line 807 "tools/widl/parser.y"
                                                 { (yyval.var) = make_var(NULL); (yyval.var)->attrs = (yyvsp[-1].attr_list); }
-#line 4840 "tools/widl/parser.tab.c"
+#line 4933 "tools/widl/parser.tab.c"
     break;
 
-  case 267: /* ne_union_fields: %empty  */
-#line 808 "tools/widl/parser.y"
+  case 273: /* ne_union_fields: %empty  */
+#line 810 "tools/widl/parser.y"
                                                 { (yyval.var_list) = NULL; }
-#line 4846 "tools/widl/parser.tab.c"
+#line 4939 "tools/widl/parser.tab.c"
     break;
 
-  case 268: /* ne_union_fields: ne_union_fields ne_union_field  */
-#line 809 "tools/widl/parser.y"
+  case 274: /* ne_union_fields: ne_union_fields ne_union_field  */
+#line 811 "tools/widl/parser.y"
                                                 { (yyval.var_list) = append_var( (yyvsp[-1].var_list), (yyvsp[0].var) ); }
-#line 4852 "tools/widl/parser.tab.c"
+#line 4945 "tools/widl/parser.tab.c"
     break;
 
-  case 269: /* union_field: s_field ';'  */
-#line 813 "tools/widl/parser.y"
+  case 275: /* union_field: s_field ';'  */
+#line 815 "tools/widl/parser.y"
                                                 { (yyval.var) = (yyvsp[-1].var); }
-#line 4858 "tools/widl/parser.tab.c"
+#line 4951 "tools/widl/parser.tab.c"
     break;
 
-  case 270: /* union_field: ';'  */
-#line 814 "tools/widl/parser.y"
+  case 276: /* union_field: ';'  */
+#line 816 "tools/widl/parser.y"
                                                 { (yyval.var) = NULL; }
-#line 4864 "tools/widl/parser.tab.c"
+#line 4957 "tools/widl/parser.tab.c"
     break;
 
-  case 271: /* s_field: m_attributes decl_spec declarator  */
-#line 817 "tools/widl/parser.y"
+  case 277: /* s_field: m_attributes decl_spec declarator  */
+#line 819 "tools/widl/parser.y"
                                                 { (yyval.var) = declare_var(check_field_attrs((yyvsp[0].declarator)->var->name, (yyvsp[-2].attr_list)),
 						                (yyvsp[-1].declspec), (yyvsp[0].declarator), FALSE);
 						  free((yyvsp[0].declarator));
 						}
-#line 4873 "tools/widl/parser.tab.c"
+#line 4966 "tools/widl/parser.tab.c"
     break;
 
-  case 272: /* s_field: m_attributes structdef  */
-#line 821 "tools/widl/parser.y"
+  case 278: /* s_field: m_attributes structdef  */
+#line 823 "tools/widl/parser.y"
                                                 { var_t *v = make_var(NULL);
 						  v->declspec.type = (yyvsp[0].type); v->attrs = (yyvsp[-1].attr_list);
 						  (yyval.var) = v;
 						}
-#line 4882 "tools/widl/parser.tab.c"
+#line 4975 "tools/widl/parser.tab.c"
     break;
 
-  case 273: /* funcdef: declaration  */
-#line 827 "tools/widl/parser.y"
+  case 279: /* funcdef: declaration  */
+#line 829 "tools/widl/parser.y"
                                                 { (yyval.var) = (yyvsp[0].var);
 						  if (type_get_type((yyval.var)->declspec.type) != TYPE_FUNCTION)
 						    error_loc("only methods may be declared inside the methods section of a dispinterface\n");
 						  check_function_attrs((yyval.var)->name, (yyval.var)->attrs);
 						}
-#line 4892 "tools/widl/parser.tab.c"
+#line 4985 "tools/widl/parser.tab.c"
     break;
 
-  case 274: /* declaration: attributes decl_spec init_declarator  */
-#line 836 "tools/widl/parser.y"
+  case 280: /* declaration: attributes decl_spec init_declarator  */
+#line 838 "tools/widl/parser.y"
                                                 { (yyval.var) = declare_var((yyvsp[-2].attr_list), (yyvsp[-1].declspec), (yyvsp[0].declarator), FALSE);
 						  free((yyvsp[0].declarator));
 						}
-#line 4900 "tools/widl/parser.tab.c"
+#line 4993 "tools/widl/parser.tab.c"
     break;
 
-  case 275: /* declaration: decl_spec init_declarator  */
-#line 839 "tools/widl/parser.y"
+  case 281: /* declaration: decl_spec init_declarator  */
+#line 841 "tools/widl/parser.y"
                                                 { (yyval.var) = declare_var(NULL, (yyvsp[-1].declspec), (yyvsp[0].declarator), FALSE);
 						  free((yyvsp[0].declarator));
 						}
-#line 4908 "tools/widl/parser.tab.c"
+#line 5001 "tools/widl/parser.tab.c"
     break;
 
-  case 276: /* m_ident: %empty  */
-#line 844 "tools/widl/parser.y"
+  case 282: /* m_ident: %empty  */
+#line 846 "tools/widl/parser.y"
                                                 { (yyval.var) = NULL; }
-#line 4914 "tools/widl/parser.tab.c"
+#line 5007 "tools/widl/parser.tab.c"
     break;
 
-  case 278: /* t_ident: %empty  */
-#line 848 "tools/widl/parser.y"
-                                                { (yyval.str) = NULL; }
-#line 4920 "tools/widl/parser.tab.c"
-    break;
-
-  case 279: /* t_ident: aIDENTIFIER  */
-#line 849 "tools/widl/parser.y"
-                                                { (yyval.str) = (yyvsp[0].str); }
-#line 4926 "tools/widl/parser.tab.c"
-    break;
-
-  case 280: /* t_ident: aKNOWNTYPE  */
+  case 284: /* m_typename: %empty  */
 #line 850 "tools/widl/parser.y"
-                                                { (yyval.str) = (yyvsp[0].str); }
-#line 4932 "tools/widl/parser.tab.c"
+                                                { (yyval.str) = NULL; }
+#line 5013 "tools/widl/parser.tab.c"
     break;
 
-  case 281: /* ident: aIDENTIFIER  */
-#line 853 "tools/widl/parser.y"
-                                                { (yyval.var) = make_var((yyvsp[0].str)); }
-#line 4938 "tools/widl/parser.tab.c"
-    break;
-
-  case 282: /* ident: aKNOWNTYPE  */
-#line 855 "tools/widl/parser.y"
-                                                { (yyval.var) = make_var((yyvsp[0].str)); }
-#line 4944 "tools/widl/parser.tab.c"
-    break;
-
-  case 283: /* base_type: tBYTE  */
+  case 288: /* ident: typename  */
 #line 858 "tools/widl/parser.y"
-                                                { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
-#line 4950 "tools/widl/parser.tab.c"
+                                                { (yyval.var) = make_var((yyvsp[0].str)); }
+#line 5019 "tools/widl/parser.tab.c"
     break;
 
-  case 284: /* base_type: tWCHAR  */
-#line 859 "tools/widl/parser.y"
-                                                { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
-#line 4956 "tools/widl/parser.tab.c"
-    break;
-
-  case 286: /* base_type: tSIGNED int_std  */
+  case 289: /* base_type: tBYTE  */
 #line 861 "tools/widl/parser.y"
-                                                { (yyval.type) = type_new_int(type_basic_get_type((yyvsp[0].type)), -1); }
-#line 4962 "tools/widl/parser.tab.c"
+                                                { (yyval.type) = find_type_or_error((yyvsp[0].str)); }
+#line 5025 "tools/widl/parser.tab.c"
     break;
 
-  case 287: /* base_type: tUNSIGNED int_std  */
+  case 290: /* base_type: tWCHAR  */
 #line 862 "tools/widl/parser.y"
-                                                { (yyval.type) = type_new_int(type_basic_get_type((yyvsp[0].type)), 1); }
-#line 4968 "tools/widl/parser.tab.c"
+                                                { (yyval.type) = find_type_or_error((yyvsp[0].str)); }
+#line 5031 "tools/widl/parser.tab.c"
     break;
 
-  case 288: /* base_type: tUNSIGNED  */
-#line 863 "tools/widl/parser.y"
-                                                { (yyval.type) = type_new_int(TYPE_BASIC_INT, 1); }
-#line 4974 "tools/widl/parser.tab.c"
-    break;
-
-  case 289: /* base_type: tFLOAT  */
+  case 292: /* base_type: tSIGNED int_std  */
 #line 864 "tools/widl/parser.y"
-                                                { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
-#line 4980 "tools/widl/parser.tab.c"
+                                                { (yyval.type) = type_new_int(type_basic_get_type((yyvsp[0].type)), -1); }
+#line 5037 "tools/widl/parser.tab.c"
     break;
 
-  case 290: /* base_type: tDOUBLE  */
+  case 293: /* base_type: tUNSIGNED int_std  */
 #line 865 "tools/widl/parser.y"
-                                                { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
-#line 4986 "tools/widl/parser.tab.c"
+                                                { (yyval.type) = type_new_int(type_basic_get_type((yyvsp[0].type)), 1); }
+#line 5043 "tools/widl/parser.tab.c"
     break;
 
-  case 291: /* base_type: tBOOLEAN  */
+  case 294: /* base_type: tUNSIGNED  */
 #line 866 "tools/widl/parser.y"
-                                                { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
-#line 4992 "tools/widl/parser.tab.c"
+                                                { (yyval.type) = type_new_int(TYPE_BASIC_INT, 1); }
+#line 5049 "tools/widl/parser.tab.c"
     break;
 
-  case 292: /* base_type: tERRORSTATUST  */
+  case 295: /* base_type: tFLOAT  */
 #line 867 "tools/widl/parser.y"
-                                                { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
-#line 4998 "tools/widl/parser.tab.c"
+                                                { (yyval.type) = find_type_or_error((yyvsp[0].str)); }
+#line 5055 "tools/widl/parser.tab.c"
     break;
 
-  case 293: /* base_type: tHANDLET  */
+  case 296: /* base_type: tDOUBLE  */
 #line 868 "tools/widl/parser.y"
-                                                { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
-#line 5004 "tools/widl/parser.tab.c"
+                                                { (yyval.type) = find_type_or_error((yyvsp[0].str)); }
+#line 5061 "tools/widl/parser.tab.c"
     break;
 
-  case 296: /* int_std: tINT  */
-#line 875 "tools/widl/parser.y"
-                                                { (yyval.type) = type_new_int(TYPE_BASIC_INT, 0); }
-#line 5010 "tools/widl/parser.tab.c"
+  case 297: /* base_type: tBOOLEAN  */
+#line 869 "tools/widl/parser.y"
+                                                { (yyval.type) = find_type_or_error((yyvsp[0].str)); }
+#line 5067 "tools/widl/parser.tab.c"
     break;
 
-  case 297: /* int_std: tSHORT m_int  */
-#line 876 "tools/widl/parser.y"
-                                                { (yyval.type) = type_new_int(TYPE_BASIC_INT16, 0); }
-#line 5016 "tools/widl/parser.tab.c"
+  case 298: /* base_type: tERRORSTATUST  */
+#line 870 "tools/widl/parser.y"
+                                                { (yyval.type) = find_type_or_error((yyvsp[0].str)); }
+#line 5073 "tools/widl/parser.tab.c"
     break;
 
-  case 298: /* int_std: tSMALL  */
-#line 877 "tools/widl/parser.y"
-                                                { (yyval.type) = type_new_int(TYPE_BASIC_INT8, 0); }
-#line 5022 "tools/widl/parser.tab.c"
+  case 299: /* base_type: tHANDLET  */
+#line 871 "tools/widl/parser.y"
+                                                { (yyval.type) = find_type_or_error((yyvsp[0].str)); }
+#line 5079 "tools/widl/parser.tab.c"
     break;
 
-  case 299: /* int_std: tLONG m_int  */
+  case 302: /* int_std: tINT  */
 #line 878 "tools/widl/parser.y"
-                                                { (yyval.type) = type_new_int(TYPE_BASIC_LONG, 0); }
-#line 5028 "tools/widl/parser.tab.c"
+                                                { (yyval.type) = type_new_int(TYPE_BASIC_INT, 0); }
+#line 5085 "tools/widl/parser.tab.c"
     break;
 
-  case 300: /* int_std: tHYPER m_int  */
+  case 303: /* int_std: tSHORT m_int  */
 #line 879 "tools/widl/parser.y"
-                                                { (yyval.type) = type_new_int(TYPE_BASIC_HYPER, 0); }
-#line 5034 "tools/widl/parser.tab.c"
+                                                { (yyval.type) = type_new_int(TYPE_BASIC_INT16, 0); }
+#line 5091 "tools/widl/parser.tab.c"
     break;
 
-  case 301: /* int_std: tINT64  */
+  case 304: /* int_std: tSMALL  */
 #line 880 "tools/widl/parser.y"
-                                                { (yyval.type) = type_new_int(TYPE_BASIC_INT64, 0); }
-#line 5040 "tools/widl/parser.tab.c"
+                                                { (yyval.type) = type_new_int(TYPE_BASIC_INT8, 0); }
+#line 5097 "tools/widl/parser.tab.c"
     break;
 
-  case 302: /* int_std: tCHAR  */
+  case 305: /* int_std: tLONG m_int  */
 #line 881 "tools/widl/parser.y"
-                                                { (yyval.type) = type_new_int(TYPE_BASIC_CHAR, 0); }
-#line 5046 "tools/widl/parser.tab.c"
+                                                { (yyval.type) = type_new_int(TYPE_BASIC_LONG, 0); }
+#line 5103 "tools/widl/parser.tab.c"
     break;
 
-  case 303: /* int_std: tINT32  */
+  case 306: /* int_std: tHYPER m_int  */
 #line 882 "tools/widl/parser.y"
-                                                { (yyval.type) = type_new_int(TYPE_BASIC_INT32, 0); }
-#line 5052 "tools/widl/parser.tab.c"
+                                                { (yyval.type) = type_new_int(TYPE_BASIC_HYPER, 0); }
+#line 5109 "tools/widl/parser.tab.c"
     break;
 
-  case 304: /* int_std: tINT3264  */
+  case 307: /* int_std: tINT64  */
 #line 883 "tools/widl/parser.y"
+                                                { (yyval.type) = type_new_int(TYPE_BASIC_INT64, 0); }
+#line 5115 "tools/widl/parser.tab.c"
+    break;
+
+  case 308: /* int_std: tCHAR  */
+#line 884 "tools/widl/parser.y"
+                                                { (yyval.type) = type_new_int(TYPE_BASIC_CHAR, 0); }
+#line 5121 "tools/widl/parser.tab.c"
+    break;
+
+  case 309: /* int_std: tINT32  */
+#line 885 "tools/widl/parser.y"
+                                                { (yyval.type) = type_new_int(TYPE_BASIC_INT32, 0); }
+#line 5127 "tools/widl/parser.tab.c"
+    break;
+
+  case 310: /* int_std: tINT3264  */
+#line 886 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_int(TYPE_BASIC_INT3264, 0); }
-#line 5058 "tools/widl/parser.tab.c"
+#line 5133 "tools/widl/parser.tab.c"
     break;
 
-  case 305: /* qualified_seq: aKNOWNTYPE  */
-#line 887 "tools/widl/parser.y"
-                      { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
-#line 5064 "tools/widl/parser.tab.c"
+  case 311: /* qualified_seq: aKNOWNTYPE  */
+#line 890 "tools/widl/parser.y"
+                      { (yyval.type) = find_type_or_error((yyvsp[0].str)); }
+#line 5139 "tools/widl/parser.tab.c"
     break;
 
-  case 306: /* $@3: %empty  */
-#line 888 "tools/widl/parser.y"
+  case 312: /* $@3: %empty  */
+#line 891 "tools/widl/parser.y"
                       { push_lookup_namespace((yyvsp[-1].str)); }
-#line 5070 "tools/widl/parser.tab.c"
+#line 5145 "tools/widl/parser.tab.c"
     break;
 
-  case 307: /* qualified_seq: aIDENTIFIER '.' $@3 qualified_seq  */
-#line 888 "tools/widl/parser.y"
+  case 313: /* qualified_seq: aIDENTIFIER '.' $@3 qualified_seq  */
+#line 891 "tools/widl/parser.y"
                                                                    { (yyval.type) = (yyvsp[0].type); }
-#line 5076 "tools/widl/parser.tab.c"
-    break;
-
-  case 308: /* qualified_type: aKNOWNTYPE  */
-#line 892 "tools/widl/parser.y"
-                     { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
-#line 5082 "tools/widl/parser.tab.c"
-    break;
-
-  case 309: /* $@4: %empty  */
-#line 893 "tools/widl/parser.y"
-                     { init_lookup_namespace((yyvsp[-1].str)); }
-#line 5088 "tools/widl/parser.tab.c"
-    break;
-
-  case 310: /* qualified_type: aNAMESPACE '.' $@4 qualified_seq  */
-#line 893 "tools/widl/parser.y"
-                                                                  { (yyval.type) = (yyvsp[0].type); }
-#line 5094 "tools/widl/parser.tab.c"
-    break;
-
-  case 311: /* coclass: tCOCLASS aIDENTIFIER  */
-#line 896 "tools/widl/parser.y"
-                                                { (yyval.type) = type_new_coclass((yyvsp[0].str)); }
-#line 5100 "tools/widl/parser.tab.c"
-    break;
-
-  case 312: /* coclass: tCOCLASS aKNOWNTYPE  */
-#line 897 "tools/widl/parser.y"
-                                                { (yyval.type) = find_type((yyvsp[0].str), NULL, 0);
-						  if (type_get_type_detect_alias((yyval.type)) != TYPE_COCLASS)
-						    error_loc("%s was not declared a coclass at %s:%d\n",
-							      (yyvsp[0].str), (yyval.type)->loc_info.input_name,
-							      (yyval.type)->loc_info.line_number);
-						}
-#line 5111 "tools/widl/parser.tab.c"
-    break;
-
-  case 313: /* coclasshdr: attributes coclass  */
-#line 905 "tools/widl/parser.y"
-                                                { (yyval.type) = (yyvsp[0].type);
-						  check_def((yyval.type));
-						  (yyval.type)->attrs = check_coclass_attrs((yyvsp[0].type)->name, (yyvsp[-1].attr_list));
-						}
-#line 5120 "tools/widl/parser.tab.c"
-    break;
-
-  case 314: /* coclassdef: coclasshdr '{' class_interfaces '}' semicolon_opt  */
-#line 912 "tools/widl/parser.y"
-                                                { (yyval.type) = type_coclass_define((yyvsp[-4].type), (yyvsp[-2].ifref_list)); }
-#line 5126 "tools/widl/parser.tab.c"
-    break;
-
-  case 315: /* runtimeclass: tRUNTIMECLASS aIDENTIFIER  */
-#line 916 "tools/widl/parser.y"
-                                                { (yyval.type) = type_new_runtimeclass((yyvsp[0].str), current_namespace); }
-#line 5132 "tools/widl/parser.tab.c"
-    break;
-
-  case 316: /* runtimeclass: tRUNTIMECLASS aKNOWNTYPE  */
-#line 917 "tools/widl/parser.y"
-                                                { (yyval.type) = find_type((yyvsp[0].str), NULL, 0);
-						  if (type_get_type_detect_alias((yyval.type)) != TYPE_RUNTIMECLASS)
-						    error_loc("%s was not declared a runtimeclass at %s:%d\n", (yyvsp[0].str),
-						              (yyval.type)->loc_info.input_name, (yyval.type)->loc_info.line_number);
-						}
-#line 5142 "tools/widl/parser.tab.c"
-    break;
-
-  case 317: /* runtimeclass_hdr: attributes runtimeclass  */
-#line 924 "tools/widl/parser.y"
-                                                { (yyval.type) = (yyvsp[0].type);
-						  check_def((yyval.type));
-						  (yyval.type)->attrs = check_runtimeclass_attrs((yyvsp[0].type)->name, (yyvsp[-1].attr_list));
-						}
 #line 5151 "tools/widl/parser.tab.c"
     break;
 
-  case 318: /* runtimeclass_def: runtimeclass_hdr '{' class_interfaces '}' semicolon_opt  */
-#line 931 "tools/widl/parser.y"
-                                                { (yyval.type) = type_runtimeclass_define((yyvsp[-4].type), (yyvsp[-2].ifref_list)); }
+  case 314: /* qualified_type: aKNOWNTYPE  */
+#line 895 "tools/widl/parser.y"
+                     { (yyval.type) = find_type_or_error((yyvsp[0].str)); }
 #line 5157 "tools/widl/parser.tab.c"
     break;
 
-  case 319: /* apicontract: attributes tAPICONTRACT aIDENTIFIER '{' '}'  */
-#line 935 "tools/widl/parser.y"
-                                                { (yyval.type) = get_type(TYPE_APICONTRACT, (yyvsp[-2].str), current_namespace, 0);
-						  check_def((yyval.type));
-						  (yyval.type)->attrs = check_apicontract_attrs((yyval.type)->name, (yyvsp[-4].attr_list));
-						}
-#line 5166 "tools/widl/parser.tab.c"
+  case 315: /* $@4: %empty  */
+#line 896 "tools/widl/parser.y"
+                     { init_lookup_namespace((yyvsp[-1].str)); }
+#line 5163 "tools/widl/parser.tab.c"
     break;
 
-  case 320: /* namespacedef: tNAMESPACE aIDENTIFIER  */
-#line 941 "tools/widl/parser.y"
+  case 316: /* qualified_type: aNAMESPACE '.' $@4 qualified_seq  */
+#line 896 "tools/widl/parser.y"
+                                                                  { (yyval.type) = (yyvsp[0].type); }
+#line 5169 "tools/widl/parser.tab.c"
+    break;
+
+  case 317: /* coclass: tCOCLASS typename  */
+#line 899 "tools/widl/parser.y"
+                                                { (yyval.type) = type_coclass_declare((yyvsp[0].str)); }
+#line 5175 "tools/widl/parser.tab.c"
+    break;
+
+  case 318: /* coclassdef: attributes coclass '{' class_interfaces '}' semicolon_opt  */
+#line 903 "tools/widl/parser.y"
+                                                { (yyval.type) = type_coclass_define((yyvsp[-4].type), (yyvsp[-5].attr_list), (yyvsp[-2].ifref_list)); }
+#line 5181 "tools/widl/parser.tab.c"
+    break;
+
+  case 319: /* runtimeclass: tRUNTIMECLASS typename  */
+#line 906 "tools/widl/parser.y"
+                                                { (yyval.type) = type_runtimeclass_declare((yyvsp[0].str), current_namespace); }
+#line 5187 "tools/widl/parser.tab.c"
+    break;
+
+  case 320: /* runtimeclass_def: attributes runtimeclass '{' class_interfaces '}' semicolon_opt  */
+#line 910 "tools/widl/parser.y"
+                                                { (yyval.type) = type_runtimeclass_define((yyvsp[-4].type), (yyvsp[-5].attr_list), (yyvsp[-2].ifref_list)); }
+#line 5193 "tools/widl/parser.tab.c"
+    break;
+
+  case 321: /* apicontract: tAPICONTRACT typename  */
+#line 913 "tools/widl/parser.y"
+                                                { (yyval.type) = type_apicontract_declare((yyvsp[0].str), current_namespace); }
+#line 5199 "tools/widl/parser.tab.c"
+    break;
+
+  case 322: /* apicontract_def: attributes apicontract '{' '}' semicolon_opt  */
+#line 917 "tools/widl/parser.y"
+                                                { (yyval.type) = type_apicontract_define((yyvsp[-3].type), (yyvsp[-4].attr_list)); }
+#line 5205 "tools/widl/parser.tab.c"
+    break;
+
+  case 323: /* namespacedef: tNAMESPACE aIDENTIFIER  */
+#line 920 "tools/widl/parser.y"
                                                 { (yyval.str) = (yyvsp[0].str); }
-#line 5172 "tools/widl/parser.tab.c"
+#line 5211 "tools/widl/parser.tab.c"
     break;
 
-  case 321: /* namespacedef: tNAMESPACE aNAMESPACE  */
-#line 942 "tools/widl/parser.y"
+  case 324: /* namespacedef: tNAMESPACE aNAMESPACE  */
+#line 921 "tools/widl/parser.y"
                                                 { (yyval.str) = (yyvsp[0].str); }
-#line 5178 "tools/widl/parser.tab.c"
+#line 5217 "tools/widl/parser.tab.c"
     break;
 
-  case 322: /* class_interfaces: %empty  */
-#line 945 "tools/widl/parser.y"
+  case 325: /* class_interfaces: %empty  */
+#line 924 "tools/widl/parser.y"
                                                 { (yyval.ifref_list) = NULL; }
-#line 5184 "tools/widl/parser.tab.c"
+#line 5223 "tools/widl/parser.tab.c"
     break;
 
-  case 323: /* class_interfaces: class_interfaces class_interface  */
-#line 946 "tools/widl/parser.y"
+  case 326: /* class_interfaces: class_interfaces class_interface  */
+#line 925 "tools/widl/parser.y"
                                                 { (yyval.ifref_list) = append_ifref( (yyvsp[-1].ifref_list), (yyvsp[0].ifref) ); }
-#line 5190 "tools/widl/parser.tab.c"
+#line 5229 "tools/widl/parser.tab.c"
     break;
 
-  case 324: /* class_interface: m_attributes interfacedec  */
+  case 327: /* class_interface: m_attributes interfaceref ';'  */
+#line 929 "tools/widl/parser.y"
+                                                { (yyval.ifref) = make_ifref((yyvsp[-1].type)); (yyval.ifref)->attrs = (yyvsp[-2].attr_list); }
+#line 5235 "tools/widl/parser.tab.c"
+    break;
+
+  case 328: /* dispinterface: tDISPINTERFACE typename  */
+#line 932 "tools/widl/parser.y"
+                                                { (yyval.type) = type_dispinterface_declare((yyvsp[0].str)); }
+#line 5241 "tools/widl/parser.tab.c"
+    break;
+
+  case 329: /* dispattributes: attributes  */
+#line 935 "tools/widl/parser.y"
+                                                { (yyval.attr_list) = append_attr((yyvsp[0].attr_list), make_attr(ATTR_DISPINTERFACE)); }
+#line 5247 "tools/widl/parser.tab.c"
+    break;
+
+  case 330: /* dispint_props: tPROPERTIES ':'  */
+#line 938 "tools/widl/parser.y"
+                                                { (yyval.var_list) = NULL; }
+#line 5253 "tools/widl/parser.tab.c"
+    break;
+
+  case 331: /* dispint_props: dispint_props s_field ';'  */
+#line 939 "tools/widl/parser.y"
+                                                { (yyval.var_list) = append_var( (yyvsp[-2].var_list), (yyvsp[-1].var) ); }
+#line 5259 "tools/widl/parser.tab.c"
+    break;
+
+  case 332: /* dispint_meths: tMETHODS ':'  */
+#line 942 "tools/widl/parser.y"
+                                                { (yyval.var_list) = NULL; }
+#line 5265 "tools/widl/parser.tab.c"
+    break;
+
+  case 333: /* dispint_meths: dispint_meths funcdef ';'  */
+#line 943 "tools/widl/parser.y"
+                                                { (yyval.var_list) = append_var( (yyvsp[-2].var_list), (yyvsp[-1].var) ); }
+#line 5271 "tools/widl/parser.tab.c"
+    break;
+
+  case 334: /* dispinterfacedef: dispattributes dispinterface '{' dispint_props dispint_meths '}'  */
+#line 948 "tools/widl/parser.y"
+                                                { (yyval.type) = type_dispinterface_define((yyvsp[-4].type), (yyvsp[-5].attr_list), (yyvsp[-2].var_list), (yyvsp[-1].var_list)); }
+#line 5277 "tools/widl/parser.tab.c"
+    break;
+
+  case 335: /* dispinterfacedef: dispattributes dispinterface '{' interface ';' '}'  */
 #line 950 "tools/widl/parser.y"
-                                                { (yyval.ifref) = make_ifref((yyvsp[0].type)); (yyval.ifref)->attrs = (yyvsp[-1].attr_list); }
-#line 5196 "tools/widl/parser.tab.c"
+                                                { (yyval.type) = type_dispinterface_define_from_iface((yyvsp[-4].type), (yyvsp[-5].attr_list), (yyvsp[-2].type)); }
+#line 5283 "tools/widl/parser.tab.c"
     break;
 
-  case 325: /* dispinterface: tDISPINTERFACE aIDENTIFIER  */
+  case 336: /* inherit: %empty  */
 #line 953 "tools/widl/parser.y"
-                                                { (yyval.type) = get_type(TYPE_INTERFACE, (yyvsp[0].str), current_namespace, 0); }
-#line 5202 "tools/widl/parser.tab.c"
-    break;
-
-  case 326: /* dispinterface: tDISPINTERFACE aKNOWNTYPE  */
-#line 954 "tools/widl/parser.y"
-                                                { (yyval.type) = get_type(TYPE_INTERFACE, (yyvsp[0].str), current_namespace, 0); }
-#line 5208 "tools/widl/parser.tab.c"
-    break;
-
-  case 327: /* dispinterfacehdr: attributes dispinterface  */
-#line 957 "tools/widl/parser.y"
-                                                { attr_t *attrs;
-						  (yyval.type) = (yyvsp[0].type);
-						  check_def((yyval.type));
-						  attrs = make_attr(ATTR_DISPINTERFACE);
-						  (yyval.type)->attrs = append_attr( check_dispiface_attrs((yyvsp[0].type)->name, (yyvsp[-1].attr_list)), attrs );
-						  (yyval.type)->defined = TRUE;
-						}
-#line 5220 "tools/widl/parser.tab.c"
-    break;
-
-  case 328: /* dispint_props: tPROPERTIES ':'  */
-#line 966 "tools/widl/parser.y"
-                                                { (yyval.var_list) = NULL; }
-#line 5226 "tools/widl/parser.tab.c"
-    break;
-
-  case 329: /* dispint_props: dispint_props s_field ';'  */
-#line 967 "tools/widl/parser.y"
-                                                { (yyval.var_list) = append_var( (yyvsp[-2].var_list), (yyvsp[-1].var) ); }
-#line 5232 "tools/widl/parser.tab.c"
-    break;
-
-  case 330: /* dispint_meths: tMETHODS ':'  */
-#line 970 "tools/widl/parser.y"
-                                                { (yyval.var_list) = NULL; }
-#line 5238 "tools/widl/parser.tab.c"
-    break;
-
-  case 331: /* dispint_meths: dispint_meths funcdef ';'  */
-#line 971 "tools/widl/parser.y"
-                                                { (yyval.var_list) = append_var( (yyvsp[-2].var_list), (yyvsp[-1].var) ); }
-#line 5244 "tools/widl/parser.tab.c"
-    break;
-
-  case 332: /* dispinterfacedef: dispinterfacehdr '{' dispint_props dispint_meths '}'  */
-#line 977 "tools/widl/parser.y"
-                                                { (yyval.type) = (yyvsp[-4].type);
-						  type_dispinterface_define((yyval.type), (yyvsp[-2].var_list), (yyvsp[-1].var_list));
-						}
-#line 5252 "tools/widl/parser.tab.c"
-    break;
-
-  case 333: /* dispinterfacedef: dispinterfacehdr '{' interface ';' '}'  */
-#line 981 "tools/widl/parser.y"
-                                                { (yyval.type) = (yyvsp[-4].type);
-						  type_dispinterface_define_from_iface((yyval.type), (yyvsp[-2].type));
-						}
-#line 5260 "tools/widl/parser.tab.c"
-    break;
-
-  case 334: /* inherit: %empty  */
-#line 986 "tools/widl/parser.y"
                                                 { (yyval.type) = NULL; }
-#line 5266 "tools/widl/parser.tab.c"
+#line 5289 "tools/widl/parser.tab.c"
     break;
 
-  case 335: /* inherit: ':' qualified_type  */
-#line 987 "tools/widl/parser.y"
+  case 337: /* inherit: ':' qualified_type  */
+#line 954 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[0].type); }
-#line 5272 "tools/widl/parser.tab.c"
+#line 5295 "tools/widl/parser.tab.c"
     break;
 
-  case 336: /* interface: tINTERFACE aIDENTIFIER  */
-#line 990 "tools/widl/parser.y"
-                                                { (yyval.type) = get_type(TYPE_INTERFACE, (yyvsp[0].str), current_namespace, 0); }
-#line 5278 "tools/widl/parser.tab.c"
+  case 338: /* interface: tINTERFACE typename  */
+#line 957 "tools/widl/parser.y"
+                                                { (yyval.type) = type_interface_declare((yyvsp[0].str), current_namespace); }
+#line 5301 "tools/widl/parser.tab.c"
     break;
 
-  case 337: /* interface: tINTERFACE aKNOWNTYPE  */
-#line 991 "tools/widl/parser.y"
-                                                { (yyval.type) = get_type(TYPE_INTERFACE, (yyvsp[0].str), current_namespace, 0); }
-#line 5284 "tools/widl/parser.tab.c"
-    break;
-
-  case 338: /* interfacehdr: attributes interface  */
-#line 994 "tools/widl/parser.y"
-                                                { (yyval.type) = (yyvsp[0].type);
-						  check_def((yyvsp[0].type));
-						  (yyvsp[0].type)->attrs = check_iface_attrs((yyvsp[0].type)->name, (yyvsp[-1].attr_list));
-						  (yyvsp[0].type)->defined = TRUE;
-						}
-#line 5294 "tools/widl/parser.tab.c"
-    break;
-
-  case 339: /* interfacedef: interfacehdr inherit '{' int_statements '}' semicolon_opt  */
-#line 1002 "tools/widl/parser.y"
-                                                { (yyval.type) = (yyvsp[-5].type);
-						  if((yyval.type) == (yyvsp[-4].type))
-						    error_loc("Interface can't inherit from itself\n");
-						  type_interface_define((yyval.type), (yyvsp[-4].type), (yyvsp[-2].stmt_list));
+  case 339: /* interfacedef: attributes interface inherit '{' int_statements '}' semicolon_opt  */
+#line 961 "tools/widl/parser.y"
+                                                { (yyval.type) = type_interface_define((yyvsp[-5].type), (yyvsp[-6].attr_list), (yyvsp[-4].type), (yyvsp[-2].stmt_list));
 						  check_async_uuid((yyval.type));
 						}
-#line 5305 "tools/widl/parser.tab.c"
+#line 5309 "tools/widl/parser.tab.c"
     break;
 
-  case 340: /* interfacedef: interfacehdr ':' aIDENTIFIER '{' import int_statements '}' semicolon_opt  */
-#line 1012 "tools/widl/parser.y"
-                                                { (yyval.type) = (yyvsp[-7].type);
-						  type_interface_define((yyval.type), find_type_or_error2((yyvsp[-5].str), 0), (yyvsp[-2].stmt_list));
-						}
-#line 5313 "tools/widl/parser.tab.c"
+  case 340: /* interfacedef: attributes interface ':' aIDENTIFIER '{' import int_statements '}' semicolon_opt  */
+#line 968 "tools/widl/parser.y"
+                                                { (yyval.type) = type_interface_define((yyvsp[-7].type), (yyvsp[-8].attr_list), find_type_or_error((yyvsp[-5].str)), (yyvsp[-2].stmt_list)); }
+#line 5315 "tools/widl/parser.tab.c"
     break;
 
   case 341: /* interfacedef: dispinterfacedef semicolon_opt  */
-#line 1015 "tools/widl/parser.y"
+#line 969 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[-1].type); }
-#line 5319 "tools/widl/parser.tab.c"
+#line 5321 "tools/widl/parser.tab.c"
     break;
 
-  case 342: /* interfacedec: interface ';'  */
-#line 1019 "tools/widl/parser.y"
-                                                { (yyval.type) = (yyvsp[-1].type); }
-#line 5325 "tools/widl/parser.tab.c"
+  case 342: /* interfaceref: tINTERFACE typename  */
+#line 973 "tools/widl/parser.y"
+                                                { (yyval.type) = get_type(TYPE_INTERFACE, (yyvsp[0].str), current_namespace, 0); }
+#line 5327 "tools/widl/parser.tab.c"
     break;
 
-  case 343: /* interfacedec: dispinterface ';'  */
-#line 1020 "tools/widl/parser.y"
-                                                { (yyval.type) = (yyvsp[-1].type); }
-#line 5331 "tools/widl/parser.tab.c"
+  case 343: /* interfaceref: tDISPINTERFACE typename  */
+#line 974 "tools/widl/parser.y"
+                                                { (yyval.type) = get_type(TYPE_INTERFACE, (yyvsp[0].str), current_namespace, 0); }
+#line 5333 "tools/widl/parser.tab.c"
     break;
 
-  case 344: /* module: tMODULE aIDENTIFIER  */
-#line 1023 "tools/widl/parser.y"
-                                                { (yyval.type) = type_new_module((yyvsp[0].str)); }
-#line 5337 "tools/widl/parser.tab.c"
+  case 344: /* module: tMODULE typename  */
+#line 977 "tools/widl/parser.y"
+                                                { (yyval.type) = type_module_declare((yyvsp[0].str)); }
+#line 5339 "tools/widl/parser.tab.c"
     break;
 
-  case 345: /* module: tMODULE aKNOWNTYPE  */
-#line 1024 "tools/widl/parser.y"
-                                                { (yyval.type) = type_new_module((yyvsp[0].str)); }
-#line 5343 "tools/widl/parser.tab.c"
+  case 345: /* moduledef: attributes module '{' int_statements '}' semicolon_opt  */
+#line 981 "tools/widl/parser.y"
+                                                { (yyval.type) = type_module_define((yyvsp[-4].type), (yyvsp[-5].attr_list), (yyvsp[-2].stmt_list)); }
+#line 5345 "tools/widl/parser.tab.c"
     break;
 
-  case 346: /* modulehdr: attributes module  */
-#line 1027 "tools/widl/parser.y"
-                                                { (yyval.type) = (yyvsp[0].type);
-						  (yyval.type)->attrs = check_module_attrs((yyvsp[0].type)->name, (yyvsp[-1].attr_list));
-						}
+  case 346: /* storage_cls_spec: tEXTERN  */
+#line 985 "tools/widl/parser.y"
+                                                { (yyval.stgclass) = STG_EXTERN; }
 #line 5351 "tools/widl/parser.tab.c"
     break;
 
-  case 347: /* moduledef: modulehdr '{' int_statements '}' semicolon_opt  */
-#line 1033 "tools/widl/parser.y"
-                                                { (yyval.type) = (yyvsp[-4].type);
-                                                  type_module_define((yyval.type), (yyvsp[-2].stmt_list));
-						}
-#line 5359 "tools/widl/parser.tab.c"
-    break;
-
-  case 348: /* storage_cls_spec: tEXTERN  */
-#line 1039 "tools/widl/parser.y"
-                                                { (yyval.stgclass) = STG_EXTERN; }
-#line 5365 "tools/widl/parser.tab.c"
-    break;
-
-  case 349: /* storage_cls_spec: tSTATIC  */
-#line 1040 "tools/widl/parser.y"
+  case 347: /* storage_cls_spec: tSTATIC  */
+#line 986 "tools/widl/parser.y"
                                                 { (yyval.stgclass) = STG_STATIC; }
-#line 5371 "tools/widl/parser.tab.c"
+#line 5357 "tools/widl/parser.tab.c"
     break;
 
-  case 350: /* storage_cls_spec: tREGISTER  */
-#line 1041 "tools/widl/parser.y"
+  case 348: /* storage_cls_spec: tREGISTER  */
+#line 987 "tools/widl/parser.y"
                                                 { (yyval.stgclass) = STG_REGISTER; }
-#line 5377 "tools/widl/parser.tab.c"
+#line 5363 "tools/widl/parser.tab.c"
     break;
 
-  case 351: /* function_specifier: tINLINE  */
-#line 1045 "tools/widl/parser.y"
+  case 349: /* function_specifier: tINLINE  */
+#line 991 "tools/widl/parser.y"
                                                 { (yyval.function_specifier) = FUNCTION_SPECIFIER_INLINE; }
-#line 5383 "tools/widl/parser.tab.c"
+#line 5369 "tools/widl/parser.tab.c"
     break;
 
-  case 352: /* type_qualifier: tCONST  */
-#line 1049 "tools/widl/parser.y"
+  case 350: /* type_qualifier: tCONST  */
+#line 995 "tools/widl/parser.y"
                                                 { (yyval.type_qualifier) = TYPE_QUALIFIER_CONST; }
-#line 5389 "tools/widl/parser.tab.c"
+#line 5375 "tools/widl/parser.tab.c"
     break;
 
-  case 353: /* m_type_qual_list: %empty  */
-#line 1052 "tools/widl/parser.y"
+  case 351: /* m_type_qual_list: %empty  */
+#line 998 "tools/widl/parser.y"
                                                 { (yyval.type_qualifier) = 0; }
-#line 5395 "tools/widl/parser.tab.c"
+#line 5381 "tools/widl/parser.tab.c"
     break;
 
-  case 354: /* m_type_qual_list: m_type_qual_list type_qualifier  */
-#line 1053 "tools/widl/parser.y"
+  case 352: /* m_type_qual_list: m_type_qual_list type_qualifier  */
+#line 999 "tools/widl/parser.y"
                                                 { (yyval.type_qualifier) = (yyvsp[-1].type_qualifier) | (yyvsp[0].type_qualifier); }
-#line 5401 "tools/widl/parser.tab.c"
+#line 5387 "tools/widl/parser.tab.c"
     break;
 
-  case 355: /* decl_spec: type m_decl_spec_no_type  */
-#line 1056 "tools/widl/parser.y"
+  case 353: /* decl_spec: type m_decl_spec_no_type  */
+#line 1002 "tools/widl/parser.y"
                                                 { (yyval.declspec) = make_decl_spec((yyvsp[-1].type), (yyvsp[0].declspec), NULL, STG_NONE, 0, 0); }
-#line 5407 "tools/widl/parser.tab.c"
+#line 5393 "tools/widl/parser.tab.c"
     break;
 
-  case 356: /* decl_spec: decl_spec_no_type type m_decl_spec_no_type  */
-#line 1058 "tools/widl/parser.y"
+  case 354: /* decl_spec: decl_spec_no_type type m_decl_spec_no_type  */
+#line 1004 "tools/widl/parser.y"
                                                 { (yyval.declspec) = make_decl_spec((yyvsp[-1].type), (yyvsp[-2].declspec), (yyvsp[0].declspec), STG_NONE, 0, 0); }
-#line 5413 "tools/widl/parser.tab.c"
+#line 5399 "tools/widl/parser.tab.c"
     break;
 
-  case 357: /* m_decl_spec_no_type: %empty  */
-#line 1061 "tools/widl/parser.y"
+  case 355: /* m_decl_spec_no_type: %empty  */
+#line 1007 "tools/widl/parser.y"
                                                 { (yyval.declspec) = NULL; }
-#line 5419 "tools/widl/parser.tab.c"
+#line 5405 "tools/widl/parser.tab.c"
     break;
 
-  case 359: /* decl_spec_no_type: type_qualifier m_decl_spec_no_type  */
-#line 1066 "tools/widl/parser.y"
+  case 357: /* decl_spec_no_type: type_qualifier m_decl_spec_no_type  */
+#line 1012 "tools/widl/parser.y"
                                                 { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[0].declspec), NULL, STG_NONE, (yyvsp[-1].type_qualifier), 0); }
-#line 5425 "tools/widl/parser.tab.c"
+#line 5411 "tools/widl/parser.tab.c"
     break;
 
-  case 360: /* decl_spec_no_type: function_specifier m_decl_spec_no_type  */
-#line 1067 "tools/widl/parser.y"
+  case 358: /* decl_spec_no_type: function_specifier m_decl_spec_no_type  */
+#line 1013 "tools/widl/parser.y"
                                                   { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[0].declspec), NULL, STG_NONE, 0, (yyvsp[-1].function_specifier)); }
-#line 5431 "tools/widl/parser.tab.c"
+#line 5417 "tools/widl/parser.tab.c"
     break;
 
-  case 361: /* decl_spec_no_type: storage_cls_spec m_decl_spec_no_type  */
-#line 1068 "tools/widl/parser.y"
+  case 359: /* decl_spec_no_type: storage_cls_spec m_decl_spec_no_type  */
+#line 1014 "tools/widl/parser.y"
                                                 { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[0].declspec), NULL, (yyvsp[-1].stgclass), 0, 0); }
-#line 5437 "tools/widl/parser.tab.c"
+#line 5423 "tools/widl/parser.tab.c"
     break;
 
-  case 362: /* declarator: '*' m_type_qual_list declarator  */
-#line 1073 "tools/widl/parser.y"
+  case 360: /* declarator: '*' m_type_qual_list declarator  */
+#line 1019 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[0].declarator); append_chain_type((yyval.declarator), type_new_pointer(NULL), (yyvsp[-1].type_qualifier)); }
-#line 5443 "tools/widl/parser.tab.c"
+#line 5429 "tools/widl/parser.tab.c"
     break;
 
-  case 363: /* declarator: callconv declarator  */
-#line 1074 "tools/widl/parser.y"
+  case 361: /* declarator: callconv declarator  */
+#line 1020 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[0].declarator); append_chain_callconv((yyval.declarator)->type, (yyvsp[-1].str)); }
-#line 5449 "tools/widl/parser.tab.c"
+#line 5435 "tools/widl/parser.tab.c"
     break;
 
-  case 365: /* direct_declarator: ident  */
-#line 1079 "tools/widl/parser.y"
+  case 363: /* direct_declarator: ident  */
+#line 1025 "tools/widl/parser.y"
                                                 { (yyval.declarator) = make_declarator((yyvsp[0].var)); }
-#line 5455 "tools/widl/parser.tab.c"
+#line 5441 "tools/widl/parser.tab.c"
     break;
 
-  case 366: /* direct_declarator: '(' declarator ')'  */
-#line 1080 "tools/widl/parser.y"
+  case 364: /* direct_declarator: '(' declarator ')'  */
+#line 1026 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[-1].declarator); }
-#line 5461 "tools/widl/parser.tab.c"
+#line 5447 "tools/widl/parser.tab.c"
     break;
 
-  case 367: /* direct_declarator: direct_declarator array  */
-#line 1081 "tools/widl/parser.y"
+  case 365: /* direct_declarator: direct_declarator array  */
+#line 1027 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[-1].declarator); append_array((yyval.declarator), (yyvsp[0].expr)); }
-#line 5467 "tools/widl/parser.tab.c"
+#line 5453 "tools/widl/parser.tab.c"
     break;
 
-  case 368: /* direct_declarator: direct_declarator '(' m_args ')'  */
-#line 1082 "tools/widl/parser.y"
+  case 366: /* direct_declarator: direct_declarator '(' m_args ')'  */
+#line 1028 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[-3].declarator); append_chain_type((yyval.declarator), type_new_function((yyvsp[-1].var_list)), 0); }
-#line 5473 "tools/widl/parser.tab.c"
+#line 5459 "tools/widl/parser.tab.c"
     break;
 
-  case 369: /* abstract_declarator: '*' m_type_qual_list m_abstract_declarator  */
-#line 1088 "tools/widl/parser.y"
+  case 367: /* abstract_declarator: '*' m_type_qual_list m_abstract_declarator  */
+#line 1034 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[0].declarator); append_chain_type((yyval.declarator), type_new_pointer(NULL), (yyvsp[-1].type_qualifier)); }
-#line 5479 "tools/widl/parser.tab.c"
+#line 5465 "tools/widl/parser.tab.c"
     break;
 
-  case 370: /* abstract_declarator: callconv m_abstract_declarator  */
-#line 1089 "tools/widl/parser.y"
+  case 368: /* abstract_declarator: callconv m_abstract_declarator  */
+#line 1035 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[0].declarator); append_chain_callconv((yyval.declarator)->type, (yyvsp[-1].str)); }
-#line 5485 "tools/widl/parser.tab.c"
+#line 5471 "tools/widl/parser.tab.c"
     break;
 
-  case 372: /* abstract_declarator_no_direct: '*' m_type_qual_list m_any_declarator  */
-#line 1096 "tools/widl/parser.y"
+  case 370: /* abstract_declarator_no_direct: '*' m_type_qual_list m_any_declarator  */
+#line 1042 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[0].declarator); append_chain_type((yyval.declarator), type_new_pointer(NULL), (yyvsp[-1].type_qualifier)); }
-#line 5491 "tools/widl/parser.tab.c"
+#line 5477 "tools/widl/parser.tab.c"
     break;
 
-  case 373: /* abstract_declarator_no_direct: callconv m_any_declarator  */
-#line 1097 "tools/widl/parser.y"
+  case 371: /* abstract_declarator_no_direct: callconv m_any_declarator  */
+#line 1043 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[0].declarator); append_chain_callconv((yyval.declarator)->type, (yyvsp[-1].str)); }
-#line 5497 "tools/widl/parser.tab.c"
+#line 5483 "tools/widl/parser.tab.c"
     break;
 
-  case 374: /* m_abstract_declarator: %empty  */
-#line 1101 "tools/widl/parser.y"
+  case 372: /* m_abstract_declarator: %empty  */
+#line 1047 "tools/widl/parser.y"
                                                 { (yyval.declarator) = make_declarator(NULL); }
-#line 5503 "tools/widl/parser.tab.c"
+#line 5489 "tools/widl/parser.tab.c"
     break;
 
-  case 376: /* abstract_direct_declarator: '(' abstract_declarator_no_direct ')'  */
-#line 1107 "tools/widl/parser.y"
+  case 374: /* abstract_direct_declarator: '(' abstract_declarator_no_direct ')'  */
+#line 1053 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[-1].declarator); }
-#line 5509 "tools/widl/parser.tab.c"
+#line 5495 "tools/widl/parser.tab.c"
     break;
 
-  case 377: /* abstract_direct_declarator: abstract_direct_declarator array  */
-#line 1108 "tools/widl/parser.y"
+  case 375: /* abstract_direct_declarator: abstract_direct_declarator array  */
+#line 1054 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[-1].declarator); append_array((yyval.declarator), (yyvsp[0].expr)); }
+#line 5501 "tools/widl/parser.tab.c"
+    break;
+
+  case 376: /* abstract_direct_declarator: array  */
+#line 1055 "tools/widl/parser.y"
+                                                { (yyval.declarator) = make_declarator(NULL); append_array((yyval.declarator), (yyvsp[0].expr)); }
+#line 5507 "tools/widl/parser.tab.c"
+    break;
+
+  case 377: /* abstract_direct_declarator: '(' m_args ')'  */
+#line 1057 "tools/widl/parser.y"
+                                                { (yyval.declarator) = make_declarator(NULL);
+						  append_chain_type((yyval.declarator), type_new_function((yyvsp[-1].var_list)), 0);
+						}
 #line 5515 "tools/widl/parser.tab.c"
     break;
 
-  case 378: /* abstract_direct_declarator: array  */
-#line 1109 "tools/widl/parser.y"
-                                                { (yyval.declarator) = make_declarator(NULL); append_array((yyval.declarator), (yyvsp[0].expr)); }
-#line 5521 "tools/widl/parser.tab.c"
-    break;
-
-  case 379: /* abstract_direct_declarator: '(' m_args ')'  */
-#line 1111 "tools/widl/parser.y"
-                                                { (yyval.declarator) = make_declarator(NULL);
+  case 378: /* abstract_direct_declarator: abstract_direct_declarator '(' m_args ')'  */
+#line 1061 "tools/widl/parser.y"
+                                                { (yyval.declarator) = (yyvsp[-3].declarator);
 						  append_chain_type((yyval.declarator), type_new_function((yyvsp[-1].var_list)), 0);
 						}
+#line 5523 "tools/widl/parser.tab.c"
+    break;
+
+  case 379: /* any_declarator: '*' m_type_qual_list m_any_declarator  */
+#line 1069 "tools/widl/parser.y"
+                                                { (yyval.declarator) = (yyvsp[0].declarator); append_chain_type((yyval.declarator), type_new_pointer(NULL), (yyvsp[-1].type_qualifier)); }
 #line 5529 "tools/widl/parser.tab.c"
     break;
 
-  case 380: /* abstract_direct_declarator: abstract_direct_declarator '(' m_args ')'  */
-#line 1115 "tools/widl/parser.y"
-                                                { (yyval.declarator) = (yyvsp[-3].declarator);
-						  append_chain_type((yyval.declarator), type_new_function((yyvsp[-1].var_list)), 0);
-						}
-#line 5537 "tools/widl/parser.tab.c"
-    break;
-
-  case 381: /* any_declarator: '*' m_type_qual_list m_any_declarator  */
-#line 1123 "tools/widl/parser.y"
-                                                { (yyval.declarator) = (yyvsp[0].declarator); append_chain_type((yyval.declarator), type_new_pointer(NULL), (yyvsp[-1].type_qualifier)); }
-#line 5543 "tools/widl/parser.tab.c"
-    break;
-
-  case 382: /* any_declarator: callconv m_any_declarator  */
-#line 1124 "tools/widl/parser.y"
+  case 380: /* any_declarator: callconv m_any_declarator  */
+#line 1070 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[0].declarator); append_chain_callconv((yyval.declarator)->type, (yyvsp[-1].str)); }
-#line 5549 "tools/widl/parser.tab.c"
+#line 5535 "tools/widl/parser.tab.c"
     break;
 
-  case 384: /* any_declarator_no_direct: '*' m_type_qual_list m_any_declarator  */
-#line 1131 "tools/widl/parser.y"
+  case 382: /* any_declarator_no_direct: '*' m_type_qual_list m_any_declarator  */
+#line 1077 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[0].declarator); append_chain_type((yyval.declarator), type_new_pointer(NULL), (yyvsp[-1].type_qualifier)); }
-#line 5555 "tools/widl/parser.tab.c"
+#line 5541 "tools/widl/parser.tab.c"
     break;
 
-  case 385: /* any_declarator_no_direct: callconv m_any_declarator  */
-#line 1132 "tools/widl/parser.y"
+  case 383: /* any_declarator_no_direct: callconv m_any_declarator  */
+#line 1078 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[0].declarator); append_chain_callconv((yyval.declarator)->type, (yyvsp[-1].str)); }
-#line 5561 "tools/widl/parser.tab.c"
+#line 5547 "tools/widl/parser.tab.c"
     break;
 
-  case 386: /* m_any_declarator: %empty  */
-#line 1136 "tools/widl/parser.y"
+  case 384: /* m_any_declarator: %empty  */
+#line 1082 "tools/widl/parser.y"
                                                 { (yyval.declarator) = make_declarator(NULL); }
-#line 5567 "tools/widl/parser.tab.c"
+#line 5553 "tools/widl/parser.tab.c"
     break;
 
-  case 388: /* any_direct_declarator: ident  */
-#line 1144 "tools/widl/parser.y"
+  case 386: /* any_direct_declarator: ident  */
+#line 1090 "tools/widl/parser.y"
                                                 { (yyval.declarator) = make_declarator((yyvsp[0].var)); }
-#line 5573 "tools/widl/parser.tab.c"
+#line 5559 "tools/widl/parser.tab.c"
     break;
 
-  case 389: /* any_direct_declarator: '(' any_declarator_no_direct ')'  */
-#line 1145 "tools/widl/parser.y"
+  case 387: /* any_direct_declarator: '(' any_declarator_no_direct ')'  */
+#line 1091 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[-1].declarator); }
-#line 5579 "tools/widl/parser.tab.c"
+#line 5565 "tools/widl/parser.tab.c"
     break;
 
-  case 390: /* any_direct_declarator: any_direct_declarator array  */
-#line 1146 "tools/widl/parser.y"
+  case 388: /* any_direct_declarator: any_direct_declarator array  */
+#line 1092 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[-1].declarator); append_array((yyval.declarator), (yyvsp[0].expr)); }
-#line 5585 "tools/widl/parser.tab.c"
+#line 5571 "tools/widl/parser.tab.c"
     break;
 
-  case 391: /* any_direct_declarator: array  */
-#line 1147 "tools/widl/parser.y"
+  case 389: /* any_direct_declarator: array  */
+#line 1093 "tools/widl/parser.y"
                                                 { (yyval.declarator) = make_declarator(NULL); append_array((yyval.declarator), (yyvsp[0].expr)); }
-#line 5591 "tools/widl/parser.tab.c"
+#line 5577 "tools/widl/parser.tab.c"
     break;
 
-  case 392: /* any_direct_declarator: '(' m_args ')'  */
-#line 1149 "tools/widl/parser.y"
+  case 390: /* any_direct_declarator: '(' m_args ')'  */
+#line 1095 "tools/widl/parser.y"
                                                 { (yyval.declarator) = make_declarator(NULL);
 						  append_chain_type((yyval.declarator), type_new_function((yyvsp[-1].var_list)), 0);
 						}
-#line 5599 "tools/widl/parser.tab.c"
+#line 5585 "tools/widl/parser.tab.c"
     break;
 
-  case 393: /* any_direct_declarator: any_direct_declarator '(' m_args ')'  */
-#line 1153 "tools/widl/parser.y"
+  case 391: /* any_direct_declarator: any_direct_declarator '(' m_args ')'  */
+#line 1099 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[-3].declarator);
 						  append_chain_type((yyval.declarator), type_new_function((yyvsp[-1].var_list)), 0);
 						}
-#line 5607 "tools/widl/parser.tab.c"
+#line 5593 "tools/widl/parser.tab.c"
     break;
 
-  case 394: /* declarator_list: declarator  */
-#line 1159 "tools/widl/parser.y"
+  case 392: /* declarator_list: declarator  */
+#line 1105 "tools/widl/parser.y"
                                                 { (yyval.declarator_list) = append_declarator( NULL, (yyvsp[0].declarator) ); }
-#line 5613 "tools/widl/parser.tab.c"
+#line 5599 "tools/widl/parser.tab.c"
     break;
 
-  case 395: /* declarator_list: declarator_list ',' declarator  */
-#line 1160 "tools/widl/parser.y"
+  case 393: /* declarator_list: declarator_list ',' declarator  */
+#line 1106 "tools/widl/parser.y"
                                                 { (yyval.declarator_list) = append_declarator( (yyvsp[-2].declarator_list), (yyvsp[0].declarator) ); }
-#line 5619 "tools/widl/parser.tab.c"
+#line 5605 "tools/widl/parser.tab.c"
     break;
 
-  case 396: /* m_bitfield: %empty  */
-#line 1163 "tools/widl/parser.y"
+  case 394: /* m_bitfield: %empty  */
+#line 1109 "tools/widl/parser.y"
                                                 { (yyval.expr) = NULL; }
-#line 5625 "tools/widl/parser.tab.c"
+#line 5611 "tools/widl/parser.tab.c"
     break;
 
-  case 397: /* m_bitfield: ':' expr_const  */
-#line 1164 "tools/widl/parser.y"
+  case 395: /* m_bitfield: ':' expr_const  */
+#line 1110 "tools/widl/parser.y"
                                                 { (yyval.expr) = (yyvsp[0].expr); }
-#line 5631 "tools/widl/parser.tab.c"
+#line 5617 "tools/widl/parser.tab.c"
     break;
 
-  case 398: /* struct_declarator: any_declarator m_bitfield  */
-#line 1167 "tools/widl/parser.y"
+  case 396: /* struct_declarator: any_declarator m_bitfield  */
+#line 1113 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[-1].declarator); (yyval.declarator)->bits = (yyvsp[0].expr);
 						  if (!(yyval.declarator)->bits && !(yyval.declarator)->var->name)
 						    error_loc("unnamed fields are not allowed\n");
 						}
-#line 5640 "tools/widl/parser.tab.c"
+#line 5626 "tools/widl/parser.tab.c"
     break;
 
-  case 399: /* struct_declarator_list: struct_declarator  */
-#line 1174 "tools/widl/parser.y"
+  case 397: /* struct_declarator_list: struct_declarator  */
+#line 1120 "tools/widl/parser.y"
                                                 { (yyval.declarator_list) = append_declarator( NULL, (yyvsp[0].declarator) ); }
-#line 5646 "tools/widl/parser.tab.c"
+#line 5632 "tools/widl/parser.tab.c"
     break;
 
-  case 400: /* struct_declarator_list: struct_declarator_list ',' struct_declarator  */
-#line 1176 "tools/widl/parser.y"
+  case 398: /* struct_declarator_list: struct_declarator_list ',' struct_declarator  */
+#line 1122 "tools/widl/parser.y"
                                                 { (yyval.declarator_list) = append_declarator( (yyvsp[-2].declarator_list), (yyvsp[0].declarator) ); }
-#line 5652 "tools/widl/parser.tab.c"
+#line 5638 "tools/widl/parser.tab.c"
     break;
 
-  case 401: /* init_declarator: declarator  */
-#line 1180 "tools/widl/parser.y"
+  case 399: /* init_declarator: declarator  */
+#line 1126 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[0].declarator); }
-#line 5658 "tools/widl/parser.tab.c"
+#line 5644 "tools/widl/parser.tab.c"
     break;
 
-  case 402: /* init_declarator: declarator '=' expr_const  */
-#line 1181 "tools/widl/parser.y"
+  case 400: /* init_declarator: declarator '=' expr_const  */
+#line 1127 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[-2].declarator); (yyvsp[-2].declarator)->var->eval = (yyvsp[0].expr); }
-#line 5664 "tools/widl/parser.tab.c"
+#line 5650 "tools/widl/parser.tab.c"
     break;
 
-  case 403: /* threading_type: tAPARTMENT  */
-#line 1185 "tools/widl/parser.y"
+  case 401: /* threading_type: tAPARTMENT  */
+#line 1131 "tools/widl/parser.y"
                                                 { (yyval.num) = THREADING_APARTMENT; }
-#line 5670 "tools/widl/parser.tab.c"
+#line 5656 "tools/widl/parser.tab.c"
     break;
 
-  case 404: /* threading_type: tNEUTRAL  */
-#line 1186 "tools/widl/parser.y"
+  case 402: /* threading_type: tNEUTRAL  */
+#line 1132 "tools/widl/parser.y"
                                                 { (yyval.num) = THREADING_NEUTRAL; }
-#line 5676 "tools/widl/parser.tab.c"
+#line 5662 "tools/widl/parser.tab.c"
     break;
 
-  case 405: /* threading_type: tSINGLE  */
-#line 1187 "tools/widl/parser.y"
+  case 403: /* threading_type: tSINGLE  */
+#line 1133 "tools/widl/parser.y"
                                                 { (yyval.num) = THREADING_SINGLE; }
-#line 5682 "tools/widl/parser.tab.c"
+#line 5668 "tools/widl/parser.tab.c"
     break;
 
-  case 406: /* threading_type: tFREE  */
-#line 1188 "tools/widl/parser.y"
+  case 404: /* threading_type: tFREE  */
+#line 1134 "tools/widl/parser.y"
                                                 { (yyval.num) = THREADING_FREE; }
-#line 5688 "tools/widl/parser.tab.c"
+#line 5674 "tools/widl/parser.tab.c"
     break;
 
-  case 407: /* threading_type: tBOTH  */
-#line 1189 "tools/widl/parser.y"
+  case 405: /* threading_type: tBOTH  */
+#line 1135 "tools/widl/parser.y"
                                                 { (yyval.num) = THREADING_BOTH; }
-#line 5694 "tools/widl/parser.tab.c"
+#line 5680 "tools/widl/parser.tab.c"
     break;
 
-  case 408: /* threading_type: tMTA  */
-#line 1190 "tools/widl/parser.y"
+  case 406: /* threading_type: tMTA  */
+#line 1136 "tools/widl/parser.y"
                                                 { (yyval.num) = THREADING_FREE; }
-#line 5700 "tools/widl/parser.tab.c"
+#line 5686 "tools/widl/parser.tab.c"
     break;
 
-  case 409: /* pointer_type: tREF  */
-#line 1194 "tools/widl/parser.y"
+  case 407: /* pointer_type: tREF  */
+#line 1140 "tools/widl/parser.y"
                                                 { (yyval.num) = FC_RP; }
-#line 5706 "tools/widl/parser.tab.c"
+#line 5692 "tools/widl/parser.tab.c"
     break;
 
-  case 410: /* pointer_type: tUNIQUE  */
-#line 1195 "tools/widl/parser.y"
+  case 408: /* pointer_type: tUNIQUE  */
+#line 1141 "tools/widl/parser.y"
                                                 { (yyval.num) = FC_UP; }
-#line 5712 "tools/widl/parser.tab.c"
+#line 5698 "tools/widl/parser.tab.c"
     break;
 
-  case 411: /* pointer_type: tPTR  */
-#line 1196 "tools/widl/parser.y"
+  case 409: /* pointer_type: tPTR  */
+#line 1142 "tools/widl/parser.y"
                                                 { (yyval.num) = FC_FP; }
-#line 5718 "tools/widl/parser.tab.c"
+#line 5704 "tools/widl/parser.tab.c"
     break;
 
-  case 412: /* structdef: tSTRUCT t_ident '{' fields '}'  */
-#line 1199 "tools/widl/parser.y"
+  case 410: /* structdef: tSTRUCT m_typename '{' fields '}'  */
+#line 1145 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_struct((yyvsp[-3].str), current_namespace, TRUE, (yyvsp[-1].var_list)); }
-#line 5724 "tools/widl/parser.tab.c"
+#line 5710 "tools/widl/parser.tab.c"
     break;
 
-  case 413: /* type: tVOID  */
-#line 1202 "tools/widl/parser.y"
+  case 411: /* type: tVOID  */
+#line 1148 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_void(); }
-#line 5730 "tools/widl/parser.tab.c"
+#line 5716 "tools/widl/parser.tab.c"
     break;
 
-  case 414: /* type: qualified_type  */
-#line 1203 "tools/widl/parser.y"
+  case 412: /* type: qualified_type  */
+#line 1149 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[0].type); }
-#line 5736 "tools/widl/parser.tab.c"
+#line 5722 "tools/widl/parser.tab.c"
     break;
 
-  case 415: /* type: base_type  */
-#line 1204 "tools/widl/parser.y"
+  case 413: /* type: base_type  */
+#line 1150 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[0].type); }
-#line 5742 "tools/widl/parser.tab.c"
+#line 5728 "tools/widl/parser.tab.c"
     break;
 
-  case 416: /* type: enumdef  */
-#line 1205 "tools/widl/parser.y"
+  case 414: /* type: enumdef  */
+#line 1151 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[0].type); }
-#line 5748 "tools/widl/parser.tab.c"
+#line 5734 "tools/widl/parser.tab.c"
     break;
 
-  case 417: /* type: tENUM aIDENTIFIER  */
-#line 1206 "tools/widl/parser.y"
+  case 415: /* type: tENUM aIDENTIFIER  */
+#line 1152 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_enum((yyvsp[0].str), current_namespace, FALSE, NULL); }
-#line 5754 "tools/widl/parser.tab.c"
+#line 5740 "tools/widl/parser.tab.c"
     break;
 
-  case 418: /* type: structdef  */
-#line 1207 "tools/widl/parser.y"
+  case 416: /* type: structdef  */
+#line 1153 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[0].type); }
-#line 5760 "tools/widl/parser.tab.c"
+#line 5746 "tools/widl/parser.tab.c"
     break;
 
-  case 419: /* type: tSTRUCT aIDENTIFIER  */
-#line 1208 "tools/widl/parser.y"
+  case 417: /* type: tSTRUCT aIDENTIFIER  */
+#line 1154 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_struct((yyvsp[0].str), current_namespace, FALSE, NULL); }
-#line 5766 "tools/widl/parser.tab.c"
+#line 5752 "tools/widl/parser.tab.c"
     break;
 
-  case 420: /* type: uniondef  */
-#line 1209 "tools/widl/parser.y"
+  case 418: /* type: uniondef  */
+#line 1155 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[0].type); }
-#line 5772 "tools/widl/parser.tab.c"
+#line 5758 "tools/widl/parser.tab.c"
     break;
 
-  case 421: /* type: tUNION aIDENTIFIER  */
-#line 1210 "tools/widl/parser.y"
+  case 419: /* type: tUNION aIDENTIFIER  */
+#line 1156 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_nonencapsulated_union((yyvsp[0].str), FALSE, NULL); }
-#line 5778 "tools/widl/parser.tab.c"
+#line 5764 "tools/widl/parser.tab.c"
     break;
 
-  case 422: /* type: tSAFEARRAY '(' type ')'  */
-#line 1211 "tools/widl/parser.y"
+  case 420: /* type: tSAFEARRAY '(' type ')'  */
+#line 1157 "tools/widl/parser.y"
                                                 { (yyval.type) = make_safearray((yyvsp[-1].type)); }
-#line 5784 "tools/widl/parser.tab.c"
+#line 5770 "tools/widl/parser.tab.c"
     break;
 
-  case 423: /* typedef: m_attributes tTYPEDEF m_attributes decl_spec declarator_list  */
-#line 1215 "tools/widl/parser.y"
+  case 421: /* typedef: m_attributes tTYPEDEF m_attributes decl_spec declarator_list  */
+#line 1161 "tools/widl/parser.y"
                                                 { (yyvsp[-4].attr_list) = append_attribs((yyvsp[-4].attr_list), (yyvsp[-2].attr_list));
 						  reg_typedefs((yyvsp[-1].declspec), (yyvsp[0].declarator_list), check_typedef_attrs((yyvsp[-4].attr_list)));
 						  (yyval.statement) = make_statement_typedef((yyvsp[0].declarator_list), !(yyvsp[-1].declspec)->type->defined);
 						}
-#line 5793 "tools/widl/parser.tab.c"
+#line 5779 "tools/widl/parser.tab.c"
     break;
 
-  case 424: /* uniondef: tUNION t_ident '{' ne_union_fields '}'  */
-#line 1222 "tools/widl/parser.y"
+  case 422: /* uniondef: tUNION m_typename '{' ne_union_fields '}'  */
+#line 1168 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_nonencapsulated_union((yyvsp[-3].str), TRUE, (yyvsp[-1].var_list)); }
-#line 5799 "tools/widl/parser.tab.c"
+#line 5785 "tools/widl/parser.tab.c"
     break;
 
-  case 425: /* uniondef: tUNION t_ident tSWITCH '(' s_field ')' m_ident '{' cases '}'  */
-#line 1225 "tools/widl/parser.y"
+  case 423: /* uniondef: tUNION m_typename tSWITCH '(' s_field ')' m_ident '{' cases '}'  */
+#line 1171 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_encapsulated_union((yyvsp[-8].str), (yyvsp[-5].var), (yyvsp[-3].var), (yyvsp[-1].var_list)); }
-#line 5805 "tools/widl/parser.tab.c"
+#line 5791 "tools/widl/parser.tab.c"
     break;
 
-  case 426: /* version: aNUM  */
-#line 1229 "tools/widl/parser.y"
+  case 424: /* version: aNUM  */
+#line 1175 "tools/widl/parser.y"
                                                 { (yyval.num) = MAKEVERSION((yyvsp[0].num), 0); }
-#line 5811 "tools/widl/parser.tab.c"
+#line 5797 "tools/widl/parser.tab.c"
     break;
 
-  case 427: /* version: aNUM '.' aNUM  */
-#line 1230 "tools/widl/parser.y"
+  case 425: /* version: aNUM '.' aNUM  */
+#line 1176 "tools/widl/parser.y"
                                                 { (yyval.num) = MAKEVERSION((yyvsp[-2].num), (yyvsp[0].num)); }
+#line 5803 "tools/widl/parser.tab.c"
+    break;
+
+  case 426: /* version: aHEXNUM  */
+#line 1177 "tools/widl/parser.y"
+                                                { (yyval.num) = (yyvsp[0].num); }
+#line 5809 "tools/widl/parser.tab.c"
+    break;
+
+  case 431: /* acf_int_statement: tTYPEDEF acf_attributes aKNOWNTYPE ';'  */
+#line 1192 "tools/widl/parser.y"
+                                                { type_t *type = find_type_or_error((yyvsp[-1].str));
+                                                  type->attrs = append_attr_list(type->attrs, (yyvsp[-2].attr_list));
+                                                }
 #line 5817 "tools/widl/parser.tab.c"
     break;
 
-  case 428: /* version: aHEXNUM  */
-#line 1231 "tools/widl/parser.y"
-                                                { (yyval.num) = (yyvsp[0].num); }
-#line 5823 "tools/widl/parser.tab.c"
-    break;
-
-  case 433: /* acf_int_statement: tTYPEDEF acf_attributes aKNOWNTYPE ';'  */
-#line 1246 "tools/widl/parser.y"
-                                                { type_t *type = find_type_or_error((yyvsp[-1].str), 0);
-                                                  type->attrs = append_attr_list(type->attrs, (yyvsp[-2].attr_list));
-                                                }
-#line 5831 "tools/widl/parser.tab.c"
-    break;
-
-  case 434: /* acf_interface: acf_attributes tINTERFACE aKNOWNTYPE '{' acf_int_statements '}'  */
-#line 1253 "tools/widl/parser.y"
-                                                {  type_t *iface = find_type_or_error2((yyvsp[-3].str), 0);
+  case 432: /* acf_interface: acf_attributes tINTERFACE aKNOWNTYPE '{' acf_int_statements '}'  */
+#line 1199 "tools/widl/parser.y"
+                                                {  type_t *iface = find_type_or_error((yyvsp[-3].str));
                                                    if (type_get_type(iface) != TYPE_INTERFACE)
                                                        error_loc("%s is not an interface\n", iface->name);
                                                    iface->attrs = append_attr_list(iface->attrs, (yyvsp[-5].attr_list));
                                                 }
-#line 5841 "tools/widl/parser.tab.c"
+#line 5827 "tools/widl/parser.tab.c"
     break;
 
-  case 435: /* acf_attributes: %empty  */
-#line 1261 "tools/widl/parser.y"
+  case 433: /* acf_attributes: %empty  */
+#line 1207 "tools/widl/parser.y"
                                                 { (yyval.attr_list) = NULL; }
-#line 5847 "tools/widl/parser.tab.c"
+#line 5833 "tools/widl/parser.tab.c"
     break;
 
-  case 436: /* acf_attributes: '[' acf_attribute_list ']'  */
-#line 1262 "tools/widl/parser.y"
+  case 434: /* acf_attributes: '[' acf_attribute_list ']'  */
+#line 1208 "tools/widl/parser.y"
                                                 { (yyval.attr_list) = (yyvsp[-1].attr_list); }
-#line 5853 "tools/widl/parser.tab.c"
+#line 5839 "tools/widl/parser.tab.c"
     break;
 
-  case 437: /* acf_attribute_list: acf_attribute  */
-#line 1266 "tools/widl/parser.y"
+  case 435: /* acf_attribute_list: acf_attribute  */
+#line 1212 "tools/widl/parser.y"
                                                 { (yyval.attr_list) = append_attr(NULL, (yyvsp[0].attr)); }
-#line 5859 "tools/widl/parser.tab.c"
+#line 5845 "tools/widl/parser.tab.c"
     break;
 
-  case 438: /* acf_attribute_list: acf_attribute_list ',' acf_attribute  */
-#line 1267 "tools/widl/parser.y"
+  case 436: /* acf_attribute_list: acf_attribute_list ',' acf_attribute  */
+#line 1213 "tools/widl/parser.y"
                                                 { (yyval.attr_list) = append_attr((yyvsp[-2].attr_list), (yyvsp[0].attr)); }
-#line 5865 "tools/widl/parser.tab.c"
+#line 5851 "tools/widl/parser.tab.c"
     break;
 
-  case 439: /* acf_attribute: tALLOCATE '(' allocate_option_list ')'  */
-#line 1272 "tools/widl/parser.y"
+  case 437: /* acf_attribute: tALLOCATE '(' allocate_option_list ')'  */
+#line 1218 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attrv(ATTR_ALLOCATE, (yyvsp[-1].num)); }
-#line 5871 "tools/widl/parser.tab.c"
+#line 5857 "tools/widl/parser.tab.c"
     break;
 
-  case 440: /* acf_attribute: tENCODE  */
-#line 1273 "tools/widl/parser.y"
+  case 438: /* acf_attribute: tENCODE  */
+#line 1219 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_ENCODE); }
-#line 5877 "tools/widl/parser.tab.c"
+#line 5863 "tools/widl/parser.tab.c"
     break;
 
-  case 441: /* acf_attribute: tDECODE  */
-#line 1274 "tools/widl/parser.y"
+  case 439: /* acf_attribute: tDECODE  */
+#line 1220 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_DECODE); }
-#line 5883 "tools/widl/parser.tab.c"
+#line 5869 "tools/widl/parser.tab.c"
     break;
 
-  case 442: /* acf_attribute: tEXPLICITHANDLE  */
-#line 1275 "tools/widl/parser.y"
+  case 440: /* acf_attribute: tEXPLICITHANDLE  */
+#line 1221 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_EXPLICIT_HANDLE); }
-#line 5889 "tools/widl/parser.tab.c"
+#line 5875 "tools/widl/parser.tab.c"
     break;
 
-  case 443: /* allocate_option_list: allocate_option  */
-#line 1279 "tools/widl/parser.y"
+  case 441: /* allocate_option_list: allocate_option  */
+#line 1225 "tools/widl/parser.y"
                                                 { (yyval.num) = (yyvsp[0].num); }
-#line 5895 "tools/widl/parser.tab.c"
+#line 5881 "tools/widl/parser.tab.c"
     break;
 
-  case 444: /* allocate_option_list: allocate_option_list ',' allocate_option  */
-#line 1281 "tools/widl/parser.y"
+  case 442: /* allocate_option_list: allocate_option_list ',' allocate_option  */
+#line 1227 "tools/widl/parser.y"
                                                 { (yyval.num) = (yyvsp[-2].num) | (yyvsp[0].num); }
-#line 5901 "tools/widl/parser.tab.c"
+#line 5887 "tools/widl/parser.tab.c"
     break;
 
-  case 445: /* allocate_option: tDONTFREE  */
-#line 1285 "tools/widl/parser.y"
+  case 443: /* allocate_option: tDONTFREE  */
+#line 1231 "tools/widl/parser.y"
                                                 { (yyval.num) = FC_DONT_FREE; }
-#line 5907 "tools/widl/parser.tab.c"
+#line 5893 "tools/widl/parser.tab.c"
     break;
 
-  case 446: /* allocate_option: tFREE  */
-#line 1286 "tools/widl/parser.y"
+  case 444: /* allocate_option: tFREE  */
+#line 1232 "tools/widl/parser.y"
                                                 { (yyval.num) = 0; }
-#line 5913 "tools/widl/parser.tab.c"
+#line 5899 "tools/widl/parser.tab.c"
     break;
 
-  case 447: /* allocate_option: tALLNODES  */
-#line 1287 "tools/widl/parser.y"
+  case 445: /* allocate_option: tALLNODES  */
+#line 1233 "tools/widl/parser.y"
                                                 { (yyval.num) = FC_ALLOCATE_ALL_NODES; }
-#line 5919 "tools/widl/parser.tab.c"
+#line 5905 "tools/widl/parser.tab.c"
     break;
 
-  case 448: /* allocate_option: tSINGLENODE  */
-#line 1288 "tools/widl/parser.y"
+  case 446: /* allocate_option: tSINGLENODE  */
+#line 1234 "tools/widl/parser.y"
                                                 { (yyval.num) = 0; }
-#line 5925 "tools/widl/parser.tab.c"
+#line 5911 "tools/widl/parser.tab.c"
     break;
 
 
-#line 5929 "tools/widl/parser.tab.c"
+#line 5915 "tools/widl/parser.tab.c"
 
       default: break;
     }
@@ -6150,7 +6136,7 @@
   return yyresult;
 }
 
-#line 1291 "tools/widl/parser.y"
+#line 1237 "tools/widl/parser.y"
 
 
 static void decl_builtin_basic(const char *name, enum type_basic_type type)
@@ -6951,11 +6937,11 @@
   return NULL;
 }
 
-static type_t *find_type_or_error(const char *name, int t)
+static type_t *find_type_or_error(const char *name)
 {
     type_t *type;
-    if (!(type = find_type(name, current_namespace, t)) &&
-        !(type = find_type(name, lookup_namespace, t)))
+    if (!(type = find_type(name, current_namespace, 0)) &&
+        !(type = find_type(name, lookup_namespace, 0)))
     {
         error_loc("type '%s' not found\n", name);
         return NULL;
@@ -6963,13 +6949,6 @@
     return type;
 }
 
-static type_t *find_type_or_error2(char *name, int t)
-{
-  type_t *tp = find_type_or_error(name, t);
-  free(name);
-  return tp;
-}
-
 int is_type(const char *name)
 {
     return find_type(name, current_namespace, 0) != NULL ||
@@ -7111,7 +7090,7 @@
     /* ATTR_DEFAULTVALUE */        { 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "defaultvalue" },
     /* ATTR_DEFAULTVTABLE */       { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, "defaultvtable" },
  /* ATTR_DISABLECONSISTENCYCHECK */{ 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "disable_consistency_check" },
-    /* ATTR_DISPINTERFACE */       { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL },
+    /* ATTR_DISPINTERFACE */       { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, NULL },
     /* ATTR_DISPLAYBIND */         { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "displaybind" },
     /* ATTR_DLLNAME */             { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, "dllname" },
     /* ATTR_DUAL */                { 0, 0, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "dual" },
@@ -7119,9 +7098,12 @@
     /* ATTR_ENCODE */              { 0, 0, 0,  1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "encode" },
     /* ATTR_ENDPOINT */            { 1, 0, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "endpoint" },
     /* ATTR_ENTRY */               { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "entry" },
+    /* ATTR_EVENTADD */            { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "eventadd" },
+    /* ATTR_EVENTREMOVE */         { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "eventremove" },
     /* ATTR_EXCLUSIVETO */         { 0, 0, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "exclusive_to" },
     /* ATTR_EXPLICIT_HANDLE */     { 1, 1, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "explicit_handle" },
     /* ATTR_FAULTSTATUS */         { 0, 0, 0,  0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "fault_status" },
+    /* ATTR_FLAGS */               { 0, 0, 0,  0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "flags" },
     /* ATTR_FORCEALLOCATE */       { 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "force_allocate" },
     /* ATTR_HANDLE */              { 1, 0, 0,  0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "handle" },
     /* ATTR_HELPCONTEXT */         { 0, 0, 0,  1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, "helpcontext" },
@@ -7221,7 +7203,7 @@
     return allowed_attr[type].display_name;
 }
 
-static attr_list_t *check_iface_attrs(const char *name, attr_list_t *attrs)
+attr_list_t *check_interface_attrs(const char *name, attr_list_t *attrs)
 {
   const attr_t *attr;
   if (!attrs) return attrs;
@@ -7365,7 +7347,7 @@
   return attrs;
 }
 
-static attr_list_t *check_dispiface_attrs(const char *name, attr_list_t *attrs)
+attr_list_t *check_dispiface_attrs(const char *name, attr_list_t *attrs)
 {
   const attr_t *attr;
   if (!attrs) return attrs;
@@ -7378,7 +7360,7 @@
   return attrs;
 }
 
-static attr_list_t *check_module_attrs(const char *name, attr_list_t *attrs)
+attr_list_t *check_module_attrs(const char *name, attr_list_t *attrs)
 {
   const attr_t *attr;
   if (!attrs) return attrs;
@@ -7391,7 +7373,7 @@
   return attrs;
 }
 
-static attr_list_t *check_coclass_attrs(const char *name, attr_list_t *attrs)
+attr_list_t *check_coclass_attrs(const char *name, attr_list_t *attrs)
 {
   const attr_t *attr;
   if (!attrs) return attrs;
@@ -7404,7 +7386,7 @@
   return attrs;
 }
 
-static attr_list_t *check_runtimeclass_attrs(const char *name, attr_list_t *attrs)
+attr_list_t *check_runtimeclass_attrs(const char *name, attr_list_t *attrs)
 {
     const attr_t *attr;
     if (!attrs) return attrs;
@@ -7415,7 +7397,7 @@
     return attrs;
 }
 
-static attr_list_t *check_apicontract_attrs(const char *name, attr_list_t *attrs)
+attr_list_t *check_apicontract_attrs(const char *name, attr_list_t *attrs)
 {
     const attr_t *attr;
     if (!attrs) return attrs;
@@ -7772,7 +7754,7 @@
          * function */
         var_t *idl_handle = make_var(xstrdup("IDL_handle"));
         idl_handle->attrs = append_attr(NULL, make_attr(ATTR_IN));
-        idl_handle->declspec.type = find_type_or_error("handle_t", 0);
+        idl_handle->declspec.type = find_type_or_error("handle_t");
         type_function_add_head_arg(func->declspec.type, idl_handle);
     }
 }
@@ -7792,6 +7774,8 @@
             {
                 if (func == func_iter) break;
                 if (strcmp(func->name, func_iter->name)) continue;
+                if (is_attr(func->attrs, ATTR_EVENTADD) != is_attr(func_iter->attrs, ATTR_EVENTADD)) continue;
+                if (is_attr(func->attrs, ATTR_EVENTREMOVE) != is_attr(func_iter->attrs, ATTR_EVENTREMOVE)) continue;
                 if (is_attr(func->attrs, ATTR_PROPGET) != is_attr(func_iter->attrs, ATTR_PROPGET)) continue;
                 if (is_attr(func->attrs, ATTR_PROPPUT) != is_attr(func_iter->attrs, ATTR_PROPPUT)) continue;
                 if (is_attr(func->attrs, ATTR_PROPPUTREF) != is_attr(func_iter->attrs, ATTR_PROPPUTREF)) continue;
@@ -7857,8 +7841,7 @@
     if (!inherit)
         error_loc("async_uuid applied to an interface with incompatible parent\n");
 
-    async_iface = get_type(TYPE_INTERFACE, strmake("Async%s", iface->name), iface->namespace, 0);
-    async_iface->attrs = map_attrs(iface->attrs, async_iface_attrs);
+    async_iface = type_interface_declare(strmake("Async%s", iface->name), iface->namespace);
 
     STATEMENTS_FOR_EACH_FUNC( stmt, type_iface_get_stmts(iface) )
     {
@@ -7889,7 +7872,7 @@
         stmts = append_statement(stmts, make_statement_declaration(finish_func));
     }
 
-    type_interface_define(async_iface, inherit, stmts);
+    type_interface_define(async_iface, map_attrs(iface->attrs, async_iface_attrs), inherit, stmts);
     iface->details.iface->async_iface = async_iface->details.iface->async_iface = async_iface;
 }
 
@@ -8061,7 +8044,7 @@
     LIST_FOR_EACH_ENTRY_SAFE( decl, next, decls, declarator_t, entry )
     {
         var_t *var = decl->var;
-        type_t *type = find_type_or_error(var->name, 0);
+        type_t *type = find_type_or_error(var->name);
         *type_list = xmalloc(sizeof(type_list_t));
         (*type_list)->type = type;
         (*type_list)->next = NULL;
@@ -8108,10 +8091,3 @@
     i->line_number = line_number;
     i->near_text = parser_text;
 }
-
-static void check_def(const type_t *t)
-{
-    if (t->defined)
-        error_loc("%s: redefinition error; original definition was at %s:%d\n",
-                  t->name, t->loc_info.input_name, t->loc_info.line_number);
-}
diff --git a/mingw-w64-tools/widl/src/parser.tab.h b/mingw-w64-tools/widl/src/parser.tab.h
index 458209f..aea787b 100644
--- a/mingw-w64-tools/widl/src/parser.tab.h
+++ b/mingw-w64-tools/widl/src/parser.tab.h
@@ -128,133 +128,136 @@
     tENTRY = 329,                  /* tENTRY  */
     tENUM = 330,                   /* tENUM  */
     tERRORSTATUST = 331,           /* tERRORSTATUST  */
-    tEXCLUSIVETO = 332,            /* tEXCLUSIVETO  */
-    tEXPLICITHANDLE = 333,         /* tEXPLICITHANDLE  */
-    tEXTERN = 334,                 /* tEXTERN  */
-    tFALSE = 335,                  /* tFALSE  */
-    tFASTCALL = 336,               /* tFASTCALL  */
-    tFAULTSTATUS = 337,            /* tFAULTSTATUS  */
-    tFLOAT = 338,                  /* tFLOAT  */
-    tFORCEALLOCATE = 339,          /* tFORCEALLOCATE  */
-    tHANDLE = 340,                 /* tHANDLE  */
-    tHANDLET = 341,                /* tHANDLET  */
-    tHELPCONTEXT = 342,            /* tHELPCONTEXT  */
-    tHELPFILE = 343,               /* tHELPFILE  */
-    tHELPSTRING = 344,             /* tHELPSTRING  */
-    tHELPSTRINGCONTEXT = 345,      /* tHELPSTRINGCONTEXT  */
-    tHELPSTRINGDLL = 346,          /* tHELPSTRINGDLL  */
-    tHIDDEN = 347,                 /* tHIDDEN  */
-    tHYPER = 348,                  /* tHYPER  */
-    tID = 349,                     /* tID  */
-    tIDEMPOTENT = 350,             /* tIDEMPOTENT  */
-    tIGNORE = 351,                 /* tIGNORE  */
-    tIIDIS = 352,                  /* tIIDIS  */
-    tIMMEDIATEBIND = 353,          /* tIMMEDIATEBIND  */
-    tIMPLICITHANDLE = 354,         /* tIMPLICITHANDLE  */
-    tIMPORT = 355,                 /* tIMPORT  */
-    tIMPORTLIB = 356,              /* tIMPORTLIB  */
-    tIN = 357,                     /* tIN  */
-    tIN_LINE = 358,                /* tIN_LINE  */
-    tINLINE = 359,                 /* tINLINE  */
-    tINPUTSYNC = 360,              /* tINPUTSYNC  */
-    tINT = 361,                    /* tINT  */
-    tINT32 = 362,                  /* tINT32  */
-    tINT3264 = 363,                /* tINT3264  */
-    tINT64 = 364,                  /* tINT64  */
-    tINTERFACE = 365,              /* tINTERFACE  */
-    tLCID = 366,                   /* tLCID  */
-    tLENGTHIS = 367,               /* tLENGTHIS  */
-    tLIBRARY = 368,                /* tLIBRARY  */
-    tLICENSED = 369,               /* tLICENSED  */
-    tLOCAL = 370,                  /* tLOCAL  */
-    tLONG = 371,                   /* tLONG  */
-    tMARSHALINGBEHAVIOR = 372,     /* tMARSHALINGBEHAVIOR  */
-    tMAYBE = 373,                  /* tMAYBE  */
-    tMESSAGE = 374,                /* tMESSAGE  */
-    tMETHODS = 375,                /* tMETHODS  */
-    tMODULE = 376,                 /* tMODULE  */
-    tMTA = 377,                    /* tMTA  */
-    tNAMESPACE = 378,              /* tNAMESPACE  */
-    tNOCODE = 379,                 /* tNOCODE  */
-    tNONBROWSABLE = 380,           /* tNONBROWSABLE  */
-    tNONCREATABLE = 381,           /* tNONCREATABLE  */
-    tNONE = 382,                   /* tNONE  */
-    tNONEXTENSIBLE = 383,          /* tNONEXTENSIBLE  */
-    tNOTIFY = 384,                 /* tNOTIFY  */
-    tNOTIFYFLAG = 385,             /* tNOTIFYFLAG  */
-    tNULL = 386,                   /* tNULL  */
-    tOBJECT = 387,                 /* tOBJECT  */
-    tODL = 388,                    /* tODL  */
-    tOLEAUTOMATION = 389,          /* tOLEAUTOMATION  */
-    tOPTIMIZE = 390,               /* tOPTIMIZE  */
-    tOPTIONAL = 391,               /* tOPTIONAL  */
-    tOUT = 392,                    /* tOUT  */
-    tPARTIALIGNORE = 393,          /* tPARTIALIGNORE  */
-    tPASCAL = 394,                 /* tPASCAL  */
-    tPOINTERDEFAULT = 395,         /* tPOINTERDEFAULT  */
-    tPRAGMA_WARNING = 396,         /* tPRAGMA_WARNING  */
-    tPROGID = 397,                 /* tPROGID  */
-    tPROPERTIES = 398,             /* tPROPERTIES  */
-    tPROPGET = 399,                /* tPROPGET  */
-    tPROPPUT = 400,                /* tPROPPUT  */
-    tPROPPUTREF = 401,             /* tPROPPUTREF  */
-    tPROXY = 402,                  /* tPROXY  */
-    tPTR = 403,                    /* tPTR  */
-    tPUBLIC = 404,                 /* tPUBLIC  */
-    tRANGE = 405,                  /* tRANGE  */
-    tREADONLY = 406,               /* tREADONLY  */
-    tREF = 407,                    /* tREF  */
-    tREGISTER = 408,               /* tREGISTER  */
-    tREPRESENTAS = 409,            /* tREPRESENTAS  */
-    tREQUESTEDIT = 410,            /* tREQUESTEDIT  */
-    tRESTRICTED = 411,             /* tRESTRICTED  */
-    tRETVAL = 412,                 /* tRETVAL  */
-    tRUNTIMECLASS = 413,           /* tRUNTIMECLASS  */
-    tSAFEARRAY = 414,              /* tSAFEARRAY  */
-    tSHORT = 415,                  /* tSHORT  */
-    tSIGNED = 416,                 /* tSIGNED  */
-    tSINGLENODE = 417,             /* tSINGLENODE  */
-    tSIZEIS = 418,                 /* tSIZEIS  */
-    tSIZEOF = 419,                 /* tSIZEOF  */
-    tSMALL = 420,                  /* tSMALL  */
-    tSOURCE = 421,                 /* tSOURCE  */
-    tSTANDARD = 422,               /* tSTANDARD  */
-    tSTATIC = 423,                 /* tSTATIC  */
-    tSTDCALL = 424,                /* tSTDCALL  */
-    tSTRICTCONTEXTHANDLE = 425,    /* tSTRICTCONTEXTHANDLE  */
-    tSTRING = 426,                 /* tSTRING  */
-    tSTRUCT = 427,                 /* tSTRUCT  */
-    tSWITCH = 428,                 /* tSWITCH  */
-    tSWITCHIS = 429,               /* tSWITCHIS  */
-    tSWITCHTYPE = 430,             /* tSWITCHTYPE  */
-    tTHREADING = 431,              /* tTHREADING  */
-    tTRANSMITAS = 432,             /* tTRANSMITAS  */
-    tTRUE = 433,                   /* tTRUE  */
-    tTYPEDEF = 434,                /* tTYPEDEF  */
-    tUIDEFAULT = 435,              /* tUIDEFAULT  */
-    tUNION = 436,                  /* tUNION  */
-    tUNIQUE = 437,                 /* tUNIQUE  */
-    tUNSIGNED = 438,               /* tUNSIGNED  */
-    tUSESGETLASTERROR = 439,       /* tUSESGETLASTERROR  */
-    tUSERMARSHAL = 440,            /* tUSERMARSHAL  */
-    tUUID = 441,                   /* tUUID  */
-    tV1ENUM = 442,                 /* tV1ENUM  */
-    tVARARG = 443,                 /* tVARARG  */
-    tVERSION = 444,                /* tVERSION  */
-    tVIPROGID = 445,               /* tVIPROGID  */
-    tVOID = 446,                   /* tVOID  */
-    tWCHAR = 447,                  /* tWCHAR  */
-    tWIREMARSHAL = 448,            /* tWIREMARSHAL  */
-    tAPARTMENT = 449,              /* tAPARTMENT  */
-    tNEUTRAL = 450,                /* tNEUTRAL  */
-    tSINGLE = 451,                 /* tSINGLE  */
-    tFREE = 452,                   /* tFREE  */
-    tBOTH = 453,                   /* tBOTH  */
-    CAST = 454,                    /* CAST  */
-    PPTR = 455,                    /* PPTR  */
-    POS = 456,                     /* POS  */
-    NEG = 457,                     /* NEG  */
-    ADDRESSOF = 458                /* ADDRESSOF  */
+    tEVENTADD = 332,               /* tEVENTADD  */
+    tEVENTREMOVE = 333,            /* tEVENTREMOVE  */
+    tEXCLUSIVETO = 334,            /* tEXCLUSIVETO  */
+    tEXPLICITHANDLE = 335,         /* tEXPLICITHANDLE  */
+    tEXTERN = 336,                 /* tEXTERN  */
+    tFALSE = 337,                  /* tFALSE  */
+    tFASTCALL = 338,               /* tFASTCALL  */
+    tFAULTSTATUS = 339,            /* tFAULTSTATUS  */
+    tFLAGS = 340,                  /* tFLAGS  */
+    tFLOAT = 341,                  /* tFLOAT  */
+    tFORCEALLOCATE = 342,          /* tFORCEALLOCATE  */
+    tHANDLE = 343,                 /* tHANDLE  */
+    tHANDLET = 344,                /* tHANDLET  */
+    tHELPCONTEXT = 345,            /* tHELPCONTEXT  */
+    tHELPFILE = 346,               /* tHELPFILE  */
+    tHELPSTRING = 347,             /* tHELPSTRING  */
+    tHELPSTRINGCONTEXT = 348,      /* tHELPSTRINGCONTEXT  */
+    tHELPSTRINGDLL = 349,          /* tHELPSTRINGDLL  */
+    tHIDDEN = 350,                 /* tHIDDEN  */
+    tHYPER = 351,                  /* tHYPER  */
+    tID = 352,                     /* tID  */
+    tIDEMPOTENT = 353,             /* tIDEMPOTENT  */
+    tIGNORE = 354,                 /* tIGNORE  */
+    tIIDIS = 355,                  /* tIIDIS  */
+    tIMMEDIATEBIND = 356,          /* tIMMEDIATEBIND  */
+    tIMPLICITHANDLE = 357,         /* tIMPLICITHANDLE  */
+    tIMPORT = 358,                 /* tIMPORT  */
+    tIMPORTLIB = 359,              /* tIMPORTLIB  */
+    tIN = 360,                     /* tIN  */
+    tIN_LINE = 361,                /* tIN_LINE  */
+    tINLINE = 362,                 /* tINLINE  */
+    tINPUTSYNC = 363,              /* tINPUTSYNC  */
+    tINT = 364,                    /* tINT  */
+    tINT32 = 365,                  /* tINT32  */
+    tINT3264 = 366,                /* tINT3264  */
+    tINT64 = 367,                  /* tINT64  */
+    tINTERFACE = 368,              /* tINTERFACE  */
+    tLCID = 369,                   /* tLCID  */
+    tLENGTHIS = 370,               /* tLENGTHIS  */
+    tLIBRARY = 371,                /* tLIBRARY  */
+    tLICENSED = 372,               /* tLICENSED  */
+    tLOCAL = 373,                  /* tLOCAL  */
+    tLONG = 374,                   /* tLONG  */
+    tMARSHALINGBEHAVIOR = 375,     /* tMARSHALINGBEHAVIOR  */
+    tMAYBE = 376,                  /* tMAYBE  */
+    tMESSAGE = 377,                /* tMESSAGE  */
+    tMETHODS = 378,                /* tMETHODS  */
+    tMODULE = 379,                 /* tMODULE  */
+    tMTA = 380,                    /* tMTA  */
+    tNAMESPACE = 381,              /* tNAMESPACE  */
+    tNOCODE = 382,                 /* tNOCODE  */
+    tNONBROWSABLE = 383,           /* tNONBROWSABLE  */
+    tNONCREATABLE = 384,           /* tNONCREATABLE  */
+    tNONE = 385,                   /* tNONE  */
+    tNONEXTENSIBLE = 386,          /* tNONEXTENSIBLE  */
+    tNOTIFY = 387,                 /* tNOTIFY  */
+    tNOTIFYFLAG = 388,             /* tNOTIFYFLAG  */
+    tNULL = 389,                   /* tNULL  */
+    tOBJECT = 390,                 /* tOBJECT  */
+    tODL = 391,                    /* tODL  */
+    tOLEAUTOMATION = 392,          /* tOLEAUTOMATION  */
+    tOPTIMIZE = 393,               /* tOPTIMIZE  */
+    tOPTIONAL = 394,               /* tOPTIONAL  */
+    tOUT = 395,                    /* tOUT  */
+    tPARTIALIGNORE = 396,          /* tPARTIALIGNORE  */
+    tPASCAL = 397,                 /* tPASCAL  */
+    tPOINTERDEFAULT = 398,         /* tPOINTERDEFAULT  */
+    tPRAGMA_WARNING = 399,         /* tPRAGMA_WARNING  */
+    tPROGID = 400,                 /* tPROGID  */
+    tPROPERTIES = 401,             /* tPROPERTIES  */
+    tPROPGET = 402,                /* tPROPGET  */
+    tPROPPUT = 403,                /* tPROPPUT  */
+    tPROPPUTREF = 404,             /* tPROPPUTREF  */
+    tPROXY = 405,                  /* tPROXY  */
+    tPTR = 406,                    /* tPTR  */
+    tPUBLIC = 407,                 /* tPUBLIC  */
+    tRANGE = 408,                  /* tRANGE  */
+    tREADONLY = 409,               /* tREADONLY  */
+    tREF = 410,                    /* tREF  */
+    tREGISTER = 411,               /* tREGISTER  */
+    tREPRESENTAS = 412,            /* tREPRESENTAS  */
+    tREQUESTEDIT = 413,            /* tREQUESTEDIT  */
+    tRESTRICTED = 414,             /* tRESTRICTED  */
+    tRETVAL = 415,                 /* tRETVAL  */
+    tRUNTIMECLASS = 416,           /* tRUNTIMECLASS  */
+    tSAFEARRAY = 417,              /* tSAFEARRAY  */
+    tSHORT = 418,                  /* tSHORT  */
+    tSIGNED = 419,                 /* tSIGNED  */
+    tSINGLENODE = 420,             /* tSINGLENODE  */
+    tSIZEIS = 421,                 /* tSIZEIS  */
+    tSIZEOF = 422,                 /* tSIZEOF  */
+    tSMALL = 423,                  /* tSMALL  */
+    tSOURCE = 424,                 /* tSOURCE  */
+    tSTANDARD = 425,               /* tSTANDARD  */
+    tSTATIC = 426,                 /* tSTATIC  */
+    tSTDCALL = 427,                /* tSTDCALL  */
+    tSTRICTCONTEXTHANDLE = 428,    /* tSTRICTCONTEXTHANDLE  */
+    tSTRING = 429,                 /* tSTRING  */
+    tSTRUCT = 430,                 /* tSTRUCT  */
+    tSWITCH = 431,                 /* tSWITCH  */
+    tSWITCHIS = 432,               /* tSWITCHIS  */
+    tSWITCHTYPE = 433,             /* tSWITCHTYPE  */
+    tTHREADING = 434,              /* tTHREADING  */
+    tTRANSMITAS = 435,             /* tTRANSMITAS  */
+    tTRUE = 436,                   /* tTRUE  */
+    tTYPEDEF = 437,                /* tTYPEDEF  */
+    tUIDEFAULT = 438,              /* tUIDEFAULT  */
+    tUNION = 439,                  /* tUNION  */
+    tUNIQUE = 440,                 /* tUNIQUE  */
+    tUNSIGNED = 441,               /* tUNSIGNED  */
+    tUSESGETLASTERROR = 442,       /* tUSESGETLASTERROR  */
+    tUSERMARSHAL = 443,            /* tUSERMARSHAL  */
+    tUUID = 444,                   /* tUUID  */
+    tV1ENUM = 445,                 /* tV1ENUM  */
+    tVARARG = 446,                 /* tVARARG  */
+    tVERSION = 447,                /* tVERSION  */
+    tVIPROGID = 448,               /* tVIPROGID  */
+    tVOID = 449,                   /* tVOID  */
+    tWCHAR = 450,                  /* tWCHAR  */
+    tWIREMARSHAL = 451,            /* tWIREMARSHAL  */
+    tAPARTMENT = 452,              /* tAPARTMENT  */
+    tNEUTRAL = 453,                /* tNEUTRAL  */
+    tSINGLE = 454,                 /* tSINGLE  */
+    tFREE = 455,                   /* tFREE  */
+    tBOTH = 456,                   /* tBOTH  */
+    CAST = 457,                    /* CAST  */
+    PPTR = 458,                    /* PPTR  */
+    POS = 459,                     /* POS  */
+    NEG = 460,                     /* NEG  */
+    ADDRESSOF = 461                /* ADDRESSOF  */
   };
   typedef enum yytokentype yytoken_kind_t;
 #endif
@@ -263,7 +266,7 @@
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 union YYSTYPE
 {
-#line 136 "tools/widl/parser.y"
+#line 128 "tools/widl/parser.y"
 
 	attr_t *attr;
 	attr_list_t *attr_list;
@@ -292,7 +295,7 @@
 	enum type_qualifier type_qualifier;
 	enum function_specifier function_specifier;
 
-#line 296 "tools/widl/parser.tab.h"
+#line 299 "tools/widl/parser.tab.h"
 
 };
 typedef union YYSTYPE YYSTYPE;
diff --git a/mingw-w64-tools/widl/src/parser.y b/mingw-w64-tools/widl/src/parser.y
index d12caa0..2d52780 100644
--- a/mingw-w64-tools/widl/src/parser.y
+++ b/mingw-w64-tools/widl/src/parser.y
@@ -75,8 +75,7 @@
 static warning_list_t *append_warning(warning_list_t *, int);
 
 static type_t *reg_typedefs(decl_spec_t *decl_spec, var_list_t *names, attr_list_t *attrs);
-static type_t *find_type_or_error(const char *name, int t);
-static type_t *find_type_or_error2(char *name, int t);
+static type_t *find_type_or_error(const char *name);
 
 static var_t *reg_const(var_t *var);
 
@@ -88,7 +87,6 @@
 static void check_arg_attrs(const var_t *arg);
 static void check_statements(const statement_list_t *stmts, int is_inside_library);
 static void check_all_user_types(const statement_list_t *stmts);
-static attr_list_t *check_iface_attrs(const char *name, attr_list_t *attrs);
 static attr_list_t *check_function_attrs(const char *name, attr_list_t *attrs);
 static attr_list_t *check_typedef_attrs(attr_list_t *attrs);
 static attr_list_t *check_enum_attrs(attr_list_t *attrs);
@@ -97,14 +95,8 @@
 static attr_list_t *check_union_attrs(attr_list_t *attrs);
 static attr_list_t *check_field_attrs(const char *name, attr_list_t *attrs);
 static attr_list_t *check_library_attrs(const char *name, attr_list_t *attrs);
-static attr_list_t *check_dispiface_attrs(const char *name, attr_list_t *attrs);
-static attr_list_t *check_module_attrs(const char *name, attr_list_t *attrs);
-static attr_list_t *check_coclass_attrs(const char *name, attr_list_t *attrs);
-static attr_list_t *check_runtimeclass_attrs(const char *name, attr_list_t *attrs);
-static attr_list_t *check_apicontract_attrs(const char *name, attr_list_t *attrs);
 const char *get_attr_display_name(enum attr_type type);
 static void add_explicit_handle_if_necessary(const type_t *iface, var_t *func);
-static void check_def(const type_t *t);
 
 static void check_async_uuid(type_t *iface);
 
@@ -197,10 +189,12 @@
 %token tDLLNAME tDONTFREE tDOUBLE tDUAL
 %token tENABLEALLOCATE tENCODE tENDPOINT
 %token tENTRY tENUM tERRORSTATUST
+%token tEVENTADD tEVENTREMOVE
 %token tEXCLUSIVETO
 %token tEXPLICITHANDLE tEXTERN
 %token tFALSE
 %token tFASTCALL tFAULTSTATUS
+%token tFLAGS
 %token tFLOAT tFORCEALLOCATE
 %token tHANDLE
 %token tHANDLET
@@ -278,18 +272,19 @@
 %type <attr> attribute acf_attribute
 %type <attr_list> m_attributes attributes attrib_list
 %type <attr_list> acf_attributes acf_attribute_list
+%type <attr_list> dispattributes
 %type <str_list> str_list
 %type <expr> m_expr expr expr_const expr_int_const array m_bitfield
 %type <expr_list> m_exprs /* exprs expr_list */ expr_list_int_const
 %type <expr> contract_req
-%type <type> interfacehdr
 %type <stgclass> storage_cls_spec
 %type <type_qualifier> type_qualifier m_type_qual_list
 %type <function_specifier> function_specifier
 %type <declspec> decl_spec decl_spec_no_type m_decl_spec_no_type
-%type <type> inherit interface interfacedef interfacedec
-%type <type> dispinterface dispinterfacehdr dispinterfacedef
-%type <type> module modulehdr moduledef
+%type <type> inherit interface interfacedef
+%type <type> interfaceref
+%type <type> dispinterface dispinterfacedef
+%type <type> module moduledef
 %type <str> namespacedef
 %type <type> base_type int_std
 %type <type> enumdef structdef uniondef typedecl
@@ -305,12 +300,13 @@
 %type <declarator> m_any_declarator any_declarator any_declarator_no_direct any_direct_declarator
 %type <declarator> m_abstract_declarator abstract_declarator abstract_declarator_no_direct abstract_direct_declarator
 %type <declarator_list> declarator_list struct_declarator_list
-%type <type> coclass coclasshdr coclassdef
-%type <type> runtimeclass runtimeclass_hdr runtimeclass_def
-%type <type> apicontract
+%type <type> coclass coclassdef
+%type <type> runtimeclass runtimeclass_def
+%type <type> apicontract apicontract_def
 %type <num> contract_ver
 %type <num> pointer_type threading_type marshaling_behavior version
-%type <str> libraryhdr callconv cppquote importlib import t_ident
+%type <str> libraryhdr callconv cppquote importlib import
+%type <str> typename m_typename
 %type <uuid> uuid_string
 %type <import> import_start
 %type <typelib> library_start librarydef
@@ -357,7 +353,8 @@
 gbl_statements:					{ $$ = NULL; }
 	| gbl_statements namespacedef '{' { push_namespace($2); } gbl_statements '}'
 						{ pop_namespace($2); $$ = append_statements($1, $5); }
-	| gbl_statements interfacedec		{ $$ = append_statement($1, make_statement_reference($2)); }
+	| gbl_statements interface ';'		{ $$ = append_statement($1, make_statement_reference($2)); }
+	| gbl_statements dispinterface ';'	{ $$ = append_statement($1, make_statement_reference($2)); }
 	| gbl_statements interfacedef		{ $$ = append_statement($1, make_statement_type_decl($2)); }
 	| gbl_statements coclass ';'		{ $$ = $1;
 						  reg_type($2, $2->name, current_namespace, 0);
@@ -365,8 +362,9 @@
 	| gbl_statements coclassdef		{ $$ = append_statement($1, make_statement_type_decl($2));
 						  reg_type($2, $2->name, current_namespace, 0);
 						}
-	| gbl_statements apicontract ';'        { $$ = append_statement($1, make_statement_type_decl($2));
-	                                          reg_type($2, $2->name, current_namespace, 0); }
+	| gbl_statements apicontract ';'	{ $$ = $1; reg_type($2, $2->name, current_namespace, 0); }
+	| gbl_statements apicontract_def	{ $$ = append_statement($1, make_statement_type_decl($2));
+						  reg_type($2, $2->name, current_namespace, 0); }
 	| gbl_statements runtimeclass ';'       { $$ = $1; reg_type($2, $2->name, current_namespace, 0); }
 	| gbl_statements runtimeclass_def       { $$ = append_statement($1, make_statement_type_decl($2));
 	                                          reg_type($2, $2->name, current_namespace, 0); }
@@ -376,7 +374,8 @@
 	;
 
 imp_statements:					{ $$ = NULL; }
-	| imp_statements interfacedec		{ $$ = append_statement($1, make_statement_reference($2)); }
+	| imp_statements interface ';'		{ $$ = append_statement($1, make_statement_reference($2)); }
+	| imp_statements dispinterface ';'	{ $$ = append_statement($1, make_statement_reference($2)); }
 	| imp_statements namespacedef '{' { push_namespace($2); } imp_statements '}'
 						{ pop_namespace($2); $$ = append_statements($1, $5); }
 	| imp_statements interfacedef		{ $$ = append_statement($1, make_statement_type_decl($2)); }
@@ -384,8 +383,9 @@
 	| imp_statements coclassdef		{ $$ = append_statement($1, make_statement_type_decl($2));
 						  reg_type($2, $2->name, current_namespace, 0);
 						}
-	| imp_statements apicontract ';'        { $$ = append_statement($1, make_statement_type_decl($2));
-	                                          reg_type($2, $2->name, current_namespace, 0); }
+	| imp_statements apicontract ';'	{ $$ = $1; reg_type($2, $2->name, current_namespace, 0); }
+	| imp_statements apicontract_def	{ $$ = append_statement($1, make_statement_type_decl($2));
+						  reg_type($2, $2->name, current_namespace, 0); }
 	| imp_statements runtimeclass ';'       { $$ = $1; reg_type($2, $2->name, current_namespace, 0); }
 	| imp_statements runtimeclass_def       { $$ = append_statement($1, make_statement_type_decl($2));
 	                                          reg_type($2, $2->name, current_namespace, 0); }
@@ -460,8 +460,7 @@
 	   semicolon_opt			{ $$ = $3; if(!parse_only) add_importlib($3, current_typelib); }
 	;
 
-libraryhdr: tLIBRARY aIDENTIFIER		{ $$ = $2; }
-	|   tLIBRARY aKNOWNTYPE			{ $$ = $2; }
+libraryhdr: tLIBRARY typename			{ $$ = $2; }
 	;
 library_start: attributes libraryhdr '{'	{ $$ = make_library($2, check_library_attrs($2, $1));
 						  if (!parse_only && do_typelib) current_typelib = $$;
@@ -571,11 +570,14 @@
 	| tENCODE				{ $$ = make_attr(ATTR_ENCODE); }
 	| tENDPOINT '(' str_list ')'		{ $$ = make_attrp(ATTR_ENDPOINT, $3); }
 	| tENTRY '(' expr_const ')'		{ $$ = make_attrp(ATTR_ENTRY, $3); }
+	| tEVENTADD				{ $$ = make_attr(ATTR_EVENTADD); }
+	| tEVENTREMOVE				{ $$ = make_attr(ATTR_EVENTREMOVE); }
 	| tEXCLUSIVETO '(' decl_spec ')'	{ if ($3->type->type_type != TYPE_RUNTIMECLASS)
 						      error_loc("type %s is not a runtimeclass\n", $3->type->name);
 						  $$ = make_attrp(ATTR_EXCLUSIVETO, $3->type); }
 	| tEXPLICITHANDLE			{ $$ = make_attr(ATTR_EXPLICIT_HANDLE); }
 	| tFAULTSTATUS				{ $$ = make_attr(ATTR_FAULTSTATUS); }
+	| tFLAGS				{ $$ = make_attr(ATTR_FLAGS); }
 	| tFORCEALLOCATE			{ $$ = make_attr(ATTR_FORCEALLOCATE); }
 	| tHANDLE				{ $$ = make_attr(ATTR_HANDLE); }
 	| tHELPCONTEXT '(' expr_int_const ')'	{ $$ = make_attrp(ATTR_HELPCONTEXT, $3); }
@@ -713,7 +715,7 @@
 						}
 	;
 
-enumdef: tENUM t_ident '{' enums '}'		{ $$ = type_new_enum($2, current_namespace, TRUE, $4); }
+enumdef: tENUM m_typename '{' enums '}'		{ $$ = type_new_enum($2, current_namespace, TRUE, $4); }
 	;
 
 m_exprs:  m_expr                                { $$ = append_expr( NULL, $1 ); }
@@ -845,27 +847,28 @@
 	| ident
 	;
 
-t_ident:					{ $$ = NULL; }
-	| aIDENTIFIER				{ $$ = $1; }
-	| aKNOWNTYPE				{ $$ = $1; }
+m_typename:					{ $$ = NULL; }
+	| typename
 	;
 
-ident:	  aIDENTIFIER				{ $$ = make_var($1); }
-/* some "reserved words" used in attributes are also used as field names in some MS IDL files */
-	| aKNOWNTYPE				{ $$ = make_var($<str>1); }
+typename: aIDENTIFIER
+	| aKNOWNTYPE
 	;
 
-base_type: tBYTE				{ $$ = find_type_or_error($<str>1, 0); }
-	| tWCHAR				{ $$ = find_type_or_error($<str>1, 0); }
+ident:	  typename				{ $$ = make_var($1); }
+	;
+
+base_type: tBYTE				{ $$ = find_type_or_error($<str>1); }
+	| tWCHAR				{ $$ = find_type_or_error($<str>1); }
 	| int_std
 	| tSIGNED int_std			{ $$ = type_new_int(type_basic_get_type($2), -1); }
 	| tUNSIGNED int_std			{ $$ = type_new_int(type_basic_get_type($2), 1); }
 	| tUNSIGNED				{ $$ = type_new_int(TYPE_BASIC_INT, 1); }
-	| tFLOAT				{ $$ = find_type_or_error($<str>1, 0); }
-	| tDOUBLE				{ $$ = find_type_or_error($<str>1, 0); }
-	| tBOOLEAN				{ $$ = find_type_or_error($<str>1, 0); }
-	| tERRORSTATUST				{ $$ = find_type_or_error($<str>1, 0); }
-	| tHANDLET				{ $$ = find_type_or_error($<str>1, 0); }
+	| tFLOAT				{ $$ = find_type_or_error($<str>1); }
+	| tDOUBLE				{ $$ = find_type_or_error($<str>1); }
+	| tBOOLEAN				{ $$ = find_type_or_error($<str>1); }
+	| tERRORSTATUST				{ $$ = find_type_or_error($<str>1); }
+	| tHANDLET				{ $$ = find_type_or_error($<str>1); }
 	;
 
 m_int:
@@ -884,58 +887,34 @@
 	;
 
 qualified_seq:
-      aKNOWNTYPE      { $$ = find_type_or_error($1, 0); }
+      aKNOWNTYPE      { $$ = find_type_or_error($1); }
     | aIDENTIFIER '.' { push_lookup_namespace($1); } qualified_seq { $$ = $4; }
     ;
 
 qualified_type:
-      aKNOWNTYPE     { $$ = find_type_or_error($1, 0); }
+      aKNOWNTYPE     { $$ = find_type_or_error($1); }
     | aNAMESPACE '.' { init_lookup_namespace($1); } qualified_seq { $$ = $4; }
     ;
 
-coclass:  tCOCLASS aIDENTIFIER			{ $$ = type_new_coclass($2); }
-	| tCOCLASS aKNOWNTYPE			{ $$ = find_type($2, NULL, 0);
-						  if (type_get_type_detect_alias($$) != TYPE_COCLASS)
-						    error_loc("%s was not declared a coclass at %s:%d\n",
-							      $2, $$->loc_info.input_name,
-							      $$->loc_info.line_number);
-						}
+coclass:  tCOCLASS typename			{ $$ = type_coclass_declare($2); }
 	;
 
-coclasshdr: attributes coclass			{ $$ = $2;
-						  check_def($$);
-						  $$->attrs = check_coclass_attrs($2->name, $1);
-						}
+coclassdef: attributes coclass '{' class_interfaces '}' semicolon_opt
+						{ $$ = type_coclass_define($2, $1, $4); }
 	;
 
-coclassdef: coclasshdr '{' class_interfaces '}' semicolon_opt
-						{ $$ = type_coclass_define($1, $3); }
+runtimeclass: tRUNTIMECLASS typename		{ $$ = type_runtimeclass_declare($2, current_namespace); }
 	;
 
-runtimeclass:
-	  tRUNTIMECLASS aIDENTIFIER		{ $$ = type_new_runtimeclass($2, current_namespace); }
-	| tRUNTIMECLASS aKNOWNTYPE		{ $$ = find_type($2, NULL, 0);
-						  if (type_get_type_detect_alias($$) != TYPE_RUNTIMECLASS)
-						    error_loc("%s was not declared a runtimeclass at %s:%d\n", $2,
-						              $$->loc_info.input_name, $$->loc_info.line_number);
-						}
+runtimeclass_def: attributes runtimeclass '{' class_interfaces '}' semicolon_opt
+						{ $$ = type_runtimeclass_define($2, $1, $4); }
 	;
 
-runtimeclass_hdr: attributes runtimeclass	{ $$ = $2;
-						  check_def($$);
-						  $$->attrs = check_runtimeclass_attrs($2->name, $1);
-						}
+apicontract: tAPICONTRACT typename		{ $$ = type_apicontract_declare($2, current_namespace); }
 	;
 
-runtimeclass_def: runtimeclass_hdr '{' class_interfaces '}' semicolon_opt
-						{ $$ = type_runtimeclass_define($1, $3); }
-	;
-
-apicontract: attributes tAPICONTRACT aIDENTIFIER '{' '}'
-						{ $$ = get_type(TYPE_APICONTRACT, $3, current_namespace, 0);
-						  check_def($$);
-						  $$->attrs = check_apicontract_attrs($$->name, $1);
-						}
+apicontract_def: attributes apicontract '{' '}' semicolon_opt
+						{ $$ = type_apicontract_define($2, $1); }
 	;
 
 namespacedef: tNAMESPACE aIDENTIFIER		{ $$ = $2; }
@@ -947,20 +926,13 @@
 	;
 
 class_interface:
-	  m_attributes interfacedec		{ $$ = make_ifref($2); $$->attrs = $1; }
+	  m_attributes interfaceref ';'		{ $$ = make_ifref($2); $$->attrs = $1; }
 	;
 
-dispinterface: tDISPINTERFACE aIDENTIFIER	{ $$ = get_type(TYPE_INTERFACE, $2, current_namespace, 0); }
-	|      tDISPINTERFACE aKNOWNTYPE	{ $$ = get_type(TYPE_INTERFACE, $2, current_namespace, 0); }
+dispinterface: tDISPINTERFACE typename		{ $$ = type_dispinterface_declare($2); }
 	;
 
-dispinterfacehdr: attributes dispinterface	{ attr_t *attrs;
-						  $$ = $2;
-						  check_def($$);
-						  attrs = make_attr(ATTR_DISPINTERFACE);
-						  $$->attrs = append_attr( check_dispiface_attrs($2->name, $1), attrs );
-						  $$->defined = TRUE;
-						}
+dispattributes: attributes			{ $$ = append_attr($1, make_attr(ATTR_DISPINTERFACE)); }
 	;
 
 dispint_props: tPROPERTIES ':'			{ $$ = NULL; }
@@ -971,68 +943,42 @@
 	| dispint_meths funcdef ';'		{ $$ = append_var( $1, $2 ); }
 	;
 
-dispinterfacedef: dispinterfacehdr '{'
-	  dispint_props
-	  dispint_meths
-	  '}'					{ $$ = $1;
-						  type_dispinterface_define($$, $3, $4);
-						}
-	| dispinterfacehdr
-	 '{' interface ';' '}' 			{ $$ = $1;
-						  type_dispinterface_define_from_iface($$, $3);
-						}
+dispinterfacedef:
+	  dispattributes dispinterface '{' dispint_props dispint_meths '}'
+						{ $$ = type_dispinterface_define($2, $1, $4, $5); }
+	| dispattributes dispinterface '{' interface ';' '}'
+						{ $$ = type_dispinterface_define_from_iface($2, $1, $4); }
 	;
 
 inherit:					{ $$ = NULL; }
 	| ':' qualified_type                    { $$ = $2; }
 	;
 
-interface: tINTERFACE aIDENTIFIER		{ $$ = get_type(TYPE_INTERFACE, $2, current_namespace, 0); }
-	|  tINTERFACE aKNOWNTYPE		{ $$ = get_type(TYPE_INTERFACE, $2, current_namespace, 0); }
+interface: tINTERFACE typename			{ $$ = type_interface_declare($2, current_namespace); }
 	;
 
-interfacehdr: attributes interface		{ $$ = $2;
-						  check_def($2);
-						  $2->attrs = check_iface_attrs($2->name, $1);
-						  $2->defined = TRUE;
-						}
-	;
-
-interfacedef: interfacehdr inherit
-	  '{' int_statements '}' semicolon_opt	{ $$ = $1;
-						  if($$ == $2)
-						    error_loc("Interface can't inherit from itself\n");
-						  type_interface_define($$, $2, $4);
+interfacedef: attributes interface inherit
+	  '{' int_statements '}' semicolon_opt	{ $$ = type_interface_define($2, $1, $3, $5);
 						  check_async_uuid($$);
 						}
 /* MIDL is able to import the definition of a base class from inside the
  * definition of a derived class, I'll try to support it with this rule */
-	| interfacehdr ':' aIDENTIFIER
+	| attributes interface ':' aIDENTIFIER
 	  '{' import int_statements '}'
-	   semicolon_opt			{ $$ = $1;
-						  type_interface_define($$, find_type_or_error2($3, 0), $6);
-						}
+	   semicolon_opt			{ $$ = type_interface_define($2, $1, find_type_or_error($4), $7); }
 	| dispinterfacedef semicolon_opt	{ $$ = $1; }
 	;
 
-interfacedec:
-	  interface ';'				{ $$ = $1; }
-	| dispinterface ';'			{ $$ = $1; }
+interfaceref:
+	  tINTERFACE typename			{ $$ = get_type(TYPE_INTERFACE, $2, current_namespace, 0); }
+	| tDISPINTERFACE typename		{ $$ = get_type(TYPE_INTERFACE, $2, current_namespace, 0); }
 	;
 
-module:   tMODULE aIDENTIFIER			{ $$ = type_new_module($2); }
-	| tMODULE aKNOWNTYPE			{ $$ = type_new_module($2); }
+module:   tMODULE typename			{ $$ = type_module_declare($2); }
 	;
 
-modulehdr: attributes module			{ $$ = $2;
-						  $$->attrs = check_module_attrs($2->name, $1);
-						}
-	;
-
-moduledef: modulehdr '{' int_statements '}'
-	   semicolon_opt			{ $$ = $1;
-                                                  type_module_define($$, $3);
-						}
+moduledef: attributes module '{' int_statements '}' semicolon_opt
+						{ $$ = type_module_define($2, $1, $4); }
 	;
 
 storage_cls_spec:
@@ -1196,7 +1142,7 @@
 	| tPTR					{ $$ = FC_FP; }
 	;
 
-structdef: tSTRUCT t_ident '{' fields '}'	{ $$ = type_new_struct($2, current_namespace, TRUE, $4); }
+structdef: tSTRUCT m_typename '{' fields '}'	{ $$ = type_new_struct($2, current_namespace, TRUE, $4); }
 	;
 
 type:	  tVOID					{ $$ = type_new_void(); }
@@ -1218,9 +1164,9 @@
 						}
 	;
 
-uniondef: tUNION t_ident '{' ne_union_fields '}'
+uniondef: tUNION m_typename '{' ne_union_fields '}'
 						{ $$ = type_new_nonencapsulated_union($2, TRUE, $4); }
-	| tUNION t_ident
+	| tUNION m_typename
 	  tSWITCH '(' s_field ')'
 	  m_ident '{' cases '}'			{ $$ = type_new_encapsulated_union($2, $5, $7, $9); }
 	;
@@ -1243,14 +1189,14 @@
 
 acf_int_statement
         : tTYPEDEF acf_attributes aKNOWNTYPE ';'
-                                                { type_t *type = find_type_or_error($3, 0);
+                                                { type_t *type = find_type_or_error($3);
                                                   type->attrs = append_attr_list(type->attrs, $2);
                                                 }
 	;
 
 acf_interface
         : acf_attributes tINTERFACE aKNOWNTYPE '{' acf_int_statements '}'
-                                                {  type_t *iface = find_type_or_error2($3, 0);
+                                                {  type_t *iface = find_type_or_error($3);
                                                    if (type_get_type(iface) != TYPE_INTERFACE)
                                                        error_loc("%s is not an interface\n", iface->name);
                                                    iface->attrs = append_attr_list(iface->attrs, $1);
@@ -2088,11 +2034,11 @@
   return NULL;
 }
 
-static type_t *find_type_or_error(const char *name, int t)
+static type_t *find_type_or_error(const char *name)
 {
     type_t *type;
-    if (!(type = find_type(name, current_namespace, t)) &&
-        !(type = find_type(name, lookup_namespace, t)))
+    if (!(type = find_type(name, current_namespace, 0)) &&
+        !(type = find_type(name, lookup_namespace, 0)))
     {
         error_loc("type '%s' not found\n", name);
         return NULL;
@@ -2100,13 +2046,6 @@
     return type;
 }
 
-static type_t *find_type_or_error2(char *name, int t)
-{
-  type_t *tp = find_type_or_error(name, t);
-  free(name);
-  return tp;
-}
-
 int is_type(const char *name)
 {
     return find_type(name, current_namespace, 0) != NULL ||
@@ -2248,7 +2187,7 @@
     /* ATTR_DEFAULTVALUE */        { 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "defaultvalue" },
     /* ATTR_DEFAULTVTABLE */       { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, "defaultvtable" },
  /* ATTR_DISABLECONSISTENCYCHECK */{ 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "disable_consistency_check" },
-    /* ATTR_DISPINTERFACE */       { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL },
+    /* ATTR_DISPINTERFACE */       { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, NULL },
     /* ATTR_DISPLAYBIND */         { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "displaybind" },
     /* ATTR_DLLNAME */             { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, "dllname" },
     /* ATTR_DUAL */                { 0, 0, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "dual" },
@@ -2256,9 +2195,12 @@
     /* ATTR_ENCODE */              { 0, 0, 0,  1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "encode" },
     /* ATTR_ENDPOINT */            { 1, 0, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "endpoint" },
     /* ATTR_ENTRY */               { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "entry" },
+    /* ATTR_EVENTADD */            { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "eventadd" },
+    /* ATTR_EVENTREMOVE */         { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "eventremove" },
     /* ATTR_EXCLUSIVETO */         { 0, 0, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "exclusive_to" },
     /* ATTR_EXPLICIT_HANDLE */     { 1, 1, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "explicit_handle" },
     /* ATTR_FAULTSTATUS */         { 0, 0, 0,  0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "fault_status" },
+    /* ATTR_FLAGS */               { 0, 0, 0,  0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "flags" },
     /* ATTR_FORCEALLOCATE */       { 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "force_allocate" },
     /* ATTR_HANDLE */              { 1, 0, 0,  0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "handle" },
     /* ATTR_HELPCONTEXT */         { 0, 0, 0,  1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, "helpcontext" },
@@ -2358,7 +2300,7 @@
     return allowed_attr[type].display_name;
 }
 
-static attr_list_t *check_iface_attrs(const char *name, attr_list_t *attrs)
+attr_list_t *check_interface_attrs(const char *name, attr_list_t *attrs)
 {
   const attr_t *attr;
   if (!attrs) return attrs;
@@ -2502,7 +2444,7 @@
   return attrs;
 }
 
-static attr_list_t *check_dispiface_attrs(const char *name, attr_list_t *attrs)
+attr_list_t *check_dispiface_attrs(const char *name, attr_list_t *attrs)
 {
   const attr_t *attr;
   if (!attrs) return attrs;
@@ -2515,7 +2457,7 @@
   return attrs;
 }
 
-static attr_list_t *check_module_attrs(const char *name, attr_list_t *attrs)
+attr_list_t *check_module_attrs(const char *name, attr_list_t *attrs)
 {
   const attr_t *attr;
   if (!attrs) return attrs;
@@ -2528,7 +2470,7 @@
   return attrs;
 }
 
-static attr_list_t *check_coclass_attrs(const char *name, attr_list_t *attrs)
+attr_list_t *check_coclass_attrs(const char *name, attr_list_t *attrs)
 {
   const attr_t *attr;
   if (!attrs) return attrs;
@@ -2541,7 +2483,7 @@
   return attrs;
 }
 
-static attr_list_t *check_runtimeclass_attrs(const char *name, attr_list_t *attrs)
+attr_list_t *check_runtimeclass_attrs(const char *name, attr_list_t *attrs)
 {
     const attr_t *attr;
     if (!attrs) return attrs;
@@ -2552,7 +2494,7 @@
     return attrs;
 }
 
-static attr_list_t *check_apicontract_attrs(const char *name, attr_list_t *attrs)
+attr_list_t *check_apicontract_attrs(const char *name, attr_list_t *attrs)
 {
     const attr_t *attr;
     if (!attrs) return attrs;
@@ -2909,7 +2851,7 @@
          * function */
         var_t *idl_handle = make_var(xstrdup("IDL_handle"));
         idl_handle->attrs = append_attr(NULL, make_attr(ATTR_IN));
-        idl_handle->declspec.type = find_type_or_error("handle_t", 0);
+        idl_handle->declspec.type = find_type_or_error("handle_t");
         type_function_add_head_arg(func->declspec.type, idl_handle);
     }
 }
@@ -2929,6 +2871,8 @@
             {
                 if (func == func_iter) break;
                 if (strcmp(func->name, func_iter->name)) continue;
+                if (is_attr(func->attrs, ATTR_EVENTADD) != is_attr(func_iter->attrs, ATTR_EVENTADD)) continue;
+                if (is_attr(func->attrs, ATTR_EVENTREMOVE) != is_attr(func_iter->attrs, ATTR_EVENTREMOVE)) continue;
                 if (is_attr(func->attrs, ATTR_PROPGET) != is_attr(func_iter->attrs, ATTR_PROPGET)) continue;
                 if (is_attr(func->attrs, ATTR_PROPPUT) != is_attr(func_iter->attrs, ATTR_PROPPUT)) continue;
                 if (is_attr(func->attrs, ATTR_PROPPUTREF) != is_attr(func_iter->attrs, ATTR_PROPPUTREF)) continue;
@@ -2994,8 +2938,7 @@
     if (!inherit)
         error_loc("async_uuid applied to an interface with incompatible parent\n");
 
-    async_iface = get_type(TYPE_INTERFACE, strmake("Async%s", iface->name), iface->namespace, 0);
-    async_iface->attrs = map_attrs(iface->attrs, async_iface_attrs);
+    async_iface = type_interface_declare(strmake("Async%s", iface->name), iface->namespace);
 
     STATEMENTS_FOR_EACH_FUNC( stmt, type_iface_get_stmts(iface) )
     {
@@ -3026,7 +2969,7 @@
         stmts = append_statement(stmts, make_statement_declaration(finish_func));
     }
 
-    type_interface_define(async_iface, inherit, stmts);
+    type_interface_define(async_iface, map_attrs(iface->attrs, async_iface_attrs), inherit, stmts);
     iface->details.iface->async_iface = async_iface->details.iface->async_iface = async_iface;
 }
 
@@ -3198,7 +3141,7 @@
     LIST_FOR_EACH_ENTRY_SAFE( decl, next, decls, declarator_t, entry )
     {
         var_t *var = decl->var;
-        type_t *type = find_type_or_error(var->name, 0);
+        type_t *type = find_type_or_error(var->name);
         *type_list = xmalloc(sizeof(type_list_t));
         (*type_list)->type = type;
         (*type_list)->next = NULL;
@@ -3245,10 +3188,3 @@
     i->line_number = line_number;
     i->near_text = parser_text;
 }
-
-static void check_def(const type_t *t)
-{
-    if (t->defined)
-        error_loc("%s: redefinition error; original definition was at %s:%d\n",
-                  t->name, t->loc_info.input_name, t->loc_info.line_number);
-}
diff --git a/mingw-w64-tools/widl/src/parser.yy.c b/mingw-w64-tools/widl/src/parser.yy.c
index 560b13c..d42578c 100644
--- a/mingw-w64-tools/widl/src/parser.yy.c
+++ b/mingw-w64-tools/widl/src/parser.yy.c
@@ -2751,9 +2751,12 @@
 	{"encode",                      tENCODE,                    0},
 	{"endpoint",                    tENDPOINT,                  0},
 	{"entry",                       tENTRY,                     0},
+	{"eventadd",                    tEVENTADD,                  1},
+	{"eventremove",                 tEVENTREMOVE,               1},
 	{"exclusiveto",                 tEXCLUSIVETO,               1},
 	{"explicit_handle",             tEXPLICITHANDLE,            0},
 	{"fault_status",                tFAULTSTATUS,               0},
+	{"flags",                       tFLAGS,                     1},
 	{"force_allocate",              tFORCEALLOCATE,             0},
 	{"free",                        tFREE,                      0},
 	{"handle",                      tHANDLE,                    0},
diff --git a/mingw-w64-tools/widl/src/typetree.c b/mingw-w64-tools/widl/src/typetree.c
index a18ffe1..b3f0725 100644
--- a/mingw-w64-tools/widl/src/typetree.c
+++ b/mingw-w64-tools/widl/src/typetree.c
@@ -195,37 +195,6 @@
     return a;
 }
 
-type_t *type_new_module(char *name)
-{
-    type_t *type = get_type(TYPE_MODULE, name, NULL, 0);
-    if (type->type_type != TYPE_MODULE || type->defined)
-        error_loc("%s: redefinition error; original definition was at %s:%d\n",
-                  type->name, type->loc_info.input_name, type->loc_info.line_number);
-    type->name = name;
-    return type;
-}
-
-type_t *type_new_coclass(char *name)
-{
-    type_t *type = get_type(TYPE_COCLASS, name, NULL, 0);
-    if (type->type_type != TYPE_COCLASS || type->defined)
-        error_loc("%s: redefinition error; original definition was at %s:%d\n",
-                  type->name, type->loc_info.input_name, type->loc_info.line_number);
-    type->name = name;
-    return type;
-}
-
-type_t *type_new_runtimeclass(char *name, struct namespace *namespace)
-{
-    type_t *type = get_type(TYPE_RUNTIMECLASS, name, NULL, 0);
-    if (type->type_type != TYPE_RUNTIMECLASS || type->defined)
-        error_loc("%s: redefinition error; original definition was at %s:%d\n",
-                  type->name, type->loc_info.input_name, type->loc_info.line_number);
-    type->name = name;
-    type->namespace = namespace;
-    return type;
-}
-
 type_t *type_new_array(const char *name, const decl_spec_t *element, int declptr,
                        unsigned int dim, expr_t *size_is, expr_t *length_is)
 {
@@ -463,8 +432,24 @@
     return idx;
 }
 
-void type_interface_define(type_t *iface, type_t *inherit, statement_list_t *stmts)
+type_t *type_interface_declare(char *name, struct namespace *namespace)
 {
+    type_t *type = get_type(TYPE_INTERFACE, name, namespace, 0);
+    if (type_get_type_detect_alias(type) != TYPE_INTERFACE)
+        error_loc("interface %s previously not declared an interface at %s:%d\n",
+                  type->name, type->loc_info.input_name, type->loc_info.line_number);
+    return type;
+}
+
+type_t *type_interface_define(type_t *iface, attr_list_t *attrs, type_t *inherit, statement_list_t *stmts)
+{
+    if (iface->defined)
+        error_loc("interface %s already defined at %s:%d\n",
+                  iface->name, iface->loc_info.input_name, iface->loc_info.line_number);
+    if (iface == inherit)
+        error_loc("interface %s can't inherit from itself\n",
+                  iface->name);
+    iface->attrs = check_interface_attrs(iface->name, attrs);
     iface->details.iface = xmalloc(sizeof(*iface->details.iface));
     iface->details.iface->disp_props = NULL;
     iface->details.iface->disp_methods = NULL;
@@ -474,10 +459,24 @@
     iface->details.iface->async_iface = NULL;
     iface->defined = TRUE;
     compute_method_indexes(iface);
+    return iface;
 }
 
-void type_dispinterface_define(type_t *iface, var_list_t *props, var_list_t *methods)
+type_t *type_dispinterface_declare(char *name)
 {
+    type_t *type = get_type(TYPE_INTERFACE, name, NULL, 0);
+    if (type_get_type_detect_alias(type) != TYPE_INTERFACE)
+        error_loc("dispinterface %s previously not declared a dispinterface at %s:%d\n",
+                  type->name, type->loc_info.input_name, type->loc_info.line_number);
+    return type;
+}
+
+type_t *type_dispinterface_define(type_t *iface, attr_list_t *attrs, var_list_t *props, var_list_t *methods)
+{
+    if (iface->defined)
+        error_loc("dispinterface %s already defined at %s:%d\n",
+                  iface->name, iface->loc_info.input_name, iface->loc_info.line_number);
+    iface->attrs = check_dispiface_attrs(iface->name, attrs);
     iface->details.iface = xmalloc(sizeof(*iface->details.iface));
     iface->details.iface->disp_props = props;
     iface->details.iface->disp_methods = methods;
@@ -488,10 +487,15 @@
     iface->details.iface->async_iface = NULL;
     iface->defined = TRUE;
     compute_method_indexes(iface);
+    return iface;
 }
 
-void type_dispinterface_define_from_iface(type_t *dispiface, type_t *iface)
+type_t *type_dispinterface_define_from_iface(type_t *dispiface, attr_list_t *attrs, type_t *iface)
 {
+    if (dispiface->defined)
+        error_loc("dispinterface %s already defined at %s:%d\n",
+                  dispiface->name, dispiface->loc_info.input_name, dispiface->loc_info.line_number);
+    dispiface->attrs = check_dispiface_attrs(dispiface->name, attrs);
     dispiface->details.iface = xmalloc(sizeof(*dispiface->details.iface));
     dispiface->details.iface->disp_props = NULL;
     dispiface->details.iface->disp_methods = NULL;
@@ -502,25 +506,65 @@
     dispiface->details.iface->async_iface = NULL;
     dispiface->defined = TRUE;
     compute_method_indexes(dispiface);
+    return dispiface;
 }
 
-void type_module_define(type_t *module, statement_list_t *stmts)
+type_t *type_module_declare(char *name)
 {
-    if (module->details.module) error_loc("multiple definition error\n");
+    type_t *type = get_type(TYPE_MODULE, name, NULL, 0);
+    if (type_get_type_detect_alias(type) != TYPE_MODULE)
+        error_loc("module %s previously not declared a module at %s:%d\n",
+                  type->name, type->loc_info.input_name, type->loc_info.line_number);
+    return type;
+}
+
+type_t *type_module_define(type_t* module, attr_list_t *attrs, statement_list_t *stmts)
+{
+    if (module->defined)
+        error_loc("module %s already defined at %s:%d\n",
+                  module->name, module->loc_info.input_name, module->loc_info.line_number);
+    module->attrs = check_module_attrs(module->name, attrs);
     module->details.module = xmalloc(sizeof(*module->details.module));
     module->details.module->stmts = stmts;
     module->defined = TRUE;
+    return module;
 }
 
-type_t *type_coclass_define(type_t *coclass, ifref_list_t *ifaces)
+type_t *type_coclass_declare(char *name)
 {
+    type_t *type = get_type(TYPE_COCLASS, name, NULL, 0);
+    if (type_get_type_detect_alias(type) != TYPE_COCLASS)
+        error_loc("coclass %s previously not declared a coclass at %s:%d\n",
+                  type->name, type->loc_info.input_name, type->loc_info.line_number);
+    return type;
+}
+
+type_t *type_coclass_define(type_t *coclass, attr_list_t *attrs, ifref_list_t *ifaces)
+{
+    if (coclass->defined)
+        error_loc("coclass %s already defined at %s:%d\n",
+                  coclass->name, coclass->loc_info.input_name, coclass->loc_info.line_number);
+    coclass->attrs = check_coclass_attrs(coclass->name, attrs);
     coclass->details.coclass.ifaces = ifaces;
     coclass->defined = TRUE;
     return coclass;
 }
 
-type_t *type_runtimeclass_define(type_t *runtimeclass, ifref_list_t *ifaces)
+type_t *type_runtimeclass_declare(char *name, struct namespace *namespace)
 {
+    type_t *type = get_type(TYPE_RUNTIMECLASS, name, namespace, 0);
+    if (type_get_type_detect_alias(type) != TYPE_RUNTIMECLASS)
+        error_loc("runtimeclass %s previously not declared a runtimeclass at %s:%d\n",
+                  type->name, type->loc_info.input_name, type->loc_info.line_number);
+    return type;
+}
+
+type_t *type_runtimeclass_define(type_t *runtimeclass, attr_list_t *attrs, ifref_list_t *ifaces)
+{
+    if (runtimeclass->defined)
+        error_loc("runtimeclass %s already defined at %s:%d\n",
+                  runtimeclass->name, runtimeclass->loc_info.input_name, runtimeclass->loc_info.line_number);
+    runtimeclass->attrs = check_runtimeclass_attrs(runtimeclass->name, attrs);
     runtimeclass->details.runtimeclass.ifaces = ifaces;
     runtimeclass->defined = TRUE;
     if (!type_runtimeclass_get_default_iface(runtimeclass))
@@ -528,6 +572,25 @@
     return runtimeclass;
 }
 
+type_t *type_apicontract_declare(char *name, struct namespace *namespace)
+{
+    type_t *type = get_type(TYPE_APICONTRACT, name, namespace, 0);
+    if (type_get_type_detect_alias(type) != TYPE_APICONTRACT)
+        error_loc("apicontract %s previously not declared a apicontract at %s:%d\n",
+                  type->name, type->loc_info.input_name, type->loc_info.line_number);
+    return type;
+}
+
+type_t *type_apicontract_define(type_t *apicontract, attr_list_t *attrs)
+{
+    if (apicontract->defined)
+        error_loc("apicontract %s already defined at %s:%d\n",
+                  apicontract->name, apicontract->loc_info.input_name, apicontract->loc_info.line_number);
+    apicontract->attrs = check_apicontract_attrs(apicontract->name, attrs);
+    apicontract->defined = TRUE;
+    return apicontract;
+}
+
 int type_is_equal(const type_t *type1, const type_t *type2)
 {
     if (type_get_type_detect_alias(type1) != type_get_type_detect_alias(type2))
diff --git a/mingw-w64-tools/widl/src/typetree.h b/mingw-w64-tools/widl/src/typetree.h
index dc44c3f..8e04537 100644
--- a/mingw-w64-tools/widl/src/typetree.h
+++ b/mingw-w64-tools/widl/src/typetree.h
@@ -29,28 +29,39 @@
     NAME_C
 };
 
+attr_list_t *check_apicontract_attrs(const char *name, attr_list_t *attrs);
+attr_list_t *check_coclass_attrs(const char *name, attr_list_t *attrs);
+attr_list_t *check_dispiface_attrs(const char *name, attr_list_t *attrs);
+attr_list_t *check_interface_attrs(const char *name, attr_list_t *attrs);
+attr_list_t *check_module_attrs(const char *name, attr_list_t *attrs);
+attr_list_t *check_runtimeclass_attrs(const char *name, attr_list_t *attrs);
+
 type_t *type_new_function(var_list_t *args);
 type_t *type_new_pointer(type_t *ref);
 type_t *type_new_alias(const decl_spec_t *t, const char *name);
-type_t *type_new_module(char *name);
+type_t *type_module_declare(char *name);
 type_t *type_new_array(const char *name, const decl_spec_t *element, int declptr,
                        unsigned int dim, expr_t *size_is, expr_t *length_is);
 type_t *type_new_basic(enum type_basic_type basic_type);
 type_t *type_new_int(enum type_basic_type basic_type, int sign);
 type_t *type_new_void(void);
-type_t *type_new_coclass(char *name);
+type_t *type_coclass_declare(char *name);
 type_t *type_new_enum(const char *name, struct namespace *namespace, int defined, var_list_t *enums);
 type_t *type_new_struct(char *name, struct namespace *namespace, int defined, var_list_t *fields);
 type_t *type_new_nonencapsulated_union(const char *name, int defined, var_list_t *fields);
 type_t *type_new_encapsulated_union(char *name, var_t *switch_field, var_t *union_field, var_list_t *cases);
 type_t *type_new_bitfield(type_t *field_type, const expr_t *bits);
-type_t *type_new_runtimeclass(char *name, struct namespace *namespace);
-void type_interface_define(type_t *iface, type_t *inherit, statement_list_t *stmts);
-void type_dispinterface_define(type_t *iface, var_list_t *props, var_list_t *methods);
-void type_dispinterface_define_from_iface(type_t *dispiface, type_t *iface);
-void type_module_define(type_t *module, statement_list_t *stmts);
-type_t *type_coclass_define(type_t *coclass, ifref_list_t *ifaces);
-type_t *type_runtimeclass_define(type_t *runtimeclass, ifref_list_t *ifaces);
+type_t *type_runtimeclass_declare(char *name, struct namespace *namespace);
+type_t *type_interface_declare(char *name, struct namespace *namespace);
+type_t *type_interface_define(type_t *iface, attr_list_t *attrs, type_t *inherit, statement_list_t *stmts);
+type_t *type_dispinterface_declare(char *name);
+type_t *type_dispinterface_define(type_t *iface, attr_list_t *attrs, var_list_t *props, var_list_t *methods);
+type_t *type_dispinterface_define_from_iface(type_t *dispiface, attr_list_t *attrs, type_t *iface);
+type_t *type_module_define(type_t* module, attr_list_t *attrs, statement_list_t *stmts);
+type_t *type_coclass_define(type_t *coclass, attr_list_t *attrs, ifref_list_t *ifaces);
+type_t *type_runtimeclass_define(type_t *runtimeclass, attr_list_t *attrs, ifref_list_t *ifaces);
+type_t *type_apicontract_declare(char *name, struct namespace *namespace);
+type_t *type_apicontract_define(type_t *apicontract, attr_list_t *attrs);
 int type_is_equal(const type_t *type1, const type_t *type2);
 const char *type_get_name(const type_t *type, enum name_type name_type);
 char *gen_name(void);
diff --git a/mingw-w64-tools/widl/src/widltypes.h b/mingw-w64-tools/widl/src/widltypes.h
index 46a44da..0fba33d 100644
--- a/mingw-w64-tools/widl/src/widltypes.h
+++ b/mingw-w64-tools/widl/src/widltypes.h
@@ -103,9 +103,12 @@
     ATTR_ENCODE,
     ATTR_ENDPOINT,
     ATTR_ENTRY,
+    ATTR_EVENTADD,
+    ATTR_EVENTREMOVE,
     ATTR_EXCLUSIVETO,
     ATTR_EXPLICIT_HANDLE,
     ATTR_FAULTSTATUS,
+    ATTR_FLAGS,
     ATTR_FORCEALLOCATE,
     ATTR_HANDLE,
     ATTR_HELPCONTEXT,