Add MethodImplOptions.AggressiveOptimization and use it for tiering (#20009)
authorKoundinya Veluri <kouvel@users.noreply.github.com>
Wed, 3 Oct 2018 15:52:40 +0000 (08:52 -0700)
committerGitHub <noreply@github.com>
Wed, 3 Oct 2018 15:52:40 +0000 (08:52 -0700)
Add MethodImplOptions.AggressiveOptimization and use it for tiering

Part of fix for https://github.com/dotnet/corefx/issues/32235
Workaround for https://github.com/dotnet/coreclr/issues/19751
- Added and set CORJIT_FLAG_AGGRESSIVE_OPT to indicate that a method is flagged with AggressiveOptimization
- For a method flagged with AggressiveOptimization, tiering uses a foreground tier 1 JIT on first call to the method, skipping the tier 0 JIT and call counting
- When tiering is disabled, a method flagged with AggressiveOptimization does not use r2r-pregenerated code
- R2r crossgen does not generate code for a method flagged with AggressiveOptimization

19 files changed:
src/System.Private.CoreLib/shared/System/Runtime/CompilerServices/MethodImplOptions.cs
src/ilasm/asmparse.y
src/ilasm/prebuilt/asmparse.cpp
src/ildasm/dasm.cpp
src/inc/corhdr.h
src/inc/corinfo.h
src/inc/il_kywd.h
src/vm/CMakeLists.txt
src/vm/codeversion.cpp
src/vm/codeversion.h
src/vm/jitinterface.cpp
src/vm/method.hpp
src/vm/prestub.cpp
src/vm/tieredcompilation.cpp
src/vm/tieredcompilation.h
src/zap/zapinfo.cpp
tests/src/ilasm/System/Runtime/CompilerServices/MethodImplOptionsTests.cs [new file with mode: 0644]
tests/src/ilasm/System/Runtime/CompilerServices/MethodImplOptionsTests.csproj [new file with mode: 0644]
tests/src/ilasm/System/Runtime/CompilerServices/MiAggressiveOptimization.il [new file with mode: 0644]

index 2b5affc..b50ae09 100644 (file)
@@ -16,6 +16,7 @@ namespace System.Runtime.CompilerServices
         NoOptimization = 0x0040,
         PreserveSig = 0x0080,
         AggressiveInlining = 0x0100,
+        AggressiveOptimization = 0x0200,
         InternalCall = 0x1000
     }
 }
\ No newline at end of file
index 051df92..90a59d1 100644 (file)
@@ -78,7 +78,7 @@
 %token VALUE_ VALUETYPE_ NATIVE_ INSTANCE_ SPECIALNAME_ FORWARDER_
 %token STATIC_ PUBLIC_ PRIVATE_ FAMILY_ FINAL_ SYNCHRONIZED_ INTERFACE_ SEALED_ NESTED_
 %token ABSTRACT_ AUTO_ SEQUENTIAL_ EXPLICIT_ ANSI_ UNICODE_ AUTOCHAR_ IMPORT_ ENUM_
-%token VIRTUAL_ NOINLINING_ AGGRESSIVEINLINING_ NOOPTIMIZATION_ UNMANAGEDEXP_ BEFOREFIELDINIT_
+%token VIRTUAL_ NOINLINING_ AGGRESSIVEINLINING_ NOOPTIMIZATION_ AGGRESSIVEOPTIMIZATION_ UNMANAGEDEXP_ BEFOREFIELDINIT_
 %token STRICT_ RETARGETABLE_ WINDOWSRUNTIME_ NOPLATFORM_
 %token METHOD_ FIELD_ PINNED_ MODREQ_ MODOPT_ SERIALIZABLE_ PROPERTY_ TYPE_
 %token ASSEMBLY_ FAMANDASSEM_ FAMORASSEM_ PRIVATESCOPE_ HIDEBYSIG_ NEWSLOT_ RTSPECIALNAME_ PINVOKEIMPL_
@@ -854,6 +854,7 @@ implAttr                : /* EMPTY */                       { $$ = (CorMethodImp
                         | implAttr NOINLINING_              { $$ = (CorMethodImpl) ($1 | miNoInlining); }
                         | implAttr AGGRESSIVEINLINING_      { $$ = (CorMethodImpl) ($1 | miAggressiveInlining); }
                         | implAttr NOOPTIMIZATION_          { $$ = (CorMethodImpl) ($1 | miNoOptimization); }
+                        | implAttr AGGRESSIVEOPTIMIZATION_  { $$ = (CorMethodImpl) ($1 | miAggressiveOptimization); }
                         | implAttr FLAGS_ '(' int32 ')'     { $$ = (CorMethodImpl) ($4); }
                         ;
 
index 389546e..a5c7ccd 100644 (file)
@@ -140,196 +140,197 @@ typedef union  {
 # define NOINLINING_ 347 
 # define AGGRESSIVEINLINING_ 348 
 # define NOOPTIMIZATION_ 349 
-# define UNMANAGEDEXP_ 350 
-# define BEFOREFIELDINIT_ 351 
-# define STRICT_ 352 
-# define RETARGETABLE_ 353 
-# define WINDOWSRUNTIME_ 354 
-# define NOPLATFORM_ 355 
-# define METHOD_ 356 
-# define FIELD_ 357 
-# define PINNED_ 358 
-# define MODREQ_ 359 
-# define MODOPT_ 360 
-# define SERIALIZABLE_ 361 
-# define PROPERTY_ 362 
-# define TYPE_ 363 
-# define ASSEMBLY_ 364 
-# define FAMANDASSEM_ 365 
-# define FAMORASSEM_ 366 
-# define PRIVATESCOPE_ 367 
-# define HIDEBYSIG_ 368 
-# define NEWSLOT_ 369 
-# define RTSPECIALNAME_ 370 
-# define PINVOKEIMPL_ 371 
-# define _CTOR 372 
-# define _CCTOR 373 
-# define LITERAL_ 374 
-# define NOTSERIALIZED_ 375 
-# define INITONLY_ 376 
-# define REQSECOBJ_ 377 
-# define CIL_ 378 
-# define OPTIL_ 379 
-# define MANAGED_ 380 
-# define FORWARDREF_ 381 
-# define PRESERVESIG_ 382 
-# define RUNTIME_ 383 
-# define INTERNALCALL_ 384 
-# define _IMPORT 385 
-# define NOMANGLE_ 386 
-# define LASTERR_ 387 
-# define WINAPI_ 388 
-# define AS_ 389 
-# define BESTFIT_ 390 
-# define ON_ 391 
-# define OFF_ 392 
-# define CHARMAPERROR_ 393 
-# define INSTR_NONE 394 
-# define INSTR_VAR 395 
-# define INSTR_I 396 
-# define INSTR_I8 397 
-# define INSTR_R 398 
-# define INSTR_BRTARGET 399 
-# define INSTR_METHOD 400 
-# define INSTR_FIELD 401 
-# define INSTR_TYPE 402 
-# define INSTR_STRING 403 
-# define INSTR_SIG 404 
-# define INSTR_TOK 405 
-# define INSTR_SWITCH 406 
-# define _CLASS 407 
-# define _NAMESPACE 408 
-# define _METHOD 409 
-# define _FIELD 410 
-# define _DATA 411 
-# define _THIS 412 
-# define _BASE 413 
-# define _NESTER 414 
-# define _EMITBYTE 415 
-# define _TRY 416 
-# define _MAXSTACK 417 
-# define _LOCALS 418 
-# define _ENTRYPOINT 419 
-# define _ZEROINIT 420 
-# define _EVENT 421 
-# define _ADDON 422 
-# define _REMOVEON 423 
-# define _FIRE 424 
-# define _OTHER 425 
-# define _PROPERTY 426 
-# define _SET 427 
-# define _GET 428 
-# define _PERMISSION 429 
-# define _PERMISSIONSET 430 
-# define REQUEST_ 431 
-# define DEMAND_ 432 
-# define ASSERT_ 433 
-# define DENY_ 434 
-# define PERMITONLY_ 435 
-# define LINKCHECK_ 436 
-# define INHERITCHECK_ 437 
-# define REQMIN_ 438 
-# define REQOPT_ 439 
-# define REQREFUSE_ 440 
-# define PREJITGRANT_ 441 
-# define PREJITDENY_ 442 
-# define NONCASDEMAND_ 443 
-# define NONCASLINKDEMAND_ 444 
-# define NONCASINHERITANCE_ 445 
-# define _LINE 446 
-# define P_LINE 447 
-# define _LANGUAGE 448 
-# define _CUSTOM 449 
-# define INIT_ 450 
-# define _SIZE 451 
-# define _PACK 452 
-# define _VTABLE 453 
-# define _VTFIXUP 454 
-# define FROMUNMANAGED_ 455 
-# define CALLMOSTDERIVED_ 456 
-# define _VTENTRY 457 
-# define RETAINAPPDOMAIN_ 458 
-# define _FILE 459 
-# define NOMETADATA_ 460 
-# define _HASH 461 
-# define _ASSEMBLY 462 
-# define _PUBLICKEY 463 
-# define _PUBLICKEYTOKEN 464 
-# define ALGORITHM_ 465 
-# define _VER 466 
-# define _LOCALE 467 
-# define EXTERN_ 468 
-# define _MRESOURCE 469 
-# define _MODULE 470 
-# define _EXPORT 471 
-# define LEGACY_ 472 
-# define LIBRARY_ 473 
-# define X86_ 474 
-# define IA64_ 475 
-# define AMD64_ 476 
-# define ARM_ 477 
-# define MARSHAL_ 478 
-# define CUSTOM_ 479 
-# define SYSSTRING_ 480 
-# define FIXED_ 481 
-# define VARIANT_ 482 
-# define CURRENCY_ 483 
-# define SYSCHAR_ 484 
-# define DECIMAL_ 485 
-# define DATE_ 486 
-# define BSTR_ 487 
-# define TBSTR_ 488 
-# define LPSTR_ 489 
-# define LPWSTR_ 490 
-# define LPTSTR_ 491 
-# define OBJECTREF_ 492 
-# define IUNKNOWN_ 493 
-# define IDISPATCH_ 494 
-# define STRUCT_ 495 
-# define SAFEARRAY_ 496 
-# define BYVALSTR_ 497 
-# define LPVOID_ 498 
-# define ANY_ 499 
-# define ARRAY_ 500 
-# define LPSTRUCT_ 501 
-# define IIDPARAM_ 502 
-# define IN_ 503 
-# define OUT_ 504 
-# define OPT_ 505 
-# define PARAM_ 506 
-# define _OVERRIDE 507 
-# define WITH_ 508 
-# define NULL_ 509 
-# define HRESULT_ 510 
-# define CARRAY_ 511 
-# define USERDEFINED_ 512 
-# define RECORD_ 513 
-# define FILETIME_ 514 
-# define BLOB_ 515 
-# define STREAM_ 516 
-# define STORAGE_ 517 
-# define STREAMED_OBJECT_ 518 
-# define STORED_OBJECT_ 519 
-# define BLOB_OBJECT_ 520 
-# define CF_ 521 
-# define CLSID_ 522 
-# define VECTOR_ 523 
-# define _SUBSYSTEM 524 
-# define _CORFLAGS 525 
-# define ALIGNMENT_ 526 
-# define _IMAGEBASE 527 
-# define _STACKRESERVE 528 
-# define _TYPEDEF 529 
-# define _TEMPLATE 530 
-# define _TYPELIST 531 
-# define _MSCORLIB 532 
-# define P_DEFINE 533 
-# define P_UNDEF 534 
-# define P_IFDEF 535 
-# define P_IFNDEF 536 
-# define P_ELSE 537 
-# define P_ENDIF 538 
-# define P_INCLUDE 539 
+# define AGGRESSIVEOPTIMIZATION_ 350 
+# define UNMANAGEDEXP_ 351 
+# define BEFOREFIELDINIT_ 352 
+# define STRICT_ 353 
+# define RETARGETABLE_ 354 
+# define WINDOWSRUNTIME_ 355 
+# define NOPLATFORM_ 356 
+# define METHOD_ 357 
+# define FIELD_ 358 
+# define PINNED_ 359 
+# define MODREQ_ 360 
+# define MODOPT_ 361 
+# define SERIALIZABLE_ 362 
+# define PROPERTY_ 363 
+# define TYPE_ 364 
+# define ASSEMBLY_ 365 
+# define FAMANDASSEM_ 366 
+# define FAMORASSEM_ 367 
+# define PRIVATESCOPE_ 368 
+# define HIDEBYSIG_ 369 
+# define NEWSLOT_ 370 
+# define RTSPECIALNAME_ 371 
+# define PINVOKEIMPL_ 372 
+# define _CTOR 373 
+# define _CCTOR 374 
+# define LITERAL_ 375 
+# define NOTSERIALIZED_ 376 
+# define INITONLY_ 377 
+# define REQSECOBJ_ 378 
+# define CIL_ 379 
+# define OPTIL_ 380 
+# define MANAGED_ 381 
+# define FORWARDREF_ 382 
+# define PRESERVESIG_ 383 
+# define RUNTIME_ 384 
+# define INTERNALCALL_ 385 
+# define _IMPORT 386 
+# define NOMANGLE_ 387 
+# define LASTERR_ 388 
+# define WINAPI_ 389 
+# define AS_ 390 
+# define BESTFIT_ 391 
+# define ON_ 392 
+# define OFF_ 393 
+# define CHARMAPERROR_ 394 
+# define INSTR_NONE 395 
+# define INSTR_VAR 396 
+# define INSTR_I 397 
+# define INSTR_I8 398 
+# define INSTR_R 399 
+# define INSTR_BRTARGET 400 
+# define INSTR_METHOD 401 
+# define INSTR_FIELD 402 
+# define INSTR_TYPE 403 
+# define INSTR_STRING 404 
+# define INSTR_SIG 405 
+# define INSTR_TOK 406 
+# define INSTR_SWITCH 407 
+# define _CLASS 408 
+# define _NAMESPACE 409 
+# define _METHOD 410 
+# define _FIELD 411 
+# define _DATA 412 
+# define _THIS 413 
+# define _BASE 414 
+# define _NESTER 415 
+# define _EMITBYTE 416 
+# define _TRY 417 
+# define _MAXSTACK 418 
+# define _LOCALS 419 
+# define _ENTRYPOINT 420 
+# define _ZEROINIT 421 
+# define _EVENT 422 
+# define _ADDON 423 
+# define _REMOVEON 424 
+# define _FIRE 425 
+# define _OTHER 426 
+# define _PROPERTY 427 
+# define _SET 428 
+# define _GET 429 
+# define _PERMISSION 430 
+# define _PERMISSIONSET 431 
+# define REQUEST_ 432 
+# define DEMAND_ 433 
+# define ASSERT_ 434 
+# define DENY_ 435 
+# define PERMITONLY_ 436 
+# define LINKCHECK_ 437 
+# define INHERITCHECK_ 438 
+# define REQMIN_ 439 
+# define REQOPT_ 440 
+# define REQREFUSE_ 441 
+# define PREJITGRANT_ 442 
+# define PREJITDENY_ 443 
+# define NONCASDEMAND_ 444 
+# define NONCASLINKDEMAND_ 445 
+# define NONCASINHERITANCE_ 446 
+# define _LINE 447 
+# define P_LINE 448 
+# define _LANGUAGE 449 
+# define _CUSTOM 450 
+# define INIT_ 451 
+# define _SIZE 452 
+# define _PACK 453 
+# define _VTABLE 454 
+# define _VTFIXUP 455 
+# define FROMUNMANAGED_ 456 
+# define CALLMOSTDERIVED_ 457 
+# define _VTENTRY 458 
+# define RETAINAPPDOMAIN_ 459 
+# define _FILE 460 
+# define NOMETADATA_ 461 
+# define _HASH 462 
+# define _ASSEMBLY 463 
+# define _PUBLICKEY 464 
+# define _PUBLICKEYTOKEN 465 
+# define ALGORITHM_ 466 
+# define _VER 467 
+# define _LOCALE 468 
+# define EXTERN_ 469 
+# define _MRESOURCE 470 
+# define _MODULE 471 
+# define _EXPORT 472 
+# define LEGACY_ 473 
+# define LIBRARY_ 474 
+# define X86_ 475 
+# define IA64_ 476 
+# define AMD64_ 477 
+# define ARM_ 478 
+# define MARSHAL_ 479 
+# define CUSTOM_ 480 
+# define SYSSTRING_ 481 
+# define FIXED_ 482 
+# define VARIANT_ 483 
+# define CURRENCY_ 484 
+# define SYSCHAR_ 485 
+# define DECIMAL_ 486 
+# define DATE_ 487 
+# define BSTR_ 488 
+# define TBSTR_ 489 
+# define LPSTR_ 490 
+# define LPWSTR_ 491 
+# define LPTSTR_ 492 
+# define OBJECTREF_ 493 
+# define IUNKNOWN_ 494 
+# define IDISPATCH_ 495 
+# define STRUCT_ 496 
+# define SAFEARRAY_ 497 
+# define BYVALSTR_ 498 
+# define LPVOID_ 499 
+# define ANY_ 500 
+# define ARRAY_ 501 
+# define LPSTRUCT_ 502 
+# define IIDPARAM_ 503 
+# define IN_ 504 
+# define OUT_ 505 
+# define OPT_ 506 
+# define PARAM_ 507 
+# define _OVERRIDE 508 
+# define WITH_ 509 
+# define NULL_ 510 
+# define HRESULT_ 511 
+# define CARRAY_ 512 
+# define USERDEFINED_ 513 
+# define RECORD_ 514 
+# define FILETIME_ 515 
+# define BLOB_ 516 
+# define STREAM_ 517 
+# define STORAGE_ 518 
+# define STREAMED_OBJECT_ 519 
+# define STORED_OBJECT_ 520 
+# define BLOB_OBJECT_ 521 
+# define CF_ 522 
+# define CLSID_ 523 
+# define VECTOR_ 524 
+# define _SUBSYSTEM 525 
+# define _CORFLAGS 526 
+# define ALIGNMENT_ 527 
+# define _IMAGEBASE 528 
+# define _STACKRESERVE 529 
+# define _TYPEDEF 530 
+# define _TEMPLATE 531 
+# define _TYPELIST 532 
+# define _MSCORLIB 533 
+# define P_DEFINE 534 
+# define P_UNDEF 535 
+# define P_IFDEF 536 
+# define P_IFNDEF 537 
+# define P_ELSE 538 
+# define P_ENDIF 539 
+# define P_INCLUDE 540 
 #define yyclearin yychar = -1
 #define yyerrok yyerrflag = 0
 #ifndef YYMAXDEPTH
@@ -388,7 +389,7 @@ typedef     YYEXIND_T       yyexind_t;
 #endif
 # define YYERRCODE 256
 
-#line 2051 "asmparse.y"
+#line 2052 "asmparse.y"
 
 
 #include "grammar_after.cpp"
@@ -401,100 +402,100 @@ YYSTATIC YYCONST short yyexca[] = {
 #if !(YYOPTTIME)
 -1, 452,
 #endif
-       41, 532,
+       41, 533,
        -2, 308,
 #if !(YYOPTTIME)
 -1, 621,
 #endif
-       274, 549,
-       47, 549,
+       274, 550,
+       47, 550,
        -2, 227,
 #if !(YYOPTTIME)
 -1, 642,
 #endif
        40, 307,
        60, 307,
-       -2, 549,
+       -2, 550,
 #if !(YYOPTTIME)
 -1, 663,
 #endif
-       41, 532,
+       41, 533,
        -2, 308,
 #if !(YYOPTTIME)
 -1, 686,
 #endif
-       274, 549,
-       47, 549,
-       -2, 510,
+       274, 550,
+       47, 550,
+       -2, 511,
 #if !(YYOPTTIME)
 -1, 803,
 #endif
        123, 232,
-       -2, 549,
+       -2, 550,
 #if !(YYOPTTIME)
 -1, 828,
 #endif
-       41, 532,
+       41, 533,
        -2, 308,
 #if !(YYOPTTIME)
 -1, 953,
 #endif
-       41, 532,
+       41, 533,
        -2, 308,
 #if !(YYOPTTIME)
 -1, 986,
 #endif
-       41, 532,
+       41, 533,
        -2, 308,
 #if !(YYOPTTIME)
 -1, 987,
 #endif
-       41, 532,
+       41, 533,
        -2, 308,
 #if !(YYOPTTIME)
 -1, 1308,
 #endif
-       41, 532,
+       41, 533,
        -2, 308,
 #if !(YYOPTTIME)
 -1, 1309,
 #endif
-       41, 532,
+       41, 533,
        -2, 308,
 #if !(YYOPTTIME)
 -1, 1315,
 #endif
-       41, 532,
+       41, 533,
        -2, 308,
 #if !(YYOPTTIME)
 -1, 1322,
 #endif
-       41, 532,
+       41, 533,
        -2, 308,
 #if !(YYOPTTIME)
 -1, 1447,
 #endif
-       41, 532,
+       41, 533,
        -2, 308,
 #if !(YYOPTTIME)
 -1, 1479,
 #endif
-       41, 532,
+       41, 533,
        -2, 308,
 #if !(YYOPTTIME)
--1, 1545,
+-1, 1546,
 #endif
-       41, 532,
+       41, 533,
        -2, 308,
 #if !(YYOPTTIME)
--1, 1562,
+-1, 1563,
 #endif
-       41, 532,
+       41, 533,
        -2, 308,
 
 };
 
-# define YYNPROD 838
+# define YYNPROD 839
 #if YYOPTTIME
 YYSTATIC YYCONST yyexind_t yyexcaind[] = {
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
@@ -651,12 +652,12 @@ YYSTATIC YYCONST yyexind_t yyexcaind[] = {
     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,   74,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,   74,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,   78
+    0,    0,    0,   78
 };
 #endif
-# define YYLAST 3904
+# define YYLAST 3932
 
 YYSTATIC YYCONST short YYFARDATA YYACT[] = {
   699, 1398, 1121, 1466,  658, 1467,  639, 1024, 1465,  878,
@@ -666,572 +667,575 @@ YYSTATIC YYCONST short YYFARDATA YYACT[] = {
   690,  852,  273,  153,  219,  660,   24,   44,  776,  218,
   307,   10,  190,  176,   78,   81,    6,   86,    5,  598,
   673,  262,  204,  515,    3,  188,  217,  983,   17,  301,
-  603,  136,   76, 1550, 1194, 1242,  214,  264,    7, 1238,
- 1057, 1239, 1113, 1111,   85, 1112,  580,   74,  715,   88,
-   87,  137,   89,  300,  115,   56,  139,  712,  672,  113,
- 1058,   98,  112,  178,  179,  180,  181,   74,  272,  696,
-  322,  519, 1015,  461,  220,   56,   18,  452,  536,  338,
-  278,   88,   87, 1021,   89,  268,  216,  269, 1240,  225,
-   56,  265,  277,  277, 1228, 1229,  106, 1226, 1227,  590,
-  277,  343,  361,  360,  359,  358,  654,  368,  345,  653,
-   68,  310,  312,  314,  316,  318,  185, 1554,  460, 1126,
1127, 1414,   98,  931,  932,  327,  277,  348,  339, 1027,
-  342,  778, 1026,  779,  373,  366,  154,  277,  695,  133,
-  694,  991,  379,  271,  362,   84,  258,  364,  363,  376,
-  614,  192,  387,  105, 1519,  662,  513,  930,  365, 1059,
-  369,  202,  203,  371,  370, 1487,  374, 1264,  596,  450,
 661,  451,  763,  372,  416,  469,  186,  467,  471,  470,
-  442,   26,   74,  376,  456,  417,  418,  346,  376, 1559,
 352,  472,  474,  599,  353,  305,  483,  388,   88,   87,
 596,   89,  410, 1263, 1478,  500,  492, 1314,  457,  441,
-   24, 1200,  357,  491,  435,   10,  825,  797,  787,   56,
-  486,  432,  490,  428,  475,  478,  479,  773,  476,  429,
-  494,  434,   17,  192,  108,  666,  511,  511,  528,  534,
-  375,  433,    7,  351,  267,  321,  480,  481,  473,  485,
 152,  710,   74,  484, 1234,  540, 1345,  116, 1496, 1391,
  56, 1540,  499,   80,   79,  498,  543,  493, 1417,  571,
-  959,  268, 1351, 1544,  574,  348,  575,  154,  576,  436,
-   18,  266,  548, 1335, 1116,  578,  579,  504,  541,   46,
-  420,  544,  421,  422,  423,  933,  934,  570,  935,   88,
-  572,  947,   89,  573,   46,  594,  854,  855,  856, 1128,
 640,  641,  600,  135,  198,   88,   87,  962,   89,  199,
1541,  200,  568, 1510,  192,  487, 1341,  201,  612,  154,
-  755,  482,  277,  674, 1543,  510,  510,  527,  533,   74,
-  605,  744,  745,  746,  195,  808,  182,  623,  943,  611,
 599,  581,  582, 1141,  497, 1233,  700, 1252, 1142,  196,
-  565,  367,  375,  620,  595,  258,  610,   88,   87,  518,
-   89,   74,  606,  607,  608,  609,  747,  748,  749, 1542,
-  643,  613,  599,  537,  340,  341,  634, 1489,  348,  807,
-  459,  618,  619,  621,  780, 1130,  321,  876,  648,  649,
-  638,   88,   87,  177,   89, 1231,   88,   87,  847,   89,
-  152,  781,  702,  754,  347,  650,  664, 1502,  413,   88,
-   87,  670,  946, 1488,  651,   88,   87,  155,   89,  681,
-  642, 1518, 1126, 1127,  545,  743, 1118,  177,  993,  994,
-  995,  996,  177,  587,  505,  859,  352, 1513,  667,  988,
-  353,  678,   80,   79,  479,  177,  647,  692,  646, 1512,
-  782, 1511,   61,   62,   47,   63,  536, 1508,  357,  645,
-  685,  198,  741,  669,  480,  481,  199,  689,  200,   82,
-   63,   74,  701,  479,  201,  711,  680,  453,   72,  679,
-   88,   87,  519,   89,  512,  520,   74,  507,  508,  351,
-  686,  195,   88,  480,  481,   89,   74,  723,   71,   70,
-  354,  355,  356,  538,  691,  216,  196, 1141,  225, 1506,
1241,  724, 1142,  675,  676,  677,  720,  657,  721,   49,
-   50,   51,   52,   53,   54,   55,  671,  709,   74,  644,
-  479,  730, 1504,   80,   79,  714,   80,   79,  348,   49,
-   50,   51,   52,   53,   54,   55,  719,   74, 1141,  716,
-  480,  481,  726, 1142,   49,   50,   51,   52,   53,   54,
  55,  156,  157,  158,   69,  758,   74,  542,   74,   88,
-   87,  592,   89,  600,   67,  764,  765,  155,   88,   87,
-  688,   89,   74,  783,   98,  638,  729, 1320, 1319, 1318,
1317,  750,   74,  697,  325,   74,  703, 1172, 1171, 1170,
1169,  542,  705,  348,  706,  177,  377, 1499,  324,  769,
-  770,  771, 1337, 1338, 1339,  642,  815,  789,  813,  819,
-  853,   88,   87,  816,   89,  822,  541, 1180,  801,  802,
-   80,   79,  798,  823,   88,  812,  806,   89,   74,   66,
-  818,  626,  627,  628,   74, 1117,  833,  834,  762, 1450,
-  495,  826,  216,  786,  591,  225, 1439,  800,  793,  803,
-   74,  809,  796,  636,  846,  824,  382,  383,  384,  385,
-  817,  152,   74,  857,   74,   56,  629,  630,  631,  922,
-   74,  740,  821,   49,   50,   51,   52,   53,   54,   55,
1437,  850,  936,  937,  860, 1490,  516,  761,   88,   87,
-  375,   89,  832, 1327,  844, 1247, 1243, 1244, 1245, 1246,
1179, 1435,  769,  600,  949,  192,  845,  942, 1433,  848,
-  276,  156,  157,  158,   49,   50,   51,   52,   53,   54,
-   55,   97,   74,  924,  111,  925,  926,  927,  928,  929,
-  952, 1001, 1416, 1407,  985,  152,  635,  938, 1406,  277,
- 1013,  965,  362, 1326, 1011,   74,  354,  355,  356,  442,
- 1000, 1009,  528,  605, 1404,  585,  954,  584,  583,  145,
1390, 1012,  948, 1388,  586,  799,  960,  955,  277, 1017,
-  958,  692,  692, 1032, 1378, 1376, 1237,  350,  441,  999,
- 1008,  817, 1022,  435,  997, 1007,  851, 1374, 1037, 1014,
+  603,  136,   76, 1551, 1194, 1238,  214,  264,    7, 1242,
+ 1057, 1113, 1111, 1112,   85, 1239,  580,   88,   87,   74,
+   89,  137,   74,  300,  115,   56,  139,  715,  712,  113,
+ 1058,   98,  112,  178,  179,  180,  181,  696,  272,  519,
+  322, 1015,   56,  672,  220,  338,   18,  452,  277,  461,
+  278,  536,   68, 1228, 1229,  268,  216,  269,   56,  225,
+  376,  265, 1240,  277,   88,   87,  106,   89,  590,  931,
+  932,  343, 1226, 1227, 1021,  277,  361,  368,  345,  360,
+  359,  310,  312,  314,  316,  318,  358,  185,  654,  352,
 653, 1414,   98,  353,  460,  327, 1555, 1519,  339, 1027,
+  342, 1126, 1127,  930,  373,  366,  154,  348, 1341,  133,
+  277,  357,  379, 1026,  362,   88,   87,  364,   89,  277,
+  271,  192,  387,  352,  513,  695,  694,  353,  365,   84,
+  369,  202,  203,  105,  363, 1264,  374,  346,  614,  450,
1059,  451,  351,  258,  416,  357,   88,   87,  186,   89,
+  442,   26,  661,  662,  456,  417,  418,   74,  763,  376,
1541,  472,  474,  371,  370,  305,  483,  388,  599, 1560,
1478, 1263,  410,  372, 1314,  500,  351,  479,  457,  441,
+   24, 1200,  825,  491,  435,   10,  492,  797,   56,  787,
+  486,  432,  490,  428,  475,  478,  773,  480,  481,  429,
+  494,  434,   17,  192,  666, 1234,  511,  511,  528,  534,
+  375,  433,    7,  585,  267,  584,  583,  376,  473,  485,
1487,  108,  586,  484,  710,  540,  116,   74,  640,  641,
1542,   74,  499,  479,  596,  498,  543,  493,  700,  571,
+  321,  268,  933,  934,  574,  935,  575,  154,  576,  436,
+   18, 1417,  548,  480,  481,  578,  579,  504,  541,   80,
+   79,  544,  854,  855,  856,  266,   88,  570,  596,   89,
+  572, 1545,   46,  573, 1544,  744,  745,  746,   88,   87,
1118,   89,  600,  469, 1351,  467,  471,  470,  348,  626,
 627,  628,  568,  258,  192,  487,  497,  741,  612,  154,
+   88,  482, 1496,   89,   74,  510,  510,  527,  533, 1335,
+  605,  747,  748,  749,  177,   88,   87,  623,   89,  611,
1116,  581,  582,  947, 1141,  629,  630,  631,  594, 1142,
+  674,  135,  375,  620,  595, 1543,  610,  518,  348, 1518,
+  755, 1141,  606,  607,  608,  609, 1142,  321,  702, 1513,
+  643,  613, 1512,  198,   88,   87,  634,   89,  199,  182,
+  200,  618,  619,  621,  347,  277,  201,  459,  648,  649,
+  638, 1320, 1319, 1318, 1317, 1126, 1127,   88,   87, 1511,
+   89,  876,  152,  195,  808,  420,  664,  421,  422,  423,
+  847,  670, 1391, 1128,  651,  778,  198,  779,  196,  681,
+  642,  199,  962,  200,  943,   74, 1508,  743,  505,  201,
+  354,  355,  356,  177,  565,  859,  599, 1506,  667,  587,
+  537,  678,  536,  340,  341, 1510,  195,  692, 1252,  807,
+   88, 1499,  545,   89,   74,   88,   87, 1502,   89,   74,
+  685,  196, 1489,  669,  354,  355,  356,  689, 1130,   63,
+  599,  754,  701,   80,   79,  711,  680,  650,  453,  679,
+   74,  519, 1504,  512,  520,  647,  507,  508,  646,  645,
+  686,  177,   82,   88,   87,  350,   89,  723, 1488,   72,
+   71,  644,   70,  538,  691,  216,  413, 1141,  225,  542,
  69,  724, 1142,  657,   74, 1241,  720,   74,  721, 1117,
+   49,   50,   51,   52,   53,   54,   55,  709,  675,  676,
+  677,  730,  671, 1450,   67,  714,  740,   49,   50,   51,
+   52,   53,   54,   55,  352,   74,  719,  479,  353,  716,
+  853,  152,  726,   49,   50,   51,   52,   53,   54,   55,
1172, 1171, 1170, 1169,   56,  758,  357,  480,  481,  348,
+   66,   88,   87,  600,  946,  764,  765, 1327,   74,  155,
+  688, 1439,   74,  783,   98,  638,  729,  328,  329,  330,
 277,  750,   74,  697, 1437,   74,  703,  351,   80,   79,
 479,  348,  705, 1435,  706,  111, 1433,  177,  377,  769,
+  770,  771,  332, 1233, 1416,  642,  815,  789,  813,  819,
+  480,  481,   74,  816,  592,  822,  541, 1326,  801,  802,
+  990, 1407,  798,  823, 1406,  812,  806,  851, 1404, 1390,
+  818,  382,  383,  384,  385,   97,  833,  834, 1180,   74,
+  352,  826,  216,  786,  768,  225, 1388,  800,  793,  803,
+   74,  809,  796, 1231,  846,  824,  542, 1378,   80,   79,
+  817,  152,  357,  857,   80,   79,  479, 1345,  780,  922,
+   80,   79,  821,   49,   50,   51,   52,   53,   54,   55,
 516,  850,  936,  937,  860,  781,  480,  481, 1376,  277,
+  375,  988,  832,  351,  844,   74,  331,  591,  333,  334,
 335,  336,  769,  600,  949,  192,  845,  942,  337,  848,
+   88,   87, 1374,   89,  156,  157,  158,  325,  155, 1372,
+   56, 1179, 1370,  924,  636,  925,  926,  927,  928,  929,
+  952,  324,  799, 1368,  985,  782,  772,  938,  495, 1366,
+ 1013,  965,  362, 1364, 1011, 1362,  177, 1359, 1356,  442,
+ 1000, 1009,  528,  605, 1237,  352,  954, 1354, 1350,  353,
 762, 1012,  948, 1334, 1312, 1196,  960,  955,   46, 1017,
+  958,  692,  692, 1032,  277,  476,  276,  357,  441,  999,
+ 1008,  817, 1022,  435,  997, 1007, 1010, 1044, 1037, 1014,
   432,  817,  428,  849, 1019, 1035, 1016, 1018,  429, 1039,
-  434,  989,  326,  323,   88,   87,   94,   89,   74, 1372,
-  433, 1033, 1034, 1045,  352,  772,  828,  277,  353, 1030,
  80,   79,  479, 1050,  277,   56, 1370, 1368,  691,  691,
-   88,   87,  348,   89,   74,  954,  357,  337,  155,  348,
1366, 1364,  480,  481,  668, 1362,  817, 1359,  436,  998,
- 1006,  527, 1356, 1123, 1354, 1350,   56, 1334, 1312, 1055,
-  152, 1196,   88,   87,  718,   89,  177,  351, 1044, 1053,
 193,  615, 1043,  194, 1051,  348, 1042,  352, 1041,   46,
-  352,  353, 1122, 1023,  768,  820, 1067,  814, 1068, 1126,
- 1127,  501,  733,  617,  616, 1124,  198,  177, 1132,  357,
-  145,  199,  357,  200,   88,   87,  577,   89,  758,  201,
-  564, 1300,  155, 1236,  308, 1119,  455,  109, 1054, 1140,
- 1129,   92,  529, 1138, 1125, 1394,  195, 1298, 1115, 1185,
 351, 1183, 1184,  351,   88,   87, 1186,   89, 1178,  277,
 177,  196, 1296, 1491, 1064, 1060, 1061, 1062, 1063, 1025,
1492, 1133,  145, 1182, 1415,  328,  329,  330, 1294, 1181,
 956,   96, 1301,  590,  104,  103,  102,  101, 1219,   99,
 100,  105,   56,    1, 1175, 1332, 1195, 1173, 1299, 1203,
-  332,  941,  156,  157,  158, 1167, 1187, 1188, 1189, 1190,
- 1230,  766, 1202, 1297, 1165, 1232, 1191, 1192, 1193,   80,
-   79,  479,  588, 1131, 1223, 1225, 1224, 1222,  984, 1295,
- 1235, 1197, 1400,   88,   87, 1163,   89, 1198, 1161, 1199,
-  945,  480,  481,  589, 1218, 1176,  189,  708, 1174,   88,
-   87, 1005,   89, 1003, 1004, 1159, 1168,  155, 1010,   46,
-  707,  205,  152, 1157,  704, 1166,  633, 1412,  412,  187,
-  625,  790,   61,   62,   47,   63,  156,  157,  158, 1248,
- 1177,  192,  192,  192,  192,  177, 1164,  277, 1268, 1162,
-   46,  192,  192,  192,  331, 1266,  333,  334,  335,  336,
- 1155,  625, 1251,  192, 1411, 1265, 1160, 1269, 1410, 1271,
- 1273, 1274, 1255, 1277, 1158, 1279, 1280, 1281, 1282, 1283,
+  434,  989, 1247, 1243, 1244, 1245, 1246,  635,  351,  761,
+  433, 1033, 1034, 1045,   88,   87,  444,   89,   74, 1030,
1043,  718, 1042, 1050,   74,  145,   56, 1041,  691,  691,
+   88,   87,  348,   89,   74,  954,   88,   87,  155,   89,
 352, 1023,  828,  668,  353,  959,  817,  820,  436,  998,
+ 1006,  527,  277, 1123,  814,  354,  355,  356,  733, 1055,
+  348,  617,  357,  156,  157,  158,  177,   56, 1064, 1060,
1061, 1062, 1063,  616, 1051,   96,  577,  564,  104,  103,
+  102,  101, 1122,   99,  100,  105, 1067, 1236, 1068, 1126,
+ 1127, 1053,  529,  351,   74, 1124,    1, 1394, 1132,  615,
+  308,   88,   87,  448,   89,   58,   32,   59,  758, 1300,
+  455, 1337, 1338, 1339, 1298, 1119,  109,  445, 1296, 1140,
+ 1129,   56,  446, 1138, 1125,   41,   43,   92, 1115, 1185,
1294, 1183, 1184,  991,   46,  326,  323,  277, 1178,  367,
1054, 1186,   61,   62,   47,   63,  348,  437,  438,  956,
 189, 1133, 1415, 1182,  766, 1025, 1332,  526, 1175, 1181,
1301,  354,  355,  356,  205, 1299,  145,  447, 1219, 1297,
1131,   56, 1173,  590, 1167, 1165, 1195,   88,   87, 1203,
+   89, 1295,  984,  156,  157,  158, 1187, 1188, 1189, 1190,
+ 1230,  941, 1202,  588,  945, 1232, 1191, 1192, 1193,   80,
+   79,  479,  443,  440, 1223, 1225, 1224, 1222,  708, 1176,
+ 1235, 1197,   88,   87,  589,   89, 1163, 1198,  145, 1199,
+  707,  480,  481, 1174, 1218, 1168, 1166,  704, 1161,   49,
+   50,   51,   52,   53,   54,   55,  633,  521,  412,  187,
+   46,  118,  119,  120,  121,  122,  123,  124,  125,  126,
+  127,  128,  129,  130,  131,  132, 1400,  625,  790, 1248,
+ 1177,  192,  192,  192,  192,   88,   87, 1164,   89,  524,
+   56,  192,  192,  192,  277, 1412,  354,  355,  356, 1162,
+ 1159,   46, 1251,  192, 1157, 1265, 1155, 1269,  625, 1271,
+ 1273, 1274, 1255, 1277, 1411, 1279, 1280, 1281, 1282, 1283,
  1284, 1285, 1270, 1287, 1288, 1289, 1290, 1291, 1292, 1293,
- 1254, 1401, 1259,   56, 1302, 1303, 1153, 1305, 1304, 1151,
- 1272, 1149, 1275, 1276, 1147, 1278, 1221, 1048, 1267, 1047,
 836, 1156, 1307, 1286,  354,  355,  356, 1145, 1143,   49,
-   50,   51,   52,   53,   54,   55,  742, 1316,  118,  119,
-  120,  121,  122,  123,  124,  125,  126,  127,  128,  129,
-  130,  131,  132,  665, 1313,  352,  317, 1154,  454,  353,
1152,  315, 1150,  313, 1328, 1148,  378, 1330, 1331,  521,
- 1321,  156,  157,  158,  311,   45,   46,  357, 1146, 1144,
- 1336, 1340,  309, 1333,  817,   41,   43,  354,  355,  356,
-  354,  355,  356, 1135, 1342,  277,  277, 1140, 1552,  526,
-  590,   88,   87,  306,   89,   63,  415,  308,  351,  155,
1315, 1343,  308, 1257,  308,   56,  277,  503, 1452,  512,
-  590, 1451,  507,  508,  140,  308, 1380, 1381, 1382, 1383,
- 1384, 1385, 1386,  308,  944, 1347,   63,  177,  590, 1539,
-  590, 1329, 1344, 1392, 1393,  193,  531, 1346,  194,  532,
- 1397, 1396,  940,  831,  308,  138, 1379, 1402, 1403, 1031,
1524,  590,  923, 1408,  590,  590, 1395,  830,  811,  767,
-  760,  198,  177, 1405,  717,  566,  199,  349,  200,  258,
 303,  792, 1564,  117,  201,   97, 1555, 1553, 1140,   49,
  50,   51,   52,   53,   54,   55, 1546, 1523,  817, 1486,
- 1485,  195, 1484, 1454, 1449, 1446, 1443, 1442, 1438,   56,
-  524, 1436, 1434, 1432, 1419, 1413,  196,   46, 1409, 1389,
  49,   50,   51,   52,   53,   54,   55,  134, 1445, 1387,
1377, 1375, 1373, 1371, 1369, 1367, 1365, 1363, 1361, 1360,
 526, 1455, 1456, 1457, 1358, 1357, 1355, 1453, 1353, 1444,
- 1448, 1352,   63,  156,  157,  158, 1349, 1324, 1348, 1325,
+ 1254,   63, 1259, 1410, 1302, 1303, 1401, 1305, 1304, 1221,
+ 1272,  523, 1275, 1276,  525, 1278,   56, 1048, 1267, 1047,
1153, 1160, 1307, 1286,  836, 1158,  501, 1156, 1151,  982,
+  981,  980,  742,  975,  974,  973,  972, 1316,  970,  971,
+  105, 1149,  979,  978,  977,  976,  378,  665, 1147,  969,
+  967,  354,  355,  356, 1313, 1145,   88,   87, 1143,   89,
  74,  317,  315,  313, 1328,  454,  277, 1330, 1331,  193,
+ 1321, 1154,  194, 1257, 1135,   46,  277,  590, 1540, 1152,
+ 1336, 1340, 1001, 1333,  817,   49,   50,   51,   52,   53,
+   54,   55, 1150,  944, 1342,  198,  177, 1140,  526, 1148,
+  199,  311,  200,  309,  306,  590, 1146,   63,  201, 1144,
  45, 1343,  308,  308,  308,   56,  968,  531,  415,  940,
+  532,  993,  994,  995,  996,  195, 1380, 1381, 1382, 1383,
+ 1384, 1385, 1386, 1315,  831, 1347,  830,  590, 1329,  277,
+  196,  811, 1344, 1392, 1393,   61,   62,   47,   63,  767,
+ 1397, 1396,  308,  760,  308,  308, 1379, 1402, 1403,  140,
 717,  566, 1452, 1408,  590, 1451, 1395,  138, 1553, 1490,
+  590,  117,  303, 1405,   46,  193,  349, 1565,  194,  258,
1031,  792,  590,  923, 1556,  590, 1554, 1547, 1140, 1523,
1486,   49,   50,   51,   52,   53,   54,   55,  817, 1485,
+ 1484,  198,  177, 1454, 1449, 1446,  199, 1443,  200, 1442,
+  524, 1438,   56, 1436,  201,  134, 1434, 1432, 1419,  152,
1413, 1409, 1389, 1387, 1377, 1375, 1373, 1371, 1445, 1369,
  46,  195,   49,   50,   51,   52,   53,   54,   55, 1367,
1365, 1455, 1456, 1457, 1363, 1361,  196, 1453, 1360, 1444,
+ 1448, 1358,   63, 1357, 1355, 1353, 1352, 1349, 1348, 1325,
  1458, 1323,  523, 1311, 1470,  525, 1310, 1471, 1469, 1468,
- 1306, 1256, 1253,  258, 1476,  693, 1220,   88,   87, 1114,
-   89, 1052, 1481, 1038, 1480, 1036, 1029, 1028, 1020,  961,
-  951,  950,   56, 1498,  939, 1483, 1505, 1507, 1509,  858,
- 1505, 1507, 1509,  530,  841,  840, 1495, 1507, 1516,  838,
- 1520, 1517, 1515, 1514, 1522, 1521,   88,  835,  829,   89,
-  827,   56,  810, 1497, 1500, 1501,  791,  774,  738,   46,
-  737, 1538,  736, 1493,  735,  734,   49,   50,   51,   52,
-   53,   54,   55,  732,  731, 1529, 1505, 1507, 1509,  684,
-  637,  524,  569,  425,  424,  344,  258,  320,  206, 1562,
- 1547, 1525,  817, 1545, 1479, 1475, 1474, 1473, 1472, 1447,
- 1534, 1441, 1440, 1431, 1430,  354,  355,  356, 1551, 1429,
- 1549, 1428, 1427, 1548, 1535, 1536, 1537,  449, 1426, 1425,
- 1424, 1423, 1561,   63, 1422, 1421, 1560, 1563, 1420, 1418,
- 1300, 1298, 1296,  523, 1294, 1322,  525, 1175, 1173, 1557,
-   88, 1558, 1167,   89, 1556, 1526, 1527, 1528, 1530, 1531,
- 1532, 1533, 1165,   46, 1163,   96, 1161, 1159,  104,  103,
-  102,  101,   56,   99,  100,  105, 1157, 1155, 1153, 1151,
- 1149, 1309, 1308,  817, 1250, 1249, 1066, 1056, 1049, 1040,
-  245,  246,  247,  248,  249,  250,  251,  252,  253,  254,
-  255,  256,  257,  987,  986,  953,  843,   59,  842,  839,
-  837,  208,  259,  210,  228,  212,  213,   49,   50,   51,
-   52,   53,   54,   55,  728,   41,   43,  727,  713,  687,
-  683,  682,  663,   88,  632,  602,   89,  601,  593,  567,
-  547,  546,   61,   62,   47,   63,   46,  496,  419,  411,
-  874,  386,  319,  223,  304,  522,  514,  868,  517,  869,
-  870,  871,  509,  506,   56,  502,  302,  222,   36,  184,
-   93,   33,  468,  466,  465,   46,  464,  463,  244,  462,
-  227,  243,  215,  209,  245,  246,  247,  248,  249,  250,
-  251,  252,  253,  254,  255,  256,  257,  863,  864,  865,
-   95,   59,  226,  224,  207,  208,  259,  210,  228,  212,
-  213,  211,  879,   31,   56, 1002,  992,  439,  795,   41,
-   43,  431,  794,  430,  427,  539, 1046,  270,   83,   49,
-   50,   51,   52,   53,   54,   55,   61,   62,   47,   63,
-   29,   57,  862,  866,  867,   34,  872,  223,   25,  873,
-   16,  263,   15,   14,  261,   13,  260,   12,   11,    9,
-    8,  222, 1086,    4,    2,  234,  242,  245,  246,  247,
-  248,  249,  250,  251,  252,  253,  254,  255,  256,  257,
-  990,  241,  240,  239,   59,  238,   46,  237,  208,  259,
-  210,  228,  212,  213,  236,  235,  226,  224,  233,  232,
-  231,  230,   41,   43,  229,  114,   77,   42,   56,   38,
-   30,   58,   32,   59,  752,  656,  655, 1482,  299,   61,
-   62,   47,   63,   49,   50,   51,   52,   53,   54,   55,
-  223,   41,   43,   90,  183,  861, 1139,  757,  785, 1258,
-  957, 1137, 1136,  604,  222, 1461, 1460, 1459,   61,   62,
-   47,   63, 1477, 1463, 1462,   60,   35, 1201, 1120,  597,
-  659,   21,  777,   91,   37, 1069,  739,   65,   64,  197,
-  875,   39,   40,    0,  426,    0,    0,    0,    0,  226,
-  224,    0,  982,  981,  980,    0,  975,  974,  973,  972,
-    0,  970,  971,  105,    0,  979,  978,  977,  976,    0,
-    0,    0,  969,  967,    0,    0,   49,   50,   51,   52,
-   53,   54,   55,    0,    0,    0,    0,    0,    0,    0,
-   38,   30,   58,   32,   59,    0,   19,   20,   46,   22,
-   23,   48,    0,   27,   28,   49,   50,   51,   52,   53,
-   54,   55,   41,   43,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,   61,
-   62,   47,   63,    0,    0,    0,   60,   35,  968,    0,
-    0,    0,   21,    0,    0,   37,  444, 1097,    0,  874,
-    0,    0,   39,   40,    0,    0,  868,    0,  869,  870,
-  871,    0,    0,    0,    0,    0, 1073, 1074,    0, 1081,
- 1095, 1075, 1076, 1077, 1078,    0, 1079, 1080,    0, 1096,
- 1082, 1083, 1084, 1085,    0,    0,    0,    0,    0,    0,
-    0,    0,   46,    0,    0,    0,  863,  864,  865,    0,
-    0,    0,    0,    0,    0,    0,    0,   19,   20,    0,
-   22,   23,   48,    0,   27,   28,   49,   50,   51,   52,
-   53,   54,   55,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,  448,    0,   58,   32,   59,    0,    0,    0,
-  444,  862,  866,  867,    0,  872,  445,    0,  873,    0,
-    0,  446,    0,    0,   41,   43,    0,  146,  874,    0,
-    0,    0,    0,    0,    0,  868,    0,  869,  870,  871,
-    0,   61,   62,   47,   63,    0,  437,  438,    0,  921,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,  447,    0,    0,    0,
-    0,    0,    0,    0,    0,  863,  864,  865,   49,   50,
-   51,   52,   53,   54,   55,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,  448,    0,   58,   32,
-   59,  443,  440,    0,    0,    0,    0,    0,    0,    0,
-  445,    0,    0,    0,    0,  446,    0,    0,   41,   43,
-  862,  866,  867,    0,  872,    0,    0,  873,   49,   50,
-   51,   52,   53,   54,   55,   61,   62,   47,   63, 1494,
-  437,  438, 1071, 1072,    0, 1087, 1088, 1089,    0, 1090,
- 1091,    0,    0, 1092, 1093,    0, 1094,    0,    0,    0,
-  447,    0,    0,    0,    0,    0,    0,    0,    0, 1070,
- 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107,
- 1108, 1109, 1110,  893,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,  443,  440,  920,    0,    0,
-    0,    0,  885,  886,    0,  894,  911,  887,  888,  889,
-  890,    0,  891,  892,    0,  912,  895,  896,  897,  898,
-  893,    0,   49,   50,   51,   52,   53,   54,   55,    0,
-    0,    0,    0,    0,  920,  146,    0,    0,    0,  885,
-  886,    0,  894,  911,  887,  888,  889,  890,    0,  891,
-  892,    0,  912,  895,  896,  897,  898,    0,    0,    0,
-  909,    0,  913,    0,    0,  175,    0,  915,    0,  151,
-  148,  163,  161,  170,    0,  164,  165,  166,  167,    0,
-  168,  169,  917,    0,  171,  172,  173,  174,  563,    0,
-    0,  142,  162,  152,    0,    0,    0,  909,    0,  913,
-  141,  147,    0,    0,  915,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,  918,  143,  144,  149,  917,
-  555,    0,  549,  550,  551,  552,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,  146,    0,    0,    0,    0,
-  352,    0,    0,    0,  768,    0,    0,    0,    0,    0,
-  160,    0,  918,    0,    0,    0,    0,    0,  557,  558,
-  559,  560,  357,    0,  554,    0,    0,    0,  561,  562,
-  553,    0,    0,    0,    0,  982,  981,  980,    0,  975,
-  974,  973,  972,    0,  970,  971,  105,    0,  979,  978,
-  977,  976,    0,  622,    0,  969,  967,    0,    0,    0,
+ 1306, 1256,   97, 1253, 1476, 1563,  258, 1220,  693, 1114,
+ 1052, 1038, 1481, 1036, 1480, 1029,   49,   50,   51,   52,
+   53,   54,   55, 1498, 1028, 1483, 1505, 1507, 1509, 1020,
+ 1505, 1507, 1509,  961,  951,  950, 1495, 1507, 1516,   56,
+ 1520, 1517, 1515, 1514, 1522, 1521,   88,  939,  858,   89,
+  841,  840,  838, 1497, 1500, 1501,  835,  829,  827,   46,
+  810,   41,   43, 1493,  530,  791,   49,   50,   51,   52,
+   53,   54,   55,  774,  738,  737, 1505, 1507, 1509,  736,
+  735,   63,   56,  734,  732,  731,  684,   94,  522,  637,
+  569,  425,  817,  503,  424,  512,  344,  320,  507,  508,
+ 1548, 1546, 1479,  258, 1475,  206, 1474, 1473, 1472, 1552,
+ 1447, 1550, 1441, 1005, 1549, 1003, 1004, 1440,   88,   87,
+ 1431,   89, 1430, 1562, 1429, 1428,  155, 1561, 1564, 1427,
+ 1426, 1425, 1424, 1423,   61,   62,   47,   63,  152, 1422,
+ 1558, 1421, 1559,   88, 1420, 1557,   89, 1418,  449, 1300,
+ 1298, 1296, 1294, 1322,  177, 1175,   46, 1491, 1173, 1167,
+ 1165, 1163, 1161, 1159, 1492,   49,   50,   51,   52,   53,
+   54,   55, 1157, 1155,  817,  514, 1153, 1151, 1149, 1309,
+ 1308,  245,  246,  247,  248,  249,  250,  251,  252,  253,
+  254,  255,  256,  257,   56, 1250, 1249, 1066,   59, 1056,
+ 1049, 1040,  208,  259,  210,  228,  212,  213,  987,  986,
+  953,  843,  842,  839,  837,  728,   41,   43,  727,  517,
+  713,   49,   50,   51,   52,   53,   54,   55,  687,  683,
+  682,  663,  632,   61,   62,   47,   63,  602,  601,  593,
+   88,  567,   96,   89,  223,  104,  103,  102,  101,  547,
+   99,  100,  105,   46,  546,  496,  419,  411,  222,  386,
+  319,  304,  509,  302,  506,  502,   36,  184, 1324,   93,
+  152,  156,  157,  158,   33,  468,  466,  465,  245,  246,
+  247,  248,  249,  250,  251,  252,  253,  254,  255,  256,
+  257,  464,  463,  226,  224,   59,   46,   95,  244,  208,
+  259,  210,  228,  212,  213,  462,  227,   88,   87,  243,
+   89,  215,  209,   41,   43,  155,  207,  211,  879,   31,
+   49,   50,   51,   52,   53,   54,   55, 1002,  992,  439,
+   61,   62,   47,   63,  795,  431,  794,  430,  427,  539,
+   56,  223,  270,  177,   83,   29, 1268,   57, 1046,   34,
+   25,   16,  263, 1266,   15,  222,   14,  261,   13,  260,
+   12,   11,    9,    8,    4,    2,  234,  242,  241,  240,
+  239,  238,  237,  236,  235,  245,  246,  247,  248,  249,
+  250,  251,  252,  253,  254,  255,  256,  257, 1086,  233,
+  226,  224,   59,  232,  231,  230,  208,  259,  210,  228,
+  212,  213,  229,  114,   77,   42,  426,  752,   46,  656,
+   41,   43,  655, 1482,  299,   90,  183,   49,   50,   51,
+   52,   53,   54,   55,  861, 1139,  757,   61,   62,   47,
+   63,   38,   30,   58,   32,   59,  785, 1258,  223,   88,
+   87,  957,   89, 1137, 1136,  604, 1461,  155, 1460, 1459,
+ 1477, 1463,  222,   41,   43, 1462, 1201, 1120,  597,  659,
+  156,  157,  158,  777,   91, 1069,  739,   65,   64,  197,
+   61,   62,   47,   63,  875,  177,    0,   60,   35,    0,
+    0,    0,    0,   21,    0, 1346,   37,  226,  224,    0,
+    0,    0,    0,   39,   40,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,   49,   50,   51,   52,   53,   54,
+   55,  874,    0,    0,    0,    0,    0,    0,  868,    0,
+  869,  870,  871,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,   38,   30,   58,   32,   59,   19,   20,
+    0,   22,   23,   48,   46,   27,   28,   49,   50,   51,
+   52,   53,   54,   55,    0,   41,   43,    0,  863,  864,
+  865,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,   61,   62,   47,   63,    0,    0,  921,   60,
+   35,    0,  156,  157,  158,   21,    0,    0,   37,    0,
+    0,  874,  444, 1097,    0,   39,   40,    0,  868,    0,
+  869,  870,  871,    0,  862,  866,  867,    0,  872,    0,
+    0,  873, 1073, 1074,    0, 1081, 1095, 1075, 1076, 1077,
+ 1078,    0, 1079, 1080,    0, 1096, 1082, 1083, 1084, 1085,
+    0,    0,    0,    0,    0,    0,    0,    0,  863,  864,
+  865,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+   19,   20,    0,   22,   23,   48,    0,   27,   28,   49,
+   50,   51,   52,   53,   54,   55,    0,  874,    0,    0,
+    0,    0,    0,    0,  868,    0,  869,  870,  871,  448,
+    0,   58,   32,   59,  862,  866,  867,    0,  872,    0,
+    0,  873,    0,  445,    0,    0,    0,    0,  446,    0,
+    0,   41,   43,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,  893,    0,  863,  864,  865,    0,   61,   62,
+   47,   63,  146,  437,  438,    0,  920,    0,    0,    0,
+    0,  885,  886,    0,  894,  911,  887,  888,  889,  890,
+    0,  891,  892,  447,  912,  895,  896,  897,  898,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+  862,  866,  867,    0,  872,    0,    0,  873,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,  443,  440,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,  909,
+    0,  913,    0,    0,    0,    0,  915,    0,    0,    0,
+    0,    0,    0,    0,    0,   49,   50,   51,   52,   53,
+   54,   55,  917, 1524,    0,    0,    0,    0,    0, 1071,
+ 1072,    0, 1087, 1088, 1089,    0, 1090, 1091,    0,    0,
+ 1092, 1093,    0, 1094,    0,    0,    0,    0,    0,    0,
+ 1494,    0,    0,    0,    0,  918, 1070, 1098, 1099, 1100,
+ 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,  893,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,  920,    0,    0,    0,    0,  885,  886,    0,  894,
+  911,  887,  888,  889,  890,    0,  891,  892,    0,  912,
+  895,  896,  897,  898,    0,    0,  146,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,  880,    0,  881,  882,  883,
   884,  899,  900,  901,  916,  902,  903,  904,  905,  906,
-  907,  908,  910,  914,    0,    0,    0,  919,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,  880,    0,  881,  882,  883,  884,  899,  900,
-  901,  916,  902,  903,  904,  905,  906,  907,  908,  910,
-  914,  968,   88,   87,  919,   89,    0,    0,    0,    0,
-  155,    0,  556,  175,    0,    0,    0,  151,  148,  163,
-  161,  170,    0,  164,  165,  166,  167,    0,  168,  169,
-    0,    0,  171,  172,  173,  174,  146,    0,  177,  142,
-  162,  352,    0,    0,    0,  353,    0,    0,  141,  147,
+  907,  908,  910,  914,  909,    0,  913,  919,    0,    0,
+  175,  915,    0,    0,  151,  148,  163,  161,  170,    0,
+  164,  165,  166,  167,  152,  168,  169,  917,    0,  171,
+  172,  173,  174,  563, 1539,    0,  142,  162,    0,    0,
+    0,    0,    0,    0,    0,  141,  147,    0, 1529,    0,
+  146,    0,    0,    0,    0,  352,    0,    0,    0,  768,
+  918,  143,  144,  149, 1525,  555,    0,  549,  550,  551,
+  552,    0,    0, 1534,    0,    0,    0,  357,    0,    0,
+    0,    0,    0,    0,    0,    0,    0, 1535, 1536, 1537,
+ 1538,    0,    0,    0,    0,    0,  160,    0,    0,    0,
+    0,    0,    0,    0,  557,  558,  559,  560,  622,    0,
+  554,    0,    0,    0,  561,  562,  553,    0,    0, 1526,
+ 1527, 1528, 1530, 1531, 1532, 1533,  982,  981,  980,    0,
+  975,  974,  973,  972,    0,  970,  971,  105,    0,  979,
+  978,  977,  976,    0,    0,    0,  969,  967,    0,    0,
+  880,    0,  881,  882,  883,  884,  899,  900,  901,  916,
+  902,  903,  904,  905,  906,  907,  908,  910,  914,    0,
+    0,    0,  919,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,  357,  143,  144,  149,    0,    0,  175,
-    0,    0,    0,    0,    0,  163,  161,  170,    0,  164,
-  165,  166,  167,    0,  168,  169,    0,    0,  171,  172,
-  173,  174,    0,    0,  622, 1261,  162,    0,  160,  159,
-    0,    0,   88,   87,    0,   89,    0,    0,    0,    0,
-  155,    0,    0,  175,    0,    0,    0,  151,  148,  163,
-  161,  170,    0,  164,  165,  166,  167,    0,  168,  169,
-    0,    0,  171,  172,  173,  174,    0,    0,  177,  142,
-  162,    0,    0, 1262,    0,    0,    0,    0,  141,  147,
-    0,    0,    0,    0,  156,  157,  158,    0,    0,    0,
-    0, 1260,    0,    0,  143,  144,  149,    0,    0,    0,
-    0,    0,    0,    0,  297,  198,  146,    0,    0,    0,
-  199,  352,  200,    0,    0,  353,    0,    0,  201,    0,
-    0,   63,    0,    0,    0,    0,    0,    0,  160,    0,
-  354,  355,  356,  357,    0,  195,  284,    0,  279,  280,
-  281,  282,  283,    0,  640,  641,    0,  287,    0,    0,
-  196,    0,    0,    0,    0,    0,  285,    0,    0,    0,
-  295,    0,  286,    0,  622,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,  288,  289,  290,  291,  292,  293,
-  294,  298,    0,    0,  156,  157,  158,  296,    0,    0,
     0,    0,    0,   88,   87,    0,   89,    0,    0,    0,
-  146,  155,    0,    0,  175,    0,    0,    0,  151,  148,
-  163,  161,  170,    0,  164,  165,  166,  167,    0,  168,
+    0,  155,    0,    0,  175,    0,    0,    0,  151,  148,
+  163,  161,  170,  968,  164,  165,  166,  167,  556,  168,
   169,    0,    0,  171,  172,  173,  174,    0,    0,  177,
   142,  162,    0,    0,    0,    0,    0,    0,    0,  141,
-  147,    0,    0,    0,  348,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,  143,  144,  149,  274, 1217,
- 1216, 1211,    0, 1210, 1209, 1208, 1207,  146, 1205, 1206,
-  105,    0, 1215, 1214, 1213, 1212,    0,    0,    0,    0,
-    0, 1204,    0,    0,    0,    0,    0,    0,    0,  160,
-    0,  354,  355,  356,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,  640,  641,  982,  981,  980,
-    0,  975,  974,  973,  972,    0,  970,  971,  105,    0,
-  979,  978,  977,  976,    0,  274,    0,  969,  967,    0,
-    0,    0,    0,   88,   87,    0,   89,    0,    0,    0,
-    0,  155,    0,    0,  175,  156,  157,  158,  151,  148,
-  163,  161,  170,    0,  164,  165,  166,  167,    0,  168,
-  169,    0,    0,  171,  172,  173,  174,  146,    0,  177,
-  142,  162,    0,    0,    0,    0,    0,    0,    0,  141,
-  147,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,  968,    0,  143,  144,  149,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+  147,    0,    0,    0,  146,    0,    0,    0,    0,  352,
+    0,    0,    0,  353,    0,  143,  144,  149,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,  274,    0,   88,   87,  160,
-   89,  354,  355,  356,  146,  155,    0,    0,  175,    0,
-    0,    0,  151,  148,  163,  161,  170,    0,  164,  165,
-  166,  167,    0,  168,  169,    0,    0,  171,  172,  173,
+    0,  357,    0,    0,    0,    0,    0,   88,   87,    0,
+   89,    0,    0,    0,    0,  155,    0,    0,  175,    0,
+  160,  159,  151,  148,  163,  161,  170,    0,  164,  165,
+  166,  167,  622,  168,  169,    0,    0,  171,  172,  173,
   174,    0,    0,  177,  142,  162,    0,    0,    0,    0,
     0,    0,    0,  141,  147,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,  156,  157,  158,    0,  143,
-  144,  149,  274,  805,   88,   87,    0,   89,    0,    0,
-    0,    0,  155,    0,    0,  175,    0,    0,    0,  151,
-  148,  163,  161,  170,    0,  164,  165,  166,  167,    0,
-  168,  169,    0,  160,  171,  172,  173,  174,  146,    0,
-  177,  142,  162,    0,    0,    0,    0,  804,    0,    0,
-  141,  147,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,  143,  144,  149,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,  156,
-  157,  158,    0,    0,    0,    0,  274,    0,    0,    0,
-  160,  159,    0,    0,   88,   87,  146,   89,    0,    0,
-    0,    0,  155,    0,    0,  175,    0,    0,    0,  151,
-  148,  163,  161,  170,    0,  164,  165,  166,  167,    0,
-  168,  169,    0,    0,  171,  172,  173,  174,    0,    0,
-  177,  142,  162,    0,    0,    0,    0,    0,    0,    0,
-  141,  147,    0,    0,    0,    0,  156,  157,  158,    0,
-    0,    0,    0,    0,  274,    0,  143,  144,  149,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,  143,
+  144,  149,    0,    0,    0,    0,  156,  157,  158,    0,
+  297,  198,    0,    0,    0,    0,  199,    0,  200,    0,
+    0,    0,    0,    0,  201,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,  160,    0,  354,  355,  356,    0,
+    0,  195,  284,   63,  279,  280,  281,  282,  283,    0,
+  640,  641,  146,  287,    0,    0,  196,  352,    0,    0,
+    0,  353,  285,    0,    0,    0,    0,  295,    0,  286,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,  357,
+    0,  288,  289,  290,  291,  292,  293,  294,  298,    0,
+  156,  157,  158,    0,  296,    0,  175,    0,    0,    0,
+    0,    0,  163,  161,  170,    0,  164,  165,  166,  167,
+  622,  168,  169,    0,    0,  171,  172,  173,  174,    0,
+    0,    0, 1261,  162,    0,    0,    0,    0,    0,    0,
     0,   88,   87,    0,   89,    0,    0,    0,    0,  155,
     0,    0,  175,    0,    0,    0,  151,  148,  163,  161,
-  170,    0,  164,  165,  166,  167,    0,  168,  169,    0,
-  160,  171,  172,  173,  174,    0,    0,  177,  142,  162,
   0,    0,    0,    0,    0,    0,    0,  759,  147,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+  170,    0,  164,  165,  166,  167,  146,  168,  169,    0,
+    0,  171,  172,  173,  174,    0,    0,  177,  142,  162,
1262,    0,    0,    0,    0,    0,    0,  141,  147,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0, 1260,
     0,    0,    0,  143,  144,  149,    0,    0,    0,    0,
+    0,    0,  982,  981,  980,    0,  975,  974,  973,  972,
+    0,  970,  971,  105,  274,  979,  978,  977,  976,    0,
+    0,    0,  969,  967,    0,  146,    0,    0,  160,    0,
+  354,  355,  356,  348,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,  640,  641,    0,    0, 1217, 1216,
+ 1211,    0, 1210, 1209, 1208, 1207,    0, 1205, 1206,  105,
+    0, 1215, 1214, 1213, 1212,    0,    0,    0,    0,    0,
+ 1204,    0,    0,    0,    0,    0,    0,    0,    0,   88,
+   87,    0,   89,  274,  156,  157,  158,  155,    0,  968,
+  175,    0,    0,    0,  151,  148,  163,  161,  170,    0,
+  164,  165,  166,  167,    0,  168,  169,    0,    0,  171,
+  172,  173,  174,  146,    0,  177,  142,  162,    0,    0,
+    0,    0,    0,    0,    0,  141,  147,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,  146,    0,    0,    0,    0,  156,  157,  158,    0,
-    0,    0,    0,    0,    0,   88,   87,  160,   89,    0,
-    0,    0,    0,  155,    0,    0,  175,    0,    0,    0,
-  151,  148,  163,  161,  170,    0,  164,  165,  166,  167,
-    0,  168,  169,    0,    0,  171,  172,  173,  174,    0,
-    0,  177,  142,  162,    0,    0,  146,    0,    0,    0,
-    0,  141,  147,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,  156,  157,  158,    0,  143,  144,  149,
-    0,    0,    0,   88,   87,    0,   89,    0,    0,    0,
+    0,  143,  144,  149,    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,  274,    0,    0,    0,    0,  160,    0,  354,  355,
+  356,  146,    0,   88,   87,    0,   89,    0,    0,    0,
     0,  155,    0,    0,  175,    0,    0,    0,  151,  148,
   163,  161,  170,    0,  164,  165,  166,  167,    0,  168,
-  169,  652,  146,  171,  172,  173,  174,    0,    0,  177,
-  142,  162,   88,   87,    0,   89,    0,    0,    0,  141,
-  147,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,  143,  144,  149,    0,    0,
-    0,    0,    0,    0,    0,    0,  409,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,  146,  156,  157,  158,
-  988,    0,    0,    0,    0,    0,    0,    0,    0,  458,
-    0,    0,    0,    0,  391,    0,    0,    0,  407,    0,
-    0,  389,  390,    0,    0,    0,  393,  394,  405,  395,
-  396,  397,  398,  399,  400,  401,  402,  392,    0,    0,
-    0,    0,    0,  406,    0,    0,  404,    0,    0,    0,
-  146,    0,    0,  403,  722,    0,    0,    0,    0,    0,
-    0,    0,  408,    0,    0,  156,  157,  158,  488,  175,
-  489,    0,    0,  151,  148,  163,  161,  170,    0,  164,
+  169,    0,    0,  171,  172,  173,  174,    0,    0,  177,
+  142,  162,    0,    0,    0,    0,    0,    0,    0,  141,
+  147,    0,  156,  157,  158,    0,    0,    0,    0,  274,
+    0,    0,    0,    0,    0,  143,  144,  149,    0,  805,
+    0,    0,   88,   87,    0,   89,    0,    0,    0,    0,
+  155,    0,    0,  175,    0,    0,    0,  151,  148,  163,
+  161,  170,    0,  164,  165,  166,  167,    0,  168,  169,
+  160,  146,  171,  172,  173,  174,    0,    0,  177,  142,
+  162,    0,    0,    0,  804,    0,    0,    0,  141,  147,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,  143,  144,  149,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,  156,  157,  158,  274,
+   88,   87,    0,   89,    0,    0,    0,    0,  155,  160,
+  159,  175,    0,    0,    0,  151,  148,  163,  161,  170,
+    0,  164,  165,  166,  167,    0,  168,  169,    0,    0,
+  171,  172,  173,  174,    0,    0,  177,  142,  162,    0,
+    0,    0,    0,    0,  146,    0,  141,  147,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,  143,  144,  149,  156,  157,  158,   88,   87,
+    0,   89,    0,    0,    0,    0,  155,    0,    0,  175,
+    0,    0,    0,  151,  148,  163,  161,  170,    0,  164,
+  165,  166,  167,    0,  168,  169,    0,  160,  171,  172,
+  173,  174,  274,    0,  177,  142,  162,  146,    0,    0,
+    0,    0,    0,    0,  759,  147,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+  143,  144,  149,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,  156,  157,  158,    0,    0,    0,    0,
+    0,    0,    0,  146,    0,  160,    0,    0,   88,   87,
+    0,   89,    0,    0,   88,   87,  155,   89,    0,  175,
+    0,    0,    0,  151,  148,  163,  161,  170,    0,  164,
   165,  166,  167,    0,  168,  169,    0,    0,  171,  172,
-  173,  174,    0,    0,  177,  142,  162,    0,    0,    0,
-    0,    0,    0,    0,  141,  147,    0,    0,    0,    0,
+  173,  174,    0,    0,  177,  142,  162,    0,  409,    0,
+    0,    0,    0,    0,  141,  147,    0,  146,    0,    0,
+    0,  156,  157,  158,    0,    0,    0,    0,    0,    0,
+  143,  144,  149,    0,    0,    0,  391,    0,    0,    0,
+  407,    0,    0,  389,  390,    0,    0,    0,  393,  394,
+  405,  395,  396,  397,  398,  399,  400,  401,  402,  392,
+    0,    0,    0,    0,    0,  652,  406,    0,    0,  404,
+    0,   88,   87,  146,   89,  988,  403,    0,    0,  155,
+    0,    0,  175,    0,    0,  408,  151,  148,  163,  161,
+  170,    0,  164,  165,  166,  167,    0,  168,  169,    0,
+    0,  171,  172,  173,  174,    0,    0,  177,  142,  162,
+    0,    0,    0,    0,    0,    0,    0,  141,  147,    0,
+    0,  156,  157,  158,    0,    0,    0,  146,    0,    0,
+    0,  722,    0,  143,  144,  149,    0,    0,    0,    0,
+    0,    0,    0,    0,  488,  175,  489,    0,    0,  151,
+  148,  163,  161,  170,    0,  164,  165,  166,  167,    0,
+  168,  169,    0,    0,  171,  172,  173,  174,  458,    0,
+  177,  142,  162,    0,    0,    0,    0,    0,    0,    0,
+  141,  147,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,  143,  144,  149,    0,
+  380,  175,  381,    0,    0,  151,  148,  163,  161,  170,
+    0,  164,  165,  166,  167,    0,  168,  169,    0,    0,
+  171,  172,  173,  174,  156,  157,  158,  142,  162,    0,
+    0,  160,    0,    0,    0,    0,  141,  147,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-  143,  144,  149,  380,  175,  381,    0,    0,  151,  148,
-  163,  161,  170,    0,  164,  165,  166,  167,    0,  168,
-  169,    0,    0,  171,  172,  173,  174,    0,    0,    0,
-  142,  162,    0,    0,  160,    0,    0,    0,    0,  141,
-  147,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,  143,  144,  149,    0,    0,
-  175,    0,    0,    0,  151,  148,  163,  161,  170,    0,
-  164,  165,  166,  167,    0,  168,  169,    0,    0,  171,
-  172,  173,  174,    0,    0,    0,  142,  162,    0,  160,
-    0,    0,    0,    0,    0,  141,  147,    0,    0,    0,
+    0,    0,  143,  144,  149,  175,    0,    0,    0,  151,
+  148,  163,  161,  170,    0,  164,  165,  166,  167,    0,
+  168,  169,    0,    0,  171,  172,  173,  174,    0,    0,
+    0,  142,  162,    0,    0,    0,    0,  160,    0,    0,
+  141,  147,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,  143,  144,  149,    0,
+    0,  175,    0,    0,    0,  151,  148,  163,  161,  170,
+    0,  164,  165,  166,  167,    0,  168,  169,    0,    0,
+  171,  172,  173,  174,    0,    0,    0,  142,  162,    0,
+    0,  160,    0,    0,    0,    0,  141,  147,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,  143,  144,  149,  175,    0,    0,    0,  151,
+  148,  163,  161,  170,    0,  164,  165,  166,  167,    0,
+  168,  169,    0,    0,  171,  172,  173,  174,    0,    0,
+    0,  142,  162,    0,    0,    0,    0,  160,    0,    0,
+  141,  147,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,  143,  144,  149,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,  143,  144,  149,  175,    0,    0,    0,  151,  148,
-  163,  161,  170,    0,  164,  165,  166,  167,    0,  168,
-  169,    0,    0,  171,  172,  173,  174,    0,    0,    0,
-  142,  162,    0,    0,    0,  160,    0,    0,    0,  141,
-  147,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,  143,  144,  149,  175,    0,
-    0,    0,  151,  148,  163,  161,  170,    0,  164,  165,
-  166,  167,    0,  168,  169,    0,    0,  171,  172,  173,
-  174,    0,    0,    0,  142,  162,    0,    0,    0,  160,
-    0,    0,    0,  141,  147,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,  143,
-  144,  149,    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,  160
+    0,  160
 };
 
 YYSTATIC YYCONST short YYFARDATA YYPACT[] = {
--1000, 1543,-1000,  566,  501,-1000,-1000,-1000,-1000,-1000,
--1000,-1000,  491,  426,  425,  405,-1000,-1000,-1000,   28,
-   28, -454,   39,   39,-1000,-1000,-1000,  396,-1000, -129,
-  411,-1000,  890,  743,    7,  886,   28, -366, -369,-1000,
- -171,  777,    7,  777,-1000,-1000,-1000,   90, 2292,  411,
-  411,  411,  411,-1000,-1000,  124,-1000,-1000,-1000, -162,
- 1048,-1000,-1000, 1046,    7,    7,-1000,-1000, 1403,-1000,
--1000,-1000,-1000,-1000,-1000,-1000,   28, -139,-1000,-1000,
--1000,-1000,  359, -132, 2954, 1220,-1000,-1000,-1000,-1000,
- 2430,-1000,   28,-1000, 1317,-1000, 1308, 1644,    7, 1233,
- 1212, 1204, 1193, 1191, 1186, 1642, 1486,   18,-1000,   28,
-  600,  662,-1000,-1000,   95, 1220,  411, 2954,-1000,-1000,
+-1000, 1575,-1000,  497,  461,-1000,-1000,-1000,-1000,-1000,
+-1000,-1000,  437,  429,  427,  426,-1000,-1000,-1000,   33,
+   33, -455,   65,   65,-1000,-1000,-1000,  419,-1000, -115,
+  125,-1000,  896, 1404,   24,  885,   33, -367, -370,-1000,
+ -173,  669,   24,  669,-1000,-1000,-1000,  138, 2333,  125,
+  125,  125,  125,-1000,-1000,  167,-1000,-1000,-1000, -161,
+ 1038,-1000,-1000,  970,   24,   24,-1000,-1000, 1420,-1000,
+-1000,-1000,-1000,-1000,-1000,-1000,   33, -126,-1000,-1000,
+-1000,-1000,  510, -125, 3020, 1190,-1000,-1000,-1000,-1000,
+ 2456,-1000,   33,-1000,  657,-1000, 1300, 1661,   24, 1234,
+ 1233, 1231, 1193, 1192, 1191, 1660, 1496,   43,-1000,   33,
+  733,  283,-1000,-1000,  164, 1190,  125, 3020,-1000,-1000,
 -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
--1000,-1000,-1000, 1484,  166, 1303,  448, -244, -245, -246,
- -247,  359,-1000, -118,  359,  661,  368,-1000,-1000,  -76,
--1000, 3547,  186, 1189,-1000,-1000,-1000,-1000,-1000, 3383,
+-1000,-1000,-1000, 1495,  146, 1302,  155, -234, -240, -241,
+ -244,  510,-1000, -102,  510, 1076,  966,-1000,-1000,  -46,
+-1000, 3574,  187, 1169,-1000,-1000,-1000,-1000,-1000, 3410,
 -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
-  435,-1000,-1000,-1000,-1000,-1000, 1220, 1641,  326, 1220,
- 1220, 1220,-1000, 3222,   79,-1000,-1000, 1639, 1047, 2854,
--1000, 3547,-1000,-1000,-1000,  216,  216,-1000, 1638,-1000,
--1000,   29, 1483, 1482, 1779, 1432,-1000,-1000,   28,-1000,
-   28,   77,-1000,-1000,-1000,-1000, 1170,-1000,-1000,-1000,
--1000,-1000,  885,   28, 3183,-1000,   67,  -94,-1000,-1000,
-  424,   28,   39,  228,    7,  424,  661, 3328, 2954,  -95,
-  216, 2854, 1637,-1000,  282,-1000,-1000,-1000,-1000,-1000,
+  410,-1000,-1000,-1000,-1000,-1000, 1190, 1659,  389, 1190,
+ 1190, 1190,-1000, 3194,   76,-1000,-1000, 1657, 1037, 2932,
+-1000, 3574,-1000,-1000,-1000,  171,  171,-1000, 1656,-1000,
+-1000,  154, 1493, 1490, 1721, 1463,-1000,-1000,   33,-1000,
+   33,   77,-1000,-1000,-1000,-1000, 1177,-1000,-1000,-1000,
+-1000,-1000,  879,   33, 3291,-1000,   73,   44,-1000,-1000,
+  110,   33,   65,  795,   24,  110, 1076, 3354, 3020,  -85,
+  171, 2932, 1655,-1000,  240,-1000,-1000,-1000,-1000,-1000,
 -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
 826,   71, 1114,  857,-1000,   87,-1000,  298,  359,-1000,
--1000, 2954,-1000,-1000,  181,  899,  216,  411,-1000,-1000,
1071,   69,  972,  827,-1000,   72,-1000,  365,  510,-1000,
+-1000, 3020,-1000,-1000,   88,  556,  171,  125,-1000,-1000,
 -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
--1000,-1000,-1000,-1000,-1000,-1000,-1000, 1631, 1630, 2084,
-  877,  275, 1301, 1629,   79, 1481,    0,-1000,   28,    0,
--1000,   39,-1000,   28,-1000,   28,-1000,   28,-1000,-1000,
--1000,-1000,  873,-1000,   28,   28,-1000, 1220,-1000,-1000,
--1000, -387,-1000,-1000,-1000,-1000,-1000,  662,  488,   94,
--1000,-1000, 1220, 1022,-1000, 1292,  581, 1628,-1000,   82,
-  411,  115,-1000,-1000,-1000, 1627, 1625, 3547,  411,  411,
-  411,  411,-1000,  359,-1000,-1000, 3547,  604,-1000, 1220,
--1000,  -90,-1000,  899,  838,  861,  860,  411,  411, 2693,
--1000,-1000,-1000,-1000,-1000,-1000,   28, 1292, 1081,-1000,
+-1000,-1000,-1000,-1000,-1000,-1000,-1000, 1654, 1649, 2139,
+  844,  359, 1287, 1641,   76, 1489,  -19,-1000,   33,  -19,
+-1000,   65,-1000,   33,-1000,   33,-1000,   33,-1000,-1000,
+-1000,-1000,  843,-1000,   33,   33,-1000, 1190,-1000,-1000,
+-1000, -388,-1000,-1000,-1000,-1000,-1000,  283,  -44,   99,
+-1000,-1000, 1190, 1013,-1000, 1232,  634, 1639,-1000,  135,
+  125,  211,-1000,-1000,-1000, 1638, 1637, 3574,  125,  125,
+  125,  125,-1000,  510,-1000,-1000, 3574,  614,-1000, 1190,
+-1000,  -72,-1000,  556,  866,  840,  828,  125,  125, 2759,
+-1000,-1000,-1000,-1000,-1000,-1000,   33, 1232, 1088,-1000,
 -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
--1000,-1000,-1000,-1000,-1000,  362,-1000,-1000,-1000, 1624,
- 1045,-1000,  673, 1479,-1000,-1000, 2553,-1000,-1000,   28,
--1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,  386,
-  375,  373,-1000,-1000,-1000,-1000,-1000,   28,   28,  332,
- 3115,-1000,-1000, -214, -217,-1000,-1000,-1000,-1000,-1000,
--1000,-1000,  -65, 1622,-1000,   28, 1165,    1,  216,  813,
-   28,-1000,  -94,   63,   63,   63,   63, 2954,  282,-1000,
+-1000,-1000,-1000,-1000,-1000,   30,-1000,-1000,-1000, 1632,
+ 1035,-1000,  744, 1488,-1000,-1000, 2611,-1000,-1000,   33,
+-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,  416,
+  415,  412,-1000,-1000,-1000,-1000,-1000,   33,   33,  404,
+ 3188,-1000,-1000, -204, -206,-1000,-1000,-1000,-1000,-1000,
+-1000,-1000,  -53, 1631,-1000,   33, 1159,    0,  171,  812,
+   33,-1000,   44,   90,   90,   90,   90, 3020,  240,-1000,
 -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
- 1621, 1620, 1478,-1000,-1000,-1000, 2693,-1000,-1000,-1000,
--1000, 1292, 1619,    7, 3547,-1000,  424, 1320,-1000, -136,
- -138,-1000,-1000, -356,-1000,-1000,    7,  354,  391,    7,
--1000,-1000, 1043,-1000,-1000,    7,-1000,    7,-1000, 1039,
- 1026,-1000,-1000,  411, -177, -371, 1618,-1000,-1000,-1000,
--1000,  411, -380,-1000,-1000, -350,-1000,-1000,-1000, 1300,
--1000,  831,  411, 3547, 1220, 3493,   28,   53, 1187,-1000,
--1000,-1000,-1000,-1000,-1000,-1000, 1617,-1000,-1000,-1000,
--1000,-1000,-1000, 1614,-1000,-1000, 1317,   53, 1473,-1000,
- 1472,  859, 1464, 1463, 1461, 1459, 1457,-1000,  468, 1148,
--1000,   86, 1220,-1000,-1000,-1000,   52,  411,   53,  330,
-  108, 3021,-1000,-1000, 1296, 1220,-1000,  654,-1000,-1000,
-  -63, 2954, 2954,  989, 1295,  899, 1220, 1220, 1220, 1220,
--1000, 2392,-1000, 1220,-1000,  411,  411,  411,  782, 1220,
-   -7, 1220,  147, 1456,-1000,  128,-1000,-1000,-1000,-1000,
--1000,-1000,   28,-1000, 1292,-1000,-1000,  661,  -16, 1051,
--1000,-1000, 1220, 1455, 1226,-1000,-1000,-1000,-1000,-1000,
--1000,  -17,  216,  734, 2954, 2787,   59,  488, 1451, 1294,
--1000,-1000, 3493,  -65,  854,   28,  -22, 3547,   28, 1220,
-  852,-1000,-1000,-1000,  424,-1000,-1000,-1000,-1000,-1000,
--1000,-1000,   28,   39,-1000,  -18, 1220,   53, 1449,  836,
- 1447, 1293, 1279,-1000,   79,   28,   28, 1446, 1132,-1000,
--1000, 1292, 1600, 1438, 1599, 1434, 1433, 1598, 1596, 1220,
-  411,-1000,  411,   28,  131,  411,    7, 2954,  411,  753,
-  902,  192, -157, 1428,   96, 1824,  120, 2016,   28,-1000,
- 1291,-1000,  883,-1000,  883,  883,  883,  883,  883, -120,
--1000,   28,   28,  411,-1000,-1000,-1000,-1000,-1000,-1000,
- 1220, 1423, 1278,  980,-1000,-1000,  263, 1260, 1019,  199,
-   78,-1000,  -42,   28, 1420, 1419,-1000, 3547, 1595, 1189,
- 1189, 1189,  411,  411,-1000,  958,  270,  128,-1000,-1000,
--1000,-1000,-1000, 1418,  232, 1635, 1007,  -22, 1594, 1593,
- 3439,-1000,-1000, 1685,   56,  666,  973,  -22, 3547,   28,
- 1220, -337,  411, 1220,-1000,-1000, 3547,-1000,-1000, 1220,
--1000,  -65,  192, 1417, -266,-1000,-1000, 1220, 2693,  850,
-  948, -144, -147, 1416, 1415,  411, 1288,-1000,  -65,-1000,
-  424,  424,-1000,-1000,-1000,-1000,  354,-1000,-1000,-1000,
--1000,-1000,-1000,-1000, 1189, 1220, 1414,   28, 1220, 1412,
--1000,  411,  -22, 1579,  845,  843,  839,  835,-1000,   53,
- 1715,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
--1000,-1000, 1131, 1129, 1578,  948,   79, 1410,  887,    7,
- 1577, -400,  -78,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
--1000,-1000,-1000,-1000,  724,-1000,-1000,-1000,-1000,-1000,
--1000,-1000,-1000,-1000,-1000,-1000, 1576, 1576,-1000, 1576,
- 1750,-1000,-1000, -412,-1000, -402,-1000,-1000, -417,-1000,
+ 1630, 1629, 1485,-1000,-1000,-1000, 2759,-1000,-1000,-1000,
+-1000, 1232, 1628,   24, 3574,-1000,  110, 1323,-1000, -120,
+ -121,-1000,-1000, -359,-1000,-1000,   24,  266,  357,   24,
+-1000,-1000, 1026,-1000,-1000,   24,-1000,   24,-1000, 1019,
+ 1007,-1000,-1000,  125, -175, -371, 1620,-1000,-1000,-1000,
+-1000,  125, -372,-1000,-1000, -353,-1000,-1000,-1000, 1286,
+-1000,  788,  125, 3574, 1190, 3520,   33,   96,  777,-1000,
+-1000,-1000,-1000,-1000,-1000,-1000, 1618,-1000,-1000,-1000,
+-1000,-1000,-1000, 1615,-1000,-1000,  657,   96, 1484,-1000,
+ 1483,  825, 1482, 1479, 1478, 1474, 1473,-1000,  323, 1144,
+-1000,   87, 1190,-1000,-1000,-1000,   16,  125,   96,  398,
+  148, 3088,-1000,-1000, 1279, 1190,-1000,  776,-1000,-1000,
+  -47, 3020, 3020,  952, 1275,  556, 1190, 1190, 1190, 1190,
+-1000, 2417,-1000, 1190,-1000,  125,  125,  125,  703, 1190,
+   -8, 1190,  245, 1472,-1000,  422,-1000,-1000,-1000,-1000,
+-1000,-1000,   33,-1000, 1232,-1000,-1000, 1076,  -15, 1058,
+-1000,-1000, 1190, 1464, 1226,-1000,-1000,-1000,-1000,-1000,
+-1000,  -17,  171,  701, 3020, 2863,  128,  -44, 1459, 1267,
+-1000,-1000, 3520,  -53,  821,   33,  -75, 3574,   33, 1190,
+  814,-1000,-1000,-1000,  110,-1000,-1000,-1000,-1000,-1000,
+-1000,-1000,   33,   65,-1000,  -22, 1190,   96, 1457,  862,
+ 1456, 1262, 1260,-1000,   76,   33,   33, 1455, 1136,-1000,
+-1000, 1232, 1614, 1451, 1613, 1450, 1449, 1612, 1611, 1190,
+  125,-1000,  125,   33,  143,  125,   24, 3020,  125,  594,
+  662,  121, -172, 1447,   95, 1823,  134, 1905,   33,-1000,
+ 1312,-1000,  869,-1000,  869,  869,  869,  869,  869, -144,
+-1000,   33,   33,  125,-1000,-1000,-1000,-1000,-1000,-1000,
+ 1190, 1446, 1245,  990,-1000,-1000,  349, 1219,  993,  361,
+  130,-1000,  -37,   33, 1434, 1433,-1000, 3574, 1610, 1169,
+ 1169, 1169,  125,  125,-1000,  947,  865,  422,-1000,-1000,
+-1000,-1000,-1000, 1432,  347,  922,  981,  -75, 1609, 1608,
+ 3464,-1000,-1000,  555,  868, 1127,  721,  -75, 3574,   33,
+ 1190, -339,  125, 1190,-1000,-1000, 3574,-1000,-1000, 1190,
+-1000,  -53,  121, 1428, -246,-1000,-1000, 1190, 2759,  808,
+  954, -133, -147, 1423, 1414,  125, 1309,-1000,  -53,-1000,
+  110,  110,-1000,-1000,-1000,-1000,  266,-1000,-1000,-1000,
+-1000,-1000,-1000,-1000, 1169, 1190, 1412,   33, 1190, 1410,
+-1000,  125,  -75, 1601,  794,  789,  787,  754,-1000,   96,
+ 1747,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
+-1000,-1000, 1131, 1129, 1600,  954,   76, 1409,  909,   24,
+ 1599, -401,  -67,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
+-1000,-1000,-1000,-1000,  648,-1000,-1000,-1000,-1000,-1000,
+-1000,-1000,-1000,-1000,-1000,-1000, 1597, 1597,-1000, 1597,
+ 1786,-1000,-1000, -414,-1000, -405,-1000,-1000, -419,-1000,
 -1000,-1000, 1408,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
-   79,-1000,-1000,-1000,-1000,-1000,   61,  432, 1220,-1000,
-   53,  630,  224,-1000, 3021,  312, 1002,-1000,-1000,-1000,
--1000,-1000,  899,  -65, 1189, 1220,-1000,  411, 1219, 2954,
--1000,-1000,-1000,  200,-1000,-1000,-1000, 1158, 1157, 1144,
- 1141, 1139, 1136, 1100, 1063, 1055, 1038, 1035, 1014, 1005,
-  366,  997,  994,    7,  637, 1051,  -65,  -65,   28,  934,
--1000,-1000,-1000,  661,  661,  661,  661,-1000,-1000,-1000,
--1000,-1000,-1000,  661,  661,  661,-1000,-1000,-1000,-1000,
--1000, -434, 2693,  828,-1000,  661, 1220, 1187,-1000,   79,
--1000,   79,  -23,-1000,-1000, 2602,   79,   28,-1000,-1000,
- 1220,-1000, 1405,-1000,-1000, 1128,-1000,-1000, -301, 1050,
2016,-1000,-1000,-1000,-1000, 1292,-1000, -254, -257,   28,
--1000,-1000,-1000,-1000,  352,  169,   53,  882,  745,-1000,
--1000,-1000,-1000,-1000,-1000,-1000, -423,-1000,-1000,   37,
+   76,-1000,-1000,-1000,-1000,-1000,  127,  306, 1190,-1000,
+   96,  630,  338,-1000, 3088,  395,  969,-1000,-1000,-1000,
+-1000,-1000,  556,  -53, 1169, 1190,-1000,  125, 1200, 3020,
+-1000,-1000,-1000,  199,-1000,-1000,-1000, 1188, 1185, 1178,
+ 1171, 1158, 1150, 1106, 1104, 1100, 1048, 1036,  995,  994,
+  329,  992,  978,   24,  658, 1058,  -53,  -53,   33,  939,
+-1000,-1000,-1000, 1076, 1076, 1076, 1076,-1000,-1000,-1000,
+-1000,-1000,-1000, 1076, 1076, 1076,-1000,-1000,-1000,-1000,
+-1000, -435, 2759,  732,-1000, 1076, 1190,  777,-1000,   76,
+-1000,   76,  -23,-1000,-1000, 2711,   76,   33,-1000,-1000,
+ 1190,-1000, 1406,-1000,-1000, 1121,-1000,-1000, -299, 1057,
1905,-1000,-1000,-1000,-1000, 1232,-1000, -250, -269,   33,
+-1000,-1000,-1000,-1000,  620,  150,   96,  856,  723,-1000,
+-1000,-1000,-1000,-1000,-1000,-1000, -428,-1000,-1000,   41,
 -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
--1000,  475,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
+-1000,  582,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
 -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
 -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
--1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,   28,-1000,
--1000,-1000,-1000, 1575, 1292, 1574,-1000,-1000,-1000,-1000,
--1000,  274, 1401, 1219,-1000,  128, 1400, 1239,-1000, 2348,
--1000,-1000,-1000,  -56,   28,  829,   28, 2650,   28,  314,
-   28,  795,   28,   39,   28,   28,   28,   28,   28,   28,
-   28,   39,   28,   28,   28,   28,   28,   28,   28,  978,
-  962,  947,  931,   28,   28, -160,   28, 1399, 1292,-1000,
--1000, 1572, 1571, 1395, 1392,  825,-1000,-1000,-1000,-1000,
--1000,-1000,-1000,-1000,  216,  -27,-1000, 1240,-1000,-1000,
-  -22,-1000,-1000, 1292,-1000, 1570, 1569, 1568, 1567, 1566,
- 1557,  356, 1556, 1554, 1552, 1542, 1538, 1537,-1000,-1000,
--1000,  354,-1000, 1535, 1390, 1386,-1000,-1000,-1000,-1000,
- 1388,-1000,  710,   28,-1000, 1267,   28,   28,  974,   53,
-  824,-1000,-1000,-1000,-1000,-1000,-1000,-1000,   60,   28,
-  381,  241,-1000,-1000,-1000,-1000,-1000, 2954,  205,-1000,
--1000,-1000, 1011, 1387, 1385,  822,   49, 1380, 1377,  821,
- 1375,  819, 1374, 1373,  814, 1368, 1367,  812, 1366,  808,
- 1365,  807, 1364,  794, 1363,  793, 1362,  776, 1361,  754,
- 1360,  742, 1359,  741,   39,   28,   28,   28,   28,   28,
-   28,   28, 1358,  730, 1348,  727,-1000,  174,  -65,  -65,
--1000,-1000,  923, 3547,  -22,  -65, 1012, 1534, 1532, 1531,
- 1530, 1113,  -65,-1000,-1000,-1000,-1000,   28,  721,   53,
-  705,  700,   28, 1292,-1000,-1000, 1347, 1090, 1086, 1049,
- 1344,-1000,   36,-1000,  953,  699,   45,-1000,-1000,-1000,
- 1529, 1343,-1000,-1000, 1528,-1000, 1525,-1000,-1000, 1524,
--1000,-1000, 1521,-1000, 1520,-1000, 1519,-1000, 1518,-1000,
- 1512,-1000, 1511,-1000, 1509,-1000, 1504,-1000, 1503, 1342,
-  675, 1341,  668, 1340,  647, 1337,  613,-1000, 1502,-1000,
- 1501,-1000, 1336, 1335,-1000, 2693, 1012, 1334, 1499,-1000,
-  398,  354, 1333,  606,-1000, 1247,-1000, 2053, 1332,-1000,
-   28,   28,   28,-1000,-1000, 2650,-1000,-1000,-1000,-1000,
+-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,   33,-1000,
+-1000,-1000,-1000, 1596, 1232, 1595,-1000,-1000,-1000,-1000,
+-1000,  375, 1402, 1200,-1000,  422, 1400, 1199,-1000, 2565,
+-1000,-1000,-1000,  -58,   33, 1487,   33, 2665,   33,   37,
+   33,  384,   33,   65,   33,   33,   33,   33,   33,   33,
+   33,   65,   33,   33,   33,   33,   33,   33,   33,  950,
+  938,  934,  929,   33,   33, -148,   33, 1399, 1232,-1000,
+-1000, 1580, 1579, 1395, 1392,  731,-1000,-1000,-1000,-1000,
+-1000,-1000,-1000,-1000,  171,  -30,-1000, 1263,-1000,-1000,
+  -75,-1000,-1000, 1232,-1000, 1578, 1577, 1576, 1573, 1572,
+ 1563,  160, 1562, 1561, 1560, 1559, 1558, 1555,-1000,-1000,
+-1000,  266,-1000, 1553, 1390, 1667,-1000,-1000,-1000,-1000,
+ 1388,-1000,  584,   33,-1000, 1264,   33,   33,  955,   96,
+  730,-1000,-1000,-1000,-1000,-1000,-1000,-1000,  116,   33,
+  690,   53,-1000,-1000,-1000,-1000,-1000, 3020,  636,-1000,
+-1000,-1000, 1619, 1387, 1386,  725,   91, 1385, 1384,  724,
+ 1383,  715, 1382, 1380,  714, 1377, 1374,  712, 1373,  710,
+ 1369,  706, 1368,  700, 1358,  689, 1356,  686, 1355,  679,
+ 1354,  655, 1353,  624,   65,   33,   33,   33,   33,   33,
+   33,   33, 1352,  613, 1351,  596,-1000,  337,  -53,  -53,
+-1000,-1000,  895, 3574,  -75,  -53, 1056, 1552, 1551, 1550,
+ 1549, 1118,  -53,-1000,-1000,-1000,-1000,   33,  595,   96,
+  591,  588,   33, 1232,-1000,-1000, 1350, 1115, 1096, 1077,
+ 1349,-1000,   36,-1000,  951,  571,   58,-1000,-1000,-1000,
+ 1547, 1347,-1000,-1000, 1544,-1000, 1541,-1000,-1000, 1539,
+-1000,-1000, 1533,-1000, 1532,-1000, 1531,-1000, 1530,-1000,
+ 1529,-1000, 1525,-1000, 1524,-1000, 1522,-1000, 1520, 1346,
+  563, 1345,  560, 1342,  551, 1340,  538,-1000, 1517,-1000,
+ 1512,-1000, 1338, 1336,-1000, 2759, 1056, 1334, 1510,-1000,
+  660,  266, 1333,  490,-1000, 1291,-1000, 2070, 1332,-1000,
+   33,   33,   33,-1000,-1000, 2665,-1000,-1000,-1000,-1000,
 -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
--1000,-1000,-1000, 1498,-1000, 1497,-1000, 1496,-1000, 1495,
--1000,-1000,-1000,-1000,  -30, 1494,  948,  -65,-1000,-1000,
--1000,   53,-1000,  887,-1000, 1331, 1329, 1328,-1000,  164,
 704, 2188,  257,  616,  416,  541,  518,  466,  322,  460,
-  458,  446,-1000,-1000,-1000,-1000,  430,  153,  -22,  -65,
--1000, 1326, 1207, 1265,-1000,-1000,-1000,-1000,-1000,-1000,
--1000,-1000,   38,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
+-1000,-1000,-1000, 1508,-1000, 1507,-1000, 1506,-1000, 1504,
+-1000,-1000,-1000,-1000,  -34, 1502,  954,  -53,-1000,-1000,
+-1000,   96,-1000,  909,-1000, 1329, 1328, 1319,-1000,  249,
1298, 2249,  331,  460,  466,  491,  446,  435,  454,  408,
+  381,  378,-1000,-1000,-1000,-1000,  368,  126,  -75,  -53,
+-1000, 1318, 2140, 1204,-1000,-1000,-1000,-1000,-1000,-1000,
+-1000,-1000,  -33,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
 -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
--1000,-1000,-1000,-1000,  319,  378,  333,  272,-1000,-1000,
--1000, 1493, 1325,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
--1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, 1490,   53,
--1000,-1000,-1000,-1000,-1000,  -65, -435,   28, 1227, 1316,
-199, 1315,-1000,-1000,  216,-1000, 3547, 2693,  -45,  -22,
1012, 1489,  -65, 1311,-1000
+-1000,-1000,-1000,-1000,  259,  364,  303,  300,-1000,-1000,
+-1000, 1501, 1316,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
+-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, 1500,
+   96,-1000,-1000,-1000,-1000,-1000,  -53, -436,   33, 1297,
1315, -191, 1313,-1000,-1000,  171,-1000, 3574, 2759,  -35,
 -75, 1056, 1405,  -53, 1306,-1000
 };
 
 YYSTATIC YYCONST short YYFARDATA YYPGO[] = {
-    0,   53,   57,    6, 1900,   43,   40,   29, 1899,    0,
- 1898, 1897, 1896,  195,   50, 1895, 1893,    2, 1892,   48,
-   38,    1,   27,   30,   31,    4, 1890,   45,   22,   59,
- 1889,  136,   39,    9,   25,    7,   13, 1888,   41, 1887,
-   14,   26, 1884, 1883,    5,    3,    8,   10, 1882, 1877,
- 1876, 1875,   32,   33,   70, 1873, 1872, 1871, 1870,   12,
- 1869, 1868,   11, 1867,   35, 1866,   18,   36,   16,   24,
-   42,   23,  458,   65, 1276,   52,  127, 1864, 1863, 1848,
- 1847, 1846, 1845,   19,   34, 1844, 1353, 1837, 1836,   28,
-  784,  119, 1835,   47, 1245, 1834, 1831, 1830, 1829, 1828,
- 1825, 1824, 1817, 1815, 1813, 1812, 1811, 1796, 1795, 1033,
- 1794,   64,   62, 1793,   58,  150,   56,   76, 1790, 1789,
-   49, 1788, 1787, 1786, 1785, 1784, 1783,   61, 1782, 1781,
- 1780,   66,  114,   44, 1778,   15,  284, 1775, 1771, 1770,
- 1758, 1757, 1755, 1754, 1753, 1752, 1751, 1748, 1747,  770,
- 1746, 1745, 1743, 1742, 1741, 1734, 1713, 1712,   60, 1711,
- 1710,  113, 1709, 1708, 1707,   98, 1706, 1704, 1703, 1702,
- 1701, 1700, 1699,   69, 1696,   67, 1698,   63, 1695,  484,
- 1693, 1692, 1688, 1686, 1685, 1473
+    0,   53,   57,    6, 1914,   43,   40,   29, 1909,    0,
+ 1908, 1907, 1906,  223,   50, 1905, 1904,    2, 1903,   48,
+   38,    1,   27,   30,   31,    4, 1899,   45,   22,   59,
+ 1898,  136,   39,    9,   25,    7,   13, 1897,   41, 1896,
+   14,   26, 1895, 1891,    5,    3,    8,   10, 1890, 1889,
+ 1888, 1886,   32,   33,   70, 1885, 1884, 1883, 1881,   12,
+ 1877, 1876,   11, 1866,   35, 1865,   18,   36,   16,   24,
+   42,   23,  556,   65, 1288,   52,  127, 1856, 1855, 1854,
+ 1853, 1852, 1849,   19,   34, 1847, 1341, 1845, 1844,   28,
+  655,  115, 1843,   47, 1280, 1842, 1835, 1834, 1833, 1829,
+ 1814, 1813, 1812, 1811, 1810, 1809, 1808, 1807, 1806,  956,
+ 1805,   64,   62, 1804,   58,  122,   56,   76, 1803, 1802,
+   49, 1801, 1800, 1799, 1798, 1797, 1796,   61, 1794, 1792,
+ 1791,   66,  114,   44, 1790,   15,  284, 1789, 1787, 1785,
+ 1784, 1782, 1779, 1778, 1777, 1776, 1775, 1774, 1769,  836,
+ 1768, 1767, 1759, 1758, 1757, 1756, 1752, 1751,   60, 1749,
+ 1746,  119, 1745, 1738, 1732,  113, 1731, 1717, 1716, 1715,
+ 1714, 1709, 1707,   69, 1703,   67, 1706,   63, 1705,  478,
+ 1704, 1702, 1659, 1615, 1528, 1504
 };
 YYSTATIC YYCONST yyr_t YYFARDATA YYR1[]={
 
@@ -1267,58 +1271,58 @@ YYSTATIC YYCONST yyr_t YYFARDATA YYR1[]={
   83,  83,  83,  83,  83,  83,  83,  83,  83,  83,
   83,  83,  83,  83,  83,   3,   3,   3,  13,  13,
   13,  13,  13,  80,  80,  80,  80,  80,  80,  80,
-  80,  80,  80,  80,  80,  80,  80,  80, 154, 115,
- 115, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+  80,  80,  80,  80,  80,  80,  80,  80,  80, 154,
+ 115, 115, 155, 155, 155, 155, 155, 155, 155, 155,
  155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
- 155, 155, 155, 155, 155, 158, 159, 156, 161, 161,
- 160, 160, 160, 163, 162, 162, 162, 162, 166, 166,
- 166, 169, 164, 167, 168, 165, 165, 165, 117, 170,
- 170, 172, 172, 172, 171, 171, 173, 173,  14,  14,
174, 174, 174, 174, 174, 174, 174, 174, 174, 174,
- 174, 174, 174, 174, 174,  41,  41,  41,  41,  41,
+ 155, 155, 155, 155, 155, 155, 158, 159, 156, 161,
+ 161, 160, 160, 160, 163, 162, 162, 162, 162, 166,
+ 166, 166, 169, 164, 167, 168, 165, 165, 165, 117,
+ 170, 170, 172, 172, 172, 171, 171, 173, 173,  14,
 14, 174, 174, 174, 174, 174, 174, 174, 174, 174,
+ 174, 174, 174, 174, 174, 174,  41,  41,  41,  41,
   41,  41,  41,  41,  41,  41,  41,  41,  41,  41,
-  41,  41,  41,  41, 175,  31,  31,  32,  32,  39,
-  39,  39,  40,  40,  40,  40,  40,  40,  40,  40,
+  41,  41,  41,  41,  41, 175,  31,  31,  32,  32,
+  39,  39,  39,  40,  40,  40,  40,  40,  40,  40,
   40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
-  40,  40,  40,  40,  40,  40,  40,  40,  42,  42,
-  42,  43,  43,  43,  47,  47,  46,  46,  45,  45,
-  44,  44,  48,  48,  49,  49,  49,  50,  50,  50,
-  50,  51,  51, 149,  95,  96,  97,  98,  99, 100,
- 101, 102, 103, 104, 105, 106, 107, 108, 157, 157,
+  40,  40,  40,  40,  40,  40,  40,  40,  40,  42,
+  42,  42,  43,  43,  43,  47,  47,  46,  46,  45,
+  45,  44,  44,  48,  48,  49,  49,  49,  50,  50,
+  50,  50,  51,  51, 149,  95,  96,  97,  98,  99,
+ 100, 101, 102, 103, 104, 105, 106, 107, 108, 157,
  157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
  157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
- 157,   6,   6,   6,   6,   6,  53,  53,  54,  54,
-  55,  55,  25,  25,  26,  26,  27,  27,  27,  70,
-  70,  70,  70,  70,  70,  70,  70,  70,  70,   5,
-   5,  71,  71,  71,  71,  33,  33,  33,  33,  33,
+ 157, 157,   6,   6,   6,   6,   6,  53,  53,  54,
+  54,  55,  55,  25,  25,  26,  26,  27,  27,  27,
+  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,
+   5,   5,  71,  71,  71,  71,  33,  33,  33,  33,
   33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
   33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
   33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
   33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
   33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
-  20,  20,  15,  15,  15,  15,  15,  15,  15,  15,
+  33,  20,  20,  15,  15,  15,  15,  15,  15,  15,
   15,  15,  15,  15,  15,  15,  15,  15,  15,  15,
   15,  15,  15,  15,  15,  15,  15,  15,  15,  15,
   15,  15,  15,  15,  15,  15,  15,  15,  15,  15,
   15,  15,  15,  15,  15,  15,  15,  15,  15,  15,
-  15,  28,  28,  28,  28,  28,  28,  28,  28,  28,
+  15,  15,  28,  28,  28,  28,  28,  28,  28,  28,
   28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
-  28,  28,  28,  28,  28,  52,  52,  52,  52,  52,
+  28,  28,  28,  28,  28,  28,  52,  52,  52,  52,
   52,  52,  52,  52,  52,  52,  52,  52,  52,  52,
-  52,  52,  52,  30,  30,  29,  29,  29,  29,  29,
131, 131, 131, 131, 131, 131,  64,  64,  64,  63,
-  63,  87,  87,  84,  84,  85,  17,  17,  37,  37,
-  37,  37,  37,  37,  37,  37,  86,  86,  86,  86,
+  52,  52,  52,  52,  30,  30,  29,  29,  29,  29,
 29, 131, 131, 131, 131, 131, 131,  64,  64,  64,
+  63,  63,  87,  87,  84,  84,  85,  17,  17,  37,
+  37,  37,  37,  37,  37,  37,  37,  86,  86,  86,
   86,  86,  86,  86,  86,  86,  86,  86,  86,  86,
-  86, 176, 176, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 121, 121,  88,  88,  89,  89,
177, 122,  90,  90,  90,  90,  90,  90,  90,  90,
-  90,  90, 123, 123, 178, 178, 178,  66,  66, 179,
- 179, 179, 179, 179, 179, 180, 182, 181, 124, 124,
- 125, 125, 183, 183, 183, 183, 126, 148,  91,  91,
-  91,  91,  91,  91,  91,  91,  91,  91, 127, 127,
- 184, 184, 184, 184, 184, 184, 184, 128, 128,  92,
-  92,  92, 129, 129, 185, 185, 185, 185 };
+  86,  86, 176, 176, 120, 120, 120, 120, 120, 120,
+ 120, 120, 120, 120, 120, 121, 121,  88,  88,  89,
 89, 177, 122,  90,  90,  90,  90,  90,  90,  90,
+  90,  90,  90, 123, 123, 178, 178, 178,  66,  66,
+ 179, 179, 179, 179, 179, 179, 180, 182, 181, 124,
+ 124, 125, 125, 183, 183, 183, 183, 126, 148,  91,
+  91,  91,  91,  91,  91,  91,  91,  91,  91, 127,
+ 127, 184, 184, 184, 184, 184, 184, 184, 128, 128,
+  92,  92,  92, 129, 129, 185, 185, 185, 185 };
 YYSTATIC YYCONST yyr_t YYFARDATA YYR2[]={
 
    0,   0,   2,   4,   4,   3,   1,   1,   1,   1,
@@ -1353,187 +1357,187 @@ YYSTATIC YYCONST yyr_t YYFARDATA YYR2[]={
    2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
    4,   4,   4,   4,   5,   1,   1,   1,   0,   4,
    4,   4,   4,   0,   2,   2,   2,   2,   2,   2,
-   2,   2,   2,   2,   2,   2,   2,   5,   1,   0,
-   2,   2,   1,   2,   4,   5,   1,   1,   1,   1,
-   2,   1,   1,   1,   1,   1,   4,   6,   4,   4,
-  11,   1,   5,   3,   5,   3,   1,   2,   2,   1,
-   2,   4,   4,   1,   2,   2,   2,   2,   2,   2,
-   2,   1,   2,   1,   1,   1,   4,   4,   2,   4,
-   2,   0,   1,   1,   3,   1,   3,   1,   0,   3,
-   5,   4,   3,   5,   5,   5,   5,   5,   5,   2,
-   2,   2,   2,   2,   2,   4,   4,   4,   4,   4,
-   4,   4,   4,   5,   5,   5,   5,   4,   4,   4,
-   4,   4,   4,   3,   2,   0,   1,   1,   2,   1,
-   1,   1,   1,   4,   4,   5,   4,   4,   4,   7,
-   7,   7,   7,   7,   7,   7,   7,   7,   7,   8,
-   8,   8,   8,   7,   7,   7,   7,   7,   0,   2,
-   2,   0,   2,   2,   0,   2,   0,   2,   0,   2,
-   0,   2,   0,   2,   0,   2,   2,   0,   2,   3,
-   2,   0,   2,   1,   1,   1,   1,   1,   1,   1,
-   1,   1,   1,   1,   1,   1,   1,   2,   1,   2,
-   2,   2,   2,   2,   2,   3,   2,   2,   2,   5,
-   3,   2,   2,   2,   2,   2,   5,   4,   6,   2,
-   4,   0,   3,   3,   1,   1,   0,   3,   0,   1,
-   1,   3,   0,   1,   1,   3,   1,   3,   4,   4,
-   4,   4,   5,   1,   1,   1,   1,   1,   1,   1,
-   3,   1,   3,   4,   1,   0,  10,   6,   5,   6,
+   2,   2,   2,   2,   2,   2,   2,   2,   5,   1,
+   0,   2,   2,   1,   2,   4,   5,   1,   1,   1,
+   1,   2,   1,   1,   1,   1,   1,   4,   6,   4,
+   4,  11,   1,   5,   3,   5,   3,   1,   2,   2,
+   1,   2,   4,   4,   1,   2,   2,   2,   2,   2,
+   2,   2,   1,   2,   1,   1,   1,   4,   4,   2,
+   4,   2,   0,   1,   1,   3,   1,   3,   1,   0,
+   3,   5,   4,   3,   5,   5,   5,   5,   5,   5,
+   2,   2,   2,   2,   2,   2,   4,   4,   4,   4,
+   4,   4,   4,   4,   5,   5,   5,   5,   4,   4,
+   4,   4,   4,   4,   3,   2,   0,   1,   1,   2,
+   1,   1,   1,   1,   4,   4,   5,   4,   4,   4,
+   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+   8,   8,   8,   8,   7,   7,   7,   7,   7,   0,
+   2,   2,   0,   2,   2,   0,   2,   0,   2,   0,
+   2,   0,   2,   0,   2,   0,   2,   2,   0,   2,
+   3,   2,   0,   2,   1,   1,   1,   1,   1,   1,
+   1,   1,   1,   1,   1,   1,   1,   1,   2,   1,
+   2,   2,   2,   2,   2,   2,   3,   2,   2,   2,
+   5,   3,   2,   2,   2,   2,   2,   5,   4,   6,
+   2,   4,   0,   3,   3,   1,   1,   0,   3,   0,
+   1,   1,   3,   0,   1,   1,   3,   1,   3,   4,
+   4,   4,   4,   5,   1,   1,   1,   1,   1,   1,
+   1,   3,   1,   3,   4,   1,   0,  10,   6,   5,
+   6,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+   1,   1,   1,   2,   2,   2,   2,   1,   1,   1,
+   1,   2,   3,   4,   6,   5,   1,   1,   1,   1,
+   1,   1,   1,   2,   2,   1,   2,   2,   4,   1,
+   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,
+   1,   0,   5,   0,   1,   1,   1,   1,   1,   1,
+   1,   1,   1,   1,   1,   2,   2,   2,   2,   1,
+   1,   1,   1,   1,   3,   2,   2,   1,   1,   1,
+   1,   1,   1,   1,   1,   1,   2,   1,   1,   1,
    1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-   1,   1,   2,   2,   2,   2,   1,   1,   1,   1,
-   2,   3,   4,   6,   5,   1,   1,   1,   1,   1,
-   1,   1,   2,   2,   1,   2,   2,   4,   1,   2,
-   1,   2,   1,   2,   1,   2,   1,   2,   1,   1,
-   0,   5,   0,   1,   1,   1,   1,   1,   1,   1,
-   1,   1,   1,   1,   2,   2,   2,   2,   1,   1,
-   1,   1,   1,   3,   2,   2,   1,   1,   1,   1,
-   1,   1,   1,   1,   1,   2,   1,   1,   1,   1,
+   1,   1,   2,   1,   3,   2,   3,   4,   2,   2,
+   2,   5,   5,   7,   4,   3,   2,   3,   2,   1,
+   1,   2,   3,   2,   1,   2,   1,   1,   1,   1,
+   1,   1,   1,   1,   1,   2,   2,   2,   2,   1,
+   1,   1,   1,   1,   1,   3,   0,   1,   1,   3,
+   2,   6,   7,   3,   3,   3,   6,   0,   1,   3,
+   5,   6,   4,   4,   1,   3,   3,   1,   1,   1,
+   1,   4,   1,   6,   6,   6,   4,   1,   1,   1,
    1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-   1,   2,   1,   3,   2,   3,   4,   2,   2,   2,
-   5,   5,   7,   4,   3,   2,   3,   2,   1,   1,
-   2,   3,   2,   1,   2,   1,   1,   1,   1,   1,
-   1,   1,   1,   1,   2,   2,   2,   2,   1,   1,
-   1,   1,   1,   1,   3,   0,   1,   1,   3,   2,
-   6,   7,   3,   3,   3,   6,   0,   1,   3,   5,
-   6,   4,   4,   1,   3,   3,   1,   1,   1,   1,
-   4,   1,   6,   6,   6,   4,   1,   1,   1,   1,
-   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-   1,   1,   1,   3,   2,   5,   4,   7,   6,   7,
-   6,   9,   8,   3,   8,   4,   0,   2,   0,   1,
-   3,   3,   0,   2,   2,   2,   3,   2,   2,   2,
-   2,   2,   0,   2,   3,   1,   1,   1,   1,   3,
-   8,   2,   3,   1,   1,   3,   3,   3,   4,   6,
-   0,   2,   3,   1,   3,   1,   4,   3,   0,   2,
-   2,   2,   3,   3,   3,   3,   3,   3,   0,   2,
-   2,   3,   3,   4,   2,   1,   1,   3,   5,   0,
-   2,   2,   0,   2,   4,   3,   1,   1 };
+   1,   1,   1,   1,   3,   2,   5,   4,   7,   6,
+   7,   6,   9,   8,   3,   8,   4,   0,   2,   0,
+   1,   3,   3,   0,   2,   2,   2,   3,   2,   2,
+   2,   2,   2,   0,   2,   3,   1,   1,   1,   1,
+   3,   8,   2,   3,   1,   1,   3,   3,   3,   4,
+   6,   0,   2,   3,   1,   3,   1,   4,   3,   0,
+   2,   2,   2,   3,   3,   3,   3,   3,   3,   0,
+   2,   2,   3,   3,   4,   2,   1,   1,   3,   5,
+   0,   2,   2,   0,   2,   4,   3,   1,   1 };
 YYSTATIC YYCONST short YYFARDATA YYCHK[]={
 
 -1000,-109,-110,-111,-113,-114,-116,-117,-118,-119,
--120,-121,-122,-124,-126,-128,-130,-131,-132, 524,
- 525, 459, 527, 528,-133,-134,-135, 531, 532,-139,
- 408,-152, 410,-170,-137, 454,-176, 462, 407, 469,
- 470, 429, -87, 430, -93, -94, 273, 448, 529, 533,
- 534, 535, 536, 537, 538, 539,  59,-138, 409, 411,
- 453, 446, 447, 449, -10, -11, 123, 123,-115, 123,
- 123, 123, 123,  -9, 264,  -9, 526, -88, -24, 265,
+-120,-121,-122,-124,-126,-128,-130,-131,-132, 525,
+ 526, 460, 528, 529,-133,-134,-135, 532, 533,-139,
+ 409,-152, 411,-170,-137, 455,-176, 463, 408, 470,
+ 471, 430, -87, 431, -93, -94, 273, 449, 530, 534,
+ 535, 536, 537, 538, 539, 540,  59,-138, 410, 412,
+ 454, 447, 448, 450, -10, -11, 123, 123,-115, 123,
+ 123, 123, 123,  -9, 264,  -9, 527, -88, -24, 265,
  264, -24, 123,-140, 314,  -1,  -2, 261, 260, 263,
  -78, -16,  91,-171, 123,-174, 278,  38,-175, 286,
  287, 284, 283, 282, 281, 288, -31, -32, 267,  91,
-  -9, -90, 468, 468, -92,  -1, 468, -86, 431, 432,
- 433, 434, 435, 436, 437, 438, 439, 440, 441, 442,
- 443, 444, 445, -31, -86, 263, -28, -70, -74, -93,
+  -9, -90, 469, 469, -92,  -1, 469, -86, 432, 433,
+ 434, 435, 436, 437, 438, 439, 440, 441, 442, 443,
+ 444, 445, 446, -31, -86, 263, -28, -70, -74, -93,
  -94, 306, 297, 322, 323,-149,  33, 307, 276, 324,
- -52, 275,  91,  -5, -76, 268, 412, 413, 414, 357,
- 356, 278, 298, 277, 281, 282, 283, 284, 286, 287,
+ -52, 275,  91,  -5, -76, 268, 413, 414, 415, 358,
+ 357, 278, 298, 277, 281, 282, 283, 284, 286, 287,
  279, 290, 291, 292, 293, 271,  -1, 296,  -1,  -1,
-  -1,  -1, 262, -77,-172, 318, 378,  61, -73,  40,
+  -1,  -1, 262, -77,-172, 318, 379,  61, -73,  40,
  -75,  -7, -76, 269, 272, 325, 340,  -8, 295, 300,
- 302, 308, -31, -31,-112,-109, 125,-155, 415,-156,
- 417,-154, 419, 420,-117,-157,  -2,-131,-120,-133,
--132,-135, 471, 457, 507,-158, 506,-160, 418, -95,
+ 302, 308, -31, -31,-112,-109, 125,-155, 416,-156,
+ 418,-154, 420, 421,-117,-157,  -2,-131,-120,-133,
+-132,-135, 472, 458, 508,-158, 507,-160, 419, -95,
  -96, -97, -98, -99,-108,-100,-101,-102,-103,-104,
--105,-106,-107,-159,-163, 394, 395, 396, 397, 398,
399, 400, 401, 402, 403, 404, 405, 406, 123, 416,
--123,-125,-127,-129,  -9,  -1, 460,-136, -70, -76,
+-105,-106,-107,-159,-163, 395, 396, 397, 398, 399,
400, 401, 402, 403, 404, 405, 406, 407, 123, 417,
+-123,-125,-127,-129,  -9,  -1, 461,-136, -70, -76,
 -141, 315, -71, -70,  91, -28,-149,  46,  -7, 328,
- 329, 330, 331, 332, 326, 346, 352, 337, 364, 365,
- 366, 367, 368, 369, 370, 350, 377, 294, 371, -79,
+ 329, 330, 331, 332, 326, 346, 353, 337, 365, 366,
+ 367, 368, 369, 370, 371, 351, 378, 294, 372, -79,
   -9,-173,-174,  42,  40, -31,  40, -14,  91,  40,
  -14,  40, -14,  40, -14,  40, -14,  40, -14,  40,
-  41, 267,  -9, 263,  58,  44, 262,  -1, 353, 354,
- 355, 472, 378, 474, 475, 476, 477, -90, -91,  -1,
+  41, 267,  -9, 263,  58,  44, 262,  -1, 354, 355,
+ 356, 473, 379, 475, 476, 477, 478, -90, -91,  -1,
  329, 330,  -1, -71,  41, -36,  61, 288, 262,  44,
- 389,  91,  38,  42, 358, 359, 360,  60, 389, 389,
- 389, 389, -70, 306, -70, -75,  -7,  33,  -9,  -1,
- 280, 279, 289, -28,  -1, -76,  42, 470,  47, -28,
+ 390,  91,  38,  42, 359, 360, 361,  60, 390, 390,
+ 390, 390, -70, 306, -70, -75,  -7,  33,  -9,  -1,
+ 280, 279, 289, -28,  -1, -76,  42, 471,  47, -28,
  270, 272, 281, 282, 283, 284,  40, -36,  -1, 329,
  330, 322, 345, 334, 335, 337, 338, 339, 340, 341,
- 342, 343, 344, 361, 354, 336, 351, 326, 370, 294,
+ 342, 343, 344, 362, 355, 336, 352, 326, 371, 294,
   -2,  40,  61, -72, -71, -74, -28,  -7,  -7,  40,
  301, 303, 304, 305,  41,  41, 125,-143,-114,-111,
--144,-146,-116,-117,-131,-120,-132, 451, 452,-148,
- 507,-133,-135, 506, 321, 421, 426, 471, 407, 125,
-  -9,  -9,  40, 450,  58,  91,  -9, -71, 356, 363,
+-144,-146,-116,-117,-131,-120,-132, 452, 453,-148,
+ 508,-133,-135, 507, 321, 422, 427, 472, 408, 125,
+  -9,  -9,  40, 451,  58,  91,  -9, -71, 357, 364,
   91,-161,-162,-164,-166,-167,-168, 311,-169, 309,
  313, 312,  -9,  -2,  -9, -24,  40, -23, -24, 266,
  286, 287, -31,  -9,  -2, -75, -28, -76, 270, 272,
  -71, -36, 341,-175,  -7, -72,  40,-115,-158,  -2,
-  -9, 125,-178, 461,-131,-179,-180, 466, 467,-181,
--132,-135, 463, 125,-183,-177,-179,-182, 338, 461,
- 464, 125,-184, 459, 407, 462, 296,-132,-135, 125,
--185, 459, 462,-132,-135, -89, 419, 125,-136,-142,
- -71,  -1, 470,  -7,  -1, -13,  40,  40, -28, 328,
- 329, 330, 331, 376, 370, 326, 478, 364, 365, 366,
- 367, 374, 375, 294,  93, 125,  44,  40,  -2,  41,
+  -9, 125,-178, 462,-131,-179,-180, 467, 468,-181,
+-132,-135, 464, 125,-183,-177,-179,-182, 338, 462,
+ 465, 125,-184, 460, 408, 463, 296,-132,-135, 125,
+-185, 460, 463,-132,-135, -89, 420, 125,-136,-142,
+ -71,  -1, 471,  -7,  -1, -13,  40,  40, -28, 328,
+ 329, 330, 331, 377, 371, 326, 479, 365, 366, 367,
+ 368, 375, 376, 294,  93, 125,  44,  40,  -2,  41,
  -23,  -9, -23, -24,  -9,  -9,  -9,  93,  -9,  -9,
- 473,  -1,  -1, 330, 329, 327, 336, 389,  40,  61,
+ 474,  -1,  -1, 330, 329, 327, 336, 390,  40,  61,
   43, 123,  40,  40, 263,  -1,  93, -30, -29, 275,
   -9,  40,  40, -54, -55, -28,  -1,  -1,  -1,  -1,
  -70, -28,  -9,  -1, 280,  93,  93,  93,  -1,  -1,
- -71,  -1,  91,  -9, -69,  60, 329, 330, 331, 364,
- 365, 366,  40,  61, -36, 123,  40,  41, -71,  -3,
- 372, 373,  -1,  -9,-115, 123, 123, 123,  -9,  -9,
- 123, -71, 356, 363, 363, -81, -82, -91, -25, -26,
+ -71,  -1,  91,  -9, -69,  60, 329, 330, 331, 365,
+ 366, 367,  40,  61, -36, 123,  40,  41, -71,  -3,
+ 373, 374,  -1,  -9,-115, 123, 123, 123,  -9,  -9,
+ 123, -71, 357, 364, 364, -81, -82, -91, -25, -26,
  -27, 275, -13,  40,  -9,  58, 274,  -7,  91,  -1,
   -9,-161,-165,-158, 310,-165,-165,-165, -71,-158,
   -2,  -9,  40,  40,  41, -71,  -1,  40, -31, -28,
-  -6,  -2,  -9, 125, 316, 316, 465, -31, -66,  -9,
+  -6,  -2,  -9, 125, 316, 316, 466, -31, -66,  -9,
   42, -36,  61, -31,  61, -31, -31,  61,  61,  -1,
- 468,  -9, 468,  40,  -1, 468,-177,  44,  93,  -1,
+ 469,  -9, 469,  40,  -1, 469,-177,  44,  93,  -1,
  -28, -28,  91,  -9, -36, -83,  -1,  40,  40,-173,
  -36,  41,  41,  93,  41,  41,  41,  41,  41, -12,
- 263,  44,  58, 389, 329, 330, 331, 364, 365, 366,
+ 263,  44,  58, 390, 329, 330, 331, 365, 366, 367,
   -1, -84, -85, -36, 123, 262, -64, -63, -71, 306,
   44,  93,  44, 275, -71, -71,  62,  44,  42,  -5,
   -5,  -5,  93, 274,  41, -68, -19, -18,  43,  45,
- 306, 323, 372,  -9, -59, -61, -73, 274, -53, -22,
+ 306, 323, 373,  -9, -59, -61, -73, 274, -53, -22,
   60,  41, 125,-112,-145,-147,-127, 274,  -7,  91,
-  -1, -71, -71,  -1, 370, 326,  -7, 370, 326,  -1,
+  -1, -71, -71,  -1, 371, 326,  -7, 371, 326,  -1,
   41,  44, -28, -25,  93,  -9,  -3,  -1, -28,  -9,
   93,  -2,  -9,  -9, -24, 274, -36,  41,  40,  41,
   44,  44,  -2,  -9,  -9,  41,  58,  40,  41,  40,
   41,  41,  40,  40,  -5,  -1,  -9, 317,  -1, -31,
- -71,  93, -38, 478, 503, 504, 505,  -9,  41, 389,
- -83,  41, 386, 341, 342, 343, 387, 388, 301, 303,
- 304, 305, 390, 393, 294,  -4, 317, -34, -33,-153,
- 479, 481, 482, 483, 484, 276, 277, 281, 282, 283,
- 284, 286, 287, 257, 279, 290, 291, 292, 293, 485,
- 486, 487, 489, 490, 491, 492, 493, 494, 495, 334,
- 496, 280, 289, 336, 497, 341, 488, 356, 389, 501,
+ -71,  93, -38, 479, 504, 505, 506,  -9,  41, 390,
+ -83,  41, 387, 341, 342, 343, 388, 389, 301, 303,
+ 304, 305, 391, 394, 294,  -4, 317, -34, -33,-153,
+ 480, 482, 483, 484, 485, 276, 277, 281, 282, 283,
+ 284, 286, 287, 257, 279, 290, 291, 292, 293, 486,
+ 487, 488, 490, 491, 492, 493, 494, 495, 496, 334,
+ 497, 280, 289, 336, 498, 341, 489, 357, 390, 502,
  271, 123,  -9,  41, -14, -14, -14, -14, -14, -14,
- 317, 283, 284, 455, 456, 458,  -9,  -9,  -1,  41,
+ 317, 283, 284, 456, 457, 459,  -9,  -9,  -1,  41,
   44,  61, -59, 125,  44,  61, 263, 263, -29,  -9,
   41,  41, -28,  40,  -5,  -1,  62, -58,  -1,  40,
- -19,  41, 125, -62, -40,-135, -41, 298, 363, 297,
+ -19,  41, 125, -62, -40,-135, -41, 298, 364, 297,
  286, 287, 284, 283, 282, 281, 293, 292, 291, 290,
  279, 278, 277,-175,  61,  -3,  40,  40,  91, -54,
- 125, 125,-150, 422, 423, 424, 425,-120,-132,-133,
--135, 125,-151, 427, 428, 425,-132,-120,-133,-135,
- 125,  -3, -28,  -9, -93, 449,  -1, -28, -27, -38,
-  41, 389, -71,  93, -35,  61, 316, 316,  41,  41,
+ 125, 125,-150, 423, 424, 425, 426,-120,-132,-133,
+-135, 125,-151, 428, 429, 426,-132,-120,-133,-135,
+ 125,  -3, -28,  -9, -93, 450,  -1, -28, -27, -38,
+  41, 390, -71,  93, -35,  61, 316, 316,  41,  41,
   -1,  41, -25,  -6,  -6, -66,  41,  -9,  41,  -3,
   40,  93,  93,  93,  93, -36,  41,  58,  58,  40,
- -35,  -2,  41,  42,  91, -32,  40, 480, 500, 277,
+ -35,  -2,  41,  42,  91, -32,  40, 481, 501, 277,
  281, 282, 283, 284, 280, -20,  40, -20, -20, -15,
- 509, 482, 483, 276, 277, 281, 282, 283, 284, 286,
- 287, 279, 290, 291, 292, 293,  42, 485, 486, 487,
- 489, 490, 493, 494, 496, 280, 289, 257, 510, 511,
- 512, 513, 514, 515, 516, 517, 518, 519, 520, 521,
- 522, 495, 487, 499,  41,  -2, 263, 263,  44, -84,
+ 510, 483, 484, 276, 277, 281, 282, 283, 284, 286,
+ 287, 279, 290, 291, 292, 293,  42, 486, 487, 488,
+ 490, 491, 494, 495, 497, 280, 289, 257, 511, 512,
+ 513, 514, 515, 516, 517, 518, 519, 520, 521, 522,
+ 523, 496, 488, 500,  41,  -2, 263, 263,  44, -84,
  -37, -17,  -9, 283, -36, -70, 319, 320, 125, -64,
  123,  61, -25,  -1, -67,  44, -56, -57, -71, -65,
--135, 357, 362,  40,  91,  40,  91,  40,  91,  40,
+-135, 358, 363,  40,  91,  40,  91,  40,  91,  40,
   91,  40,  91,  40,  91,  40,  91,  40,  91,  40,
   91,  40,  91,  40,  91,  40,  91,  40,  91, 284,
  283, 282, 281,  40,  91,  40,  91, -31, -36, 123,
   40, -53, -22, -25, -25,  -9,  62, -75, -75, -75,
- -75, -75, -75, -75, 508, -71,  93,  -1,  -2,  -2,
+ -75, -75, -75, -75, 509, -71,  93,  -1,  -2,  -2,
  274, -39, -41, -36, 299, 286, 287, 284, 283, 282,
  281, 279, 293, 292, 291, 290, 278, 277,  -2,  -9,
-  41,  58, -89, -69, -34, -83, 391, 392, 391, 392,
-  -9,  93,  -9,  43, 125, -36,  91,  91, 502,  44,
-  91, 523,  38, 281, 282, 283, 284, 280,  -9,  40,
+  41,  58, -89, -69, -34, -83, 392, 393, 392, 393,
+  -9,  93,  -9,  43, 125, -36,  91,  91, 503,  44,
+  91, 524,  38, 281, 282, 283, 284, 280,  -9,  40,
   40, -62, 123,  41, -67, -68,  41,  44, -60, -52,
- 363, 297, 345, 299, 263,  -9, 306, -70, 299,  -9,
+ 364, 297, 345, 299, 263,  -9, 306, -70, 299,  -9,
  -40,  -9, -23,  -9,  -9, -23, -24,  -9, -24,  -9,
   -9,  -9,  -9,  -9,  -9,  -9, -24,  -9,  -9,  -9,
   -9,  -9,  -9,  -9,  40,  91,  40,  91,  40,  91,
@@ -1559,170 +1563,170 @@ YYSTATIC YYCONST short YYFARDATA YYCHK[]={
   41, 299, 306, -70,  41, -40,  41, -23,  -9,  41,
  -23, -24,  41, -24,  41,  -9,  41,  -9,  41,  -9,
   41,  41,  41,  41, -47, -46, -45, -44,  41,  41,
- -17,  -3, -25,  41, 123, 324, 378, 379, 380, 308,
- 381, 382, 383, 384, 333, 347, 348, 349, 294,  44,
263,  41,  41,  41,  41,  40,  41,  40, -36, -25,
508,  -9,  41,  41, 356,  41,  -7, -28, -71, 274,
-  -3, -21,  40, -25,  41 };
+ -17,  -3, -25,  41, 123, 324, 379, 380, 381, 308,
+ 382, 383, 384, 385, 333, 347, 348, 349, 350, 294,
 44, 263,  41,  41,  41,  41,  40,  41,  40, -36,
-25, 509,  -9,  41,  41, 357,  41,  -7, -28, -71,
274,  -3, -21,  40, -25,  41 };
 YYSTATIC YYCONST short YYFARDATA YYDEF[]={
 
-   1,  -2,   2,   0,   0, 329,   6,   7,   8,   9,
+   1,  -2,   2,   0,   0, 330,   6,   7,   8,   9,
   10,  11,   0,   0,   0,   0,  16,  17,  18,   0,
-   0, 766,   0,   0,  24,  25,  26,   0,  28, 135,
-   0, 266, 204,   0, 425,   0,   0, 772, 105, 829,
-  92,   0, 425,   0,  83,  84,  85,   0,   0,   0,
-   0,   0,   0,  57,  58,   0,  60, 108, 259, 381,
-   0, 751, 752, 217, 425, 425, 139,   1,   0, 782,
- 800, 818, 832,  19,  41,  20,   0,   0,  22,  42,
+   0, 767,   0,   0,  24,  25,  26,   0,  28, 135,
+   0, 266, 204,   0, 426,   0,   0, 773, 105, 830,
+  92,   0, 426,   0,  83,  84,  85,   0,   0,   0,
+   0,   0,   0,  57,  58,   0,  60, 108, 259, 382,
+   0, 752, 753, 217, 426, 426, 139,   1,   0, 783,
+ 801, 819, 833,  19,  41,  20,   0,   0,  22,  42,
   43,  23,  29, 137,   0, 104,  38,  39,  36,  37,
- 217, 184,   0, 378,   0, 385,   0,   0, 425, 388,
- 388, 388, 388, 388, 388,   0,   0, 426, 427,   0,
- 754,   0, 772, 808,   0,  93,   0,   0, 736, 737,
- 738, 739, 740, 741, 742, 743, 744, 745, 746, 747,
- 748, 749, 750,   0,   0,  33,   0,   0,   0,   0,
-   0,   0, 662,   0,   0, 217,   0, 678, 679,   0,
- 683,   0,   0, 543, 230, 545, 546, 547, 548,   0,
- 483, 685, 686, 687, 688, 689, 690, 691, 692, 693,
-   0, 698, 699, 700, 701, 702, 549,   0,  52,  54,
-  55,  56,  59,   0, 380, 382, 383,   0,  61,   0,
+ 217, 184,   0, 379,   0, 386,   0,   0, 426, 389,
+ 389, 389, 389, 389, 389,   0,   0, 427, 428,   0,
+ 755,   0, 773, 809,   0,  93,   0,   0, 737, 738,
+ 739, 740, 741, 742, 743, 744, 745, 746, 747, 748,
+ 749, 750, 751,   0,   0,  33,   0,   0,   0,   0,
+   0,   0, 663,   0,   0, 217,   0, 679, 680,   0,
+ 684,   0,   0, 544, 230, 546, 547, 548, 549,   0,
+ 484, 686, 687, 688, 689, 690, 691, 692, 693, 694,
+   0, 699, 700, 701, 702, 703, 550,   0,  52,  54,
+  55,  56,  59,   0, 381, 383, 384,   0,  61,   0,
   71,   0, 210, 211, 212, 217, 217, 215,   0, 218,
- 219,   0,   0,   0,   0,   0,   5, 330,   0, 332,
-   0,   0, 336, 337, 338, 339,   0, 341, 342, 343,
- 344, 345,   0,   0,   0, 351,   0,   0, 328, 498,
-   0,   0,   0,   0, 425,   0, 217,   0,   0,   0,
- 217,   0,   0, 329,   0, 484, 485, 486, 487, 488,
- 489, 490, 491, 492, 493, 494, 495, 496, 356, 363,
-   0,   0,   0,   0,  21, 768, 767,   0,  29, 544,
- 107,   0, 136, 551,   0, 554, 217,   0, 308, 267,
+ 219,   0,   0,   0,   0,   0,   5, 331,   0, 333,
+   0,   0, 337, 338, 339, 340,   0, 342, 343, 344,
+ 345, 346,   0,   0,   0, 352,   0,   0, 329, 499,
+   0,   0,   0,   0, 426,   0, 217,   0,   0,   0,
+ 217,   0,   0, 330,   0, 485, 486, 487, 488, 489,
+ 490, 491, 492, 493, 494, 495, 496, 497, 357, 364,
+   0,   0,   0,   0,  21, 769, 768,   0,  29, 545,
+ 107,   0, 136, 552,   0, 555, 217,   0, 308, 267,
  268, 269, 270, 271, 272, 273, 274, 275, 276, 277,
  278, 279, 280, 281, 282, 283, 284,   0,   0,   0,
-   0,   0, 387,   0,   0,   0,   0, 399,   0,   0,
- 400,   0, 401,   0, 402,   0, 403,   0, 404, 424,
- 102, 428,   0, 753,   0,   0, 763, 771, 773, 774,
- 775,   0, 777, 778, 779, 780, 781,   0,   0, 827,
- 830, 831,  94, 712, 713, 714,   0,   0,  31,   0,
-   0, 705, 667, 668, 669,   0,   0, 528,   0,   0,
-   0,   0, 661,   0, 664, 225,   0,   0, 675, 677,
- 680,   0, 682, 684,   0,   0,   0,   0,   0,   0,
- 228, 229, 694, 695, 696, 697,   0,  53, 147, 109,
+   0,   0, 388,   0,   0,   0,   0, 400,   0,   0,
+ 401,   0, 402,   0, 403,   0, 404,   0, 405, 425,
+ 102, 429,   0, 754,   0,   0, 764, 772, 774, 775,
+ 776,   0, 778, 779, 780, 781, 782,   0,   0, 828,
+ 831, 832,  94, 713, 714, 715,   0,   0,  31,   0,
+   0, 706, 668, 669, 670,   0,   0, 529,   0,   0,
+   0,   0, 662,   0, 665, 225,   0,   0, 676, 678,
+ 681,   0, 683, 685,   0,   0,   0,   0,   0,   0,
+ 228, 229, 695, 696, 697, 698,   0,  53, 147, 109,
  110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
  120, 121, 122, 123, 124,   0, 131, 132, 133,   0,
    0, 103,   0,   0,  72,  73,   0, 213, 214,   0,
- 220, 221, 222, 223,  64,  68,   3, 140, 329,   0,
+ 220, 221, 222, 223,  64,  68,   3, 140, 330,   0,
    0,   0, 168, 169, 170, 171, 172,   0,   0,   0,
-   0, 178, 179,   0,   0, 233, 247, 808, 105,   4,
- 331, 333,  -2,   0, 340,   0,   0,   0, 217,   0,
-   0, 357, 359,   0,   0,   0,   0,   0,   0, 373,
- 374, 371, 499, 500, 501, 502, 497, 503, 504,  44,
-   0,   0,   0, 506, 507, 508,   0, 511, 512, 513,
- 514, 515,   0, 425,   0, 519, 521,   0, 360,   0,
-   0,  12, 783,   0, 785, 786, 425,   0,   0, 425,
- 793, 794,   0,  13, 801, 425, 803, 425, 805,   0,
-   0,  14, 819,   0,   0,   0,   0, 825, 826,  15,
- 833,   0,   0, 836, 837, 765, 769,  27,  30, 138,
+   0, 178, 179,   0,   0, 233, 247, 809, 105,   4,
+ 332, 334,  -2,   0, 341,   0,   0,   0, 217,   0,
+   0, 358, 360,   0,   0,   0,   0,   0,   0, 374,
+ 375, 372, 500, 501, 502, 503, 498, 504, 505,  44,
+   0,   0,   0, 507, 508, 509,   0, 512, 513, 514,
+ 515, 516,   0, 426,   0, 520, 522,   0, 361,   0,
+   0,  12, 784,   0, 786, 787, 426,   0,   0, 426,
+ 794, 795,   0,  13, 802, 426, 804, 426, 806,   0,
+   0,  14, 820,   0,   0,   0,   0, 826, 827,  15,
+ 834,   0,   0, 837, 838, 766, 770,  27,  30, 138,
  142,   0,   0,   0,  40,   0,   0, 289,   0, 185,
  186, 187, 188, 189, 190, 191,   0, 193, 194, 195,
- 196, 197, 198,   0, 205, 384,   0,   0,   0, 392,
-   0,   0,   0,   0,   0,   0,   0,  96, 756,   0,
- 776, 798, 806, 809, 810, 811,   0,   0,   0,   0,
-   0, 716, 721, 722,  34,  47, 665,   0, 703, 706,
- 707,   0,   0,   0, 529, 530,  48,  49,  50,  51,
- 663,   0, 674, 676, 681,   0,   0,   0,   0, 550,
-   0,  -2, 705,   0, 106, 154, 125, 126, 127, 128,
- 129, 130,   0, 379,  62,  75,  69, 217,   0, 526,
+ 196, 197, 198,   0, 205, 385,   0,   0,   0, 393,
+   0,   0,   0,   0,   0,   0,   0,  96, 757,   0,
+ 777, 799, 807, 810, 811, 812,   0,   0,   0,   0,
+   0, 717, 722, 723,  34,  47, 666,   0, 704, 707,
+ 708,   0,   0,   0, 530, 531,  48,  49,  50,  51,
+ 664,   0, 675, 677, 682,   0,   0,   0,   0, 551,
+   0,  -2, 706,   0, 106, 154, 125, 126, 127, 128,
+ 129, 130,   0, 380,  62,  75,  69, 217,   0, 527,
  305, 306,  -2,   0,   0, 139, 236, 250, 173, 174,
- 818,   0, 217,   0,   0,   0, 217,   0,   0, 533,
- 534, 536,   0,  -2,   0,   0,   0,   0,   0, 353,
-   0, 358, 364, 375,   0, 365, 366, 367, 372, 368,
- 369, 370,   0,   0, 505,   0,  -2,   0,   0,   0,
-   0, 524, 525, 355,   0,   0,   0,   0,   0, 787,
- 788, 791,   0,   0,   0,   0,   0,   0,   0, 820,
-   0, 824,   0,   0,   0,   0, 425,   0, 552,   0,
-   0, 260,   0,   0, 289,   0, 200, 555,   0, 386,
-   0, 391, 388, 389, 388, 388, 388, 388, 388,   0,
- 755,   0,   0,   0, 812, 813, 814, 815, 816, 817,
- 828,   0, 723,   0,  75,  32,   0, 717,   0,   0,
-   0, 666, 705, 709,   0,   0, 673,   0, 668, 539,
- 540, 541,   0,   0, 224,   0,   0, 154, 149, 150,
+ 819,   0, 217,   0,   0,   0, 217,   0,   0, 534,
+ 535, 537,   0,  -2,   0,   0,   0,   0,   0, 354,
+   0, 359, 365, 376,   0, 366, 367, 368, 373, 369,
+ 370, 371,   0,   0, 506,   0,  -2,   0,   0,   0,
+   0, 525, 526, 356,   0,   0,   0,   0,   0, 788,
+ 789, 792,   0,   0,   0,   0,   0,   0,   0, 821,
+   0, 825,   0,   0,   0,   0, 426,   0, 553,   0,
+   0, 260,   0,   0, 289,   0, 200, 556,   0, 387,
+   0, 392, 389, 390, 389, 389, 389, 389, 389,   0,
+ 756,   0,   0,   0, 813, 814, 815, 816, 817, 818,
+ 829,   0, 724,   0,  75,  32,   0, 718,   0,   0,
+   0, 667, 706, 710,   0,   0, 674,   0, 669, 540,
+ 541, 542,   0,   0, 224,   0,   0, 154, 149, 150,
  151, 152, 153,   0,   0,  78,  65,   0,   0,   0,
- 528, 216, 164,   0,   0,   0,   0,   0,   0,   0,
- 181,   0,   0,  -2, 234, 235,   0, 248, 249, 807,
- 334, 308, 260,   0, 346, 348, 349, 307,   0,   0,
- 202,   0,   0,   0,   0,   0,   0, 517,  -2, 520,
- 521, 521, 361, 362, 784, 789,   0, 797, 792, 795,
- 802, 804, 770, 796, 821, 822,   0,   0, 835,   0,
- 141, 553,   0,   0,   0,   0,   0,   0, 285,   0,
+ 529, 216, 164,   0,   0,   0,   0,   0,   0,   0,
+ 181,   0,   0,  -2, 234, 235,   0, 248, 249, 808,
+ 335, 308, 260,   0, 347, 349, 350, 307,   0,   0,
+ 202,   0,   0,   0,   0,   0,   0, 518,  -2, 521,
+ 522, 522, 362, 363, 785, 790,   0, 798, 793, 796,
+ 803, 805, 771, 797, 822, 823,   0,   0, 836,   0,
+ 141, 554,   0,   0,   0,   0,   0,   0, 285,   0,
    0, 288, 290, 291, 292, 293, 294, 295, 296, 297,
  298, 299,   0,   0,   0, 202,   0,   0, 262,   0,
-   0,   0, 560, 561, 562, 563, 564, 565, 566, 567,
- 568, 569, 570, 571,   0, 576, 577, 578, 579, 585,
- 586, 587, 588, 589, 590, 591, 610, 610, 594, 610,
- 612, 598, 600,   0, 602,   0, 604, 606,   0, 608,
- 609, 264,   0, 390, 393, 394, 395, 396, 397, 398,
-   0,  97,  98,  99, 100, 101, 758, 760, 799, 710,
-   0,   0,   0, 715, 716,   0,  37,  35, 704, 708,
- 670, 671, 531,  -2, 542, 226, 148,   0, 158, 143,
- 155, 134,  63,  74,  76,  77, 432,   0,   0,   0,
+   0,   0, 561, 562, 563, 564, 565, 566, 567, 568,
+ 569, 570, 571, 572,   0, 577, 578, 579, 580, 586,
+ 587, 588, 589, 590, 591, 592, 611, 611, 595, 611,
+ 613, 599, 601,   0, 603,   0, 605, 607,   0, 609,
+ 610, 264,   0, 391, 394, 395, 396, 397, 398, 399,
+   0,  97,  98,  99, 100, 101, 759, 761, 800, 711,
+   0,   0,   0, 716, 717,   0,  37,  35, 705, 709,
+ 671, 672, 532,  -2, 543, 226, 148,   0, 158, 143,
+ 155, 134,  63,  74,  76,  77, 433,   0,   0,   0,
    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-   0,   0,   0, 425,   0, 526,  -2,  -2,   0,   0,
+   0,   0,   0, 426,   0, 527,  -2,  -2,   0,   0,
  165, 166, 237, 217, 217, 217, 217, 242, 243, 244,
  245, 167, 251, 217, 217, 217, 255, 256, 257, 258,
- 175,   0,   0,   0, 182, 217, 231,   0, 535, 537,
- 335,   0,   0, 352, 354,   0,   0,   0,  45,  46,
- 509, 516,   0, 522, 523,   0, 823, 834, 768, 147,
- 555, 309, 310, 311, 312, 289, 287,   0,   0,   0,
- 183, 201, 192, 580,   0,   0,   0,   0,   0, 605,
- 572, 573, 574, 575, 599, 592,   0, 593, 595, 596,
- 613, 614, 615, 616, 617, 618, 619, 620, 621, 622,
- 623,   0, 628, 629, 630, 631, 632, 636, 637, 638,
- 639, 640, 641, 642, 643, 644, 646, 647, 648, 649,
- 650, 651, 652, 653, 654, 655, 656, 657, 658, 659,
- 660, 601, 603, 607, 199,  95, 757, 759,   0, 724,
- 725, 728, 729,   0, 731,   0, 726, 727, 711, 718,
+ 175,   0,   0,   0, 182, 217, 231,   0, 536, 538,
+ 336,   0,   0, 353, 355,   0,   0,   0,  45,  46,
+ 510, 517,   0, 523, 524,   0, 824, 835, 769, 147,
+ 556, 309, 310, 311, 312, 289, 287,   0,   0,   0,
+ 183, 201, 192, 581,   0,   0,   0,   0,   0, 606,
+ 573, 574, 575, 576, 600, 593,   0, 594, 596, 597,
+ 614, 615, 616, 617, 618, 619, 620, 621, 622, 623,
+ 624,   0, 629, 630, 631, 632, 633, 637, 638, 639,
+ 640, 641, 642, 643, 644, 645, 647, 648, 649, 650,
+ 651, 652, 653, 654, 655, 656, 657, 658, 659, 660,
+ 661, 602, 604, 608, 199,  95, 758, 760,   0, 725,
+ 726, 729, 730,   0, 732,   0, 727, 728, 712, 719,
   78,   0,   0, 158, 157, 154,   0, 144, 145,   0,
   80,  81,  82,   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,  66,  75,
-  70,   0,   0,   0,   0,   0, 527, 238, 239, 240,
- 241, 252, 253, 254, 217,   0, 180,   0, 538, 347,
-   0, 203, 429, 430, 431,   0,   0,   0,   0,   0,
-   0,   0,   0,   0,   0,   0,   0,   0, 376, 377,
- 518,   0, 764,   0,   0,   0, 300, 301, 302, 303,
-   0, 581,   0,   0, 263,   0,   0,   0,   0,   0,
-   0, 634, 635, 624, 625, 626, 627, 645, 762,   0,
-   0,   0,  78, 672, 156, 159, 160,   0,   0,  86,
+  70,   0,   0,   0,   0,   0, 528, 238, 239, 240,
+ 241, 252, 253, 254, 217,   0, 180,   0, 539, 348,
+   0, 203, 430, 431, 432,   0,   0,   0,   0,   0,
+   0,   0,   0,   0,   0,   0,   0,   0, 377, 378,
+ 519,   0, 765,   0,   0,   0, 300, 301, 302, 303,
+   0, 582,   0,   0, 263,   0,   0,   0,   0,   0,
+   0, 635, 636, 625, 626, 627, 628, 646, 763,   0,
+   0,   0,  78, 673, 156, 159, 160,   0,   0,  86,
   87,  88,   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,   0, 423,   0,  -2,  -2,
+   0,   0,   0,   0,   0,   0, 424,   0,  -2,  -2,
  208, 209,   0,   0,   0,  -2, 161,   0,   0,   0,
-   0,   0,  -2, 261, 286, 304, 582,   0,   0,   0,
-   0,   0,   0, 597, 633, 761,   0,   0,   0,   0,
-   0, 719,   0, 146,   0,   0,   0,  90, 433, 434,
-   0,   0, 436, 437,   0, 438,   0, 405, 407,   0,
- 406, 408,   0, 409,   0, 410,   0, 411,   0, 412,
-   0, 417,   0, 418,   0, 419,   0, 420,   0,   0,
-   0,   0,   0,   0,   0,   0,   0, 421,   0, 422,
+   0,   0,  -2, 261, 286, 304, 583,   0,   0,   0,
+   0,   0,   0, 598, 634, 762,   0,   0,   0,   0,
+   0, 720,   0, 146,   0,   0,   0,  90, 434, 435,
+   0,   0, 437, 438,   0, 439,   0, 406, 408,   0,
+ 407, 409,   0, 410,   0, 411,   0, 412,   0, 413,
+   0, 418,   0, 419,   0, 420,   0, 421,   0,   0,
+   0,   0,   0,   0,   0,   0,   0, 422,   0, 423,
    0,  67,   0,   0, 163,   0, 161,   0,   0, 162,
-   0,   0,   0,   0, 584,   0, 558, 555,   0, 730,
-   0,   0,   0, 735, 720,   0,  91,  89, 474, 435,
- 477, 481, 458, 461, 464, 466, 468, 470, 464, 466,
- 468, 470, 413,   0, 414,   0, 415,   0, 416,   0,
- 468, 472, 206, 207,   0,   0, 202,  -2, 790, 313,
- 583,   0, 557, 559, 611,   0,   0,   0,  79,   0,
+   0,   0,   0,   0, 585,   0, 559, 556,   0, 731,
+   0,   0,   0, 736, 721,   0,  91,  89, 475, 436,
+ 478, 482, 459, 462, 465, 467, 469, 471, 465, 467,
+ 469, 471, 414,   0, 415,   0, 416,   0, 417,   0,
+ 469, 473, 206, 207,   0,   0, 202,  -2, 791, 313,
+ 584,   0, 558, 560, 612,   0,   0,   0,  79,   0,
    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-   0,   0, 464, 466, 468, 470,   0,   0,   0,  -2,
- 246,   0,   0,   0, 732, 733, 734, 455, 475, 476,
- 456, 478,   0, 480, 457, 482, 439, 459, 460, 440,
- 462, 463, 441, 465, 442, 467, 443, 469, 444, 471,
- 445, 446, 447, 448,   0,   0,   0,   0, 453, 454,
- 473,   0,   0, 350, 265, 314, 315, 316, 317, 318,
- 319, 320, 321, 322, 323, 324, 325, 326,   0,   0,
479, 449, 450, 451, 452,  -2,   0,   0,   0,   0,
-   0,   0, 556, 176, 217, 327,   0,   0,   0,   0,
- 161,   0,  -2,   0, 177 };
+   0,   0, 465, 467, 469, 471,   0,   0,   0,  -2,
+ 246,   0,   0,   0, 733, 734, 735, 456, 476, 477,
+ 457, 479,   0, 481, 458, 483, 440, 460, 461, 441,
+ 463, 464, 442, 466, 443, 468, 444, 470, 445, 472,
+ 446, 447, 448, 449,   0,   0,   0,   0, 454, 455,
+ 474,   0,   0, 351, 265, 314, 315, 316, 317, 318,
+ 319, 320, 321, 322, 323, 324, 325, 326, 327,   0,
  0, 480, 450, 451, 452, 453,  -2,   0,   0,   0,
+   0,   0,   0, 557, 176, 217, 328,   0,   0,   0,
  0, 161,   0,  -2,   0, 177 };
 #ifdef YYRECOVER
 YYSTATIC YYCONST short yyrecover[] = {
 -1000
@@ -1788,7 +1792,7 @@ YYSTATIC short    yys[YYMAXDEPTH];        /* the parse stack */
 #if ! defined(YYRECURSIVE)
 YYSTATIC YYAPI_TOKENTYPE       YYAPI_TOKENNAME = YYAPI_TOKENNONE;
 #if defined(YYAPI_VALUETYPE)
-// YYSTATIC YYAPI_VALUETYPE    YYAPI_VALUENAME;         FIX 
+// YYSTATIC YYAPI_VALUETYPE    YYAPI_VALUENAME;         FIX
 #endif
 YYSTATIC int yynerrs = 0;                      /* number of errors */
 YYSTATIC short yyerrflag = 0;          /* error recovery flag */
@@ -1827,7 +1831,7 @@ YYSTATIC  char    *yyscpy(register char*t, register char*f)
 
        YYSTATIC YYAPI_TOKENTYPE        YYAPI_TOKENNAME = YYAPI_TOKENNONE;
   #if defined(YYAPI_VALUETYPE)
-       YYSTATIC YYAPI_VALUETYPE        YYAPI_VALUENAME;  
+       YYSTATIC YYAPI_VALUETYPE        YYAPI_VALUENAME;
   #endif
        YYSTATIC int yynerrs = 0;                       /* number of errors */
        YYSTATIC short yyerrflag = 0;           /* error recovery flag */
@@ -3079,40 +3083,43 @@ case 326:
 { yyval.implAttr = (CorMethodImpl) (yypvt[-1].implAttr | miNoOptimization); } break;
 case 327:
 #line 857 "asmparse.y"
-{ yyval.implAttr = (CorMethodImpl) (yypvt[-1].int32); } break;
+{ yyval.implAttr = (CorMethodImpl) (yypvt[-1].implAttr | miAggressiveOptimization); } break;
 case 328:
-#line 860 "asmparse.y"
+#line 858 "asmparse.y"
+{ yyval.implAttr = (CorMethodImpl) (yypvt[-1].int32); } break;
+case 329:
+#line 861 "asmparse.y"
 { PASM->delArgNameList(PASM->m_firstArgName); PASM->m_firstArgName = NULL;PASM->m_lastArgName = NULL; 
                                                             } break;
-case 331:
-#line 868 "asmparse.y"
-{ PASM->EmitByte(yypvt[-0].int32); } break;
 case 332:
 #line 869 "asmparse.y"
-{ delete PASM->m_SEHD; PASM->m_SEHD = PASM->m_SEHDstack.POP(); } break;
+{ PASM->EmitByte(yypvt[-0].int32); } break;
 case 333:
 #line 870 "asmparse.y"
-{ PASM->EmitMaxStack(yypvt[-0].int32); } break;
+{ delete PASM->m_SEHD; PASM->m_SEHD = PASM->m_SEHDstack.POP(); } break;
 case 334:
 #line 871 "asmparse.y"
+{ PASM->EmitMaxStack(yypvt[-0].int32); } break;
+case 335:
+#line 872 "asmparse.y"
 { PASM->EmitLocals(parser->MakeSig(IMAGE_CEE_CS_CALLCONV_LOCAL_SIG, 0, yypvt[-1].binstr)); 
                                                             } break;
-case 335:
-#line 873 "asmparse.y"
+case 336:
+#line 874 "asmparse.y"
 { PASM->EmitZeroInit(); 
                                                               PASM->EmitLocals(parser->MakeSig(IMAGE_CEE_CS_CALLCONV_LOCAL_SIG, 0, yypvt[-1].binstr)); 
                                                             } break;
-case 336:
-#line 876 "asmparse.y"
-{ PASM->EmitEntryPoint(); } break;
 case 337:
 #line 877 "asmparse.y"
+{ PASM->EmitEntryPoint(); } break;
+case 338:
+#line 878 "asmparse.y"
 { PASM->EmitZeroInit(); } break;
-case 340:
-#line 880 "asmparse.y"
+case 341:
+#line 881 "asmparse.y"
 { PASM->AddLabel(PASM->m_CurPC,yypvt[-1].string); /*PASM->EmitLabel($1);*/ } break;
-case 346:
-#line 886 "asmparse.y"
+case 347:
+#line 887 "asmparse.y"
 { if(PASM->m_pCurMethod->m_dwExportOrdinal == 0xFFFFFFFF)
                                                               {
                                                                 PASM->m_pCurMethod->m_dwExportOrdinal = yypvt[-1].int32;
@@ -3123,8 +3130,8 @@ case 346:
                                                               else
                                                                 PASM->report->warn("Duplicate .export directive, ignored\n");
                                                             } break;
-case 347:
-#line 896 "asmparse.y"
+case 348:
+#line 897 "asmparse.y"
 { if(PASM->m_pCurMethod->m_dwExportOrdinal == 0xFFFFFFFF)
                                                               {
                                                                 PASM->m_pCurMethod->m_dwExportOrdinal = yypvt[-3].int32;
@@ -3135,38 +3142,38 @@ case 347:
                                                               else
                                                                 PASM->report->warn("Duplicate .export directive, ignored\n");
                                                             } break;
-case 348:
-#line 906 "asmparse.y"
+case 349:
+#line 907 "asmparse.y"
 { PASM->m_pCurMethod->m_wVTEntry = (WORD)yypvt[-2].int32;
                                                               PASM->m_pCurMethod->m_wVTSlot = (WORD)yypvt[-0].int32; } break;
-case 349:
-#line 909 "asmparse.y"
-{ PASM->AddMethodImpl(yypvt[-2].token,yypvt[-0].string,NULL,NULL,NULL,NULL); } break;
 case 350:
-#line 912 "asmparse.y"
+#line 910 "asmparse.y"
+{ PASM->AddMethodImpl(yypvt[-2].token,yypvt[-0].string,NULL,NULL,NULL,NULL); } break;
+case 351:
+#line 913 "asmparse.y"
 { PASM->AddMethodImpl(yypvt[-6].token,yypvt[-4].string,
                                                               (yypvt[-3].int32==0 ? parser->MakeSig(yypvt[-8].int32,yypvt[-7].binstr,yypvt[-1].binstr) :
                                                               parser->MakeSig(yypvt[-8].int32| IMAGE_CEE_CS_CALLCONV_GENERIC,yypvt[-7].binstr,yypvt[-1].binstr,yypvt[-3].int32))
                                                               ,NULL,NULL,NULL); 
                                                               PASM->ResetArgNameList();
                                                             } break;
-case 352:
-#line 919 "asmparse.y"
+case 353:
+#line 920 "asmparse.y"
 { if((yypvt[-1].int32 > 0) && (yypvt[-1].int32 <= (int)PASM->m_pCurMethod->m_NumTyPars))
                                                                 PASM->m_pCustomDescrList = PASM->m_pCurMethod->m_TyPars[yypvt[-1].int32-1].CAList();
                                                               else
                                                                 PASM->report->error("Type parameter index out of range\n");
                                                             } break;
-case 353:
-#line 924 "asmparse.y"
+case 354:
+#line 925 "asmparse.y"
 { int n = PASM->m_pCurMethod->FindTyPar(yypvt[-0].string);
                                                               if(n >= 0)
                                                                 PASM->m_pCustomDescrList = PASM->m_pCurMethod->m_TyPars[n].CAList();
                                                               else
                                                                 PASM->report->error("Type parameter '%s' undefined\n",yypvt[-0].string);
                                                             } break;
-case 354:
-#line 931 "asmparse.y"
+case 355:
+#line 932 "asmparse.y"
 { if( yypvt[-2].int32 ) {
                                                                 ARG_NAME_LIST* pAN=PASM->findArg(PASM->m_pCurMethod->m_firstArgName, yypvt[-2].int32 - 1);
                                                                 if(pAN)
@@ -3185,29 +3192,26 @@ case 354:
                                                               }
                                                               PASM->m_tkCurrentCVOwner = 0;
                                                             } break;
-case 355:
-#line 951 "asmparse.y"
-{ PASM->m_pCurMethod->CloseScope(); } break;
 case 356:
-#line 954 "asmparse.y"
+#line 952 "asmparse.y"
+{ PASM->m_pCurMethod->CloseScope(); } break;
+case 357:
+#line 955 "asmparse.y"
 { PASM->m_pCurMethod->OpenScope(); } break;
-case 360:
-#line 965 "asmparse.y"
-{ PASM->m_SEHD->tryTo = PASM->m_CurPC; } break;
 case 361:
 #line 966 "asmparse.y"
-{ PASM->SetTryLabels(yypvt[-2].string, yypvt[-0].string); } break;
+{ PASM->m_SEHD->tryTo = PASM->m_CurPC; } break;
 case 362:
 #line 967 "asmparse.y"
+{ PASM->SetTryLabels(yypvt[-2].string, yypvt[-0].string); } break;
+case 363:
+#line 968 "asmparse.y"
 { if(PASM->m_SEHD) {PASM->m_SEHD->tryFrom = yypvt[-2].int32;
                                                               PASM->m_SEHD->tryTo = yypvt[-0].int32;} } break;
-case 363:
-#line 971 "asmparse.y"
+case 364:
+#line 972 "asmparse.y"
 { PASM->NewSEHDescriptor();
                                                               PASM->m_SEHD->tryFrom = PASM->m_CurPC; } break;
-case 364:
-#line 976 "asmparse.y"
-{ PASM->EmitTry(); } break;
 case 365:
 #line 977 "asmparse.y"
 { PASM->EmitTry(); } break;
@@ -3218,106 +3222,109 @@ case 367:
 #line 979 "asmparse.y"
 { PASM->EmitTry(); } break;
 case 368:
-#line 983 "asmparse.y"
-{ PASM->m_SEHD->sehHandler = PASM->m_CurPC; } break;
+#line 980 "asmparse.y"
+{ PASM->EmitTry(); } break;
 case 369:
 #line 984 "asmparse.y"
+{ PASM->m_SEHD->sehHandler = PASM->m_CurPC; } break;
+case 370:
+#line 985 "asmparse.y"
 { PASM->SetFilterLabel(yypvt[-0].string); 
                                                                PASM->m_SEHD->sehHandler = PASM->m_CurPC; } break;
-case 370:
-#line 986 "asmparse.y"
+case 371:
+#line 987 "asmparse.y"
 { PASM->m_SEHD->sehFilter = yypvt[-0].int32; 
                                                                PASM->m_SEHD->sehHandler = PASM->m_CurPC; } break;
-case 371:
-#line 990 "asmparse.y"
+case 372:
+#line 991 "asmparse.y"
 { PASM->m_SEHD->sehClause = COR_ILEXCEPTION_CLAUSE_FILTER;
                                                                PASM->m_SEHD->sehFilter = PASM->m_CurPC; } break;
-case 372:
-#line 994 "asmparse.y"
+case 373:
+#line 995 "asmparse.y"
 {  PASM->m_SEHD->sehClause = COR_ILEXCEPTION_CLAUSE_NONE;
                                                                PASM->SetCatchClass(yypvt[-0].token); 
                                                                PASM->m_SEHD->sehHandler = PASM->m_CurPC; } break;
-case 373:
-#line 999 "asmparse.y"
+case 374:
+#line 1000 "asmparse.y"
 { PASM->m_SEHD->sehClause = COR_ILEXCEPTION_CLAUSE_FINALLY;
                                                                PASM->m_SEHD->sehHandler = PASM->m_CurPC; } break;
-case 374:
-#line 1003 "asmparse.y"
+case 375:
+#line 1004 "asmparse.y"
 { PASM->m_SEHD->sehClause = COR_ILEXCEPTION_CLAUSE_FAULT;
                                                                PASM->m_SEHD->sehHandler = PASM->m_CurPC; } break;
-case 375:
-#line 1007 "asmparse.y"
-{ PASM->m_SEHD->sehHandlerTo = PASM->m_CurPC; } break;
 case 376:
 #line 1008 "asmparse.y"
-{ PASM->SetHandlerLabels(yypvt[-2].string, yypvt[-0].string); } break;
+{ PASM->m_SEHD->sehHandlerTo = PASM->m_CurPC; } break;
 case 377:
 #line 1009 "asmparse.y"
+{ PASM->SetHandlerLabels(yypvt[-2].string, yypvt[-0].string); } break;
+case 378:
+#line 1010 "asmparse.y"
 { PASM->m_SEHD->sehHandler = yypvt[-2].int32;
                                                                PASM->m_SEHD->sehHandlerTo = yypvt[-0].int32; } break;
-case 379:
-#line 1017 "asmparse.y"
+case 380:
+#line 1018 "asmparse.y"
 { PASM->EmitDataLabel(yypvt[-1].string); } break;
-case 381:
-#line 1021 "asmparse.y"
-{ PASM->SetDataSection(); } break;
 case 382:
 #line 1022 "asmparse.y"
-{ PASM->SetTLSSection(); } break;
+{ PASM->SetDataSection(); } break;
 case 383:
 #line 1023 "asmparse.y"
+{ PASM->SetTLSSection(); } break;
+case 384:
+#line 1024 "asmparse.y"
 { PASM->SetILSection(); } break;
-case 388:
-#line 1034 "asmparse.y"
-{ yyval.int32 = 1; } break;
 case 389:
 #line 1035 "asmparse.y"
+{ yyval.int32 = 1; } break;
+case 390:
+#line 1036 "asmparse.y"
 { yyval.int32 = yypvt[-1].int32;
                                                                if(yypvt[-1].int32 <= 0) { PASM->report->error("Illegal item count: %d\n",yypvt[-1].int32);
                                                                   if(!PASM->OnErrGo) yyval.int32 = 1; }} break;
-case 390:
-#line 1040 "asmparse.y"
-{ PASM->EmitDataString(yypvt[-1].binstr); } break;
 case 391:
 #line 1041 "asmparse.y"
-{ PASM->EmitDD(yypvt[-1].string); } break;
+{ PASM->EmitDataString(yypvt[-1].binstr); } break;
 case 392:
 #line 1042 "asmparse.y"
-{ PASM->EmitData(yypvt[-1].binstr->ptr(),yypvt[-1].binstr->length()); } break;
+{ PASM->EmitDD(yypvt[-1].string); } break;
 case 393:
-#line 1044 "asmparse.y"
+#line 1043 "asmparse.y"
+{ PASM->EmitData(yypvt[-1].binstr->ptr(),yypvt[-1].binstr->length()); } break;
+case 394:
+#line 1045 "asmparse.y"
 { float f = (float) (*yypvt[-2].float64); float* p = new (nothrow) float[yypvt[-0].int32];
                                                                if(p != NULL) {
                                                                  for(int i=0; i < yypvt[-0].int32; i++) p[i] = f;
                                                                  PASM->EmitData(p, sizeof(float)*yypvt[-0].int32); delete yypvt[-2].float64; delete [] p; 
                                                                } else PASM->report->error("Out of memory emitting data block %d bytes\n",
                                                                      sizeof(float)*yypvt[-0].int32); } break;
-case 394:
-#line 1051 "asmparse.y"
+case 395:
+#line 1052 "asmparse.y"
 { double* p = new (nothrow) double[yypvt[-0].int32];
                                                                if(p != NULL) {
                                                                  for(int i=0; i<yypvt[-0].int32; i++) p[i] = *(yypvt[-2].float64);
                                                                  PASM->EmitData(p, sizeof(double)*yypvt[-0].int32); delete yypvt[-2].float64; delete [] p;
                                                                } else PASM->report->error("Out of memory emitting data block %d bytes\n",
                                                                      sizeof(double)*yypvt[-0].int32); } break;
-case 395:
-#line 1058 "asmparse.y"
+case 396:
+#line 1059 "asmparse.y"
 { __int64* p = new (nothrow) __int64[yypvt[-0].int32];
                                                                if(p != NULL) {
                                                                  for(int i=0; i<yypvt[-0].int32; i++) p[i] = *(yypvt[-2].int64);
                                                                  PASM->EmitData(p, sizeof(__int64)*yypvt[-0].int32); delete yypvt[-2].int64; delete [] p;
                                                                } else PASM->report->error("Out of memory emitting data block %d bytes\n",
                                                                      sizeof(__int64)*yypvt[-0].int32); } break;
-case 396:
-#line 1065 "asmparse.y"
+case 397:
+#line 1066 "asmparse.y"
 { __int32* p = new (nothrow) __int32[yypvt[-0].int32];
                                                                if(p != NULL) {
                                                                  for(int i=0; i<yypvt[-0].int32; i++) p[i] = yypvt[-2].int32;
                                                                  PASM->EmitData(p, sizeof(__int32)*yypvt[-0].int32); delete [] p;
                                                                } else PASM->report->error("Out of memory emitting data block %d bytes\n",
                                                                      sizeof(__int32)*yypvt[-0].int32); } break;
-case 397:
-#line 1072 "asmparse.y"
+case 398:
+#line 1073 "asmparse.y"
 { __int16 i = (__int16) yypvt[-2].int32; FAIL_UNLESS(i == yypvt[-2].int32, ("Value %d too big\n", yypvt[-2].int32));
                                                                __int16* p = new (nothrow) __int16[yypvt[-0].int32];
                                                                if(p != NULL) {
@@ -3325,8 +3332,8 @@ case 397:
                                                                  PASM->EmitData(p, sizeof(__int16)*yypvt[-0].int32); delete [] p;
                                                                } else PASM->report->error("Out of memory emitting data block %d bytes\n",
                                                                      sizeof(__int16)*yypvt[-0].int32); } break;
-case 398:
-#line 1080 "asmparse.y"
+case 399:
+#line 1081 "asmparse.y"
 { __int8 i = (__int8) yypvt[-2].int32; FAIL_UNLESS(i == yypvt[-2].int32, ("Value %d too big\n", yypvt[-2].int32));
                                                                __int8* p = new (nothrow) __int8[yypvt[-0].int32];
                                                                if(p != NULL) {
@@ -3334,405 +3341,405 @@ case 398:
                                                                  PASM->EmitData(p, sizeof(__int8)*yypvt[-0].int32); delete [] p;
                                                                } else PASM->report->error("Out of memory emitting data block %d bytes\n",
                                                                      sizeof(__int8)*yypvt[-0].int32); } break;
-case 399:
-#line 1087 "asmparse.y"
-{ PASM->EmitData(NULL, sizeof(float)*yypvt[-0].int32); } break;
 case 400:
 #line 1088 "asmparse.y"
-{ PASM->EmitData(NULL, sizeof(double)*yypvt[-0].int32); } break;
+{ PASM->EmitData(NULL, sizeof(float)*yypvt[-0].int32); } break;
 case 401:
 #line 1089 "asmparse.y"
-{ PASM->EmitData(NULL, sizeof(__int64)*yypvt[-0].int32); } break;
+{ PASM->EmitData(NULL, sizeof(double)*yypvt[-0].int32); } break;
 case 402:
 #line 1090 "asmparse.y"
-{ PASM->EmitData(NULL, sizeof(__int32)*yypvt[-0].int32); } break;
+{ PASM->EmitData(NULL, sizeof(__int64)*yypvt[-0].int32); } break;
 case 403:
 #line 1091 "asmparse.y"
-{ PASM->EmitData(NULL, sizeof(__int16)*yypvt[-0].int32); } break;
+{ PASM->EmitData(NULL, sizeof(__int32)*yypvt[-0].int32); } break;
 case 404:
 #line 1092 "asmparse.y"
-{ PASM->EmitData(NULL, sizeof(__int8)*yypvt[-0].int32); } break;
+{ PASM->EmitData(NULL, sizeof(__int16)*yypvt[-0].int32); } break;
 case 405:
-#line 1096 "asmparse.y"
+#line 1093 "asmparse.y"
+{ PASM->EmitData(NULL, sizeof(__int8)*yypvt[-0].int32); } break;
+case 406:
+#line 1097 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_R4);
                                                                float f = (float)(*yypvt[-1].float64);
                                                                yyval.binstr->appendInt32(*((__int32*)&f)); delete yypvt[-1].float64; } break;
-case 406:
-#line 1099 "asmparse.y"
+case 407:
+#line 1100 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_R8); 
                                                                yyval.binstr->appendInt64((__int64 *)yypvt[-1].float64); delete yypvt[-1].float64; } break;
-case 407:
-#line 1101 "asmparse.y"
+case 408:
+#line 1102 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_R4); 
                                                                yyval.binstr->appendInt32(yypvt[-1].int32); } break;
-case 408:
-#line 1103 "asmparse.y"
+case 409:
+#line 1104 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_R8); 
                                                                yyval.binstr->appendInt64((__int64 *)yypvt[-1].int64); delete yypvt[-1].int64; } break;
-case 409:
-#line 1105 "asmparse.y"
+case 410:
+#line 1106 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I8); 
                                                                yyval.binstr->appendInt64((__int64 *)yypvt[-1].int64); delete yypvt[-1].int64; } break;
-case 410:
-#line 1107 "asmparse.y"
+case 411:
+#line 1108 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I4); 
                                                                yyval.binstr->appendInt32(yypvt[-1].int32); } break;
-case 411:
-#line 1109 "asmparse.y"
+case 412:
+#line 1110 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I2); 
                                                                yyval.binstr->appendInt16(yypvt[-1].int32); } break;
-case 412:
-#line 1111 "asmparse.y"
+case 413:
+#line 1112 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I1); 
                                                                yyval.binstr->appendInt8(yypvt[-1].int32); } break;
-case 413:
-#line 1113 "asmparse.y"
+case 414:
+#line 1114 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U8); 
                                                                yyval.binstr->appendInt64((__int64 *)yypvt[-1].int64); delete yypvt[-1].int64; } break;
-case 414:
-#line 1115 "asmparse.y"
+case 415:
+#line 1116 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U4); 
                                                                yyval.binstr->appendInt32(yypvt[-1].int32); } break;
-case 415:
-#line 1117 "asmparse.y"
+case 416:
+#line 1118 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U2); 
                                                                yyval.binstr->appendInt16(yypvt[-1].int32); } break;
-case 416:
-#line 1119 "asmparse.y"
+case 417:
+#line 1120 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U1); 
                                                                yyval.binstr->appendInt8(yypvt[-1].int32); } break;
-case 417:
-#line 1121 "asmparse.y"
+case 418:
+#line 1122 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U8); 
                                                                yyval.binstr->appendInt64((__int64 *)yypvt[-1].int64); delete yypvt[-1].int64; } break;
-case 418:
-#line 1123 "asmparse.y"
+case 419:
+#line 1124 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U4); 
                                                                yyval.binstr->appendInt32(yypvt[-1].int32); } break;
-case 419:
-#line 1125 "asmparse.y"
+case 420:
+#line 1126 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U2); 
                                                                yyval.binstr->appendInt16(yypvt[-1].int32); } break;
-case 420:
-#line 1127 "asmparse.y"
+case 421:
+#line 1128 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U1); 
                                                                yyval.binstr->appendInt8(yypvt[-1].int32); } break;
-case 421:
-#line 1129 "asmparse.y"
+case 422:
+#line 1130 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_CHAR); 
                                                                yyval.binstr->appendInt16(yypvt[-1].int32); } break;
-case 422:
-#line 1131 "asmparse.y"
+case 423:
+#line 1132 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_BOOLEAN); 
                                                                yyval.binstr->appendInt8(yypvt[-1].int32);} break;
-case 423:
-#line 1133 "asmparse.y"
+case 424:
+#line 1134 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_STRING);
                                                                yyval.binstr->append(yypvt[-1].binstr); delete yypvt[-1].binstr;} break;
-case 424:
-#line 1137 "asmparse.y"
-{ bParsingByteArray = TRUE; } break;
 case 425:
-#line 1140 "asmparse.y"
-{ yyval.binstr = new BinStr(); } break;
+#line 1138 "asmparse.y"
+{ bParsingByteArray = TRUE; } break;
 case 426:
 #line 1141 "asmparse.y"
-{ yyval.binstr = yypvt[-0].binstr; } break;
+{ yyval.binstr = new BinStr(); } break;
 case 427:
-#line 1144 "asmparse.y"
-{ __int8 i = (__int8) yypvt[-0].int32; yyval.binstr = new BinStr(); yyval.binstr->appendInt8(i); } break;
+#line 1142 "asmparse.y"
+{ yyval.binstr = yypvt[-0].binstr; } break;
 case 428:
 #line 1145 "asmparse.y"
-{ __int8 i = (__int8) yypvt[-0].int32; yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt8(i); } break;
+{ __int8 i = (__int8) yypvt[-0].int32; yyval.binstr = new BinStr(); yyval.binstr->appendInt8(i); } break;
 case 429:
-#line 1149 "asmparse.y"
-{ yyval.binstr = yypvt[-0].binstr; } break;
+#line 1146 "asmparse.y"
+{ __int8 i = (__int8) yypvt[-0].int32; yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt8(i); } break;
 case 430:
 #line 1150 "asmparse.y"
-{ yyval.binstr = BinStrToUnicode(yypvt[-0].binstr,true); yyval.binstr->insertInt8(ELEMENT_TYPE_STRING);} break;
+{ yyval.binstr = yypvt[-0].binstr; } break;
 case 431:
 #line 1151 "asmparse.y"
+{ yyval.binstr = BinStrToUnicode(yypvt[-0].binstr,true); yyval.binstr->insertInt8(ELEMENT_TYPE_STRING);} break;
+case 432:
+#line 1152 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_CLASS); 
                                                                yyval.binstr->appendInt32(0); } break;
-case 432:
-#line 1156 "asmparse.y"
-{ yyval.binstr = yypvt[-0].binstr; } break;
 case 433:
 #line 1157 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_STRING); yyval.binstr->appendInt8(0xFF); } break;
+{ yyval.binstr = yypvt[-0].binstr; } break;
 case 434:
 #line 1158 "asmparse.y"
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_STRING); yyval.binstr->appendInt8(0xFF); } break;
+case 435:
+#line 1159 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_STRING); 
                                                                AppendStringWithLength(yyval.binstr,yypvt[-1].string); delete [] yypvt[-1].string;} break;
-case 435:
-#line 1160 "asmparse.y"
+case 436:
+#line 1161 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(SERIALIZATION_TYPE_TYPE); 
                                                                AppendStringWithLength(yyval.binstr,yypvt[-1].string); delete [] yypvt[-1].string;} break;
-case 436:
-#line 1162 "asmparse.y"
+case 437:
+#line 1163 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(SERIALIZATION_TYPE_TYPE); 
                                                                AppendStringWithLength(yyval.binstr,PASM->ReflectionNotation(yypvt[-1].token));} break;
-case 437:
-#line 1164 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(SERIALIZATION_TYPE_TYPE); yyval.binstr->appendInt8(0xFF); } break;
 case 438:
 #line 1165 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt8(SERIALIZATION_TYPE_TAGGED_OBJECT);} break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(SERIALIZATION_TYPE_TYPE); yyval.binstr->appendInt8(0xFF); } break;
 case 439:
-#line 1167 "asmparse.y"
+#line 1166 "asmparse.y"
+{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt8(SERIALIZATION_TYPE_TAGGED_OBJECT);} break;
+case 440:
+#line 1168 "asmparse.y"
 { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_R4);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 440:
-#line 1171 "asmparse.y"
+case 441:
+#line 1172 "asmparse.y"
 { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_R8);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 441:
-#line 1175 "asmparse.y"
+case 442:
+#line 1176 "asmparse.y"
 { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_I8);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 442:
-#line 1179 "asmparse.y"
+case 443:
+#line 1180 "asmparse.y"
 { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_I4);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 443:
-#line 1183 "asmparse.y"
+case 444:
+#line 1184 "asmparse.y"
 { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_I2);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 444:
-#line 1187 "asmparse.y"
+case 445:
+#line 1188 "asmparse.y"
 { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_I1);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 445:
-#line 1191 "asmparse.y"
+case 446:
+#line 1192 "asmparse.y"
 { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_U8);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 446:
-#line 1195 "asmparse.y"
+case 447:
+#line 1196 "asmparse.y"
 { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_U4);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 447:
-#line 1199 "asmparse.y"
+case 448:
+#line 1200 "asmparse.y"
 { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_U2);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 448:
-#line 1203 "asmparse.y"
+case 449:
+#line 1204 "asmparse.y"
 { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_U1);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 449:
-#line 1207 "asmparse.y"
+case 450:
+#line 1208 "asmparse.y"
 { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_U8);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 450:
-#line 1211 "asmparse.y"
+case 451:
+#line 1212 "asmparse.y"
 { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_U4);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 451:
-#line 1215 "asmparse.y"
+case 452:
+#line 1216 "asmparse.y"
 { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_U2);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 452:
-#line 1219 "asmparse.y"
+case 453:
+#line 1220 "asmparse.y"
 { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_U1);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 453:
-#line 1223 "asmparse.y"
+case 454:
+#line 1224 "asmparse.y"
 { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_CHAR);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 454:
-#line 1227 "asmparse.y"
+case 455:
+#line 1228 "asmparse.y"
 { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_BOOLEAN);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 455:
-#line 1231 "asmparse.y"
+case 456:
+#line 1232 "asmparse.y"
 { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_STRING);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 456:
-#line 1235 "asmparse.y"
+case 457:
+#line 1236 "asmparse.y"
 { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
                                                                yyval.binstr->insertInt8(SERIALIZATION_TYPE_TYPE);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 457:
-#line 1239 "asmparse.y"
+case 458:
+#line 1240 "asmparse.y"
 { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
                                                                yyval.binstr->insertInt8(SERIALIZATION_TYPE_TAGGED_OBJECT);
                                                                yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 458:
-#line 1245 "asmparse.y"
-{ yyval.binstr = new BinStr(); } break;
 case 459:
 #line 1246 "asmparse.y"
+{ yyval.binstr = new BinStr(); } break;
+case 460:
+#line 1247 "asmparse.y"
 { yyval.binstr = yypvt[-1].binstr;
                                                                float f = (float) (*yypvt[-0].float64); yyval.binstr->appendInt32(*((__int32*)&f)); delete yypvt[-0].float64; } break;
-case 460:
-#line 1248 "asmparse.y"
+case 461:
+#line 1249 "asmparse.y"
 { yyval.binstr = yypvt[-1].binstr; 
                                                                yyval.binstr->appendInt32(yypvt[-0].int32); } break;
-case 461:
-#line 1252 "asmparse.y"
-{ yyval.binstr = new BinStr(); } break;
 case 462:
 #line 1253 "asmparse.y"
+{ yyval.binstr = new BinStr(); } break;
+case 463:
+#line 1254 "asmparse.y"
 { yyval.binstr = yypvt[-1].binstr; 
                                                                yyval.binstr->appendInt64((__int64 *)yypvt[-0].float64); delete yypvt[-0].float64; } break;
-case 463:
-#line 1255 "asmparse.y"
+case 464:
+#line 1256 "asmparse.y"
 { yyval.binstr = yypvt[-1].binstr; 
                                                                yyval.binstr->appendInt64((__int64 *)yypvt[-0].int64); delete yypvt[-0].int64; } break;
-case 464:
-#line 1259 "asmparse.y"
-{ yyval.binstr = new BinStr(); } break;
 case 465:
 #line 1260 "asmparse.y"
+{ yyval.binstr = new BinStr(); } break;
+case 466:
+#line 1261 "asmparse.y"
 { yyval.binstr = yypvt[-1].binstr; 
                                                                yyval.binstr->appendInt64((__int64 *)yypvt[-0].int64); delete yypvt[-0].int64; } break;
-case 466:
-#line 1264 "asmparse.y"
-{ yyval.binstr = new BinStr(); } break;
 case 467:
 #line 1265 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt32(yypvt[-0].int32);} break;
-case 468:
-#line 1268 "asmparse.y"
 { yyval.binstr = new BinStr(); } break;
+case 468:
+#line 1266 "asmparse.y"
+{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt32(yypvt[-0].int32);} break;
 case 469:
 #line 1269 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt16(yypvt[-0].int32);} break;
-case 470:
-#line 1272 "asmparse.y"
 { yyval.binstr = new BinStr(); } break;
+case 470:
+#line 1270 "asmparse.y"
+{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt16(yypvt[-0].int32);} break;
 case 471:
 #line 1273 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt8(yypvt[-0].int32); } break;
-case 472:
-#line 1276 "asmparse.y"
 { yyval.binstr = new BinStr(); } break;
+case 472:
+#line 1274 "asmparse.y"
+{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt8(yypvt[-0].int32); } break;
 case 473:
 #line 1277 "asmparse.y"
+{ yyval.binstr = new BinStr(); } break;
+case 474:
+#line 1278 "asmparse.y"
 { yyval.binstr = yypvt[-1].binstr; 
                                                                yyval.binstr->appendInt8(yypvt[-0].int32);} break;
-case 474:
-#line 1281 "asmparse.y"
-{ yyval.binstr = new BinStr(); } break;
 case 475:
 #line 1282 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt8(0xFF); } break;
+{ yyval.binstr = new BinStr(); } break;
 case 476:
 #line 1283 "asmparse.y"
+{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt8(0xFF); } break;
+case 477:
+#line 1284 "asmparse.y"
 { yyval.binstr = yypvt[-1].binstr; 
                                                                AppendStringWithLength(yyval.binstr,yypvt[-0].string); delete [] yypvt[-0].string;} break;
-case 477:
-#line 1287 "asmparse.y"
-{ yyval.binstr = new BinStr(); } break;
 case 478:
 #line 1288 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt8(0xFF); } break;
+{ yyval.binstr = new BinStr(); } break;
 case 479:
 #line 1289 "asmparse.y"
+{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt8(0xFF); } break;
+case 480:
+#line 1290 "asmparse.y"
 { yyval.binstr = yypvt[-2].binstr; 
                                                                AppendStringWithLength(yyval.binstr,yypvt[-0].string); delete [] yypvt[-0].string;} break;
-case 480:
-#line 1291 "asmparse.y"
+case 481:
+#line 1292 "asmparse.y"
 { yyval.binstr = yypvt[-1].binstr; 
                                                                AppendStringWithLength(yyval.binstr,PASM->ReflectionNotation(yypvt[-0].token));} break;
-case 481:
-#line 1295 "asmparse.y"
-{ yyval.binstr = new BinStr(); } break;
 case 482:
 #line 1296 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->append(yypvt[-0].binstr); delete yypvt[-0].binstr; } break;
+{ yyval.binstr = new BinStr(); } break;
 case 483:
-#line 1300 "asmparse.y"
+#line 1297 "asmparse.y"
+{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->append(yypvt[-0].binstr); delete yypvt[-0].binstr; } break;
+case 484:
+#line 1301 "asmparse.y"
 { parser->m_ANSFirst.PUSH(PASM->m_firstArgName);
                                                                parser->m_ANSLast.PUSH(PASM->m_lastArgName);   
                                                                PASM->m_firstArgName = NULL;
                                                                PASM->m_lastArgName = NULL; } break;
-case 484:
-#line 1306 "asmparse.y"
-{ yyval.instr = SetupInstr(yypvt[-0].opcode); } break;
 case 485:
-#line 1309 "asmparse.y"
+#line 1307 "asmparse.y"
 { yyval.instr = SetupInstr(yypvt[-0].opcode); } break;
 case 486:
-#line 1312 "asmparse.y"
+#line 1310 "asmparse.y"
 { yyval.instr = SetupInstr(yypvt[-0].opcode); } break;
 case 487:
-#line 1315 "asmparse.y"
+#line 1313 "asmparse.y"
 { yyval.instr = SetupInstr(yypvt[-0].opcode); } break;
 case 488:
-#line 1318 "asmparse.y"
+#line 1316 "asmparse.y"
 { yyval.instr = SetupInstr(yypvt[-0].opcode); } break;
 case 489:
-#line 1321 "asmparse.y"
+#line 1319 "asmparse.y"
 { yyval.instr = SetupInstr(yypvt[-0].opcode); } break;
 case 490:
-#line 1324 "asmparse.y"
+#line 1322 "asmparse.y"
+{ yyval.instr = SetupInstr(yypvt[-0].opcode); } break;
+case 491:
+#line 1325 "asmparse.y"
 { yyval.instr = SetupInstr(yypvt[-0].opcode); 
                                                                if((!PASM->OnErrGo)&&
                                                                ((yypvt[-0].opcode == CEE_NEWOBJ)||
                                                                 (yypvt[-0].opcode == CEE_CALLVIRT))) 
                                                                   iCallConv = IMAGE_CEE_CS_CALLCONV_HASTHIS;
                                                              } break;
-case 491:
-#line 1332 "asmparse.y"
-{ yyval.instr = SetupInstr(yypvt[-0].opcode); } break;
 case 492:
-#line 1335 "asmparse.y"
+#line 1333 "asmparse.y"
 { yyval.instr = SetupInstr(yypvt[-0].opcode); } break;
 case 493:
-#line 1338 "asmparse.y"
+#line 1336 "asmparse.y"
 { yyval.instr = SetupInstr(yypvt[-0].opcode); } break;
 case 494:
-#line 1341 "asmparse.y"
+#line 1339 "asmparse.y"
 { yyval.instr = SetupInstr(yypvt[-0].opcode); } break;
 case 495:
-#line 1344 "asmparse.y"
-{ yyval.instr = SetupInstr(yypvt[-0].opcode); iOpcodeLen = PASM->OpcodeLen(yyval.instr); } break;
-case 496:
-#line 1347 "asmparse.y"
+#line 1342 "asmparse.y"
 { yyval.instr = SetupInstr(yypvt[-0].opcode); } break;
+case 496:
+#line 1345 "asmparse.y"
+{ yyval.instr = SetupInstr(yypvt[-0].opcode); iOpcodeLen = PASM->OpcodeLen(yyval.instr); } break;
 case 497:
-#line 1350 "asmparse.y"
-{ yyval.instr = yypvt[-1].instr; bParsingByteArray = TRUE; } break;
+#line 1348 "asmparse.y"
+{ yyval.instr = SetupInstr(yypvt[-0].opcode); } break;
 case 498:
-#line 1354 "asmparse.y"
-{ PASM->EmitOpcode(yypvt[-0].instr); } break;
+#line 1351 "asmparse.y"
+{ yyval.instr = yypvt[-1].instr; bParsingByteArray = TRUE; } break;
 case 499:
 #line 1355 "asmparse.y"
-{ PASM->EmitInstrVar(yypvt[-1].instr, yypvt[-0].int32); } break;
+{ PASM->EmitOpcode(yypvt[-0].instr); } break;
 case 500:
 #line 1356 "asmparse.y"
-{ PASM->EmitInstrVarByName(yypvt[-1].instr, yypvt[-0].string); } break;
+{ PASM->EmitInstrVar(yypvt[-1].instr, yypvt[-0].int32); } break;
 case 501:
 #line 1357 "asmparse.y"
-{ PASM->EmitInstrI(yypvt[-1].instr, yypvt[-0].int32); } break;
+{ PASM->EmitInstrVarByName(yypvt[-1].instr, yypvt[-0].string); } break;
 case 502:
 #line 1358 "asmparse.y"
-{ PASM->EmitInstrI8(yypvt[-1].instr, yypvt[-0].int64); } break;
+{ PASM->EmitInstrI(yypvt[-1].instr, yypvt[-0].int32); } break;
 case 503:
 #line 1359 "asmparse.y"
-{ PASM->EmitInstrR(yypvt[-1].instr, yypvt[-0].float64); delete (yypvt[-0].float64);} break;
+{ PASM->EmitInstrI8(yypvt[-1].instr, yypvt[-0].int64); } break;
 case 504:
 #line 1360 "asmparse.y"
-{ double f = (double) (*yypvt[-0].int64); PASM->EmitInstrR(yypvt[-1].instr, &f); } break;
+{ PASM->EmitInstrR(yypvt[-1].instr, yypvt[-0].float64); delete (yypvt[-0].float64);} break;
 case 505:
 #line 1361 "asmparse.y"
+{ double f = (double) (*yypvt[-0].int64); PASM->EmitInstrR(yypvt[-1].instr, &f); } break;
+case 506:
+#line 1362 "asmparse.y"
 { unsigned L = yypvt[-1].binstr->length();
                                                                FAIL_UNLESS(L >= sizeof(float), ("%d hexbytes, must be at least %d\n",
                                                                            L,sizeof(float))); 
@@ -3742,22 +3749,22 @@ case 505:
                                                                                     : (double)(*(float *)(yypvt[-1].binstr->ptr())); 
                                                                    PASM->EmitInstrR(yypvt[-2].instr,&f); }
                                                                delete yypvt[-1].binstr; } break;
-case 506:
-#line 1370 "asmparse.y"
-{ PASM->EmitInstrBrOffset(yypvt[-1].instr, yypvt[-0].int32); } break;
 case 507:
 #line 1371 "asmparse.y"
-{ PASM->EmitInstrBrTarget(yypvt[-1].instr, yypvt[-0].string); } break;
+{ PASM->EmitInstrBrOffset(yypvt[-1].instr, yypvt[-0].int32); } break;
 case 508:
-#line 1373 "asmparse.y"
+#line 1372 "asmparse.y"
+{ PASM->EmitInstrBrTarget(yypvt[-1].instr, yypvt[-0].string); } break;
+case 509:
+#line 1374 "asmparse.y"
 { PASM->SetMemberRefFixup(yypvt[-0].token,PASM->OpcodeLen(yypvt[-1].instr));
                                                                PASM->EmitInstrI(yypvt[-1].instr,yypvt[-0].token);
                                                                PASM->m_tkCurrentCVOwner = yypvt[-0].token;
                                                                PASM->m_pCustomDescrList = NULL;
                                                                iCallConv = 0;
                                                              } break;
-case 509:
-#line 1380 "asmparse.y"
+case 510:
+#line 1381 "asmparse.y"
 { yypvt[-3].binstr->insertInt8(IMAGE_CEE_CS_CALLCONV_FIELD); 
                                                                mdToken mr = PASM->MakeMemberRef(yypvt[-2].token, yypvt[-0].string, yypvt[-3].binstr);
                                                                PASM->SetMemberRefFixup(mr, PASM->OpcodeLen(yypvt[-4].instr));
@@ -3765,8 +3772,8 @@ case 509:
                                                                PASM->m_tkCurrentCVOwner = mr;
                                                                PASM->m_pCustomDescrList = NULL;
                                                              } break;
-case 510:
-#line 1388 "asmparse.y"
+case 511:
+#line 1389 "asmparse.y"
 { yypvt[-1].binstr->insertInt8(IMAGE_CEE_CS_CALLCONV_FIELD); 
                                                                mdToken mr = PASM->MakeMemberRef(mdTokenNil, yypvt[-0].string, yypvt[-1].binstr);
                                                                PASM->SetMemberRefFixup(mr, PASM->OpcodeLen(yypvt[-2].instr));
@@ -3774,578 +3781,578 @@ case 510:
                                                                PASM->m_tkCurrentCVOwner = mr;
                                                                PASM->m_pCustomDescrList = NULL;
                                                              } break;
-case 511:
-#line 1395 "asmparse.y"
+case 512:
+#line 1396 "asmparse.y"
 { mdToken mr = yypvt[-0].token;
                                                                PASM->SetMemberRefFixup(mr, PASM->OpcodeLen(yypvt[-1].instr));
                                                                PASM->EmitInstrI(yypvt[-1].instr,mr);
                                                                PASM->m_tkCurrentCVOwner = mr;
                                                                PASM->m_pCustomDescrList = NULL;
                                                              } break;
-case 512:
-#line 1401 "asmparse.y"
+case 513:
+#line 1402 "asmparse.y"
 { mdToken mr = yypvt[-0].tdd->m_tkTypeSpec;
                                                                PASM->SetMemberRefFixup(mr, PASM->OpcodeLen(yypvt[-1].instr));
                                                                PASM->EmitInstrI(yypvt[-1].instr,mr);
                                                                PASM->m_tkCurrentCVOwner = mr;
                                                                PASM->m_pCustomDescrList = NULL;
                                                              } break;
-case 513:
-#line 1407 "asmparse.y"
+case 514:
+#line 1408 "asmparse.y"
 { mdToken mr = yypvt[-0].tdd->m_tkTypeSpec;
                                                                PASM->SetMemberRefFixup(mr, PASM->OpcodeLen(yypvt[-1].instr));
                                                                PASM->EmitInstrI(yypvt[-1].instr,mr);
                                                                PASM->m_tkCurrentCVOwner = mr;
                                                                PASM->m_pCustomDescrList = NULL;
                                                              } break;
-case 514:
-#line 1413 "asmparse.y"
+case 515:
+#line 1414 "asmparse.y"
 { PASM->EmitInstrI(yypvt[-1].instr, yypvt[-0].token); 
                                                                PASM->m_tkCurrentCVOwner = yypvt[-0].token;
                                                                PASM->m_pCustomDescrList = NULL;
                                                              } break;
-case 515:
-#line 1417 "asmparse.y"
-{ PASM->EmitInstrStringLiteral(yypvt[-1].instr, yypvt[-0].binstr,TRUE); } break;
 case 516:
-#line 1419 "asmparse.y"
-{ PASM->EmitInstrStringLiteral(yypvt[-4].instr, yypvt[-1].binstr,FALSE); } break;
+#line 1418 "asmparse.y"
+{ PASM->EmitInstrStringLiteral(yypvt[-1].instr, yypvt[-0].binstr,TRUE); } break;
 case 517:
-#line 1421 "asmparse.y"
-{ PASM->EmitInstrStringLiteral(yypvt[-3].instr, yypvt[-1].binstr,FALSE,TRUE); } break;
+#line 1420 "asmparse.y"
+{ PASM->EmitInstrStringLiteral(yypvt[-4].instr, yypvt[-1].binstr,FALSE); } break;
 case 518:
-#line 1423 "asmparse.y"
+#line 1422 "asmparse.y"
+{ PASM->EmitInstrStringLiteral(yypvt[-3].instr, yypvt[-1].binstr,FALSE,TRUE); } break;
+case 519:
+#line 1424 "asmparse.y"
 { PASM->EmitInstrSig(yypvt[-5].instr, parser->MakeSig(yypvt[-4].int32, yypvt[-3].binstr, yypvt[-1].binstr)); 
                                                                PASM->ResetArgNameList();
                                                              } break;
-case 519:
-#line 1427 "asmparse.y"
+case 520:
+#line 1428 "asmparse.y"
 { PASM->EmitInstrI(yypvt[-1].instr,yypvt[-0].token);
                                                                PASM->m_tkCurrentCVOwner = yypvt[-0].token;
                                                                PASM->m_pCustomDescrList = NULL;
                                                                iOpcodeLen = 0;
                                                              } break;
-case 520:
-#line 1432 "asmparse.y"
-{ PASM->EmitInstrSwitch(yypvt[-3].instr, yypvt[-1].labels); } break;
 case 521:
-#line 1435 "asmparse.y"
-{ yyval.labels = 0; } break;
+#line 1433 "asmparse.y"
+{ PASM->EmitInstrSwitch(yypvt[-3].instr, yypvt[-1].labels); } break;
 case 522:
 #line 1436 "asmparse.y"
-{ yyval.labels = new Labels(yypvt[-2].string, yypvt[-0].labels, TRUE); } break;
+{ yyval.labels = 0; } break;
 case 523:
 #line 1437 "asmparse.y"
-{ yyval.labels = new Labels((char *)(UINT_PTR)yypvt[-2].int32, yypvt[-0].labels, FALSE); } break;
+{ yyval.labels = new Labels(yypvt[-2].string, yypvt[-0].labels, TRUE); } break;
 case 524:
 #line 1438 "asmparse.y"
-{ yyval.labels = new Labels(yypvt[-0].string, NULL, TRUE); } break;
+{ yyval.labels = new Labels((char *)(UINT_PTR)yypvt[-2].int32, yypvt[-0].labels, FALSE); } break;
 case 525:
 #line 1439 "asmparse.y"
-{ yyval.labels = new Labels((char *)(UINT_PTR)yypvt[-0].int32, NULL, FALSE); } break;
+{ yyval.labels = new Labels(yypvt[-0].string, NULL, TRUE); } break;
 case 526:
-#line 1443 "asmparse.y"
-{ yyval.binstr = NULL; } break;
+#line 1440 "asmparse.y"
+{ yyval.labels = new Labels((char *)(UINT_PTR)yypvt[-0].int32, NULL, FALSE); } break;
 case 527:
 #line 1444 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; } break;
-case 528:
-#line 1447 "asmparse.y"
 { yyval.binstr = NULL; } break;
+case 528:
+#line 1445 "asmparse.y"
+{ yyval.binstr = yypvt[-1].binstr; } break;
 case 529:
 #line 1448 "asmparse.y"
-{ yyval.binstr = yypvt[-0].binstr; } break;
+{ yyval.binstr = NULL; } break;
 case 530:
-#line 1451 "asmparse.y"
+#line 1449 "asmparse.y"
 { yyval.binstr = yypvt[-0].binstr; } break;
 case 531:
 #line 1452 "asmparse.y"
-{ yyval.binstr = yypvt[-2].binstr; yyval.binstr->append(yypvt[-0].binstr); delete yypvt[-0].binstr; } break;
+{ yyval.binstr = yypvt[-0].binstr; } break;
 case 532:
-#line 1456 "asmparse.y"
-{ yyval.binstr = new BinStr(); } break;
+#line 1453 "asmparse.y"
+{ yyval.binstr = yypvt[-2].binstr; yyval.binstr->append(yypvt[-0].binstr); delete yypvt[-0].binstr; } break;
 case 533:
 #line 1457 "asmparse.y"
-{ yyval.binstr = yypvt[-0].binstr;} break;
+{ yyval.binstr = new BinStr(); } break;
 case 534:
-#line 1460 "asmparse.y"
-{ yyval.binstr = yypvt[-0].binstr; } break;
+#line 1458 "asmparse.y"
+{ yyval.binstr = yypvt[-0].binstr;} break;
 case 535:
 #line 1461 "asmparse.y"
-{ yyval.binstr = yypvt[-2].binstr; yyval.binstr->append(yypvt[-0].binstr); delete yypvt[-0].binstr; } break;
+{ yyval.binstr = yypvt[-0].binstr; } break;
 case 536:
-#line 1464 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_SENTINEL); } break;
+#line 1462 "asmparse.y"
+{ yyval.binstr = yypvt[-2].binstr; yyval.binstr->append(yypvt[-0].binstr); delete yypvt[-0].binstr; } break;
 case 537:
 #line 1465 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->append(yypvt[-1].binstr); PASM->addArgName(NULL, yypvt[-1].binstr, yypvt[-0].binstr, yypvt[-2].int32); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_SENTINEL); } break;
 case 538:
 #line 1466 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->append(yypvt[-2].binstr); PASM->addArgName(yypvt[-0].string, yypvt[-2].binstr, yypvt[-1].binstr, yypvt[-3].int32);} break;
+{ yyval.binstr = new BinStr(); yyval.binstr->append(yypvt[-1].binstr); PASM->addArgName(NULL, yypvt[-1].binstr, yypvt[-0].binstr, yypvt[-2].int32); } break;
 case 539:
-#line 1470 "asmparse.y"
-{ yyval.token = PASM->ResolveClassRef(PASM->GetAsmRef(yypvt[-2].string), yypvt[-0].string, NULL); delete[] yypvt[-2].string;} break;
+#line 1467 "asmparse.y"
+{ yyval.binstr = new BinStr(); yyval.binstr->append(yypvt[-2].binstr); PASM->addArgName(yypvt[-0].string, yypvt[-2].binstr, yypvt[-1].binstr, yypvt[-3].int32);} break;
 case 540:
 #line 1471 "asmparse.y"
-{ yyval.token = PASM->ResolveClassRef(yypvt[-2].token, yypvt[-0].string, NULL); } break;
+{ yyval.token = PASM->ResolveClassRef(PASM->GetAsmRef(yypvt[-2].string), yypvt[-0].string, NULL); delete[] yypvt[-2].string;} break;
 case 541:
 #line 1472 "asmparse.y"
-{ yyval.token = PASM->ResolveClassRef(mdTokenNil, yypvt[-0].string, NULL); } break;
+{ yyval.token = PASM->ResolveClassRef(yypvt[-2].token, yypvt[-0].string, NULL); } break;
 case 542:
 #line 1473 "asmparse.y"
-{ yyval.token = PASM->ResolveClassRef(PASM->GetModRef(yypvt[-2].string),yypvt[-0].string, NULL); delete[] yypvt[-2].string;} break;
+{ yyval.token = PASM->ResolveClassRef(mdTokenNil, yypvt[-0].string, NULL); } break;
 case 543:
 #line 1474 "asmparse.y"
-{ yyval.token = PASM->ResolveClassRef(1,yypvt[-0].string,NULL); } break;
+{ yyval.token = PASM->ResolveClassRef(PASM->GetModRef(yypvt[-2].string),yypvt[-0].string, NULL); delete[] yypvt[-2].string;} break;
 case 544:
 #line 1475 "asmparse.y"
-{ yyval.token = yypvt[-0].token; } break;
+{ yyval.token = PASM->ResolveClassRef(1,yypvt[-0].string,NULL); } break;
 case 545:
 #line 1476 "asmparse.y"
-{ yyval.token = yypvt[-0].tdd->m_tkTypeSpec; } break;
+{ yyval.token = yypvt[-0].token; } break;
 case 546:
 #line 1477 "asmparse.y"
+{ yyval.token = yypvt[-0].tdd->m_tkTypeSpec; } break;
+case 547:
+#line 1478 "asmparse.y"
 { if(PASM->m_pCurClass != NULL) yyval.token = PASM->m_pCurClass->m_cl;
                                                                 else { yyval.token = 0; PASM->report->error(".this outside class scope\n"); } 
                                                               } break;
-case 547:
-#line 1480 "asmparse.y"
+case 548:
+#line 1481 "asmparse.y"
 { if(PASM->m_pCurClass != NULL) {
                                                                   yyval.token = PASM->m_pCurClass->m_crExtends;
                                                                   if(RidFromToken(yyval.token) == 0)
                                                                     PASM->report->error(".base undefined\n");
                                                                 } else { yyval.token = 0; PASM->report->error(".base outside class scope\n"); } 
                                                               } break;
-case 548:
-#line 1486 "asmparse.y"
+case 549:
+#line 1487 "asmparse.y"
 { if(PASM->m_pCurClass != NULL) {
                                                                   if(PASM->m_pCurClass->m_pEncloser != NULL) yyval.token = PASM->m_pCurClass->m_pEncloser->m_cl;
                                                                   else { yyval.token = 0; PASM->report->error(".nester undefined\n"); }
                                                                 } else { yyval.token = 0; PASM->report->error(".nester outside class scope\n"); } 
                                                               } break;
-case 549:
-#line 1493 "asmparse.y"
-{ yyval.string = yypvt[-0].string; } break;
 case 550:
 #line 1494 "asmparse.y"
-{ yyval.string = newStringWDel(yypvt[-2].string, NESTING_SEP, yypvt[-0].string); } break;
+{ yyval.string = yypvt[-0].string; } break;
 case 551:
-#line 1497 "asmparse.y"
-{ yyval.token = yypvt[-0].token;} break;
+#line 1495 "asmparse.y"
+{ yyval.string = newStringWDel(yypvt[-2].string, NESTING_SEP, yypvt[-0].string); } break;
 case 552:
 #line 1498 "asmparse.y"
-{ yyval.token = PASM->GetAsmRef(yypvt[-1].string); delete[] yypvt[-1].string;} break;
+{ yyval.token = yypvt[-0].token;} break;
 case 553:
 #line 1499 "asmparse.y"
-{ yyval.token = PASM->GetModRef(yypvt[-1].string); delete[] yypvt[-1].string;} break;
+{ yyval.token = PASM->GetAsmRef(yypvt[-1].string); delete[] yypvt[-1].string;} break;
 case 554:
 #line 1500 "asmparse.y"
-{ yyval.token = PASM->ResolveTypeSpec(yypvt[-0].binstr); } break;
+{ yyval.token = PASM->GetModRef(yypvt[-1].string); delete[] yypvt[-1].string;} break;
 case 555:
-#line 1504 "asmparse.y"
-{ yyval.binstr = new BinStr(); } break;
+#line 1501 "asmparse.y"
+{ yyval.token = PASM->ResolveTypeSpec(yypvt[-0].binstr); } break;
 case 556:
-#line 1506 "asmparse.y"
+#line 1505 "asmparse.y"
+{ yyval.binstr = new BinStr(); } break;
+case 557:
+#line 1507 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_CUSTOMMARSHALER);
                                                                 corEmitInt(yyval.binstr,yypvt[-7].binstr->length()); yyval.binstr->append(yypvt[-7].binstr);
                                                                 corEmitInt(yyval.binstr,yypvt[-5].binstr->length()); yyval.binstr->append(yypvt[-5].binstr);
                                                                 corEmitInt(yyval.binstr,yypvt[-3].binstr->length()); yyval.binstr->append(yypvt[-3].binstr);
                                                                 corEmitInt(yyval.binstr,yypvt[-1].binstr->length()); yyval.binstr->append(yypvt[-1].binstr); 
                                                                 PASM->report->warn("Deprecated 4-string form of custom marshaler, first two strings ignored\n");} break;
-case 557:
-#line 1513 "asmparse.y"
+case 558:
+#line 1514 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_CUSTOMMARSHALER);
                                                                 corEmitInt(yyval.binstr,0);
                                                                 corEmitInt(yyval.binstr,0);
                                                                 corEmitInt(yyval.binstr,yypvt[-3].binstr->length()); yyval.binstr->append(yypvt[-3].binstr);
                                                                 corEmitInt(yyval.binstr,yypvt[-1].binstr->length()); yyval.binstr->append(yypvt[-1].binstr); } break;
-case 558:
-#line 1518 "asmparse.y"
+case 559:
+#line 1519 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_FIXEDSYSSTRING);
                                                                 corEmitInt(yyval.binstr,yypvt[-1].int32); } break;
-case 559:
-#line 1521 "asmparse.y"
+case 560:
+#line 1522 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_FIXEDARRAY);
                                                                 corEmitInt(yyval.binstr,yypvt[-2].int32); yyval.binstr->append(yypvt[-0].binstr); } break;
-case 560:
-#line 1523 "asmparse.y"
+case 561:
+#line 1524 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_VARIANT); 
                                                                 PASM->report->warn("Deprecated native type 'variant'\n"); } break;
-case 561:
-#line 1525 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_CURRENCY); } break;
 case 562:
 #line 1526 "asmparse.y"
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_CURRENCY); } break;
+case 563:
+#line 1527 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_SYSCHAR); 
                                                                 PASM->report->warn("Deprecated native type 'syschar'\n"); } break;
-case 563:
-#line 1528 "asmparse.y"
+case 564:
+#line 1529 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_VOID); 
                                                                 PASM->report->warn("Deprecated native type 'void'\n"); } break;
-case 564:
-#line 1530 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_BOOLEAN); } break;
 case 565:
 #line 1531 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_I1); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_BOOLEAN); } break;
 case 566:
 #line 1532 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_I2); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_I1); } break;
 case 567:
 #line 1533 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_I4); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_I2); } break;
 case 568:
 #line 1534 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_I8); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_I4); } break;
 case 569:
 #line 1535 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_R4); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_I8); } break;
 case 570:
 #line 1536 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_R8); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_R4); } break;
 case 571:
 #line 1537 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_ERROR); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_R8); } break;
 case 572:
 #line 1538 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U1); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_ERROR); } break;
 case 573:
 #line 1539 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U2); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U1); } break;
 case 574:
 #line 1540 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U4); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U2); } break;
 case 575:
 #line 1541 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U8); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U4); } break;
 case 576:
 #line 1542 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U1); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U8); } break;
 case 577:
 #line 1543 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U2); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U1); } break;
 case 578:
 #line 1544 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U4); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U2); } break;
 case 579:
 #line 1545 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U8); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U4); } break;
 case 580:
 #line 1546 "asmparse.y"
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U8); } break;
+case 581:
+#line 1547 "asmparse.y"
 { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt8(NATIVE_TYPE_PTR); 
                                                                 PASM->report->warn("Deprecated native type '*'\n"); } break;
-case 581:
-#line 1548 "asmparse.y"
+case 582:
+#line 1549 "asmparse.y"
 { yyval.binstr = yypvt[-2].binstr; if(yyval.binstr->length()==0) yyval.binstr->appendInt8(NATIVE_TYPE_MAX);
                                                                 yyval.binstr->insertInt8(NATIVE_TYPE_ARRAY); } break;
-case 582:
-#line 1550 "asmparse.y"
+case 583:
+#line 1551 "asmparse.y"
 { yyval.binstr = yypvt[-3].binstr; if(yyval.binstr->length()==0) yyval.binstr->appendInt8(NATIVE_TYPE_MAX); 
                                                                 yyval.binstr->insertInt8(NATIVE_TYPE_ARRAY);
                                                                 corEmitInt(yyval.binstr,0);
                                                                 corEmitInt(yyval.binstr,yypvt[-1].int32); 
                                                                 corEmitInt(yyval.binstr,0); } break;
-case 583:
-#line 1555 "asmparse.y"
+case 584:
+#line 1556 "asmparse.y"
 { yyval.binstr = yypvt[-5].binstr; if(yyval.binstr->length()==0) yyval.binstr->appendInt8(NATIVE_TYPE_MAX); 
                                                                 yyval.binstr->insertInt8(NATIVE_TYPE_ARRAY);
                                                                 corEmitInt(yyval.binstr,yypvt[-1].int32);
                                                                 corEmitInt(yyval.binstr,yypvt[-3].int32);
                                                                 corEmitInt(yyval.binstr,ntaSizeParamIndexSpecified); } break;
-case 584:
-#line 1560 "asmparse.y"
+case 585:
+#line 1561 "asmparse.y"
 { yyval.binstr = yypvt[-4].binstr; if(yyval.binstr->length()==0) yyval.binstr->appendInt8(NATIVE_TYPE_MAX); 
                                                                 yyval.binstr->insertInt8(NATIVE_TYPE_ARRAY);
                                                                 corEmitInt(yyval.binstr,yypvt[-1].int32); } break;
-case 585:
-#line 1563 "asmparse.y"
+case 586:
+#line 1564 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_DECIMAL); 
                                                                 PASM->report->warn("Deprecated native type 'decimal'\n"); } break;
-case 586:
-#line 1565 "asmparse.y"
+case 587:
+#line 1566 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_DATE); 
                                                                 PASM->report->warn("Deprecated native type 'date'\n"); } break;
-case 587:
-#line 1567 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_BSTR); } break;
 case 588:
 #line 1568 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_LPSTR); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_BSTR); } break;
 case 589:
 #line 1569 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_LPWSTR); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_LPSTR); } break;
 case 590:
 #line 1570 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_LPTSTR); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_LPWSTR); } break;
 case 591:
 #line 1571 "asmparse.y"
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_LPTSTR); } break;
+case 592:
+#line 1572 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_OBJECTREF); 
                                                                 PASM->report->warn("Deprecated native type 'objectref'\n"); } break;
-case 592:
-#line 1573 "asmparse.y"
+case 593:
+#line 1574 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_IUNKNOWN);
                                                                 if(yypvt[-0].int32 != -1) corEmitInt(yyval.binstr,yypvt[-0].int32); } break;
-case 593:
-#line 1575 "asmparse.y"
+case 594:
+#line 1576 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_IDISPATCH); 
                                                                 if(yypvt[-0].int32 != -1) corEmitInt(yyval.binstr,yypvt[-0].int32); } break;
-case 594:
-#line 1577 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_STRUCT); } break;
 case 595:
 #line 1578 "asmparse.y"
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_STRUCT); } break;
+case 596:
+#line 1579 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_INTF);
                                                                 if(yypvt[-0].int32 != -1) corEmitInt(yyval.binstr,yypvt[-0].int32); } break;
-case 596:
-#line 1580 "asmparse.y"
+case 597:
+#line 1581 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_SAFEARRAY); 
                                                                 corEmitInt(yyval.binstr,yypvt[-0].int32); 
                                                                 corEmitInt(yyval.binstr,0);} break;
-case 597:
-#line 1583 "asmparse.y"
+case 598:
+#line 1584 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_SAFEARRAY); 
                                                                 corEmitInt(yyval.binstr,yypvt[-2].int32); 
                                                                 corEmitInt(yyval.binstr,yypvt[-0].binstr->length()); yyval.binstr->append(yypvt[-0].binstr); } break;
-case 598:
-#line 1587 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_INT); } break;
 case 599:
 #line 1588 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_UINT); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_INT); } break;
 case 600:
 #line 1589 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_UINT); } break;
 case 601:
 #line 1590 "asmparse.y"
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_UINT); } break;
+case 602:
+#line 1591 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_NESTEDSTRUCT); 
                                                                 PASM->report->warn("Deprecated native type 'nested struct'\n"); } break;
-case 602:
-#line 1592 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_BYVALSTR); } break;
 case 603:
 #line 1593 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_ANSIBSTR); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_BYVALSTR); } break;
 case 604:
 #line 1594 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_TBSTR); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_ANSIBSTR); } break;
 case 605:
 #line 1595 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_VARIANTBOOL); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_TBSTR); } break;
 case 606:
 #line 1596 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_FUNC); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_VARIANTBOOL); } break;
 case 607:
 #line 1597 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_ASANY); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_FUNC); } break;
 case 608:
 #line 1598 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_LPSTRUCT); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_ASANY); } break;
 case 609:
 #line 1599 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->append(yypvt[-0].tdd->m_pbsTypeSpec); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_LPSTRUCT); } break;
 case 610:
-#line 1602 "asmparse.y"
-{ yyval.int32 = -1; } break;
+#line 1600 "asmparse.y"
+{ yyval.binstr = new BinStr(); yyval.binstr->append(yypvt[-0].tdd->m_pbsTypeSpec); } break;
 case 611:
 #line 1603 "asmparse.y"
-{ yyval.int32 = yypvt[-1].int32; } break;
+{ yyval.int32 = -1; } break;
 case 612:
-#line 1606 "asmparse.y"
-{ yyval.int32 = VT_EMPTY; } break;
+#line 1604 "asmparse.y"
+{ yyval.int32 = yypvt[-1].int32; } break;
 case 613:
 #line 1607 "asmparse.y"
-{ yyval.int32 = VT_NULL; } break;
+{ yyval.int32 = VT_EMPTY; } break;
 case 614:
 #line 1608 "asmparse.y"
-{ yyval.int32 = VT_VARIANT; } break;
+{ yyval.int32 = VT_NULL; } break;
 case 615:
 #line 1609 "asmparse.y"
-{ yyval.int32 = VT_CY; } break;
+{ yyval.int32 = VT_VARIANT; } break;
 case 616:
 #line 1610 "asmparse.y"
-{ yyval.int32 = VT_VOID; } break;
+{ yyval.int32 = VT_CY; } break;
 case 617:
 #line 1611 "asmparse.y"
-{ yyval.int32 = VT_BOOL; } break;
+{ yyval.int32 = VT_VOID; } break;
 case 618:
 #line 1612 "asmparse.y"
-{ yyval.int32 = VT_I1; } break;
+{ yyval.int32 = VT_BOOL; } break;
 case 619:
 #line 1613 "asmparse.y"
-{ yyval.int32 = VT_I2; } break;
+{ yyval.int32 = VT_I1; } break;
 case 620:
 #line 1614 "asmparse.y"
-{ yyval.int32 = VT_I4; } break;
+{ yyval.int32 = VT_I2; } break;
 case 621:
 #line 1615 "asmparse.y"
-{ yyval.int32 = VT_I8; } break;
+{ yyval.int32 = VT_I4; } break;
 case 622:
 #line 1616 "asmparse.y"
-{ yyval.int32 = VT_R4; } break;
+{ yyval.int32 = VT_I8; } break;
 case 623:
 #line 1617 "asmparse.y"
-{ yyval.int32 = VT_R8; } break;
+{ yyval.int32 = VT_R4; } break;
 case 624:
 #line 1618 "asmparse.y"
-{ yyval.int32 = VT_UI1; } break;
+{ yyval.int32 = VT_R8; } break;
 case 625:
 #line 1619 "asmparse.y"
-{ yyval.int32 = VT_UI2; } break;
+{ yyval.int32 = VT_UI1; } break;
 case 626:
 #line 1620 "asmparse.y"
-{ yyval.int32 = VT_UI4; } break;
+{ yyval.int32 = VT_UI2; } break;
 case 627:
 #line 1621 "asmparse.y"
-{ yyval.int32 = VT_UI8; } break;
+{ yyval.int32 = VT_UI4; } break;
 case 628:
 #line 1622 "asmparse.y"
-{ yyval.int32 = VT_UI1; } break;
+{ yyval.int32 = VT_UI8; } break;
 case 629:
 #line 1623 "asmparse.y"
-{ yyval.int32 = VT_UI2; } break;
+{ yyval.int32 = VT_UI1; } break;
 case 630:
 #line 1624 "asmparse.y"
-{ yyval.int32 = VT_UI4; } break;
+{ yyval.int32 = VT_UI2; } break;
 case 631:
 #line 1625 "asmparse.y"
-{ yyval.int32 = VT_UI8; } break;
+{ yyval.int32 = VT_UI4; } break;
 case 632:
 #line 1626 "asmparse.y"
-{ yyval.int32 = VT_PTR; } break;
+{ yyval.int32 = VT_UI8; } break;
 case 633:
 #line 1627 "asmparse.y"
-{ yyval.int32 = yypvt[-2].int32 | VT_ARRAY; } break;
+{ yyval.int32 = VT_PTR; } break;
 case 634:
 #line 1628 "asmparse.y"
-{ yyval.int32 = yypvt[-1].int32 | VT_VECTOR; } break;
+{ yyval.int32 = yypvt[-2].int32 | VT_ARRAY; } break;
 case 635:
 #line 1629 "asmparse.y"
-{ yyval.int32 = yypvt[-1].int32 | VT_BYREF; } break;
+{ yyval.int32 = yypvt[-1].int32 | VT_VECTOR; } break;
 case 636:
 #line 1630 "asmparse.y"
-{ yyval.int32 = VT_DECIMAL; } break;
+{ yyval.int32 = yypvt[-1].int32 | VT_BYREF; } break;
 case 637:
 #line 1631 "asmparse.y"
-{ yyval.int32 = VT_DATE; } break;
+{ yyval.int32 = VT_DECIMAL; } break;
 case 638:
 #line 1632 "asmparse.y"
-{ yyval.int32 = VT_BSTR; } break;
+{ yyval.int32 = VT_DATE; } break;
 case 639:
 #line 1633 "asmparse.y"
-{ yyval.int32 = VT_LPSTR; } break;
+{ yyval.int32 = VT_BSTR; } break;
 case 640:
 #line 1634 "asmparse.y"
-{ yyval.int32 = VT_LPWSTR; } break;
+{ yyval.int32 = VT_LPSTR; } break;
 case 641:
 #line 1635 "asmparse.y"
-{ yyval.int32 = VT_UNKNOWN; } break;
+{ yyval.int32 = VT_LPWSTR; } break;
 case 642:
 #line 1636 "asmparse.y"
-{ yyval.int32 = VT_DISPATCH; } break;
+{ yyval.int32 = VT_UNKNOWN; } break;
 case 643:
 #line 1637 "asmparse.y"
-{ yyval.int32 = VT_SAFEARRAY; } break;
+{ yyval.int32 = VT_DISPATCH; } break;
 case 644:
 #line 1638 "asmparse.y"
-{ yyval.int32 = VT_INT; } break;
+{ yyval.int32 = VT_SAFEARRAY; } break;
 case 645:
 #line 1639 "asmparse.y"
-{ yyval.int32 = VT_UINT; } break;
+{ yyval.int32 = VT_INT; } break;
 case 646:
 #line 1640 "asmparse.y"
 { yyval.int32 = VT_UINT; } break;
 case 647:
 #line 1641 "asmparse.y"
-{ yyval.int32 = VT_ERROR; } break;
+{ yyval.int32 = VT_UINT; } break;
 case 648:
 #line 1642 "asmparse.y"
-{ yyval.int32 = VT_HRESULT; } break;
+{ yyval.int32 = VT_ERROR; } break;
 case 649:
 #line 1643 "asmparse.y"
-{ yyval.int32 = VT_CARRAY; } break;
+{ yyval.int32 = VT_HRESULT; } break;
 case 650:
 #line 1644 "asmparse.y"
-{ yyval.int32 = VT_USERDEFINED; } break;
+{ yyval.int32 = VT_CARRAY; } break;
 case 651:
 #line 1645 "asmparse.y"
-{ yyval.int32 = VT_RECORD; } break;
+{ yyval.int32 = VT_USERDEFINED; } break;
 case 652:
 #line 1646 "asmparse.y"
-{ yyval.int32 = VT_FILETIME; } break;
+{ yyval.int32 = VT_RECORD; } break;
 case 653:
 #line 1647 "asmparse.y"
-{ yyval.int32 = VT_BLOB; } break;
+{ yyval.int32 = VT_FILETIME; } break;
 case 654:
 #line 1648 "asmparse.y"
-{ yyval.int32 = VT_STREAM; } break;
+{ yyval.int32 = VT_BLOB; } break;
 case 655:
 #line 1649 "asmparse.y"
-{ yyval.int32 = VT_STORAGE; } break;
+{ yyval.int32 = VT_STREAM; } break;
 case 656:
 #line 1650 "asmparse.y"
-{ yyval.int32 = VT_STREAMED_OBJECT; } break;
+{ yyval.int32 = VT_STORAGE; } break;
 case 657:
 #line 1651 "asmparse.y"
-{ yyval.int32 = VT_STORED_OBJECT; } break;
+{ yyval.int32 = VT_STREAMED_OBJECT; } break;
 case 658:
 #line 1652 "asmparse.y"
-{ yyval.int32 = VT_BLOB_OBJECT; } break;
+{ yyval.int32 = VT_STORED_OBJECT; } break;
 case 659:
 #line 1653 "asmparse.y"
-{ yyval.int32 = VT_CF; } break;
+{ yyval.int32 = VT_BLOB_OBJECT; } break;
 case 660:
 #line 1654 "asmparse.y"
-{ yyval.int32 = VT_CLSID; } break;
+{ yyval.int32 = VT_CF; } break;
 case 661:
-#line 1658 "asmparse.y"
+#line 1655 "asmparse.y"
+{ yyval.int32 = VT_CLSID; } break;
+case 662:
+#line 1659 "asmparse.y"
 { if(yypvt[-0].token == PASM->m_tkSysString)
                                                                 {     yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_STRING); }
                                                                 else if(yypvt[-0].token == PASM->m_tkSysObject)
                                                                 {     yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_OBJECT); }
                                                                 else  
                                                                  yyval.binstr = parser->MakeTypeClass(ELEMENT_TYPE_CLASS, yypvt[-0].token); } break;
-case 662:
-#line 1664 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_OBJECT); } break;
 case 663:
 #line 1665 "asmparse.y"
-{ yyval.binstr = parser->MakeTypeClass(ELEMENT_TYPE_VALUETYPE, yypvt[-0].token); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_OBJECT); } break;
 case 664:
 #line 1666 "asmparse.y"
 { yyval.binstr = parser->MakeTypeClass(ELEMENT_TYPE_VALUETYPE, yypvt[-0].token); } break;
 case 665:
 #line 1667 "asmparse.y"
-{ yyval.binstr = yypvt[-2].binstr; yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
+{ yyval.binstr = parser->MakeTypeClass(ELEMENT_TYPE_VALUETYPE, yypvt[-0].token); } break;
 case 666:
 #line 1668 "asmparse.y"
-{ yyval.binstr = parser->MakeTypeArray(ELEMENT_TYPE_ARRAY, yypvt[-3].binstr, yypvt[-1].binstr); } break;
+{ yyval.binstr = yypvt[-2].binstr; yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
 case 667:
 #line 1669 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt8(ELEMENT_TYPE_BYREF); } break;
+{ yyval.binstr = parser->MakeTypeArray(ELEMENT_TYPE_ARRAY, yypvt[-3].binstr, yypvt[-1].binstr); } break;
 case 668:
 #line 1670 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt8(ELEMENT_TYPE_PTR); } break;
+{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt8(ELEMENT_TYPE_BYREF); } break;
 case 669:
 #line 1671 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt8(ELEMENT_TYPE_PINNED); } break;
+{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt8(ELEMENT_TYPE_PTR); } break;
 case 670:
 #line 1672 "asmparse.y"
+{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt8(ELEMENT_TYPE_PINNED); } break;
+case 671:
+#line 1673 "asmparse.y"
 { yyval.binstr = parser->MakeTypeClass(ELEMENT_TYPE_CMOD_REQD, yypvt[-1].token);
                                                                 yyval.binstr->append(yypvt[-4].binstr); } break;
-case 671:
-#line 1674 "asmparse.y"
+case 672:
+#line 1675 "asmparse.y"
 { yyval.binstr = parser->MakeTypeClass(ELEMENT_TYPE_CMOD_OPT, yypvt[-1].token);
                                                                 yyval.binstr->append(yypvt[-4].binstr); } break;
-case 672:
-#line 1677 "asmparse.y"
+case 673:
+#line 1678 "asmparse.y"
 { yyval.binstr = parser->MakeSig(yypvt[-5].int32, yypvt[-4].binstr, yypvt[-1].binstr);
                                                                 yyval.binstr->insertInt8(ELEMENT_TYPE_FNPTR); 
                                                                 PASM->delArgNameList(PASM->m_firstArgName);
                                                                 PASM->m_firstArgName = parser->m_ANSFirst.POP();
                                                                 PASM->m_lastArgName = parser->m_ANSLast.POP();
                                                               } break;
-case 673:
-#line 1683 "asmparse.y"
+case 674:
+#line 1684 "asmparse.y"
 { if(yypvt[-1].binstr == NULL) yyval.binstr = yypvt[-3].binstr;
                                                                 else {
                                                                   yyval.binstr = new BinStr(); 
@@ -4353,24 +4360,24 @@ case 673:
                                                                   yyval.binstr->append(yypvt[-3].binstr);
                                                                   corEmitInt(yyval.binstr, corCountArgs(yypvt[-1].binstr));
                                                                   yyval.binstr->append(yypvt[-1].binstr); delete yypvt[-3].binstr; delete yypvt[-1].binstr; }} break;
-case 674:
-#line 1690 "asmparse.y"
+case 675:
+#line 1691 "asmparse.y"
 { //if(PASM->m_pCurMethod)  {
                                                                 //  if(($3 < 0)||((DWORD)$3 >= PASM->m_pCurMethod->m_NumTyPars))
                                                                 //    PASM->report->error("Invalid method type parameter '%d'\n",$3);
                                                                   yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_MVAR); corEmitInt(yyval.binstr, yypvt[-0].int32); 
                                                                 //} else PASM->report->error("Method type parameter '%d' outside method scope\n",$3);
                                                               } break;
-case 675:
-#line 1696 "asmparse.y"
+case 676:
+#line 1697 "asmparse.y"
 { //if(PASM->m_pCurClass)  {
                                                                 //  if(($2 < 0)||((DWORD)$2 >= PASM->m_pCurClass->m_NumTyPars))
                                                                 //    PASM->report->error("Invalid type parameter '%d'\n",$2);
                                                                   yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_VAR); corEmitInt(yyval.binstr, yypvt[-0].int32); 
                                                                 //} else PASM->report->error("Type parameter '%d' outside class scope\n",$2);
                                                               } break;
-case 676:
-#line 1702 "asmparse.y"
+case 677:
+#line 1703 "asmparse.y"
 { int eltype = ELEMENT_TYPE_MVAR;
                                                                 int n=-1;
                                                                 if(PASM->m_pCurMethod) n = PASM->m_pCurMethod->FindTyPar(yypvt[-0].string);
@@ -4386,8 +4393,8 @@ case 676:
                                                                 n = 0x1FFFFFFF; }
                                                                 yyval.binstr = new BinStr(); yyval.binstr->appendInt8(eltype); corEmitInt(yyval.binstr,n); 
                                                               } break;
-case 677:
-#line 1717 "asmparse.y"
+case 678:
+#line 1718 "asmparse.y"
 { int eltype = ELEMENT_TYPE_VAR;
                                                                 int n=-1;
                                                                 if(PASM->m_pCurClass && !newclass) n = PASM->m_pCurClass->FindTyPar(yypvt[-0].string);
@@ -4403,491 +4410,491 @@ case 677:
                                                                 n = 0x1FFFFFFF; }
                                                                 yyval.binstr = new BinStr(); yyval.binstr->appendInt8(eltype); corEmitInt(yyval.binstr,n); 
                                                               } break;
-case 678:
-#line 1732 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_TYPEDBYREF); } break;
 case 679:
 #line 1733 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_VOID); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_TYPEDBYREF); } break;
 case 680:
 #line 1734 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_VOID); } break;
 case 681:
 #line 1735 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I); } break;
 case 682:
 #line 1736 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U); } break;
 case 683:
 #line 1737 "asmparse.y"
-{ yyval.binstr = yypvt[-0].binstr; } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U); } break;
 case 684:
 #line 1738 "asmparse.y"
-{ yyval.binstr = yypvt[-0].binstr; yyval.binstr->insertInt8(ELEMENT_TYPE_SENTINEL); } break;
+{ yyval.binstr = yypvt[-0].binstr; } break;
 case 685:
-#line 1741 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_CHAR); } break;
+#line 1739 "asmparse.y"
+{ yyval.binstr = yypvt[-0].binstr; yyval.binstr->insertInt8(ELEMENT_TYPE_SENTINEL); } break;
 case 686:
 #line 1742 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_STRING); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_CHAR); } break;
 case 687:
 #line 1743 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_BOOLEAN); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_STRING); } break;
 case 688:
 #line 1744 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I1); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_BOOLEAN); } break;
 case 689:
 #line 1745 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I2); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I1); } break;
 case 690:
 #line 1746 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I4); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I2); } break;
 case 691:
 #line 1747 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I8); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I4); } break;
 case 692:
 #line 1748 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_R4); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I8); } break;
 case 693:
 #line 1749 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_R8); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_R4); } break;
 case 694:
 #line 1750 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U1); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_R8); } break;
 case 695:
 #line 1751 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U2); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U1); } break;
 case 696:
 #line 1752 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U4); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U2); } break;
 case 697:
 #line 1753 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U8); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U4); } break;
 case 698:
 #line 1754 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U1); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U8); } break;
 case 699:
 #line 1755 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U2); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U1); } break;
 case 700:
 #line 1756 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U4); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U2); } break;
 case 701:
 #line 1757 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U8); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U4); } break;
 case 702:
 #line 1758 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->append(yypvt[-0].tdd->m_pbsTypeSpec); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U8); } break;
 case 703:
-#line 1761 "asmparse.y"
-{ yyval.binstr = yypvt[-0].binstr; } break;
+#line 1759 "asmparse.y"
+{ yyval.binstr = new BinStr(); yyval.binstr->append(yypvt[-0].tdd->m_pbsTypeSpec); } break;
 case 704:
 #line 1762 "asmparse.y"
-{ yyval.binstr = yypvt[-2].binstr; yypvt[-2].binstr->append(yypvt[-0].binstr); delete yypvt[-0].binstr; } break;
+{ yyval.binstr = yypvt[-0].binstr; } break;
 case 705:
-#line 1765 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt32(0x7FFFFFFF); yyval.binstr->appendInt32(0x7FFFFFFF);  } break;
+#line 1763 "asmparse.y"
+{ yyval.binstr = yypvt[-2].binstr; yypvt[-2].binstr->append(yypvt[-0].binstr); delete yypvt[-0].binstr; } break;
 case 706:
 #line 1766 "asmparse.y"
 { yyval.binstr = new BinStr(); yyval.binstr->appendInt32(0x7FFFFFFF); yyval.binstr->appendInt32(0x7FFFFFFF);  } break;
 case 707:
 #line 1767 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt32(0); yyval.binstr->appendInt32(yypvt[-0].int32); } break;
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt32(0x7FFFFFFF); yyval.binstr->appendInt32(0x7FFFFFFF);  } break;
 case 708:
 #line 1768 "asmparse.y"
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt32(0); yyval.binstr->appendInt32(yypvt[-0].int32); } break;
+case 709:
+#line 1769 "asmparse.y"
 { FAIL_UNLESS(yypvt[-2].int32 <= yypvt[-0].int32, ("lower bound %d must be <= upper bound %d\n", yypvt[-2].int32, yypvt[-0].int32));
                                                                 if (yypvt[-2].int32 > yypvt[-0].int32) { YYERROR; };        
                                                                 yyval.binstr = new BinStr(); yyval.binstr->appendInt32(yypvt[-2].int32); yyval.binstr->appendInt32(yypvt[-0].int32-yypvt[-2].int32+1); } break;
-case 709:
-#line 1771 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt32(yypvt[-1].int32); yyval.binstr->appendInt32(0x7FFFFFFF); } break;
 case 710:
-#line 1776 "asmparse.y"
-{ PASM->AddPermissionDecl(yypvt[-4].secAct, yypvt[-3].token, yypvt[-1].pair); } break;
+#line 1772 "asmparse.y"
+{ yyval.binstr = new BinStr(); yyval.binstr->appendInt32(yypvt[-1].int32); yyval.binstr->appendInt32(0x7FFFFFFF); } break;
 case 711:
-#line 1778 "asmparse.y"
-{ PASM->AddPermissionDecl(yypvt[-5].secAct, yypvt[-4].token, yypvt[-1].binstr); } break;
+#line 1777 "asmparse.y"
+{ PASM->AddPermissionDecl(yypvt[-4].secAct, yypvt[-3].token, yypvt[-1].pair); } break;
 case 712:
 #line 1779 "asmparse.y"
-{ PASM->AddPermissionDecl(yypvt[-1].secAct, yypvt[-0].token, (NVPair *)NULL); } break;
+{ PASM->AddPermissionDecl(yypvt[-5].secAct, yypvt[-4].token, yypvt[-1].binstr); } break;
 case 713:
 #line 1780 "asmparse.y"
-{ PASM->AddPermissionSetDecl(yypvt[-2].secAct, yypvt[-1].binstr); } break;
+{ PASM->AddPermissionDecl(yypvt[-1].secAct, yypvt[-0].token, (NVPair *)NULL); } break;
 case 714:
-#line 1782 "asmparse.y"
-{ PASM->AddPermissionSetDecl(yypvt[-1].secAct,BinStrToUnicode(yypvt[-0].binstr,true));} break;
+#line 1781 "asmparse.y"
+{ PASM->AddPermissionSetDecl(yypvt[-2].secAct, yypvt[-1].binstr); } break;
 case 715:
-#line 1784 "asmparse.y"
+#line 1783 "asmparse.y"
+{ PASM->AddPermissionSetDecl(yypvt[-1].secAct,BinStrToUnicode(yypvt[-0].binstr,true));} break;
+case 716:
+#line 1785 "asmparse.y"
 { BinStr* ret = new BinStr();
                                                                 ret->insertInt8('.');
                                                                 corEmitInt(ret, nSecAttrBlobs);
                                                                 ret->append(yypvt[-1].binstr);
                                                                 PASM->AddPermissionSetDecl(yypvt[-4].secAct,ret);
                                                                 nSecAttrBlobs = 0; } break;
-case 716:
-#line 1792 "asmparse.y"
-{ yyval.binstr = new BinStr(); nSecAttrBlobs = 0;} break;
 case 717:
 #line 1793 "asmparse.y"
-{ yyval.binstr = yypvt[-0].binstr; nSecAttrBlobs = 1; } break;
+{ yyval.binstr = new BinStr(); nSecAttrBlobs = 0;} break;
 case 718:
 #line 1794 "asmparse.y"
-{ yyval.binstr = yypvt[-2].binstr; yyval.binstr->append(yypvt[-0].binstr); nSecAttrBlobs++; } break;
+{ yyval.binstr = yypvt[-0].binstr; nSecAttrBlobs = 1; } break;
 case 719:
-#line 1798 "asmparse.y"
+#line 1795 "asmparse.y"
+{ yyval.binstr = yypvt[-2].binstr; yyval.binstr->append(yypvt[-0].binstr); nSecAttrBlobs++; } break;
+case 720:
+#line 1799 "asmparse.y"
 { yyval.binstr = PASM->EncodeSecAttr(PASM->ReflectionNotation(yypvt[-4].token),yypvt[-1].binstr,nCustomBlobNVPairs); 
                                                                 nCustomBlobNVPairs = 0; } break;
-case 720:
-#line 1801 "asmparse.y"
+case 721:
+#line 1802 "asmparse.y"
 { yyval.binstr = PASM->EncodeSecAttr(yypvt[-4].string,yypvt[-1].binstr,nCustomBlobNVPairs); 
                                                                 nCustomBlobNVPairs = 0; } break;
-case 721:
-#line 1805 "asmparse.y"
-{ yyval.secAct = yypvt[-2].secAct; bParsingByteArray = TRUE; } break;
 case 722:
-#line 1807 "asmparse.y"
+#line 1806 "asmparse.y"
 { yyval.secAct = yypvt[-2].secAct; bParsingByteArray = TRUE; } break;
 case 723:
-#line 1810 "asmparse.y"
-{ yyval.pair = yypvt[-0].pair; } break;
+#line 1808 "asmparse.y"
+{ yyval.secAct = yypvt[-2].secAct; bParsingByteArray = TRUE; } break;
 case 724:
 #line 1811 "asmparse.y"
-{ yyval.pair = yypvt[-2].pair->Concat(yypvt[-0].pair); } break;
+{ yyval.pair = yypvt[-0].pair; } break;
 case 725:
-#line 1814 "asmparse.y"
-{ yypvt[-2].binstr->appendInt8(0); yyval.pair = new NVPair(yypvt[-2].binstr, yypvt[-0].binstr); } break;
+#line 1812 "asmparse.y"
+{ yyval.pair = yypvt[-2].pair->Concat(yypvt[-0].pair); } break;
 case 726:
-#line 1817 "asmparse.y"
-{ yyval.int32 = 1; } break;
+#line 1815 "asmparse.y"
+{ yypvt[-2].binstr->appendInt8(0); yyval.pair = new NVPair(yypvt[-2].binstr, yypvt[-0].binstr); } break;
 case 727:
 #line 1818 "asmparse.y"
-{ yyval.int32 = 0; } break;
+{ yyval.int32 = 1; } break;
 case 728:
-#line 1821 "asmparse.y"
+#line 1819 "asmparse.y"
+{ yyval.int32 = 0; } break;
+case 729:
+#line 1822 "asmparse.y"
 { yyval.binstr = new BinStr();
                                                                 yyval.binstr->appendInt8(SERIALIZATION_TYPE_BOOLEAN);
                                                                 yyval.binstr->appendInt8(yypvt[-0].int32); } break;
-case 729:
-#line 1824 "asmparse.y"
+case 730:
+#line 1825 "asmparse.y"
 { yyval.binstr = new BinStr();
                                                                 yyval.binstr->appendInt8(SERIALIZATION_TYPE_I4);
                                                                 yyval.binstr->appendInt32(yypvt[-0].int32); } break;
-case 730:
-#line 1827 "asmparse.y"
+case 731:
+#line 1828 "asmparse.y"
 { yyval.binstr = new BinStr();
                                                                 yyval.binstr->appendInt8(SERIALIZATION_TYPE_I4);
                                                                 yyval.binstr->appendInt32(yypvt[-1].int32); } break;
-case 731:
-#line 1830 "asmparse.y"
+case 732:
+#line 1831 "asmparse.y"
 { yyval.binstr = new BinStr();
                                                                 yyval.binstr->appendInt8(SERIALIZATION_TYPE_STRING);
                                                                 yyval.binstr->append(yypvt[-0].binstr); delete yypvt[-0].binstr;
                                                                 yyval.binstr->appendInt8(0); } break;
-case 732:
-#line 1834 "asmparse.y"
+case 733:
+#line 1835 "asmparse.y"
 { yyval.binstr = new BinStr();
                                                                 yyval.binstr->appendInt8(SERIALIZATION_TYPE_ENUM);
                                                                 char* sz = PASM->ReflectionNotation(yypvt[-5].token);
                                                                 strcpy_s((char *)yyval.binstr->getBuff((unsigned)strlen(sz) + 1), strlen(sz) + 1,sz);
                                                                 yyval.binstr->appendInt8(1);
                                                                 yyval.binstr->appendInt32(yypvt[-1].int32); } break;
-case 733:
-#line 1840 "asmparse.y"
+case 734:
+#line 1841 "asmparse.y"
 { yyval.binstr = new BinStr();
                                                                 yyval.binstr->appendInt8(SERIALIZATION_TYPE_ENUM);
                                                                 char* sz = PASM->ReflectionNotation(yypvt[-5].token);
                                                                 strcpy_s((char *)yyval.binstr->getBuff((unsigned)strlen(sz) + 1), strlen(sz) + 1,sz);
                                                                 yyval.binstr->appendInt8(2);
                                                                 yyval.binstr->appendInt32(yypvt[-1].int32); } break;
-case 734:
-#line 1846 "asmparse.y"
+case 735:
+#line 1847 "asmparse.y"
 { yyval.binstr = new BinStr();
                                                                 yyval.binstr->appendInt8(SERIALIZATION_TYPE_ENUM);
                                                                 char* sz = PASM->ReflectionNotation(yypvt[-5].token);
                                                                 strcpy_s((char *)yyval.binstr->getBuff((unsigned)strlen(sz) + 1), strlen(sz) + 1,sz);
                                                                 yyval.binstr->appendInt8(4);
                                                                 yyval.binstr->appendInt32(yypvt[-1].int32); } break;
-case 735:
-#line 1852 "asmparse.y"
+case 736:
+#line 1853 "asmparse.y"
 { yyval.binstr = new BinStr();
                                                                 yyval.binstr->appendInt8(SERIALIZATION_TYPE_ENUM);
                                                                 char* sz = PASM->ReflectionNotation(yypvt[-3].token);
                                                                 strcpy_s((char *)yyval.binstr->getBuff((unsigned)strlen(sz) + 1), strlen(sz) + 1,sz);
                                                                 yyval.binstr->appendInt8(4);
                                                                 yyval.binstr->appendInt32(yypvt[-1].int32); } break;
-case 736:
-#line 1860 "asmparse.y"
-{ yyval.secAct = dclRequest; } break;
 case 737:
 #line 1861 "asmparse.y"
-{ yyval.secAct = dclDemand; } break;
+{ yyval.secAct = dclRequest; } break;
 case 738:
 #line 1862 "asmparse.y"
-{ yyval.secAct = dclAssert; } break;
+{ yyval.secAct = dclDemand; } break;
 case 739:
 #line 1863 "asmparse.y"
-{ yyval.secAct = dclDeny; } break;
+{ yyval.secAct = dclAssert; } break;
 case 740:
 #line 1864 "asmparse.y"
-{ yyval.secAct = dclPermitOnly; } break;
+{ yyval.secAct = dclDeny; } break;
 case 741:
 #line 1865 "asmparse.y"
-{ yyval.secAct = dclLinktimeCheck; } break;
+{ yyval.secAct = dclPermitOnly; } break;
 case 742:
 #line 1866 "asmparse.y"
-{ yyval.secAct = dclInheritanceCheck; } break;
+{ yyval.secAct = dclLinktimeCheck; } break;
 case 743:
 #line 1867 "asmparse.y"
-{ yyval.secAct = dclRequestMinimum; } break;
+{ yyval.secAct = dclInheritanceCheck; } break;
 case 744:
 #line 1868 "asmparse.y"
-{ yyval.secAct = dclRequestOptional; } break;
+{ yyval.secAct = dclRequestMinimum; } break;
 case 745:
 #line 1869 "asmparse.y"
-{ yyval.secAct = dclRequestRefuse; } break;
+{ yyval.secAct = dclRequestOptional; } break;
 case 746:
 #line 1870 "asmparse.y"
-{ yyval.secAct = dclPrejitGrant; } break;
+{ yyval.secAct = dclRequestRefuse; } break;
 case 747:
 #line 1871 "asmparse.y"
-{ yyval.secAct = dclPrejitDenied; } break;
+{ yyval.secAct = dclPrejitGrant; } break;
 case 748:
 #line 1872 "asmparse.y"
-{ yyval.secAct = dclNonCasDemand; } break;
+{ yyval.secAct = dclPrejitDenied; } break;
 case 749:
 #line 1873 "asmparse.y"
-{ yyval.secAct = dclNonCasLinkDemand; } break;
+{ yyval.secAct = dclNonCasDemand; } break;
 case 750:
 #line 1874 "asmparse.y"
-{ yyval.secAct = dclNonCasInheritance; } break;
+{ yyval.secAct = dclNonCasLinkDemand; } break;
 case 751:
-#line 1878 "asmparse.y"
-{ PASM->ResetLineNumbers(); nCurrPC = PASM->m_CurPC; PENV->bExternSource = TRUE; PENV->bExternSourceAutoincrement = FALSE; } break;
+#line 1875 "asmparse.y"
+{ yyval.secAct = dclNonCasInheritance; } break;
 case 752:
 #line 1879 "asmparse.y"
-{ PASM->ResetLineNumbers(); nCurrPC = PASM->m_CurPC; PENV->bExternSource = TRUE; PENV->bExternSourceAutoincrement = TRUE; } break;
+{ PASM->ResetLineNumbers(); nCurrPC = PASM->m_CurPC; PENV->bExternSource = TRUE; PENV->bExternSourceAutoincrement = FALSE; } break;
 case 753:
-#line 1882 "asmparse.y"
+#line 1880 "asmparse.y"
+{ PASM->ResetLineNumbers(); nCurrPC = PASM->m_CurPC; PENV->bExternSource = TRUE; PENV->bExternSourceAutoincrement = TRUE; } break;
+case 754:
+#line 1883 "asmparse.y"
 { PENV->nExtLine = PENV->nExtLineEnd = yypvt[-1].int32;
                                                                 PENV->nExtCol = 0; PENV->nExtColEnd  = static_cast<unsigned>(-1);
                                                                 PASM->SetSourceFileName(yypvt[-0].string);} break;
-case 754:
-#line 1885 "asmparse.y"
+case 755:
+#line 1886 "asmparse.y"
 { PENV->nExtLine = PENV->nExtLineEnd = yypvt[-0].int32;
                                                                 PENV->nExtCol = 0; PENV->nExtColEnd  = static_cast<unsigned>(-1); } break;
-case 755:
-#line 1887 "asmparse.y"
+case 756:
+#line 1888 "asmparse.y"
 { PENV->nExtLine = PENV->nExtLineEnd = yypvt[-3].int32; 
                                                                 PENV->nExtCol=yypvt[-1].int32; PENV->nExtColEnd = static_cast<unsigned>(-1);
                                                                 PASM->SetSourceFileName(yypvt[-0].string);} break;
-case 756:
-#line 1890 "asmparse.y"
+case 757:
+#line 1891 "asmparse.y"
 { PENV->nExtLine = PENV->nExtLineEnd = yypvt[-2].int32; 
                                                                 PENV->nExtCol=yypvt[-0].int32; PENV->nExtColEnd = static_cast<unsigned>(-1);} break;
-case 757:
-#line 1893 "asmparse.y"
+case 758:
+#line 1894 "asmparse.y"
 { PENV->nExtLine = PENV->nExtLineEnd = yypvt[-5].int32; 
                                                                 PENV->nExtCol=yypvt[-3].int32; PENV->nExtColEnd = yypvt[-1].int32;
                                                                 PASM->SetSourceFileName(yypvt[-0].string);} break;
-case 758:
-#line 1897 "asmparse.y"
+case 759:
+#line 1898 "asmparse.y"
 { PENV->nExtLine = PENV->nExtLineEnd = yypvt[-4].int32; 
                                                                 PENV->nExtCol=yypvt[-2].int32; PENV->nExtColEnd = yypvt[-0].int32; } break;
-case 759:
-#line 1900 "asmparse.y"
+case 760:
+#line 1901 "asmparse.y"
 { PENV->nExtLine = yypvt[-5].int32; PENV->nExtLineEnd = yypvt[-3].int32; 
                                                                 PENV->nExtCol=yypvt[-1].int32; PENV->nExtColEnd = static_cast<unsigned>(-1);
                                                                 PASM->SetSourceFileName(yypvt[-0].string);} break;
-case 760:
-#line 1904 "asmparse.y"
+case 761:
+#line 1905 "asmparse.y"
 { PENV->nExtLine = yypvt[-4].int32; PENV->nExtLineEnd = yypvt[-2].int32; 
                                                                 PENV->nExtCol=yypvt[-0].int32; PENV->nExtColEnd = static_cast<unsigned>(-1); } break;
-case 761:
-#line 1907 "asmparse.y"
+case 762:
+#line 1908 "asmparse.y"
 { PENV->nExtLine = yypvt[-7].int32; PENV->nExtLineEnd = yypvt[-5].int32; 
                                                                 PENV->nExtCol=yypvt[-3].int32; PENV->nExtColEnd = yypvt[-1].int32;
                                                                 PASM->SetSourceFileName(yypvt[-0].string);} break;
-case 762:
-#line 1911 "asmparse.y"
+case 763:
+#line 1912 "asmparse.y"
 { PENV->nExtLine = yypvt[-6].int32; PENV->nExtLineEnd = yypvt[-4].int32; 
                                                                 PENV->nExtCol=yypvt[-2].int32; PENV->nExtColEnd = yypvt[-0].int32; } break;
-case 763:
-#line 1913 "asmparse.y"
+case 764:
+#line 1914 "asmparse.y"
 { PENV->nExtLine = PENV->nExtLineEnd = yypvt[-1].int32 - 1;
                                                                 PENV->nExtCol = 0; PENV->nExtColEnd = static_cast<unsigned>(-1);
                                                                 PASM->SetSourceFileName(yypvt[-0].binstr);} break;
-case 764:
-#line 1920 "asmparse.y"
-{ PASMM->AddFile(yypvt[-5].string, yypvt[-6].fileAttr|yypvt[-4].fileAttr|yypvt[-0].fileAttr, yypvt[-2].binstr); } break;
 case 765:
 #line 1921 "asmparse.y"
-{ PASMM->AddFile(yypvt[-1].string, yypvt[-2].fileAttr|yypvt[-0].fileAttr, NULL); } break;
+{ PASMM->AddFile(yypvt[-5].string, yypvt[-6].fileAttr|yypvt[-4].fileAttr|yypvt[-0].fileAttr, yypvt[-2].binstr); } break;
 case 766:
-#line 1924 "asmparse.y"
-{ yyval.fileAttr = (CorFileFlags) 0; } break;
+#line 1922 "asmparse.y"
+{ PASMM->AddFile(yypvt[-1].string, yypvt[-2].fileAttr|yypvt[-0].fileAttr, NULL); } break;
 case 767:
 #line 1925 "asmparse.y"
-{ yyval.fileAttr = (CorFileFlags) (yypvt[-1].fileAttr | ffContainsNoMetaData); } break;
-case 768:
-#line 1928 "asmparse.y"
 { yyval.fileAttr = (CorFileFlags) 0; } break;
+case 768:
+#line 1926 "asmparse.y"
+{ yyval.fileAttr = (CorFileFlags) (yypvt[-1].fileAttr | ffContainsNoMetaData); } break;
 case 769:
 #line 1929 "asmparse.y"
-{ yyval.fileAttr = (CorFileFlags) 0x80000000; } break;
+{ yyval.fileAttr = (CorFileFlags) 0; } break;
 case 770:
-#line 1932 "asmparse.y"
-{ bParsingByteArray = TRUE; } break;
+#line 1930 "asmparse.y"
+{ yyval.fileAttr = (CorFileFlags) 0x80000000; } break;
 case 771:
-#line 1935 "asmparse.y"
-{ PASMM->StartAssembly(yypvt[-0].string, NULL, (DWORD)yypvt[-1].asmAttr, FALSE); } break;
+#line 1933 "asmparse.y"
+{ bParsingByteArray = TRUE; } break;
 case 772:
-#line 1938 "asmparse.y"
-{ yyval.asmAttr = (CorAssemblyFlags) 0; } break;
+#line 1936 "asmparse.y"
+{ PASMM->StartAssembly(yypvt[-0].string, NULL, (DWORD)yypvt[-1].asmAttr, FALSE); } break;
 case 773:
 #line 1939 "asmparse.y"
-{ yyval.asmAttr = (CorAssemblyFlags) (yypvt[-1].asmAttr | afRetargetable); } break;
+{ yyval.asmAttr = (CorAssemblyFlags) 0; } break;
 case 774:
 #line 1940 "asmparse.y"
-{ yyval.asmAttr = (CorAssemblyFlags) (yypvt[-1].asmAttr | afContentType_WindowsRuntime); } break;
+{ yyval.asmAttr = (CorAssemblyFlags) (yypvt[-1].asmAttr | afRetargetable); } break;
 case 775:
 #line 1941 "asmparse.y"
-{ yyval.asmAttr = (CorAssemblyFlags) (yypvt[-1].asmAttr | afPA_NoPlatform); } break;
+{ yyval.asmAttr = (CorAssemblyFlags) (yypvt[-1].asmAttr | afContentType_WindowsRuntime); } break;
 case 776:
 #line 1942 "asmparse.y"
-{ yyval.asmAttr = yypvt[-2].asmAttr; } break;
+{ yyval.asmAttr = (CorAssemblyFlags) (yypvt[-1].asmAttr | afPA_NoPlatform); } break;
 case 777:
 #line 1943 "asmparse.y"
-{ SET_PA(yyval.asmAttr,yypvt[-1].asmAttr,afPA_MSIL); } break;
+{ yyval.asmAttr = yypvt[-2].asmAttr; } break;
 case 778:
 #line 1944 "asmparse.y"
-{ SET_PA(yyval.asmAttr,yypvt[-1].asmAttr,afPA_x86); } break;
+{ SET_PA(yyval.asmAttr,yypvt[-1].asmAttr,afPA_MSIL); } break;
 case 779:
 #line 1945 "asmparse.y"
-{ SET_PA(yyval.asmAttr,yypvt[-1].asmAttr,afPA_IA64); } break;
+{ SET_PA(yyval.asmAttr,yypvt[-1].asmAttr,afPA_x86); } break;
 case 780:
 #line 1946 "asmparse.y"
-{ SET_PA(yyval.asmAttr,yypvt[-1].asmAttr,afPA_AMD64); } break;
+{ SET_PA(yyval.asmAttr,yypvt[-1].asmAttr,afPA_IA64); } break;
 case 781:
 #line 1947 "asmparse.y"
+{ SET_PA(yyval.asmAttr,yypvt[-1].asmAttr,afPA_AMD64); } break;
+case 782:
+#line 1948 "asmparse.y"
 { SET_PA(yyval.asmAttr,yypvt[-1].asmAttr,afPA_ARM); } break;
-case 784:
-#line 1954 "asmparse.y"
+case 785:
+#line 1955 "asmparse.y"
 { PASMM->SetAssemblyHashAlg(yypvt[-0].int32); } break;
-case 787:
-#line 1959 "asmparse.y"
-{ yyval.int32 = yypvt[-0].int32; } break;
 case 788:
 #line 1960 "asmparse.y"
-{ yyval.int32 = 0xFFFF; } break;
+{ yyval.int32 = yypvt[-0].int32; } break;
 case 789:
-#line 1963 "asmparse.y"
-{ PASMM->SetAssemblyPublicKey(yypvt[-1].binstr); } break;
+#line 1961 "asmparse.y"
+{ yyval.int32 = 0xFFFF; } break;
 case 790:
-#line 1965 "asmparse.y"
-{ PASMM->SetAssemblyVer((USHORT)yypvt[-6].int32, (USHORT)yypvt[-4].int32, (USHORT)yypvt[-2].int32, (USHORT)yypvt[-0].int32); } break;
+#line 1964 "asmparse.y"
+{ PASMM->SetAssemblyPublicKey(yypvt[-1].binstr); } break;
 case 791:
 #line 1966 "asmparse.y"
-{ yypvt[-0].binstr->appendInt8(0); PASMM->SetAssemblyLocale(yypvt[-0].binstr,TRUE); } break;
+{ PASMM->SetAssemblyVer((USHORT)yypvt[-6].int32, (USHORT)yypvt[-4].int32, (USHORT)yypvt[-2].int32, (USHORT)yypvt[-0].int32); } break;
 case 792:
 #line 1967 "asmparse.y"
+{ yypvt[-0].binstr->appendInt8(0); PASMM->SetAssemblyLocale(yypvt[-0].binstr,TRUE); } break;
+case 793:
+#line 1968 "asmparse.y"
 { PASMM->SetAssemblyLocale(yypvt[-1].binstr,FALSE); } break;
-case 795:
-#line 1972 "asmparse.y"
-{ bParsingByteArray = TRUE; } break;
 case 796:
-#line 1975 "asmparse.y"
+#line 1973 "asmparse.y"
 { bParsingByteArray = TRUE; } break;
 case 797:
-#line 1978 "asmparse.y"
+#line 1976 "asmparse.y"
 { bParsingByteArray = TRUE; } break;
 case 798:
-#line 1982 "asmparse.y"
-{ PASMM->StartAssembly(yypvt[-0].string, NULL, yypvt[-1].asmAttr, TRUE); } break;
+#line 1979 "asmparse.y"
+{ bParsingByteArray = TRUE; } break;
 case 799:
-#line 1984 "asmparse.y"
+#line 1983 "asmparse.y"
+{ PASMM->StartAssembly(yypvt[-0].string, NULL, yypvt[-1].asmAttr, TRUE); } break;
+case 800:
+#line 1985 "asmparse.y"
 { PASMM->StartAssembly(yypvt[-2].string, yypvt[-0].string, yypvt[-3].asmAttr, TRUE); } break;
-case 802:
-#line 1991 "asmparse.y"
+case 803:
+#line 1992 "asmparse.y"
 { PASMM->SetAssemblyHashBlob(yypvt[-1].binstr); } break;
-case 804:
-#line 1993 "asmparse.y"
-{ PASMM->SetAssemblyPublicKeyToken(yypvt[-1].binstr); } break;
 case 805:
 #line 1994 "asmparse.y"
-{ PASMM->SetAssemblyAutodetect(); } break;
+{ PASMM->SetAssemblyPublicKeyToken(yypvt[-1].binstr); } break;
 case 806:
-#line 1997 "asmparse.y"
-{ PASMM->StartComType(yypvt[-0].string, yypvt[-1].exptAttr);} break;
+#line 1995 "asmparse.y"
+{ PASMM->SetAssemblyAutodetect(); } break;
 case 807:
-#line 2000 "asmparse.y"
-{ PASMM->StartComType(yypvt[-0].string, yypvt[-1].exptAttr); } break;
+#line 1998 "asmparse.y"
+{ PASMM->StartComType(yypvt[-0].string, yypvt[-1].exptAttr);} break;
 case 808:
-#line 2003 "asmparse.y"
-{ yyval.exptAttr = (CorTypeAttr) 0; } break;
+#line 2001 "asmparse.y"
+{ PASMM->StartComType(yypvt[-0].string, yypvt[-1].exptAttr); } break;
 case 809:
 #line 2004 "asmparse.y"
-{ yyval.exptAttr = (CorTypeAttr) (yypvt[-1].exptAttr | tdNotPublic); } break;
+{ yyval.exptAttr = (CorTypeAttr) 0; } break;
 case 810:
 #line 2005 "asmparse.y"
-{ yyval.exptAttr = (CorTypeAttr) (yypvt[-1].exptAttr | tdPublic); } break;
+{ yyval.exptAttr = (CorTypeAttr) (yypvt[-1].exptAttr | tdNotPublic); } break;
 case 811:
 #line 2006 "asmparse.y"
-{ yyval.exptAttr = (CorTypeAttr) (yypvt[-1].exptAttr | tdForwarder); } break;
+{ yyval.exptAttr = (CorTypeAttr) (yypvt[-1].exptAttr | tdPublic); } break;
 case 812:
 #line 2007 "asmparse.y"
-{ yyval.exptAttr = (CorTypeAttr) (yypvt[-2].exptAttr | tdNestedPublic); } break;
+{ yyval.exptAttr = (CorTypeAttr) (yypvt[-1].exptAttr | tdForwarder); } break;
 case 813:
 #line 2008 "asmparse.y"
-{ yyval.exptAttr = (CorTypeAttr) (yypvt[-2].exptAttr | tdNestedPrivate); } break;
+{ yyval.exptAttr = (CorTypeAttr) (yypvt[-2].exptAttr | tdNestedPublic); } break;
 case 814:
 #line 2009 "asmparse.y"
-{ yyval.exptAttr = (CorTypeAttr) (yypvt[-2].exptAttr | tdNestedFamily); } break;
+{ yyval.exptAttr = (CorTypeAttr) (yypvt[-2].exptAttr | tdNestedPrivate); } break;
 case 815:
 #line 2010 "asmparse.y"
-{ yyval.exptAttr = (CorTypeAttr) (yypvt[-2].exptAttr | tdNestedAssembly); } break;
+{ yyval.exptAttr = (CorTypeAttr) (yypvt[-2].exptAttr | tdNestedFamily); } break;
 case 816:
 #line 2011 "asmparse.y"
-{ yyval.exptAttr = (CorTypeAttr) (yypvt[-2].exptAttr | tdNestedFamANDAssem); } break;
+{ yyval.exptAttr = (CorTypeAttr) (yypvt[-2].exptAttr | tdNestedAssembly); } break;
 case 817:
 #line 2012 "asmparse.y"
+{ yyval.exptAttr = (CorTypeAttr) (yypvt[-2].exptAttr | tdNestedFamANDAssem); } break;
+case 818:
+#line 2013 "asmparse.y"
 { yyval.exptAttr = (CorTypeAttr) (yypvt[-2].exptAttr | tdNestedFamORAssem); } break;
-case 820:
-#line 2019 "asmparse.y"
-{ PASMM->SetComTypeFile(yypvt[-0].string); } break;
 case 821:
 #line 2020 "asmparse.y"
-{ PASMM->SetComTypeComType(yypvt[-0].string); } break;
+{ PASMM->SetComTypeFile(yypvt[-0].string); } break;
 case 822:
 #line 2021 "asmparse.y"
-{ PASMM->SetComTypeAsmRef(yypvt[-0].string); } break;
+{ PASMM->SetComTypeComType(yypvt[-0].string); } break;
 case 823:
 #line 2022 "asmparse.y"
+{ PASMM->SetComTypeAsmRef(yypvt[-0].string); } break;
+case 824:
+#line 2023 "asmparse.y"
 { if(!PASMM->SetComTypeImplementationTok(yypvt[-1].int32))
                                                                   PASM->report->error("Invalid implementation of exported type\n"); } break;
-case 824:
-#line 2024 "asmparse.y"
+case 825:
+#line 2025 "asmparse.y"
 { if(!PASMM->SetComTypeClassTok(yypvt[-0].int32))
                                                                   PASM->report->error("Invalid TypeDefID of exported type\n"); } break;
-case 827:
-#line 2030 "asmparse.y"
-{ PASMM->StartManifestRes(yypvt[-0].string, yypvt[-0].string, yypvt[-1].manresAttr); } break;
 case 828:
-#line 2032 "asmparse.y"
-{ PASMM->StartManifestRes(yypvt[-2].string, yypvt[-0].string, yypvt[-3].manresAttr); } break;
+#line 2031 "asmparse.y"
+{ PASMM->StartManifestRes(yypvt[-0].string, yypvt[-0].string, yypvt[-1].manresAttr); } break;
 case 829:
-#line 2035 "asmparse.y"
-{ yyval.manresAttr = (CorManifestResourceFlags) 0; } break;
+#line 2033 "asmparse.y"
+{ PASMM->StartManifestRes(yypvt[-2].string, yypvt[-0].string, yypvt[-3].manresAttr); } break;
 case 830:
 #line 2036 "asmparse.y"
-{ yyval.manresAttr = (CorManifestResourceFlags) (yypvt[-1].manresAttr | mrPublic); } break;
+{ yyval.manresAttr = (CorManifestResourceFlags) 0; } break;
 case 831:
 #line 2037 "asmparse.y"
+{ yyval.manresAttr = (CorManifestResourceFlags) (yypvt[-1].manresAttr | mrPublic); } break;
+case 832:
+#line 2038 "asmparse.y"
 { yyval.manresAttr = (CorManifestResourceFlags) (yypvt[-1].manresAttr | mrPrivate); } break;
-case 834:
-#line 2044 "asmparse.y"
-{ PASMM->SetManifestResFile(yypvt[-2].string, (ULONG)yypvt[-0].int32); } break;
 case 835:
 #line 2045 "asmparse.y"
+{ PASMM->SetManifestResFile(yypvt[-2].string, (ULONG)yypvt[-0].int32); } break;
+case 836:
+#line 2046 "asmparse.y"
 { PASMM->SetManifestResAsmRef(yypvt[-0].string); } break;/* End of actions */
 #line 329 "O:\\tfs\\cgm\\src\\Tools\\devdiv\\amd64\\yypars.c"
                        }
index 414ebba..f0796c4 100644 (file)
@@ -3647,6 +3647,7 @@ lDone: ;
     if(IsMiNoInlining(dwImplAttrs))         szptr+=sprintf_s(szptr,SZSTRING_REMAINING_SIZE(szptr)," noinlining");
     if(IsMiAggressiveInlining(dwImplAttrs)) szptr+=sprintf_s(szptr,SZSTRING_REMAINING_SIZE(szptr)," aggressiveinlining");
     if(IsMiNoOptimization(dwImplAttrs))     szptr+=sprintf_s(szptr,SZSTRING_REMAINING_SIZE(szptr)," nooptimization");
+    if(IsMiAggressiveOptimization(dwImplAttrs)) szptr+=sprintf_s(szptr,SZSTRING_REMAINING_SIZE(szptr)," aggressiveoptimization");
     szptr+=sprintf_s(szptr,SZSTRING_REMAINING_SIZE(szptr),KEYWORD((char*)-1));
     printLine(GUICookie, szString);
     VDELETE(buff);
index df54ab4..a91dc9c 100644 (file)
@@ -644,6 +644,7 @@ typedef enum CorMethodImpl
     miNoInlining         =   0x0008,   // Method may not be inlined.
     miAggressiveInlining =   0x0100,   // Method should be inlined if possible.
     miNoOptimization     =   0x0040,   // Method may not be optimized.
+    miAggressiveOptimization = 0x0200, // Method may contain hot code and should be aggressively optimized.
 
     // These are the flags that are allowed in MethodImplAttribute's Value
     // property. This should include everything above except the code impl
@@ -651,7 +652,7 @@ typedef enum CorMethodImpl
     miUserMask           =   miManagedMask | miForwardRef | miPreserveSig |
                              miInternalCall | miSynchronized |
                              miNoInlining | miAggressiveInlining |
-                             miNoOptimization,
+                             miNoOptimization | miAggressiveOptimization,
 
     miMaxMethodImplVal   =   0xffff,   // Range check value
 } CorMethodImpl;
@@ -674,6 +675,7 @@ typedef enum CorMethodImpl
 #define IsMiNoInlining(x)                   ((x) & miNoInlining)
 #define IsMiAggressiveInlining(x)           ((x) & miAggressiveInlining)
 #define IsMiNoOptimization(x)               ((x) & miNoOptimization)
+#define IsMiAggressiveOptimization(x)       (((x) & (miAggressiveOptimization | miNoOptimization)) == miAggressiveOptimization)
 
 // PinvokeMap attr bits, used by DefinePinvokeMap.
 typedef enum  CorPinvokeMap
index 97f3be9..88f8c1b 100644 (file)
@@ -824,7 +824,7 @@ enum CorInfoFlag
     CORINFO_FLG_NOGCCHECK             = 0x00200000, // This method is FCALL that has no GC check.  Don't put alone in loops
     CORINFO_FLG_INTRINSIC             = 0x00400000, // This method MAY have an intrinsic ID
     CORINFO_FLG_CONSTRUCTOR           = 0x00800000, // This method is an instance or type initializer
-//  CORINFO_FLG_UNUSED                = 0x01000000,
+    CORINFO_FLG_AGGRESSIVE_OPT        = 0x01000000, // The method may contain hot code and should be aggressively optimized if possible
 //  CORINFO_FLG_UNUSED                = 0x02000000,
     CORINFO_FLG_NOSECURITYWRAP        = 0x04000000, // The method requires no security checks
     CORINFO_FLG_DONT_INLINE           = 0x10000000, // The method should not be inlined
index e16d7c7..47ffb8a 100644 (file)
     KYWD( "internalcall",   INTERNALCALL_,      NO_VALUE )
     KYWD( "noinlining",     NOINLINING_,        NO_VALUE )
     KYWD( "nooptimization", NOOPTIMIZATION_,    NO_VALUE )
+    KYWD( "aggressiveoptimization", AGGRESSIVEOPTIMIZATION_, NO_VALUE )
     KYWD( "nomangle",       NOMANGLE_,          NO_VALUE )
     KYWD( "lasterr",        LASTERR_,           NO_VALUE )
     KYWD( "winapi",         WINAPI_,            NO_VALUE )
index 54c73cc..58de646 100644 (file)
@@ -111,6 +111,7 @@ set(VM_SOURCES_DAC_AND_WKS_COMMON
     threadpoolrequest.cpp
     threads.cpp
     threadstatics.cpp
+    tieredcompilation.cpp
     typectxt.cpp
     typedesc.cpp
     typehandle.cpp
@@ -381,7 +382,6 @@ set(VM_SOURCES_WKS
     synch.cpp
     synchronizationcontextnative.cpp
     testhookmgr.cpp
-    tieredcompilation.cpp
     threaddebugblockinginfo.cpp
     threadsuspend.cpp
     typeparse.cpp
index 86e8558..5f7ef16 100644 (file)
@@ -50,13 +50,20 @@ bool NativeCodeVersion::operator!=(const NativeCodeVersion & rhs) const { return
 #define CORPROF_E_RUNTIME_SUSPEND_REQUIRED 0x80131381
 
 #ifndef DACCESS_COMPILE
-NativeCodeVersionNode::NativeCodeVersionNode(NativeCodeVersionId id, MethodDesc* pMethodDesc, ReJITID parentId) :
+NativeCodeVersionNode::NativeCodeVersionNode(
+    NativeCodeVersionId id,
+    MethodDesc* pMethodDesc,
+    ReJITID parentId,
+    NativeCodeVersion::OptimizationTier optimizationTier)
+    :
     m_pNativeCode(NULL),
     m_pMethodDesc(pMethodDesc),
     m_parentId(parentId),
     m_pNextMethodDescSibling(NULL),
     m_id(id),
-    m_optTier(NativeCodeVersion::OptimizationTier0),
+#ifdef FEATURE_TIERED_COMPILATION
+    m_optTier(optimizationTier),
+#endif
     m_flags(0)
 {}
 #endif
@@ -143,15 +150,8 @@ void NativeCodeVersionNode::SetActiveChildFlag(BOOL isActive)
 NativeCodeVersion::OptimizationTier NativeCodeVersionNode::GetOptimizationTier() const
 {
     LIMITED_METHOD_DAC_CONTRACT;
-    return m_optTier.Load();
-}
-#ifndef DACCESS_COMPILE
-void NativeCodeVersionNode::SetOptimizationTier(NativeCodeVersion::OptimizationTier tier)
-{
-    LIMITED_METHOD_DAC_CONTRACT;
-    m_optTier.Store(tier);
+    return m_optTier;
 }
-#endif
 #endif // FEATURE_TIERED_COMPILATION
 
 NativeCodeVersion::NativeCodeVersion() :
@@ -336,24 +336,9 @@ NativeCodeVersion::OptimizationTier NativeCodeVersion::GetOptimizationTier() con
     }
     else
     {
-        return NativeCodeVersion::OptimizationTier0;
+        return TieredCompilationManager::GetInitialOptimizationTier(GetMethodDesc());
     }
 }
-
-#ifndef DACCESS_COMPILE
-void NativeCodeVersion::SetOptimizationTier(NativeCodeVersion::OptimizationTier tier)
-{
-    LIMITED_METHOD_CONTRACT;
-    if (m_storageKind == StorageKind::Explicit)
-    {
-        AsNode()->SetOptimizationTier(tier);
-    }
-    else
-    {
-        _ASSERTE(!"Do not call SetOptimizationTier on default code versions - these versions are immutable");
-    }
-}
-#endif
 #endif
 
 PTR_NativeCodeVersionNode NativeCodeVersion::AsNode() const
@@ -881,11 +866,14 @@ void ILCodeVersion::SetInstrumentedILMap(SIZE_T cMap, COR_IL_MAP * rgMap)
     AsNode()->SetInstrumentedILMap(cMap, rgMap);
 }
 
-HRESULT ILCodeVersion::AddNativeCodeVersion(MethodDesc* pClosedMethodDesc, NativeCodeVersion* pNativeCodeVersion)
+HRESULT ILCodeVersion::AddNativeCodeVersion(
+    MethodDesc* pClosedMethodDesc,
+    NativeCodeVersion::OptimizationTier optimizationTier,
+    NativeCodeVersion* pNativeCodeVersion)
 {
     LIMITED_METHOD_CONTRACT;
     CodeVersionManager* pManager = GetModule()->GetCodeVersionManager();
-    HRESULT hr = pManager->AddNativeCodeVersion(*this, pClosedMethodDesc, pNativeCodeVersion);
+    HRESULT hr = pManager->AddNativeCodeVersion(*this, pClosedMethodDesc, optimizationTier, pNativeCodeVersion);
     if (FAILED(hr))
     {
         _ASSERTE(hr == E_OUTOFMEMORY);
@@ -901,7 +889,9 @@ HRESULT ILCodeVersion::GetOrCreateActiveNativeCodeVersion(MethodDesc* pClosedMet
     NativeCodeVersion activeNativeChild = GetActiveNativeCodeVersion(pClosedMethodDesc);
     if (activeNativeChild.IsNull())
     {
-        if (FAILED(hr = AddNativeCodeVersion(pClosedMethodDesc, &activeNativeChild)))
+        NativeCodeVersion::OptimizationTier optimizationTier =
+            TieredCompilationManager::GetInitialOptimizationTier(pClosedMethodDesc);
+        if (FAILED(hr = AddNativeCodeVersion(pClosedMethodDesc, optimizationTier, &activeNativeChild)))
         {
             _ASSERTE(hr == E_OUTOFMEMORY);
             return hr;
@@ -2098,7 +2088,11 @@ HRESULT CodeVersionManager::SetActiveILCodeVersions(ILCodeVersion* pActiveVersio
     return S_OK;
 }
 
-HRESULT CodeVersionManager::AddNativeCodeVersion(ILCodeVersion ilCodeVersion, MethodDesc* pClosedMethodDesc, NativeCodeVersion* pNativeCodeVersion)
+HRESULT CodeVersionManager::AddNativeCodeVersion(
+    ILCodeVersion ilCodeVersion,
+    MethodDesc* pClosedMethodDesc,
+    NativeCodeVersion::OptimizationTier optimizationTier,
+    NativeCodeVersion* pNativeCodeVersion)
 {
     LIMITED_METHOD_CONTRACT;
     _ASSERTE(LockOwnedByCurrentThread());
@@ -2112,7 +2106,7 @@ HRESULT CodeVersionManager::AddNativeCodeVersion(ILCodeVersion ilCodeVersion, Me
     }
 
     NativeCodeVersionId newId = pMethodVersioningState->AllocateVersionId();
-    NativeCodeVersionNode* pNativeCodeVersionNode = new (nothrow) NativeCodeVersionNode(newId, pClosedMethodDesc, ilCodeVersion.GetVersionId());
+    NativeCodeVersionNode* pNativeCodeVersionNode = new (nothrow) NativeCodeVersionNode(newId, pClosedMethodDesc, ilCodeVersion.GetVersionId(), optimizationTier);
     if (pNativeCodeVersionNode == NULL)
     {
         return E_OUTOFMEMORY;
index b9004a5..6dddacc 100644 (file)
@@ -64,16 +64,13 @@ public:
 #ifndef DACCESS_COMPILE
     BOOL SetNativeCodeInterlocked(PCODE pCode, PCODE pExpected = NULL);
 #endif
-#ifdef FEATURE_TIERED_COMPILATION
     enum OptimizationTier
     {
         OptimizationTier0,
         OptimizationTier1
     };
+#ifdef FEATURE_TIERED_COMPILATION
     OptimizationTier GetOptimizationTier() const;
-#ifndef DACCESS_COMPILE
-    void SetOptimizationTier(OptimizationTier tier);
-#endif
 #endif // FEATURE_TIERED_COMPILATION
     bool operator==(const NativeCodeVersion & rhs) const;
     bool operator!=(const NativeCodeVersion & rhs) const;
@@ -152,7 +149,7 @@ public:
     void SetIL(COR_ILMETHOD* pIL);
     void SetJitFlags(DWORD flags);
     void SetInstrumentedILMap(SIZE_T cMap, COR_IL_MAP * rgMap);
-    HRESULT AddNativeCodeVersion(MethodDesc* pClosedMethodDesc, NativeCodeVersion* pNativeCodeVersion);
+    HRESULT AddNativeCodeVersion(MethodDesc* pClosedMethodDesc, NativeCodeVersion::OptimizationTier optimizationTier, NativeCodeVersion* pNativeCodeVersion);
     HRESULT GetOrCreateActiveNativeCodeVersion(MethodDesc* pClosedMethodDesc, NativeCodeVersion* pNativeCodeVersion);
     HRESULT SetActiveNativeCodeVersion(NativeCodeVersion activeNativeCodeVersion, BOOL fEESuspended);
 #endif //DACCESS_COMPILE
@@ -223,7 +220,7 @@ class NativeCodeVersionNode
     friend ILCodeVersionNode;
 public:
 #ifndef DACCESS_COMPILE
-    NativeCodeVersionNode(NativeCodeVersionId id, MethodDesc* pMethod, ReJITID parentId);
+    NativeCodeVersionNode(NativeCodeVersionId id, MethodDesc* pMethod, ReJITID parentId, NativeCodeVersion::OptimizationTier optimizationTier);
 #endif
 #ifdef DEBUG
     BOOL LockOwnedByCurrentThread() const;
@@ -240,9 +237,6 @@ public:
 #endif
 #ifdef FEATURE_TIERED_COMPILATION
     NativeCodeVersion::OptimizationTier GetOptimizationTier() const;
-#ifndef DACCESS_COMPILE
-    void SetOptimizationTier(NativeCodeVersion::OptimizationTier tier);
-#endif
 #endif
 
 private:
@@ -256,7 +250,7 @@ private:
     PTR_NativeCodeVersionNode m_pNextMethodDescSibling;
     NativeCodeVersionId m_id;
 #ifdef FEATURE_TIERED_COMPILATION
-    Volatile<NativeCodeVersion::OptimizationTier> m_optTier;
+    NativeCodeVersion::OptimizationTier m_optTier;
 #endif
 
     enum NativeCodeVersionNodeFlags
@@ -609,7 +603,7 @@ public:
     };
 
     HRESULT AddILCodeVersion(Module* pModule, mdMethodDef methodDef, ReJITID rejitId, ILCodeVersion* pILCodeVersion);
-    HRESULT AddNativeCodeVersion(ILCodeVersion ilCodeVersion, MethodDesc* pClosedMethodDesc, NativeCodeVersion* pNativeCodeVersion);
+    HRESULT AddNativeCodeVersion(ILCodeVersion ilCodeVersion, MethodDesc* pClosedMethodDesc, NativeCodeVersion::OptimizationTier optimizationTier, NativeCodeVersion* pNativeCodeVersion);
     HRESULT DoJumpStampIfNecessary(MethodDesc* pMD, PCODE pCode);
     PCODE PublishVersionableCodeIfNecessary(MethodDesc* pMethodDesc, BOOL fCanBackpatchPrestub);
     HRESULT PublishNativeCodeVersion(MethodDesc* pMethodDesc, NativeCodeVersion nativeCodeVersion, BOOL fEESuspended);
index 2140d34..28e17e9 100644 (file)
@@ -6776,6 +6776,17 @@ DWORD CEEInfo::getMethodAttribsInternal (CORINFO_METHOD_HANDLE ftn)
         result |= CORINFO_FLG_DONT_INLINE_CALLER;
     }
 
+    // Check for the aggressive optimization directive. AggressiveOptimization only makes sense for IL methods.
+    DWORD ilMethodImplAttribs = 0;
+    if (pMD->IsIL())
+    {
+        ilMethodImplAttribs = pMD->GetImplAttrs();
+        if (IsMiAggressiveOptimization(ilMethodImplAttribs))
+        {
+            result |= CORINFO_FLG_AGGRESSIVE_OPT;
+        }
+    }
+
     // Check for an inlining directive.
     if (pMD->IsNotInline())
     {
@@ -6783,7 +6794,7 @@ DWORD CEEInfo::getMethodAttribsInternal (CORINFO_METHOD_HANDLE ftn)
         result |= CORINFO_FLG_DONT_INLINE;
     }
     // AggressiveInlining only makes sense for IL methods.
-    else if (pMD->IsIL() && IsMiAggressiveInlining(pMD->GetImplAttrs()))
+    else if (pMD->IsIL() && IsMiAggressiveInlining(ilMethodImplAttribs))
     {
         result |= CORINFO_FLG_FORCEINLINE;
     }
index 5ed6869..57561ef 100644 (file)
@@ -1267,12 +1267,13 @@ public:
     }
 #endif
 
-    // Returns a code version that represents the first (default)
-    // code body that this method would have.
-    NativeCodeVersion GetInitialCodeVersion()
+    bool RequestedAggressiveOptimization()
     {
-        LIMITED_METHOD_DAC_CONTRACT;
-        return NativeCodeVersion(dac_cast<PTR_MethodDesc>(this));
+        WRAPPER_NO_CONTRACT;
+
+        return
+            IsIL() && // only makes sense for IL methods, and this implies !IsNoMetadata()
+            IsMiAggressiveOptimization(GetImplAttrs());
     }
 
     // Does this method force the NativeCodeSlot to stay fixed after it
index 378dc2e..1893cf6 100644 (file)
@@ -1745,20 +1745,16 @@ PCODE MethodDesc::DoPrestub(MethodTable *pDispatchingMT)
     // When the TieredCompilationManager has received enough call notifications
     // for this method only then do we back-patch it.
     BOOL fCanBackpatchPrestub = TRUE;
-    BOOL fEligibleForCallCounting = FALSE;
 #ifdef FEATURE_TIERED_COMPILATION
+    BOOL fNeedsCallCounting = FALSE;
     TieredCompilationManager* pTieredCompilationManager = nullptr;
-    BOOL fEligibleForTieredCompilation = IsEligibleForTieredCompilation();
-    BOOL fWasPromotedToTier1 = FALSE;
-    if (fEligibleForTieredCompilation)
+    if (IsEligibleForTieredCompilation() && TieredCompilationManager::RequiresCallCounting(this))
     {
-        fEligibleForCallCounting = g_pConfig->TieredCompilation_CallCounting();
-        if (fEligibleForCallCounting)
-        {
-            pTieredCompilationManager = GetAppDomain()->GetTieredCompilationManager();
-            CallCounter * pCallCounter = GetCallCounter();
-            pCallCounter->OnMethodCalled(this, pTieredCompilationManager, &fCanBackpatchPrestub, &fWasPromotedToTier1);
-        }
+        pTieredCompilationManager = GetAppDomain()->GetTieredCompilationManager();
+        CallCounter * pCallCounter = GetCallCounter();
+        BOOL fWasPromotedToTier1 = FALSE;
+        pCallCounter->OnMethodCalled(this, pTieredCompilationManager, &fCanBackpatchPrestub, &fWasPromotedToTier1);
+        fNeedsCallCounting = !fWasPromotedToTier1;
     }
 #endif
 
@@ -1771,10 +1767,12 @@ PCODE MethodDesc::DoPrestub(MethodTable *pDispatchingMT)
     {
         pCode = GetCodeVersionManager()->PublishVersionableCodeIfNecessary(this, fCanBackpatchPrestub);
 
-        if (pTieredCompilationManager != nullptr && fEligibleForCallCounting && fCanBackpatchPrestub && pCode != NULL && !fWasPromotedToTier1)
+#ifdef FEATURE_TIERED_COMPILATION
+        if (pTieredCompilationManager != nullptr && fNeedsCallCounting && fCanBackpatchPrestub && pCode != NULL)
         {
             pTieredCompilationManager->OnMethodCallCountingStoppedWithoutTier1Promotion(this);
         }
+#endif
 
         fIsPointingToPrestub = IsPointingToPrestub();
     }
index 9c9e76d..2c24618 100644 (file)
@@ -58,7 +58,7 @@
 // errors are limited to OS resource exhaustion or poorly behaved managed code
 // (for example within an AssemblyResolve event or static constructor triggered by the JIT).
 
-#ifdef FEATURE_TIERED_COMPILATION
+#if defined(FEATURE_TIERED_COMPILATION) && !defined(DACCESS_COMPILE)
 
 // Called at AppDomain construction
 TieredCompilationManager::TieredCompilationManager() :
@@ -91,6 +91,38 @@ void TieredCompilationManager::Init(ADID appDomainId)
     m_callCountOptimizationThreshhold = g_pConfig->TieredCompilation_Tier1CallCountThreshold();
 }
 
+#endif // FEATURE_TIERED_COMPILATION && !DACCESS_COMPILE
+
+NativeCodeVersion::OptimizationTier TieredCompilationManager::GetInitialOptimizationTier(PTR_MethodDesc pMethodDesc)
+{
+    WRAPPER_NO_CONTRACT;
+    _ASSERTE(pMethodDesc != NULL);
+
+#ifdef FEATURE_TIERED_COMPILATION
+    if (pMethodDesc->RequestedAggressiveOptimization())
+    {
+        // Methods flagged with MethodImplOptions.AggressiveOptimization begin at tier 1, as a workaround to cold methods with
+        // hot loops performing poorly (https://github.com/dotnet/coreclr/issues/19751)
+        return NativeCodeVersion::OptimizationTier1;
+    }
+#endif // FEATURE_TIERED_COMPILATION
+
+    return NativeCodeVersion::OptimizationTier0;
+}
+
+#if defined(FEATURE_TIERED_COMPILATION) && !defined(DACCESS_COMPILE)
+
+bool TieredCompilationManager::RequiresCallCounting(MethodDesc* pMethodDesc)
+{
+    WRAPPER_NO_CONTRACT;
+    _ASSERTE(pMethodDesc != NULL);
+    _ASSERTE(pMethodDesc->IsEligibleForTieredCompilation());
+
+    return
+        g_pConfig->TieredCompilation_CallCounting() &&
+        GetInitialOptimizationTier(pMethodDesc) == NativeCodeVersion::OptimizationTier0;
+}
+
 // Called each time code in this AppDomain has been run. This is our sole entrypoint to begin
 // tiered compilation for now. Returns TRUE if no more notifications are necessary, but
 // more notifications may come anyways.
@@ -213,7 +245,7 @@ void TieredCompilationManager::AsyncPromoteMethodToTier1(MethodDesc* pMethodDesc
         }
 
         HRESULT hr = S_OK;
-        if (FAILED(hr = ilVersion.AddNativeCodeVersion(pMethodDesc, &t1NativeCodeVersion)))
+        if (FAILED(hr = ilVersion.AddNativeCodeVersion(pMethodDesc, NativeCodeVersion::OptimizationTier1, &t1NativeCodeVersion)))
         {
             // optimization didn't work for some reason (presumably OOM)
             // just give up and continue on
@@ -222,7 +254,6 @@ void TieredCompilationManager::AsyncPromoteMethodToTier1(MethodDesc* pMethodDesc
                 hr, pMethodDesc);
             return;
         }
-        t1NativeCodeVersion.SetOptimizationTier(NativeCodeVersion::OptimizationTier1);
     }
 
     // Insert the method into the optimization queue and trigger a thread to service
@@ -791,4 +822,4 @@ CORJIT_FLAGS TieredCompilationManager::GetJitFlags(NativeCodeVersion nativeCodeV
     return flags;
 }
 
-#endif // FEATURE_TIERED_COMPILATION
+#endif // FEATURE_TIERED_COMPILATION && !DACCESS_COMPILE
index b208f26..072f8e1 100644 (file)
 #ifndef TIERED_COMPILATION_H
 #define TIERED_COMPILATION_H
 
-#ifdef FEATURE_TIERED_COMPILATION
-
 // TieredCompilationManager determines which methods should be recompiled and
 // how they should be recompiled to best optimize the running code. It then
 // handles logistics of getting new code created and installed.
 class TieredCompilationManager
 {
+#ifdef FEATURE_TIERED_COMPILATION
+
 public:
 #if defined(DACCESS_COMPILE) || defined(CROSSGEN_COMPILE)
     TieredCompilationManager() {}
@@ -26,7 +26,15 @@ public:
 
     void Init(ADID appDomainId);
 
+#endif // FEATURE_TIERED_COMPILATION
+
 public:
+    static NativeCodeVersion::OptimizationTier GetInitialOptimizationTier(PTR_MethodDesc pMethodDesc);
+
+#ifdef FEATURE_TIERED_COMPILATION
+
+public:
+    static bool RequiresCallCounting(MethodDesc* pMethodDesc);
     void OnMethodCalled(MethodDesc* pMethodDesc, DWORD currentCallCount, BOOL* shouldStopCountingCallsRef, BOOL* wasPromotedToTier1Ref);
     void OnMethodCallCountingStoppedWithoutTier1Promotion(MethodDesc* pMethodDesc);
     void AsyncPromoteMethodToTier1(MethodDesc* pMethodDesc);
@@ -68,8 +76,8 @@ private:
     bool m_tier1CallCountingCandidateMethodRecentlyRecorded;
 
     CLREvent m_asyncWorkDoneEvent;
-};
 
 #endif // FEATURE_TIERED_COMPILATION
+};
 
 #endif // TIERED_COMPILATION_H
index 7320729..341e0d8 100644 (file)
@@ -435,6 +435,15 @@ void ZapInfo::CompileMethod()
     // this they can add the hint and reduce the perf cost at runtime.
     m_pImage->m_pPreloader->PrePrepareMethodIfNecessary(m_currentMethodHandle);
 
+    DWORD methodAttribs = getMethodAttribs(m_currentMethodHandle);
+    if (methodAttribs & CORINFO_FLG_AGGRESSIVE_OPT)
+    {
+        // Skip methods marked with MethodImplOptions.AggressiveOptimization, they will be jitted instead. In the future,
+        // consider letting the JIT determine whether aggressively optimized code can/should be pregenerated for the method
+        // instead of this check.
+        return;
+    }
+
     m_jitFlags = ComputeJitFlags(m_currentMethodHandle);
 
 #ifdef FEATURE_READYTORUN_COMPILER
@@ -443,7 +452,6 @@ void ZapInfo::CompileMethod()
         // READYTORUN: FUTURE: Producedure spliting
         m_jitFlags.Clear(CORJIT_FLAGS::CORJIT_FLAG_PROCSPLIT);
 
-        DWORD methodAttribs = getMethodAttribs(m_currentMethodHandle);
         if (!(methodAttribs & CORINFO_FLG_NOSECURITYWRAP) || (methodAttribs & CORINFO_FLG_SECURITYCHECK))
         {
             m_zapper->Warning(W("ReadyToRun: Methods with security checks not supported\n"));
diff --git a/tests/src/ilasm/System/Runtime/CompilerServices/MethodImplOptionsTests.cs b/tests/src/ilasm/System/Runtime/CompilerServices/MethodImplOptionsTests.cs
new file mode 100644 (file)
index 0000000..30fbd5e
--- /dev/null
@@ -0,0 +1,152 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Diagnostics;
+using System.IO;
+using System.Text.RegularExpressions;
+
+public static class MethodImplOptionsTests
+{
+    private const int UnexpectedTimeoutMs = 30_000;
+
+    public static int Main()
+    {
+        const int Pass = 100;
+        const int Fail = 101;
+
+        string coreRoot = Environment.GetEnvironmentVariable("CORE_ROOT");
+        if (string.IsNullOrWhiteSpace(coreRoot))
+        {
+            Console.WriteLine("Environment variable is not set: 'CORE_ROOT'");
+            return Fail;
+        }
+        if (!Directory.Exists(coreRoot))
+        {
+            Console.WriteLine($"Did not find CORE_ROOT directory: {coreRoot}");
+            return Fail;
+        }
+
+        var nativeExeExtensions = new string[] { string.Empty, ".exe" };
+        bool found = false;
+        string ilasmFile = null;
+        string ildasmFile = null;
+        foreach (string nativeExeExtension in nativeExeExtensions)
+        {
+            ilasmFile = Path.Combine(coreRoot, $"ilasm{nativeExeExtension}");
+            ildasmFile = Path.Combine(coreRoot, $"ildasm{nativeExeExtension}");
+            if (File.Exists(ilasmFile) && File.Exists(ildasmFile))
+            {
+                found = true;
+                break;
+            }
+        }
+        if (!found)
+        {
+            Console.WriteLine($"Did not find ilasm or ildasm in CORE_ROOT directory: {coreRoot}");
+            return Fail;
+        }
+
+        bool allPassed = true;
+        allPassed &=
+            RunMethodImplOptionsTest(
+                ilasmFile,
+                ildasmFile,
+                "AggressiveOptimizationTest",
+                "MiAggressiveOptimization.il",
+                "aggressiveoptimization");
+        return allPassed ? Pass : Fail;
+    }
+
+    private static bool RunMethodImplOptionsTest(
+        string ilasmFile,
+        string ildasmFile,
+        string testName,
+        string ilFileName,
+        string ilDisasmAttributeKeyword)
+    {
+        Console.WriteLine(testName);
+
+        try
+        {
+            string disasmIlFileName;
+            ProcessStartInfo ilasmPsi, ildasmPsi;
+            GetIlasmProcessStartInfos(ilasmFile, ildasmFile, ilFileName, out disasmIlFileName, out ilasmPsi, out ildasmPsi);
+
+            Process ilasmProcess = Process.Start(ilasmPsi);
+            if (!ilasmProcess.WaitForExit(UnexpectedTimeoutMs))
+            {
+                Console.WriteLine("Timed out waiting for ilasm to exit");
+                return false;
+            }
+            if (ilasmProcess.ExitCode != 0)
+            {
+                Console.WriteLine($"ilasm failed with exit code: {ilasmProcess.ExitCode}");
+                return false;
+            }
+
+            Process ildasmProcess = Process.Start(ildasmPsi);
+            if (!ildasmProcess.WaitForExit(UnexpectedTimeoutMs))
+            {
+                Console.WriteLine("Timed out waiting for ildasm to exit");
+                return false;
+            }
+            if (ildasmProcess.ExitCode != 0)
+            {
+                Console.WriteLine($"ildasm failed with exit code: {ildasmProcess.ExitCode}");
+                return false;
+            }
+
+            string disasmIl = File.ReadAllText(disasmIlFileName);
+            var findMainAttributeRegex =
+                new Regex(
+                    @"\bvoid\s+Main\s*\(\s*\).*?\b" + ilDisasmAttributeKeyword + @"\b",
+                    RegexOptions.Compiled | RegexOptions.Multiline);
+            Match match = findMainAttributeRegex.Match(disasmIl);
+            if (!match.Success)
+            {
+                Console.WriteLine($"Attribute '{ilDisasmAttributeKeyword}' did not round-trip through ilasm and ildasm");
+                return false;
+            }
+        }
+        catch (Exception ex)
+        {
+            Console.WriteLine(ex);
+            return false;
+        }
+        return true;
+    }
+
+    private static void GetIlasmProcessStartInfos(
+        string ilasmFile,
+        string ildasmFile,
+        string ilFileName,
+        out string disasmIlFileName,
+        out ProcessStartInfo ilasmPsi,
+        out ProcessStartInfo ildasmPsi)
+    {
+        if (!File.Exists(ilFileName))
+        {
+            throw new FileNotFoundException(
+                $"Did not find '{ilFileName}' in working directory '{Environment.CurrentDirectory}'");
+        }
+
+        string currentDirectory = Environment.CurrentDirectory;
+
+        ilasmPsi = new ProcessStartInfo();
+        ilasmPsi.UseShellExecute = false;
+        ilasmPsi.WorkingDirectory = currentDirectory;
+        ilasmPsi.FileName = ilasmFile;
+        string asmDllFileName = $"{Path.GetFileNameWithoutExtension(ilFileName)}.dll";
+        ilasmPsi.Arguments =
+            $"-nologo -dll -optimize -output={asmDllFileName} {ilFileName}";
+
+        ildasmPsi = new ProcessStartInfo();
+        ildasmPsi.UseShellExecute = false;
+        ildasmPsi.WorkingDirectory = currentDirectory;
+        ildasmPsi.FileName = ildasmFile;
+        disasmIlFileName = $"{Path.GetFileNameWithoutExtension(ilFileName)}_dis{Path.GetExtension(ilFileName)}";
+        ildasmPsi.Arguments = $"-out={disasmIlFileName} {asmDllFileName}";
+    }
+}
diff --git a/tests/src/ilasm/System/Runtime/CompilerServices/MethodImplOptionsTests.csproj b/tests/src/ilasm/System/Runtime/CompilerServices/MethodImplOptionsTests.csproj
new file mode 100644 (file)
index 0000000..1d23bc3
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{1AFDD005-7AB9-48E0-B6D4-4DE0560C936D}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+  </PropertyGroup>
+  <!-- Default configurations to help VS understand the configurations -->
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+  </PropertyGroup>
+  <ItemGroup>
+    <Compile Include="MethodImplOptionsTests.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="MiAggressiveOptimization.il">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+</Project>
diff --git a/tests/src/ilasm/System/Runtime/CompilerServices/MiAggressiveOptimization.il b/tests/src/ilasm/System/Runtime/CompilerServices/MiAggressiveOptimization.il
new file mode 100644 (file)
index 0000000..077bdf9
--- /dev/null
@@ -0,0 +1,21 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+.assembly extern System.Runtime {}
+.assembly MiAggressiveOptimization {}
+.module MiAggressiveOptimization.dll
+// MVID: {B5A4E68E-19B7-4FA3-9BE2-2A0B7265233B}
+
+.class public abstract auto ansi sealed beforefieldinit Program
+       extends [System.Runtime]System.Object
+{
+  .method public hidebysig static void  Main() cil managed aggressiveoptimization
+  {
+    .entrypoint
+    // Code size       1 (0x1)
+    .maxstack  8
+    IL_0000:  ret
+  } // end of method Program::Main
+
+} // end of class Program