[Pkg-puppet-devel] [SCM] Puppet packaging for Debian branch, upstream, updated. 0.25.5-639-g8f94f35

test branch puppet-dev at googlegroups.com
Wed Jul 14 10:33:09 UTC 2010


The following commit has been merged in the upstream branch:
commit d61a69a0e5a87a95846a4d39115eac80e4984cac
Author: Luke Kanies <luke at puppetlabs.com>
Date:   Wed Apr 28 21:52:06 2010 -0700

    Fixing #3668 - fixed autoloading classes from modules
    
    This involved essentially moving all of the importing and loading
    code out of the Parser and into a new 'TypeLoader' class.
    
    The parser and the ResourceTypeCollection classes now delegate
    to that class for all file handling.  Most of the code paths are
    also now much cleaner, and a bit of redundancy was removed.
    
    Signed-off-by: Luke Kanies <luke at puppetlabs.com>

diff --git a/lib/puppet/parser/grammar.ra b/lib/puppet/parser/grammar.ra
index 5b9a609..e125e32 100644
--- a/lib/puppet/parser/grammar.ra
+++ b/lib/puppet/parser/grammar.ra
@@ -633,12 +633,11 @@ selectlhand:  name
             | regex
 
 # These are only used for importing, and we don't interpolate there.
-qtexts:       quotedtext { result = [val[0].value] }
-            | qtexts COMMA quotedtext {
-    results = val[0] << val[2].value
-}
+string:        STRING       { result = [val[0][:value]] }
+strings:       string
+            |  strings COMMA string { result = val[0] += val[2] }
 
-import: IMPORT qtexts {
+import: IMPORT strings {
     val[1].each do |file|
         import(file)
     end
diff --git a/lib/puppet/parser/parser.rb b/lib/puppet/parser/parser.rb
index 5fecc54..8937fe1 100644
--- a/lib/puppet/parser/parser.rb
+++ b/lib/puppet/parser/parser.rb
@@ -21,7 +21,7 @@ module Puppet
   module Parser
     class Parser < Racc::Parser
 
-module_eval(<<'...end grammar.ra/module_eval...', 'grammar.ra', 851)
+module_eval(<<'...end grammar.ra/module_eval...', 'grammar.ra', 850)
 
 # It got too annoying having code in a file that needs to be compiled.
 require 'puppet/parser/parser_support'
@@ -36,600 +36,606 @@ require 'puppet/parser/parser_support'
 ##### State transition tables begin ###
 
 racc_action_table = [
-    60,    65,    60,    65,    95,   120,    95,   215,    97,   186,
-    71,   113,   107,   186,   108,    46,   284,  -157,   324,    46,
-   185,    60,    65,   149,   185,   190,   325,   109,   153,   190,
-   121,    46,   287,    59,   280,    59,   314,    72,   132,    72,
-    75,    80,   279,    80,   277,   278,   130,   169,    68,   221,
-    77,   105,    77,    51,    59,   160,    53,    51,    72,    75,
-    53,    52,    80,    52,    60,    65,    66,    68,   215,    51,
-   238,    77,    53,   326,    60,    65,    52,   166,   170,   288,
-    52,   153,    52,   172,   156,   157,   158,   159,   161,   289,
-   166,   170,    52,    60,    65,    60,    65,   185,   277,   278,
-   290,    72,   236,   166,   170,    80,   186,   185,   222,    43,
-   130,    72,   236,   291,    77,    80,   243,   185,    41,    42,
-   130,   223,   190,   215,    77,    52,    59,   292,   185,   169,
-    72,    75,    72,   236,    80,    52,    80,   160,    66,    68,
-    34,   130,   186,    77,    36,    77,    60,    65,    60,    65,
-    95,    11,    97,   185,    52,   181,    52,   201,   190,   143,
-    60,    65,   202,  -158,    71,   172,   156,   157,   158,   159,
-   161,   232,   166,   170,    34,   230,   231,   267,    36,    59,
-   266,   294,    62,    72,    75,    11,   180,    80,    60,    65,
-    60,    65,    68,    59,   298,   320,    77,    72,    75,   282,
-  -159,    80,  -154,   230,   231,    66,    68,    52,    60,    65,
-    77,    34,    95,    34,    97,    36,   196,    36,   230,   347,
-   201,    52,    11,    16,    11,   202,   180,    60,    65,   302,
-    88,    95,   265,    97,    60,    65,   230,   264,    95,   196,
-    97,    59,   157,   158,   143,    72,    75,   166,   170,    80,
-   305,   157,   158,   107,    68,    93,   166,   170,    77,  -156,
-    59,    83,    60,    65,    72,    75,   308,    59,    80,    52,
-  -153,    72,    75,    68,   275,    80,  -155,    77,   277,   278,
-    68,    60,    65,   311,    77,    95,   153,    97,    52,   172,
-   156,   157,   158,   159,   161,    52,   166,   170,   152,   268,
-    60,    65,  -153,    88,    95,    52,    97,    60,    65,  -156,
-  -154,    95,   182,    97,    59,    52,   149,  -171,    72,    75,
-  -155,   146,    80,    43,  -157,    60,    65,    68,    93,    88,
-   183,    77,  -158,    59,    83,   317,   194,    72,    75,   318,
-    59,    80,    52,   196,    72,    75,    68,   143,    80,   199,
-    77,   200,   206,    68,    93,   209,   216,    77,   185,   108,
-    83,    52,    72,   236,   219,   337,    80,   113,    52,   110,
-   212,   130,    60,    65,  -155,    77,    95,    55,    97,    54,
-   172,   156,   157,   158,   216,    45,    52,   166,   170,   214,
-   317,    60,    65,   351,    88,    95,  -153,    97,    60,    65,
-   353,  -158,    95,  -155,    97,    59,  -153,  -156,  -154,    72,
-    75,   354,   216,    80,  -206,  -156,    60,    65,    68,    93,
-    88,   357,    77,   219,    59,    83,    37,   218,    72,    75,
-  -154,    59,    80,    52,   nil,    72,    75,    68,   nil,    80,
-   nil,    77,   nil,   nil,    68,    93,   nil,   nil,    77,   185,
-   nil,    83,    52,    72,   236,   nil,   nil,    80,   nil,    52,
-   nil,   nil,   130,    60,    65,   nil,    77,    95,   nil,    97,
-   nil,   172,   156,   157,   158,   159,   161,    52,   166,   170,
-   nil,    60,    65,   nil,   nil,    88,   nil,   nil,   323,   nil,
-   172,   156,   157,   158,   nil,   nil,    59,   166,   170,   nil,
-    72,    75,   nil,   nil,    80,   nil,   nil,   nil,   nil,    68,
-    93,    60,    65,    77,   185,    95,    83,    97,    72,   236,
-   nil,   nil,    80,   nil,    52,   nil,   nil,   130,   nil,   nil,
-   nil,    77,   nil,    88,   nil,   nil,   nil,    60,    65,   nil,
-   nil,    95,    52,    97,    59,   nil,   nil,   nil,    72,    75,
-   nil,   nil,    80,   nil,   nil,   nil,   nil,    68,    93,    60,
-    65,    77,   nil,    95,    83,    97,   nil,   nil,   nil,   nil,
-    59,   nil,    52,   nil,    72,    75,   nil,   nil,    80,   nil,
-   nil,    88,   nil,    68,   nil,    60,    65,    77,   nil,    95,
-   nil,    97,    59,   nil,   nil,   nil,    72,    75,    52,   nil,
-    80,   nil,   nil,   nil,   nil,    68,    93,    88,   nil,    77,
-   nil,   nil,    83,   nil,   nil,    60,    65,   nil,    59,    95,
-    52,    97,    72,    75,   nil,   nil,    80,   nil,   nil,   nil,
-   nil,    68,    93,   nil,   nil,    77,   nil,    88,    83,   nil,
-    60,    65,   nil,   nil,   nil,   nil,    52,   nil,    59,   nil,
+    60,    65,    60,    65,    95,   121,    95,   216,    97,   187,
+    71,   113,   108,   187,   109,    46,   285,   217,   281,    46,
+   186,    60,    65,   216,   186,   191,   280,   110,   154,   191,
+   122,    46,   144,    59,   325,    59,   154,    72,   133,    72,
+    75,    80,   326,    80,   278,   279,   131,   170,    68,   222,
+    77,   106,    77,    50,    59,   161,    53,    50,    72,    75,
+    53,    52,    80,    52,    60,    65,    66,    68,   150,    50,
+   239,    77,    53,   327,    60,    65,    52,   167,   171,   286,
+    52,   315,    52,   173,   157,   158,   159,   160,   162,   287,
+   167,   171,    52,    60,    65,    60,    65,   186,   278,   279,
+   223,    72,   237,   231,   348,    80,   187,   186,   289,    43,
+   131,    72,   237,   224,    77,    80,   244,   186,    41,    42,
+   131,   290,   191,   288,    77,    52,    59,   105,   186,   170,
+    72,    75,    72,   237,    80,    52,    80,   161,    66,    68,
+    34,   131,   187,    77,    36,    77,    60,    65,    60,    65,
+    95,    11,    97,   186,    52,   182,    52,   201,   191,  -157,
+    60,    65,   202,   293,    71,   173,   157,   158,   159,   160,
+   162,   283,   167,   171,    34,   231,   232,   268,    36,    59,
+   267,   296,    62,    72,    75,    11,   181,    80,    60,    65,
+   167,   171,    68,    59,  -155,   321,    77,    72,    75,   233,
+  -158,    80,   299,   231,   232,    66,    68,    52,    60,    65,
+    77,    34,    95,    34,    97,    36,  -159,    36,  -154,   197,
+   201,    52,    11,    16,    11,   202,   181,    60,    65,   303,
+    88,    95,   276,    97,    60,    65,   278,   279,    95,   197,
+    97,    59,   158,   159,   144,    72,    75,   167,   171,    80,
+   306,   108,  -156,   309,    68,    93,    88,  -153,    77,   269,
+    59,    83,   312,   154,    72,    75,   153,    59,    80,    52,
+  -153,    72,    75,    68,   266,    80,    52,    77,   231,   265,
+    68,    93,  -156,  -154,    77,    60,    65,    83,    52,    95,
+   183,    97,   158,   159,    52,    52,   184,   167,   171,   150,
+  -172,  -155,   147,    43,    60,    65,  -157,    88,    95,   195,
+    97,    60,    65,  -158,   318,    95,   197,    97,    59,   319,
+   200,   144,    72,    75,   206,   207,    80,   210,   213,    60,
+    65,    68,    93,   216,   109,    77,   220,    59,    83,   338,
+   113,    72,    75,   111,    59,    80,    52,  -155,    72,    75,
+    68,   105,    80,    55,    77,    54,   217,    68,    45,   215,
+   318,    77,   186,   352,  -153,    52,    72,   237,   354,  -158,
+    80,  -155,    52,  -153,  -156,   131,    60,    65,  -154,    77,
+    95,   355,    97,   217,   173,   157,   158,   159,  -207,  -156,
+    52,   167,   171,   358,   220,    60,    65,    37,    88,    95,
+   219,    97,    60,    65,  -154,   nil,    95,   nil,    97,    59,
+   nil,   nil,   nil,    72,    75,   nil,   nil,    80,   nil,   nil,
+    60,    65,    68,    93,    88,   nil,    77,   nil,    59,    83,
+   nil,   nil,    72,    75,   nil,    59,    80,    52,   nil,    72,
+    75,    68,   nil,    80,   nil,    77,   nil,   nil,    68,    93,
+   nil,   nil,    77,   186,   nil,    83,    52,    72,   237,   nil,
+   nil,    80,   nil,    52,   nil,   nil,   131,    60,    65,   nil,
+    77,    95,   nil,    97,   nil,   173,   157,   158,   159,   160,
+   162,    52,   167,   171,   nil,    60,    65,   nil,   nil,    88,
+   nil,   nil,   324,   nil,   173,   157,   158,   159,   nil,   nil,
+    59,   167,   171,   nil,    72,    75,   nil,   nil,    80,   nil,
+   nil,   nil,   nil,    68,    93,    60,    65,    77,   186,    95,
+    83,    97,    72,   237,   nil,   nil,    80,   nil,    52,   nil,
+   nil,   131,   nil,   nil,   nil,    77,   nil,    88,   nil,   nil,
+   nil,    60,    65,   nil,   nil,    95,    52,    97,    59,   nil,
    nil,   nil,    72,    75,   nil,   nil,    80,   nil,   nil,   nil,
-   nil,    68,    93,   144,   nil,    77,    60,    65,    83,   nil,
-    95,   nil,    97,    59,   nil,   nil,    52,    72,    75,   nil,
-   nil,    80,   nil,   nil,   nil,    66,    68,   nil,    88,   nil,
-    77,   nil,    60,    65,   nil,   nil,    95,   nil,    97,    59,
+   nil,    68,    93,    60,    65,    77,   nil,    95,    83,    97,
+   nil,   nil,   nil,   nil,    59,   nil,    52,   nil,    72,    75,
+   nil,   nil,    80,   nil,   nil,    88,   nil,    68,   nil,    60,
+    65,    77,   nil,    95,   nil,    97,    59,   nil,   nil,   nil,
+    72,    75,    52,   nil,    80,   nil,   nil,   nil,   nil,    68,
+    93,    88,   nil,    77,   nil,   nil,    83,   nil,   nil,    60,
+    65,   nil,    59,    95,    52,    97,    72,    75,   nil,   nil,
+    80,   nil,   nil,   nil,   nil,    68,    93,   nil,   nil,    77,
+   nil,    88,    83,   nil,    60,    65,   nil,   nil,   nil,   nil,
+    52,   nil,    59,   nil,   nil,   nil,    72,    75,   nil,   nil,
+    80,   nil,   nil,   nil,   nil,    68,    93,   145,   nil,    77,
+    60,    65,    83,   nil,    95,   nil,    97,    59,   nil,   nil,
+    52,    72,    75,   nil,   nil,    80,   nil,   nil,   nil,    66,
+    68,   nil,    88,   nil,    77,   nil,    60,    65,   nil,   nil,
+    95,   nil,    97,    59,   nil,    52,   nil,    72,    75,   nil,
+   nil,    80,   nil,   nil,   nil,   nil,    68,    93,    88,   nil,
+    77,    60,    65,    83,   nil,    95,   nil,    97,   nil,    59,
    nil,    52,   nil,    72,    75,   nil,   nil,    80,   nil,   nil,
-   nil,   nil,    68,    93,    88,   nil,    77,    60,    65,    83,
-   nil,    95,   nil,    97,   nil,    59,   nil,    52,   nil,    72,
-    75,   nil,   nil,    80,   nil,   nil,   nil,   nil,    68,    93,
-   nil,   nil,    77,    60,    65,    83,   nil,    95,   nil,    97,
-    59,   nil,   nil,    52,    72,    75,   nil,   nil,    80,   nil,
-   nil,   nil,   nil,    68,   nil,    88,   nil,    77,   nil,    60,
-    65,   nil,   nil,    95,   nil,    97,    59,   nil,    52,   nil,
-    72,    75,   nil,   nil,    80,   nil,   nil,    60,    65,    68,
-    93,    88,   nil,    77,    60,    65,    83,   nil,    95,   nil,
-    97,   nil,    59,   nil,    52,   nil,    72,    75,    60,    65,
-    80,   nil,    95,   nil,    97,    68,    93,   nil,   nil,    77,
-   185,   nil,    83,   nil,    72,   236,   nil,    59,    80,   nil,
-    52,    72,    75,   130,   nil,    80,   nil,    77,    60,    65,
-    68,    59,   nil,   nil,    77,    72,    75,   nil,    52,    80,
-   nil,   nil,   nil,   nil,    68,    52,    60,    65,    77,   nil,
-    95,   307,    97,   nil,   nil,   nil,   nil,   nil,   nil,    52,
-   nil,    59,   nil,   nil,   nil,    72,    75,   nil,    88,    80,
-   nil,    60,    65,    66,    68,    95,   nil,    97,    77,    59,
-   nil,   nil,   nil,    72,    75,   nil,   nil,    80,   nil,    52,
    nil,   nil,    68,    93,   nil,   nil,    77,    60,    65,    83,
    nil,    95,   nil,    97,    59,   nil,   nil,    52,    72,    75,
-   nil,   nil,    80,   nil,   nil,   nil,   nil,    68,    60,    65,
-   nil,    77,    95,   nil,    97,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,    80,   nil,   nil,   nil,   nil,    68,   nil,    88,
+   nil,    77,   nil,    60,    65,   nil,   nil,    95,   nil,    97,
     59,   nil,    52,   nil,    72,    75,   nil,   nil,    80,   nil,
-    88,   nil,   nil,    68,    60,    65,   nil,    77,    95,   nil,
-   nil,    59,   nil,   nil,   nil,    72,    75,   nil,    52,    80,
-   nil,   nil,   nil,   nil,    68,    93,    60,    65,    77,   nil,
-    95,    83,    97,   nil,   nil,   nil,   nil,    59,   nil,    52,
-   nil,    72,   236,   nil,   nil,    80,   nil,   nil,    88,   nil,
-   130,   nil,    60,    65,    77,   nil,    95,   nil,    97,    59,
-   nil,   nil,   nil,    72,    75,    52,   nil,    80,   nil,   nil,
-   nil,   nil,    68,    93,    88,   nil,    77,   nil,   nil,    83,
-   nil,   nil,    60,    65,   nil,    59,    95,    52,    97,    72,
-    75,   nil,   nil,    80,   nil,   nil,   nil,   nil,    68,    93,
-   nil,   nil,    77,   nil,    88,    83,   nil,   nil,    60,    65,
-   nil,   nil,    95,    52,    97,    59,   nil,   nil,   nil,    72,
-    75,   nil,   nil,    80,   nil,   nil,    60,    65,    68,    93,
-    88,   nil,    77,   nil,   nil,    83,   nil,   nil,   nil,   nil,
-   nil,    59,   nil,    52,   nil,    72,    75,   nil,   nil,    80,
-   nil,   nil,   nil,   nil,    68,    93,    60,    65,    77,   185,
-    95,    83,    97,    72,   236,   171,   nil,    80,   nil,    52,
-   nil,   nil,   130,   nil,   164,   169,    77,   nil,    88,   nil,
-   nil,   nil,   nil,   160,   162,   165,   168,    52,   nil,    59,
-   nil,   nil,   nil,    72,    75,    60,    65,    80,   nil,    95,
-   174,    97,    68,    93,   nil,   nil,    77,   163,   167,    83,
-   nil,   172,   156,   157,   158,   159,   161,    52,   166,   170,
-    60,    65,   nil,   nil,    95,   nil,    97,   nil,    59,   nil,
-   nil,   nil,    72,    75,   nil,   nil,    80,   nil,   nil,   nil,
-   nil,    68,    88,   nil,   nil,    77,    60,    65,   nil,   nil,
-    95,   nil,    97,    59,   nil,   nil,    52,    72,    75,   nil,
+   nil,    60,    65,    68,    93,    88,   nil,    77,    60,    65,
+    83,   nil,    95,   nil,    97,   nil,    59,   nil,    52,   nil,
+    72,    75,    60,    65,    80,   nil,    95,   nil,    97,    68,
+    93,   nil,   nil,    77,   186,   nil,    83,   nil,    72,   237,
+   nil,    59,    80,   nil,    52,    72,    75,   131,   nil,    80,
+   nil,    77,    60,    65,    68,    59,   nil,   nil,    77,    72,
+    75,   nil,    52,    80,   nil,   nil,   nil,   nil,    68,    52,
+    60,    65,    77,   nil,    95,   308,    97,   nil,   nil,   nil,
+   nil,   nil,   nil,    52,   nil,    59,   nil,   nil,   nil,    72,
+    75,   nil,    88,    80,   nil,    60,    65,    66,    68,    95,
+   nil,    97,    77,    59,   nil,   nil,   nil,    72,    75,   nil,
+   nil,    80,   nil,    52,   nil,   nil,    68,    93,   nil,   nil,
+    77,    60,    65,    83,   nil,    95,   nil,    97,    59,   nil,
+   nil,    52,    72,    75,   nil,   nil,    80,   nil,   nil,   nil,
+   nil,    68,    60,    65,   nil,    77,    95,   nil,    97,   nil,
+   nil,   nil,   nil,   nil,    59,   nil,    52,   nil,    72,    75,
+   nil,   nil,    80,   nil,    88,   nil,   nil,    68,    60,    65,
+   nil,    77,    95,   nil,   nil,    59,   nil,   nil,   nil,    72,
+    75,   nil,    52,    80,   nil,   nil,   nil,   nil,    68,    93,
+    60,    65,    77,   nil,    95,    83,    97,   nil,   nil,   nil,
+   nil,    59,   nil,    52,   nil,    72,   237,   nil,   nil,    80,
+   nil,   nil,    88,   nil,   131,   nil,    60,    65,    77,   nil,
+    95,   nil,    97,    59,   nil,   nil,   nil,    72,    75,    52,
    nil,    80,   nil,   nil,   nil,   nil,    68,    93,    88,   nil,
-    77,   nil,   nil,    83,   nil,   nil,   nil,   nil,   nil,    59,
-   nil,    52,   nil,    72,    75,   nil,   nil,    80,   226,   227,
-   nil,   nil,    68,    93,   nil,   nil,    77,   nil,   nil,    83,
-   nil,   164,   169,   nil,   nil,   nil,   nil,    52,   nil,   nil,
-   160,   162,   165,   168,   164,   169,   nil,   nil,   nil,   nil,
-   nil,   nil,   245,   160,   162,   165,   168,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   163,   167,   nil,   nil,   172,   156,
-   157,   158,   159,   161,   nil,   166,   170,   163,   167,   nil,
-   nil,   172,   156,   157,   158,   159,   161,   nil,   166,   170,
-   164,   169,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   160,
-   162,   165,   168,   164,   169,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   160,   162,   165,   168,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   163,   167,   nil,   nil,   172,   156,   157,
-   158,   159,   161,   nil,   166,   170,   163,   167,   nil,   nil,
-   172,   156,   157,   158,   159,   161,   nil,   166,   170,   164,
-   169,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   160,   162,
-   165,   168,   164,   169,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   160,   162,   165,   168,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   167,   nil,   nil,   172,   156,   157,   158,
-   159,   161,   nil,   166,   170,   nil,   nil,   nil,   nil,   172,
-   156,   157,   158,   159,   161,   nil,   166,   170,   164,   169,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   160,   162,   165,
-   168,   169,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   160,
-   169,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   160,   nil,
-   nil,   163,   167,   nil,   nil,   172,   156,   157,   158,   159,
-   161,   nil,   166,   170,   262,   nil,   nil,   172,   156,   157,
-   158,   159,   161,   nil,   166,   170,   172,   156,   157,   158,
-   159,   161,   nil,   166,   170,    26,   338,    30,     1,   nil,
-     8,    12,   nil,    19,   nil,    24,   nil,    28,   nil,     2,
-   nil,   nil,    11,    16,   nil,   315,   nil,    26,   nil,    30,
-     1,   nil,     8,    12,   nil,    19,   nil,    24,   nil,    28,
-   nil,     2,   nil,   nil,    11,    16,    26,   343,    30,     1,
-   nil,     8,    12,   nil,    19,   nil,    24,   nil,    28,   nil,
-     2,   nil,   nil,    11,    16,   nil,   344,   nil,    26,   nil,
-    30,     1,   nil,     8,    12,   nil,    19,   nil,    24,   nil,
-    28,   nil,     2,   nil,   nil,    11,    16,    26,   297,    30,
-     1,   nil,     8,    12,   nil,    19,   nil,    24,   nil,    28,
-   nil,     2,   nil,   nil,    11,    16,   nil,   355,   nil,    26,
-   nil,    30,     1,   nil,     8,    12,   nil,    19,   nil,    24,
-   nil,    28,   nil,     2,   nil,   nil,    11,    16,    26,   359,
-    30,     1,   nil,     8,    12,   nil,    19,   nil,    24,   nil,
-    28,   nil,     2,   nil,   nil,    11,    16,   nil,   361,   nil,
-    26,   nil,    30,     1,   nil,     8,    12,   nil,    19,   nil,
-    24,   nil,    28,   nil,     2,   nil,   nil,    11,    16,    26,
-   286,    30,     1,   nil,     8,    12,   nil,    19,   nil,    24,
-   nil,    28,   nil,     2,   nil,   nil,    11,    16,   nil,   362,
+    77,   nil,   nil,    83,   nil,   nil,    60,    65,   nil,    59,
+    95,    52,    97,    72,    75,   nil,   nil,    80,   nil,   nil,
+   nil,   nil,    68,    93,   nil,   nil,    77,   nil,    88,    83,
+   nil,   nil,    60,    65,   nil,   nil,    95,    52,    97,    59,
+   nil,   nil,   nil,    72,    75,   nil,   nil,    80,   nil,   nil,
+    60,    65,    68,    93,    88,   nil,    77,   nil,   nil,    83,
+   nil,   nil,   nil,   nil,   nil,    59,   nil,    52,   nil,    72,
+    75,   nil,   nil,    80,   nil,   nil,   nil,   nil,    68,    93,
+    60,    65,    77,   186,    95,    83,    97,    72,   237,   172,
+   nil,    80,   nil,    52,   nil,   nil,   131,   nil,   165,   170,
+    77,   nil,    88,   nil,   nil,   nil,   nil,   161,   163,   166,
+   169,    52,   nil,    59,   nil,   nil,   nil,    72,    75,    60,
+    65,    80,   nil,    95,   175,    97,    68,    93,   nil,   nil,
+    77,   164,   168,    83,   nil,   173,   157,   158,   159,   160,
+   162,    52,   167,   171,    60,    65,   nil,   nil,    95,   nil,
+    97,   nil,    59,   nil,   nil,   nil,    72,    75,   nil,   nil,
+    80,   nil,   nil,   nil,   nil,    68,    88,   nil,   nil,    77,
+    60,    65,   nil,   nil,    95,   nil,    97,    59,   nil,   nil,
+    52,    72,    75,   nil,   nil,    80,   nil,   nil,   nil,   nil,
+    68,    93,    88,   nil,    77,   nil,   nil,    83,   nil,   nil,
+   nil,   nil,   nil,    59,   nil,    52,   nil,    72,    75,   nil,
+   nil,    80,   227,   228,   nil,   nil,    68,    93,   nil,   nil,
+    77,   nil,   nil,    83,   nil,   165,   170,   nil,   nil,   nil,
+   nil,    52,   nil,   nil,   161,   163,   166,   169,   165,   170,
+   nil,   nil,   nil,   nil,   nil,   nil,   246,   161,   163,   166,
+   169,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   164,   168,
+   nil,   nil,   173,   157,   158,   159,   160,   162,   nil,   167,
+   171,   164,   168,   nil,   nil,   173,   157,   158,   159,   160,
+   162,   nil,   167,   171,   165,   170,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   161,   163,   166,   169,   165,   170,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   161,   163,   166,   169,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   164,   168,   nil,
+   nil,   173,   157,   158,   159,   160,   162,   nil,   167,   171,
+   164,   168,   nil,   nil,   173,   157,   158,   159,   160,   162,
+   nil,   167,   171,   165,   170,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   161,   163,   166,   169,   165,   170,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   161,   163,   166,   169,   nil,
+   nil,   173,   157,   158,   159,   160,   162,   168,   167,   171,
+   173,   157,   158,   159,   160,   162,   nil,   167,   171,   nil,
+   nil,   nil,   nil,   173,   157,   158,   159,   160,   162,   nil,
+   167,   171,   165,   170,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   161,   163,   166,   169,   170,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   161,   170,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   161,   nil,   nil,   164,   168,   nil,   nil,   173,
+   157,   158,   159,   160,   162,   nil,   167,   171,   263,   nil,
+   nil,   173,   157,   158,   159,   160,   162,   nil,   167,   171,
+   173,   157,   158,   159,   160,   162,   nil,   167,   171,    26,
+   342,    30,     1,   nil,     8,    12,   nil,    19,   nil,    24,
+   nil,    28,   nil,     2,   nil,   nil,    11,    16,   nil,   316,
    nil,    26,   nil,    30,     1,   nil,     8,    12,   nil,    19,
    nil,    24,   nil,    28,   nil,     2,   nil,   nil,    11,    16,
-    26,   363,    30,     1,   nil,     8,    12,   nil,    19,   nil,
+    26,   344,    30,     1,   nil,     8,    12,   nil,    19,   nil,
     24,   nil,    28,   nil,     2,   nil,   nil,    11,    16,   nil,
-   nil,   nil,    26,   nil,    30,     1,   nil,     8,    12,   nil,
+   345,   nil,    26,   nil,    30,     1,   nil,     8,    12,   nil,
     19,   nil,    24,   nil,    28,   nil,     2,   nil,   nil,    11,
-    16,    26,   nil,    30,     1,   nil,     8,    12,   nil,    19,
+    16,    26,   298,    30,     1,   nil,     8,    12,   nil,    19,
    nil,    24,   nil,    28,   nil,     2,   nil,   nil,    11,    16,
-    26,   nil,    30,     1,   nil,     8,    12,   nil,    19,   nil,
-    24,   nil,    28,   nil,     2,   nil,   nil,    11,    16 ]
+   nil,   356,   nil,    26,   nil,    30,     1,   nil,     8,    12,
+   nil,    19,   nil,    24,   nil,    28,   nil,     2,   nil,   nil,
+    11,    16,    26,   360,    30,     1,   nil,     8,    12,   nil,
+    19,   nil,    24,   nil,    28,   nil,     2,   nil,   nil,    11,
+    16,   nil,   362,   nil,    26,   nil,    30,     1,   nil,     8,
+    12,   nil,    19,   nil,    24,   nil,    28,   nil,     2,   nil,
+   nil,    11,    16,    26,   292,    30,     1,   nil,     8,    12,
+   nil,    19,   nil,    24,   nil,    28,   nil,     2,   nil,   nil,
+    11,    16,   nil,   363,   nil,    26,   nil,    30,     1,   nil,
+     8,    12,   nil,    19,   nil,    24,   nil,    28,   nil,     2,
+   nil,   nil,    11,    16,    26,   364,    30,     1,   nil,     8,
+    12,   nil,    19,   nil,    24,   nil,    28,   nil,     2,   nil,
+   nil,    11,    16,   nil,   nil,   nil,    26,   nil,    30,     1,
+   nil,     8,    12,   nil,    19,   nil,    24,   nil,    28,   nil,
+     2,   nil,   nil,    11,    16,    26,   nil,    30,     1,   nil,
+     8,    12,   nil,    19,   nil,    24,   nil,    28,   nil,     2,
+   nil,   nil,    11,    16,    26,   nil,    30,     1,   nil,     8,
+    12,   nil,    19,   nil,    24,   nil,    28,   nil,     2,   nil,
+   nil,    11,    16 ]
 
 racc_action_check = [
-    54,    54,   146,   146,    54,    48,   146,   143,   146,   105,
-    75,    44,    31,   276,    31,    19,   198,    86,   271,   121,
-   105,   149,   149,   244,   276,   105,   271,    31,    75,   276,
-    48,   120,   201,    54,   191,   146,   244,    54,    54,   146,
-   146,    54,   191,   146,   198,   198,    54,   255,   146,   143,
-    54,    31,   146,    19,   149,   255,    19,   121,   149,   149,
-   121,    54,   149,   146,   152,   152,   149,   149,   132,   120,
-   152,   149,   120,   274,   348,   348,    19,   248,   248,   202,
-   121,   132,   149,   255,   255,   255,   255,   255,   255,   203,
-   255,   255,   120,   153,   153,   324,   324,   152,   274,   274,
-   204,   152,   152,   247,   247,   152,   186,   348,   145,     8,
-   152,   348,   348,   204,   152,   348,   153,   186,     8,     8,
-   348,   145,   186,   196,   348,   152,   153,   208,   324,   258,
-   153,   153,   324,   324,   153,   348,   324,   258,   153,   153,
-    12,   324,   109,   153,    12,   324,   311,   311,    97,    97,
-   311,    12,   311,   109,   153,    97,   324,   113,   109,   194,
-    24,    24,   113,    85,    24,   258,   258,   258,   258,   258,
-   258,   151,   258,   258,   209,   151,   151,   176,   209,   311,
-   176,   209,    24,   311,   311,   209,    97,   311,   266,   266,
-    30,    30,   311,    24,   213,   266,   311,    24,    24,   195,
-    84,    24,    82,   195,   195,    24,    24,   311,    26,    26,
-    24,     5,    26,     1,    26,     5,   216,     1,   313,   313,
-   290,    24,     5,     5,     1,   290,   266,    28,    28,   217,
-    26,    28,   175,    28,   288,   288,   175,   175,   288,   218,
-   288,    26,   246,   246,   219,    26,    26,   246,   246,    26,
-   220,   263,   263,    81,    26,    26,   263,   263,    26,    79,
-    28,    26,   183,   183,    28,    28,   224,   288,    28,    26,
-    78,   288,   288,    28,   187,   288,    91,    28,   187,   187,
-   288,   156,   156,   235,   288,   156,   236,   156,    28,   250,
-   250,   250,   250,   250,   250,   288,   250,   250,    74,   178,
-   287,   287,    98,   156,   287,   170,   287,   157,   157,    99,
-   101,   157,   102,   157,   156,   166,    70,    68,   156,   156,
-    67,    63,   156,    59,    58,   280,   280,   156,   156,   157,
-   103,   156,    57,   287,   156,   262,   106,   287,   287,   264,
-   157,   287,   156,   108,   157,   157,   287,    55,   157,   110,
-   287,   112,   116,   157,   157,   117,   197,   157,   280,    40,
-   157,   287,   280,   280,   281,   283,   280,    35,   157,    33,
-   122,   280,    41,    41,   127,   280,    41,    23,    41,    20,
-   251,   251,   251,   251,   303,    13,   280,   251,   251,   131,
-   315,    43,    43,   317,    41,    43,   133,    43,    42,    42,
-   325,   328,    42,   330,    42,    41,   331,   333,   334,    41,
-    41,   336,   134,    41,   347,   135,   279,   279,    41,    41,
-    42,   349,    41,   139,    43,    41,     2,   138,    43,    43,
-   137,    42,    43,    41,   nil,    42,    42,    43,   nil,    42,
-   nil,    43,   nil,   nil,    42,    42,   nil,   nil,    42,   279,
-   nil,    42,    43,   279,   279,   nil,   nil,   279,   nil,    42,
-   nil,   nil,   279,    45,    45,   nil,   279,    45,   nil,    45,
-   nil,   259,   259,   259,   259,   259,   259,   279,   259,   259,
-   nil,   269,   269,   nil,   nil,    45,   nil,   nil,   269,   nil,
-   249,   249,   249,   249,   nil,   nil,    45,   249,   249,   nil,
-    45,    45,   nil,   nil,    45,   nil,   nil,   nil,   nil,    45,
-    45,   158,   158,    45,   269,   158,    45,   158,   269,   269,
-   nil,   nil,   269,   nil,    45,   nil,   nil,   269,   nil,   nil,
-   nil,   269,   nil,   158,   nil,   nil,   nil,   268,   268,   nil,
-   nil,   268,   269,   268,   158,   nil,   nil,   nil,   158,   158,
-   nil,   nil,   158,   nil,   nil,   nil,   nil,   158,   158,   159,
-   159,   158,   nil,   159,   158,   159,   nil,   nil,   nil,   nil,
-   268,   nil,   158,   nil,   268,   268,   nil,   nil,   268,   nil,
-   nil,   159,   nil,   268,   nil,   160,   160,   268,   nil,   160,
-   nil,   160,   159,   nil,   nil,   nil,   159,   159,   268,   nil,
-   159,   nil,   nil,   nil,   nil,   159,   159,   160,   nil,   159,
-   nil,   nil,   159,   nil,   nil,   161,   161,   nil,   160,   161,
-   159,   161,   160,   160,   nil,   nil,   160,   nil,   nil,   nil,
-   nil,   160,   160,   nil,   nil,   160,   nil,   161,   160,   nil,
-    62,    62,   nil,   nil,   nil,   nil,   160,   nil,   161,   nil,
-   nil,   nil,   161,   161,   nil,   nil,   161,   nil,   nil,   nil,
-   nil,   161,   161,    62,   nil,   161,   162,   162,   161,   nil,
-   162,   nil,   162,    62,   nil,   nil,   161,    62,    62,   nil,
-   nil,    62,   nil,   nil,   nil,    62,    62,   nil,   162,   nil,
-    62,   nil,    65,    65,   nil,   nil,    65,   nil,    65,   162,
-   nil,    62,   nil,   162,   162,   nil,   nil,   162,   nil,   nil,
-   nil,   nil,   162,   162,    65,   nil,   162,   107,   107,   162,
-   nil,   107,   nil,   107,   nil,    65,   nil,   162,   nil,    65,
-    65,   nil,   nil,    65,   nil,   nil,   nil,   nil,    65,    65,
-   nil,   nil,    65,   163,   163,    65,   nil,   163,   nil,   163,
-   107,   nil,   nil,    65,   107,   107,   nil,   nil,   107,   nil,
-   nil,   nil,   nil,   107,   nil,   163,   nil,   107,   nil,   169,
-   169,   nil,   nil,   169,   nil,   169,   163,   nil,   107,   nil,
-   163,   163,   nil,   nil,   163,   nil,   nil,   238,   238,   163,
-   163,   169,   nil,   163,    71,    71,   163,   nil,    71,   nil,
-    71,   nil,   169,   nil,   163,   nil,   169,   169,   233,   233,
-   169,   nil,   233,   nil,   233,   169,   169,   nil,   nil,   169,
-   238,   nil,   169,   nil,   238,   238,   nil,    71,   238,   nil,
-   169,    71,    71,   238,   nil,    71,   nil,   238,   222,   222,
-    71,   233,   nil,   nil,    71,   233,   233,   nil,   238,   233,
-   nil,   nil,   nil,   nil,   233,    71,   226,   226,   233,   nil,
-   226,   222,   226,   nil,   nil,   nil,   nil,   nil,   nil,   233,
-   nil,   222,   nil,   nil,   nil,   222,   222,   nil,   226,   222,
-   nil,   221,   221,   222,   222,   221,   nil,   221,   222,   226,
-   nil,   nil,   nil,   226,   226,   nil,   nil,   226,   nil,   222,
-   nil,   nil,   226,   226,   nil,   nil,   226,   215,   215,   226,
-   nil,   215,   nil,   215,   221,   nil,   nil,   226,   221,   221,
-   nil,   nil,   221,   nil,   nil,   nil,   nil,   221,    83,    83,
-   nil,   221,    83,   nil,    83,   nil,   nil,   nil,   nil,   nil,
-   215,   nil,   221,   nil,   215,   215,   nil,   nil,   215,   nil,
-    83,   nil,   nil,   215,   214,   214,   nil,   215,   214,   nil,
-   nil,    83,   nil,   nil,   nil,    83,    83,   nil,   215,    83,
-   nil,   nil,   nil,   nil,    83,    83,   165,   165,    83,   nil,
-   165,    83,   165,   nil,   nil,   nil,   nil,   214,   nil,    83,
-   nil,   214,   214,   nil,   nil,   214,   nil,   nil,   165,   nil,
-   214,   nil,   167,   167,   214,   nil,   167,   nil,   167,   165,
-   nil,   nil,   nil,   165,   165,   214,   nil,   165,   nil,   nil,
-   nil,   nil,   165,   165,   167,   nil,   165,   nil,   nil,   165,
-   nil,   nil,    88,    88,   nil,   167,    88,   165,    88,   167,
-   167,   nil,   nil,   167,   nil,   nil,   nil,   nil,   167,   167,
-   nil,   nil,   167,   nil,    88,   167,   nil,   nil,   168,   168,
-   nil,   nil,   168,   167,   168,    88,   nil,   nil,   nil,    88,
-    88,   nil,   nil,    88,   nil,   nil,   182,   182,    88,    88,
-   168,   nil,    88,   nil,   nil,    88,   nil,   nil,   nil,   nil,
-   nil,   168,   nil,    88,   nil,   168,   168,   nil,   nil,   168,
-   nil,   nil,   nil,   nil,   168,   168,    93,    93,   168,   182,
-    93,   168,    93,   182,   182,    89,   nil,   182,   nil,   168,
-   nil,   nil,   182,   nil,    89,    89,   182,   nil,    93,   nil,
-   nil,   nil,   nil,    89,    89,    89,    89,   182,   nil,    93,
-   nil,   nil,   nil,    93,    93,    95,    95,    93,   nil,    95,
-    95,    95,    93,    93,   nil,   nil,    93,    89,    89,    93,
-   nil,    89,    89,    89,    89,    89,    89,    93,    89,    89,
-   172,   172,   nil,   nil,   172,   nil,   172,   nil,    95,   nil,
-   nil,   nil,    95,    95,   nil,   nil,    95,   nil,   nil,   nil,
-   nil,    95,   172,   nil,   nil,    95,   164,   164,   nil,   nil,
-   164,   nil,   164,   172,   nil,   nil,    95,   172,   172,   nil,
-   nil,   172,   nil,   nil,   nil,   nil,   172,   172,   164,   nil,
-   172,   nil,   nil,   172,   nil,   nil,   nil,   nil,   nil,   164,
-   nil,   172,   nil,   164,   164,   nil,   nil,   164,   148,   148,
-   nil,   nil,   164,   164,   nil,   nil,   164,   nil,   nil,   164,
-   nil,   148,   148,   nil,   nil,   nil,   nil,   164,   nil,   nil,
-   148,   148,   148,   148,   155,   155,   nil,   nil,   nil,   nil,
-   nil,   nil,   155,   155,   155,   155,   155,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   148,   148,   nil,   nil,   148,   148,
-   148,   148,   148,   148,   nil,   148,   148,   155,   155,   nil,
-   nil,   155,   155,   155,   155,   155,   155,   nil,   155,   155,
-   114,   114,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   114,
-   114,   114,   114,   118,   118,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   118,   118,   118,   118,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   114,   114,   nil,   nil,   114,   114,   114,
-   114,   114,   114,   nil,   114,   114,   118,   118,   nil,   nil,
-   118,   118,   118,   118,   118,   118,   nil,   118,   118,   253,
-   253,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   253,   253,
-   253,   253,   257,   257,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   257,   257,   257,   257,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   253,   nil,   nil,   253,   253,   253,   253,
-   253,   253,   nil,   253,   253,   nil,   nil,   nil,   nil,   257,
-   257,   257,   257,   257,   257,   nil,   257,   257,   115,   115,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   115,   115,   115,
-   115,   254,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   254,
-   252,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   252,   nil,
-   nil,   115,   115,   nil,   nil,   115,   115,   115,   115,   115,
-   115,   nil,   115,   115,   171,   nil,   nil,   254,   254,   254,
-   254,   254,   254,   nil,   254,   254,   252,   252,   252,   252,
-   252,   252,   nil,   252,   252,   171,   285,   171,   171,   nil,
-   171,   171,   nil,   171,   nil,   171,   nil,   171,   nil,   171,
-   nil,   nil,   171,   171,   nil,   261,   nil,   285,   nil,   285,
-   285,   nil,   285,   285,   nil,   285,   nil,   285,   nil,   285,
-   nil,   285,   nil,   nil,   285,   285,   261,   292,   261,   261,
-   nil,   261,   261,   nil,   261,   nil,   261,   nil,   261,   nil,
-   261,   nil,   nil,   261,   261,   nil,   296,   nil,   292,   nil,
-   292,   292,   nil,   292,   292,   nil,   292,   nil,   292,   nil,
-   292,   nil,   292,   nil,   nil,   292,   292,   296,   212,   296,
-   296,   nil,   296,   296,   nil,   296,   nil,   296,   nil,   296,
-   nil,   296,   nil,   nil,   296,   296,   nil,   342,   nil,   212,
-   nil,   212,   212,   nil,   212,   212,   nil,   212,   nil,   212,
-   nil,   212,   nil,   212,   nil,   nil,   212,   212,   342,   351,
-   342,   342,   nil,   342,   342,   nil,   342,   nil,   342,   nil,
-   342,   nil,   342,   nil,   nil,   342,   342,   nil,   353,   nil,
-   351,   nil,   351,   351,   nil,   351,   351,   nil,   351,   nil,
-   351,   nil,   351,   nil,   351,   nil,   nil,   351,   351,   353,
-   200,   353,   353,   nil,   353,   353,   nil,   353,   nil,   353,
-   nil,   353,   nil,   353,   nil,   nil,   353,   353,   nil,   358,
-   nil,   200,   nil,   200,   200,   nil,   200,   200,   nil,   200,
-   nil,   200,   nil,   200,   nil,   200,   nil,   nil,   200,   200,
-   358,   360,   358,   358,   nil,   358,   358,   nil,   358,   nil,
-   358,   nil,   358,   nil,   358,   nil,   nil,   358,   358,   nil,
-   nil,   nil,   360,   nil,   360,   360,   nil,   360,   360,   nil,
-   360,   nil,   360,   nil,   360,   nil,   360,   nil,   nil,   360,
-   360,     4,   nil,     4,     4,   nil,     4,     4,   nil,     4,
-   nil,     4,   nil,     4,   nil,     4,   nil,   nil,     4,     4,
-     0,   nil,     0,     0,   nil,     0,     0,   nil,     0,   nil,
-     0,   nil,     0,   nil,     0,   nil,   nil,     0,     0 ]
+    54,    54,   147,   147,    54,    48,   147,   144,   147,   110,
+    75,    44,    31,   106,    31,    19,   199,   198,   192,   122,
+   110,   150,   150,   133,   106,   110,   192,    31,    75,   106,
+    48,   121,   195,    54,   272,   147,   133,    54,    54,   147,
+   147,    54,   272,   147,   199,   199,    54,   256,   147,   144,
+    54,    31,   147,    19,   150,   256,    19,   122,   150,   150,
+   122,    54,   150,   147,   153,   153,   150,   150,   245,   121,
+   153,   150,   121,   275,   349,   349,    19,   249,   249,   201,
+   122,   245,   150,   256,   256,   256,   256,   256,   256,   202,
+   256,   256,   121,   154,   154,   325,   325,   153,   275,   275,
+   146,   153,   153,   314,   314,   153,   187,   349,   204,     8,
+   153,   349,   349,   146,   153,   349,   154,   187,     8,     8,
+   349,   204,   187,   203,   349,   153,   154,   184,   325,   259,
+   154,   154,   325,   325,   154,   349,   325,   259,   154,   154,
+    12,   325,   277,   154,    12,   325,   312,   312,    97,    97,
+   312,    12,   312,   277,   154,    97,   325,   113,   277,    86,
+    24,    24,   113,   209,    24,   259,   259,   259,   259,   259,
+   259,   196,   259,   259,   210,   196,   196,   177,   210,   312,
+   177,   210,    24,   312,   312,   210,    97,   312,   267,   267,
+   248,   248,   312,    24,    91,   267,   312,    24,    24,   152,
+    85,    24,   214,   152,   152,    24,    24,   312,    26,    26,
+    24,     5,    26,     1,    26,     5,    84,     1,    82,   217,
+   289,    24,     5,     5,     1,   289,   267,    28,    28,   218,
+    26,    28,   188,    28,   157,   157,   188,   188,   157,   219,
+   157,    26,   247,   247,   220,    26,    26,   247,   247,    26,
+   221,    81,    79,   225,    26,    26,   157,    78,    26,   180,
+    28,    26,   236,   237,    28,    28,    74,   157,    28,    26,
+    98,   157,   157,    28,   176,   157,   171,    28,   176,   176,
+   157,   157,    99,   101,   157,   158,   158,   157,    28,   158,
+   102,   158,   264,   264,   167,   157,   104,   264,   264,    70,
+    68,    67,    63,    59,   287,   287,    58,   158,   287,   107,
+   287,   286,   286,    57,   263,   286,   109,   286,   158,   265,
+   111,    55,   158,   158,   114,   117,   158,   118,   123,   281,
+   281,   158,   158,   197,    40,   158,   282,   287,   158,   284,
+    35,   287,   287,    33,   286,   287,   158,   128,   286,   286,
+   287,    30,   286,    23,   287,    20,   304,   286,    13,   132,
+   316,   286,   281,   318,   134,   287,   281,   281,   326,   329,
+   281,   331,   286,   332,   334,   281,    41,    41,   335,   281,
+    41,   337,    41,   135,   252,   252,   252,   252,   348,   136,
+   281,   252,   252,   350,   140,    43,    43,     2,    41,    43,
+   139,    43,    42,    42,   138,   nil,    42,   nil,    42,    41,
+   nil,   nil,   nil,    41,    41,   nil,   nil,    41,   nil,   nil,
+   280,   280,    41,    41,    42,   nil,    41,   nil,    43,    41,
+   nil,   nil,    43,    43,   nil,    42,    43,    41,   nil,    42,
+    42,    43,   nil,    42,   nil,    43,   nil,   nil,    42,    42,
+   nil,   nil,    42,   280,   nil,    42,    43,   280,   280,   nil,
+   nil,   280,   nil,    42,   nil,   nil,   280,    45,    45,   nil,
+   280,    45,   nil,    45,   nil,   251,   251,   251,   251,   251,
+   251,   280,   251,   251,   nil,   270,   270,   nil,   nil,    45,
+   nil,   nil,   270,   nil,   250,   250,   250,   250,   nil,   nil,
+    45,   250,   250,   nil,    45,    45,   nil,   nil,    45,   nil,
+   nil,   nil,   nil,    45,    45,   159,   159,    45,   270,   159,
+    45,   159,   270,   270,   nil,   nil,   270,   nil,    45,   nil,
+   nil,   270,   nil,   nil,   nil,   270,   nil,   159,   nil,   nil,
+   nil,   269,   269,   nil,   nil,   269,   270,   269,   159,   nil,
+   nil,   nil,   159,   159,   nil,   nil,   159,   nil,   nil,   nil,
+   nil,   159,   159,   160,   160,   159,   nil,   160,   159,   160,
+   nil,   nil,   nil,   nil,   269,   nil,   159,   nil,   269,   269,
+   nil,   nil,   269,   nil,   nil,   160,   nil,   269,   nil,   161,
+   161,   269,   nil,   161,   nil,   161,   160,   nil,   nil,   nil,
+   160,   160,   269,   nil,   160,   nil,   nil,   nil,   nil,   160,
+   160,   161,   nil,   160,   nil,   nil,   160,   nil,   nil,   162,
+   162,   nil,   161,   162,   160,   162,   161,   161,   nil,   nil,
+   161,   nil,   nil,   nil,   nil,   161,   161,   nil,   nil,   161,
+   nil,   162,   161,   nil,    62,    62,   nil,   nil,   nil,   nil,
+   161,   nil,   162,   nil,   nil,   nil,   162,   162,   nil,   nil,
+   162,   nil,   nil,   nil,   nil,   162,   162,    62,   nil,   162,
+   163,   163,   162,   nil,   163,   nil,   163,    62,   nil,   nil,
+   162,    62,    62,   nil,   nil,    62,   nil,   nil,   nil,    62,
+    62,   nil,   163,   nil,    62,   nil,    65,    65,   nil,   nil,
+    65,   nil,    65,   163,   nil,    62,   nil,   163,   163,   nil,
+   nil,   163,   nil,   nil,   nil,   nil,   163,   163,    65,   nil,
+   163,   108,   108,   163,   nil,   108,   nil,   108,   nil,    65,
+   nil,   163,   nil,    65,    65,   nil,   nil,    65,   nil,   nil,
+   nil,   nil,    65,    65,   nil,   nil,    65,   164,   164,    65,
+   nil,   164,   nil,   164,   108,   nil,   nil,    65,   108,   108,
+   nil,   nil,   108,   nil,   nil,   nil,   nil,   108,   nil,   164,
+   nil,   108,   nil,   170,   170,   nil,   nil,   170,   nil,   170,
+   164,   nil,   108,   nil,   164,   164,   nil,   nil,   164,   nil,
+   nil,   239,   239,   164,   164,   170,   nil,   164,    71,    71,
+   164,   nil,    71,   nil,    71,   nil,   170,   nil,   164,   nil,
+   170,   170,   234,   234,   170,   nil,   234,   nil,   234,   170,
+   170,   nil,   nil,   170,   239,   nil,   170,   nil,   239,   239,
+   nil,    71,   239,   nil,   170,    71,    71,   239,   nil,    71,
+   nil,   239,   223,   223,    71,   234,   nil,   nil,    71,   234,
+   234,   nil,   239,   234,   nil,   nil,   nil,   nil,   234,    71,
+   227,   227,   234,   nil,   227,   223,   227,   nil,   nil,   nil,
+   nil,   nil,   nil,   234,   nil,   223,   nil,   nil,   nil,   223,
+   223,   nil,   227,   223,   nil,   222,   222,   223,   223,   222,
+   nil,   222,   223,   227,   nil,   nil,   nil,   227,   227,   nil,
+   nil,   227,   nil,   223,   nil,   nil,   227,   227,   nil,   nil,
+   227,   216,   216,   227,   nil,   216,   nil,   216,   222,   nil,
+   nil,   227,   222,   222,   nil,   nil,   222,   nil,   nil,   nil,
+   nil,   222,    83,    83,   nil,   222,    83,   nil,    83,   nil,
+   nil,   nil,   nil,   nil,   216,   nil,   222,   nil,   216,   216,
+   nil,   nil,   216,   nil,    83,   nil,   nil,   216,   215,   215,
+   nil,   216,   215,   nil,   nil,    83,   nil,   nil,   nil,    83,
+    83,   nil,   216,    83,   nil,   nil,   nil,   nil,    83,    83,
+   166,   166,    83,   nil,   166,    83,   166,   nil,   nil,   nil,
+   nil,   215,   nil,    83,   nil,   215,   215,   nil,   nil,   215,
+   nil,   nil,   166,   nil,   215,   nil,   168,   168,   215,   nil,
+   168,   nil,   168,   166,   nil,   nil,   nil,   166,   166,   215,
+   nil,   166,   nil,   nil,   nil,   nil,   166,   166,   168,   nil,
+   166,   nil,   nil,   166,   nil,   nil,    88,    88,   nil,   168,
+    88,   166,    88,   168,   168,   nil,   nil,   168,   nil,   nil,
+   nil,   nil,   168,   168,   nil,   nil,   168,   nil,    88,   168,
+   nil,   nil,   169,   169,   nil,   nil,   169,   168,   169,    88,
+   nil,   nil,   nil,    88,    88,   nil,   nil,    88,   nil,   nil,
+   183,   183,    88,    88,   169,   nil,    88,   nil,   nil,    88,
+   nil,   nil,   nil,   nil,   nil,   169,   nil,    88,   nil,   169,
+   169,   nil,   nil,   169,   nil,   nil,   nil,   nil,   169,   169,
+    93,    93,   169,   183,    93,   169,    93,   183,   183,    89,
+   nil,   183,   nil,   169,   nil,   nil,   183,   nil,    89,    89,
+   183,   nil,    93,   nil,   nil,   nil,   nil,    89,    89,    89,
+    89,   183,   nil,    93,   nil,   nil,   nil,    93,    93,    95,
+    95,    93,   nil,    95,    95,    95,    93,    93,   nil,   nil,
+    93,    89,    89,    93,   nil,    89,    89,    89,    89,    89,
+    89,    93,    89,    89,   173,   173,   nil,   nil,   173,   nil,
+   173,   nil,    95,   nil,   nil,   nil,    95,    95,   nil,   nil,
+    95,   nil,   nil,   nil,   nil,    95,   173,   nil,   nil,    95,
+   165,   165,   nil,   nil,   165,   nil,   165,   173,   nil,   nil,
+    95,   173,   173,   nil,   nil,   173,   nil,   nil,   nil,   nil,
+   173,   173,   165,   nil,   173,   nil,   nil,   173,   nil,   nil,
+   nil,   nil,   nil,   165,   nil,   173,   nil,   165,   165,   nil,
+   nil,   165,   149,   149,   nil,   nil,   165,   165,   nil,   nil,
+   165,   nil,   nil,   165,   nil,   149,   149,   nil,   nil,   nil,
+   nil,   165,   nil,   nil,   149,   149,   149,   149,   156,   156,
+   nil,   nil,   nil,   nil,   nil,   nil,   156,   156,   156,   156,
+   156,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   149,   149,
+   nil,   nil,   149,   149,   149,   149,   149,   149,   nil,   149,
+   149,   156,   156,   nil,   nil,   156,   156,   156,   156,   156,
+   156,   nil,   156,   156,   115,   115,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   115,   115,   115,   115,   119,   119,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   119,   119,   119,   119,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   115,   115,   nil,
+   nil,   115,   115,   115,   115,   115,   115,   nil,   115,   115,
+   119,   119,   nil,   nil,   119,   119,   119,   119,   119,   119,
+   nil,   119,   119,   254,   254,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   254,   254,   254,   254,   258,   258,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   258,   258,   258,   258,   nil,
+   nil,   260,   260,   260,   260,   260,   260,   254,   260,   260,
+   254,   254,   254,   254,   254,   254,   nil,   254,   254,   nil,
+   nil,   nil,   nil,   258,   258,   258,   258,   258,   258,   nil,
+   258,   258,   116,   116,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   116,   116,   116,   116,   255,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   255,   253,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   253,   nil,   nil,   116,   116,   nil,   nil,   116,
+   116,   116,   116,   116,   116,   nil,   116,   116,   172,   nil,
+   nil,   255,   255,   255,   255,   255,   255,   nil,   255,   255,
+   253,   253,   253,   253,   253,   253,   nil,   253,   253,   172,
+   291,   172,   172,   nil,   172,   172,   nil,   172,   nil,   172,
+   nil,   172,   nil,   172,   nil,   nil,   172,   172,   nil,   262,
+   nil,   291,   nil,   291,   291,   nil,   291,   291,   nil,   291,
+   nil,   291,   nil,   291,   nil,   291,   nil,   nil,   291,   291,
+   262,   293,   262,   262,   nil,   262,   262,   nil,   262,   nil,
+   262,   nil,   262,   nil,   262,   nil,   nil,   262,   262,   nil,
+   297,   nil,   293,   nil,   293,   293,   nil,   293,   293,   nil,
+   293,   nil,   293,   nil,   293,   nil,   293,   nil,   nil,   293,
+   293,   297,   213,   297,   297,   nil,   297,   297,   nil,   297,
+   nil,   297,   nil,   297,   nil,   297,   nil,   nil,   297,   297,
+   nil,   343,   nil,   213,   nil,   213,   213,   nil,   213,   213,
+   nil,   213,   nil,   213,   nil,   213,   nil,   213,   nil,   nil,
+   213,   213,   343,   352,   343,   343,   nil,   343,   343,   nil,
+   343,   nil,   343,   nil,   343,   nil,   343,   nil,   nil,   343,
+   343,   nil,   354,   nil,   352,   nil,   352,   352,   nil,   352,
+   352,   nil,   352,   nil,   352,   nil,   352,   nil,   352,   nil,
+   nil,   352,   352,   354,   206,   354,   354,   nil,   354,   354,
+   nil,   354,   nil,   354,   nil,   354,   nil,   354,   nil,   nil,
+   354,   354,   nil,   359,   nil,   206,   nil,   206,   206,   nil,
+   206,   206,   nil,   206,   nil,   206,   nil,   206,   nil,   206,
+   nil,   nil,   206,   206,   359,   361,   359,   359,   nil,   359,
+   359,   nil,   359,   nil,   359,   nil,   359,   nil,   359,   nil,
+   nil,   359,   359,   nil,   nil,   nil,   361,   nil,   361,   361,
+   nil,   361,   361,   nil,   361,   nil,   361,   nil,   361,   nil,
+   361,   nil,   nil,   361,   361,     4,   nil,     4,     4,   nil,
+     4,     4,   nil,     4,   nil,     4,   nil,     4,   nil,     4,
+   nil,   nil,     4,     4,     0,   nil,     0,     0,   nil,     0,
+     0,   nil,     0,   nil,     0,   nil,     0,   nil,     0,   nil,
+   nil,     0,     0 ]
 
 racc_action_pointer = [
-  1730,   177,   382,   nil,  1711,   175,   nil,   nil,   103,   nil,
-   nil,   nil,   104,   370,   nil,   nil,   nil,   nil,   nil,    13,
-   371,   nil,   nil,   369,   158,   nil,   206,   nil,   225,   nil,
-   188,     6,   nil,   369,   nil,   343,   nil,   nil,   nil,   nil,
-   351,   370,   396,   389,   -13,   461,   nil,   nil,    -7,   nil,
-   nil,   nil,   nil,   nil,    -2,   307,   nil,   309,   301,   317,
-   nil,   nil,   638,   315,   nil,   690,   nil,   297,   311,   nil,
-   304,   792,   nil,   nil,   275,     4,   nil,   nil,   247,   236,
-   nil,   247,   179,   926,   177,   140,    -6,   nil,  1030,  1107,
-   nil,   253,   nil,  1104,   nil,  1143,   nil,   146,   279,   286,
-   nil,   287,   304,   318,   nil,   -15,   328,   715,   303,   118,
-   349,   nil,   343,   122,  1293,  1411,   345,   318,  1306,   nil,
-    29,    17,   362,   nil,   nil,   nil,   nil,   351,   nil,   nil,
-   nil,   348,    57,   373,   400,   392,   nil,   407,   407,   411,
-   nil,   nil,   nil,    -4,   nil,    96,     0,   nil,  1234,    19,
-   nil,   164,    62,    91,   nil,  1247,   279,   305,   509,   557,
-   583,   613,   664,   741,  1194,   974,   252,  1000,  1056,   767,
-   242,  1465,  1168,   nil,   nil,   225,   168,   nil,   288,   nil,
-   nil,   nil,  1074,   260,   nil,   nil,    82,   228,   nil,   nil,
-   nil,    16,   nil,   nil,   119,   192,   112,   344,    -6,   nil,
-  1651,    17,    64,    64,    88,   nil,   nil,   nil,   119,   138,
-   nil,   nil,  1569,   185,   952,   905,   176,   220,   199,   204,
-   241,   879,   836,   nil,   259,   nil,   854,   nil,   nil,   nil,
-   nil,   nil,   nil,   806,   nil,   272,   262,   nil,   785,   nil,
-   nil,   nil,   nil,   nil,    11,   nil,   186,    42,    16,   436,
-   235,   326,  1432,  1352,  1423,    29,   nil,  1365,   111,   417,
-   nil,  1506,   304,   195,   332,   nil,   186,   nil,   535,   479,
-   nil,     6,   nil,   nil,    48,   nil,   -11,   nil,   nil,   414,
-   323,   352,   nil,   356,   nil,  1487,   nil,   298,   232,   nil,
-   185,   nil,  1528,   nil,   nil,   nil,  1547,   nil,   nil,   nil,
-   nil,   nil,   nil,   372,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   144,   nil,   207,   nil,   359,   nil,   385,   nil,   nil,
-   nil,   nil,   nil,   nil,    93,   392,   nil,   nil,   378,   nil,
-   380,   383,   nil,   384,   385,   nil,   402,   nil,   nil,   nil,
-   nil,   nil,  1588,   nil,   nil,   nil,   nil,   405,    72,   412,
-   nil,  1610,   nil,  1629,   nil,   nil,   nil,   nil,  1670,   nil,
-  1692,   nil,   nil,   nil ]
+  1734,   177,   353,   nil,  1715,   175,   nil,   nil,   103,   nil,
+   nil,   nil,   104,   343,   nil,   nil,   nil,   nil,   nil,    13,
+   347,   nil,   nil,   345,   158,   nil,   206,   nil,   225,   nil,
+   349,     6,   nil,   343,   nil,   316,   nil,   nil,   nil,   nil,
+   326,   374,   400,   393,   -13,   465,   nil,   nil,    -7,   nil,
+   nil,   nil,   nil,   nil,    -2,   281,   nil,   290,   283,   297,
+   nil,   nil,   642,   296,   nil,   694,   nil,   278,   294,   nil,
+   287,   796,   nil,   nil,   243,     4,   nil,   nil,   234,   229,
+   nil,   245,   195,   930,   193,   177,   136,   nil,  1034,  1111,
+   nil,   171,   nil,  1108,   nil,  1147,   nil,   146,   247,   259,
+   nil,   260,   282,   nil,   284,   nil,   -11,   301,   719,   276,
+   -15,   320,   nil,   122,   316,  1297,  1415,   318,   290,  1310,
+   nil,    29,    17,   320,   nil,   nil,   nil,   nil,   324,   nil,
+   nil,   nil,   318,    12,   341,   371,   366,   nil,   381,   380,
+   382,   nil,   nil,   nil,    -4,   nil,    88,     0,   nil,  1238,
+    19,   nil,   192,    62,    91,   nil,  1251,   232,   283,   513,
+   561,   587,   617,   668,   745,  1198,   978,   231,  1004,  1060,
+   771,   213,  1469,  1172,   nil,   nil,   267,   168,   nil,   nil,
+   248,   nil,   nil,  1078,   125,   nil,   nil,    82,   186,   nil,
+   nil,   nil,     0,   nil,   nil,    -8,   164,   322,     5,    -6,
+   nil,    64,    74,    98,    96,   nil,  1655,   nil,   nil,   155,
+   138,   nil,   nil,  1573,   193,   956,   909,   179,   220,   199,
+   204,   241,   883,   840,   nil,   246,   nil,   858,   nil,   nil,
+   nil,   nil,   nil,   nil,   810,   nil,   251,   239,   nil,   789,
+   nil,   nil,   nil,   nil,   nil,    56,   nil,   186,   129,    16,
+   440,   421,   330,  1436,  1356,  1427,    29,   nil,  1369,   111,
+  1347,   nil,  1510,   283,   236,   312,   nil,   186,   nil,   539,
+   483,   nil,    22,   nil,   nil,    48,   nil,   118,   nil,   nil,
+   418,   327,   324,   nil,   330,   nil,   309,   302,   nil,   185,
+   nil,  1491,   nil,  1532,   nil,   nil,   nil,  1551,   nil,   nil,
+   nil,   nil,   nil,   nil,   344,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   144,   nil,    92,   nil,   329,   nil,   355,   nil,
+   nil,   nil,   nil,   nil,   nil,    93,   360,   nil,   nil,   346,
+   nil,   348,   350,   nil,   351,   355,   nil,   372,   nil,   nil,
+   nil,   nil,   nil,  1592,   nil,   nil,   nil,   nil,   379,    72,
+   384,   nil,  1614,   nil,  1633,   nil,   nil,   nil,   nil,  1674,
+   nil,  1696,   nil,   nil,   nil ]
 
 racc_action_default = [
-  -182,  -219,   -40,   -13,    -1,  -219,   -14,    -2,  -219,   -15,
-    -3,  -173,  -174,  -219,   -16,    -5,  -171,   -17,    -6,  -219,
-  -219,    -7,    -8,  -219,  -172,    -9,  -219,   -10,  -219,   -11,
-  -219,  -219,   -12,  -219,  -174,  -182,  -172,   -41,    -4,   -39,
-  -219,  -219,  -219,  -219,  -182,  -219,  -179,  -181,  -182,  -175,
-  -177,  -178,  -207,  -180,   -75,   -82,  -159,   -29,   -30,  -199,
-  -107,   -31,  -219,  -217,  -161,  -219,   -34,   -32,   -64,   -33,
-   -21,  -219,  -112,   -22,  -219,   -63,   -23,   -62,   -26,   -27,
-  -160,  -219,   -28,  -219,  -104,   -96,  -103,   -99,  -219,  -219,
-   -97,   -93,  -101,  -219,  -120,  -219,  -102,  -219,   -94,   -98,
-  -100,   -95,  -219,  -164,  -162,  -182,   -43,  -219,   -75,  -182,
-  -219,  -184,  -219,  -183,   -72,   -74,  -219,  -182,   -73,  -193,
-  -219,  -219,  -219,  -158,  -157,   -70,   -68,   -65,   -76,   -71,
-   -64,   -60,   -63,   -66,  -205,   -69,   -58,   -67,  -219,  -205,
-   -80,   -81,   -83,  -219,   -20,  -219,  -219,  -108,  -219,  -219,
-   -85,  -219,  -219,  -219,  -129,  -219,  -219,  -219,  -219,  -219,
-  -219,  -219,  -219,  -219,  -219,  -219,  -219,  -219,  -219,  -219,
-  -219,  -219,  -219,  -136,  -202,  -219,  -219,  -211,  -219,  -215,
-  -214,  -210,  -219,  -219,   -46,  -199,  -182,  -219,   -47,   -49,
-   -63,  -219,   -56,   -55,   -82,  -219,  -219,  -205,  -219,   364,
-  -219,  -192,  -190,  -219,  -219,  -187,  -216,  -195,  -219,  -219,
-  -176,  -194,  -219,  -219,   -61,  -219,  -206,  -219,   -75,  -206,
-  -219,  -219,  -219,   -18,  -219,  -109,  -219,  -110,   -24,   -25,
-  -203,  -204,  -113,  -219,  -155,  -219,   -63,  -153,  -219,  -147,
-  -156,  -148,  -154,  -106,  -219,  -139,  -124,  -126,  -125,  -127,
-  -131,  -128,  -133,  -138,  -135,  -132,  -121,  -137,  -134,  -130,
-  -122,  -219,  -117,  -123,  -204,  -200,  -219,  -208,  -219,  -219,
-  -141,  -219,  -145,  -163,  -219,   -44,  -219,   -52,   -51,  -219,
-  -219,  -205,  -114,  -219,   -45,  -219,  -166,  -219,  -219,  -185,
-  -219,  -186,  -219,  -197,  -198,  -196,  -219,  -170,   -35,   -59,
-   -78,   -77,   -36,  -205,   -84,   -38,   -79,   -19,  -218,  -111,
-   -86,  -219,  -150,  -205,  -105,  -117,  -116,  -219,  -201,  -212,
-  -209,  -213,  -142,  -140,  -219,  -219,   -50,   -48,   -90,   -91,
-   -87,   -88,   -53,   -92,   -89,   -54,  -219,   -37,  -165,  -191,
-  -189,  -188,  -219,  -168,  -169,   -57,  -152,  -204,  -219,  -219,
-  -115,  -219,  -146,  -219,   -42,  -167,  -151,  -149,  -219,  -119,
-  -219,  -144,  -118,  -143 ]
+  -183,  -220,   -40,   -13,    -1,  -220,   -14,    -2,  -220,   -15,
+    -3,  -174,  -175,  -220,   -16,    -5,  -172,   -17,    -6,  -220,
+  -220,    -7,    -8,  -220,  -173,    -9,  -220,   -10,  -220,   -11,
+  -220,  -220,   -12,  -220,  -175,  -183,  -173,   -41,    -4,   -39,
+  -220,  -220,  -220,  -220,  -183,  -220,  -180,  -182,  -183,  -176,
+  -179,  -178,  -208,  -181,   -75,   -82,  -159,   -29,   -30,  -200,
+  -107,   -31,  -220,  -218,  -161,  -220,   -34,   -32,   -64,   -33,
+   -21,  -220,  -112,   -22,  -220,   -63,   -23,   -62,   -26,   -27,
+  -160,  -220,   -28,  -220,  -104,   -96,  -103,   -99,  -220,  -220,
+   -97,   -93,  -101,  -220,  -120,  -220,  -102,  -220,   -94,   -98,
+  -100,   -95,  -220,  -163,  -165,  -162,  -183,   -43,  -220,   -75,
+  -183,  -220,  -185,  -184,  -220,   -72,   -74,  -220,  -183,   -73,
+  -194,  -220,  -220,  -220,  -158,  -157,   -70,   -68,   -65,   -76,
+   -71,   -64,   -60,   -63,   -66,  -206,   -69,   -58,   -67,  -220,
+  -206,   -80,   -81,   -83,  -220,   -20,  -220,  -220,  -108,  -220,
+  -220,   -85,  -220,  -220,  -220,  -129,  -220,  -220,  -220,  -220,
+  -220,  -220,  -220,  -220,  -220,  -220,  -220,  -220,  -220,  -220,
+  -220,  -220,  -220,  -220,  -136,  -203,  -220,  -220,  -212,  -216,
+  -220,  -215,  -211,  -220,  -220,   -46,  -200,  -183,  -220,   -47,
+   -49,   -63,  -220,   -56,   -55,   -82,  -220,  -220,  -206,  -220,
+   365,  -193,  -191,  -220,  -220,  -188,  -220,  -217,  -196,  -220,
+  -220,  -177,  -195,  -220,  -220,   -61,  -220,  -207,  -220,   -75,
+  -207,  -220,  -220,  -220,   -18,  -220,  -109,  -220,  -110,   -24,
+   -25,  -204,  -205,  -113,  -220,  -155,  -220,   -63,  -153,  -220,
+  -147,  -156,  -148,  -154,  -106,  -220,  -139,  -124,  -126,  -125,
+  -127,  -131,  -128,  -133,  -138,  -135,  -132,  -121,  -137,  -134,
+  -130,  -122,  -220,  -117,  -123,  -205,  -201,  -220,  -209,  -220,
+  -220,  -141,  -220,  -145,  -164,  -220,   -44,  -220,   -52,   -51,
+  -220,  -220,  -206,  -114,  -220,   -45,  -220,  -220,  -186,  -220,
+  -187,  -220,  -167,  -220,  -197,  -198,  -199,  -220,  -171,   -35,
+   -59,   -78,   -77,   -36,  -206,   -84,   -38,   -79,   -19,  -219,
+  -111,   -86,  -220,  -150,  -206,  -105,  -117,  -116,  -220,  -202,
+  -213,  -210,  -214,  -142,  -140,  -220,  -220,   -50,   -48,   -90,
+   -91,   -87,   -88,   -53,   -92,   -89,   -54,  -220,   -37,  -192,
+  -190,  -189,  -166,  -220,  -169,  -170,   -57,  -152,  -205,  -220,
+  -220,  -115,  -220,  -146,  -220,   -42,  -168,  -151,  -149,  -220,
+  -119,  -220,  -144,  -118,  -143 ]
 
 racc_goto_table = [
-    31,    61,    35,    13,    31,    40,    23,    13,   235,   241,
-    23,   205,   134,    44,     4,   217,    47,   177,    69,   139,
-   220,    70,   147,    67,    38,   270,   140,     7,    49,   104,
-    76,   126,   187,   136,   228,   125,   198,   316,   272,    61,
-   151,   112,   332,   335,   106,   348,   269,   304,   129,   225,
-   117,   239,    39,   127,   313,   103,    69,   131,   208,   145,
-    48,    67,   111,   122,   175,   327,   197,   211,    76,   203,
-   204,   111,   213,    58,   295,   119,   195,   176,   283,    33,
+    31,    69,   205,    13,    31,    40,   178,    13,    35,   242,
+   218,   148,    67,    23,    38,   221,     4,    23,   236,    44,
+   126,    61,   135,   137,    58,   140,   103,    49,    70,   141,
+     7,   130,   271,   229,    47,   317,   188,    76,   114,    69,
+   199,   270,   128,   152,   333,   336,   226,   118,   273,   349,
+    67,   127,   305,   240,   125,    39,   314,   132,   104,    61,
+   214,   209,    58,    48,   123,   112,   146,   176,   328,   212,
+   203,   204,    56,   284,   112,    76,   107,   198,   120,   294,
+   196,   177,    33,   nil,   nil,   179,   nil,   nil,   351,   nil,
+   nil,   nil,   nil,   nil,   nil,   313,   nil,   nil,   nil,   nil,
+   nil,   nil,    56,   nil,   236,   nil,   229,   nil,   nil,   nil,
+    56,   nil,   nil,   nil,   nil,   nil,   nil,   275,   nil,   323,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,    69,   nil,   211,
+   nil,    69,   nil,   nil,   nil,   273,    47,    47,    67,   nil,
+   nil,   235,    67,   nil,   nil,   nil,   nil,    61,   208,   nil,
+    58,    61,   nil,   125,    58,   nil,   nil,   337,   245,   nil,
+   nil,   nil,   nil,   230,   nil,   282,   nil,    76,   nil,   141,
+   nil,   235,    31,   310,   nil,    13,   320,   nil,   341,   346,
+   274,   126,   257,   125,   300,    23,   261,   304,   262,   350,
+   353,   302,   130,   nil,   141,   nil,   nil,   nil,    56,   nil,
+    69,    56,    56,   128,   nil,   357,    31,   nil,   nil,    13,
+   nil,    67,   127,    31,   236,   125,    13,   295,   nil,    23,
+    61,   nil,   291,    58,   nil,   nil,    23,   235,   nil,   297,
+   nil,    56,   nil,   nil,   nil,   nil,   230,   nil,   nil,   125,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,    78,   nil,    79,   179,   nil,   nil,   235,   nil,
+   nil,   nil,    31,    56,   nil,    13,   nil,   nil,   331,   331,
+   125,    56,    38,    57,   nil,    23,   nil,   330,   330,   nil,
+   125,   125,   134,   nil,   136,   nil,   nil,    56,   nil,   nil,
+    78,    31,    79,    31,    13,   nil,    13,    31,   nil,   nil,
+    13,    38,   nil,   124,    23,   nil,    23,    38,   102,   343,
+    23,    57,   nil,   235,   nil,   nil,   nil,   nil,    56,   nil,
+   nil,   nil,   nil,   117,   nil,   125,   nil,   nil,    56,    56,
+   nil,   nil,   nil,   nil,   193,   nil,   194,   235,   193,   nil,
+   194,   nil,   nil,    31,   nil,   nil,    13,    82,   nil,   125,
+   nil,   151,    31,    38,    31,    13,    23,    13,   nil,    31,
+   nil,    31,    13,   nil,    13,    23,   nil,    23,   359,    38,
+   361,    38,    23,    56,    23,   151,   nil,   138,    78,   nil,
+    79,   238,    78,   241,    79,    82,   nil,   nil,   151,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,    56,   nil,    57,
+   nil,   nil,   124,    57,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   238,   nil,   241,   nil,   193,   nil,   194,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   225,   nil,   nil,
+   nil,   nil,   124,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   134,   nil,   136,   nil,   nil,   nil,   nil,
+   nil,    78,   nil,    79,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   124,   nil,   nil,   238,   nil,   241,
+   nil,   nil,    57,    82,    89,   nil,   243,    82,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   124,   115,
+   116,   nil,   nil,   119,   nil,   nil,   301,   nil,   238,   nil,
+   241,   nil,   307,   nil,   nil,   193,   243,   194,   332,   332,
+   334,   334,   nil,   nil,   311,   nil,   nil,   nil,   nil,   124,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   329,
+   329,   155,   nil,   nil,   nil,   nil,   156,   nil,   138,   nil,
+   nil,   174,   nil,   nil,   nil,   nil,    82,   nil,   nil,   322,
+   nil,   nil,   nil,   238,   nil,   241,   nil,   nil,   nil,   nil,
+   nil,   nil,   243,   nil,   nil,   nil,   339,   340,   nil,   nil,
+   nil,   nil,   nil,   nil,   124,   nil,   nil,   238,   nil,   241,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   347,   243,   nil,   nil,   nil,   nil,   124,   nil,
+   nil,   nil,   nil,   335,   335,   247,   248,   249,   250,   251,
+   252,   253,   254,   255,   256,   nil,   258,   259,   260,   nil,
+   nil,   264,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
    nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   350,   nil,   nil,   nil,   235,   312,   179,   nil,   nil,   nil,
-   nil,   nil,   nil,   124,   nil,   nil,   nil,   228,   nil,   nil,
-   nil,    58,   322,   274,   nil,   nil,   nil,    47,    47,   nil,
-   nil,   nil,   nil,   nil,   nil,   272,    61,   nil,   nil,   210,
-    61,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,    69,   207,   nil,   nil,    69,    67,   nil,
-   244,   234,    67,   nil,   nil,   229,   nil,   nil,   281,    76,
-   nil,   nil,   336,   256,   nil,   140,   nil,   260,   nil,   nil,
-   nil,    31,   nil,   nil,    13,   nil,   303,    23,   nil,    56,
-   352,   234,   273,   309,   345,   261,   319,   301,   341,   nil,
-   140,   126,    57,   299,   349,   125,   nil,   nil,    58,    61,
-    31,   124,    58,    13,   235,   356,    23,   nil,   129,    56,
-   293,   nil,    31,   127,   285,    13,    69,    56,    23,   nil,
-   nil,    67,   123,   nil,   nil,   nil,   296,   nil,   229,   nil,
-    57,   124,   nil,   nil,   nil,   nil,   nil,   234,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,    78,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   329,   329,   nil,    79,
-   nil,    31,   nil,   124,    13,   179,   nil,    23,   234,   nil,
-   nil,    58,   nil,    82,   nil,   nil,   133,   nil,   330,   330,
-   nil,    38,   nil,   nil,    78,    31,   nil,   124,    13,   135,
-   nil,    23,    31,   nil,   nil,    13,    31,    79,    23,    13,
-   nil,   nil,    23,   137,    56,    38,   342,    56,    56,   nil,
-   nil,    82,   nil,   nil,   nil,   nil,    38,    57,   124,   nil,
-   123,    57,   nil,   234,   nil,   nil,   nil,   192,   124,   124,
-   nil,   192,   nil,   nil,   nil,   nil,   nil,    56,   nil,   nil,
-   193,   nil,    31,   nil,   193,    13,   nil,   234,    23,   nil,
-   123,    31,   nil,    31,    13,   nil,    13,    23,    31,    23,
-    31,    13,    38,    13,    23,   358,    23,   360,   nil,    56,
-   nil,    78,   nil,   124,   237,    78,   102,    56,    38,   nil,
-    38,   nil,   123,   nil,    79,   nil,   nil,   240,    79,   nil,
-    57,   116,   nil,    56,   nil,   nil,   nil,   124,    82,   nil,
-   nil,   242,    82,   nil,   237,   nil,   123,   nil,   192,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   240,   nil,   150,
-   nil,   193,   nil,   nil,    56,   nil,   nil,   nil,   nil,   nil,
-   nil,   242,   nil,   nil,    56,    56,   133,   123,   nil,   nil,
-   nil,   nil,   nil,   150,    78,   nil,   nil,   328,   328,   135,
-   nil,   nil,   nil,   nil,   nil,   150,   nil,    79,   nil,   nil,
-   237,   nil,   nil,   137,   nil,   nil,   nil,   nil,   nil,    89,
-   nil,    82,   nil,   240,   nil,   nil,   nil,   nil,   nil,    56,
-   nil,   nil,   nil,   nil,   114,   115,   nil,   242,   118,   nil,
-   nil,   237,   123,   nil,   224,   nil,   nil,   nil,   192,   nil,
-   nil,   331,   331,    56,   240,   nil,   nil,   nil,   nil,   nil,
-   nil,   193,   nil,   nil,   333,   333,   123,   nil,   242,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   154,   nil,   334,   334,
-   nil,   155,   nil,   nil,   nil,   nil,   173,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   237,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   240,
-   nil,   nil,   nil,   300,   nil,   nil,   nil,   nil,   nil,   306,
-   237,   nil,   nil,   242,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   310,   nil,   240,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   242,   nil,   246,
-   247,   248,   249,   250,   251,   252,   253,   254,   255,   nil,
-   257,   258,   259,   nil,   nil,   263,   321,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   243,   nil,
    nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   339,   340,   nil,   nil,   nil,
    nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   346 ]
+   nil,   nil,   243 ]
 
 racc_goto_check = [
-    34,    26,    29,    49,    34,    34,    20,    49,    64,    66,
-    20,    77,    32,    29,     2,    33,    60,    80,    28,    35,
-    33,    18,    57,    27,     4,    62,    50,     3,    73,    27,
-    20,    26,    38,    44,    19,    47,    38,    59,    64,    26,
-    54,    69,    43,    43,    37,    55,    61,    53,    28,    58,
-    69,    65,     5,    27,    67,    68,    28,    30,    70,    18,
-    71,    27,     3,    72,    54,    39,    32,    74,    20,    75,
-    76,     3,    31,    25,    78,     3,    54,    79,    33,     1,
+    34,    28,    78,    49,    34,    34,    81,    49,    29,    66,
+    33,    57,    27,    20,     4,    33,     2,    20,    64,    29,
+    47,    26,    32,    44,    25,    35,    68,    74,    18,    50,
+     3,    28,    62,    19,    60,    59,    38,    20,    70,    28,
+    38,    61,    27,    54,    43,    43,    58,    70,    64,    55,
+    27,    26,    53,    65,    25,     5,    67,    30,    69,    26,
+    31,    71,    25,    72,    73,     3,    18,    54,    39,    75,
+    76,    77,    46,    33,     3,    20,    37,    32,     3,    79,
+    54,    80,     1,   nil,   nil,    27,   nil,   nil,    59,   nil,
+   nil,   nil,   nil,   nil,   nil,    66,   nil,   nil,   nil,   nil,
+   nil,   nil,    46,   nil,    64,   nil,    19,   nil,   nil,   nil,
+    46,   nil,   nil,   nil,   nil,   nil,   nil,    38,   nil,    62,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,    28,   nil,    74,
+   nil,    28,   nil,   nil,   nil,    64,    60,    60,    27,   nil,
+   nil,    27,    27,   nil,   nil,   nil,   nil,    26,     3,   nil,
+    25,    26,   nil,    25,    25,   nil,   nil,    33,    18,   nil,
+   nil,   nil,   nil,    20,   nil,    35,   nil,    20,   nil,    50,
+   nil,    27,    34,    57,   nil,    49,    81,   nil,    78,    33,
+    68,    47,    60,    25,    44,    20,    60,    32,     2,    33,
+    64,    50,    28,   nil,    50,   nil,   nil,   nil,    46,   nil,
+    28,    46,    46,    27,   nil,    66,    34,   nil,   nil,    49,
+   nil,    27,    26,    34,    64,    25,    49,    29,   nil,    20,
+    26,   nil,     2,    25,   nil,   nil,    20,    27,   nil,     2,
+   nil,    46,   nil,   nil,   nil,   nil,    20,   nil,   nil,    25,
    nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-    59,   nil,   nil,   nil,    64,    66,    27,   nil,   nil,   nil,
-   nil,   nil,   nil,    25,   nil,   nil,   nil,    19,   nil,   nil,
-   nil,    25,    62,    38,   nil,   nil,   nil,    60,    60,   nil,
-   nil,   nil,   nil,   nil,   nil,    64,    26,   nil,   nil,    73,
-    26,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,    28,     3,   nil,   nil,    28,    27,   nil,
-    18,    27,    27,   nil,   nil,    20,   nil,   nil,    35,    20,
-   nil,   nil,    33,    60,   nil,    50,   nil,    60,   nil,   nil,
-   nil,    34,   nil,   nil,    49,   nil,    32,    20,   nil,    46,
-    64,    27,    27,    57,    33,     2,    80,    50,    77,   nil,
-    50,    26,    24,    44,    33,    47,   nil,   nil,    25,    26,
-    34,    25,    25,    49,    64,    66,    20,   nil,    28,    46,
-    29,   nil,    34,    27,     2,    49,    28,    46,    20,   nil,
-   nil,    27,    24,   nil,   nil,   nil,     2,   nil,    20,   nil,
-    24,    25,   nil,   nil,   nil,   nil,   nil,    27,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,    21,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,    26,    26,   nil,    22,
-   nil,    34,   nil,    25,    49,    27,   nil,    20,    27,   nil,
-   nil,    25,   nil,    23,   nil,   nil,    21,   nil,    27,    27,
-   nil,     4,   nil,   nil,    21,    34,   nil,    25,    49,    22,
-   nil,    20,    34,   nil,   nil,    49,    34,    22,    20,    49,
-   nil,   nil,    20,    23,    46,     4,     2,    46,    46,   nil,
-   nil,    23,   nil,   nil,   nil,   nil,     4,    24,    25,   nil,
-    24,    24,   nil,    27,   nil,   nil,   nil,    21,    25,    25,
-   nil,    21,   nil,   nil,   nil,   nil,   nil,    46,   nil,   nil,
-    22,   nil,    34,   nil,    22,    49,   nil,    27,    20,   nil,
-    24,    34,   nil,    34,    49,   nil,    49,    20,    34,    20,
-    34,    49,     4,    49,    20,     2,    20,     2,   nil,    46,
-   nil,    21,   nil,    25,    21,    21,    51,    46,     4,   nil,
-     4,   nil,    24,   nil,    22,   nil,   nil,    22,    22,   nil,
-    24,    51,   nil,    46,   nil,   nil,   nil,    25,    23,   nil,
-   nil,    23,    23,   nil,    21,   nil,    24,   nil,    21,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,    22,   nil,    51,
-   nil,    22,   nil,   nil,    46,   nil,   nil,   nil,   nil,   nil,
-   nil,    23,   nil,   nil,    46,    46,    21,    24,   nil,   nil,
-   nil,   nil,   nil,    51,    21,   nil,   nil,    24,    24,    22,
-   nil,   nil,   nil,   nil,   nil,    51,   nil,    22,   nil,   nil,
-    21,   nil,   nil,    23,   nil,   nil,   nil,   nil,   nil,    48,
-   nil,    23,   nil,    22,   nil,   nil,   nil,   nil,   nil,    46,
-   nil,   nil,   nil,   nil,    48,    48,   nil,    23,    48,   nil,
-   nil,    21,    24,   nil,    51,   nil,   nil,   nil,    21,   nil,
-   nil,    21,    21,    46,    22,   nil,   nil,   nil,   nil,   nil,
-   nil,    22,   nil,   nil,    22,    22,    24,   nil,    23,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,    48,   nil,    23,    23,
-   nil,    48,   nil,   nil,   nil,   nil,    48,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,    21,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    22,
-   nil,   nil,   nil,    51,   nil,   nil,   nil,   nil,   nil,    51,
-    21,   nil,   nil,    23,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,    51,   nil,    22,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,    23,   nil,    48,
-    48,    48,    48,    48,    48,    48,    48,    48,    48,   nil,
-    48,    48,    48,   nil,   nil,    48,    51,   nil,   nil,   nil,
+   nil,   nil,    21,   nil,    22,    27,   nil,   nil,    27,   nil,
+   nil,   nil,    34,    46,   nil,    49,   nil,   nil,    27,    27,
+    25,    46,     4,    24,   nil,    20,   nil,    26,    26,   nil,
+    25,    25,    21,   nil,    22,   nil,   nil,    46,   nil,   nil,
+    21,    34,    22,    34,    49,   nil,    49,    34,   nil,   nil,
+    49,     4,   nil,    24,    20,   nil,    20,     4,    51,     2,
+    20,    24,   nil,    27,   nil,   nil,   nil,   nil,    46,   nil,
+   nil,   nil,   nil,    51,   nil,    25,   nil,   nil,    46,    46,
+   nil,   nil,   nil,   nil,    21,   nil,    22,    27,    21,   nil,
+    22,   nil,   nil,    34,   nil,   nil,    49,    23,   nil,    25,
+   nil,    51,    34,     4,    34,    49,    20,    49,   nil,    34,
+   nil,    34,    49,   nil,    49,    20,   nil,    20,     2,     4,
+     2,     4,    20,    46,    20,    51,   nil,    23,    21,   nil,
+    22,    21,    21,    22,    22,    23,   nil,   nil,    51,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,    46,   nil,    24,
+   nil,   nil,    24,    24,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,    21,   nil,    22,   nil,    21,   nil,    22,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,    51,   nil,   nil,
+   nil,   nil,    24,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,    21,   nil,    22,   nil,   nil,   nil,   nil,
+   nil,    21,   nil,    22,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,    24,   nil,   nil,    21,   nil,    22,
+   nil,   nil,    24,    23,    48,   nil,    23,    23,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    24,    48,
+    48,   nil,   nil,    48,   nil,   nil,    51,   nil,    21,   nil,
+    22,   nil,    51,   nil,   nil,    21,    23,    22,    21,    21,
+    22,    22,   nil,   nil,    51,   nil,   nil,   nil,   nil,    24,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    24,
+    24,    48,   nil,   nil,   nil,   nil,    48,   nil,    23,   nil,
+   nil,    48,   nil,   nil,   nil,   nil,    23,   nil,   nil,    51,
+   nil,   nil,   nil,    21,   nil,    22,   nil,   nil,   nil,   nil,
+   nil,   nil,    23,   nil,   nil,   nil,    51,    51,   nil,   nil,
+   nil,   nil,   nil,   nil,    24,   nil,   nil,    21,   nil,    22,
    nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,    51,    51,   nil,   nil,   nil,
+   nil,   nil,    51,    23,   nil,   nil,   nil,   nil,    24,   nil,
+   nil,   nil,   nil,    23,    23,    48,    48,    48,    48,    48,
+    48,    48,    48,    48,    48,   nil,    48,    48,    48,   nil,
+   nil,    48,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
    nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    51 ]
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    23,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,    23 ]
 
 racc_goto_pointer = [
-   nil,    79,    14,    27,    20,    47,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    -3,  -115,
-     6,   222,   235,   249,   168,    49,   -23,    -1,    -6,     1,
-     3,   -59,   -42,  -119,     0,   -36,   nil,    13,   -73,  -211,
-   nil,   nil,   nil,  -237,   -21,   nil,   155,   -19,   443,     3,
-   -29,   348,   nil,  -172,   -31,  -268,   nil,   -43,   -99,  -225,
-    -3,  -136,  -157,   nil,  -144,  -101,  -143,  -184,    25,     6,
-   -59,    41,    15,     9,   -54,   -44,   -43,  -102,  -135,   -20,
-   -80,   nil ]
+   nil,    82,    16,    30,    10,    50,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,     4,  -117,
+    13,   228,   230,   323,   249,     0,    -3,   -12,   -23,     7,
+     3,   -72,   -32,  -125,     0,   -30,   nil,    45,   -70,  -209,
+   nil,   nil,   nil,  -236,   -31,   nil,    48,   -34,   448,     3,
+   -26,   280,   nil,  -168,   -28,  -265,   nil,   -54,  -103,  -228,
+    15,  -142,  -151,   nil,  -135,  -100,  -144,  -183,    -4,    28,
+     3,   -57,    44,    16,     8,   -53,   -43,   -42,  -111,  -131,
+   -16,   -91,   nil ]
 
 racc_goto_default = [
-   nil,   nil,   nil,   184,    10,    15,    18,    21,    22,    25,
+   nil,   nil,   nil,   185,    10,    15,    18,    21,    22,    25,
     27,    29,    32,     3,     6,     9,    14,    17,   nil,    73,
     96,    98,    99,   101,    85,    86,    90,    91,    92,    20,
-   nil,   nil,   nil,   nil,    81,   nil,     5,   nil,   nil,   188,
-   276,   189,   191,   nil,   nil,   138,    84,    87,   148,    63,
-   128,    94,   141,   142,   nil,   233,   100,   nil,   nil,   nil,
-    64,   nil,   nil,   271,    74,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,    50,   nil,   nil,   nil,   nil,   nil,
-   nil,   178 ]
+   nil,   nil,   nil,   nil,    81,   nil,     5,   nil,   nil,   189,
+   277,   190,   192,   nil,   nil,   139,    84,    87,   149,    63,
+   129,    94,   142,   143,   nil,   234,   100,   nil,   nil,   nil,
+    64,   nil,   nil,   272,    74,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,    51,   nil,   nil,   nil,   nil,
+   nil,   nil,   180 ]
 
 racc_reduce_table = [
   0, 0, :racc_error,
@@ -795,66 +801,67 @@ racc_reduce_table = [
   1, 128, :_reduce_160,
   1, 128, :_reduce_none,
   1, 132, :_reduce_162,
-  3, 132, :_reduce_163,
-  2, 75, :_reduce_164,
-  6, 77, :_reduce_165,
-  5, 77, :_reduce_166,
-  7, 78, :_reduce_167,
-  6, 78, :_reduce_168,
-  6, 79, :_reduce_169,
-  5, 79, :_reduce_170,
-  1, 98, :_reduce_171,
-  1, 93, :_reduce_172,
+  1, 133, :_reduce_none,
+  3, 133, :_reduce_164,
+  2, 75, :_reduce_165,
+  6, 77, :_reduce_166,
+  5, 77, :_reduce_167,
+  7, 78, :_reduce_168,
+  6, 78, :_reduce_169,
+  6, 79, :_reduce_170,
+  5, 79, :_reduce_171,
+  1, 98, :_reduce_172,
   1, 93, :_reduce_173,
   1, 93, :_reduce_174,
-  1, 135, :_reduce_none,
-  3, 135, :_reduce_176,
-  1, 137, :_reduce_177,
-  1, 138, :_reduce_178,
-  1, 138, :_reduce_179,
-  1, 138, :_reduce_180,
-  1, 138, :_reduce_none,
-  0, 67, :_reduce_182,
-  0, 139, :_reduce_183,
-  1, 133, :_reduce_none,
-  3, 133, :_reduce_185,
-  3, 133, :_reduce_186,
-  1, 140, :_reduce_none,
-  3, 140, :_reduce_188,
-  3, 141, :_reduce_189,
-  1, 141, :_reduce_190,
-  3, 141, :_reduce_191,
-  1, 141, :_reduce_192,
+  1, 93, :_reduce_175,
   1, 136, :_reduce_none,
-  2, 136, :_reduce_194,
+  3, 136, :_reduce_177,
+  1, 138, :_reduce_178,
+  1, 139, :_reduce_179,
+  1, 139, :_reduce_180,
+  1, 139, :_reduce_181,
+  1, 139, :_reduce_none,
+  0, 67, :_reduce_183,
+  0, 140, :_reduce_184,
   1, 134, :_reduce_none,
-  2, 134, :_reduce_196,
-  1, 142, :_reduce_none,
-  1, 142, :_reduce_none,
-  1, 86, :_reduce_199,
-  3, 111, :_reduce_200,
-  4, 111, :_reduce_201,
-  2, 111, :_reduce_202,
+  3, 134, :_reduce_186,
+  3, 134, :_reduce_187,
+  1, 141, :_reduce_none,
+  3, 141, :_reduce_189,
+  3, 142, :_reduce_190,
+  1, 142, :_reduce_191,
+  3, 142, :_reduce_192,
+  1, 142, :_reduce_193,
+  1, 137, :_reduce_none,
+  2, 137, :_reduce_195,
+  1, 135, :_reduce_none,
+  2, 135, :_reduce_197,
+  1, 143, :_reduce_none,
+  1, 143, :_reduce_none,
+  1, 86, :_reduce_200,
+  3, 111, :_reduce_201,
+  4, 111, :_reduce_202,
+  2, 111, :_reduce_203,
   1, 119, :_reduce_none,
   1, 119, :_reduce_none,
   0, 97, :_reduce_none,
-  1, 97, :_reduce_206,
-  1, 124, :_reduce_207,
-  3, 120, :_reduce_208,
-  4, 120, :_reduce_209,
-  2, 120, :_reduce_210,
-  1, 143, :_reduce_none,
-  3, 143, :_reduce_212,
+  1, 97, :_reduce_207,
+  1, 124, :_reduce_208,
+  3, 120, :_reduce_209,
+  4, 120, :_reduce_210,
+  2, 120, :_reduce_211,
+  1, 144, :_reduce_none,
   3, 144, :_reduce_213,
-  1, 145, :_reduce_214,
-  1, 145, :_reduce_215,
-  4, 113, :_reduce_216,
+  3, 145, :_reduce_214,
+  1, 146, :_reduce_215,
+  1, 146, :_reduce_216,
+  4, 113, :_reduce_217,
   1, 92, :_reduce_none,
-  4, 92, :_reduce_218 ]
+  4, 92, :_reduce_219 ]
 
-racc_reduce_n = 219
+racc_reduce_n = 220
 
-racc_shift_n = 364
+racc_shift_n = 365
 
 racc_token_table = {
   false => 0,
@@ -1075,7 +1082,8 @@ Racc_token_to_s_table = [
   "svalues",
   "selectval",
   "sintvalues",
-  "qtexts",
+  "string",
+  "strings",
   "argumentlist",
   "classparent",
   "hostnames",
@@ -2147,21 +2155,22 @@ module_eval(<<'.,.,', 'grammar.ra', 630)
 
 module_eval(<<'.,.,', 'grammar.ra', 635)
   def _reduce_162(val, _values, result)
-     result = [val[0].value] 
+     result = [val[0][:value]] 
     result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 637)
-  def _reduce_163(val, _values, result)
-        results = val[0] << val[2].value
+# reduce 163 omitted
 
+module_eval(<<'.,.,', 'grammar.ra', 637)
+  def _reduce_164(val, _values, result)
+     result = val[0] += val[2] 
     result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 641)
-  def _reduce_164(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 640)
+  def _reduce_165(val, _values, result)
         val[1].each do |file|
         import(file)
     end
@@ -2172,8 +2181,8 @@ module_eval(<<'.,.,', 'grammar.ra', 641)
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 651)
-  def _reduce_165(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 650)
+  def _reduce_166(val, _values, result)
         @lexer.commentpop
     newdefine classname(val[1]), :arguments => val[2], :code => val[4], :line => val[0][:line]
     @lexer.indefine = false
@@ -2185,8 +2194,8 @@ module_eval(<<'.,.,', 'grammar.ra', 651)
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 658)
-  def _reduce_166(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 657)
+  def _reduce_167(val, _values, result)
         @lexer.commentpop
     newdefine classname(val[1]), :arguments => val[2], :line => val[0][:line]
     @lexer.indefine = false
@@ -2196,8 +2205,8 @@ module_eval(<<'.,.,', 'grammar.ra', 658)
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 666)
-  def _reduce_167(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 665)
+  def _reduce_168(val, _values, result)
         @lexer.commentpop
     # Our class gets defined in the parent namespace, not our own.
     @lexer.namepop
@@ -2208,8 +2217,8 @@ module_eval(<<'.,.,', 'grammar.ra', 666)
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 672)
-  def _reduce_168(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 671)
+  def _reduce_169(val, _values, result)
         @lexer.commentpop
     # Our class gets defined in the parent namespace, not our own.
     @lexer.namepop
@@ -2220,8 +2229,8 @@ module_eval(<<'.,.,', 'grammar.ra', 672)
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 680)
-  def _reduce_169(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 679)
+  def _reduce_170(val, _values, result)
         @lexer.commentpop
     newnode val[1], :parent => val[2], :code => val[4], :line => val[0][:line]
     result = nil
@@ -2230,8 +2239,8 @@ module_eval(<<'.,.,', 'grammar.ra', 680)
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 684)
-  def _reduce_170(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 683)
+  def _reduce_171(val, _values, result)
         @lexer.commentpop
     newnode val[1], :parent => val[2], :line => val[0][:line]
     result = nil
@@ -2240,38 +2249,38 @@ module_eval(<<'.,.,', 'grammar.ra', 684)
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 689)
-  def _reduce_171(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 688)
+  def _reduce_172(val, _values, result)
      result = val[0][:value] 
     result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 691)
-  def _reduce_172(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 690)
+  def _reduce_173(val, _values, result)
      result = val[0][:value] 
     result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 692)
-  def _reduce_173(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 691)
+  def _reduce_174(val, _values, result)
      result = val[0][:value] 
     result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 693)
-  def _reduce_174(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 692)
+  def _reduce_175(val, _values, result)
      result = "class" 
     result
   end
 .,.,
 
-# reduce 175 omitted
+# reduce 176 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 699)
-  def _reduce_176(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 698)
+  def _reduce_177(val, _values, result)
         result = val[0]
     result = [result] unless result.is_a?(Array)
     result << val[2]
@@ -2280,65 +2289,65 @@ module_eval(<<'.,.,', 'grammar.ra', 699)
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 705)
-  def _reduce_177(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 704)
+  def _reduce_178(val, _values, result)
         result = ast AST::HostName, :value => val[0]
 
     result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 708)
-  def _reduce_178(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 707)
+  def _reduce_179(val, _values, result)
      result = val[0][:value] 
     result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 709)
-  def _reduce_179(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 708)
+  def _reduce_180(val, _values, result)
      result = val[0][:value] 
     result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 710)
-  def _reduce_180(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 709)
+  def _reduce_181(val, _values, result)
      result = val[0][:value] 
     result
   end
 .,.,
 
-# reduce 181 omitted
+# reduce 182 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 714)
-  def _reduce_182(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 713)
+  def _reduce_183(val, _values, result)
         result = nil
 
     result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 718)
-  def _reduce_183(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 717)
+  def _reduce_184(val, _values, result)
         result = ast AST::ASTArray, :children => []
 
     result
   end
 .,.,
 
-# reduce 184 omitted
+# reduce 185 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 723)
-  def _reduce_185(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 722)
+  def _reduce_186(val, _values, result)
         result = nil
 
     result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 726)
-  def _reduce_186(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 725)
+  def _reduce_187(val, _values, result)
         result = val[1]
     result = [result] unless result[0].is_a?(Array)
 
@@ -2346,10 +2355,10 @@ module_eval(<<'.,.,', 'grammar.ra', 726)
   end
 .,.,
 
-# reduce 187 omitted
+# reduce 188 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 732)
-  def _reduce_188(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 731)
+  def _reduce_189(val, _values, result)
         result = val[0]
     result = [result] unless result[0].is_a?(Array)
     result << val[2]
@@ -2358,8 +2367,8 @@ module_eval(<<'.,.,', 'grammar.ra', 732)
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 738)
-  def _reduce_189(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 737)
+  def _reduce_190(val, _values, result)
         Puppet.warning addcontext("Deprecation notice: must now include '$' in prototype")
     result = [val[0][:value], val[2]]
 
@@ -2367,8 +2376,8 @@ module_eval(<<'.,.,', 'grammar.ra', 738)
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 742)
-  def _reduce_190(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 741)
+  def _reduce_191(val, _values, result)
         Puppet.warning addcontext("Deprecation notice: must now include '$' in prototype")
     result = [val[0][:value]]
 
@@ -2376,56 +2385,56 @@ module_eval(<<'.,.,', 'grammar.ra', 742)
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 745)
-  def _reduce_191(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 744)
+  def _reduce_192(val, _values, result)
         result = [val[0][:value], val[2]]
 
     result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 747)
-  def _reduce_192(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 746)
+  def _reduce_193(val, _values, result)
         result = [val[0][:value]]
 
     result
   end
 .,.,
 
-# reduce 193 omitted
+# reduce 194 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 752)
-  def _reduce_194(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 751)
+  def _reduce_195(val, _values, result)
         result = val[1]
 
     result
   end
 .,.,
 
-# reduce 195 omitted
+# reduce 196 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 757)
-  def _reduce_196(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 756)
+  def _reduce_197(val, _values, result)
         result = val[1]
 
     result
   end
 .,.,
 
-# reduce 197 omitted
-
 # reduce 198 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 763)
-  def _reduce_199(val, _values, result)
+# reduce 199 omitted
+
+module_eval(<<'.,.,', 'grammar.ra', 762)
+  def _reduce_200(val, _values, result)
         result = ast AST::Variable, :value => val[0][:value], :line => val[0][:line]
 
     result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 767)
-  def _reduce_200(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 766)
+  def _reduce_201(val, _values, result)
         if val[1].instance_of?(AST::ASTArray)
         result = val[1]
     else
@@ -2436,8 +2445,8 @@ module_eval(<<'.,.,', 'grammar.ra', 767)
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 774)
-  def _reduce_201(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 773)
+  def _reduce_202(val, _values, result)
         if val[1].instance_of?(AST::ASTArray)
         result = val[1]
     else
@@ -2448,37 +2457,37 @@ module_eval(<<'.,.,', 'grammar.ra', 774)
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 780)
-  def _reduce_202(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 779)
+  def _reduce_203(val, _values, result)
         result = ast AST::ASTArray
 
     result
   end
 .,.,
 
-# reduce 203 omitted
-
 # reduce 204 omitted
 
 # reduce 205 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 787)
-  def _reduce_206(val, _values, result)
+# reduce 206 omitted
+
+module_eval(<<'.,.,', 'grammar.ra', 786)
+  def _reduce_207(val, _values, result)
      result = nil 
     result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 790)
-  def _reduce_207(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 789)
+  def _reduce_208(val, _values, result)
         result = ast AST::Regex, :value => val[0][:value]
 
     result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 794)
-  def _reduce_208(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 793)
+  def _reduce_209(val, _values, result)
         if val[1].instance_of?(AST::ASTHash)
         result = val[1]
     else
@@ -2489,8 +2498,8 @@ module_eval(<<'.,.,', 'grammar.ra', 794)
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 801)
-  def _reduce_209(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 800)
+  def _reduce_210(val, _values, result)
         if val[1].instance_of?(AST::ASTHash)
         result = val[1]
     else
@@ -2501,18 +2510,18 @@ module_eval(<<'.,.,', 'grammar.ra', 801)
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 807)
-  def _reduce_210(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 806)
+  def _reduce_211(val, _values, result)
         result = ast AST::ASTHash
 
     result
   end
 .,.,
 
-# reduce 211 omitted
+# reduce 212 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 812)
-  def _reduce_212(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 811)
+  def _reduce_213(val, _values, result)
         if val[0].instance_of?(AST::ASTHash)
         result = val[0].merge(val[2])
     else
@@ -2524,40 +2533,40 @@ module_eval(<<'.,.,', 'grammar.ra', 812)
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 821)
-  def _reduce_213(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 820)
+  def _reduce_214(val, _values, result)
         result = ast AST::ASTHash, { :value => { val[0] => val[2] } }
 
     result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 824)
-  def _reduce_214(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 823)
+  def _reduce_215(val, _values, result)
      result = val[0][:value] 
     result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 825)
-  def _reduce_215(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 824)
+  def _reduce_216(val, _values, result)
      result = val[0] 
     result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 828)
-  def _reduce_216(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 827)
+  def _reduce_217(val, _values, result)
         result = ast AST::HashOrArrayAccess, :variable => val[0][:value], :key => val[2] 
 
     result
   end
 .,.,
 
-# reduce 217 omitted
+# reduce 218 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 833)
-  def _reduce_218(val, _values, result)
+module_eval(<<'.,.,', 'grammar.ra', 832)
+  def _reduce_219(val, _values, result)
         result = ast AST::HashOrArrayAccess, :variable => val[0], :key => val[2] 
 
     result
diff --git a/lib/puppet/parser/parser_support.rb b/lib/puppet/parser/parser_support.rb
index d43b0d3..24ee5fa 100644
--- a/lib/puppet/parser/parser_support.rb
+++ b/lib/puppet/parser/parser_support.rb
@@ -107,91 +107,15 @@ class Puppet::Parser::Parser
     end
 
     def find_hostclass(namespace, name)
-        find_or_load(namespace, name, :hostclass)
+        known_resource_types.find_or_load(namespace, name, :hostclass)
     end
 
     def find_definition(namespace, name)
-        find_or_load(namespace, name, :definition)
+        known_resource_types.find_or_load(namespace, name, :definition)
     end
 
-    def find_or_load(namespace, name, type)
-        method = "find_#{type}"
-        namespace = namespace.downcase
-        name      = name.downcase
-        fullname = (namespace + "::" + name).sub(/^::/, '')
-
-        if name =~ /^::/
-            names_to_try = [name.sub(/^::/, '')]
-        else
-            names_to_try = [fullname]
-
-            # Try to load the module init file if we're a qualified name
-            names_to_try << fullname.split("::")[0] if fullname.include?("::")
-
-            # Otherwise try to load the bare name on its own.  This
-            # is appropriate if the class we're looking for is in a
-            # module that's different from our namespace.
-            names_to_try << name
-            names_to_try.compact!
-        end
-
-        until (result = known_resource_types.send(method, namespace, name)) or names_to_try.empty? do
-            self.load(names_to_try.shift)
-        end
-        return result
-    end
-
-    # Import our files.
     def import(file)
-        if Puppet[:ignoreimport]
-            return AST::ASTArray.new(:children => [])
-        end
-        # use a path relative to the file doing the importing
-        if @lexer.file
-            dir = @lexer.file.sub(%r{[^/]+$},'').sub(/\/$/, '')
-        else
-            dir = "."
-        end
-        if dir == ""
-            dir = "."
-        end
-        result = ast AST::ASTArray
-
-        # We can't interpolate at this point since we don't have any
-        # scopes set up. Warn the user if they use a variable reference
-        raise "Got no file" unless file
-        pat = file
-        if pat.index("$")
-            Puppet.warning(
-               "The import of #{pat} contains a variable reference;" +
-               " variables are not interpolated for imports " +
-               "in file #{@lexer.file} at line #{@lexer.line}"
-            )
-        end
-        files = Puppet::Parser::Files.find_manifests(pat, :cwd => dir, :environment => @environment)
-        if files.size == 0
-            raise Puppet::ImportError.new("No file(s) found for import " +
-                                          "of '#{pat}'")
-        end
-
-        files.collect { |file|
-            parser = Puppet::Parser::Parser.new(@environment)
-            parser.files = self.files
-            Puppet.debug("importing '%s'" % file)
-
-            unless file =~ /^#{File::SEPARATOR}/
-                file = File.join(dir, file)
-            end
-            begin
-                parser.file = file
-            rescue Puppet::AlreadyImportedError
-                # This file has already been imported to just move on
-                next
-            end
-
-            # This will normally add code to the 'main' class.
-            parser.parse
-        }
+        known_resource_types.loader.import(file, @lexer.file)
     end
 
     def initialize(env)
@@ -203,69 +127,6 @@ class Puppet::Parser::Parser
     # Initialize or reset all of our variables.
     def initvars
         @lexer = Puppet::Parser::Lexer.new()
-        @files = {}
-        @loaded = []
-        @loading = {}
-        @loading.extend(MonitorMixin)
-        class << @loading
-            def done_with(item)
-                synchronize do 
-                    delete(item)[:busy].signal if self.has_key?(item) and self[item][:loader] == Thread.current
-                end
-            end
-            def owner_of(item)
-                synchronize do
-                    if !self.has_key? item
-                        self[item] = { :loader => Thread.current, :busy => self.new_cond}
-                        :nobody
-                      elsif self[item][:loader] == Thread.current
-                        :this_thread
-                      else
-                        flag = self[item][:busy]
-                        flag.wait
-                        flag.signal
-                        :another_thread
-                    end
-                end
-            end
-        end
-    end
-
-    # Utility method factored out of load
-    def able_to_import?(classname,item,msg)
-        unless @loaded.include?(item)
-            begin
-              case @loading.owner_of(item)
-              when :this_thread
-                  return
-              when :another_thread
-                  return able_to_import?(classname,item,msg)
-              when :nobody
-                  import(item)
-                  Puppet.info "Autoloaded #{msg}"
-                  @loaded << item
-              end
-            rescue Puppet::ImportError => detail
-                # We couldn't load the item
-            ensure
-                @loading.done_with(item)
-            end
-        end
-        # We don't know whether we're looking for a class or definition, so we have
-        # to test for both.
-        return known_resource_types.hostclass(classname) || known_resource_types.definition(classname)
-    end
-
-    # Try to load a class, since we could not find it.
-    def load(classname)
-        return false if classname == ""
-        filename = classname.gsub("::", File::SEPARATOR)
-        mod = filename.scan(/^[\w-]+/).shift
-
-        # First try to load the top-level module then the individual file
-        [[mod,     "module %s"              %            mod ],
-         [filename,"file %s from module %s" % [filename, mod]]
-        ].any? { |item,description| able_to_import?(classname,item,description) }
     end
 
     # Split an fq name into a namespace and name
@@ -365,15 +226,6 @@ class Puppet::Parser::Parser
         require self.file
     end
 
-    # See if any of the files have changed.
-    def reparse?
-        if file = @files.detect { |name, file| file.changed?  }
-            return file[1].stamp
-        else
-            return false
-        end
-    end
-
     def string=(string)
         @lexer.string = string
     end
diff --git a/lib/puppet/parser/type_loader.rb b/lib/puppet/parser/type_loader.rb
new file mode 100644
index 0000000..3268eae
--- /dev/null
+++ b/lib/puppet/parser/type_loader.rb
@@ -0,0 +1,144 @@
+require 'puppet/node/environment'
+
+class Puppet::Parser::TypeLoader
+    include Puppet::Node::Environment::Helper
+
+    class Helper < Hash
+        include MonitorMixin
+        def done_with(item)
+            synchronize do
+                delete(item)[:busy].signal if self.has_key?(item) and self[item][:loader] == Thread.current
+            end
+        end
+        def owner_of(item)
+            synchronize do
+                if !self.has_key? item
+                    self[item] = { :loader => Thread.current, :busy => self.new_cond}
+                    :nobody
+                  elsif self[item][:loader] == Thread.current
+                    :this_thread
+                  else
+                    flag = self[item][:busy]
+                    flag.wait
+                    flag.signal
+                    :another_thread
+                end
+            end
+        end
+    end
+
+    # Import our files.
+    def import(file, current_file = nil)
+        return if Puppet[:ignoreimport]
+
+        # use a path relative to the file doing the importing
+        if current_file
+            dir = current_file.sub(%r{[^/]+$},'').sub(/\/$/, '')
+        else
+            dir = "."
+        end
+        if dir == ""
+            dir = "."
+        end
+
+        pat = file
+        files = Puppet::Parser::Files.find_manifests(pat, :cwd => dir, :environment => environment)
+        if files.size == 0
+            raise Puppet::ImportError.new("No file(s) found for import of '#{pat}'")
+        end
+
+        files.each do |file|
+            unless file =~ /^#{File::SEPARATOR}/
+                file = File.join(dir, file)
+            end
+            @imported[file] = true
+            parse_file(file)
+        end
+    end
+
+    def imported?(file)
+        @imported.has_key?(file)
+    end
+
+    def known_resource_types
+        environment.known_resource_types
+    end
+
+    def initialize(env)
+        self.environment = env
+        @loaded = []
+        @loading = Helper.new
+
+        @imported = {}
+    end
+
+    def load_until(namespaces, name)
+        return nil if name == "" # special-case main.
+        name2files(namespaces, name).each do |filename|
+            import_if_possible(filename) do
+                  import(filename)
+                  @loaded << filename
+            end
+            if result = yield(filename)
+                Puppet.info "Automatically imported #{name} from #{filename}"
+                return result
+            end
+        end
+        nil
+    end
+
+    def loaded?(name)
+        @loaded.include?(name)
+    end
+
+    def name2files(namespaces, name)
+        return [name.sub(/^::/, '').gsub("::", File::SEPARATOR)] if name =~ /^::/
+
+        result = namespaces.inject([]) do |names_to_try, namespace|
+            fullname = (namespace + "::" + name).sub(/^::/, '')
+
+            # Try to load the module init file if we're a qualified name
+            if fullname.include?("::")
+                names_to_try << fullname.split("::")[0]
+            end
+
+            # Then the fully qualified name
+            names_to_try << fullname
+        end
+
+        # Otherwise try to load the bare name on its own.  This
+        # is appropriate if the class we're looking for is in a
+        # module that's different from our namespace.
+        result << name
+        result.uniq.collect { |f| f.gsub("::", File::SEPARATOR) }
+    end
+
+    def parse_file(file)
+        Puppet.debug("importing '#{file}'")
+        parser = Puppet::Parser::Parser.new(environment)
+        parser.file = file
+        parser.parse
+    end
+
+    private
+
+    # Utility method factored out of load for handling thread-safety.
+    # This isn't tested in the specs, because that's basically impossible.
+    def import_if_possible(file)
+        return if @loaded.include?(file)
+        begin
+          case @loading.owner_of(file)
+          when :this_thread
+              return
+          when :another_thread
+              return import_if_possible(file)
+          when :nobody
+              yield
+          end
+        rescue Puppet::ImportError => detail
+            # We couldn't load the item
+        ensure
+            @loading.done_with(file)
+        end
+    end
+end
diff --git a/lib/puppet/resource/type_collection.rb b/lib/puppet/resource/type_collection.rb
index 513c1c6..4dbf753 100644
--- a/lib/puppet/resource/type_collection.rb
+++ b/lib/puppet/resource/type_collection.rb
@@ -55,6 +55,11 @@ class Puppet::Resource::TypeCollection
         instance
     end
 
+    def loader
+        require 'puppet/parser/type_loader'
+        @loader ||= Puppet::Parser::TypeLoader.new(environment)
+    end
+
     def node(name)
         name = munge_name(name)
 
@@ -115,16 +120,30 @@ class Puppet::Resource::TypeCollection
         nil
     end
 
+    def find_or_load(namespaces, name, type)
+        name      = name.downcase
+        namespaces = [namespaces] unless namespaces.is_a?(Array)
+        namespaces = namespaces.collect { |ns| ns.downcase }
+
+        # This could be done in the load_until, but the knowledge seems to
+        # belong here.
+        if r = find(namespaces, name, type)
+            return r
+        end
+
+        return loader.load_until(namespaces, name) { find(namespaces, name, type) }
+    end
+
     def find_node(name)
         find("", name, :node)
     end
 
-    def find_hostclass(namespace, name)
-        find(namespace, name, :hostclass)
+    def find_hostclass(namespaces, name)
+        find_or_load(namespaces, name, :hostclass)
     end
 
-    def find_definition(namespace, name)
-        find(namespace, name, :definition)
+    def find_definition(namespaces, name)
+        find_or_load(namespaces, name, :definition)
     end
 
     [:hostclasses, :nodes, :definitions].each do |m|
diff --git a/spec/integration/resource/type_collection.rb b/spec/integration/resource/type_collection.rb
new file mode 100755
index 0000000..da309c6
--- /dev/null
+++ b/spec/integration/resource/type_collection.rb
@@ -0,0 +1,96 @@
+#!/usr/bin/env ruby
+
+require File.dirname(__FILE__) + '/../../spec_helper'
+
+require 'puppet_spec/files'
+require 'puppet/resource/type_collection'
+
+describe Puppet::Resource::TypeCollection do
+    describe "when autoloading from modules" do
+        include PuppetSpec::Files
+
+        before do
+            @dir = tmpfile("autoload_testing")
+            Puppet[:modulepath] = @dir
+
+            FileUtils.mkdir_p @dir
+            @code = Puppet::Resource::TypeCollection.new("env")
+            Puppet::Node::Environment.new("env").stubs(:known_resource_types).returns @code
+        end
+
+        # Setup a module.
+        def mk_module(name, files = {})
+            mdir = File.join(@dir, name)
+            mandir = File.join(mdir, "manifests")
+            FileUtils.mkdir_p mandir
+
+            defs = files.delete(:define)
+
+            Dir.chdir(mandir) do
+                files.each do |file, classes|
+                    File.open("#{file}.pp", "w") do |f|
+                        classes.each { |klass|
+                            if defs
+                                f.puts "define #{klass} {}"
+                            else
+                                f.puts "class #{klass} {}"
+                            end
+                        }
+                    end
+                end
+            end
+        end
+
+        it "should return nil when a class can't be found or loaded" do
+            @code.find_hostclass('', 'nosuchclass').should be_nil
+        end
+
+        it "should load the module's init file first" do
+            name = "simple"
+            mk_module(name, :init => [name])
+
+            @code.find_hostclass("", name).name.should == name
+        end
+
+        it "should load the module's init file even when searching from a different namespace" do
+            name = "simple"
+            mk_module(name, :init => [name])
+
+            @code.find_hostclass("other::ns", name).name.should == name
+        end
+
+        it "should be able to load definitions from the module base file" do
+            name = "simpdef"
+            mk_module(name, :define => true, :init => [name])
+            @code.find_definition("", name).name.should == name
+        end
+
+        it "should be able to load qualified classes from the module base file" do
+            modname = "both"
+            name = "sub"
+            mk_module(modname, :init => %w{both both::sub})
+
+            @code.find_hostclass("both", name).name.should == "both::sub"
+        end
+
+        it "should be able load classes from a separate file" do
+            modname = "separate"
+            name = "sub"
+            mk_module(modname, :init => %w{separate}, :sub => %w{separate::sub})
+            @code.find_hostclass("separate", name).name.should == "separate::sub"
+        end
+
+        it "should not fail when loading from a separate file if there is no module file" do
+            modname = "alone"
+            name = "sub"
+            mk_module(modname, :sub => %w{alone::sub})
+            lambda { @code.find_hostclass("alone", name) }.should_not raise_error
+        end
+
+        it "should be able to load definitions from their own file" do
+            name = "mymod"
+            mk_module(name, :define => true, :mydefine => ["mymod::mydefine"])
+            @code.find_definition("", "mymod::mydefine").name.should == "mymod::mydefine"
+        end
+    end
+end
diff --git a/spec/unit/parser/parser.rb b/spec/unit/parser/parser.rb
index ccb7e84..ed4492a 100755
--- a/spec/unit/parser/parser.rb
+++ b/spec/unit/parser/parser.rb
@@ -32,6 +32,13 @@ describe Puppet::Parser do
         parser = Puppet::Parser::Parser.new "development"
         parser.known_resource_types.should equal(rtc)
     end
+    
+    it "should delegate importing to the known resource type loader" do
+        parser = Puppet::Parser::Parser.new "development"
+        parser.known_resource_types.loader.expects(:import).with("newfile", "current_file")
+        parser.lexer.expects(:file).returns "current_file"
+        parser.import("newfile")
+    end
 
     describe "when parsing files" do
         before do
@@ -327,91 +334,19 @@ describe Puppet::Parser do
     end
 
     describe "when looking up definitions" do
-        it "should check for them by name" do
-            @parser.stubs(:find_or_load).with("namespace","name",:definition).returns(:this_value)
+        it "should use the known resource types to check for them by name" do
+            @parser.known_resource_types.stubs(:find_or_load).with("namespace","name",:definition).returns(:this_value)
             @parser.find_definition("namespace","name").should == :this_value
         end
     end
 
     describe "when looking up hostclasses" do
-        it "should check for them by name" do
-            @parser.stubs(:find_or_load).with("namespace","name",:hostclass).returns(:this_value)
+        it "should use the known resource types to check for them by name" do
+            @parser.known_resource_types.stubs(:find_or_load).with("namespace","name",:hostclass).returns(:this_value)
             @parser.find_hostclass("namespace","name").should == :this_value
         end
     end
 
-    describe "when looking up names" do
-        before :each do
-            @known_resource_types = mock 'loaded code'
-            @known_resource_types.stubs(:find_my_type).with('loaded_namespace',  'loaded_name').returns(true)
-            @known_resource_types.stubs(:find_my_type).with('bogus_namespace',   'bogus_name' ).returns(false)
-            @parser = Puppet::Parser::Parser.new "development"
-            @parser.stubs(:known_resource_types).returns @known_resource_types
-        end
-
-        describe "that are already loaded" do
-            it "should not try to load anything" do
-                @parser.expects(:load).never
-                @parser.find_or_load("loaded_namespace","loaded_name",:my_type)
-            end
-            it "should return true" do
-                @parser.find_or_load("loaded_namespace","loaded_name",:my_type).should == true
-            end
-        end
-
-        describe "that aren't already loaded" do
-            it "should first attempt to load them with the all lowercase fully qualified name" do
-                @known_resource_types.stubs(:find_my_type).with("foo_namespace","foo_name").returns(false,true,true)
-                @parser.expects(:load).with("foo_namespace::foo_name").returns(true).then.raises(Exception)
-                @parser.find_or_load("Foo_namespace","Foo_name",:my_type).should == true
-            end
-
-            it "should next attempt to load them with the all lowercase namespace" do
-                @known_resource_types.stubs(:find_my_type).with("foo_namespace","foo_name").returns(false,false,true,true)
-                @parser.expects(:load).with("foo_namespace::foo_name").returns(false).then.raises(Exception)
-                @parser.expects(:load).with("foo_namespace"          ).returns(true ).then.raises(Exception)
-                @parser.find_or_load("Foo_namespace","Foo_name",:my_type).should == true
-            end
-
-            it "should finally attempt to load them with the all lowercase unqualified name" do
-                @known_resource_types.stubs(:find_my_type).with("foo_namespace","foo_name").returns(false,false,false,true,true)
-                @parser.expects(:load).with("foo_namespace::foo_name").returns(false).then.raises(Exception)
-                @parser.expects(:load).with("foo_namespace"          ).returns(false).then.raises(Exception)
-                @parser.expects(:load).with(               "foo_name").returns(true ).then.raises(Exception)
-                @parser.find_or_load("Foo_namespace","Foo_name",:my_type).should == true
-            end
-
-            it "should return false if the name isn't found" do
-                @parser.stubs(:load).returns(false)
-                @parser.find_or_load("Bogus_namespace","Bogus_name",:my_type).should == false
-            end
-
-            it "should directly look for fully qualified classes" do
-                @known_resource_types.stubs(:find_hostclass).with("foo_namespace","::foo_name").returns(false, true)
-                @parser.expects(:load).with("foo_name").returns true
-                @parser.find_or_load("foo_namespace","::foo_name",:hostclass)
-            end
-        end
-    end
-
-    describe "when loading classnames" do
-        before :each do
-            @known_resource_types = mock 'loaded code'
-            @parser = Puppet::Parser::Parser.new "development"
-            @parser.stubs(:known_resource_types).returns @known_resource_types
-        end
-
-        it "should just return false if the classname is empty" do
-            @parser.expects(:import).never
-            @parser.load("").should == false
-        end
-
-        it "should just return true if the item is loaded" do
-            pending "Need to access internal state (@parser's @loaded) to force this"
-            @parser.load("").should == false
-        end
-    end
-
     describe "when parsing classes" do
         before :each do
             @krt = Puppet::Resource::TypeCollection.new("development")
diff --git a/spec/unit/parser/type_loader.rb b/spec/unit/parser/type_loader.rb
new file mode 100644
index 0000000..de181eb
--- /dev/null
+++ b/spec/unit/parser/type_loader.rb
@@ -0,0 +1,191 @@
+#!/usr/bin/env ruby
+
+require File.dirname(__FILE__) + '/../../spec_helper'
+
+require 'puppet/parser/type_loader'
+require 'puppet_spec/files'
+
+describe Puppet::Parser::TypeLoader do
+    include PuppetSpec::Files
+
+    before do
+        @loader = Puppet::Parser::TypeLoader.new(:myenv)
+    end
+
+    it "should support an environment" do
+        loader = Puppet::Parser::TypeLoader.new(:myenv)
+        loader.environment.name.should == :myenv
+    end
+
+    it "should include the Environment Helper" do
+        @loader.class.ancestors.should be_include(Puppet::Node::Environment::Helper)
+    end
+
+    it "should delegate its known resource types to its environment" do
+        @loader.known_resource_types.should be_instance_of(Puppet::Resource::TypeCollection)
+    end
+
+    describe "when loading names from namespaces" do
+        it "should do nothing if the name to import is an empty string" do
+            @loader.expects(:name2files).never
+            @loader.load_until(["foo"], "") { |f| false }.should be_nil
+        end
+
+        it "should turn the provided namespaces and name into a list of files" do
+            @loader.expects(:name2files).with(["foo"], "bar").returns []
+            @loader.load_until(["foo"], "bar") { |f| false }
+        end
+
+        it "should attempt to import each generated name" do
+            @loader.expects(:name2files).returns %w{foo bar}
+            @loader.expects(:import).with("foo")
+            @loader.expects(:import).with("bar")
+            @loader.load_until(["foo"], "bar") { |f| false }
+        end
+
+        it "should yield after each import" do
+            yielded = []
+            @loader.expects(:name2files).returns %w{foo bar}
+            @loader.expects(:import).with("foo")
+            @loader.expects(:import).with("bar")
+            @loader.load_until(["foo"], "bar") { |f| yielded << f; false }
+            yielded.should == %w{foo bar}
+        end
+
+        it "should stop importing when the yielded block returns true" do
+            yielded = []
+            @loader.expects(:name2files).returns %w{foo bar baz}
+            @loader.expects(:import).with("foo")
+            @loader.expects(:import).with("bar")
+            @loader.expects(:import).with("baz").never
+            @loader.load_until(["foo"], "bar") { |f| true if f == "bar" }
+        end
+
+        it "should return the result of the block" do
+            yielded = []
+            @loader.expects(:name2files).returns %w{foo bar baz}
+            @loader.expects(:import).with("foo")
+            @loader.expects(:import).with("bar")
+            @loader.expects(:import).with("baz").never
+            @loader.load_until(["foo"], "bar") { |f| 10 if f == "bar" }.should == 10
+        end
+
+        it "should return nil if the block never returns true" do
+            @loader.expects(:name2files).returns %w{foo bar}
+            @loader.expects(:import).with("foo")
+            @loader.expects(:import).with("bar")
+            @loader.load_until(["foo"], "bar") { |f| false }.should be_nil
+        end
+
+        it "should know when a given name has been loaded" do
+            @loader.expects(:name2files).returns %w{file}
+            @loader.expects(:import).with("file")
+            @loader.load_until(["foo"], "bar") { |f| true }
+            @loader.should be_loaded("file")
+        end
+    end
+
+    describe "when mapping names to files" do
+        {
+            [["foo"], "::bar::baz"] => %w{bar/baz},
+            [[""], "foo::bar"]      => %w{foo foo/bar},
+            [%w{foo}, "bar"]        => %w{foo foo/bar bar},
+            [%w{a b}, "bar"]        => %w{a a/bar b b/bar bar},
+            [%w{a::b::c}, "bar"]    => %w{a a/b/c/bar bar},
+            [%w{a::b}, "foo::bar"]  => %w{a a/b/foo/bar foo/bar}
+        }.each do |inputs, outputs|
+            it "should produce #{outputs.inspect} from the #{inputs[0].inspect} namespace and #{inputs[1]} name" do
+                @loader.name2files(*inputs).should == outputs
+            end
+        end
+    end
+
+    describe "when importing" do
+        before do
+            Puppet::Parser::Files.stubs(:find_manifests).returns %w{file}
+            @loader.stubs(:parse_file)
+        end
+
+        it "should return immediately when imports are being ignored" do
+            Puppet::Parser::Files.expects(:find_manifests).never
+            Puppet[:ignoreimport] = true
+            @loader.import("foo").should be_nil
+        end
+
+        it "should find all manifests matching the file or pattern" do
+            Puppet::Parser::Files.expects(:find_manifests).with { |pat, opts| pat == "myfile" }.returns %w{one}
+            @loader.import("myfile")
+        end
+
+        it "should use the directory of the current file if one is set" do
+            Puppet::Parser::Files.expects(:find_manifests).with { |pat, opts| opts[:cwd] == "/current" }.returns %w{one}
+            @loader.import("myfile", "/current/file")
+        end
+
+        it "should pass the environment when looking for files" do
+            Puppet::Parser::Files.expects(:find_manifests).with { |pat, opts| opts[:environment] == @loader.environment }.returns %w{one}
+            @loader.import("myfile")
+        end
+
+        it "should fail if no files are found" do
+            Puppet::Parser::Files.expects(:find_manifests).returns []
+            lambda { @loader.import("myfile") }.should raise_error(Puppet::ImportError)
+        end
+
+        it "should parse each found file" do
+            Puppet::Parser::Files.expects(:find_manifests).returns %w{/one}
+            @loader.expects(:parse_file).with("/one")
+            @loader.import("myfile")
+        end
+
+        it "should make each file qualified before attempting to parse it" do
+            Puppet::Parser::Files.expects(:find_manifests).returns %w{one}
+            @loader.expects(:parse_file).with("/current/one")
+            @loader.import("myfile", "/current/file")
+        end
+
+        it "should know when a given file has been imported" do
+            Puppet::Parser::Files.expects(:find_manifests).returns %w{/one}
+            @loader.import("myfile")
+
+            @loader.should be_imported("/one")
+        end
+
+        it "should not attempt to import files that have already been imported" do
+            Puppet::Parser::Files.expects(:find_manifests).returns %w{/one}
+            @loader.expects(:parse_file).once
+            @loader.import("myfile")
+
+            # This will fail if it tries to reimport the file.
+            @loader.import("myfile")
+        end
+    end
+
+    describe "when parsing a file" do
+        before do
+            @parser = Puppet::Parser::Parser.new(@loader.environment)
+            @parser.stubs(:parse)
+            @parser.stubs(:file=)
+            Puppet::Parser::Parser.stubs(:new).with(@loader.environment).returns @parser
+        end
+
+        it "should create a new parser instance for each file using the current environment" do
+            Puppet::Parser::Parser.expects(:new).with(@loader.environment).returns @parser
+            @loader.parse_file("/my/file")
+        end
+
+        it "should assign the parser its file and parse" do
+            @parser.expects(:file=).with("/my/file")
+            @parser.expects(:parse)
+            @loader.parse_file("/my/file")
+        end
+    end
+
+    it "should be able to add classes to the current resource type collection" do
+        file = tmpfile("simple_file")
+        File.open(file, "w") { |f| f.puts "class foo {}" }
+        @loader.import(file)
+
+        @loader.known_resource_types.hostclass("foo").should be_instance_of(Puppet::Resource::Type)
+    end
+end
diff --git a/spec/unit/resource/type_collection.rb b/spec/unit/resource/type_collection.rb
index ea78afc..638a028 100644
--- a/spec/unit/resource/type_collection.rb
+++ b/spec/unit/resource/type_collection.rb
@@ -21,6 +21,10 @@ describe Puppet::Resource::TypeCollection do
         Puppet::Resource::TypeCollection.new("testing").environment.should equal(env)
     end
 
+    it "should create a 'loader' at initialization" do
+        Puppet::Resource::TypeCollection.new("testing").loader.should be_instance_of(Puppet::Parser::TypeLoader)
+    end
+
     it "should be able to add a resource type" do
         Puppet::Resource::TypeCollection.new("env").should respond_to(:add)
     end
@@ -85,6 +89,51 @@ describe Puppet::Resource::TypeCollection do
         loader.node("node").should be_nil
     end
 
+    describe "when looking up names" do
+        before do
+            @type = Puppet::Resource::Type.new(:hostclass, "ns::klass")
+        end
+
+        it "should support looking up with multiple namespaces" do
+            @code.add @type
+            @code.find_hostclass(%w{boo baz ns}, "klass").should equal(@type)
+        end
+
+        it "should not attempt to import anything when the type is already defined" do
+            @code.add @type
+            @code.loader.expects(:import).never
+            @code.find_hostclass(%w{ns}, "klass").should equal(@type)
+        end
+
+        describe "that need to be loaded" do
+            it "should use the loader to load the files" do
+                @code.loader.expects(:load_until).with(["ns"], "klass")
+                @code.find_or_load(["ns"], "klass", :hostclass)
+            end
+
+            it "should downcase the name and downcase and array-fy the namespaces before passing to the loader" do
+                @code.loader.expects(:load_until).with(["ns"], "klass")
+                @code.find_or_load("Ns", "Klass", :hostclass)
+            end
+
+            it "should attempt to find the type when the loader yields" do
+                @code.loader.expects(:load_until).yields
+                @code.expects(:find).with(["ns"], "klass", :hostclass).times(2).returns(false).then.returns(true)
+                @code.find_or_load("ns", "klass", :hostclass)
+            end
+
+            it "should return the result of 'load_until'" do
+                @code.loader.expects(:load_until).returns "foo"
+                @code.find_or_load("Ns", "Klass", :hostclass).should == "foo"
+            end
+
+            it "should return nil if the name isn't found" do
+                @code.stubs(:load_until).returns(nil)
+                @code.find_or_load("Ns", "Klass", :hostclass).should be_nil
+            end
+        end
+    end
+
     %w{hostclass node definition}.each do |data|
         before do
             @instance = Puppet::Resource::Type.new(data, "foo")
@@ -217,15 +266,15 @@ describe Puppet::Resource::TypeCollection do
         loader.find_node("bar")
     end
 
-    it "should use the generic 'find' method to find hostclasses" do
+    it "should use the 'find_or_load' method to find hostclasses" do
         loader = Puppet::Resource::TypeCollection.new("env")
-        loader.expects(:find).with("foo", "bar", :hostclass)
+        loader.expects(:find_or_load).with("foo", "bar", :hostclass)
         loader.find_hostclass("foo", "bar")
     end
 
-    it "should use the generic 'find' method to find definitions" do
+    it "should use the 'find_or_load' method to find definitions" do
         loader = Puppet::Resource::TypeCollection.new("env")
-        loader.expects(:find).with("foo", "bar", :definition)
+        loader.expects(:find_or_load).with("foo", "bar", :definition)
         loader.find_definition("foo", "bar")
     end
 
diff --git a/test/language/parser.rb b/test/language/parser.rb
index db6177d..18688aa 100755
--- a/test/language/parser.rb
+++ b/test/language/parser.rb
@@ -655,65 +655,6 @@ file { "/tmp/yayness":
         }
     end
 
-    def test_module_import
-        basedir = File.join(tmpdir(), "module-import")
-        @@tmpfiles << basedir
-        Dir.mkdir(basedir)
-        modfiles = [ "init.pp", "mani1.pp", "mani2.pp",
-                     "sub/smani1.pp", "sub/smani2.pp" ]
-
-        modpath = File.join(basedir, "modules")
-        Puppet[:modulepath] = modpath
-
-        modname = "amod"
-        manipath = File::join(modpath, modname, Puppet::Module::MANIFESTS)
-        FileUtils::mkdir_p(File::join(manipath, "sub"))
-        targets = []
-        modfiles.each do |fname|
-            target = File::join(basedir, File::basename(fname, '.pp'))
-            targets << target
-            txt = %[ file { '#{target}': content => "#{fname}" } ]
-            if fname == "init.pp"
-                txt = %[import 'mani1' \nimport '#{modname}/mani2'\nimport '#{modname}/sub/*.pp'\n ] + txt
-            end
-            File::open(File::join(manipath, fname), "w") do |f|
-                f.puts txt
-            end
-        end
-
-        manifest_texts = [ "import '#{modname}'",
-                           "import '#{modname}/init'",
-                           "import '#{modname}/init.pp'" ]
-
-        manifest = File.join(modpath, "manifest.pp")
-        manifest_texts.each do |txt|
-            File.open(manifest, "w") { |f| f.puts txt }
-
-            assert_nothing_raised {
-                parser = mkparser
-                parser.file = manifest
-                parser.parse
-            }
-            assert_creates(manifest, *targets)
-        end
-    end
-
-    # #544
-    def test_ignoreimports
-        parser = mkparser
-
-        assert(! Puppet[:ignoreimport], ":ignoreimport defaulted to true")
-        assert_raise(Puppet::ParseError, "Did not fail on missing import") do
-            parser.parse("import 'nosuchfile'")
-        end
-        assert_nothing_raised("could not set :ignoreimport") do
-            Puppet[:ignoreimport] = true
-        end
-        assert_nothing_raised("Parser did not follow :ignoreimports") do
-            parser.parse("import 'nosuchfile'")
-        end
-    end
-
     def test_multiple_imports_on_one_line
         one = tempfile
         two = tempfile
@@ -744,22 +685,6 @@ file { "/tmp/yayness":
         end
     end
 
-    # #588
-    def test_globbing_with_directories
-        dir = tempfile
-        Dir.mkdir(dir)
-        subdir = File.join(dir, "subdir")
-        Dir.mkdir(subdir)
-        file = File.join(dir, "file.pp")
-        maker = tempfile
-        File.open(file, "w") { |f| f.puts "file { '#{maker}': ensure => file }" }
-
-        parser = mkparser
-        assert_nothing_raised("Globbing failed when it matched a directory") do
-            parser.import("%s/*" % dir)
-        end
-    end
-
     # #629 - undef keyword
     def test_undef
         parser = mkparser
@@ -805,128 +730,6 @@ file { "/tmp/yayness":
         end
     end
 
-    # Setup a module.
-    def mk_module(name, files = {})
-        mdir = File.join(@dir, name)
-        mandir = File.join(mdir, "manifests")
-        FileUtils.mkdir_p mandir
-
-        if defs = files[:define]
-            files.delete(:define)
-        end
-        Dir.chdir(mandir) do
-            files.each do |file, classes|
-                File.open("%s.pp" % file, "w") do |f|
-                    classes.each { |klass|
-                        if defs
-                            f.puts "define %s {}" % klass
-                        else
-                            f.puts "class %s {}" % klass
-                        end
-                    }
-                end
-            end
-        end
-    end
-
-    # #596 - make sure classes and definitions load automatically if they're in modules, so we don't have to manually load each one.
-    def test_module_autoloading
-        @dir = tempfile
-        Puppet[:modulepath] = @dir
-
-        FileUtils.mkdir_p @dir
-
-        parser = mkparser
-
-        # Make sure we fail like normal for actually missing classes
-        assert_nil(parser.find_hostclass("", "nosuchclass"), "Did not return nil on missing classes")
-
-        # test the simple case -- the module class itself
-        name = "simple"
-        mk_module(name, :init => [name])
-
-        # Try to load the module automatically now
-        klass = parser.find_hostclass("", name)
-        assert_instance_of(Puppet::Resource::Type, klass, "Did not autoload class from module init file")
-        assert_equal(name, klass.name, "Incorrect class was returned")
-
-        # Try loading the simple module when we're in something other than the base namespace.
-        parser = mkparser
-        klass = parser.find_hostclass("something::else", name)
-        assert_instance_of(Puppet::Resource::Type, klass, "Did not autoload class from module init file")
-        assert_equal(name, klass.name, "Incorrect class was returned")
-
-        # Now try it with a definition as the base file
-        name = "simpdef"
-        mk_module(name, :define => true, :init => [name])
-
-        klass = parser.find_definition("", name)
-        assert_instance_of(Puppet::Resource::Type, klass, "Did not autoload class from module init file")
-        assert_equal(name, klass.name, "Incorrect class was returned")
-
-        # Now try it with namespace classes where both classes are in the init file
-        parser = mkparser
-        modname = "both"
-        name = "sub"
-        mk_module(modname, :init => %w{both both::sub})
-
-        # First try it with a namespace
-        klass = parser.find_hostclass("both", name)
-        assert_instance_of(Puppet::Resource::Type, klass, "Did not autoload sub class from module init file with a namespace")
-        assert_equal("both::sub", klass.name, "Incorrect class was returned")
-
-        # Now try it using the fully qualified name
-        parser = mkparser
-        klass = parser.find_hostclass("", "both::sub")
-        assert_instance_of(Puppet::Resource::Type, klass, "Did not autoload sub class from module init file with no namespace")
-        assert_equal("both::sub", klass.name, "Incorrect class was returned")
-
-
-        # Now try it with the class in a different file
-        parser = mkparser
-        modname = "separate"
-        name = "sub"
-        mk_module(modname, :init => %w{separate}, :sub => %w{separate::sub})
-
-        # First try it with a namespace
-        klass = parser.find_hostclass("separate", name)
-        assert_instance_of(Puppet::Resource::Type, klass, "Did not autoload sub class from separate file with a namespace")
-        assert_equal("separate::sub", klass.name, "Incorrect class was returned")
-
-        # Now try it using the fully qualified name
-        parser = mkparser
-        klass = parser.find_hostclass("", "separate::sub")
-        assert_instance_of(Puppet::Resource::Type, klass, "Did not autoload sub class from separate file with no namespace")
-        assert_equal("separate::sub", klass.name, "Incorrect class was returned")
-
-        # Now make sure we don't get a failure when there's no module file
-        parser = mkparser
-        modname = "alone"
-        name = "sub"
-        mk_module(modname, :sub => %w{alone::sub})
-
-        # First try it with a namespace
-        assert_nothing_raised("Could not autoload file when module file is missing") do
-            klass = parser.find_hostclass("alone", name)
-        end
-        assert_instance_of(Puppet::Resource::Type, klass, "Did not autoload sub class from alone file with a namespace")
-        assert_equal("alone::sub", klass.name, "Incorrect class was returned")
-
-        # Now try it using the fully qualified name
-        parser = mkparser
-        klass = parser.find_hostclass("", "alone::sub")
-        assert_instance_of(Puppet::Resource::Type, klass, "Did not autoload sub class from alone file with no namespace")
-        assert_equal("alone::sub", klass.name, "Incorrect class was returned")
-
-        # and with the definition in its own file
-        name = "mymod"
-        mk_module(name, :define => true, :mydefine => ["mymod::mydefine"])
-
-        klass = parser.find_definition("", "mymod::mydefine")
-        assert_instance_of(Puppet::Resource::Type, klass, "Did not autoload definition from its own file")
-        assert_equal("mymod::mydefine", klass.name, "Incorrect definition was returned")
-    end
-
     # Make sure class, node, and define methods are case-insensitive
     def test_structure_case_insensitivity
         parser = mkparser

-- 
Puppet packaging for Debian



More information about the Pkg-puppet-devel mailing list