Merge: App.nit Data Store
authorJean Privat <jean@pryen.org>
Thu, 25 Sep 2014 02:08:12 +0000 (22:08 -0400)
committerJean Privat <jean@pryen.org>
Thu, 25 Sep 2014 02:08:12 +0000 (22:08 -0400)
Portable data storage services for app.nit.

May not pass the mnit_simple test before mergin the Intent PR #644.

Closes #559

Pull-Request: #662
Reviewed-by: Lucas Bajolet <r4pass@hotmail.com>
Reviewed-by: Jean Privat <jean@pryen.org>
Reviewed-by: Romain Chanoir <chanoir.romain@courrier.uqam.ca>
Reviewed-by: Frédéric Vachon <fredvac@gmail.com>

181 files changed:
Makefile
contrib/benitlux/.gitignore [new file with mode: 0644]
contrib/benitlux/Makefile [new file with mode: 0644]
contrib/benitlux/README.md [new file with mode: 0644]
contrib/benitlux/src/benitlux_controller.nit [new file with mode: 0644]
contrib/benitlux/src/benitlux_daily.nit [new file with mode: 0644]
contrib/benitlux/src/benitlux_db.nit [new file with mode: 0644]
contrib/benitlux/src/benitlux_model.nit [new file with mode: 0644]
contrib/benitlux/src/benitlux_view.nit [new file with mode: 0644]
contrib/benitlux/src/benitlux_web.nit [new file with mode: 0644]
contrib/nitcc/src/grammar.nit
contrib/pep8analysis/src/ast/pretty_instructions.nit
contrib/pep8analysis/src/cfg/cfg_base.nit
contrib/pep8analysis/src/parser/xss/parser.xss
contrib/pep8analysis/www/index.html
contrib/tnitter/src/action.nit
examples/leapfrog/leapfrog.nit
examples/mnit_dino/src/game_logic.nit
examples/nitcorn/Makefile
examples/nitcorn/src/xymus_net.nit [new file with mode: 0644]
examples/shoot/src/shoot_logic.nit
lib/android/audio.nit
lib/android/sensors.nit
lib/bucketed_game.nit
lib/cpp.nit
lib/crypto.nit [new file with mode: 0644]
lib/csv.nit
lib/curl/curl.nit
lib/curl/curl_c.nit
lib/egl.nit
lib/for_abuse.nit
lib/glesv2.nit
lib/ini.nit
lib/markdown/README [new file with mode: 0644]
lib/markdown/markdown.nit [new file with mode: 0644]
lib/markdown/nitmd.nit [new file with mode: 0644]
lib/markdown/test_markdown.nit [new file with mode: 0644]
lib/mnit/mnit_app.nit
lib/mnit/mnit_fps.nit
lib/mnit/mnit_null.nit
lib/mnit/tileset.nit
lib/neo4j/curl_json.nit
lib/nitcc_runtime.nit
lib/nitcorn/file_server.nit
lib/nitcorn/http_errors.nit [new file with mode: 0644]
lib/nitcorn/http_request.nit
lib/nitcorn/media_types.nit
lib/nitcorn/reactor.nit
lib/nitcorn/server_config.nit
lib/opts.nit
lib/pnacl.nit
lib/scene2d.nit
lib/standard/collection/abstract_collection.nit
lib/standard/file.nit
lib/standard/math.nit
lib/standard/posix.nit
lib/standard/re.nit [new file with mode: 0644]
lib/standard/standard.nit
lib/standard/string.nit
lib/standard/string_search.nit
lib/string_experimentations/utf8.nit
lib/template/macro.nit [new file with mode: 0644]
lib/template/template.nit [moved from lib/template.nit with 100% similarity]
lib/template/test_macro.nit [new file with mode: 0644]
lib/trees/abstract_tree.nit
lib/x11.nit
misc/vim/syntax_checkers/nit/nitg.vim
share/nitdoc/css/nitdoc.css
src/Makefile
src/compiler/abstract_compiler.nit
src/compiler/android_platform.nit
src/compiler/compiler_ffi.nit
src/compiler/global_compiler.nit
src/compiler/separate_compiler.nit
src/compiler/separate_erasure_compiler.nit
src/doc/doc_model.nit
src/doc/doc_pages.nit
src/doc/doc_templates.nit
src/ffi/c.nit [moved from src/common_ffi/c.nit with 98% similarity]
src/ffi/c_compiler_options.nit [moved from src/common_ffi/c_compiler_options.nit with 100% similarity]
src/ffi/cpp.nit [moved from src/common_ffi/cpp.nit with 99% similarity]
src/ffi/extern_classes.nit [moved from src/common_ffi/extern_classes.nit with 100% similarity]
src/ffi/extra_java_files.nit [moved from src/common_ffi/extra_java_files.nit with 100% similarity]
src/ffi/ffi.nit [moved from src/common_ffi/common_ffi.nit with 98% similarity]
src/ffi/ffi_base.nit [moved from src/common_ffi/ffi_base.nit with 100% similarity]
src/ffi/header_dependency.nit [moved from src/common_ffi/header_dependency.nit with 98% similarity]
src/ffi/java.nit [moved from src/common_ffi/java.nit with 99% similarity]
src/ffi/pkgconfig.nit [moved from src/common_ffi/pkgconfig.nit with 89% similarity]
src/frontend/check_annotation.nit
src/frontend/serialization_phase.nit
src/frontend/simple_misc_analysis.nit
src/highlight.nit
src/interpreter/naive_interpreter.nit
src/model/mdoc.nit
src/model/mmodule.nit
src/model/model.nit
src/model/model_base.nit
src/model/model_viz.nit
src/model/mproject.nit
src/model_utils.nit
src/modelbuilder.nit
src/modelize/modelize_class.nit
src/modelize/modelize_property.nit
src/neo.nit
src/nit.nit
src/nitni/nitni_callbacks.nit
src/nitpick.nit [new file with mode: 0644]
src/nitpretty.nit
src/nitserial.nit
src/nituml.nit [new file with mode: 0644]
src/nitx.nit
src/parser/lexer.nit
src/parser/lexer_work.nit
src/parser/nit.sablecc3xx
src/parser/parser.nit
src/parser/parser_abs.nit
src/parser/parser_nodes.nit
src/parser/parser_prod.nit
src/parser/tables_nit.c
src/parser/xss/tokens.xss
src/phase.nit
src/rapid_type_analysis.nit
src/semantize/scope.nit
src/semantize/typing.nit
src/test_docdown.nit [moved from src/test_markdown.nit with 99% similarity]
src/test_neo.nit
src/testing/testing_doc.nit
src/testing/testing_suite.nit
src/toolcontext.nit
src/uml/uml.nit [new file with mode: 0644]
src/uml/uml_base.nit [new file with mode: 0644]
src/uml/uml_class.nit [new file with mode: 0644]
src/uml/uml_module.nit [new file with mode: 0644]
src/vm.nit
tests/base_deprecated.nit [new file with mode: 0644]
tests/nituml.args [new file with mode: 0644]
tests/sav/base_control_flow2.res
tests/sav/base_control_flow2_alt1.res
tests/sav/base_control_flow2_alt2.res
tests/sav/base_control_flow2_alt3.res
tests/sav/base_control_flow2_alt4.res
tests/sav/base_control_flow2_alt5.res
tests/sav/base_control_flow2_alt6.res
tests/sav/base_control_flow2_alt7.res
tests/sav/base_deprecated.res [new file with mode: 0644]
tests/sav/base_deprecated_alt1.res [new file with mode: 0644]
tests/sav/error_expr_not_ok.res
tests/sav/error_expr_not_ok_alt2.res
tests/sav/error_expr_not_ok_alt3.res
tests/sav/error_expr_not_ok_alt4.res
tests/sav/error_expr_not_ok_alt5.res
tests/sav/error_expr_not_ok_alt6.res
tests/sav/error_fun_ret4.res
tests/sav/fixme/nitpretty_args21.res [new file with mode: 0644]
tests/sav/fixme/nitpretty_args22.res [new file with mode: 0644]
tests/sav/nit.res
tests/sav/nitlight_args1.res
tests/sav/nitmd.res [new file with mode: 0644]
tests/sav/nitmetrics_args1.res
tests/sav/nitpick.res [new file with mode: 0644]
tests/sav/nitpretty_args22.res
tests/sav/nitpretty_args23.res
tests/sav/nituml.res [new file with mode: 0644]
tests/sav/nituml_args1.res [new file with mode: 0644]
tests/sav/nituml_args2.res [new file with mode: 0644]
tests/sav/nituml_args3.res [new file with mode: 0644]
tests/sav/nituml_args4.res [new file with mode: 0644]
tests/sav/test_docdown.res [moved from tests/sav/test_markdown.res with 100% similarity]
tests/sav/test_docdown_args1.res [moved from tests/sav/test_markdown_args1.res with 100% similarity]
tests/sav/test_ffi_c_polymorphism.res [new file with mode: 0644]
tests/sav/test_ffi_c_polymorphism_alt1.res [new file with mode: 0644]
tests/sav/test_ffi_c_polymorphism_alt2.res [new file with mode: 0644]
tests/sav/test_neo_args1.res
tests/sav/test_parser_args1.res
tests/sav/test_parser_args7.res
tests/sav/test_return.res
tests/sav/xymus_net.res [new file with mode: 0644]
tests/test_ffi_c_polymorphism.nit [new file with mode: 0644]
tests/test_pretty/test_attr1.nit
tests/test_pretty/test_attr2.nit
tests/test_prog/rpg/character.nit

index e52265e..636e0ce 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -40,7 +40,7 @@ doc/stdlib/index.html: bin/nitdoc bin/nitls
        @echo '***************************************************************'
        @echo '* Generate doc for NIT standard library                       *'
        @echo '***************************************************************'
-       bin/nitdoc $$(bin/nitls lib -r --path) -d doc/stdlib \
+       bin/nitdoc $$(bin/nitls lib -rs --path) -d doc/stdlib \
                --custom-title "Nit Standard Library" \
                --custom-brand "<a href=\"http://nitlanguage.org/\">Nitlanguage.org</a>" \
                --custom-overview-text "<p>Documentation for the standard library of Nit<br/>Version $$(git describe)<br/>Date: $$(git show --format="%cd" | head -1)</p>" \
@@ -52,8 +52,8 @@ doc/stdlib/index.html: bin/nitdoc bin/nitls
                --piwik-tracker "pratchett.info.uqam.ca/piwik/" \
                --piwik-site-id "2" \
 
-doc/nitc/index.html: bin/nitdoc
-       bin/nitdoc $$(bin/nitls lib -r --path) src/nit*.nit src/test_*.nit -d doc/nitc \
+doc/nitc/index.html: bin/nitdoc bin/nitls
+       bin/nitdoc $$(bin/nitls lib -rs --path) src/nit*.nit src/test_*.nit -d doc/nitc \
                --private \
                --custom-title "Nit Compilers and Tools" \
                --custom-brand "<a href=\"http://nitlanguage.org/\">Nitlanguage.org</a>" \
diff --git a/contrib/benitlux/.gitignore b/contrib/benitlux/.gitignore
new file mode 100644 (file)
index 0000000..e4e2a7d
--- /dev/null
@@ -0,0 +1,3 @@
+src/benitlux_serial.nit
+*.db
+*.email
diff --git a/contrib/benitlux/Makefile b/contrib/benitlux/Makefile
new file mode 100644 (file)
index 0000000..4dcab2d
--- /dev/null
@@ -0,0 +1,8 @@
+all: server
+
+server:
+       mkdir -p bin/
+       ../../bin/nitg --dir bin/ src/benitlux_daily.nit src/benitlux_web.nit
+
+src/benitlux_serial.nit:
+       ../../bin/nitserial -o $@ src/benitlux_web.nit
diff --git a/contrib/benitlux/README.md b/contrib/benitlux/README.md
new file mode 100644 (file)
index 0000000..db4c127
--- /dev/null
@@ -0,0 +1,34 @@
+Benitlux is an unofficial mailing list to keep faithful bargoers informed of the current beer offer at the excellent Brasserie Bénélux <http://brasseriebenelux.com/>.
+
+This project is composed of two softwares:
+
+* a Web interface to subscribe and unsubscribe,
+* and a daily background program which updates the BD and send emails.
+
+The web interface is currently published at <http://benitlux.xymus.net/>
+
+# Compile and execute
+
+Make sure all the required packages are installed. Under Debian or Ubuntu, you can use: `apt-get install libevent-dev libsqlite3-dev libcurl4-gnutls-dev sendmail`
+
+To compile, run: `make`
+
+To launch the daily background program, run: `bin/benitlux_daily` (the argument `-e` activates sending emails)
+
+To launch the Web interface, run: `bin/benitlux_web`
+
+The Web interface will be accessible at <http://localhost:8080/>
+
+# Features and TODO
+
+- [x] Web page parser
+- [x] Daily mailer
+- [x] Web interface
+- [x] Serialization and deserialization of data classes
+- [ ] Android app
+- [ ] iOS app
+- [ ] Charlevoix location support
+- [ ] Customize mails (daily, on change, per locations)
+- [ ] Authenticate unsubscribe actions over GET
+- [ ] Social network and location updates
+- [ ] Event updates
diff --git a/contrib/benitlux/src/benitlux_controller.nit b/contrib/benitlux/src/benitlux_controller.nit
new file mode 100644 (file)
index 0000000..84ae549
--- /dev/null
@@ -0,0 +1,125 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2014 Alexis Laferrière <alexis.laf@xymus.net>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Actions for the Web interface of Benitlux
+module benitlux_controller
+
+import nitcorn
+import json_serialization
+
+import benitlux_model
+import benitlux_db
+import benitlux_view
+
+abstract class BenitluxAction
+       super Action
+
+       # Path to the database
+       var db_path = "benitlux_sherbrooke.db"
+
+       # Path to the storage of the last email sent
+       var sample_email_path = "benitlux_sherbrooke.email"
+end
+
+# Web interface to subscribe to the mailing list
+class BenitluxSubscriptionAction
+       super BenitluxAction
+
+       redef fun answer(request, turi)
+       do
+               var template = new BenitluxDocument
+
+               var sub = request.post_args.keys.has("sub")
+               var unsub = request.all_args.keys.has("unsub")
+
+               var email = null
+               if request.all_args.keys.has("email") then email = request.all_args["email"].trim
+
+               if email != null then
+                       if email.is_empty or not email.chars.has('@') or not email.chars.has('.') then
+                               template.message_level = "danger"
+                               template.message_content = "Invalid email."
+                       else if sub and request.post_args.keys.has("email") then
+                               template.message_level = "success"
+                               template.message_content = "Subscription successful!"
+
+                               var db = new DB.open(db_path)
+                               db.subscribe email
+                               db.close
+                       else if unsub then
+                               template.message_level = "warning"
+                               template.message_content = "You've been unsubscribed."
+
+                               var db = new DB.open(db_path)
+                               db.unsubscribe email
+                               db.close
+                       end
+               end
+
+               if sample_email_path.file_exists then
+                       var f = new IFStream.open(sample_email_path)
+                       var lines = new Array[String]
+                       for line in f.read_all.split_with("\n") do if not line.is_empty then lines.add line
+                       f.close
+                       template.sample_email_lines = lines
+               end
+
+               var response = new HttpResponse(200)
+               response.body = template.write_to_string
+               return response
+       end
+end
+
+# RESTful interface to compare beer offer between given dates
+#
+# Expects request in the format of `since/2014-07-24`, will replay with a
+# `BeerEvents` serialized to Json with the necessary meta-data to be deserialized.
+class BenitluxRESTAction
+       super BenitluxAction
+
+       redef fun answer(request, turi)
+       do
+               var words = turi.split("/")
+               if not words.is_empty and words.first.is_empty then words.shift
+
+               if words.length >= 2 and words[0] == "since" then
+                       var since = words[1]
+
+                       var db = new DB.open(db_path)
+                       var events = db.beer_events_since(since.to_sql_string)
+                       db.close
+
+                       if events == null then
+                               var response = new HttpResponse(400)
+                               response.body = "Bad request"
+                               return response
+                       end
+
+                       var stream = new StringOStream
+                       var serializer = new JsonSerializer(stream)
+                       serializer.serialize events
+                       var serialized = stream.to_s
+
+                       var response = new HttpResponse(200)
+                       response.body = serialized
+                       return response
+               end
+
+               var response = new HttpResponse(400)
+               response.body = "Bad request"
+               return response
+       end
+end
diff --git a/contrib/benitlux/src/benitlux_daily.nit b/contrib/benitlux/src/benitlux_daily.nit
new file mode 100644 (file)
index 0000000..8121683
--- /dev/null
@@ -0,0 +1,240 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2014 Alexis Laferrière <alexis.laf@xymus.net>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Daily program to fetch and parse the Web site, update the database and email subscribers
+module benitlux_daily
+
+import curl
+import sendmail
+import opts
+
+import benitlux_model
+import benitlux_db
+
+redef class Text
+       # Return a `String` without any HTML tags (such as `<br />`) from `recv`
+       fun strip_tags: String
+       do
+               var str = to_s
+               var new_str = ""
+
+               var from = 0
+               loop
+                       var at = str.index_of_from('<', from)
+                       if at == -1 then break
+
+                       new_str += str.substring(from, at-from)
+
+                       at = str.index_of_from('>', at)
+                       assert at != -1
+
+                       from = at+1
+               end
+
+               return new_str
+       end
+
+       # Return an `Array` of the non-empty lines in `self`
+       #
+       #     assert ["a", "asdf", "", "  ", "&nbsp;", "b"].to_clean_lines == ["a", "asdf", "b"]
+       fun to_clean_lines: Array[String]
+       do
+               var orig_lines = split_with("\n")
+               var new_lines = new Array[String]
+
+               for line in orig_lines do
+                       line = line.trim
+
+                       # remove empty lines
+                       if line == "&nbsp;" then continue
+                       if line.is_empty then continue
+
+                       new_lines.add line.to_s
+               end
+
+               return new_lines
+       end
+end
+
+# Main logic of the program to be executed daily
+class Benitlux
+       # The street on which is the Benelux
+       var street: String
+
+       # The url of this precise Benelux
+       var url: String
+
+       # Path to the database
+       var db_path: String
+
+       # Where to save the sample email
+       var sample_email_path: String
+
+       init(street: String)
+       do
+               self.street = street
+               self.url = "www.brasseriebenelux.com/{street}"
+               self.db_path = "benitlux_{street}.db"
+               self.sample_email_path = "benitlux_{street}.email"
+       end
+
+       # Execute the main program logic
+       fun run(send_emails: Bool)
+       do
+               # Get the web page
+               var body = download_html_page
+
+               # Parse the Web page and get the available beers
+               var beers = parse_beers_from_html(body)
+
+               var db = new DB.open(db_path)
+
+               # Update the database with the beers of the day
+               db.insert_beers_of_the_day beers
+
+               # Query the beer-related events of today
+               var beer_events = db.beer_events_today
+
+               # Generate the email title and content, store them in attributes
+               generate_email(beer_events)
+
+               # Save as sample email to file
+               var f = new OFStream.open(sample_email_path)
+               f.write email_title + "\n"
+               for line in email_content do f.write line + "\n"
+               f.close
+
+               # Set the email if desired
+               if send_emails then
+                       var subs = db.subscribers
+                       send_emails_to subs
+               end
+
+               db.close
+       end
+
+       # Fetch the Web page at `url`
+       fun download_html_page: String
+       do
+               var curl = new Curl
+
+               var request = new CurlHTTPRequest(url, curl)
+               var response = request.execute
+
+               if response isa CurlResponseSuccess then
+                       var body = response.body_str
+                       curl.destroy
+                       return body
+               else if response isa CurlResponseFailed then
+                       print "Failed downloading URL '{url}' with: {response.error_msg} ({response.error_code})"
+                       exit 1
+               end
+               abort
+       end
+
+       # Extract the beers of the day information from the HTML if `body`
+       fun parse_beers_from_html(body: String): HashSet[Beer]
+       do
+               # Parts of the HTML page expected to encapsulate the interesting section
+               var header = "<h1>Bières<br /></h1>"
+               var ender = "</div></div></div>"
+
+               var match = body.search(header)
+               assert match != null else print body
+               var start = match.after
+
+               match = body.search_from(ender, start)
+               assert match != null
+               var finish = match.from
+
+               var of_interest = body.substring(start, finish-start)
+               var lines = of_interest.strip_tags.to_clean_lines
+
+               var beers = new HashSet[Beer]
+               for line in lines do
+                       var parts = line.split(" - ")
+                       if parts.length >= 2 then
+                               beers.add new Beer(parts[0].trim, parts[1].trim)
+                       end
+               end
+               return beers
+       end
+
+       # Content lines of the email
+       var email_content: Array[String]
+
+       # Title of the email
+       var email_title: String
+
+       # Generate email and fill the attributes `email_content` and `email_title`
+       fun generate_email(beer_events: BeerEvents)
+       do
+               email_title = beer_events.to_email_title
+               email_content = beer_events.to_email_content
+       end
+
+       # Send the email to all the addresses in `subs`
+       fun send_emails_to(subs: Array[String])
+       do
+               for email in subs do
+                       var unsub_link = "http://benitlux.xymus.net/?unsub=&email={email}"
+                       var content = """
+{{{email_content.join("<br />\n")}}}
+<br /><br />
+To unsubscribe, go to <a href="{{{unsub_link}}}">{{{unsub_link}}}</a>
+"""
+
+                       var mail = new Mail("Benitlux <benitlux@xymus.net>", email_title, content)
+                       mail.to.add email
+                       mail.header["Content-Type"] = "text/html; charset=\"UTF-8\""
+                       mail.encrypt_with_base64
+
+                       mail.send
+               end
+       end
+end
+
+redef class OptionContext
+       # Shall we mail the mailing list?
+       var send_emails = new OptionBool("Send emails to subscribers", "-e", "--email")
+
+       # Print the usage message
+       var help = new OptionBool("Print this help message", "-h", "--help")
+
+       redef init do add_option(send_emails, help)
+end
+
+# Avoid executing when running tests
+if "NIT_TESTING".environ == "true" then exit 0
+
+var opts = new OptionContext
+opts.parse args
+if not opts.errors.is_empty or opts.help.value == true then
+       print opts.errors.join("\n")
+       print "Usage: benitlux_daily [Options]"
+       opts.usage
+       exit 1
+end
+
+var ben = new Benitlux("sherbrooke")
+ben.run(opts.send_emails.value or else false)
+
+# The parsing logic for the wellington locaiton is active (to gather data)
+# but the web interface do not allow to subscribe to its mailing list.
+#
+# TODO revamp mailing list Web interface
+ben = new Benitlux("wellington")
+ben.run(opts.send_emails.value or else false)
diff --git a/contrib/benitlux/src/benitlux_db.nit b/contrib/benitlux/src/benitlux_db.nit
new file mode 100644 (file)
index 0000000..05a1a81
--- /dev/null
@@ -0,0 +1,149 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2014 Alexis Laferrière <alexis.laf@xymus.net>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Database interface to be used by the Web server and daily program
+module benitlux_db
+
+import sqlite3
+
+import benitlux_model
+
+# The database of this project
+class DB
+       super Sqlite3DB
+
+       redef init open(path)
+       do
+               super
+
+               create_tables
+       end
+
+       # Create all tables for this project (IF NOT EXISTS)
+       fun create_tables
+       do
+               assert create_table("IF NOT EXISTS beers (name TEXT PRIMARY KEY, desc TEXT)") else
+                       print error or else "?"
+               end
+
+               assert create_table("IF NOT EXISTS daily (beer INTEGER, day DATE)") else
+                       print error or else "?"
+               end
+
+               assert create_table("IF NOT EXISTS subscribers (email TEXT UNIQUE PRIMARY KEY, joined DATETIME DEFAULT CURRENT_TIMESTAMP)") else
+                       print error or else "?"
+               end
+       end
+
+       # Update the DB with a all the `beers` available today
+       #
+       # Delete any other previous information for today.
+       fun insert_beers_of_the_day(beers: HashSet[Beer])
+       do
+               # Clean the DB of the previous beers of the day
+               assert execute("DELETE FROM daily WHERE day == date('now')") else
+                       print error or else "?"
+               end
+
+               # Add beer info
+               for beer in beers do
+                       # Add meta if not there
+                       assert execute("INSERT OR IGNORE INTO beers (name, desc) VALUES ({beer.name.to_sql_string}, {beer.desc.to_sql_string})") else
+                               print error or else "?"
+                       end
+
+                       # Add day
+                       assert execute("INSERT INTO daily (beer, day) VALUES (" +
+                                      "(SELECT min(ROWID) FROM beers WHERE lower(name) = lower({beer.name.to_sql_string})), " +
+                                                  "date('now'))") else
+                               print error or else "?"
+                       end
+               end
+       end
+
+       # Build and return a `BeerEvents` for today compared to the last weekday
+       fun beer_events_today: BeerEvents
+       do
+               var tm = new Tm.localtime
+               var last_weekday
+               if tm.wday == 1 then
+                       # We're monday! we compare with the last friday
+                       last_weekday = "date('now', 'weekday 6', '-7 day')"
+               else last_weekday = "date('now', '-1 day')"
+
+               return beer_events_since(last_weekday).as(not null) # This is used by daily
+       end
+
+       # Build and return a `BeerEvents` for today compared to `prev_day`
+       #
+       # Return `null` on error
+       fun beer_events_since(prev_day: String): nullable BeerEvents
+       do
+               var events = new BeerEvents
+
+               # New
+               var stmt = select("name, desc FROM beers WHERE " +
+                                 "ROWID IN (SELECT beer FROM daily WHERE date(day) = date('now')) AND " +
+                                 "NOT ROWID IN (SELECT beer FROM daily WHERE date(day) = date({prev_day}))")
+               if stmt == null then return null
+               for row in stmt do events.new_beers.add row.to_beer
+
+               # Gone
+               stmt = select("name, desc FROM beers WHERE " +
+                                 "NOT ROWID IN (SELECT beer FROM daily WHERE date(day) = date('now')) AND " +
+                                 "ROWID IN (SELECT beer FROM daily WHERE date(day) = date({prev_day}))")
+               if stmt == null then return null
+               for row in stmt do events.gone_beers.add row.to_beer
+
+               # Fix
+               stmt = select("name, desc FROM beers WHERE " +
+                                 "ROWID IN (SELECT beer FROM daily WHERE date(day) = date('now')) AND " +
+                                 "ROWID IN (SELECT beer FROM daily WHERE date(day) = date({prev_day}))")
+               if stmt == null then return null
+               for row in stmt do events.fix_beers.add row.to_beer
+
+               return events
+       end
+
+       # All the subscribers to the mailing list
+       fun subscribers: Array[String]
+       do
+               var subs = new Array[String]
+               for row in select("email FROM subscribers") do subs.add row[0].to_s
+               return subs
+       end
+
+       # Add `email` to the mailing list subscribers
+       fun subscribe(email: String)
+       do
+               assert insert("OR IGNORE INTO subscribers (email) VALUES (lower({email.to_sql_string}))") else
+                       print error or else "?"
+               end
+       end
+
+       # Remove `email` to the mailing list subscribers
+       fun unsubscribe(email: String)
+       do
+               assert execute("DELETE FROM subscribers WHERE email = lower({email.to_sql_string})") else
+                       print error or else "?"
+               end
+       end
+end
+
+redef class StatementRow
+       # Convert this BD row to a `Beer`
+       fun to_beer: Beer do return new Beer(self[0].to_s, self[1].to_s)
+end
diff --git a/contrib/benitlux/src/benitlux_model.nit b/contrib/benitlux/src/benitlux_model.nit
new file mode 100644 (file)
index 0000000..57cb34e
--- /dev/null
@@ -0,0 +1,93 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2014 Alexis Laferrière <alexis.laf@xymus.net>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Database and data model to be used by servers and clients
+module benitlux_model
+
+import serialization
+
+# A beer, with a name and description
+class Beer
+       auto_serializable
+
+       init(name, desc: String)
+       do
+               self.name = name
+               self.desc = desc
+       end
+
+       # Name of the beer
+       var name: String
+
+       # Description on the Web site
+       var desc: String
+
+       redef fun to_s do return "<{name}: {desc}>"
+end
+
+# A collection of beer-related events
+class BeerEvents
+       auto_serializable
+
+       # New beers on the menu
+       var new_beers = new Array[Beer]
+
+       # Beers that have left the menu
+       var gone_beers = new Array[Beer]
+
+       # Beers that are on the menu today, and yesterday
+       var fix_beers = new Array[Beer]
+
+       # Get a human pretty `Array[String]` version of `self`
+       fun to_email_content: Array[String]
+       do
+               var content = new Array[String]
+
+               # New beers
+               var new_beers_name = new Array[String]
+               for beer in self.new_beers do
+                       content.add "+ {beer.name}: {beer.desc}"
+               end
+
+               # Gone beers
+               for beer in self.gone_beers do
+                       content.add "- {beer.name}: {beer.desc}"
+               end
+
+               # Fix beers
+               for beer in self.fix_beers do
+                       content.add "  {beer.name}: {beer.desc}"
+               end
+
+               return content
+       end
+
+       # Get a pretty and short version of `self`
+       fun to_email_title: String
+       do
+               var title = "Benelux Beer Menu"
+
+               # New beers
+               var new_beers_name = new Array[String]
+               for beer in self.new_beers do new_beers_name.add beer.name
+
+               if not new_beers_name.is_empty then
+                       title += " (+ {new_beers_name.join(", ")})"
+               end
+
+               return title
+       end
+end
diff --git a/contrib/benitlux/src/benitlux_view.nit b/contrib/benitlux/src/benitlux_view.nit
new file mode 100644 (file)
index 0000000..d35d6d9
--- /dev/null
@@ -0,0 +1,143 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2014 Alexis Laferrière <alexis.laf@xymus.net>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# View logic of the Web interface Benitlux
+module benitlux_view
+
+import benitlux_model
+import template
+
+# Template for the whole Benitlux page
+class BenitluxDocument
+       super Template
+
+       # Page title
+       var page_title = "Benitlux Mailing List" is writable
+
+       # Page header
+       fun header: Template do return new BenitluxHeader
+
+       # Error or success message content, will be shown in a dismissable panel
+       var message_content: nullable String = null is writable
+
+       # Error or success message level (success/danger/warning/info)
+       var message_level: nullable String = null is writable
+
+       # Lines of the last email sent to subscribers
+       var sample_email_lines: nullable Array[String] = null is writable
+
+       redef fun rendering
+       do
+               add """
+<!DOCTYPE html>
+<html>
+<head>
+       <meta charset="utf-8">
+       <meta http-equiv="X-UA-Compatible" content="IE=edge">
+       <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
+       <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
+       <script src="//netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script>
+       <title>"""
+               add page_title
+               add """</title>
+</head>
+<body>
+               """
+               add header
+               add """
+<div class="container">
+
+<div class="panel panel-default">
+  <div class="panel-body">
+       <p>Service de diffusion des changements au menu de l'excellente
+       <a href="http://www.brasseriebenelux.com/">Brasserie Bénélux</a>
+       sur la rue Sherbrooke. La liste est mise à jours tous les jours à 14h,
+       le courriel est envoyé au même moment.</p>
+       <form class="form-inline text-center" role="form" method="POST">
+         <div class="form-group">
+               <div class="input-group">
+                 <div class="input-group-addon">@</div>
+                 <input class="form-control" type="email" name="email" placeholder="Enter email">
+               </div>
+         </div>
+         <button type="submit" class="btn btn-default" name="sub">S'inscrire</button>
+         <button type="submit" class="btn btn-default" name="unsub">Se désinscrire</button>
+       </form>
+  </div>
+</div>
+               """
+
+               var message_level = message_level
+               var message_content = message_content
+               if message_level != null and message_content != null then
+                       add """
+<div class="alert alert-{{{message_level}}} alert-dismissible" role="alert">
+  <button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
+  {{{message_content}}}
+</div>
+                       """
+               end
+
+               var sample_email_lines = sample_email_lines
+               if sample_email_lines != null then
+                       add """
+<div class="panel panel-default">
+  <div class="panel-heading">Dernier courriel envoyé</div>
+  <ul class="list-group">
+    <li class="list-group-item">
+       {{{sample_email_lines.join("</li><li class=\"list-group-item\">")}}}
+       </li>
+  </ul>
+</div>"""
+               end
+
+               add """
+</div>
+</body>
+</html>"""
+       end
+end
+
+# Template for the header of Benitlux (right after the opening of `<body>`)
+class BenitluxHeader
+       super Template
+
+       redef fun rendering
+       do
+               add """
+<nav class="navbar navbar-default" role="navigation">
+  <div class="container-fluid">
+    <div class="navbar-header">
+      <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
+        <span class="sr-only">Toggle navigation</span>
+               <span class="icon-bar"></span>
+               <span class="icon-bar"></span>
+               <span class="icon-bar"></span>
+      </button>
+      <a class="navbar-brand" href="http://xymus.net/">Xymus.net</a>
+    </div>
+
+    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
+      <ul class="nav navbar-nav">
+        <li><a href="http://pep8.xymus.net/">Pep/8 Analysis</a></li>
+        <li><a href="http://tnitter.xymus.net/">Tnitter</a></li>
+        <li class="active"><a href="http://benitlux.xymus.net/">Benitlux</a></li>
+      </ul>
+    </div>
+  </div>
+</nav>"""
+       end
+end
diff --git a/contrib/benitlux/src/benitlux_web.nit b/contrib/benitlux/src/benitlux_web.nit
new file mode 100644 (file)
index 0000000..90e7d24
--- /dev/null
@@ -0,0 +1,37 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2014 Alexis Laferrière <alexis.laf@xymus.net>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Web server for Benitlux
+module benitlux_web
+
+import benitlux_model
+import benitlux_view
+import benitlux_controller
+
+# Avoid executing when running tests
+if "NIT_TESTING".environ == "true" then exit 0
+
+var iface = "localhost:8080"
+
+var vh = new VirtualHost(iface)
+vh.routes.add new Route("/rest/", new BenitluxRESTAction)
+vh.routes.add new Route(null, new BenitluxSubscriptionAction)
+
+var factory = new HttpFactory.and_libevent
+factory.config.virtual_hosts.add vh
+
+print "Launching server on http://{iface}/"
+factory.run
index 48c6195..620b0a0 100644 (file)
@@ -330,11 +330,11 @@ class Production
 
        # Is self transformed to a other production for the AST
        # FIXME: cleaup AST
-       var spe: nullable Production writable = null
+       var spe: nullable Production = null is writable
 
        # Is self contains only a single alternative (then no need for a abstract production class in the AST)
        # FIXME cleanup AST
-       var altone writable = false
+       var altone = false is writable
 
        # The cname of the class in the AST
        # FIXME: cleanup AST
@@ -396,7 +396,7 @@ class Alternative
        var prod: Production
 
        # The name of the alternative
-       var name: String writable
+       var name: String is writable
 
        # The elements of the alternative
        var elems: Array[Element]
@@ -424,13 +424,13 @@ class Alternative
        end
 
        # The code for the reduction
-       var codes: nullable Array[Code] writable = null
+       var codes: nullable Array[Code] = null is writable
 
        # Is the alternative transformed (ie not in the AST)
-       var trans writable = false
+       var trans = false is writable
 
        # Is the alternative unparsable? (ie not in the automaton)
-       var phony writable = false
+       var phony = false is writable
 
        # Imitialize codes with the elements
        fun make_codes
@@ -620,14 +620,6 @@ class LRAutomaton
        end
 end
 
-redef class String
-       # escape string used in labels for graphviz
-       fun escape_to_dot: String
-       do
-               return escape_more_to_c("|\{\}<>")
-       end
-end
-
 private class Generator
        var out = new Array[String]
        fun add(s: String) do out.add(s)
index 488d382..98380f7 100644 (file)
@@ -23,7 +23,7 @@ end
 class ASTPrinter
        super Visitor
 
-       var str writable = ""
+       var str = "" is writable
 
        init do end
        redef fun visit(n) do n.accept_ast_printer(self)
index 4d7264b..c4de901 100644 (file)
@@ -306,7 +306,7 @@ class CFG
                end
        end
 
-       var watchdog writable = 0
+       var watchdog = 0 is writable
        fun link_ret_to_calls(b: BasicBlock, to_link_ori: List[BasicBlock], seq: List[BasicBlock], depth: Int): Bool
        do
                watchdog += 1
index 7e24374..435ced7 100644 (file)
@@ -20,10 +20,10 @@ $ template make_parser()
 # State of the parser automata as stored in the parser stack.
 private class State
        # The internal state number
-       readable writable var _state: Int
+       readable var _state: Int is writable
 
        # The node stored with the state in the stack
-       readable writable var _nodes: nullable Object
+       readable var _nodes: nullable Object is writable
 
        init(state: Int, nodes: nullable Object)
        do
index 3a259df..e7183e7 100644 (file)
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
       </button>
-      <a class="navbar-brand">Pep/8 Analysis</a>
+      <a class="navbar-brand" href="http://xymus.net/">Xymus.net</a>
     </div>
 
     <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
       <ul class="nav navbar-nav">
-        <li class="active"><a>Web interface</a></li>
-        <li><a href="https://github.com/privat/nit/tree/master/contrib/pep8analysis/">Tool source and manual</a></li>
+        <li><a href="http://xymus.net/ens/">Enseignement</a></li>
+        <li class="active"><a href="http://pep8.xymus.net/">Pep/8 Analysis</a></li>
+        <li><a href="http://tnitter.xymus.net/">Tnitter</a></li>
+        <li><a href="http://benitlux.xymus.net/">Benitlux</a></li>
+        <li><a href="http://nitlanguage.org/">Nit</a></li>
       </ul>
-      <ul class="nav navbar-nav navbar-right">
-        <li><a href="http://nitlanguage.org/">nitlanguage.org</a></li>
+
+      <ul class="nav navbar-nav pull-right">
+        <li><a href="https://github.com/privat/nit/tree/master/contrib/pep8analysis/">Source and manual</a></li>
         <li><a href="https://code.google.com/p/pep8-1/">Pep/8 project</a></li>
       </ul>
     </div>
index db3847f..d054b49 100644 (file)
@@ -136,6 +136,11 @@ class Tnitter
                                # Post a Tnit!
                                var text = request.post_args["text"]
                                db.post(user, text)
+
+                               # Redirect the user to avoid double posting
+                               var response = new HttpResponse(303)
+                               response.header["Location"] = request.uri
+                               return response
                        end
                end
 
index ac8cff0..6aa6f48 100644 (file)
@@ -34,7 +34,7 @@ class Animal
        # The value indicate the number of step that remain to be stunt
        #
        # If a animal is stunned, it cannot move horizontally
-       var stunt_ttl: Int writable = 0
+       var stunt_ttl: Int = 0 is writable
 
        # Common update for animal
        # handle stunt and edge collision
index b148778..1df0119 100644 (file)
@@ -182,7 +182,7 @@ end
 class MovingEntity
        super Entity
 
-       var going_to : nullable GamePos writable = null
+       var going_to : nullable GamePos = null is writable
 
        fun speed : Int is abstract
 
index 96a6ee3..1c55458 100644 (file)
@@ -1,3 +1,7 @@
 all:
        mkdir -p bin/
        ../../bin/nitg --dir bin src/nitcorn_hello_world.nit src/file_server_on_port_80.nit
+
+xymus.net:
+       mkdir -p bin/
+       ../../bin/nitg --dir bin/ -I ../../contrib/tnitter/src/ -I ../../contrib/benitlux/src/ src/xymus_net.nit
diff --git a/examples/nitcorn/src/xymus_net.nit b/examples/nitcorn/src/xymus_net.nit
new file mode 100644 (file)
index 0000000..9c4b53c
--- /dev/null
@@ -0,0 +1,150 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2014 Alexis Laferrière <alexis.laf@xymus.net>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Configuration of the Web server of xymus.net
+module xymus_net
+
+import nitcorn
+import privileges
+
+# Use actions defined by contribs
+import tnitter
+import benitlux_controller
+
+# Header for the whole site
+class MasterHeader
+       super Template
+
+       # Current page id, is used to set the `active` class on the header tab
+       var page: nullable String
+
+       # Make room for a login or logout placeholder (used by tnitter)
+       var login_placeholder: Bool
+
+       redef fun rendering
+       do
+               var actives = new HashMap[String, String]
+               var page = page
+               if page != null then actives[page] = " class=\"active\""
+
+               add """
+<nav class="navbar navbar-default" role="navigation">
+  <div class="container-fluid">
+    <div class="navbar-header">
+      <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
+        <span class="sr-only">Toggle navigation</span>
+               <span class="icon-bar"></span>
+               <span class="icon-bar"></span>
+               <span class="icon-bar"></span>
+      </button>
+      <a class="navbar-brand" href="http://xymus.net/">Xymus.net</a>
+    </div>
+
+    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
+      <ul class="nav navbar-nav">
+        <li{{{actives.get_or_default("ens", "")}}}><a href="http://xymus.net/ens/">Enseignement</a></li>
+        <li><a href="http://pep8.xymus.net/">Pep/8 Analysis</a></li>
+        <li{{{actives.get_or_default("tnitter", "")}}}><a href="http://tnitter.xymus.net/">Tnitter</a></li>
+        <li{{{actives.get_or_default("benitlux", "")}}}><a href="http://benitlux.xymus.net/">Benitlux</a></li>
+        <li><a href="http://nitlanguage.org/">Nit</a></li>
+      </ul>
+
+      <ul class="nav navbar-nav pull-right">
+         """
+               if login_placeholder then add "%header_right%"
+
+               add """
+      </ul>
+    </div>
+  </div>
+</nav>"""
+       end
+
+       redef fun to_s do return write_to_string
+end
+
+redef class Tnitter
+       redef var header: String = (new MasterHeader("tnitter", true)).to_s
+end
+
+redef class BenitluxDocument
+       redef var header = new MasterHeader("benitlux", false)
+end
+
+redef class ErrorTemplate
+       redef var header = new MasterHeader(null, false)
+end
+
+# Avoid executing when running tests
+if "NIT_TESTING".environ == "true" then exit 0
+
+# Setup server interfaces
+#
+# Change these to use this config on your own server!
+var default_vh = new VirtualHost("xymus.net:80")
+var vps_vh = new VirtualHost("vps.xymus.net:80")
+var tnitter_vh = new VirtualHost("tnitter.xymus.net:80")
+var pep8_vh = new VirtualHost("pep8.xymus.net:80")
+var benitlux_vh = new VirtualHost("benitlux.xymus.net:80")
+
+var factory = new HttpFactory.and_libevent
+factory.config.virtual_hosts.add default_vh
+factory.config.virtual_hosts.add vps_vh
+factory.config.virtual_hosts.add tnitter_vh
+factory.config.virtual_hosts.add pep8_vh
+factory.config.virtual_hosts.add benitlux_vh
+
+# Ports are open, drop to a low-privileged user if we are root
+var user_group = new UserGroup("nitcorn", "nitcorn")
+if sys.uid == 0 then user_group.drop_privileges
+
+# Tnitter is available at `tnitter.xymus.net` and `xymus.net/tnitter/`
+var tnitter = new Tnitter
+default_vh.routes.add new Route("/tnitter/", tnitter)
+tnitter_vh.routes.add new Route(null, tnitter)
+
+# Pep/8 Analysis is only a file server. It is available at `pep8.xymus.net`
+# and through the global/default file server at `xymus.net/pep8/`
+#
+# TODO Implement pep8analysis server-side with a nitcorn action
+pep8_vh.routes.add new Route(null, new FileServer("/var/www/pep8/"))
+
+# Benitlux is available at `benitlux.xymus.net` and `xymus.net/benitlux/`
+#
+# It has 2 actions/Web interfaces. The Web user UI to subscribe and unsubscribe
+# to the mailing list. And the RESTful interface used by the Android app.
+var benitlux_sub = new BenitluxSubscriptionAction
+var benitlux_rest = new BenitluxRESTAction
+default_vh.routes.add new Route("/benitlux/rest/", benitlux_rest)
+default_vh.routes.add new Route("/benitlux/", benitlux_sub)
+benitlux_vh.routes.add new Route("/rest/", benitlux_rest)
+benitlux_vh.routes.add new Route(null, benitlux_sub)
+
+# We use a special file server for the path `xymus.net/ens` only to display
+# a different header.
+var file_server_ens = new FileServer("/var/www/ens/")
+file_server_ens.header = (new MasterHeader("ens", false))
+default_vh.routes.add new Route("/ens/", file_server_ens)
+
+# Default file server is used for the main page at `xymus.net` and it is
+# the default action for any path not caught by other actions.
+var file_server = new FileServer("/var/www/")
+file_server.header = (new MasterHeader(null, false))
+default_vh.routes.add new Route(null, file_server)
+vps_vh.routes.add new Route(null, file_server)
+
+# Launch server main loop
+factory.run
index 1aefc7b..838c78b 100644 (file)
@@ -36,17 +36,17 @@ class Player
        end
 
        # Current forture of the player
-       var money: Int writable = 0
+       var money: Int = 0 is writable
 
        # Number of basic bullets fired together
-       var nbshoots: Int writable = 1
+       var nbshoots: Int = 1 is writable
 
        # Time bebore the player shoot again a basic bullet (cooldown)
        # Shoot if 0
        var shoot_ttl = 0
 
        # Number of missiles
-       var nbmissiles: Int writable = 0
+       var nbmissiles: Int = 0 is writable
 
        # Time bebore the player shoot again a missile (cooldown)
        # Shoot if 0
@@ -152,7 +152,7 @@ class GoingTarget
        super Hitable
 
        # true in on move, false if player is at rest
-       var active writable = false
+       var active = false is writable
 
        init do
                self.width = 500
@@ -834,13 +834,13 @@ class ShotScene
        super Scene
 
        # When a scene need to be replaced, just assign the next_scene to a non null value
-       var next_scene: nullable ShotScene writable = null
+       var next_scene: nullable ShotScene = null is writable
 
        # The width of the whole scene
-       var width: Int writable
+       var width: Int is writable
 
        # The height of the whole scene
-       var height: Int writable
+       var height: Int is writable
 
        init(w,h: Int)
        do
@@ -1034,7 +1034,7 @@ class MenuScene
                end
        end
 
-       var play: Bool writable = false
+       var play: Bool = false is writable
        var ttl: Int = 50
 
        redef fun update
index 9fe93e9..8d3264f 100644 (file)
@@ -137,25 +137,25 @@ end
 class SoundPool
        private var nsoundpool: NativeSoundPool is noinit
        # The maximum number of simultaneous streams for this SoundPool
-       var max_streams writable = 10
+       var max_streams = 10 is writable
 
        # The audio stream type, 3 is STREAM_MUSIC, default for game application
-       var stream_type writable = 3
+       var stream_type = 3 is writable
 
        # The sample-rate converter quality, currently has no effect
-       var src_quality writable = 0
+       var src_quality = 0 is writable
 
        # Left volume value, range 0.0 to 1.0
-       var left_volume writable = 1.0
+       var left_volume = 1.0 is writable
 
        # Right volume value, range 0.0 to 1.0
-       var right_volume writable = 1.0
+       var right_volume = 1.0 is writable
 
        # Playback rate, 1.0 = normal playback, range 0.5 to 2.0
-       var rate writable = 1.0
+       var rate = 1.0 is writable
 
        # Loop mode, 0 = no loop, -1 = loop forever
-       var looping writable = 0
+       var looping = 0 is writable
 
        # Stream priority
        private var priority = 1
index 2246298..4c28466 100644 (file)
@@ -128,9 +128,9 @@ end
 # NIT representation of an Android Sensor used in android_app to initialize sensors
 class AndroidSensor
 
-       var asensor writable = new ASensor
-       var enabled writable = false
-       var event_rate writable = 100000
+       var asensor = new ASensor is writable
+       var enabled = false is writable
+       var event_rate = 100000 is writable
 
        fun name: String do return asensor.name.to_s
        fun vendor: String do return asensor.vendor.to_s
@@ -234,7 +234,7 @@ redef class App
        var proximity = new AndroidSensor
        var sensormanager: ASensorManager
        var eventqueue: ASensorEventQueue
-       var sensors_support_enabled writable = false
+       var sensors_support_enabled = false is writable
 
        private fun extern_input_sensor_accelerometer(event: ASensorAccelerometer) do input(event)
        private fun extern_input_sensor_magnetic_field(event: ASensorMagneticField) do input(event)
index cdedc32..b680079 100644 (file)
@@ -104,14 +104,14 @@ end
 
 # Game logic on the client
 class ThinGame
-       var tick: Int protected writable = 0
+       var tick: Int = 0 is protected writable
 end
 
 # Game turn on the client
 class ThinGameTurn[G: ThinGame]
-       var tick: Int protected writable = 0
+       var tick: Int = 0 is protected writable
 
-       var events: List[GameEvent] protected writable = new List[GameEvent]
+       var events: List[GameEvent] = new List[GameEvent] is protected writable
 
        init (t: Int) do tick = t
 end
index b994a83..3d4daf6 100644 (file)
@@ -15,7 +15,9 @@
 # limitations under the License.
 
 # Offers features to interface with C++ code and libraries
-module cpp
+module cpp is
+       new_annotation cpp_compiler_option
+end
 
 # A pointer to a C++ std::string instance
 extern class CppString in "C++" `{ std::string* `}
diff --git a/lib/crypto.nit b/lib/crypto.nit
new file mode 100644 (file)
index 0000000..a84358f
--- /dev/null
@@ -0,0 +1,218 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Mix of all things cryptography-related
+module crypto
+
+redef class Char
+       # Rotates self of `x`
+       #
+       # NOTE: works on letters only
+       #
+       #    assert 'x'.rot(6) == 'd'
+       #    assert 'T'.rot(15) == 'I'
+       #    assert '1'.rot(10) == '1'
+       #    assert '$'.rot(10) == '$'
+       #    assert 'z'.rot(-2) == 'x'
+       fun rot(x: Int): Char do
+               if not is_letter then return self
+               x = x % 26
+               if x < 0 then x += 26
+               var up = false
+               var val = ascii
+               if is_upper then
+                       up = true
+                       val += 32
+               end
+               val += x
+               if val > 122 then val -= 26
+               if up then val -= 32
+               return val.ascii
+       end
+end
+
+redef class String
+       # Performs a Rotation of `x` on each letter of self
+       #
+       # Works by replacing every character in `self` by its
+       # rotated char.
+       #
+       # Say we have a rotation of `3` (Caesar rotation, for
+       # culture) for a string : "aybabtu"
+       #
+       # a, rotated by 3 becomes d
+       # y, rotated by 3 becomes b
+       # b, rotated by 3 becomes e
+       # t, rotated by 3 becomes w
+       # u, rotated by 3 becomes x
+       #
+       # We then replace every letter in our original string by
+       # their rotated representations, therefore yielding : "dbedewx"
+       #
+       #    assert "All your base are belong to us".rot(13) == "Nyy lbhe onfr ner orybat gb hf"
+       #    assert "This is no moon.".rot(4).rot(22) == "This is no moon."
+       #
+       # NOTE : Works on letters only
+       # NOTE : This cipher is symmetrically decrypted with an `x` of 26-`x`
+       fun rot(x: Int): String do
+               var rot = x % 26
+               if rot < 0 then rot += 26
+               var d = new FlatBuffer.with_capacity(length)
+               var p = 0
+               for i in chars do
+                       d.add i.rot(rot)
+               end
+               return d.to_s
+       end
+
+       # Returns a rail-fence cipher from `self` with `depth` rails
+       #
+       # Rail works by drawing a zig-zag pattern on `depth` rails.
+       #
+       # Say we have "fuckingbehemoth".railfence(4)
+       #
+       # This happens in-memory :
+       #       f.....g.....o..
+       #       .u...n.b...m.t.
+       #       ..c.i...e.e...h
+       #       ...k.....h.....
+       #
+       # Therefore, yielding the ciphertext : "fgounbmtcieehkh"
+       #
+       #    assert "fuckingbehemoth".railfence(4) == "fgounbmtcieehkh"
+       fun railfence(depth: Int): String do
+               var lines = new Array[FlatBuffer].with_capacity(depth)
+               var up = false
+               for i in [0..depth[ do
+                       lines[i] = new FlatBuffer.with_capacity(length)
+               end
+               var curr_depth = 0
+               for i in chars do
+                       for j in [0..depth[ do
+                               if j == curr_depth then
+                                       lines[j].add i
+                               else
+                                       lines[j].add '.'
+                               end
+                       end
+                       if up then
+                               curr_depth -= 1
+                       else
+                               curr_depth += 1
+                       end
+                       if curr_depth == 0 then
+                               up = false
+                       end
+                       if curr_depth == (depth - 1) then
+                               up = true
+                       end
+               end
+               var r = new FlatBuffer.with_capacity(length)
+               for i in lines do
+                       r.append i.to_s.replace(".", "")
+               end
+               return r.to_s
+       end
+
+       # Transforms a rail-fence-encrypted String to its original
+       #
+       #    assert "fgounbmtcieehkh".unrail(4) == "fuckingbehemoth"
+       fun unrail(depth: Int): String do
+               var dots = "." * length
+               var arr = new FlatBuffer.from(dots)
+               var start = 0
+               var paces = depth.unrail_paces
+               for i in [0..depth[ do
+                       var lp = paces[i].first
+                       var rp = paces[i].second
+                       var pos = i
+                       var l = true
+                       while pos < length do
+                               arr[pos] = chars[start]
+                               if l then
+                                       pos += lp
+                                       l = false
+                               else
+                                       pos += rp
+                                       l = true
+                               end
+                               start += 1
+                       end
+               end
+               return arr.to_s
+       end
+end
+
+redef class Int
+       # Generates the paces for each depth.
+       #
+       # Each entry of the returned array is a couple of the first pace
+       # and the second one, they are alternated when deciphering a rail-encrypted string.
+       #
+       # Say we have the encrypted string "fgounbmtcieehkh" on 4 rails
+       #
+       # To find the distance between each character on the original railed
+       # string, we need to compute the extremes.
+       #
+       # The extremes always have a distance of `depth - 1`, multiplied by 2, no pairing.
+       #
+       # In the example, that would be : [(4 - 1) * 2, (4 - 1) * 2] => [6,6]
+       #
+       # For every rail in-between, the first distance is the largest absolute value
+       # of the difference between the current depth and the extremes, multiplied by 2.
+       #
+       # Its pair is the distance of maximum and the distance yielded by the previous
+       # calculation.
+       #
+       # In our example, that would be :
+       #
+       # Maximums : (4 - 1) * 2 = 3 * 2 => [6,6]
+       # In between : Distance for depth 2 : max(2 - 1, 4 - 2) => 2
+       # The calculation yields the couple [(2 * 2), 6 - 4] => [4, 2]
+       # The symmetric couple is reversed : [2, 4]
+       #
+       # In fine, the example yields the array : [[6,6], [4,2], [2,4], [6,6]]
+       #
+       # In the end, our string is read using the generated array
+       #
+       # SEE: `String::unrail` for how the array is used
+       private fun unrail_paces: Array[Couple[Int, Int]] do
+               var ret = new Array[Couple[Int,Int]].with_capacity(self)
+               var extremes = new Couple[Int, Int]((self - 1) * 2, (self - 1) * 2)
+               for i in [0..self[ do
+                       ret.add extremes
+               end
+               var mid = ((self.to_f)/2.0).floor.to_i
+               for i in [1 .. mid[ do
+                       var rd = i + 1
+                       var lodepth = self - rd
+                       var hidepth = (rd - self).abs
+                       var dd: Int
+                       if hidepth > lodepth then
+                               dd = hidepth * 2
+                       else
+                               dd = lodepth * 2
+                       end
+                       var cp = new Couple[Int, Int](dd, extremes.first-dd)
+                       var ccp = new Couple[Int, Int](extremes.first - dd, dd)
+
+                       ret[i] = cp
+                       ret[self - rd] = ccp
+               end
+               if not self.is_even then
+                       ret[mid] = new Couple[Int, Int](extremes.first/2, extremes.first/2)
+               end
+               return ret
+       end
+end
index 9b4da2f..82fbb05 100644 (file)
@@ -19,7 +19,7 @@ module csv
 class CSVDocument
        super Streamable
 
-       var header: Array[String] writable = new Array[String]
+       var header: Array[String] = new Array[String] is writable
        var lines: Array[Array[String]] = new Array[Array[String]]
 
        fun set_header(values: Object...) do
index d0c445d..bca105c 100644 (file)
@@ -40,7 +40,7 @@ end
 # CURL Request
 class CurlRequest
 
-       var verbose: Bool writable = false
+       var verbose: Bool = false is writable
        private var curl: nullable Curl = null
 
        # Launch request method
@@ -76,8 +76,8 @@ class CurlHTTPRequest
        super CurlCallbacksRegisterIntern
 
        var url: String
-       var datas: nullable HeaderMap writable = null
-       var headers: nullable HeaderMap writable = null
+       var datas: nullable HeaderMap = null is writable
+       var headers: nullable HeaderMap = null is writable
 
        # Set the user agent for all following HTTP requests
        fun user_agent=(name: String)
@@ -201,14 +201,14 @@ class CurlMailRequest
        super CurlRequest
        super CCurlCallbacks
 
-       var headers: nullable HeaderMap writable = null
-       var headers_body: nullable HeaderMap writable = null
-       var from: nullable String writable = null
-       var to: nullable Array[String] writable = null
-       var cc: nullable Array[String] writable = null
-       var bcc: nullable Array[String] writable = null
-       var subject: nullable String writable = ""
-       var body: nullable String writable = ""
+       var headers: nullable HeaderMap = null is writable
+       var headers_body: nullable HeaderMap = null is writable
+       var from: nullable String = null is writable
+       var to: nullable Array[String] = null is writable
+       var cc: nullable Array[String] = null is writable
+       var bcc: nullable Array[String] = null is writable
+       var subject: nullable String = "" is writable
+       var body: nullable String = "" is writable
        private var supported_outgoing_protocol: Array[String] = ["smtp", "smtps"]
 
        init (curl: nullable Curl)
@@ -338,7 +338,7 @@ end
 
 # Callbacks attributes
 abstract class CurlCallbacksRegisterIntern
-       var delegate: nullable CurlCallbacks writable = null
+       var delegate: nullable CurlCallbacks = null is writable
 end
 
 # Abstract Curl request response
index 152ad55..287dbce 100644 (file)
@@ -18,8 +18,6 @@
 module curl_c is pkgconfig("libcurl")
 
 in "C header" `{
-       #include <stdio.h>
-       #include <stdlib.h>
        #include <curl/curl.h>
 
        typedef enum {
@@ -42,6 +40,10 @@ in "C header" `{
 `}
 
 in "C body" `{
+       #include <stdio.h>
+       #include <stdlib.h>
+       #include <string.h>
+
        // Callbacks method for Header, Body, Stream.
        size_t nit_curl_callback_func(void *buffer, size_t size, size_t count, CURLCallbackDatas *datas){
                if(datas->type == CURLcallbackTypeHeader){
index d49ee03..e349a0d 100644 (file)
@@ -21,7 +21,7 @@
 # C library. If a method or class is not documented in Nit, refer to
 # the official documentation by the Khronos Group at:
 # http://www.khronos.org/registry/egl/sdk/docs/man/xhtml/
-module egl is pkgconfig("egl")
+module egl is pkgconfig
 
 in "C Header" `{
        #include <EGL/egl.h>
index 40cb1bf..2ee4d28 100644 (file)
@@ -79,7 +79,7 @@ class CompareQuery[E]
        # The second element to compare
        var b: E
        # The result of the comparison (according to the user)
-       var res writable = 0
+       var res = 0 is writable
 end
 
 # Abuser for sorting array, see `sort_fa`
index fd33d63..a039717 100644 (file)
@@ -20,7 +20,7 @@
 # C library. If a method or class is not documented in Nit, refer to
 # the official documentation by the Khronos Group at:
 # http://www.khronos.org/opengles/sdk/docs/man/
-module glesv2 is pkgconfig("glesv2")
+module glesv2 is pkgconfig
 
 in "C Header" `{
        #include <GLES2/gl2.h>
index 232e7c5..a6de8f1 100644 (file)
@@ -284,7 +284,7 @@ end
 private class ConfigNode
        var parent: nullable ConfigNode
        var children = new HashMap[String, ConfigNode]
-       var name: String writable
+       var name: String is writable
        var value: nullable String
 
        init(name: String) do
diff --git a/lib/markdown/README b/lib/markdown/README
new file mode 100644 (file)
index 0000000..a5c6052
--- /dev/null
@@ -0,0 +1,29 @@
+A markdown parser for Nit.
+
+Markdown documentation can be found in http://daringfireball.net/projects/markdown/.
+This parser is inspired by the famous TxtMark for Java (https://github.com/rjeschke/txtmark).
+
+## Usage
+
+`nitmd` can be used as a standalone tool:
+
+       $ nitmd file.md
+
+Or you can use it programmatically by importing the `markdown` module.
+
+## Differences with Markdown specification
+
+This parser passes all tests inside http://daringfireball.net/projects/downloads/MarkdownTest_1.0_2007-05-09.tgz execpt of two:
+
+1. Images.text: fails because this parser doesn't produce empty 'title' image attributes.
+2. Literal quotes in titles.text: because markdown accepts unescaped quotes in titles and this is wrong.
+
+## Testing
+
+The NitUnit test suite can be found in `test_markdown.nit`.
+
+Minimalists tests are prefixed with `process_*`. All tests from daringfireball are prefixed with `process_daring*`.
+
+Run the test suite:
+
+       $ nitunit lib/markdown/markdown.nit -t lib/markdown/test_markdown.nit
diff --git a/lib/markdown/markdown.nit b/lib/markdown/markdown.nit
new file mode 100644 (file)
index 0000000..4efde74
--- /dev/null
@@ -0,0 +1,2315 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Markdown parsing.
+module markdown
+
+import template
+
+# Parse a markdown string and split it in blocks.
+#
+# Blocks are then outputed by an `MarkdownEmitter`.
+#
+# Usage:
+#
+#    var proc = new MarkdownProcessor
+#    var html = proc.process("**Hello World!**")
+#    assert html == "<p><strong>Hello World!</strong></p>\n"
+#
+# SEE: `String::md_to_html` for a shortcut.
+class MarkdownProcessor
+
+       var emitter: MarkdownEmitter is noinit
+
+       init do self.emitter = new MarkdownEmitter(self)
+
+       # Process the mardown `input` string and return the processed output.
+       fun process(input: String): Streamable do
+               # init processor
+               link_refs.clear
+               last_link_ref = null
+               current_line = null
+               current_block = null
+               # parse markdown
+               var parent = read_lines(input)
+               parent.remove_surrounding_empty_lines
+               recurse(parent, false)
+               # output processed text
+               return emitter.emit(parent.kind)
+       end
+
+       # Split `input` string into `MDLines` and create a parent `MDBlock` with it.
+       private fun read_lines(input: String): MDBlock do
+               var block = new MDBlock
+               var value = new FlatBuffer
+               var i = 0
+               while i < input.length do
+                       value.clear
+                       var pos = 0
+                       var eol = false
+                       while not eol and i < input.length do
+                               var c = input[i]
+                               if c == '\n' then
+                                       i += 1
+                                       eol = true
+                               else if c == '\t' then
+                                       var np = pos + (4 - (pos.bin_and(3)))
+                                       while pos < np do
+                                               value.add ' '
+                                               pos += 1
+                                       end
+                                       i += 1
+                               else
+                                       pos += 1
+                                       value.add c
+                                       i += 1
+                               end
+                       end
+
+                       var line = new MDLine(value.write_to_string)
+                       var is_link_ref = check_link_ref(line)
+                       # Skip link refs
+                       if not is_link_ref then block.add_line line
+               end
+               return block
+       end
+
+       # Check if line is a block link definition.
+       # Return `true` if line contains a valid link ref and save it into `link_refs`.
+       private fun check_link_ref(line: MDLine): Bool do
+               var md = line.value
+               var is_link_ref = false
+               var id = new FlatBuffer
+               var link = new FlatBuffer
+               var comment = new FlatBuffer
+               var pos = -1
+               if not line.is_empty and line.leading < 4 and line.value[line.leading] == '[' then
+                       pos = line.leading + 1
+                       pos = md.read_until(id, pos, ']')
+                       if not id.is_empty and pos + 2 < line.value.length then
+                               if line.value[pos + 1] == ':' then
+                                       pos += 2
+                                       pos = md.skip_spaces(pos)
+                                       if line.value[pos] == '<' then
+                                               pos += 1
+                                               pos = md.read_until(link, pos, '>')
+                                               pos += 1
+                                       else
+                                               pos = md.read_until(link, pos, ' ', '\n')
+                                       end
+                                       if not link.is_empty then
+                                               pos = md.skip_spaces(pos)
+                                               if pos > 0 and pos < line.value.length then
+                                                       var c = line.value[pos]
+                                                       if c == '\"' or c == '\'' or c == '(' then
+                                                               pos += 1
+                                                               if c == '(' then
+                                                                       pos = md.read_until(comment, pos, ')')
+                                                               else
+                                                                       pos = md.read_until(comment, pos, c)
+                                                               end
+                                                               if pos > 0 then is_link_ref = true
+                                                       end
+                                               else
+                                                       is_link_ref = true
+                                               end
+                                       end
+                               end
+                       end
+               end
+               if is_link_ref and not id.is_empty and not link.is_empty then
+                       var lr = new LinkRef.with_title(link.write_to_string, comment.write_to_string)
+                       add_link_ref(id.write_to_string, lr)
+                       if comment.is_empty then last_link_ref = lr
+                       return true
+               else
+                       comment = new FlatBuffer
+                       if not line.is_empty and last_link_ref != null then
+                               pos = line.leading
+                               var c = line.value[pos]
+                               if c == '\"' or c == '\'' or c ==  '(' then
+                                       pos += 1
+                                       if c == '(' then
+                                               pos = md.read_until(comment, pos, ')')
+                                       else
+                                               pos = md.read_until(comment, pos, c)
+                                       end
+                               end
+                               if not comment.is_empty then last_link_ref.title = comment.write_to_string
+                       end
+                       if comment.is_empty then return false
+                       return true
+               end
+       end
+
+       # Known link refs
+       # This list will be needed during output to expand links.
+       var link_refs: Map[String, LinkRef] = new HashMap[String, LinkRef]
+
+       # Last encountered link ref (for multiline definitions)
+       #
+       # Markdown allows link refs to be defined over two lines:
+       #
+       #       [id]: http://example.com/longish/path/to/resource/here
+       #               "Optional Title Here"
+       #
+       private var last_link_ref: nullable LinkRef = null
+
+       # Add a link ref to the list
+       fun add_link_ref(key: String, ref: LinkRef) do link_refs[key.to_lower] = ref
+
+       # Recursively split a `block`.
+       #
+       # The block is splitted according to the type of lines it contains.
+       # Some blocks can be splited again recursively like lists.
+       # The `in_list` mode is used to recurse on list and build
+       # nested paragraphs or code blocks.
+       fun recurse(root: MDBlock, in_list: Bool) do
+               var old_mode = self.in_list
+               var old_root = self.current_block
+               self.in_list = in_list
+
+               var line = root.first_line
+               while line != null and line.is_empty do
+                       line = line.next
+                       if line == null then return
+               end
+
+               current_line = line
+               current_block = root
+               while current_line != null do
+                       current_line.kind(self).process(self)
+               end
+               self.in_list = old_mode
+               self.current_block = old_root
+       end
+
+       # Currently processed line.
+       # Used when visiting blocks with `recurse`.
+       var current_line: nullable MDLine = null is writable
+
+       # Currently processed block.
+       # Used when visiting blocks with `recurse`.
+       var current_block: nullable MDBlock = null is writable
+
+       # Is the current recursion in list mode?
+       # Used when visiting blocks with `recurse`
+       private var in_list = false
+end
+
+# Emit output corresponding to blocks content.
+#
+# Blocks are created by a previous pass in `MarkdownProcessor`.
+# The emitter use a `Decorator` to select the output format.
+class MarkdownEmitter
+
+       # Processor containing link refs.
+       var processor: MarkdownProcessor
+
+       # Decorator used for output.
+       # Default is `HTMLDecorator`
+       var decorator: Decorator = new HTMLDecorator is writable
+
+       # Create a new `MardownEmitter` using the default `HTMLDecorator`
+       init(processor: MarkdownProcessor) do
+               self.processor = processor
+       end
+
+       # Create a new `MarkdownEmitter` using a custom `decorator`.
+       init with_decorator(processor: MarkdownProcessor, decorator: Decorator) do
+               init processor
+               self.decorator = decorator
+       end
+
+       # Output `block` using `decorator` in the current buffer.
+       fun emit(block: Block): Text do
+               var buffer = push_buffer
+               block.emit(self)
+               pop_buffer
+               return buffer
+       end
+
+       # Output the content of `block`.
+       fun emit_in(block: Block) do block.emit_in(self)
+
+       # Transform and emit mardown text
+       fun emit_text(text: Text) do
+               emit_text_until(text, 0, null)
+       end
+
+       # Transform and emit mardown text starting at `from` and
+       # until a token with the same type as `token` is found.
+       # Go until the end of text if `token` is null.
+       fun emit_text_until(text: Text, start: Int, token: nullable Token): Int do
+               var old_text = current_text
+               var old_pos = current_pos
+               current_text = text
+               current_pos = start
+               while current_pos < text.length do
+                       var mt = text.token_at(current_pos)
+                       if (token != null and not token isa TokenNone) and
+                       (mt.is_same_type(token) or
+                       (token isa TokenEmStar and mt isa TokenStrongStar) or
+                       (token isa TokenEmUnderscore and mt isa TokenStrongUnderscore)) then
+                               return current_pos
+                       end
+                       mt.emit(self)
+                       current_pos += 1
+               end
+               current_text = old_text
+               current_pos = old_pos
+               return -1
+       end
+
+       # Currently processed position in `current_text`.
+       # Used when visiting inline production with `emit_text_until`.
+       private var current_pos: Int = -1
+
+       # Currently processed text.
+       # Used when visiting inline production with `emit_text_until`.
+       private var current_text: nullable Text = null
+
+       # Stacked buffers.
+       private var buffer_stack = new List[FlatBuffer]
+
+       # Push a new buffer on the stack.
+       private fun push_buffer: FlatBuffer do
+               var buffer = new FlatBuffer
+               buffer_stack.add buffer
+               return buffer
+       end
+
+       # Pop the last buffer.
+       private fun pop_buffer do buffer_stack.pop
+
+       # Current output buffer.
+       private fun current_buffer: FlatBuffer do
+               assert not buffer_stack.is_empty
+               return buffer_stack.last
+       end
+
+       # Append `e` to current buffer.
+       fun add(e: Streamable) do
+               if e isa Text then
+                       current_buffer.append e
+               else
+                       current_buffer.append e.write_to_string
+               end
+       end
+
+       # Append `c` to current buffer.
+       fun addc(c: Char) do current_buffer.add c
+
+       # Append a "\n" line break.
+       fun addn do current_buffer.add '\n'
+end
+
+# A Link Reference.
+# Links that are specified somewhere in the mardown document to be reused as shortcuts.
+#
+# Example:
+#
+#    [1]: http://example.com/ "Optional title"
+class LinkRef
+
+       # Link href
+       var link: String
+
+       # Optional link title
+       var title: nullable String = null
+
+       # Is the link an abreviation?
+       var is_abbrev = false
+
+       init with_title(link: String, title: nullable String) do
+               self.link = link
+               self.title = title
+       end
+end
+
+# A `Decorator` is used to emit mardown into a specific format.
+# Default decorator used is `HTMLDecorator`.
+interface Decorator
+
+       # Render a ruler block.
+       fun add_ruler(v: MarkdownEmitter, block: BlockRuler) is abstract
+
+       # Render a headline block with corresponding level.
+       fun add_headline(v: MarkdownEmitter, block: BlockHeadline) is abstract
+
+       # Render a paragraph block.
+       fun add_paragraph(v: MarkdownEmitter, block: BlockParagraph) is abstract
+
+       # Render a code or fence block.
+       fun add_code(v: MarkdownEmitter, block: BlockCode) is abstract
+
+       # Render a blockquote.
+       fun add_blockquote(v: MarkdownEmitter, block: BlockQuote) is abstract
+
+       # Render an unordered list.
+       fun add_unorderedlist(v: MarkdownEmitter, block: BlockUnorderedList) is abstract
+
+       # Render an ordered list.
+       fun add_orderedlist(v: MarkdownEmitter, block: BlockOrderedList) is abstract
+
+       # Render a list item.
+       fun add_listitem(v: MarkdownEmitter, block: BlockListItem) is abstract
+
+       # Render an emphasis text.
+       fun add_em(v: MarkdownEmitter, text: Text) is abstract
+
+       # Render a strong text.
+       fun add_strong(v: MarkdownEmitter, text: Text) is abstract
+
+       # Render a super text.
+       fun add_super(v: MarkdownEmitter, text: Text) is abstract
+
+       # Render a link.
+       fun add_link(v: MarkdownEmitter, link: Text, name: Text, comment: nullable Text) is abstract
+
+       # Render an image.
+       fun add_image(v: MarkdownEmitter, link: Text, name: Text, comment: nullable Text) is abstract
+
+       # Render an abbreviation.
+       fun add_abbr(v: MarkdownEmitter, name: Text, comment: Text) is abstract
+
+       # Render a code span reading from a buffer.
+       fun add_span_code(v: MarkdownEmitter, buffer: Text, from, to: Int) is abstract
+
+       # Render a text and escape it.
+       fun append_value(v: MarkdownEmitter, value: Text) is abstract
+
+       # Render code text from buffer and escape it.
+       fun append_code(v: MarkdownEmitter, buffer: Text, from, to: Int) is abstract
+
+       # Render a character escape.
+       fun escape_char(v: MarkdownEmitter, char: Char) is abstract
+
+       # Render a line break
+       fun add_line_break(v: MarkdownEmitter) is abstract
+
+       # Generate a new html valid id from a `String`.
+       fun strip_id(txt: String): String is abstract
+
+       # Found headlines during the processing labeled by their ids.
+       fun headlines: ArrayMap[String, HeadLine] is abstract
+end
+
+# Class representing a markdown headline.
+class HeadLine
+       # Unique identifier of this headline.
+       var id: String
+
+       # Text of the headline.
+       var title: String
+
+       # Level of this headline.
+       #
+       # According toe the markdown specification, level must be in `[1..6]`.
+       var level: Int
+end
+
+# `Decorator` that outputs HTML.
+class HTMLDecorator
+       super Decorator
+
+       redef var headlines = new ArrayMap[String, HeadLine]
+
+       redef fun add_ruler(v, block) do v.add "<hr/>\n"
+
+       redef fun add_headline(v, block) do
+               # save headline
+               var txt = block.block.first_line.value
+               var id = strip_id(txt)
+               var lvl = block.depth
+               headlines[id] = new HeadLine(id, txt, lvl)
+               # output it
+               v.add "<h{lvl} id=\"{id}\">"
+               v.emit_in block
+               v.add "</h{lvl}>\n"
+       end
+
+       redef fun add_paragraph(v, block) do
+               v.add "<p>"
+               v.emit_in block
+               v.add "</p>\n"
+       end
+
+       redef fun add_code(v, block) do
+               v.add "<pre><code>"
+               v.emit_in block
+               v.add "</code></pre>\n"
+       end
+
+       redef fun add_blockquote(v, block) do
+               v.add "<blockquote>\n"
+               v.emit_in block
+               v.add "</blockquote>\n"
+       end
+
+       redef fun add_unorderedlist(v, block) do
+               v.add "<ul>\n"
+               v.emit_in block
+               v.add "</ul>\n"
+       end
+
+       redef fun add_orderedlist(v, block) do
+               v.add "<ol>\n"
+               v.emit_in block
+               v.add "</ol>\n"
+       end
+
+       redef fun add_listitem(v, block) do
+               v.add "<li>"
+               v.emit_in block
+               v.add "</li>\n"
+       end
+
+       redef fun add_em(v, text) do
+               v.add "<em>"
+               v.add text
+               v.add "</em>"
+       end
+
+       redef fun add_strong(v, text) do
+               v.add "<strong>"
+               v.add text
+               v.add "</strong>"
+       end
+
+       redef fun add_super(v, text) do
+               v.add "<sup>"
+               v.add text
+               v.add "</sup>"
+       end
+
+       redef fun add_image(v, link, name, comment) do
+               v.add "<img src=\""
+               append_value(v, link)
+               v.add "\" alt=\""
+               append_value(v, name)
+               v.add "\""
+               if comment != null and not comment.is_empty then
+                       v.add " title=\""
+                       append_value(v, comment)
+                       v.add "\""
+               end
+               v.add "/>"
+       end
+
+       redef fun add_link(v, link, name, comment) do
+               v.add "<a href=\""
+               append_value(v, link)
+               v.add "\""
+               if comment != null and not comment.is_empty then
+                       v.add " title=\""
+                       append_value(v, comment)
+                       v.add "\""
+               end
+               v.add ">"
+               v.emit_text(name)
+               v.add "</a>"
+       end
+
+       redef fun add_abbr(v, name, comment) do
+               v.add "<abbr title=\""
+               append_value(v, comment)
+               v.add "\">"
+               v.emit_text(name)
+               v.add "</abbr>"
+       end
+
+       redef fun add_span_code(v, text, from, to) do
+               v.add "<code>"
+               append_code(v, text, from, to)
+               v.add "</code>"
+       end
+
+       redef fun add_line_break(v) do
+               v.add "<br/>"
+       end
+
+       redef fun append_value(v, text) do for c in text do escape_char(v, c)
+
+       redef fun escape_char(v, c) do
+               if c == '&' then
+                       v.add "&amp;"
+               else if c == '<' then
+                       v.add "&lt;"
+               else if c == '>' then
+                       v.add "&gt;"
+               else if c == '"' then
+                       v.add "&quot;"
+               else if c == '\'' then
+                       v.add "&apos;"
+               else
+                       v.addc c
+               end
+       end
+
+       redef fun append_code(v, buffer, from, to) do
+               for i in [from..to[ do
+                       var c = buffer[i]
+                       if c == '&' then
+                               v.add "&amp;"
+                       else if c == '<' then
+                               v.add "&lt;"
+                       else if c == '>' then
+                               v.add "&gt;"
+                       else
+                               v.addc c
+                       end
+               end
+       end
+
+       redef fun strip_id(txt) do
+               # strip id
+               var b = new FlatBuffer
+               for c in txt do
+                       if c == ' ' then
+                               b.add '_'
+                       else
+                               if not c.is_letter and
+                                  not c.is_digit and
+                                  not allowed_id_chars.has(c) then continue
+                               b.add c
+                       end
+               end
+               var res = b.to_s
+               var key = res
+               # check for multiple id definitions
+               if headlines.has_key(key) then
+                       var i = 1
+                       key = "{res}_{i}"
+                       while headlines.has_key(key) do
+                               i += 1
+                               key = "{res}_{i}"
+                       end
+               end
+               return key
+       end
+
+       private var allowed_id_chars: Array[Char] = ['-', '_', ':', '.']
+end
+
+# A block of markdown lines.
+# A `MDBlock` can contains lines and/or sub-blocks.
+class MDBlock
+       # Kind of block.
+       # See `Block`.
+       var kind: Block = new BlockNone(self) is writable
+
+       # First line if any.
+       var first_line: nullable MDLine = null is writable
+
+       # Last line if any.
+       var last_line: nullable MDLine = null is writable
+
+       # First sub-block if any.
+       var first_block: nullable MDBlock = null is writable
+
+       # Last sub-block if any.
+       var last_block: nullable MDBlock = null is writable
+
+       # Previous block if any.
+       var prev: nullable MDBlock = null is writable
+
+       # Next block if any.
+       var next: nullable MDBlock = null is writable
+
+       # Does this block contain subblocks?
+       fun has_blocks: Bool do return first_block != null
+
+       # Count sub-blocks.
+       fun count_blocks: Int do
+               var count = 0
+               var block = first_block
+               while block != null do
+                       count += 1
+                       block = block.next
+               end
+               return count
+       end
+
+       # Does this block contain lines?
+       fun has_lines: Bool do return first_line != null
+
+       # Count block lines.
+       fun count_lines: Int do
+               var count = 0
+               var line = first_line
+               while line != null do
+                       count += 1
+                       line = line.next
+               end
+               return count
+       end
+
+       # Split `self` creating a new sub-block having `line` has `last_line`.
+       fun split(line: MDLine): MDBlock do
+               var block = new MDBlock
+               block.first_line = first_line
+               block.last_line = line
+               first_line = line.next
+               line.next = null
+               if first_line == null then
+                       last_line = null
+               else
+                       first_line.prev = null
+               end
+               if first_block == null then
+                       first_block = block
+                       last_block = block
+               else
+                       last_block.next = block
+                       last_block = block
+               end
+               return block
+       end
+
+       # Add a `line` to this block.
+       fun add_line(line: MDLine) do
+               if last_line == null then
+                       first_line = line
+                       last_line = line
+               else
+                       last_line.next_empty = line.is_empty
+                       line.prev_empty = last_line.is_empty
+                       line.prev = last_line
+                       last_line.next = line
+                       last_line = line
+               end
+       end
+
+       # Remove `line` from this block.
+       fun remove_line(line: MDLine) do
+               if line.prev == null then
+                       first_line = line.next
+               else
+                       line.prev.next = line.next
+               end
+               if line.next == null then
+                       last_line = line.prev
+               else
+                       line.next.prev = line.prev
+               end
+               line.prev = null
+               line.next = null
+       end
+
+       # Remove leading empty lines.
+       fun remove_leading_empty_lines: Bool do
+               var was_empty = false
+               var line = first_line
+               while line != null and line.is_empty do
+                       remove_line line
+                       line = first_line
+                       was_empty = true
+               end
+               return was_empty
+       end
+
+       # Remove trailing empty lines.
+       fun remove_trailing_empty_lines: Bool do
+               var was_empty = false
+               var line = last_line
+               while line != null and line.is_empty do
+                       remove_line line
+                       line = last_line
+                       was_empty = true
+               end
+               return was_empty
+       end
+
+       # Remove leading and trailing empty lines.
+       fun remove_surrounding_empty_lines: Bool do
+               var was_empty = false
+               if remove_leading_empty_lines then was_empty = true
+               if remove_trailing_empty_lines then was_empty = true
+               return was_empty
+       end
+
+       # Remove list markers and up to 4 leading spaces.
+       # Used to clean nested lists.
+       fun remove_list_indent(v: MarkdownProcessor) do
+               var line = first_line
+               while line != null do
+                       if not line.is_empty then
+                               var kind = line.kind(v)
+                               if kind isa LineList then
+                                       line.value = kind.extract_value(line)
+                               else
+                                       line.value = line.value.substring_from(line.leading.min(4))
+                               end
+                               line.leading = line.process_leading
+                       end
+                       line = line.next
+               end
+       end
+
+       # Collect block line text.
+       fun text: String do
+               var text = new FlatBuffer
+               var line = first_line
+               while line != null do
+                       if not line.is_empty then
+                               text.append line.text
+                       end
+                       text.append "\n"
+                       line = line.next
+               end
+               return text.write_to_string
+       end
+end
+
+# Representation of a markdown block in the AST.
+# Each `Block` is linked to a `MDBlock` that contains mardown code.
+abstract class Block
+
+       # The markdown block `self` is related to.
+       var block: MDBlock
+
+       # Output `self` using `v.decorator`.
+       fun emit(v: MarkdownEmitter) do v.emit_in(self)
+
+       # Emit the containts of `self`, lines or blocks.
+       fun emit_in(v: MarkdownEmitter) do
+               block.remove_surrounding_empty_lines
+               if block.has_lines then
+                       emit_lines(v)
+               else
+                       emit_blocks(v)
+               end
+       end
+
+       # Emit lines contained in `block`.
+       fun emit_lines(v: MarkdownEmitter) do
+               var tpl = v.push_buffer
+               var line = block.first_line
+               while line != null do
+                       if not line.is_empty then
+                               v.add line.value.substring(line.leading, line.value.length - line.trailing)
+                               if line.trailing >= 2 then v.decorator.add_line_break(v)
+                       end
+                       if line.next != null then
+                               v.addn
+                       end
+                       line = line.next
+               end
+               v.pop_buffer
+               v.emit_text(tpl)
+       end
+
+       # Emit sub-blocks contained in `block`.
+       fun emit_blocks(v: MarkdownEmitter) do
+               var block = self.block.first_block
+               while block != null do
+                       block.kind.emit(v)
+                       block = block.next
+               end
+       end
+end
+
+# A block without any markdown specificities.
+#
+# Actually use the same implementation than `BlockCode`,
+# this class is only used for typing purposes.
+class BlockNone
+       super Block
+end
+
+# A markdown blockquote.
+class BlockQuote
+       super Block
+
+       redef fun emit(v) do v.decorator.add_blockquote(v, self)
+
+       # Remove blockquote markers.
+       private fun remove_block_quote_prefix(block: MDBlock) do
+               var line = block.first_line
+               while line != null do
+                       if not line.is_empty then
+                               if line.value[line.leading] == '>' then
+                                       var rem = line.leading + 1
+                                       if line.leading + 1 < line.value.length and
+                                          line.value[line.leading + 1] == ' ' then
+                                               rem += 1
+                                       end
+                                       line.value = line.value.substring_from(rem)
+                                       line.leading = line.process_leading
+                               end
+                       end
+                       line = line.next
+               end
+       end
+end
+
+# A markdown code block.
+class BlockCode
+       super Block
+
+       redef fun emit(v) do v.decorator.add_code(v, self)
+
+       redef fun emit_lines(v) do
+               var line = block.first_line
+               while line != null do
+                       if not line.is_empty then
+                               v.decorator.append_code(v, line.value, 4, line.value.length)
+                       end
+                       v.addn
+                       line = line.next
+               end
+       end
+end
+
+# A markdown code-fence block.
+#
+# Actually use the same implementation than `BlockCode`,
+# this class is only used for typing purposes.
+class BlockFence
+       super BlockCode
+end
+
+# A markdown headline.
+class BlockHeadline
+       super Block
+
+       redef fun emit(v) do v.decorator.add_headline(v, self)
+
+       # Depth of the headline used to determine the headline level.
+       var depth = 0
+
+       # Remove healine marks from lines contained in `self`.
+       private fun transform_headline(block: MDBlock) do
+               if depth > 0 then return
+               var level = 0
+               var line = block.first_line
+               if line.is_empty then return
+               var start = line.leading
+               while start < line.value.length and line.value[start] == '#' do
+                       level += 1
+                       start += 1
+               end
+               while start < line.value.length and line.value[start] == ' ' do
+                       start += 1
+               end
+               if start >= line.value.length then
+                       line.is_empty = true
+               else
+                       var nend = line.value.length - line.trailing - 1
+                       while line.value[nend] == '#' do nend -= 1
+                       while line.value[nend] == ' ' do nend -= 1
+                       line.value = line.value.substring(start, nend - start + 1)
+                       line.leading = 0
+                       line.trailing = 0
+               end
+               depth = level.min(6)
+       end
+end
+
+# A markdown list item block.
+class BlockListItem
+       super Block
+
+       redef fun emit(v) do v.decorator.add_listitem(v, self)
+end
+
+# A markdown list block.
+# Can be either an ordered or unordered list, this class is mainly used to factorize code.
+abstract class BlockList
+       super Block
+
+       # Split list block into list items sub-blocks.
+       private fun init_block(v: MarkdownProcessor) do
+               var line = block.first_line
+               line = line.next
+               while line != null do
+                       var t = line.kind(v)
+                       if t isa LineList or
+                          (not line.is_empty and (line.prev_empty and line.leading == 0 and
+                          not (t isa LineList))) then
+                                  var sblock = block.split(line.prev.as(not null))
+                                  sblock.kind = new BlockListItem(sblock)
+                       end
+                       line = line.next
+               end
+               var sblock = block.split(block.last_line.as(not null))
+               sblock.kind = new BlockListItem(sblock)
+       end
+
+       # Expand list items as paragraphs if needed.
+       private fun expand_paragraphs(block: MDBlock) do
+               var outer = block.first_block
+               var inner: nullable MDBlock
+               var has_paragraph = false
+               while outer != null and not has_paragraph do
+                       if outer.kind isa BlockListItem then
+                               inner = outer.first_block
+                               while inner != null and not has_paragraph do
+                                       if inner.kind isa BlockParagraph then
+                                               has_paragraph = true
+                                       end
+                                       inner = inner.next
+                               end
+                       end
+                       outer = outer.next
+               end
+               if has_paragraph then
+                       outer = block.first_block
+                       while outer != null do
+                               if outer.kind isa BlockListItem then
+                                       inner = outer.first_block
+                                       while inner != null do
+                                               if inner.kind isa BlockNone then
+                                                       inner.kind = new BlockParagraph(inner)
+                                               end
+                                               inner = inner.next
+                                       end
+                               end
+                               outer = outer.next
+                       end
+               end
+       end
+end
+
+# A markdown ordered list.
+class BlockOrderedList
+       super BlockList
+
+       redef fun emit(v) do v.decorator.add_orderedlist(v, self)
+end
+
+# A markdown unordred list.
+class BlockUnorderedList
+       super BlockList
+
+       redef fun emit(v) do v.decorator.add_unorderedlist(v, self)
+end
+
+# A markdown paragraph block.
+class BlockParagraph
+       super Block
+
+       redef fun emit(v) do v.decorator.add_paragraph(v, self)
+end
+
+# A markdown ruler.
+class BlockRuler
+       super Block
+
+       redef fun emit(v) do v.decorator.add_ruler(v, self)
+end
+
+# Xml blocks that can be found in markdown markup.
+class BlockXML
+       super Block
+
+       redef fun emit_lines(v) do
+               var line = block.first_line
+               while line != null do
+                       if not line.is_empty then v.add line.value
+                       v.addn
+                       line = line.next
+               end
+       end
+end
+
+# A markdown line.
+class MDLine
+
+       # Text contained in this line.
+       var value: String is writable
+
+       # Is this line empty?
+       # Lines containing only spaces are considered empty.
+       var is_empty: Bool = true is writable
+
+       # Previous line in `MDBlock` or null if first line.
+       var prev: nullable MDLine = null is writable
+
+       # Next line in `MDBlock` or null if last line.
+       var next: nullable MDLine = null is writable
+
+       # Is the previous line empty?
+       var prev_empty: Bool = false is writable
+
+       # Is the next line empty?
+       var next_empty: Bool = false is writable
+
+       init(value: String) do
+               self.value = value
+               self.leading = process_leading
+               if leading != value.length then
+                       self.is_empty = false
+                       self.trailing = process_trailing
+               end
+       end
+
+       # Set `value` as an empty String and update `leading`, `trailing` and is_`empty`.
+       fun clear do
+               value = ""
+               leading = 0
+               trailing = 0
+               is_empty = true
+               if prev != null then prev.next_empty = true
+               if next != null then next.prev_empty = true
+       end
+
+       # The type of line.
+       # see `md_line_*`
+       fun kind(v: MarkdownProcessor): Line do
+               var value = self.value
+               if is_empty then return new LineEmpty
+               if leading > 3 then return new LineCode
+               if value[leading] == '#' then return new LineHeadline
+               if value[leading] == '>' then return new LineBlockquote
+
+               if value.length - leading - trailing > 2 then
+                       if value[leading] == '`' and count_chars_start('`') >= 3 then
+                               return new LineFence
+                       end
+                       if value[leading] == '~' and count_chars_start('~') >= 3 then
+                               return new LineFence
+                       end
+               end
+
+               if value.length - leading - trailing > 2 and
+                  (value[leading] == '*' or value[leading] == '-' or value[leading] == '_') then
+                  if count_chars(value[leading]) >= 3 then
+                               return new LineHR
+                  end
+               end
+
+               if value.length - leading >= 2 and value[leading + 1] == ' ' then
+                       var c = value[leading]
+                       if c == '*' or c == '-' or c == '+' then return new LineUList
+               end
+
+               if value.length - leading >= 3 and value[leading].is_digit then
+                       var i = leading + 1
+                       while i < value.length and value[i].is_digit do i += 1
+                       if i + 1 < value.length and value[i] == '.' and value[i + 1] == ' ' then
+                               return new LineOList
+                       end
+               end
+
+               if value[leading] == '<' and check_html then return new LineXML
+
+               if next != null and not next.is_empty then
+                       if next.count_chars('=') > 0 then
+                               return new LineHeadline1
+                       end
+                       if next.count_chars('-') > 0 then
+                               return new LineHeadline2
+                       end
+               end
+               return new LineOther
+       end
+
+       # Number or leading spaces on this line.
+       var leading: Int = 0 is writable
+
+       # Compute `leading` depending on `value`.
+       fun process_leading: Int do
+               var count = 0
+               var value = self.value
+               while count < value.length and value[count] == ' ' do count += 1
+               if leading == value.length then clear
+               return count
+       end
+
+       # Number of trailing spaces on this line.
+       var trailing: Int = 0 is writable
+
+       # Compute `trailing` depending on `value`.
+       fun process_trailing: Int do
+               var count = 0
+               var value = self.value
+               while value[value.length - count - 1] == ' ' do
+                       count += 1
+               end
+               return count
+       end
+
+       # Count the amount of `ch` in this line.
+       # Return A value > 0 if this line only consists of `ch` end spaces.
+       fun count_chars(ch: Char): Int do
+               var count = 0
+               for c in value do
+                       if c == ' ' then
+                               continue
+                       end
+                       if c == ch then
+                               count += 1
+                               continue
+                       end
+                       count = 0
+                       break
+               end
+               return count
+       end
+
+       # Count the amount of `ch` at the start of this line ignoring spaces.
+       fun count_chars_start(ch: Char): Int do
+               var count = 0
+               for c in value do
+                       if c == ' ' then
+                               continue
+                       end
+                       if c == ch then
+                               count += 1
+                       else
+                               break
+                       end
+               end
+               return count
+       end
+
+       # Last XML line if any.
+       private var xml_end_line: nullable MDLine = null
+
+       # Does `value` contains valid XML markup?
+       private fun check_html: Bool do
+               var tags = new Array[String]
+               var tmp = new FlatBuffer
+               var pos = leading
+               if pos + 1 < value.length and value[pos + 1] == '!' then
+                       if read_xml_comment(self, pos) > 0 then return true
+               end
+               pos = value.read_xml(tmp, pos, false)
+               var tag: String
+               if pos > -1 then
+                       tag = tmp.xml_tag
+                       if not tag.is_html_block then
+                               return false
+                       end
+                       if tag == "hr" then
+                               xml_end_line = self
+                               return true
+                       end
+                       tags.add tag
+                       var line: nullable MDLine = self
+                       while line != null do
+                               while pos < line.value.length and line.value[pos] != '<' do
+                                       pos += 1
+                               end
+                               if pos >= line.value.length then
+                                       if pos - 2 >= 0 and line.value[pos - 2] == '/' then
+                                               tags.pop
+                                               if tags.is_empty then
+                                                       xml_end_line = line
+                                                       break
+                                               end
+                                       end
+                                       line = line.next
+                                       pos = 0
+                               else
+                                       tmp = new FlatBuffer
+                                       var new_pos = line.value.read_xml(tmp, pos, false)
+                                       if new_pos > 0 then
+                                               tag = tmp.xml_tag
+                                               if tag.is_html_block and not tag == "hr" then
+                                                       if tmp[1] == '/' then
+                                                               if tags.last != tag then
+                                                                       return false
+                                                               end
+                                                               tags.pop
+                                                       else
+                                                               tags.add tag
+                                                       end
+                                               end
+                                               if tags.is_empty then
+                                                       xml_end_line = line
+                                                       break
+                                               end
+                                               pos = new_pos
+                                       else
+                                               pos += 1
+                                       end
+                               end
+                       end
+                       return tags.is_empty
+               end
+               return false
+       end
+
+       # Read a XML comment.
+       # Used by `check_html`.
+       private fun read_xml_comment(first_line: MDLine, start: Int): Int do
+               var line: nullable MDLine = first_line
+               if start + 3 < line.value.length then
+                       if line.value[2] == '-' and line.value[3] == '-' then
+                               var pos = start + 4
+                               while line != null do
+                                       while pos < line.value.length and line.value[pos] != '-' do
+                                               pos += 1
+                                       end
+                                       if pos == line.value.length then
+                                               line = line.next
+                                               pos = 0
+                                       else
+                                               if pos + 2 < line.value.length then
+                                                       if line.value[pos + 1] == '-' and line.value[pos + 2] == '>' then
+                                                               first_line.xml_end_line = line
+                                                               return pos + 3
+                                                       end
+                                               end
+                                               pos += 1
+                                       end
+                               end
+                       end
+               end
+               return -1
+       end
+
+       # Extract the text of `self` without leading and trailing.
+       fun text: String do return value.substring(leading, value.length - trailing)
+end
+
+# A markdown line.
+interface Line
+
+       # Parse the line.
+       # See `MarkdownProcessor::recurse`.
+       fun process(v: MarkdownProcessor) is abstract
+end
+
+# An empty markdown line.
+class LineEmpty
+       super Line
+
+       redef fun process(v) do
+               v.current_line = v.current_line.next
+       end
+end
+
+# A non-specific markdown construction.
+# Mainly used as part of another line construct such as paragraphs or lists.
+class LineOther
+       super Line
+
+       redef fun process(v) do
+               var line = v.current_line
+               # go to block end
+               var was_empty = line.prev_empty
+               while line != null and not line.is_empty do
+                       var t = line.kind(v)
+                       if v.in_list and t isa LineList then
+                               break
+                       end
+                       if t isa LineCode or t isa LineFence then
+                               break
+                       end
+                       if t isa LineHeadline or t isa LineHeadline1 or t isa LineHeadline2 or
+                          t isa LineHR or t isa LineBlockquote or t isa LineXML then
+                                  break
+                       end
+                       line = line.next
+               end
+               # build block
+               var bk: Block
+               if line != null and not line.is_empty then
+                       var block = v.current_block.split(line.prev.as(not null))
+                       if v.in_list and not was_empty then
+                               block.kind = new BlockNone(block)
+                       else
+                               block.kind = new BlockParagraph(block)
+                       end
+                       v.current_block.remove_leading_empty_lines
+               else
+                       var block: MDBlock
+                       if line != null then
+                               block = v.current_block.split(line)
+                       else
+                               block = v.current_block.split(v.current_block.last_line.as(not null))
+                       end
+                       if v.in_list and (line == null or not line.is_empty) and not was_empty then
+                               block.kind = new BlockNone(block)
+                       else
+                               block.kind = new BlockParagraph(block)
+                       end
+                       v.current_block.remove_leading_empty_lines
+               end
+               v.current_line = v.current_block.first_line
+       end
+end
+
+# A line of markdown code.
+class LineCode
+       super Line
+
+       redef fun process(v) do
+               var line = v.current_line
+               # lookup block end
+               while line != null and (line.is_empty or line.kind(v) isa LineCode) do
+                       line = line.next
+               end
+               # split at block end line
+               var block: MDBlock
+               if line != null then
+                       block = v.current_block.split(line.prev.as(not null))
+               else
+                       block = v.current_block.split(v.current_block.last_line.as(not null))
+               end
+               block.kind = new BlockCode(block)
+               block.remove_surrounding_empty_lines
+               v.current_line = v.current_block.first_line
+       end
+end
+
+# A line of raw XML.
+class LineXML
+       super Line
+
+       redef fun process(v) do
+               var line = v.current_line
+               var prev = line.prev
+               if prev != null then v.current_block.split(prev)
+               var block = v.current_block.split(line.xml_end_line.as(not null))
+               block.kind = new BlockXML(block)
+               v.current_block.remove_leading_empty_lines
+               v.current_line = v.current_block.first_line
+       end
+end
+
+# A markdown blockquote line.
+class LineBlockquote
+       super Line
+
+       redef fun process(v) do
+               var line = v.current_line
+               # go to bquote end
+               while line != null do
+                       if not line.is_empty and (line.prev_empty and
+                          line.leading == 0 and
+                          not line.kind(v) isa LineBlockquote) then break
+                       line = line.next
+               end
+               # build sub block
+               var block: MDBlock
+               if line != null then
+                       block = v.current_block.split(line.prev.as(not null))
+               else
+                       block = v.current_block.split(v.current_block.last_line.as(not null))
+               end
+               var kind = new BlockQuote(block)
+               block.kind = kind
+               block.remove_surrounding_empty_lines
+               kind.remove_block_quote_prefix(block)
+               v.current_line = line
+               v.recurse(block, false)
+               v.current_line = v.current_block.first_line
+       end
+end
+
+# A markdown ruler line.
+class LineHR
+       super Line
+
+       redef fun process(v) do
+               var line = v.current_line
+               if line.prev != null then v.current_block.split(line.prev.as(not null))
+               var block = v.current_block.split(line.as(not null))
+               block.kind = new BlockRuler(block)
+               v.current_block.remove_leading_empty_lines
+               v.current_line = v.current_block.first_line
+       end
+end
+
+# A markdown fence code line.
+class LineFence
+       super Line
+
+       redef fun process(v) do
+               # go to fence end
+               var line = v.current_line.next
+               while line != null do
+                       if line.kind(v) isa LineFence then break
+                       line = line.next
+               end
+               if line != null then
+                       line = line.next
+               end
+               # build fence block
+               var block: MDBlock
+               if line != null then
+                       block = v.current_block.split(line.prev.as(not null))
+               else
+                       block = v.current_block.split(v.current_block.last_line.as(not null))
+               end
+               block.kind = new BlockFence(block)
+               block.first_line.clear
+               if block.last_line.kind(v) isa LineFence then
+                       block.last_line.clear
+               end
+               block.remove_surrounding_empty_lines
+               v.current_line = line
+       end
+end
+
+# A markdown headline.
+class LineHeadline
+       super Line
+
+       redef fun process(v) do
+               var line = v.current_line
+               var lprev = line.prev
+               if lprev != null then v.current_block.split(lprev)
+               var block = v.current_block.split(line.as(not null))
+               var kind = new BlockHeadline(block)
+               block.kind = kind
+               kind.transform_headline(block)
+               v.current_block.remove_leading_empty_lines
+               v.current_line = v.current_block.first_line
+       end
+end
+
+# A markdown headline of level 1.
+class LineHeadline1
+       super LineHeadline
+
+       redef fun process(v) do
+               var line = v.current_line
+               var lprev = line.prev
+               if lprev != null then v.current_block.split(lprev)
+               line.next.clear
+               var block = v.current_block.split(line.as(not null))
+               var kind = new BlockHeadline(block)
+               kind.depth = 1
+               kind.transform_headline(block)
+               block.kind = kind
+               v.current_block.remove_leading_empty_lines
+               v.current_line = v.current_block.first_line
+       end
+end
+
+# A markdown headline of level 2.
+class LineHeadline2
+       super LineHeadline
+
+       redef fun process(v) do
+               var line = v.current_line
+               var lprev = line.prev
+               if lprev != null then v.current_block.split(lprev)
+               line.next.clear
+               var block = v.current_block.split(line.as(not null))
+               var kind = new BlockHeadline(block)
+               kind.depth = 2
+               kind.transform_headline(block)
+               block.kind = kind
+               v.current_block.remove_leading_empty_lines
+               v.current_line = v.current_block.first_line
+       end
+end
+
+# A markdown list line.
+# Mainly used to factorize code between ordered and unordered lists.
+class LineList
+       super Line
+
+       redef fun process(v) do
+               var line = v.current_line
+               # go to list end
+               while line != null do
+                       var t = line.kind(v)
+                       if not line.is_empty and (line.prev_empty and line.leading == 0 and
+                          not t isa LineList) then break
+                       line = line.next
+               end
+               # build list block
+               var list: MDBlock
+               if line != null then
+                       list = v.current_block.split(line.prev.as(not null))
+               else
+                       list = v.current_block.split(v.current_block.last_line.as(not null))
+               end
+               var kind = block_kind(list)
+               list.kind = kind
+               list.first_line.prev_empty = false
+               list.last_line.next_empty = false
+               list.remove_surrounding_empty_lines
+               list.first_line.prev_empty = false
+               list.last_line.next_empty = false
+               kind.init_block(v)
+               var block = list.first_block
+               while block != null do
+                       block.remove_list_indent(v)
+                       v.recurse(block, true)
+                       block = block.next
+               end
+               kind.expand_paragraphs(list)
+               v.current_line = line
+       end
+
+       # Create a new block kind based on this line.
+       protected fun block_kind(block: MDBlock): BlockList is abstract
+
+       protected fun extract_value(line: MDLine): String is abstract
+end
+
+# An ordered list line.
+class LineOList
+       super LineList
+
+       redef fun block_kind(block) do return new BlockOrderedList(block)
+
+       redef fun extract_value(line) do
+               return line.value.substring_from(line.value.index_of('.') + 2)
+       end
+end
+
+# An unordered list line.
+class LineUList
+       super LineList
+
+       redef fun block_kind(block) do return new BlockUnorderedList(block)
+
+       redef fun extract_value(line) do
+               return line.value.substring_from(line.leading + 2)
+       end
+end
+
+# A token represent a character in the markdown input.
+# Some tokens have a specific markup behaviour that is handled here.
+abstract class Token
+
+       # Position of `self` in markdown input.
+       var pos: Int
+
+       # Character found at `pos` in the markdown input.
+       var char: Char
+
+       # Output that token using `MarkdownEmitter::decorator`.
+       fun emit(v: MarkdownEmitter) do v.addc char
+end
+
+# A token without a specific meaning.
+class TokenNone
+       super Token
+end
+
+# An emphasis token.
+abstract class TokenEm
+       super Token
+
+       redef fun emit(v) do
+               var tmp = v.push_buffer
+               var b = v.emit_text_until(v.current_text.as(not null), pos + 1, self)
+               v.pop_buffer
+               if b > 0 then
+                       v.decorator.add_em(v, tmp)
+                       v.current_pos = b
+               else
+                       v.addc char
+               end
+       end
+end
+
+# An emphasis star token.
+class TokenEmStar
+       super TokenEm
+end
+
+# An emphasis underscore token.
+class TokenEmUnderscore
+       super TokenEm
+end
+
+# A strong token.
+abstract class TokenStrong
+       super Token
+
+       redef fun emit(v) do
+               var tmp = v.push_buffer
+               var b = v.emit_text_until(v.current_text.as(not null), pos + 2, self)
+               v.pop_buffer
+               if b > 0 then
+                       v.decorator.add_strong(v, tmp)
+                       v.current_pos = b + 1
+               else
+                       v.addc char
+               end
+       end
+end
+
+# A strong star token.
+class TokenStrongStar
+       super TokenStrong
+end
+
+# A strong underscore token.
+class TokenStrongUnderscore
+       super TokenStrong
+end
+
+# A code token.
+# This class is mainly used to factorize work between single and double quoted span codes.
+abstract class TokenCode
+       super Token
+
+       redef fun emit(v) do
+               var a = pos + next_pos + 1
+               var b = v.current_text.find_token(a, self)
+               if b > 0 then
+                       v.current_pos = b + next_pos
+                       while a < b and v.current_text[a] == ' ' do a += 1
+                       if a < b then
+                               while v.current_text[b - 1] == ' ' do b -= 1
+                               v.decorator.add_span_code(v, v.current_text.as(not null), a, b)
+                       end
+               else
+                       v.addc char
+               end
+       end
+
+       private fun next_pos: Int is abstract
+end
+
+# A span code token.
+class TokenCodeSingle
+       super TokenCode
+
+       redef fun next_pos do return 0
+end
+
+# A doubled span code token.
+class TokenCodeDouble
+       super TokenCode
+
+       redef fun next_pos do return 1
+end
+
+# A link or image token.
+# This class is mainly used to factorize work between images and links.
+abstract class TokenLinkOrImage
+       super Token
+
+       # Link adress
+       var link: nullable Text = null
+
+       # Link text
+       var name: nullable Text = null
+
+       # Link title
+       var comment: nullable Text = null
+
+       # Is the link construct an abbreviation?
+       var is_abbrev = false
+
+       redef fun emit(v) do
+               var tmp = new FlatBuffer
+               var b = check_link(v, tmp, pos, self)
+               if b > 0 then
+                       emit_hyper(v)
+                       v.current_pos = b
+               else
+                       v.addc char
+               end
+       end
+
+       # Emit the hyperlink as link or image.
+       private fun emit_hyper(v: MarkdownEmitter) is abstract
+
+       # Check if the link is a valid link.
+       private fun check_link(v: MarkdownEmitter, out: FlatBuffer, start: Int, token: Token): Int do
+               var md = v.current_text
+               var pos
+               if token isa TokenLink then
+                       pos = start + 1
+               else
+                       pos = start + 2
+               end
+               var tmp = new FlatBuffer
+               pos = md.read_md_link_id(tmp, pos)
+               if pos < start then return -1
+               name = tmp
+               var old_pos = pos
+               pos += 1
+               pos = md.skip_spaces(pos)
+               if pos < start then
+                       var tid = name.write_to_string.to_lower
+                       if v.processor.link_refs.has_key(tid) then
+                               var lr = v.processor.link_refs[tid]
+                               is_abbrev = lr.is_abbrev
+                               link = lr.link
+                               comment = lr.title
+                               pos = old_pos
+                       else
+                               return -1
+                       end
+               else if md[pos] == '(' then
+                       pos += 1
+                       pos = md.skip_spaces(pos)
+                       if pos < start then return -1
+                       tmp = new FlatBuffer
+                       var use_lt = md[pos] == '<'
+                       if use_lt then
+                               pos = md.read_until(tmp, pos + 1, '>')
+                       else
+                               pos = md.read_md_link(tmp, pos)
+                       end
+                       if pos < start then return -1
+                       if use_lt then pos += 1
+                       link = tmp.write_to_string
+                       if md[pos] == ' ' then
+                               pos = md.skip_spaces(pos)
+                               if pos > start and md[pos] == '"' then
+                                       pos += 1
+                                       tmp = new FlatBuffer
+                                       pos = md.read_until(tmp, pos, '"')
+                                       if pos < start then return -1
+                                       comment = tmp.write_to_string
+                                       pos += 1
+                                       pos = md.skip_spaces(pos)
+                                       if pos == -1 then return -1
+                               end
+                       end
+                       if md[pos] != ')' then return -1
+               else if md[pos] == '[' then
+                       pos += 1
+                       tmp = new FlatBuffer
+                       pos = md.read_raw_until(tmp, pos, ']')
+                       if pos < start then return -1
+                       var id
+                       if tmp.length > 0 then
+                               id = tmp
+                       else
+                               id = name
+                       end
+                       var tid = id.write_to_string.to_lower
+                       if v.processor.link_refs.has_key(tid) then
+                               var lr = v.processor.link_refs[tid]
+                               link = lr.link
+                               comment = lr.title
+                       end
+               else
+               var tid = name.write_to_string.replace("\n", " ").to_lower
+                       if v.processor.link_refs.has_key(tid) then
+                               var lr = v.processor.link_refs[tid]
+                               link = lr.link
+                               comment = lr.title
+                               pos = old_pos
+                       else
+                               return -1
+                       end
+               end
+               if link == null then return -1
+               return pos
+       end
+end
+
+# A markdown link token.
+class TokenLink
+       super TokenLinkOrImage
+
+       redef fun emit_hyper(v) do
+               if is_abbrev and comment != null then
+                       v.decorator.add_abbr(v, name.as(not null), comment.as(not null))
+               else
+                       v.decorator.add_link(v, link.as(not null), name.as(not null), comment)
+               end
+       end
+end
+
+# A markdown image token.
+class TokenImage
+       super TokenLinkOrImage
+
+       redef fun emit_hyper(v) do
+               v.decorator.add_image(v, link.as(not null), name.as(not null), comment)
+       end
+end
+
+# A HTML/XML token.
+class TokenHTML
+       super Token
+
+       redef fun emit(v) do
+               var tmp = new FlatBuffer
+               var b = check_html(v, tmp, v.current_text.as(not null), v.current_pos)
+               if b > 0 then
+                       v.add tmp
+                       v.current_pos = b
+               else
+                       v.decorator.escape_char(v, char)
+               end
+       end
+
+       # Is the HTML valid?
+       # Also take care of link and mailto shortcuts.
+       private fun check_html(v: MarkdownEmitter, out: FlatBuffer, md: Text, start: Int): Int do
+               # check for auto links
+               var tmp = new FlatBuffer
+               var pos = md.read_until(tmp, start + 1, ':', ' ', '>', '\n')
+               if pos != -1 and md[pos] == ':' and tmp.is_link_prefix then
+                       pos = md.read_until(tmp, pos, '>')
+                       if pos != -1 then
+                               var link = tmp.write_to_string
+                               v.decorator.add_link(v, link, link, null)
+                               return pos
+                       end
+               end
+               # TODO check for mailto
+               # check for inline html
+               if start + 2 < md.length then
+                       return md.read_xml(out, start, true)
+               end
+               return -1
+       end
+end
+
+# An HTML entity token.
+class TokenEntity
+       super Token
+
+       redef fun emit(v) do
+               var tmp = new FlatBuffer
+               var b = check_entity(tmp, v.current_text.as(not null), pos)
+               if b > 0 then
+                       v.add tmp
+                       v.current_pos = b
+               else
+                       v.decorator.escape_char(v, char)
+               end
+       end
+
+       # Is the entity valid?
+       private fun check_entity(out: FlatBuffer, md: Text, start: Int): Int do
+               var pos = md.read_until(out, start, ';')
+               if pos < 0 or out.length < 3 then
+                       return -1
+               end
+               if out[1] == '#' then
+                       if out[2] == 'x' or out[2] == 'X' then
+                               if out.length < 4 then return -1
+                               for i in [3..out.length[ do
+                                       var c = out[i]
+                                       if (c < '0' or c > '9') and (c < 'a' and c > 'f') and (c < 'A' and c > 'F') then
+                                               return -1
+                                       end
+                               end
+                       else
+                               for i in [2..out.length[ do
+                                       var c = out[i]
+                                       if c < '0' or c > '9' then return -1
+                               end
+                       end
+                       out.add ';'
+               else
+                       for i in [1..out.length[ do
+                               var c = out[i]
+                               if not c.is_digit and not c.is_letter then return -1
+                       end
+                       out.add ';'
+                       # TODO check entity is valid
+                       # if out.is_entity then
+                               return pos
+                       # else
+                               # return -1
+                       # end
+               end
+               return pos
+       end
+end
+
+# A markdown escape token.
+class TokenEscape
+       super Token
+
+       redef fun emit(v) do
+               v.current_pos += 1
+               v.addc v.current_text[v.current_pos]
+       end
+end
+
+# A markdown super token.
+class TokenSuper
+       super Token
+
+       redef fun emit(v) do
+               var tmp = v.push_buffer
+               var b = v.emit_text_until(v.current_text.as(not null), pos + 1, self)
+               v.pop_buffer
+               if b > 0 then
+                       v.decorator.add_super(v, tmp)
+                       v.current_pos = b
+               else
+                       v.addc char
+               end
+       end
+end
+
+redef class Text
+
+       # Get the token kind at `pos`.
+       private fun token_at(pos: Int): Token do
+               var c0: Char
+               var c1: Char
+               var c2: Char
+               var c3: Char
+
+               if pos > 0 then
+                       c0 = self[pos - 1]
+               else
+                       c0 = ' '
+               end
+               var c = self[pos]
+
+               if pos + 1 < length then
+                       c1 = self[pos + 1]
+               else
+                       c1 = ' '
+               end
+               if pos + 2 < length then
+                       c2 = self[pos + 2]
+               else
+                       c2 = ' '
+               end
+               if pos + 3 < length then
+                       c3 = self[pos + 3]
+               else
+                       c3 = ' '
+               end
+
+               if c == '*' then
+                       if c1 == '*' then
+                               if c0 != ' ' or c2 != ' ' then
+                                       return new TokenStrongStar(pos, c)
+                               else
+                                       return new TokenEmStar(pos, c)
+                               end
+                       end
+                       if c0 != ' ' or c1 != ' ' then
+                               return new TokenEmStar(pos, c)
+                       else
+                               return new TokenNone(pos, c)
+                       end
+               else if c == '_' then
+                       if c1 == '_' then
+                               if c0 != ' ' or c2 != ' 'then
+                                       return new TokenStrongUnderscore(pos, c)
+                               else
+                                       return new TokenEmUnderscore(pos, c)
+                               end
+                       end
+                       if c0 != ' ' or c1 != ' ' then
+                               return new TokenEmUnderscore(pos, c)
+                       else
+                               return new TokenNone(pos, c)
+                       end
+               else if c == '!' then
+                       if c1 == '[' then return new TokenImage(pos, c)
+                       return new TokenNone(pos, c)
+               else if c == '[' then
+                       return new TokenLink(pos, c)
+               else if c == ']' then
+                       return new TokenNone(pos, c)
+               else if c == '`' then
+                       if c1 == '`' then
+                               return new TokenCodeDouble(pos, c)
+                       else
+                               return new TokenCodeSingle(pos, c)
+                       end
+               else if c == '\\' then
+                       if c1 == '\\' or c1 == '[' or c1 == ']' or c1 == '(' or c1 == ')' or c1 == '{' or c1 == '}' or c1 == '#' or c1 == '"' or c1 == '\'' or c1 == '.' or c1 == '<' or c1 == '>' or c1 == '*' or c1 == '+' or c1 == '-' or c1 == '_' or c1 == '!' or c1 == '`' or c1 == '~' or c1 == '^' then
+                               return new TokenEscape(pos, c)
+                       else
+                               return new TokenNone(pos, c)
+                       end
+               else if c == '<' then
+                       return new TokenHTML(pos, c)
+               else if c == '&' then
+                       return new TokenEntity(pos, c)
+               else if c == '^' then
+                       if c0 == '^' or c1 == '^' then
+                               return new TokenNone(pos, c)
+                       else
+                               return new TokenSuper(pos, c)
+                       end
+               else
+                       return new TokenNone(pos, c)
+               end
+       end
+
+       # Find the position of a `token` in `self`.
+       private fun find_token(start: Int, token: Token): Int do
+               var pos = start
+               while pos < length do
+                       if token_at(pos).is_same_type(token) then
+                               return pos
+                       end
+                       pos += 1
+               end
+               return -1
+       end
+
+       # Get the position of the next non-space character.
+       private fun skip_spaces(start: Int): Int do
+               var pos = start
+               while pos > -1 and pos < length and (self[pos] == ' ' or self[pos] == '\n') do
+                       pos += 1
+               end
+               if pos < length then return pos
+               return -1
+       end
+
+       # Read `self` until `nend` and append it to the `out` buffer.
+       # Escape markdown special chars.
+       private fun read_until(out: FlatBuffer, start: Int, nend: Char...): Int do
+               var pos = start
+               while pos < length do
+                       var c = self[pos]
+                       if c == '\\' and pos + 1 < length then
+                               pos = escape(out, self[pos + 1], pos)
+                       else
+                               var end_reached = false
+                               for n in nend do
+                                       if c == n then
+                                               end_reached = true
+                                               break
+                                       end
+                               end
+                               if end_reached then break
+                               out.add c
+                       end
+                       pos += 1
+               end
+               if pos == length then return -1
+               return pos
+       end
+
+       # Read `self` as raw text until `nend` and append it to the `out` buffer.
+       # No escape is made.
+       private fun read_raw_until(out: FlatBuffer, start: Int, nend: Char...): Int do
+               var pos = start
+               while pos < length do
+                       var c = self[pos]
+                       var end_reached = false
+                       for n in nend do
+                               if c == n then
+                                       end_reached = true
+                                       break
+                               end
+                       end
+                       if end_reached then break
+                       out.add c
+                       pos += 1
+               end
+               if pos == length then return -1
+               return pos
+       end
+
+       # Read `self` as XML until `to` and append it to the `out` buffer.
+       # Escape HTML special chars.
+       private fun read_xml_until(out: FlatBuffer, from: Int, to: Char...): Int do
+               var pos = from
+               var in_str = false
+               var str_char: nullable Char = null
+               while pos < length do
+                       var c = self[pos]
+                       if in_str then
+                               if c == '\\' then
+                                       out.add c
+                                       pos += 1
+                                       if pos < length then
+                                               out.add c
+                                               pos += 1
+                                       end
+                                       continue
+                               end
+                               if c == str_char then
+                                       in_str = false
+                                       out.add c
+                                       pos += 1
+                                       continue
+                               end
+                       end
+                       if c == '"' or c == '\'' then
+                               in_str = true
+                               str_char = c
+                       end
+                       if not in_str then
+                               var end_reached = false
+                               for n in [0..to.length[ do
+                                       if c == to[n] then
+                                               end_reached = true
+                                               break
+                                       end
+                               end
+                               if end_reached then break
+                       end
+                       out.add c
+                       pos += 1
+               end
+               if pos == length then return -1
+               return pos
+       end
+
+       # Read `self` as XML and append it to the `out` buffer.
+       # Safe mode can be activated to limit reading to valid xml.
+       private fun read_xml(out: FlatBuffer, start: Int, safe_mode: Bool): Int do
+               var pos = 0
+               var is_close_tag = false
+               if start + 1 >= length then return -1
+               if self[start + 1] == '/' then
+                       is_close_tag = true
+                       pos = start + 2
+               else if self[start + 1] == '!' then
+                       out.append "<!"
+                       return start + 1
+               else
+                       is_close_tag = false
+                       pos = start + 1
+               end
+               if safe_mode then
+                       var tmp = new FlatBuffer
+                       pos = read_xml_until(tmp, pos, ' ', '/', '>')
+                       if pos == -1 then return -1
+                       var tag = tmp.write_to_string.trim.to_lower
+                       if tag.is_html_unsafe then
+                               out.append "&lt;"
+                               if is_close_tag then out.add '/'
+                               out.append tmp
+                       else
+                               out.append "<"
+                               if is_close_tag then out.add '/'
+                               out.append tmp
+                       end
+               else
+                       out.add '<'
+                       if is_close_tag then out.add '/'
+                       pos = read_xml_until(out, pos, ' ', '/', '>')
+               end
+               if pos == -1 then return -1
+               pos = read_xml_until(out, pos, '/', '>')
+               if pos == -1 then return -1
+               if self[pos] == '/' then
+                       out.append " /"
+                       pos = self.read_xml_until(out, pos + 1, '>')
+                       if pos == -1 then return -1
+               end
+               if self[pos] == '>' then
+                       out.add '>'
+                       return pos
+               end
+               return -1
+       end
+
+       # Read a markdown link address and append it to the `out` buffer.
+       private fun read_md_link(out: FlatBuffer, start: Int): Int do
+               var pos = start
+               var counter = 1
+               while pos < length do
+                       var c = self[pos]
+                       if c == '\\' and pos + 1 < length then
+                               pos = escape(out, self[pos + 1], pos)
+                       else
+                               var end_reached = false
+                               if c == '(' then
+                                       counter += 1
+                               else if c == ' ' then
+                                       if counter == 1 then end_reached = true
+                               else if c == ')' then
+                                       counter -= 1
+                                       if counter == 0 then end_reached = true
+                               end
+                               if end_reached then break
+                               out.add c
+                       end
+                       pos += 1
+               end
+               if pos == length then return -1
+               return pos
+       end
+
+       # Read a markdown link text and append it to the `out` buffer.
+       private fun read_md_link_id(out: FlatBuffer, start: Int): Int do
+               var pos = start
+               var counter = 1
+               while pos < length do
+                       var c = self[pos]
+                       var end_reached = false
+                       if c == '[' then
+                               counter += 1
+                               out.add c
+                       else if c == ']' then
+                               counter -= 1
+                               if counter == 0 then
+                                       end_reached = true
+                               else
+                                       out.add c
+                               end
+                       else
+                               out.add c
+                       end
+                       if end_reached then break
+                       pos += 1
+               end
+               if pos == length then return -1
+               return pos
+       end
+
+       # Extract the XML tag name from a XML tag.
+       private fun xml_tag: String do
+               var tpl = new FlatBuffer
+               var pos = 1
+               if pos < length and self[1] == '/' then pos += 1
+               while pos < length - 1 and (self[pos].is_digit or self[pos].is_letter) do
+                       tpl.add self[pos]
+                       pos += 1
+               end
+               return tpl.write_to_string.to_lower
+       end
+
+       # Read and escape the markdown contained in `self`.
+       private fun escape(out: FlatBuffer, c: Char, pos: Int): Int do
+               if c == '\\' or c == '[' or c == ']' or c == '(' or c == ')' or c == '{' or
+                  c == '}' or c == '#' or c == '"' or c == '\'' or c == '.' or c == '<' or
+                  c == '>' or c == '*' or c == '+' or c == '-' or c == '_' or c == '!' or
+                  c == '`' or c == '~' or c == '^' then
+                       out.add c
+                       return pos + 1
+               end
+               out.add '\\'
+               return pos
+       end
+
+       # Is `self` an unsafe HTML element?
+       private fun is_html_unsafe: Bool do return html_unsafe_tags.has(self.write_to_string)
+
+       # Is `self` a HRML block element?
+       private fun is_html_block: Bool do return html_block_tags.has(self.write_to_string)
+
+       # Is `self` a link prefix?
+       private fun is_link_prefix: Bool do return html_link_prefixes.has(self.write_to_string)
+
+       private fun html_unsafe_tags: Array[String] do return once ["applet", "head", "body", "frame", "frameset", "iframe", "script", "object"]
+
+       private fun html_block_tags: Array[String] do return once ["address", "article", "aside", "audio", "blockquote", "canvas", "dd", "div", "dl", "fieldset", "figcaption", "figure", "footer", "form", "h1", "h2", "h3", "h4", "h5", "h6", "header", "hgroup", "hr", "noscript", "ol", "output", "p", "pre", "section", "table", "tfoot", "ul", "video"]
+
+       private fun html_link_prefixes: Array[String] do return once ["http", "https", "ftp", "ftps"]
+end
+
+redef class String
+
+       # Parse `self` as markdown and return the HTML representation
+       #.
+       #    var md = "**Hello World!**"
+       #    var html = md.md_to_html
+       #    assert html == "<p><strong>Hello World!</strong></p>\n"
+       fun md_to_html: Streamable do
+               var processor = new MarkdownProcessor
+               return processor.process(self)
+       end
+end
diff --git a/lib/markdown/nitmd.nit b/lib/markdown/nitmd.nit
new file mode 100644 (file)
index 0000000..781a484
--- /dev/null
@@ -0,0 +1,36 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# A Markdown parser for Nit.
+module nitmd
+
+import markdown
+
+if args.length != 1 then
+       print "usage: nitmd <file.md>"
+       exit 0
+end
+
+var file = args.first
+if not file.file_exists then
+       print "'{file}' not found"
+       exit 0
+end
+
+var ifs = new IFStream.open(file)
+var md = ifs.read_all
+ifs.close
+
+var processor = new MarkdownProcessor
+print processor.process(md)
diff --git a/lib/markdown/test_markdown.nit b/lib/markdown/test_markdown.nit
new file mode 100644 (file)
index 0000000..f3c1252
--- /dev/null
@@ -0,0 +1,2510 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Test suites for module `markdown`
+module test_markdown is test_suite
+
+import test_suite
+intrude import markdown
+
+class TestMarkdownProcessor
+       super TestSuite
+
+       fun test_process_empty do
+               var test = ""
+               var exp = ""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_tabs do
+               var test = """
+       some code
+"""
+               var exp = """<pre><code>some code
+</code></pre>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+
+       fun test_process_par1 do
+               var test = "test"
+               var exp = "<p>test</p>\n"
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_par2 do
+               var test = """
+line1
+line2
+
+line3 line4
+
+line5"""
+               var exp = """
+<p>line1
+line2</p>
+<p>line3 line4</p>
+<p>line5</p>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_par3 do
+               var test = """
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
+Aliquam hendrerit mi posuere lectus.
+Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.
+
+Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
+id sem consectetuer libero luctus adipiscing.
+"""
+               var exp = """
+<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
+Aliquam hendrerit mi posuere lectus.
+Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.</p>
+<p>Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
+id sem consectetuer libero luctus adipiscing.</p>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_headings_1 do
+               var test = """
+This is a H1
+=============
+
+This is a H2
+-------------
+"""
+               var exp = """
+<h1 id="This_is_a_H1">This is a H1</h1>
+<h2 id="This_is_a_H2">This is a H2</h2>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_headings_2 do
+               var test = """
+# This is a H1
+
+## This is a H2
+###### This is a H6
+"""
+               var exp = """
+<h1 id="This_is_a_H1">This is a H1</h1>
+<h2 id="This_is_a_H2">This is a H2</h2>
+<h6 id="This_is_a_H6">This is a H6</h6>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_headings_3 do
+               var test = """
+# This is a H1 #
+
+## This is a H2 ##
+
+### This is a H3 ######
+"""
+               var exp = """
+<h1 id="This_is_a_H1">This is a H1</h1>
+<h2 id="This_is_a_H2">This is a H2</h2>
+<h3 id="This_is_a_H3">This is a H3</h3>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_hr do
+               var test = """
+* * *
+
+***
+
+*****
+
+- - -
+
+---------------------------------------
+"""
+               var exp = "<hr/>\n<hr/>\n<hr/>\n<hr/>\n<hr/>\n"
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_bquote1 do
+               var test = """
+> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
+> consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
+> Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.
+>
+> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
+> id sem consectetuer libero luctus adipiscing.
+"""
+               var exp = """<blockquote>
+<p>This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
+consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
+Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.</p>
+<p>Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
+id sem consectetuer libero luctus adipiscing.</p>
+</blockquote>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_bquote2 do
+               var test = """
+> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
+consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
+Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.
+
+> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
+id sem consectetuer libero luctus adipiscing.
+"""
+               var exp = """<blockquote>
+<p>This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
+consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
+Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.</p>
+<p>Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
+id sem consectetuer libero luctus adipiscing.</p>
+</blockquote>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_bquote3 do
+               var test = """
+> This is the first level of quoting.
+>
+> > This is nested blockquote.
+>
+> Back to the first level.
+"""
+               var exp = """<blockquote>
+<p>This is the first level of quoting.</p>
+<blockquote>
+<p>This is nested blockquote.</p>
+</blockquote>
+<p>Back to the first level.</p>
+</blockquote>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_list1 do
+               var test = """
+*   Red
+*   Green
+*   Blue
+"""
+               var exp = """<ul>
+<li>Red</li>
+<li>Green</li>
+<li>Blue</li>
+</ul>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_list2 do
+               var test = """
++   Red
++   Green
++   Blue
+"""
+               var exp = """<ul>
+<li>Red</li>
+<li>Green</li>
+<li>Blue</li>
+</ul>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_list3 do
+               var test = """
+-   Red
+-   Green
+-   Blue
+"""
+               var exp = """<ul>
+<li>Red</li>
+<li>Green</li>
+<li>Blue</li>
+</ul>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_list4 do
+               var test = """
+1.  Bird
+2.  McHale
+3.  Parish
+"""
+               var exp = """<ol>
+<li>Bird</li>
+<li>McHale</li>
+<li>Parish</li>
+</ol>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_list5 do
+               var test = """
+3. Bird
+1. McHale
+8. Parish
+"""
+               var exp = """<ol>
+<li>Bird</li>
+<li>McHale</li>
+<li>Parish</li>
+</ol>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_list6 do
+               var test = """
+*   Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
+    Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi,
+    viverra nec, fringilla in, laoreet vitae, risus.
+*   Donec sit amet nisl. Aliquam semper ipsum sit amet velit.
+    Suspendisse id sem consectetuer libero luctus adipiscing.
+"""
+               var exp = """
+<ul>
+<li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
+Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi,
+viverra nec, fringilla in, laoreet vitae, risus.</li>
+<li>Donec sit amet nisl. Aliquam semper ipsum sit amet velit.
+Suspendisse id sem consectetuer libero luctus adipiscing.</li>
+</ul>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_list7 do
+               var test = """
+*   Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
+Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi,
+viverra nec, fringilla in, laoreet vitae, risus.
+*   Donec sit amet nisl. Aliquam semper ipsum sit amet velit.
+Suspendisse id sem consectetuer libero luctus adipiscing.
+"""
+               var exp = """
+<ul>
+<li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
+Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi,
+viverra nec, fringilla in, laoreet vitae, risus.</li>
+<li>Donec sit amet nisl. Aliquam semper ipsum sit amet velit.
+Suspendisse id sem consectetuer libero luctus adipiscing.</li>
+</ul>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_list8 do
+               var test = """
+*   Bird
+
+*   Magic
+"""
+               var exp = """
+<ul>
+<li><p>Bird</p>
+</li>
+<li><p>Magic</p>
+</li>
+</ul>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_list9 do
+               var test = """
+1.  This is a list item with two paragraphs. Lorem ipsum dolor
+    sit amet, consectetuer adipiscing elit. Aliquam hendrerit
+    mi posuere lectus.
+
+    Vestibulum enim wisi, viverra nec, fringilla in, laoreet
+    vitae, risus. Donec sit amet nisl. Aliquam semper ipsum
+    sit amet velit.
+
+2.  Suspendisse id sem consectetuer libero luctus adipiscing.
+"""
+               var exp = """
+<ol>
+<li><p>This is a list item with two paragraphs. Lorem ipsum dolor
+sit amet, consectetuer adipiscing elit. Aliquam hendrerit
+mi posuere lectus.</p>
+<p>Vestibulum enim wisi, viverra nec, fringilla in, laoreet
+vitae, risus. Donec sit amet nisl. Aliquam semper ipsum
+sit amet velit.</p>
+</li>
+<li><p>Suspendisse id sem consectetuer libero luctus adipiscing.</p>
+</li>
+</ol>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_list10 do
+               var test = """
+*   This is a list item with two paragraphs.
+
+    This is the second paragraph in the list item. You're
+only required to indent the first line. Lorem ipsum dolor
+sit amet, consectetuer adipiscing elit.
+
+*   Another item in the same list.
+"""
+               var exp = """
+<ul>
+<li><p>This is a list item with two paragraphs.</p>
+<p>This is the second paragraph in the list item. You're
+only required to indent the first line. Lorem ipsum dolor
+sit amet, consectetuer adipiscing elit.</p>
+</li>
+<li><p>Another item in the same list.</p>
+</li>
+</ul>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_code1 do
+               var test = """
+This is a normal paragraph:
+
+    This is a code block.
+"""
+               var exp = """<p>This is a normal paragraph:</p>
+<pre><code>This is a code block.
+</code></pre>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_code2 do
+               var test = """
+Here is an example of AppleScript:
+
+    tell application "Foo"
+        beep
+    end tell
+
+    <div class="footer">
+        &copy; 2004 Foo Corporation
+    </div>
+"""
+               var exp = """
+<p>Here is an example of AppleScript:</p>
+<pre><code>tell application "Foo"
+    beep
+end tell
+
+&lt;div class="footer"&gt;
+    &amp;copy; 2004 Foo Corporation
+&lt;/div&gt;
+</code></pre>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_nesting1 do
+               var test = """
+> ## This is a header.
+>
+> 1.   This is the first list item.
+> 2.   This is the second list item.
+>
+> Here's some example code:
+>
+>     return shell_exec("echo $input | $markdown_script");
+"""
+               var exp = """
+<blockquote>
+<h2 id="This_is_a_header.">This is a header.</h2>
+<ol>
+<li>This is the first list item.</li>
+<li>This is the second list item.</li>
+</ol>
+<p>Here's some example code:</p>
+<pre><code>return shell_exec("echo $input | $markdown_script");
+</code></pre>
+</blockquote>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_nesting2 do
+               var test = """
+*   A list item with a blockquote:
+
+    > This is a blockquote
+    > inside a list item.
+"""
+               var exp = """
+<ul>
+<li><p>A list item with a blockquote:</p>
+<blockquote>
+<p>This is a blockquote
+inside a list item.</p>
+</blockquote>
+</li>
+</ul>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_nesting3 do
+               var test = """
+*   A list item with a code block:
+
+        <code goes here>
+"""
+               var exp = """
+<ul>
+<li><p>A list item with a code block:</p>
+<pre><code>&lt;code goes here&gt;
+</code></pre>
+</li>
+</ul>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_nesting4 do
+               var test = """
+*      Tab
+       *       Tab
+               *       Tab
+"""
+               var exp = """
+<ul>
+<li>Tab<ul>
+<li>Tab<ul>
+<li>Tab</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       # TODO
+       #       fun test_process_nesting5 do
+       #               var test = """
+       # *     this
+       #
+       #       *       sub
+       #
+       #               that
+       # """
+       #               var exp = """
+       # <ul>
+       # <li><p>this</p>
+       # <ul>
+       # <li>sub</li>
+       # </ul>
+       # <p>that</p>
+       # </li>
+       # </ul>
+       # """
+       #               var res = test.md_to_html.write_to_string
+       #               assert res == exp
+       #       end
+
+       fun test_process_emph1 do
+               var test = """
+*single asterisks*
+
+_single underscores_
+
+**double asterisks**
+
+__double underscores__
+"""
+               var exp = """<p><em>single asterisks</em></p>
+<p><em>single underscores</em></p>
+<p><strong>double asterisks</strong></p>
+<p><strong>double underscores</strong></p>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_emph2 do
+               var test = "un*frigging*believable"
+               var exp = "<p>un<em>frigging</em>believable</p>\n"
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_xml1 do
+               var test = """
+This is a regular paragraph.
+
+<table>
+    <tr>
+        <td>Foo</td>
+    </tr>
+</table>
+
+This is another regular paragraph.
+"""
+               var exp = """
+<p>This is a regular paragraph.</p>
+<table>
+    <tr>
+        <td>Foo</td>
+    </tr>
+</table>
+<p>This is another regular paragraph.</p>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_xml2 do
+               var test = """
+This is an image <img src="foo/bar" alt="baz"/> in a regular paragraph.
+"""
+               var exp = """<p>This is an image <img src="foo/bar" alt="baz" /> in a regular paragraph.</p>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_xml3 do
+               var test = """
+<div style=">"/>
+"""
+               var exp = """
+<div style=">"/>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_span_code1 do
+               var test = "Use the `printf()` function."
+               var exp = "<p>Use the <code>printf()</code> function.</p>\n"
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_span_code2 do
+               var test = "``There is a literal backtick (`) here.``"
+               var exp = "<p><code>There is a literal backtick (`) here.</code></p>\n"
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_span_code3 do
+               var test = """
+A single backtick in a code span: `` ` ``
+
+A backtick-delimited string in a code span: `` `foo` ``
+"""
+               var exp = """
+<p>A single backtick in a code span: <code>`</code></p>
+<p>A backtick-delimited string in a code span: <code>`foo`</code></p>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_span_code4 do
+               var test = "Please don't use any `<blink>` tags."
+               var exp = "<p>Please don't use any <code>&lt;blink&gt;</code> tags.</p>\n"
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_span_code5 do
+               var test = "`&#8212;` is the decimal-encoded equivalent of `&mdash;`."
+               var exp = "<p><code>&amp;#8212;</code> is the decimal-encoded equivalent of <code>&amp;mdash;</code>.</p>\n"
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_escape1 do
+               var test = "\\*this text is surrounded by literal asterisks\\*"
+               var exp = "<p>*this text is surrounded by literal asterisks*</p>\n"
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_escape2 do
+               var test = "1986\\. What a great season."
+               var exp = "<p>1986. What a great season.</p>\n"
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_escape3 do
+               var test = "Ben & Lux"
+               var exp = "<p>Ben &amp; Lux</p>\n"
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_link1 do
+               var test = """
+This is [an example](http://example.com/ "Title") inline link.
+
+[This link](http://example.net/) has no title attribute.
+"""
+               var exp = """<p>This is <a href="http://example.com/" title="Title">an example</a> inline link.</p>
+<p><a href="http://example.net/">This link</a> has no title attribute.</p>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_link2 do
+               var test = "See my [About](/about/) page for details."
+               var exp = "<p>See my <a href=\"/about/\">About</a> page for details.</p>\n"
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_link3 do
+               var test = """
+This is [an example][id] reference-style link.
+
+This is [an example] [id] reference-style link.
+
+Some lorem ipsum
+
+[id]: http://example.com/  "Optional Title Here"
+
+Some other lipsum
+"""
+               var exp = """
+<p>This is <a href="http://example.com/" title="Optional Title Here">an example</a> reference-style link.</p>
+<p>This is <a href="http://example.com/" title="Optional Title Here">an example</a> reference-style link.</p>
+<p>Some lorem ipsum</p>
+<p>Some other lipsum</p>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_link4 do
+               var test = """
+This is multiple examples: [foo][1], [bar][2], [baz][3].
+
+[1]: http://example.com/  "Optional Title Here"
+[2]: http://example.com/  'Optional Title Here'
+[3]: http://example.com/  (Optional Title Here)
+"""
+               var exp = """
+<p>This is multiple examples: <a href="http://example.com/" title="Optional Title Here">foo</a>, <a href="http://example.com/" title="Optional Title Here">bar</a>, <a href="http://example.com/" title="Optional Title Here">baz</a>.</p>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_link5 do
+               var test = """
+This is multiple examples: [foo][a], [bar][A], [a].
+
+[a]: http://example.com/  "Optional Title Here"
+"""
+               var exp = """<p>This is multiple examples: <a href="http://example.com/" title="Optional Title Here">foo</a>, <a href="http://example.com/" title="Optional Title Here">bar</a>, <a href="http://example.com/" title="Optional Title Here">a</a>.</p>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_link6 do
+               var test = """
+I get 10 times more traffic from [Google][] than from [Yahoo][] or [MSN][].
+
+[Google]: http://google.com/        "Google"
+[Yahoo]: http://search.yahoo.com/   "Yahoo Search"
+[MSN]: http://search.msn.com/       "MSN Search"
+"""
+               var exp = """<p>I get 10 times more traffic from <a href="http://google.com/" title="Google">Google</a> than from <a href="http://search.yahoo.com/" title="Yahoo Search">Yahoo</a> or <a href="http://search.msn.com/" title="MSN Search">MSN</a>.</p>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_link7 do
+               var test = """
+Visit [Daring Fireball][] for more information.
+
+[Daring Fireball]: http://daringfireball.net/
+"""
+               var exp = """<p>Visit <a href="http://daringfireball.net/">Daring Fireball</a> for more information.</p>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_link8 do
+               var test = """
+This one has a [line
+break].
+
+This one has a [line
+break] with a line-ending space.
+
+[line break]: /foo
+"""
+               var exp = """
+<p>This one has a <a href="/foo">line
+break</a>.</p>
+<p>This one has a <a href="/foo">line
+break</a> with a line-ending space.</p>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       # FIXME unignore test once escape strings fixed
+       #       fun test_process_link9 do
+       #               var test = """
+       # Foo [bar][].
+       #
+       # Foo [bar](/url/ "Title with \"quotes\" inside").
+       #
+       #
+       #   [bar]: /url/ "Title with \"quotes\" inside"
+       # """
+       #               var exp = """
+       # <p>Foo <a href="/url/" title="Title with &quot;quotes&quot; inside">bar</a>.</p>
+       # <p>Foo <a href="/url/" title="Title with &quot;quotes&quot; inside">bar</a>.</p>
+       # """
+       #               var res = test.md_to_html.write_to_string
+       #               assert res == exp
+       #       end
+
+       fun test_process_img1 do
+               var test = """
+![Alt text](/path/to/img.jpg)
+
+![Alt text](/path/to/img.jpg "Optional title")
+"""
+               var exp = """<p><img src="/path/to/img.jpg" alt="Alt text"/></p>
+<p><img src="/path/to/img.jpg" alt="Alt text" title="Optional title"/></p>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_process_img2 do
+               var test = """
+![Alt text][id]
+
+[id]: url/to/image  "Optional title attribute"
+"""
+               var exp = """<p><img src="url/to/image" alt="Alt text" title="Optional title attribute"/></p>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_daring_encoding do
+               var test = """
+AT&T has an ampersand in their name.
+
+AT&amp;T is another way to write it.
+
+This & that.
+
+4 < 5.
+
+6 > 5.
+
+Here's a [link] [1] with an ampersand in the URL.
+
+Here's a link with an amersand in the link text: [AT&T] [2].
+
+Here's an inline [link](/script?foo=1&bar=2).
+
+Here's an inline [link](</script?foo=1&bar=2>).
+
+
+[1]: http://example.com/?foo=1&bar=2
+[2]: http://att.com/  "AT&T"
+"""
+
+               var exp = """
+<p>AT&amp;T has an ampersand in their name.</p>
+<p>AT&amp;T is another way to write it.</p>
+<p>This &amp; that.</p>
+<p>4 &lt; 5.</p>
+<p>6 > 5.</p>
+<p>Here's a <a href="http://example.com/?foo=1&amp;bar=2">link</a> with an ampersand in the URL.</p>
+<p>Here's a link with an amersand in the link text: <a href="http://att.com/" title="AT&amp;T">AT&amp;T</a>.</p>
+<p>Here's an inline <a href="/script?foo=1&amp;bar=2">link</a>.</p>
+<p>Here's an inline <a href="/script?foo=1&amp;bar=2">link</a>.</p>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+
+       end
+
+       fun test_daring_autolinks do
+               var test = """
+Link: <http://example.com/>.
+
+With an ampersand: <http://example.com/?foo=1&bar=2>
+
+* In a list?
+* <http://example.com/>
+* It should.
+
+> Blockquoted: <http://example.com/>
+
+Auto-links should not occur here: `<http://example.com/>`
+
+       or here: <http://example.com/>
+"""
+
+               var exp = """
+<p>Link: <a href="http://example.com/">http://example.com/</a>.</p>
+<p>With an ampersand: <a href="http://example.com/?foo=1&amp;bar=2">http://example.com/?foo=1&amp;bar=2</a></p>
+<ul>
+<li>In a list?</li>
+<li><a href="http://example.com/">http://example.com/</a></li>
+<li>It should.</li>
+</ul>
+<blockquote>
+<p>Blockquoted: <a href="http://example.com/">http://example.com/</a></p>
+</blockquote>
+<p>Auto-links should not occur here: <code>&lt;http://example.com/&gt;</code></p>
+<pre><code>or here: &lt;http://example.com/&gt;
+</code></pre>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_daring_escape do
+               var test = """
+These should all get escaped:
+
+Backslash: \\
+
+Backtick: \`
+
+Asterisk: \*
+
+Underscore: \_
+
+Left brace: \{
+
+Right brace: \}
+
+Left bracket: \[
+
+Right bracket: \]
+
+Left paren: \(
+
+Right paren: \)
+
+Greater-than: \>
+
+Hash: \#
+
+Period: \.
+
+Bang: \!
+
+Plus: \+
+
+Minus: \-
+
+
+These should not, because they occur within a code block:
+
+       Backslash: \\
+
+       Backtick: \`
+
+       Asterisk: \*
+
+       Underscore: \_
+
+       Left brace: \{
+
+       Right brace: \}
+
+       Left bracket: \[
+
+       Right bracket: \]
+
+       Left paren: \(
+
+       Right paren: \)
+
+       Greater-than: \>
+
+       Hash: \#
+
+       Period: \.
+
+       Bang: \!
+
+       Plus: \+
+
+       Minus: \-
+
+Nor should these, which occur in code spans:
+
+Backslash: `\\`
+
+Backtick: `` \` ``
+
+Asterisk: `\*`
+
+Underscore: `\_`
+
+Left brace: `\{`
+
+Right brace: `\}`
+
+Left bracket: `\[`
+
+Right bracket: `\]`
+
+Left paren: `\(`
+
+Right paren: `\)`
+
+Greater-than: `\>`
+
+Hash: `\#`
+
+Period: `\.`
+
+Bang: `\!`
+
+Plus: `\+`
+
+Minus: `\-`
+
+These should get escaped, even though they're matching pairs for
+other Markdown constructs:
+
+\\\*asterisks\\\*
+
+\\\_underscores\\\_
+
+\\\`backticks\\\`
+
+This is a code span with a literal backslash-backtick sequence: `` \` ``
+
+This is a tag with unescaped backticks <span attr='`ticks`'>bar</span>.
+
+This is a tag with backslashes <span attr='\\\\backslashes\\\\'>bar</span>.
+"""
+               var exp = """
+<p>These should all get escaped:</p>
+<p>Backslash: \\</p>
+<p>Backtick: \`</p>
+<p>Asterisk: \*</p>
+<p>Underscore: \_</p>
+<p>Left brace: \{</p>
+<p>Right brace: \}</p>
+<p>Left bracket: \[</p>
+<p>Right bracket: \]</p>
+<p>Left paren: \(</p>
+<p>Right paren: \)</p>
+<p>Greater-than: \></p>
+<p>Hash: \#</p>
+<p>Period: \.</p>
+<p>Bang: \!</p>
+<p>Plus: \+</p>
+<p>Minus: \-</p>
+<p>These should not, because they occur within a code block:</p>
+<pre><code>Backslash: \\
+
+Backtick: \`
+
+Asterisk: \*
+
+Underscore: \_
+
+Left brace: \{
+
+Right brace: \}
+
+Left bracket: \[
+
+Right bracket: \]
+
+Left paren: \(
+
+Right paren: \)
+
+Greater-than: \&gt;
+
+Hash: \#
+
+Period: \.
+
+Bang: \!
+
+Plus: \+
+
+Minus: \-
+</code></pre>
+<p>Nor should these, which occur in code spans:</p>
+<p>Backslash: <code>\\</code></p>
+<p>Backtick: <code>\`</code></p>
+<p>Asterisk: <code>\*</code></p>
+<p>Underscore: <code>\_</code></p>
+<p>Left brace: <code>\{</code></p>
+<p>Right brace: <code>\}</code></p>
+<p>Left bracket: <code>\[</code></p>
+<p>Right bracket: <code>\]</code></p>
+<p>Left paren: <code>\(</code></p>
+<p>Right paren: <code>\)</code></p>
+<p>Greater-than: <code>\&gt;</code></p>
+<p>Hash: <code>\#</code></p>
+<p>Period: <code>\.</code></p>
+<p>Bang: <code>\!</code></p>
+<p>Plus: <code>\+</code></p>
+<p>Minus: <code>\-</code></p>
+<p>These should get escaped, even though they're matching pairs for
+other Markdown constructs:</p>
+<p>*asterisks*</p>
+<p>_underscores_</p>
+<p>`backticks`</p>
+<p>This is a code span with a literal backslash-backtick sequence: <code>\`</code></p>
+<p>This is a tag with unescaped backticks <span attr='`ticks`'>bar</span>.</p>
+<p>This is a tag with backslashes <span attr='\\\\backslashes\\\\'>bar</span>.</p>
+"""
+
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_daring_blockquotes do
+               var test = """
+> Example:
+>
+>     sub status {
+>         print "working";
+>     }
+>
+> Or:
+>
+>     sub status {
+>         return "working";
+>     }
+"""
+
+               var exp = """
+<blockquote>
+<p>Example:</p>
+<pre><code>sub status {
+    print "working";
+}
+</code></pre>
+<p>Or:</p>
+<pre><code>sub status {
+    return "working";
+}
+</code></pre>
+</blockquote>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_daring_code_blocks do
+               var test = """
+       code block on the first line
+
+Regular text.
+
+    code block indented by spaces
+
+Regular text.
+
+       the lines in this block
+       all contain trailing spaces
+
+Regular Text.
+
+       code block on the last line
+"""
+
+               var exp = """
+<pre><code>code block on the first line
+</code></pre>
+<p>Regular text.</p>
+<pre><code>code block indented by spaces
+</code></pre>
+<p>Regular text.</p>
+<pre><code>the lines in this block
+all contain trailing spaces
+</code></pre>
+<p>Regular Text.</p>
+<pre><code>code block on the last line
+</code></pre>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_daring_code_spans do
+               var test = """
+`<test a="` content of attribute `">`
+
+Fix for backticks within HTML tag: <span attr='`ticks`'>like this</span>
+
+Here's how you put `` `backticks` `` in a code span.
+"""
+
+               var exp = """
+<p><code>&lt;test a="</code> content of attribute <code>"&gt;</code></p>
+<p>Fix for backticks within HTML tag: <span attr='`ticks`'>like this</span></p>
+<p>Here's how you put <code>`backticks`</code> in a code span.</p>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_daring_pars do
+               var test = """
+In Markdown 1.0.0 and earlier. Version
+8. This line turns into a list item.
+Because a hard-wrapped line in the
+middle of a paragraph looked like a
+list item.
+
+Here's one with a bullet.
+* criminey.
+"""
+
+               var exp = """
+<p>In Markdown 1.0.0 and earlier. Version
+8. This line turns into a list item.
+Because a hard-wrapped line in the
+middle of a paragraph looked like a
+list item.</p>
+<p>Here's one with a bullet.
+* criminey.</p>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_daring_rules do
+               var test = """
+Dashes:
+
+---
+
+ ---
+
+  ---
+
+   ---
+
+       ---
+
+- - -
+
+ - - -
+
+  - - -
+
+   - - -
+
+       - - -
+
+
+Asterisks:
+
+***
+
+ ***
+
+  ***
+
+   ***
+
+       ***
+
+* * *
+
+ * * *
+
+  * * *
+
+   * * *
+
+       * * *
+
+
+Underscores:
+
+___
+
+ ___
+
+  ___
+
+   ___
+
+    ___
+
+_ _ _
+
+ _ _ _
+
+  _ _ _
+
+   _ _ _
+
+    _ _ _
+"""
+
+               var exp = """
+<p>Dashes:</p>
+<hr/>
+<hr/>
+<hr/>
+<hr/>
+<pre><code>---
+</code></pre>
+<hr/>
+<hr/>
+<hr/>
+<hr/>
+<pre><code>- - -
+</code></pre>
+<p>Asterisks:</p>
+<hr/>
+<hr/>
+<hr/>
+<hr/>
+<pre><code>***
+</code></pre>
+<hr/>
+<hr/>
+<hr/>
+<hr/>
+<pre><code>* * *
+</code></pre>
+<p>Underscores:</p>
+<hr/>
+<hr/>
+<hr/>
+<hr/>
+<pre><code>___
+</code></pre>
+<hr/>
+<hr/>
+<hr/>
+<hr/>
+<pre><code>_ _ _
+</code></pre>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_daring_images do
+               var test = """
+![Alt text](/path/to/img.jpg)
+
+![Alt text](/path/to/img.jpg "Optional title")
+
+Inline within a paragraph: [alt text](/url/).
+
+![alt text](/url/  "title preceded by two spaces")
+
+![alt text](/url/  "title has spaces afterward"  )
+
+![alt text](</url/>)
+
+![alt text](</url/> "with a title").
+
+![Empty]()
+
+![this is a stupid URL](http://example.com/(parens).jpg)
+
+
+![alt text][foo]
+
+  [foo]: /url/
+
+![alt text][bar]
+
+  [bar]: /url/ "Title here"
+"""
+
+               var exp = """
+<p><img src="/path/to/img.jpg" alt="Alt text"/></p>
+<p><img src="/path/to/img.jpg" alt="Alt text" title="Optional title"/></p>
+<p>Inline within a paragraph: <a href="/url/">alt text</a>.</p>
+<p><img src="/url/" alt="alt text" title="title preceded by two spaces"/></p>
+<p><img src="/url/" alt="alt text" title="title has spaces afterward"/></p>
+<p><img src="/url/" alt="alt text"/></p>
+<p><img src="/url/" alt="alt text" title="with a title"/>.</p>
+<p><img src="" alt="Empty"/></p>
+<p><img src="http://example.com/(parens).jpg" alt="this is a stupid URL"/></p>
+<p><img src="/url/" alt="alt text"/></p>
+<p><img src="/url/" alt="alt text" title="Title here"/></p>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_daring_inline_html1 do
+               var test = """
+Here's a simple block:
+
+<div>
+       foo
+</div>
+
+This should be a code block, though:
+
+       <div>
+               foo
+       </div>
+
+As should this:
+
+       <div>foo</div>
+
+Now, nested:
+
+<div>
+       <div>
+               <div>
+                       foo
+               </div>
+       </div>
+</div>
+
+This should just be an HTML comment:
+
+<!-- Comment -->
+
+Multiline:
+
+<!--
+Blah
+Blah
+-->
+
+Code block:
+
+       <!-- Comment -->
+
+Just plain comment, with trailing spaces on the line:
+
+<!-- foo -->
+
+Code:
+
+       <hr />
+
+Hr's:
+
+<hr>
+
+<hr/>
+
+<hr />
+
+<hr>
+
+<hr/>
+
+<hr />
+
+<hr class="foo" id="bar" />
+
+<hr class="foo" id="bar"/>
+
+<hr class="foo" id="bar" >
+"""
+
+               var exp = """
+<p>Here's a simple block:</p>
+<div>
+    foo
+</div>
+<p>This should be a code block, though:</p>
+<pre><code>&lt;div&gt;
+    foo
+&lt;/div&gt;
+</code></pre>
+<p>As should this:</p>
+<pre><code>&lt;div&gt;foo&lt;/div&gt;
+</code></pre>
+<p>Now, nested:</p>
+<div>
+    <div>
+        <div>
+            foo
+        </div>
+    </div>
+</div>
+<p>This should just be an HTML comment:</p>
+<!-- Comment -->
+<p>Multiline:</p>
+<!--
+Blah
+Blah
+-->
+<p>Code block:</p>
+<pre><code>&lt;!-- Comment --&gt;
+</code></pre>
+<p>Just plain comment, with trailing spaces on the line:</p>
+<!-- foo -->
+<p>Code:</p>
+<pre><code>&lt;hr /&gt;
+</code></pre>
+<p>Hr's:</p>
+<hr>
+<hr/>
+<hr />
+<hr>
+<hr/>
+<hr />
+<hr class="foo" id="bar" />
+<hr class="foo" id="bar"/>
+<hr class="foo" id="bar" >
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_daring_inline_html2 do
+               var test = """
+Simple block on one line:
+
+<div>foo</div>
+
+And nested without indentation:
+
+<div>
+<div>
+<div>
+foo
+</div>
+<div style=">"/>
+</div>
+<div>bar</div>
+</div>
+
+And with attributes:
+
+<div>
+       <div id="foo">
+       </div>
+</div>
+
+This was broken in 1.0.2b7:
+
+<div class="inlinepage">
+<div class="toggleableend">
+foo
+</div>
+</div>
+"""
+
+               var exp = """
+<p>Simple block on one line:</p>
+<div>foo</div>
+<p>And nested without indentation:</p>
+<div>
+<div>
+<div>
+foo
+</div>
+<div style=">"/>
+</div>
+<div>bar</div>
+</div>
+<p>And with attributes:</p>
+<div>
+    <div id="foo">
+    </div>
+</div>
+<p>This was broken in 1.0.2b7:</p>
+<div class="inlinepage">
+<div class="toggleableend">
+foo
+</div>
+</div>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_daring_inline_html3 do
+               var test = """
+Paragraph one.
+
+<!-- This is a simple comment -->
+
+<!--
+       This is another comment.
+-->
+
+Paragraph two.
+
+<!-- one comment block -- -- with two comments -->
+
+The end.
+"""
+
+               var exp = """
+<p>Paragraph one.</p>
+<!-- This is a simple comment -->
+<!--
+    This is another comment.
+-->
+<p>Paragraph two.</p>
+<!-- one comment block -- -- with two comments -->
+<p>The end.</p>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_daring_links1 do
+               var test = """
+Just a [URL](/url/).
+
+[URL and title](/url/ "title").
+
+[URL and title](/url/  "title preceded by two spaces").
+
+[URL and title](/url/  "title preceded by a tab").
+
+[URL and title](/url/ "title has spaces afterward"  ).
+
+[URL wrapped in angle brackets](</url/>).
+
+[URL w/ angle brackets + title](</url/> "Here's the title").
+
+[Empty]().
+
+[With parens in the URL](http://en.wikipedia.org/wiki/WIMP_(computing))
+
+(With outer parens and [parens in url](/foo(bar)))
+
+
+[With parens in the URL](/foo(bar) "and a title")
+
+(With outer parens and [parens in url](/foo(bar) "and a title"))
+"""
+
+               var exp = """
+<p>Just a <a href="/url/">URL</a>.</p>
+<p><a href="/url/" title="title">URL and title</a>.</p>
+<p><a href="/url/" title="title preceded by two spaces">URL and title</a>.</p>
+<p><a href="/url/" title="title preceded by a tab">URL and title</a>.</p>
+<p><a href="/url/" title="title has spaces afterward">URL and title</a>.</p>
+<p><a href="/url/">URL wrapped in angle brackets</a>.</p>
+<p><a href="/url/" title="Here&apos;s the title">URL w/ angle brackets + title</a>.</p>
+<p><a href="">Empty</a>.</p>
+<p><a href="http://en.wikipedia.org/wiki/WIMP_(computing)">With parens in the URL</a></p>
+<p>(With outer parens and <a href="/foo(bar)">parens in url</a>)</p>
+<p><a href="/foo(bar)" title="and a title">With parens in the URL</a></p>
+<p>(With outer parens and <a href="/foo(bar)" title="and a title">parens in url</a>)</p>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_daring_links2 do
+               var test = """
+Foo [bar] [1].
+
+Foo [bar][1].
+
+Foo [bar]
+[1].
+
+[1]: /url/  "Title"
+
+
+With [embedded [brackets]] [b].
+
+
+Indented [once][].
+
+Indented [twice][].
+
+Indented [thrice][].
+
+Indented [four][] times.
+
+ [once]: /url
+
+  [twice]: /url
+
+   [thrice]: /url
+
+    [four]: /url
+
+
+[b]: /url/
+
+* * *
+
+[this] [this] should work
+
+So should [this][this].
+
+And [this] [].
+
+And [this][].
+
+And [this].
+
+But not [that] [].
+
+Nor [that][].
+
+Nor [that].
+
+[Something in brackets like [this][] should work]
+
+[Same with [this].]
+
+In this case, [this](/somethingelse/) points to something else.
+
+Backslashing should suppress \\\[this] and [this\\\].
+
+[this]: foo
+
+
+* * *
+
+Here's one where the [link
+breaks] across lines.
+
+Here's another where the [link
+breaks] across lines, but with a line-ending space.
+
+
+[link breaks]: /url/
+"""
+
+               var exp = """
+<p>Foo <a href="/url/" title="Title">bar</a>.</p>
+<p>Foo <a href="/url/" title="Title">bar</a>.</p>
+<p>Foo <a href="/url/" title="Title">bar</a>.</p>
+<p>With <a href="/url/">embedded [brackets]</a>.</p>
+<p>Indented <a href="/url">once</a>.</p>
+<p>Indented <a href="/url">twice</a>.</p>
+<p>Indented <a href="/url">thrice</a>.</p>
+<p>Indented [four][] times.</p>
+<pre><code>[four]: /url
+</code></pre>
+<hr/>
+<p><a href="foo">this</a> should work</p>
+<p>So should <a href="foo">this</a>.</p>
+<p>And <a href="foo">this</a>.</p>
+<p>And <a href="foo">this</a>.</p>
+<p>And <a href="foo">this</a>.</p>
+<p>But not [that] [].</p>
+<p>Nor [that][].</p>
+<p>Nor [that].</p>
+<p>[Something in brackets like <a href="foo">this</a> should work]</p>
+<p>[Same with <a href="foo">this</a>.]</p>
+<p>In this case, <a href="/somethingelse/">this</a> points to something else.</p>
+<p>Backslashing should suppress [this] and [this].</p>
+<hr/>
+<p>Here's one where the <a href="/url/">link
+breaks</a> across lines.</p>
+<p>Here's another where the <a href="/url/">link
+breaks</a> across lines, but with a line-ending space.</p>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_daring_links3 do
+               var test = """
+This is the [simple case].
+
+[simple case]: /simple
+
+
+
+This one has a [line
+break].
+
+This one has a [line
+break] with a line-ending space.
+
+[line break]: /foo
+
+
+[this] [that] and the [other]
+
+[this]: /this
+[that]: /that
+[other]: /other
+"""
+
+               var exp = """
+<p>This is the <a href="/simple">simple case</a>.</p>
+<p>This one has a <a href="/foo">line
+break</a>.</p>
+<p>This one has a <a href="/foo">line
+break</a> with a line-ending space.</p>
+<p><a href="/that">this</a> and the <a href="/other">other</a></p>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_daring_nested do
+               var test = """
+> foo
+>
+> > bar
+>
+> foo
+"""
+
+               var exp = """
+<blockquote>
+<p>foo</p>
+<blockquote>
+<p>bar</p>
+</blockquote>
+<p>foo</p>
+</blockquote>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_daring_list do
+               var test = """
+## Unordered
+
+Asterisks tight:
+
+*      asterisk 1
+*      asterisk 2
+*      asterisk 3
+
+
+Asterisks loose:
+
+*      asterisk 1
+
+*      asterisk 2
+
+*      asterisk 3
+
+* * *
+
+Pluses tight:
+
++      Plus 1
++      Plus 2
++      Plus 3
+
+
+Pluses loose:
+
++      Plus 1
+
++      Plus 2
+
++      Plus 3
+
+* * *
+
+
+Minuses tight:
+
+-      Minus 1
+-      Minus 2
+-      Minus 3
+
+
+Minuses loose:
+
+-      Minus 1
+
+-      Minus 2
+
+-      Minus 3
+
+
+## Ordered
+
+Tight:
+
+1.     First
+2.     Second
+3.     Third
+
+and:
+
+1. One
+2. Two
+3. Three
+
+
+Loose using tabs:
+
+1.     First
+
+2.     Second
+
+3.     Third
+
+and using spaces:
+
+1. One
+
+2. Two
+
+3. Three
+
+Multiple paragraphs:
+
+1.     Item 1, graf one.
+
+       Item 2. graf two. The quick brown fox jumped over the lazy dog's
+       back.
+
+2.     Item 2.
+
+3.     Item 3.
+
+
+
+## Nested
+
+*      Tab
+       *       Tab
+               *       Tab
+
+Here's another:
+
+1. First
+2. Second:
+       * Fee
+       * Fie
+       * Foe
+3. Third
+
+Same thing but with paragraphs:
+
+1. First
+
+2. Second:
+       * Fee
+       * Fie
+       * Foe
+
+3. Third
+"""
+
+               var exp = """
+<h2 id="Unordered">Unordered</h2>
+<p>Asterisks tight:</p>
+<ul>
+<li>asterisk 1</li>
+<li>asterisk 2</li>
+<li>asterisk 3</li>
+</ul>
+<p>Asterisks loose:</p>
+<ul>
+<li><p>asterisk 1</p>
+</li>
+<li><p>asterisk 2</p>
+</li>
+<li><p>asterisk 3</p>
+</li>
+</ul>
+<hr/>
+<p>Pluses tight:</p>
+<ul>
+<li>Plus 1</li>
+<li>Plus 2</li>
+<li>Plus 3</li>
+</ul>
+<p>Pluses loose:</p>
+<ul>
+<li><p>Plus 1</p>
+</li>
+<li><p>Plus 2</p>
+</li>
+<li><p>Plus 3</p>
+</li>
+</ul>
+<hr/>
+<p>Minuses tight:</p>
+<ul>
+<li>Minus 1</li>
+<li>Minus 2</li>
+<li>Minus 3</li>
+</ul>
+<p>Minuses loose:</p>
+<ul>
+<li><p>Minus 1</p>
+</li>
+<li><p>Minus 2</p>
+</li>
+<li><p>Minus 3</p>
+</li>
+</ul>
+<h2 id="Ordered">Ordered</h2>
+<p>Tight:</p>
+<ol>
+<li>First</li>
+<li>Second</li>
+<li>Third</li>
+</ol>
+<p>and:</p>
+<ol>
+<li>One</li>
+<li>Two</li>
+<li>Three</li>
+</ol>
+<p>Loose using tabs:</p>
+<ol>
+<li><p>First</p>
+</li>
+<li><p>Second</p>
+</li>
+<li><p>Third</p>
+</li>
+</ol>
+<p>and using spaces:</p>
+<ol>
+<li><p>One</p>
+</li>
+<li><p>Two</p>
+</li>
+<li><p>Three</p>
+</li>
+</ol>
+<p>Multiple paragraphs:</p>
+<ol>
+<li><p>Item 1, graf one.</p>
+<p>Item 2. graf two. The quick brown fox jumped over the lazy dog's
+back.</p>
+</li>
+<li><p>Item 2.</p>
+</li>
+<li><p>Item 3.</p>
+</li>
+</ol>
+<h2 id="Nested">Nested</h2>
+<ul>
+<li>Tab<ul>
+<li>Tab<ul>
+<li>Tab</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+<p>Here's another:</p>
+<ol>
+<li>First</li>
+<li>Second:<ul>
+<li>Fee</li>
+<li>Fie</li>
+<li>Foe</li>
+</ul>
+</li>
+<li>Third</li>
+</ol>
+<p>Same thing but with paragraphs:</p>
+<ol>
+<li><p>First</p>
+</li>
+<li><p>Second:</p>
+<ul>
+<li>Fee</li>
+<li>Fie</li>
+<li>Foe</li>
+</ul>
+</li>
+<li><p>Third</p>
+</li>
+</ol>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_daring_strong_em do
+               var test = """
+***This is strong and em.***
+
+So is ***this*** word.
+
+___This is strong and em.___
+
+So is ___this___ word.
+"""
+
+               var exp = """
+<p><strong><em>This is strong and em.</em></strong></p>
+<p>So is <strong><em>this</em></strong> word.</p>
+<p><strong><em>This is strong and em.</em></strong></p>
+<p>So is <strong><em>this</em></strong> word.</p>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_daring_tabs do
+               var test = """
++      this is a list item
+       indented with tabs
+
++   this is a list item
+    indented with spaces
+
+Code:
+
+       this code block is indented by one tab
+
+And:
+
+               this code block is indented by two tabs
+
+And:
+
+       +       this is an example list item
+               indented with tabs
+
+       +   this is an example list item
+           indented with spaces
+"""
+
+               var exp = """
+<ul>
+<li><p>this is a list item
+indented with tabs</p>
+</li>
+<li><p>this is a list item
+indented with spaces</p>
+</li>
+</ul>
+<p>Code:</p>
+<pre><code>this code block is indented by one tab
+</code></pre>
+<p>And:</p>
+<pre><code>    this code block is indented by two tabs
+</code></pre>
+<p>And:</p>
+<pre><code>+   this is an example list item
+    indented with tabs
+
++   this is an example list item
+    indented with spaces
+</code></pre>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+       fun test_daring_tidyness do
+               var test = """
+> A list within a blockquote:
+>
+> *    asterisk 1
+> *    asterisk 2
+> *    asterisk 3
+"""
+
+       var exp = """
+<blockquote>
+<p>A list within a blockquote:</p>
+<ul>
+<li>asterisk 1</li>
+<li>asterisk 2</li>
+<li>asterisk 3</li>
+</ul>
+</blockquote>
+"""
+               var res = test.md_to_html.write_to_string
+               assert res == exp
+       end
+
+
+end
+
+class TestBlock
+       super TestSuite
+
+       fun test_has_blocks do
+               var subject = new MDBlock
+               assert not subject.has_blocks
+               subject.first_block = new MDBlock
+               assert subject.has_blocks
+       end
+
+       fun test_count_blocks do
+               var subject = new MDBlock
+               assert subject.count_blocks == 0
+               subject.first_block = new MDBlock
+               assert subject.count_blocks == 1
+               subject.first_block.next = new MDBlock
+               assert subject.count_blocks == 2
+       end
+
+       fun test_has_lines do
+               var subject = new MDBlock
+               assert not subject.has_lines
+               subject.first_line = new MDLine("")
+               assert subject.has_lines
+       end
+
+       fun test_count_lines do
+               var subject = new MDBlock
+               assert subject.count_lines == 0
+               subject.first_line = new MDLine("")
+               assert subject.count_lines == 1
+               subject.first_line.next = new MDLine("")
+               assert subject.count_lines == 2
+       end
+
+       fun test_split do
+               var line1 = new MDLine("line1")
+               var line2 = new MDLine("line2")
+               var line3 = new MDLine("line3")
+               var subject = new MDBlock
+               subject.add_line line1
+               subject.add_line line2
+               subject.add_line line3
+               var block = subject.split(line2)
+               assert subject.count_blocks == 1
+               assert subject.count_lines == 1
+               assert subject.first_line == line3
+               assert block.count_blocks == 0
+               assert block.count_lines == 2
+               assert block.first_line == line1
+               assert block.last_line == line2
+       end
+
+       fun test_add_line do
+               var subject = new MDBlock
+               assert subject.count_lines == 0
+               subject.add_line new MDLine("")
+               assert subject.count_lines == 1
+               subject.add_line new MDLine("")
+               assert subject.count_lines == 2
+       end
+
+       fun test_remove_line do
+               var line1 = new MDLine("line1")
+               var line2 = new MDLine("line2")
+               var line3 = new MDLine("line3")
+               var subject = new MDBlock
+               subject.add_line line1
+               subject.add_line line2
+               subject.add_line line3
+               subject.remove_line(line2)
+               assert subject.count_lines == 2
+               subject.remove_line(line1)
+               assert subject.count_lines == 1
+               assert subject.first_line == line3
+               assert subject.last_line == line3
+       end
+
+       fun test_transform_headline1 do
+               var subject = new MDBlock
+               var kind = new BlockHeadline(subject)
+               subject.add_line new MDLine(" #   Title 1   ")
+               kind.transform_headline(subject)
+               assert kind.depth == 1
+               assert subject.first_line.value == "Title 1"
+       end
+
+       fun test_transform_headline2 do
+               var subject = new MDBlock
+               var kind = new BlockHeadline(subject)
+               subject.add_line new MDLine(" #####Title 5   ")
+               kind.transform_headline(subject)
+               assert kind.depth == 5
+               assert subject.first_line.value == "Title 5"
+       end
+
+       fun test_remove_quote_prefix do
+               var subject = new MDBlock
+               var kind = new BlockQuote(subject)
+               subject.add_line new MDLine(" > line 1")
+               subject.add_line new MDLine(" > line 2")
+               subject.add_line new MDLine(" > line 3")
+               kind.remove_block_quote_prefix(subject)
+               assert subject.first_line.value == "line 1"
+               assert subject.first_line.next.value == "line 2"
+               assert subject.first_line.next.next.value == "line 3"
+       end
+
+       fun test_remove_leading_empty_lines_1 do
+               var block = new MDBlock
+               block.add_line new MDLine("")
+               block.add_line new MDLine("")
+               block.add_line new MDLine("")
+               block.add_line new MDLine("")
+               block.add_line new MDLine("   text")
+               block.add_line new MDLine("")
+               assert block.remove_leading_empty_lines
+               assert block.first_line.value == "   text"
+       end
+
+       fun test_remove_leading_empty_lines_2 do
+               var block = new MDBlock
+               block.add_line new MDLine("   text")
+               block.remove_leading_empty_lines
+               assert block.first_line.value == "   text"
+       end
+
+       fun test_remove_trailing_empty_lines_1 do
+               var block = new MDBlock
+               block.add_line new MDLine("")
+               block.add_line new MDLine("text")
+               block.add_line new MDLine("")
+               block.add_line new MDLine("")
+               block.add_line new MDLine("")
+               block.add_line new MDLine("")
+               assert block.remove_trailing_empty_lines
+               assert block.last_line.value == "text"
+       end
+
+       fun test_remove_trailing_empty_lines_2 do
+               var block = new MDBlock
+               block.add_line new MDLine("text  ")
+               assert not block.remove_trailing_empty_lines
+               assert block.last_line.value == "text  "
+       end
+
+       fun test_remove_surrounding_empty_lines do
+               var block = new MDBlock
+               block.add_line new MDLine("")
+               block.add_line new MDLine("text")
+               block.add_line new MDLine("")
+               block.add_line new MDLine("")
+               block.add_line new MDLine("")
+               block.add_line new MDLine("")
+               assert block.remove_surrounding_empty_lines
+               assert block.first_line.value == "text"
+               assert block.last_line.value == "text"
+       end
+end
+
+class TestLine
+       super TestSuite
+
+       var subject: MDLine
+
+       init do end
+
+       fun test_is_empty do
+               subject = new MDLine("")
+               assert subject.is_empty
+               subject = new MDLine("    ")
+               assert subject.is_empty
+               subject = new MDLine("test")
+               assert not subject.is_empty
+               subject = new MDLine("    test")
+               assert not subject.is_empty
+       end
+
+       fun test_leading do
+               subject = new MDLine("")
+               assert subject.leading == 0
+               subject = new MDLine("    ")
+               assert subject.leading == 4
+               subject = new MDLine("test")
+               assert subject.leading == 0
+               subject = new MDLine("    test")
+               assert subject.leading == 4
+       end
+
+       fun test_trailing do
+               subject = new MDLine("")
+               assert subject.trailing == 0
+               subject = new MDLine("    ")
+               assert subject.trailing == 0
+               subject = new MDLine("test   ")
+               assert subject.trailing == 3
+               subject = new MDLine("    test ")
+               assert subject.trailing == 1
+       end
+
+       fun test_line_type do
+               var v = new MarkdownProcessor
+               subject = new MDLine("")
+               assert subject.kind(v) isa LineEmpty
+               subject = new MDLine("    ")
+               assert subject.kind(v) isa LineEmpty
+               subject = new MDLine("text   ")
+               assert subject.kind(v) isa LineOther
+               subject = new MDLine("  # Title")
+               assert subject.kind(v) isa LineHeadline
+               subject = new MDLine("  ### Title")
+               assert subject.kind(v) isa LineHeadline
+               subject = new MDLine("    code")
+               assert subject.kind(v) isa LineCode
+               subject = new MDLine("  ~~~")
+               assert subject.kind(v) isa LineFence
+               subject = new MDLine("  ```")
+               assert subject.kind(v) isa LineFence
+               subject = new MDLine("   Title  ")
+               subject.next = new MDLine("== ")
+               assert subject.kind(v) isa LineHeadline1
+               subject = new MDLine("   Title  ")
+               subject.next = new MDLine("-- ")
+               assert subject.kind(v) isa LineHeadline2
+               subject = new MDLine("  *    *   * ")
+               assert subject.kind(v) isa LineHR
+               subject = new MDLine("  *** ")
+               assert subject.kind(v) isa LineHR
+               subject = new MDLine("- -- ")
+               assert subject.kind(v) isa LineHR
+               subject = new MDLine("--------- ")
+               assert subject.kind(v) isa LineHR
+               subject = new MDLine(" >")
+               assert subject.kind(v) isa LineBlockquote
+               subject = new MDLine("<p></p>")
+               assert subject.kind(v) isa LineXML
+               subject = new MDLine("<p>")
+               assert subject.kind(v) isa LineOther
+               subject = new MDLine("  * foo")
+               assert subject.kind(v) isa LineUList
+               subject = new MDLine("- foo")
+               assert subject.kind(v) isa LineUList
+               subject = new MDLine("+ foo")
+               assert subject.kind(v) isa LineUList
+               subject = new MDLine("1. foo")
+               assert subject.kind(v) isa LineOList
+               subject = new MDLine("   11111. foo")
+               assert subject.kind(v) isa LineOList
+       end
+
+       fun test_count_chars do
+               subject = new MDLine("")
+               assert subject.count_chars('*') == 0
+               subject = new MDLine("* ")
+               assert subject.count_chars('*') == 1
+               subject = new MDLine(" * text")
+               assert subject.count_chars('*') == 0
+               subject = new MDLine(" *    *    *")
+               assert subject.count_chars('*') == 3
+               subject = new MDLine("text ** ")
+               assert subject.count_chars('*') == 0
+       end
+
+       fun test_count_chars_start do
+               subject = new MDLine("")
+               assert subject.count_chars_start('*') == 0
+               subject = new MDLine("* ")
+               assert subject.count_chars_start('*') == 1
+               subject = new MDLine(" * text")
+               assert subject.count_chars_start('*') == 1
+               subject = new MDLine(" *    *    * text")
+               assert subject.count_chars_start('*') == 3
+               subject = new MDLine("text ** ")
+               assert subject.count_chars_start('*') == 0
+       end
+end
+
+class TestHTMLDecorator
+       super TestSuite
+
+       fun test_headlines do
+               var test = """
+# **a**
+## a.a
+### a.a.b
+### a.a.b
+## a.b
+# [b](test)
+## b.a
+### b.a.c
+## b.b
+## b.c
+# c
+"""
+               var proc = new MarkdownProcessor
+               var decorator = proc.emitter.decorator.as(HTMLDecorator)
+               proc.process(test)
+               var res = ""
+               for id, headline in decorator.headlines do
+                       res += "{headline.title}:{id}\n"
+               end
+               var exp = """
+**a**:a
+a.a:a.a
+a.a.b:a.a.b
+a.a.b:a.a.b_1
+a.b:a.b
+[b](test):btest
+b.a:b.a
+b.a.c:b.a.c
+b.b:b.b
+b.c:b.c
+c:c
+"""
+               assert res == exp
+       end
+end
index 4c003a6..9987b8c 100644 (file)
@@ -30,10 +30,10 @@ redef class App
 
        # Display to use by apps
        # Is null if the display is not available or not yet ready
-       var display: nullable D protected writable = null
+       var display: nullable D = null is protected writable
 
        # Received quit order
-       var quit: Bool writable = false
+       var quit: Bool = false is writable
 
        # App is visible? (vs minimized or in background)
        fun visible: Bool is abstract
index cd30e83..2b2abf1 100644 (file)
@@ -24,7 +24,7 @@ redef class App
        # Zero (or a negative value) means no limit.
        #
        # Applications can modify this value even during the main-loop.
-       var maximum_fps writable = 60
+       var maximum_fps = 60 is writable
 
        # Current frame-rate
        # Updated each 5 seconds.
index c966769..91bc359 100644 (file)
@@ -77,7 +77,7 @@ class NullImage
        super Image
        var path: String
        redef fun to_s do return path
-       redef var scale redef writable = 1.0
+       redef var scale = 1.0 is redef writable
        redef var width = 32
        redef var height = 32
 end
index 7b473f3..b0eae74 100644 (file)
@@ -80,11 +80,11 @@ class TileSetFont
 
        # Additional space to insert horizontally between characters
        # A negave value will display tile overlaped
-       var hspace: Int writable = 0
+       var hspace: Int = 0 is writable
 
        # Additional space to insert vertically between characters
        # A negave value will display tile overlaped
-       var vspace: Int writable = 0
+       var vspace: Int = 0 is writable
 
        # The glyph (tile) associated to the caracter `c` according to `chars`
        # Returns null if `c` is not in `chars`
index 77d3650..f1a1da8 100644 (file)
@@ -35,14 +35,14 @@ abstract class JsonCurlRequest
        end
 
        # OAuth token
-       var auth: nullable String writable
+       var auth: nullable String is writable
 
        # User agent (is used by github to contact devs in case of problems)
        # Eg. "Awesome-Octocat-App"
-       var user_agent: nullable String writable
+       var user_agent: nullable String is writable
 
        # HTTP headers to send
-       var headers: nullable HeaderMap writable = null
+       var headers: nullable HeaderMap = null is writable
 
 
        # init HTTP headers for Neo4j REST API
@@ -125,7 +125,7 @@ end
 class JsonPOST
        super JsonCurlRequest
 
-       var data: nullable Jsonable writable = null
+       var data: nullable Jsonable = null is writable
 
        redef fun init_headers do
                super
@@ -160,7 +160,7 @@ end
 class JsonPUT
        super JsonCurlRequest
 
-       var data: nullable Jsonable writable = null
+       var data: nullable Jsonable = null is writable
 
        redef fun init_headers do
                super
index c71ea6b..74dcd43 100644 (file)
@@ -116,7 +116,7 @@ abstract class Parser
 
        # Should the parser stop
        # Used by generated parsers
-       var stop writable = true
+       var stop = true is writable
 
        # Parse a full sequence of tokens and return a complete syntactic tree
        fun parse: Node
@@ -318,7 +318,7 @@ abstract class Node
        end
 
        # The position of the node in the input stream
-       var position: nullable Position writable = null
+       var position: nullable Position = null is writable
 
        # Produce a graphiz file for the syntaxtic tree rooted at `self`.
        fun to_dot(filepath: String)
@@ -423,7 +423,7 @@ abstract class NToken
        end
 
        # The text associated with the token
-       var text: String writable = ""
+       var text: String = "" is writable
 
        redef fun to_s do
                var res = super
index 348383e..3552b2d 100644 (file)
@@ -21,6 +21,7 @@ module file_server
 import reactor
 import sessions
 import media_types
+import http_errors
 
 redef class String
        # Returns a `String` copy of `self` without any of the prefixed '/'s
@@ -41,9 +42,29 @@ end
 class FileServer
        super Action
 
-       # Root of `self` file system
+       # Root folder of `self` file system
        var root: String
 
+       init
+       do
+               var root = self.root
+
+               # Simplify the root path as each file requested will also be simplified
+               root = root.simplify_path
+
+               # Make sure the root ends with '/', this makes a difference in the security
+               # check on each file access.
+               root = root + "/"
+
+               self.root = root
+       end
+
+       # Error page template for a given `code`
+       fun error_page(code: Int): Streamable do return new ErrorTemplate(code)
+
+       # Header of each directory page
+       var header: nullable Streamable = null is writable
+
        redef fun answer(request, turi)
        do
                var response
@@ -51,17 +72,24 @@ class FileServer
                var local_file = root.join_path(turi.strip_start_slashes)
                local_file = local_file.simplify_path
 
-               # HACK
-               if turi == "/" then local_file = root
-
                # Is it reachable?
-               if local_file.has_prefix(root) then
+               #
+               # This make sure that the requested file is within the root folder.
+               if (local_file + "/").has_prefix(root) then
                        # Does it exists?
                        if local_file.file_exists then
-                               response = new HttpResponse(200)
-
                                if local_file.file_stat.is_dir then
-                                       # Show index.html instead of the directory listing
+                                       # If we target a directory without an ending `/`,
+                                       # redirect to the directory ending with `/`.
+                                       if not request.uri.is_empty and
+                                          request.uri.chars.last != '/' then
+                                               response = new HttpResponse(303)
+                                               response.header["Location"] = request.uri + "/"
+                                               return response
+                                       end
+
+                                       # Show index file instead of the directory listing
+                                       # only if `index.html` or `index.htm` is available
                                        var index_file = local_file.join_path("index.html")
                                        if index_file.file_exists then
                                                local_file = index_file
@@ -71,22 +99,30 @@ class FileServer
                                        end
                                end
 
+                               response = new HttpResponse(200)
                                if local_file.file_stat.is_dir then
                                        # Show the directory listing
                                        var title = turi
                                        var files = local_file.files
 
                                        var links = new Array[String]
-                                       if local_file.length > 1 then
-                                               # The extra / is a hack
-                                               var path = "/" + (turi + "/..").simplify_path
-                                               links.add "<a href=\"{path}\">..</a>"
+                                       if turi.length > 1 then
+                                               var path = (request.uri + "/..").simplify_path
+                                               links.add "<a href=\"{path}/\">..</a>"
                                        end
                                        for file in files do
-                                               var path = (turi + "/" + file).simplify_path
-                                               links.add "<a href=\"{path}\">{file}</a>"
+                                               var local_path = local_file.join_path(file).simplify_path
+                                               var web_path = file.simplify_path
+                                               if local_path.file_stat.is_dir then web_path = web_path + "/"
+                                               links.add "<a href=\"{web_path}\">{file}</a>"
                                        end
 
+                                       var header = self.header
+                                       var header_code
+                                       if header != null then
+                                               header_code = header.write_to_string
+                                       else header_code = ""
+
                                        response.body = """
 <!DOCTYPE html>
 <head>
@@ -96,6 +132,7 @@ class FileServer
        <title>{{{title}}}</title>
 </head>
 <body>
+       {{{header_code}}}
        <div class="container">
                <h1>{{{title}}}</h1>
                <ul>
@@ -114,7 +151,9 @@ class FileServer
                                        var ext = local_file.file_extension
                                        if ext != null then
                                                var media_type = media_types[ext]
-                                               if media_type != null then response.header["Content-Type"] = media_type
+                                               if media_type != null then
+                                                       response.header["Content-Type"] = media_type
+                                               else response.header["Content-Type"] = "application/octet-stream"
                                        end
 
                                        file.close
@@ -123,6 +162,12 @@ class FileServer
                        else response = new HttpResponse(404)
                else response = new HttpResponse(403)
 
+               if response.status_code != 200 then
+                       var tmpl = error_page(response.status_code)
+                       if header != null and tmpl isa ErrorTemplate then tmpl.header = header
+                       response.body = tmpl.to_s
+               end
+
                return response
        end
 end
diff --git a/lib/nitcorn/http_errors.nit b/lib/nitcorn/http_errors.nit
new file mode 100644 (file)
index 0000000..dd50e0b
--- /dev/null
@@ -0,0 +1,77 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2014 Alexis Laferrière <alexis.laf@xymus.net>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Offers `ErrorTemplate` to display error pages
+module http_errors
+
+import template
+
+import http_response
+
+# A basic error page for the HTTP error `code`
+class ErrorTemplate
+       super Template
+
+       # HTTP error code
+       var code: Int is writable
+
+       # Header on this page
+       var header: nullable Streamable = null is writable
+
+       # Body to show with this page
+       var body: nullable Streamable = null is writable
+
+       redef fun rendering
+       do
+               var code_message = http_status_codes[code]
+               var message
+               if code_message != null then
+                       message = "Error {code}: {code_message}"
+               else message = "Error {code}"
+
+               add """
+<!DOCTYPE html>
+<head>
+       <meta charset="utf-8">
+       <meta http-equiv="X-UA-Compatible" content="IE=edge">
+       <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
+       <title>"""
+       add message
+       add """
+       </title>
+</head>
+<body>"""
+
+               var header = header
+               if header != null then add header
+
+               add """
+       <div class="container">
+               <h1>"""
+               add message
+               add "</h1>"
+
+               var body = body
+               if body != null then add body
+
+               add """
+       </div>
+</body>
+</html>"""
+       end
+
+       redef fun to_s do return write_to_string
+end
index 1a49e0c..07b91ad 100644 (file)
@@ -54,6 +54,9 @@ class HttpRequest
 
        # The arguments passed with the POST method
        var post_args = new HashMap[String, String]
+
+       # The arguments passed with the POST or GET method (with a priority on POST)
+       var all_args = new HashMap[String, String]
 end
 
 # Utility class to parse a request string and build a `HttpRequest`
@@ -96,7 +99,10 @@ class HttpRequestParser
                if http_request.url.has('?') then
                        http_request.uri = first_line[1].substring(0, first_line[1].index_of('?'))
                        http_request.query_string = first_line[1].substring_from(first_line[1].index_of('?')+1)
+
+                       var parse_url = parse_url
                        http_request.get_args = parse_url
+                       http_request.all_args.recover_with parse_url
                else
                        http_request.uri = first_line[1]
                end
@@ -113,6 +119,7 @@ class HttpRequestParser
                                                continue
                                        end
                                        http_request.post_args[parts[0]] = decoded
+                                       http_request.all_args[parts[0]] = decoded
                                else
                                        print "POST Error: {line} format error on {line}"
                                end
index bf5d74a..e16798e 100644 (file)
@@ -95,6 +95,7 @@ class MediaTypes
                types["asx"]        = "video/x-ms-asf"
                types["asf"]        = "video/x-ms-asf"
                types["mng"]        = "video/x-mng"
+               types["apk"]        = "application/vnd.android.package-archive"
        end
 end
 
index a8f9236..0457f3c 100644 (file)
@@ -61,6 +61,9 @@ class HttpServer
                        end label
                end
 
+               # Use default virtual host if none already responded
+               if virtual_host == null then virtual_host = factory.config.default_virtual_host
+
                # Get a response from the virtual host
                var response
                if virtual_host != null then
index 2decb16..f90d4ef 100644 (file)
@@ -21,10 +21,11 @@ module server_config
 
 # Server instance configuration
 class ServerConfig
-       # Virtual hosts list
+       # `VirtualHost`s served by this server
        var virtual_hosts = new VirtualHosts(self)
 
-       # TODO implement serialization or something like that
+       # Default `VirtualHost` to respond to requests not handled by any of the `virtual_hosts`
+       var default_virtual_host: nullable VirtualHost = null
 end
 
 # A `VirtualHost` configuration
index 19b8ff3..a1bffc1 100644 (file)
@@ -29,19 +29,19 @@ abstract class Option
        var errors: Array[String] = new Array[String]
 
        # Is this option mandatory?
-       var mandatory: Bool writable = false
+       var mandatory: Bool = false is writable
 
        # Is this option hidden from `usage`?
-       var hidden: Bool writable = false
+       var hidden: Bool = false is writable
 
        # Has this option been read?
-       var read: Bool writable = false
+       var read: Bool = false is writable
 
        # Current value of this option
-       var value: VALUE writable
+       var value: VALUE is writable
 
        # Default value of this option
-       var default_value: VALUE writable
+       var default_value: VALUE is writable
 
        # Create a new option
        init(help: String, default: VALUE, names: nullable Array[String])
@@ -138,7 +138,7 @@ abstract class OptionParameter
        protected fun convert(str: String): VALUE is abstract
 
        # Is the parameter mandatory?
-       var parameter_mandatory: Bool writable = true
+       var parameter_mandatory: Bool = true is writable
 
        redef fun read_param(it)
        do
index a76784e..bc876c0 100644 (file)
@@ -27,13 +27,7 @@ module pnacl is platform
 import standard
 intrude import standard::stream
 
-`{
-       #include <unistd.h>
-       #include <stddef.h>
-       #include <stdio.h>
-       #include <string.h>
-       #include <stdlib.h>
-       #include <pthread.h>
+in "C Header" `{
        #include "ppapi/c/pp_errors.h"
        #include "ppapi/c/ppp.h"
        #include "ppapi/c/ppp_instance.h"
@@ -43,6 +37,15 @@ intrude import standard::stream
        #include "ppapi/c/ppp_messaging.h"
        #include "ppapi/c/ppb_var_dictionary.h"
        #include "ppapi/c/ppb_var_array.h"
+`}
+
+`{
+       #include <unistd.h>
+       #include <stddef.h>
+       #include <stdio.h>
+       #include <string.h>
+       #include <stdlib.h>
+       #include <pthread.h>
 
        #define MAX_DICTIONARY_QUEUE_SIZE 200
        #define MAX_MESSAGE_QUEUE_SIZE 10
index 18a5d13..ac5a571 100644 (file)
@@ -23,7 +23,7 @@ abstract class LiveObject
        fun update do end
 
        # Controls whether `update' and `draw' are automatically called by `LiveGroup'
-       var exists writable = true
+       var exists = true is writable
 
        # Redefine this method to asks how to draw on a view
        fun draw(view: View) is abstract
@@ -37,16 +37,16 @@ class Sprite
        super LiveObject
 
        # x coordinate of the center point
-       var x: Int writable = 0
+       var x: Int = 0 is writable
 
        # y coordinate of the center point
-       var y: Int writable = 0
+       var y: Int = 0 is writable
 
        # width of the sprite
-       var width: Int writable = 100
+       var width: Int = 100 is writable
 
        # height of the sprite
-       var height: Int writable = 100
+       var height: Int = 100 is writable
 
        fun left: Int do return x - width/2
        fun right: Int do return x + width/2
@@ -54,10 +54,10 @@ class Sprite
        fun bottom: Int do return y + height/2
 
        # x velocity (applied by `update')
-       var vx: Int writable = 0
+       var vx: Int = 0 is writable
 
        # y velocity (applied by `update')
-       var vy: Int writable = 0
+       var vy: Int = 0 is writable
 
        redef fun update
        do
index 9d37e15..7320e83 100644 (file)
@@ -188,7 +188,7 @@ class Container[E]
        init(e: E) do item = e
 
        # The stored item
-       var item: E writable
+       var item: E is writable
 end
 
 # This iterator is quite stupid since it is used for only one item.
@@ -940,10 +940,10 @@ end
 class Couple[F, S]
 
        # The first element of the couple.
-       var first: F writable
+       var first: F is writable
 
        # The second element of the couple.
-       var second: S writable
+       var second: S is writable
 
        # Create a new instance with a first and a second object.
        init(f: F, s: S)
index 3443105..06001df 100644 (file)
@@ -526,13 +526,13 @@ end
 redef class Sys
 
        # Standard input
-       var stdin: PollableIStream protected writable = new Stdin
+       var stdin: PollableIStream = new Stdin is protected writable
 
        # Standard output
-       var stdout: OStream protected writable = new Stdout
+       var stdout: OStream = new Stdout is protected writable
 
        # Standard output for errors
-       var stderr: OStream protected writable = new Stderr
+       var stderr: OStream = new Stderr is protected writable
 
 end
 
index 7db6fa3..ba4db63 100644 (file)
@@ -51,6 +51,16 @@ redef class Int
                if self > o then return (self - o).rshift(1).gcd(o)
                return (o - self).rshift(1).gcd(self)
        end
+
+       # Is `self` even ?
+       #
+       #    assert 12.is_even
+       fun is_even: Bool do return self % 2 == 0
+
+       # Is `self` odd ?
+       #
+       #    assert not 13.is_even
+       fun is_odd: Bool do return not is_even
 end
 
 redef class Float
index f017649..1fe850d 100644 (file)
@@ -19,7 +19,7 @@ module posix
 
 import string
 
-`{
+in "C Header" `{
 #include <sys/types.h>
 #include <unistd.h>
 #include <pwd.h>
diff --git a/lib/standard/re.nit b/lib/standard/re.nit
new file mode 100644 (file)
index 0000000..97cb7cb
--- /dev/null
@@ -0,0 +1,408 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2014 Alexis Laferrière <alexis.laf@xymus.net>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Regular expression support for all services based on `Pattern`
+#
+# Implemented using libc regular expressions.
+#
+# The main entities are `Text::to_re` and `Regex`.
+module re
+
+import string_search
+import gc
+import error
+
+in "C Header" `{
+       #include <sys/types.h>
+       #include <regex.h>
+`}
+
+# Main extern class to wrap libc regular expression support
+#
+# It is recommanded to use the higher level API offered by the class `Regex`,
+# but it can still be used for advanced purpose or in optimized code.
+#
+# To use this class and other `private` entities of this module, use `intrude import standard::re`
+private extern class NativeRegex `{ regex_t* `}
+       # Allocate a new `NativeRegex`, it must then be compiled using `regcomp` before calling `regexec`
+       new malloc `{ return malloc(sizeof(regex_t)); `}
+
+       # Compile the regular expression `regex` into a form that is suitable for subsequent `regexec` searches
+       fun regcomp(regex: NativeString, cflags: Int): Int `{
+               return regcomp(recv, regex, cflags);
+       `}
+
+       # Match `string` against the precompiled pattern buffer of `self`, locating matches
+       #
+       # `nmatch` and `pmatch` are used to provide information regarding the location of any matches.
+       # `eflags` may be the bitwise-or of one or both of `flag_notbol` and `flag_noteol`.
+       fun regexec(string: NativeString, nmatch: Int, pmatch: NativeMatchArray, eflags: Int): Int `{
+               return regexec(recv, string, nmatch, pmatch, eflags);
+       `}
+
+       # Match `string` against the precompiled pattern buffer of `self`, do not locate matches
+       #
+       # `eflags` may be the bitwise-or of one or both of `flag_notbol` and `flag_noteol`.
+       fun regexec_match_only(string: NativeString, eflags: Int): Int `{
+               return regexec(recv, string, 0, NULL, eflags);
+       `}
+
+       # Free the memory allocated to the pattern buffer by the compiling process
+       #
+       # Does not free the memory holding `self`, use `free` for this purpose.
+       fun regfree `{ regfree(recv); `}
+
+       # Turn the error codes that can be returned by both `regcomp` and `regexec` into error message strings
+       fun regerror(errcode: Int): NativeString `{
+               size_t len = regerror(errcode, recv, NULL, 0);
+               char *message = malloc(len);
+               regerror(errcode, recv, message, len);
+
+               return message;
+       `}
+
+       # This field holds the number of parenthetical subexpressions in the regular expression that was compiled.
+       fun re_nsub: Int `{ return recv->re_nsub; `}
+end
+
+# Flags for `NativeRegex::regcomp`
+
+private fun flag_extended: Int `{ return REG_EXTENDED; `}
+private fun flag_icase: Int `{ return REG_ICASE; `}
+private fun flag_nosub: Int `{ return REG_NOSUB; `}
+private fun flag_newline: Int `{ return REG_NEWLINE; `}
+
+# Flags for `NativeRegex::regexec`
+
+private fun flag_notbol: Int `{ return REG_NOTBOL; `}
+private fun flag_noteol: Int `{ return REG_NOTEOL; `}
+
+# Errors of `NativeRegex::regexec`
+
+private fun error_nomatch: Int `{ return REG_NOMATCH; `}
+private fun error_espace: Int `{ return REG_ESPACE; `}
+
+redef universal Int
+       private fun is_nomatch: Bool `{ return recv == REG_NOMATCH; `}
+end
+
+# An array of `regmatch_t` or a pointer to one
+private extern class NativeMatchArray `{ regmatch_t* `}
+       # Allocate a new array of `length` `regmatch_t`
+       new malloc(length: Int) `{ return malloc(length * sizeof(regmatch_t)); `}
+
+       # The offset in string of the beginning of a substring
+       fun rm_so: Int `{ return recv->rm_so; `}
+
+       # The offset in string of the end of the substring
+       fun rm_eo: Int `{ return recv->rm_eo; `}
+
+       # Get a pointer to the element at `index`, can also be used as a subarray
+       fun [](index: Int): NativeMatchArray `{ return recv + index; `}
+end
+
+redef extern class NativeString
+       private fun substring_from(index: Int): NativeString `{ return recv + index; `}
+end
+
+redef class Text
+       # Get a `Regex` instance from `self`
+       fun to_re: Regex do return new Regex(self.to_s)
+end
+
+# A regular expression pattern
+#
+# Used as a `Pattern` on intances of `Text` to call `has`, `search_all`, `replace`, etc.
+#
+# Example:
+#
+#     var re = "ab+a".to_re
+#     assert "aabbbbaaaaba".search_all(re).join(", ") == "abbbba, aba"
+#     assert "aabbbbaaaaba".has(re)
+#     assert "aabbbbaaaaba".replace(re, "+") == "a+aa+"
+#     assert "aabbbbaaaaba".split(re) == ["a", "aa", ""]
+class Regex
+       super Finalizable
+       super Pattern
+
+       # The `String` source of this regular expression
+       var string: String is writable
+
+       # Treat the pattern as a POSIX extended regular expression (the default)
+       #
+       # If `false`, it is treated as a POSIX basic regular expression (BRE).
+       #
+       # The extended syntax supports `?`, `+` and `|`. Also, `\` causes the following
+       # character to be used as literal.
+       var extended = true is writable
+
+       # Ignore case when matching letters
+       var ignore_case = false is writable
+
+       # Optimize `self` for `is_in` and `String::has`, but do not support searches
+       #
+       # If `true`, `self` cannont be used with `String::search_all`, `String::replace`
+       # or `String::split`.
+       var optimize_is_in = false is writable
+
+       # Treat a newline in string as dividing string into multiple lines
+       #
+       # So that `$` can match before the newline and `^` can match after.
+       # Also, don’t permit `.` to match a newline, and don’t permit `[^…]` to match a newline.
+       #
+       # Otherwise, newline acts like any other ordinary character.
+       var newline = false is writable
+
+       # Do not regard the beginning of the specified string as the beginning of a line
+       #
+       # More generally, don’t make any assumptions about what text might precede it.
+       var not_bol = false is writable
+
+       # Do not regard the end of the specified string as the end of a line
+       #
+       # More generally, don’t make any assumptions about what text might follow it.
+       var not_eol = false is writable
+
+       # Cache of the last used compiled regular expression
+       private var native: nullable NativeRegex = null
+
+       # Cache of a single `regmatch_t` to prevent many calls to `malloc`
+       private var native_match = new NativeMatchArray.malloc(1) is lazy
+
+       # `cflags` of the last successful `compile`
+       private var cflags_cache = 0
+
+       # `string` of the last successful `compile`
+       private var string_cache: nullable String = null
+
+       # Compile the regular expression, if needed
+       #
+       # Return `null` on success and an `Error` otherwise.
+       #
+       # This method is always called by `get_match` and `has_match`, but the user
+       # should call it to check for errors.
+       #
+       #     assert "ab".to_re.compile == null
+       #     assert "[ab".to_re.compile.message == "Unmatched [ or [^"
+       fun compile: nullable Error
+       do
+               var cflags = 0
+               if extended then cflags = cflags.bin_or(flag_extended)
+               if ignore_case then cflags = cflags.bin_or(flag_icase)
+               if optimize_is_in then cflags = cflags.bin_or(flag_nosub)
+               if newline then cflags = cflags.bin_or(flag_newline)
+
+               var native = self.native
+               var need_compilation = native == null or cflags != cflags_cache or string != string_cache
+
+               if need_compilation then
+
+                       # Initial allocation
+                       if native == null then
+                               native = new NativeRegex.malloc
+                               self.native = native
+                       end
+
+                       var res = native.regcomp(string.to_cstring, cflags)
+
+                       # All is good
+                       if res == 0 then
+                               # Update the cache
+                               self.native = native
+
+                               # We store these to know if we need to recompile or not
+                               self.cflags_cache = cflags
+                               self.string_cache = string
+
+                               return null
+                       end
+
+                       var error_cstr = native.regerror(res)
+
+                       # We leave it to the lib to decide how to allocate the string that we keep
+                       var error_str = error_cstr.to_s_with_copy
+                       error_cstr.free
+
+                       return new Error(error_str)
+               end
+
+               return null
+       end
+
+       redef fun finalize
+       do
+               var native = self.native
+               if native != null then
+                       native.regfree
+                       native.free
+                       self.native = null
+                       self.native_match.free
+               end
+       end
+
+       private fun gather_eflags: Int
+       do
+               var eflags = 0
+               if not_bol then eflags = eflags.bin_or(flag_notbol)
+               if not_eol then eflags = eflags.bin_or(flag_noteol)
+               return eflags
+       end
+
+       private fun get_error(errcode: Int): String
+       do
+               # Error, should be out of memory but we cover any possible error anyway
+               var error_cstr = native.regerror(errcode)
+
+               # We leave it to the lib to decide how to allocate the string that we keep
+               var error_str = error_cstr.to_s_with_copy
+               error_cstr.free
+
+               return error_str
+       end
+
+       #     assert "ab".to_re.is_in("abcd")
+       #     assert "ab".to_re.is_in("cdab")
+       #     assert not "ab".to_re.is_in("acdb")
+       #     assert "ab".to_re.is_in("ab")
+       redef fun is_in(text)
+       do
+               var comp_res = compile
+               assert comp_res == null else "Regex compilation failed with: {comp_res.message}\n".output
+
+               # Actually execute
+               var eflags = gather_eflags
+               var res = native.regexec_match_only(text.to_cstring, eflags)
+
+               # Got a match?
+               if res == 0 then return true
+
+               # Got no match, not an error?
+               if res.is_nomatch then return false
+
+               # Error, should be out of memory but we cover any possible error anyway
+               var error_str = get_error(res)
+               "Regex search failed with: {error_str}\n".output
+               abort
+       end
+
+       # require: not optimize_is_in
+       #
+       #     assert "l".to_re.search_index_in("hello world", 0) == 2
+       #     assert "el+o".to_re.search_index_in("hello world", 0) == 1
+       #     assert "l+".to_re.search_index_in("hello world", 3) == 3
+       #     assert "z".to_re.search_index_in("hello world", 0) == -1
+       redef fun search_index_in(text, from)
+       do
+               assert not optimize_is_in
+
+               var comp_res = compile
+               assert comp_res == null else "Regex compilation failed with: {comp_res.message}\n".output
+
+               # Actually execute
+               text = text.to_s
+               var cstr = text.substring_from(from).to_cstring
+               var eflags = gather_eflags
+               var match = self.native_match
+
+               var res = native.regexec(cstr, 1, match, eflags)
+
+               # Found one?
+               if res == 0 then return match.rm_so + from
+
+               # No more match?
+               if res.is_nomatch then return -1
+
+               # Error, should be out of memory but we cover any possible error anyway
+               var error_str = get_error(res)
+               "Regex search failed with: {error_str}\n".output
+               abort
+       end
+
+       # require: not optimize_is_in
+       #
+       #     assert "l".to_re.search_in("hello world", 0).from == 2
+       #     assert "el+o".to_re.search_in("hello world", 0).from == 1
+       #     assert "l+".to_re.search_in("hello world", 3).from == 3
+       #     assert "z".to_re.search_in("hello world", 0) == null
+       redef fun search_in(text, from)
+       do
+               assert not optimize_is_in
+
+               var comp_res = compile
+               assert comp_res == null else "Regex compilation failed with: {comp_res.message}\n".output
+
+               # Actually execute
+               text = text.to_s
+               var cstr = text.substring_from(from).to_cstring
+               var eflags = gather_eflags
+               var match = self.native_match
+               var matches = new Array[Match]
+
+               var res = native.regexec(cstr, 1, match, eflags)
+
+               # Found one?
+               if res == 0 then return new Match(text, from + match.rm_so, match.rm_eo - match.rm_so)
+
+               # No more match?
+               if res.is_nomatch then return null
+
+               # Error, should be out of memory but we cover any possible error anyway
+               var error_str = get_error(res)
+               "Regex search failed with: {error_str}\n".output
+               abort
+       end
+
+       # require: not optimize_is_in
+       #
+       #     assert "ab".to_re.search_all_in("abbab").join(", ") == "ab, ab"
+       #     assert "b+".to_re.search_all_in("abbabaabbbbbcab").join(", ") == "bb, b, bbbbb, b"
+       redef fun search_all_in(text)
+       do
+               assert not optimize_is_in
+
+               var comp_res = compile
+               assert comp_res == null else "Regex compilation failed with: {comp_res.message}\n".output
+
+               # Actually execute
+               text = text.to_s
+               var cstr = text.to_cstring
+               var eflags = gather_eflags
+               var eflags_or_notbol = eflags.bin_or(flag_notbol)
+               var match = self.native_match
+               var matches = new Array[Match]
+
+               var res = native.regexec(cstr, 1, match, eflags)
+               var d = 0
+               while res == 0 do
+                       matches.add new Match(text, d + match.rm_so, match.rm_eo - match.rm_so)
+                       if d == match.rm_eo then
+                               d += 1
+                       else d = d + match.rm_eo
+                       cstr = cstr.substring_from(match.rm_eo)
+                       res = native.regexec(cstr, 1, match, eflags_or_notbol)
+               end
+
+               # No more match?
+               if res.is_nomatch then return matches
+
+               # Error, should be out of memory but we cover any possible error anyway
+               var error_str = get_error(res)
+               "Regex search failed with: {error_str}\n".output
+               abort
+       end
+
+       redef fun to_s do return "/{string}/"
+end
index 21ff465..4550113 100644 (file)
@@ -31,3 +31,4 @@ import bitset
 import queue
 import numeric
 import error
+import re
index 2ae29ef..a81bdd6 100644 (file)
@@ -157,13 +157,6 @@ abstract class Text
                return self.chars.iterator
        end
 
-       # Is 'c' contained in self ?
-       #
-       # DEPRECATED : Use self.chars.has instead
-       fun has(c: Char): Bool
-       do
-               return self.chars.has(c)
-       end
 
        # Gets an Array containing the chars of self
        #
@@ -631,6 +624,14 @@ abstract class Text
                end
        end
 
+       # Escape string used in labels for graphviz
+       #
+       #   assert ">><<".escape_to_dot == "\\>\\>\\<\\<"
+       fun escape_to_dot: String
+       do
+               return escape_more_to_c("|\{\}<>")
+       end
+
        # Flat representation of self
        fun flatten: FlatText is abstract
 
@@ -658,6 +659,10 @@ end
 abstract class FlatText
        super Text
 
+       # Underlying C-String (`char*`)
+       #
+       # Warning : Might be void in some subclasses, be sure to check
+       # if set before using it.
        private var items: NativeString
 
        # Real items, used as cache for to_cstring is called
@@ -825,6 +830,38 @@ abstract class String
 
                return new_str.to_s
        end
+
+       # Returns a capitalized `self`
+       #
+       # Letters that follow a letter are lowercased
+       # Letters that follow a non-letter are upcased.
+       #
+       # SEE : `Char::is_letter` for the definition of letter.
+       #
+       #    assert "jAVASCRIPT".capitalized == "Javascript"
+       #    assert "i am root".capitalized == "I Am Root"
+       #    assert "ab_c -ab0c ab\nc".capitalized == "Ab_C -Ab0C Ab\nC"
+       fun capitalized: SELFTYPE do
+               if length == 0 then return self
+
+               var buf = new FlatBuffer.with_capacity(length)
+
+               var curr = chars[0].to_upper
+               var prev = curr
+               buf[0] = curr
+
+               for i in [1 .. length[ do
+                       prev = curr
+                       curr = self[i]
+                       if prev.is_letter then
+                               buf[i] = curr.to_lower
+                       else
+                               buf[i] = curr.to_upper
+                       end
+               end
+
+               return buf.to_s
+       end
 end
 
 private class FlatSubstringsIter
@@ -972,15 +1009,15 @@ class FlatString
 
        redef fun to_cstring: NativeString
        do
-               if real_items != null then return real_items.as(not null)
-               if index_from > 0 or index_to != items.cstring_length - 1 then
+               if real_items != null then
+                       return real_items.as(not null)
+               else
                        var newItems = calloc_string(length + 1)
                        self.items.copy_to(newItems, length, index_from, 0)
                        newItems[length] = '\0'
                        self.real_items = newItems
                        return newItems
                end
-               return items
        end
 
        redef fun ==(other)
@@ -1202,6 +1239,14 @@ abstract class Buffer
        # Specific implementations MUST set this to `true` in order to invalidate caches
        protected var is_dirty = true
 
+       # Copy-On-Write flag
+       #
+       # If the `Buffer` was to_s'd, the next in-place altering
+       # operation will cause the current `Buffer` to be re-allocated.
+       #
+       # The flag will then be set at `false`.
+       protected var written = false
+
        # Modifies the char contained at pos `index`
        #
        # DEPRECATED : Use self.chars.[]= instead
@@ -1264,6 +1309,38 @@ abstract class Buffer
        #     assert b == "hello world!"
        fun lower is abstract
 
+       # Capitalizes each word in `self`
+       #
+       # Letters that follow a letter are lowercased
+       # Letters that follow a non-letter are upcased.
+       #
+       # SEE: `Char::is_letter` for the definition of a letter.
+       #
+       #    var b = new FlatBuffer.from("jAVAsCriPt")"
+       #    b.capitalize
+       #    assert b == "Javascript"
+       #    b = new FlatBuffer.from("i am root")
+       #    b.capitalize
+       #    assert b == "I Am Root"
+       #    b = new FlatBuffer.from("ab_c -ab0c ab\nc")
+       #    b.capitalize
+       #    assert b == "Ab_C -Ab0C Ab\nC"
+       fun capitalize do
+               if length == 0 then return
+               var c = self[0].to_upper
+               self[0] = c
+               var prev: Char = c
+               for i in [1 .. length[ do
+                       prev = c
+                       c = self[i]
+                       if prev.is_letter then
+                               self[i] = c.to_lower
+                       else
+                               self[i] = c.to_upper
+                       end
+               end
+       end
+
        redef fun hash
        do
                if is_dirty then hash_cache = null
@@ -1288,6 +1365,17 @@ class FlatBuffer
 
        redef fun substrings do return new FlatSubstringsIter(self)
 
+       # Re-copies the `NativeString` into a new one and sets it as the new `Buffer`
+       #
+       # This happens when an operation modifies the current `Buffer` and
+       # the Copy-On-Write flag `written` is set at true.
+       private fun reset do
+               var nns = new NativeString(capacity)
+               items.copy_to(nns, length, 0, 0)
+               items = nns
+               written = false
+       end
+
        redef fun [](index)
        do
                assert index >= 0
@@ -1302,6 +1390,7 @@ class FlatBuffer
                        add(item)
                        return
                end
+               if written then reset
                assert index >= 0 and index < length
                items[index] = item
        end
@@ -1316,6 +1405,7 @@ class FlatBuffer
 
        redef fun clear do
                is_dirty = true
+               if written then reset
                length = 0
        end
 
@@ -1326,6 +1416,9 @@ class FlatBuffer
                var c = capacity
                if cap <= c then return
                while c <= cap do c = c * 2 + 2
+               # The COW flag can be set at false here, since
+               # it does a copy of the current `Buffer`
+               written = false
                var a = calloc_string(c+1)
                if length > 0 then items.copy_to(a, length, 0, 0)
                items = a
@@ -1334,7 +1427,9 @@ class FlatBuffer
 
        redef fun to_s: String
        do
-               return to_cstring.to_s_with_length(length)
+               written = true
+               if length == 0 then items = new NativeString(1)
+               return new FlatString.with_infos(items, length, 0, length - 1)
        end
 
        redef fun to_cstring
@@ -1432,6 +1527,7 @@ class FlatBuffer
 
        redef fun reverse
        do
+               written = false
                var ns = calloc_string(capacity)
                var si = length - 1
                var ni = 0
@@ -1454,6 +1550,7 @@ class FlatBuffer
 
        redef fun upper
        do
+               if written then reset
                var it = items
                var id = length - 1
                while id >= 0 do
@@ -1464,6 +1561,7 @@ class FlatBuffer
 
        redef fun lower
        do
+               if written then reset
                var it = items
                var id = length - 1
                while id >= 0 do
@@ -1951,7 +2049,9 @@ extern class NativeString `{ char* `}
        fun to_s_with_length(length: Int): FlatString
        do
                assert length >= 0
-               return new FlatString.with_infos(self, length, 0, length - 1)
+               var str = new FlatString.with_infos(self, length, 0, length - 1)
+               str.real_items = self
+               return str
        end
 
        fun to_s_with_copy: FlatString
@@ -1959,7 +2059,9 @@ extern class NativeString `{ char* `}
                var length = cstring_length
                var new_self = calloc_string(length + 1)
                copy_to(new_self, length, 0, 0)
-               return new FlatString.with_infos(new_self, length, 0, length - 1)
+               var str = new FlatString.with_infos(new_self, length, 0, length - 1)
+               str.real_items = self
+               return str
        end
 end
 
index 95ac9d5..5aeac25 100644 (file)
@@ -84,6 +84,8 @@ interface Pattern
                res.add(new Match(s.to_s, i, s.length - i))
                return res
        end
+
+       protected fun is_in(s: Text): Bool do return search_index_in(s, 0) != -1
 end
 
 # BM_Pattern are pre-compiled string motif for the Boyer-Moore algorithm.
@@ -374,4 +376,11 @@ redef class Text
        do
                return self.split_with(p).join(string)
        end
+
+       # Does `self` contains at least one instance of `pattern`?
+       #
+       #     assert "hello".has('l')
+       #     assert "hello".has("ll")
+       #     assert not "hello".has("lll")
+       fun has(pattern: Pattern): Bool do return pattern.is_in(self)
 end
index 14f8550..5feef35 100644 (file)
@@ -354,6 +354,20 @@ redef class FlatString
 
 end
 
+redef class FlatBuffer
+
+       # Fix for this particular implementation
+       #
+       # Since the to_s of a FlatBuffer now builds using
+       # the old String contructor, this breaks everything.
+       #
+       # This will disappear when UTF8 is fully-supported
+       redef fun to_s do
+               written = false
+               return to_cstring.to_s_with_length(length)
+       end
+end
+
 redef class NativeString
 
        # Creates the index for said NativeString
diff --git a/lib/template/macro.nit b/lib/template/macro.nit
new file mode 100644 (file)
index 0000000..0b1c9e4
--- /dev/null
@@ -0,0 +1,375 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# String templating using macros.
+#
+# There is plenty of macro/templating tools in the worl,
+# yet another one.
+#
+# See `TemplateString` for more details.
+module macro
+
+import template
+
+# Template with macros replacement.
+#
+# `TemplateString` provides a simple way to customize generic string templates
+# using macros and replacement.
+#
+# A macro is represented as a string identifier like `%MACRO%` in the template
+# string. Using `TemplateString`, macros can be replaced by any `Streamable` data:
+#
+#    var tpl = new TemplateString("Hello %NAME%!")
+#    tpl.replace("NAME", "Dave")
+#    assert tpl.write_to_string == "Hello Dave!"
+#
+# A macro identifier is valid if:
+#
+# * starts with an uppercase letter
+# * contains only numers, uppercase letters or '_'
+#
+# See `String::is_valid_macro_name` for more details.
+#
+# ## External template files
+#
+# When using large template files it's recommanded to use external template files.
+#
+# In external file `example.tpl`:
+#
+#    <!DOCTYPE html>
+#    <html lang="en">
+#     <head>
+#      <title>%TITLE%</title>
+#     </head>
+#     <body>
+#      <h1>%TITLE%</h1>
+#      <p>%ARTICLE%</p>
+#     </body>
+#    </html>
+#
+# Loading the template file using `TemplateString`:
+#
+#    var file = "example.tpl"
+#    if file.file_exists then
+#        tpl = new TemplateString.from_file("example.tpl")
+#        tpl.replace("TITLE", "Home Page")
+#        tpl.replace("ARTICLE", "Welcome on my site!")
+#    end
+#
+# ## Outputting
+#
+# Once macro replacement has been made, the `TemplateString` can be
+# output like any other `Template` using methods like `write_to`, `write_to_string`
+# or `write_to_file`.
+#
+#    tpl = new TemplateString("Hello %NAME%!")
+#    tpl.replace("NAME", "Dave")
+#    assert tpl.write_to_string == "Hello Dave!"
+#
+# ## Template correctness
+#
+# `TemplateString` can be outputed even if all macros were not replaced.
+# In this case, the name of the macro will be displayed wuthout any replacement.
+#
+#    tpl = new TemplateString("Hello %NAME%!")
+#    assert tpl.write_to_string == "Hello %NAME%!"
+#
+# The `check` method can be used to ensure that all macros were replaced before
+# performing the output. Warning messages will be stored in `warnings` and can
+# be used to locate unreplaced macros.
+#
+#    tpl = new TemplateString("Hello %NAME%!")
+#    if not tpl.check then
+#        assert not tpl.warnings.is_empty
+#        print "Cannot output unfinished template:"
+#        print tpl.warnings.join("\n")
+#        exit(0)
+#    else
+#        tpl.write_to sys.stdout
+#    end
+#    assert tpl.write_to_string == "Hello %NAME%!"
+class TemplateString
+       super Template
+
+       # Template original text.
+       private var tpl_text: String
+
+       # Macros contained in the template file.
+       private var macros = new HashMap[String, Array[TemplateMacro]]
+
+       # Macro identifier delimiter char (`'%'` by default).
+       #
+       # To use a different delimiter you can subclasse `TemplateString` and defined the `marker`.
+       #
+       #    class DollarTemplate
+       #        super TemplateString
+       #        redef var marker = '$'
+       #    end
+       #    var tpl = new DollarTemplate("Hello $NAME$!")
+       #    tpl.replace("NAME", "Dave")
+       #    assert tpl.write_to_string == "Hello Dave!"
+       protected var marker = '%'
+
+       # Creates a new template from a `text`.
+       #
+       #    var tpl = new TemplateString("Hello %NAME%!")
+       #    assert tpl.write_to_string == "Hello %NAME%!"
+       init(text: String) do
+               self.tpl_text = text
+               parse
+       end
+
+       # Creates a new template from the contents of `file`.
+       init from_file(file: String) do
+               init load_template_file(file)
+       end
+
+       # Loads the template file contents.
+       private fun load_template_file(tpl_file: String): String do
+               var file = new IFStream.open(tpl_file)
+               var text = file.read_all
+               file.close
+               return text
+       end
+
+       # Finds all the macros contained in `text` and store them in `macros`.
+       #
+       # Also build `self` template parts using original template text.
+       private fun parse do
+               var text = tpl_text
+               var chars = text.chars
+               var pos = 0
+               var out = new FlatBuffer
+               var start_pos: Int
+               var end_pos: Int
+               while pos < text.length do
+                       # lookup opening tag
+                       start_pos = text.read_until_char(pos, marker, out)
+                       if start_pos < 0 then
+                               text.read_until_pos(pos, text.length, out)
+                               add out.to_s
+                               break
+                       end
+                       add out.to_s
+                       pos = start_pos + 1
+                       # lookup closing tag
+                       out.clear
+                       end_pos = text.read_until_char(pos, marker, out)
+                       if end_pos < 0 then
+                               text.read_until_pos(pos, text.length, out)
+                               add "%"
+                               add out.to_s
+                               break
+                       end
+                       pos = end_pos + 1
+                       # check macro
+                       var name = out.to_s
+                       if name.is_valid_macro_name then
+                               add make_macro(name, start_pos, end_pos)
+                       else
+                               add "%"
+                               add name
+                               add "%"
+                       end
+                       out.clear
+               end
+       end
+
+       # Add a new macro to the list
+       private fun make_macro(name: String, start_pos, end_pos: Int): TemplateMacro do
+               if not macros.has_key(name) then
+                       macros[name] = new Array[TemplateMacro]
+               end
+               var macro = new TemplateMacro(name, start_pos, end_pos)
+               macros[name].add macro
+               return macro
+       end
+
+       # Available macros in `self`.
+       #
+       #    var tpl = new TemplateString("Hello %NAME%!")
+       #    assert tpl.macro_names.first == "NAME"
+       fun macro_names: Collection[String] do return macros.keys
+
+       # Does `self` contain a macro with `name`.
+       #
+       #    var tpl = new TemplateString("Hello %NAME%")
+       #    assert tpl.has_macro("NAME")
+       fun has_macro(name: String): Bool do return macro_names.has(name)
+
+       # Replace a `macro` by a streamable `replacement`.
+       #
+       # REQUIRE `has_macro(name)`
+       #
+       #    var tpl = new TemplateString("Hello %NAME%!")
+       #    tpl.replace("NAME", "Dave")
+       #    assert tpl.write_to_string == "Hello Dave!"
+       fun replace(name: String, replacement: Streamable) do
+               assert has_macro(name)
+               for macro in macros[name] do
+                       macro.replacement = replacement
+               end
+       end
+
+       # Check if all macros were replaced.
+       #
+       # Return false if a macro was not replaced and store message in `warnings`.
+       #
+       #    var tpl = new TemplateString("Hello %FIRSTNAME%, %LASTNAME%!")
+       #    assert not tpl.check
+       #    tpl.replace("FIRSTNAME", "Corben")
+       #    tpl.replace("LASTNAME", "Dallas")
+       #    assert tpl.check
+       fun check: Bool do
+               warnings.clear
+               var all_ok = true
+               for name, macros in self.macros do
+                       for macro in macros do
+                               if not macro.is_replaced then
+                                       all_ok = false
+                                       warnings.add "No replacement for macro %{macro.name}% at {macro.location}"
+                               end
+                       end
+               end
+               return all_ok
+       end
+
+       # Last `check` warnings.
+       #
+       #    var tpl = new TemplateString("Hello %FIRSTNAME%, %LASTNAME%!")
+       #    tpl.check
+       #    assert tpl.warnings.length == 2
+       #    assert tpl.warnings[0] == "No replacement for macro %FIRSTNAME% at (6:16)"
+       #    assert tpl.warnings[1] == "No replacement for macro %LASTNAME% at (19:28)"
+       #    tpl.replace("FIRSTNAME", "Corben")
+       #    tpl.replace("LASTNAME", "Dallas")
+       #    tpl.check
+       #    assert tpl.warnings.is_empty
+       var warnings = new Array[String]
+
+       # Returns a view on `self` macros on the form `macro.name`/`macro.replacement`.
+       #
+       # Given that all macros with the same name are all replaced with the same
+       # replacement, this view contains only one entry for each name.
+       #
+       #    var tpl = new TemplateString("Hello %FIRSTNAME%, %LASTNAME%!")
+       #    for name, rep in tpl do assert rep == null
+       #    tpl.replace("FIRSTNAME", "Corben")
+       #    tpl.replace("LASTNAME", "Dallas")
+       #    for name, rep in tpl do assert rep != null
+       fun iterator: MapIterator[String, nullable Streamable] do
+               return new TemplateStringIterator(self)
+       end
+end
+
+# A macro is a special text command that is replaced by other content in a `TemplateString`.
+private class TemplateMacro
+       super Template
+       # Macro name as found in the template.
+       var name: String
+
+       # Macro starting position in template.
+       var start_pos: Int
+
+       # Macro ending position in template.
+       var end_pos: Int
+
+       # Macro replacement if any.
+       var replacement: nullable Streamable = null
+
+       # Does `self` already have a `replacement`?
+       fun is_replaced: Bool do return replacement != null
+
+       # Render `replacement` or else `name`.
+       redef fun rendering do
+               if is_replaced then
+                       add replacement.as(not null)
+               else
+                       add "%{name}%"
+               end
+       end
+
+       # Human readable location.
+       fun location: String do return "({start_pos}:{end_pos})"
+end
+
+redef class String
+       # Reads `self` from pos `from` to pos `to` and store result in `buffer`.
+       private fun read_until_pos(from, to: Int, buffer: Buffer): Int do
+               if from < 0 or from >= length or
+                  to < 0 or to >= length or
+              from >= to then return -1
+               var pos = from
+               while pos < to do
+                       buffer.add self[pos]
+                       pos += 1
+               end
+               return pos
+       end
+
+       # Reads `self` until `to` is encountered and store result in `buffer`.
+       #
+       # Returns `to` position or `-1` if not found.
+       private fun read_until_char(from: Int, char: Char, buffer: Buffer): Int do
+               if from < 0 or from >= length then return -1
+               var pos = from
+               while pos > -1 and pos < length do
+                       var c = self[pos]
+                       if c == char then return pos
+                       buffer.add c
+                       pos += 1
+               end
+               return -1
+       end
+
+       # Is `self` a valid macro identifier?
+       #
+       # A macro identifier is valid if:
+       #
+       # * starts with an uppercase letter
+       # * contains only numers, uppercase letters or '_'
+       #
+       #    # valid
+       #    assert "NAME".is_valid_macro_name
+       #    assert "FIRST_NAME".is_valid_macro_name
+       #    assert "BLOCK1".is_valid_macro_name
+       #    # invalid
+       #    assert not "1BLOCK".is_valid_macro_name
+       #    assert not "_BLOCK".is_valid_macro_name
+       #    assert not "FIRST NAME".is_valid_macro_name
+       #    assert not "name".is_valid_macro_name
+       fun is_valid_macro_name: Bool do
+               if not first.is_upper then return false
+               for c in self do
+                       if not c.is_upper and c != '_' and not c.is_digit then return false
+               end
+               return true
+       end
+end
+
+private class TemplateStringIterator
+       super MapIterator[String, nullable Streamable]
+
+       private var subject: TemplateString
+       private var key_it: Iterator[String] is noinit
+
+       init do
+               self.key_it = subject.macro_names.iterator
+       end
+
+       redef fun is_ok do return key_it.is_ok
+       redef fun next do key_it.next
+       redef fun key do return key_it.item
+       redef fun item do return subject.macros[key].first.replacement
+end
similarity index 100%
rename from lib/template.nit
rename to lib/template/template.nit
diff --git a/lib/template/test_macro.nit b/lib/template/test_macro.nit
new file mode 100644 (file)
index 0000000..b2854e6
--- /dev/null
@@ -0,0 +1,211 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+module test_macro is test_suite
+
+import test_suite
+import macro
+
+class TestTemplateString
+       super TestSuite
+
+       fun test_tpl_parse_1 do
+               var tpl = """
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <title>Dave's Profile</title>
+  </head>
+  <body>
+    <h1>Dave</h1>
+       <p>Profile</p>
+  </body>
+</html>"""
+               var subject = new TemplateString(tpl)
+               var res = subject.write_to_string
+               assert res == tpl
+       end
+
+       fun test_tpl_parse_2 do
+               var tpl = """
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <title>%TITLE%</title>
+  </head>
+  <body>
+    <h1>%TITLE%</h1>
+       <p>%ARTICLE%</p>
+  </body>
+</html>"""
+               var subject = new TemplateString(tpl)
+               var res = subject.write_to_string
+               assert res == tpl
+       end
+
+       fun test_tpl_parse_3 do
+               var tpl = """
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <title>%</title>
+  </head>
+</html>"""
+               var subject = new TemplateString(tpl)
+               var res = subject.write_to_string
+               assert res == tpl
+       end
+
+       fun test_tpl_parse_4 do
+               var tpl = """
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <title>%</title>
+  </head>
+  <body>
+    <h1>%</h1>
+  </body>
+</html>"""
+               var subject = new TemplateString(tpl)
+               var res = subject.write_to_string
+               assert res == tpl
+       end
+
+       fun test_tpl_parse_5 do
+               var tpl = """
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <title>%</title>
+  </head>
+  <body>
+    <h1>%TITLE%</h1>
+       <p>%ARTICLE%</p>
+  </body>
+</html>"""
+               var subject = new TemplateString(tpl)
+               var res = subject.write_to_string
+               assert res == tpl
+       end
+
+       fun test_tpl_parse_6 do
+               var tpl = """
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <title>%</title>
+  </head>
+  <body>
+    <h1>%%</h1>
+  </body>
+</html>"""
+               var subject = new TemplateString(tpl)
+               var res = subject.write_to_string
+               assert res == tpl
+       end
+
+       fun test_tpl_replace_1 do
+               var tpl = """
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <title>%TITLE%</title>
+  </head>
+  <body>
+    <h1>%TITLE%</h1>
+       <p>%ARTICLE%</p>
+  </body>
+</html>"""
+               var exp = """
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <title>Hello World!</title>
+  </head>
+  <body>
+    <h1>Hello World!</h1>
+       <p>%ARTICLE%</p>
+  </body>
+</html>"""
+               var subject = new TemplateString(tpl)
+               subject.replace("TITLE", "Hello World!")
+               var res = subject.write_to_string
+               assert res == exp
+       end
+
+       fun test_tpl_replace_2 do
+               var tpl = """
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <title>%TITLE%</title>
+  </head>
+  <body>
+    <h1>%TITLE%</h1>
+       <p>%BODY%</p>
+  </body>
+</html>"""
+               var exp = """
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <title>Hello World!</title>
+  </head>
+  <body>
+    <h1>Hello World!</h1>
+       <p>Some body you want to know...</p>
+  </body>
+</html>"""
+               var subject = new TemplateString(tpl)
+               subject.replace("TITLE", "Hello World!")
+               subject.replace("BODY", "Some body you want to know...")
+               var res = subject.write_to_string
+               assert res == exp
+       end
+
+       fun test_tpl_replace_3 do
+               var tpl = """
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <title>%TITLE%</title>
+  </head>
+  <body>
+    <h1>%TITLE%</h1>
+       <p>%BODY%</p>
+  </body>
+</html>"""
+               var exp = """
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <title>Hello World!</title>
+  </head>
+  <body>
+    <h1>Hello World!</h1>
+       <p><a href="#">Click me!</a></p>
+  </body>
+</html>"""
+               var link = new Template
+               var subject = new TemplateString(tpl)
+               subject.replace("TITLE", "Hello World!")
+               subject.replace("BODY", link)
+               link.add "<a href=\"#\">"
+               link.add "Click me!"
+               link.add "</a>"
+               var res = subject.write_to_string
+               assert res == exp
+       end
+end
index 0b79490..d05663e 100644 (file)
@@ -28,7 +28,7 @@ abstract class TreeMap[K: Comparable, E]
        protected type N: TreeNode[K, E]
 
        # The `root` node of the tree (null if tree is empty)
-       protected var root: nullable N protected writable = null
+       protected var root: nullable N = null is protected writable
 
        # Display the tree in a gaphical windows
        # Graphviz with a working -Txlib is expected
@@ -51,7 +51,7 @@ class TreeNode[K: Comparable, E]
        var value: E
 
        # Direct parent of this node (null if the node is root)
-       var parent: nullable SELF writable = null
+       var parent: nullable SELF = null is writable
 
        redef fun to_s do return "\{{value or else ""}\}"
 
index b4f51d5..df0b984 100644 (file)
@@ -15,7 +15,7 @@
 # limitations under the License.
 
 # Serices from the X11 library
-module x11 is pkgconfig("x11")
+module x11 is pkgconfig
 
 # Open the current display from the environment variables
 #
index f12f3ed..22494b7 100644 (file)
@@ -23,12 +23,12 @@ let loaded_syntastic_nit_nitg_checker = 1
 if exists('g:syntastic_nitg')
        let s:nitg = g:syntastic_nitg
 else
-       let s:nitg = "nitc"
+       let s:nitg = "nitpick"
 endif
 
 if !executable(s:nitg)
        if exists('g:syntastic_nitg')
-               echo "Syntastic for Nit error: Custom nitg cannot be found at: " . g:syntastic_nitg
+               echo "Syntastic for Nit error: Custom tool cannot be found at: " . g:syntastic_nitg
        endif
        finish
 endif
@@ -38,7 +38,7 @@ function! SyntaxCheckers_nit_nitg_IsAvailable()
 endfunction
 
 function! SyntaxCheckers_nit_nitg_GetLocList()
-       let makeprg = s:nitg . " --no-color --only-metamodel "
+       let makeprg = s:nitg . " --no-color --only-metamodel -W "
 
        " custom NIT_DIR
        if exists('g:syntastic_nit_dir')
index 0fd73b7..a6084f7 100644 (file)
@@ -33,6 +33,15 @@ h3 {
        margin: 10px 0;
 }
 
+article {
+       padding: 10px 0px;
+}
+
+article.nospace {
+       padding: 0;
+       margin: 0;
+}
+
 /*
  * Sidebar
  */
@@ -178,10 +187,6 @@ h3 {
        display: none;
 }
 
-#content article {
-       padding: 10px 0px;
-}
-
 #content article:target {
        padding-left: 10px;
        margin-left: -10px;
@@ -221,7 +226,7 @@ h3 {
        vertical-align: middle;
 }
 
-.signature a, .list-definition a {
+.signature a, .list-definition a, .info.signature a {
        color: #0d8921;
 }
 
@@ -241,7 +246,7 @@ h3 {
        text-align: center;
 }
 
-.synopsys {
+.nitdoc .synopsys {
        margin: 5px 0;
        font-size: 16px;
        font-weight: bold;
index 44f2a21..2f3d7a1 100644 (file)
@@ -16,7 +16,7 @@
 
 NITCOPT=
 OLDNITCOPT=
-OBJS=nitdoc nitmetrics nitg nit nitx nitunit nitlight nitls nitdbg_client nitserial
+OBJS=nitg nitpick nit nitdoc nitls nitunit nitpretty nitmetrics nitx nitlight nitdbg_client nitserial
 SRCS=$(patsubst %,%.nit,$(OBJS))
 BINS=$(patsubst %,../bin/%,$(OBJS))
 
index c1d1120..5251f34 100644 (file)
@@ -21,6 +21,7 @@ import literal
 import semantize
 import platform
 import c_tools
+private import annotation
 
 # Add compiling options
 redef class ToolContext
@@ -444,13 +445,13 @@ abstract class AbstractCompiler
 
        # The main module of the program currently compiled
        # Is assigned during the separate compilation
-       var mainmodule: MModule writable
+       var mainmodule: MModule is writable
 
        # The real main module of the program
        var realmainmodule: MModule
 
        # The modeulbuilder used to know the model and the AST
-       var modelbuilder: ModelBuilder protected writable
+       var modelbuilder: ModelBuilder is protected writable
 
        # Is hardening asked? (see --hardening)
        fun hardening: Bool do return self.modelbuilder.toolcontext.opt_hardening.value
@@ -479,7 +480,7 @@ abstract class AbstractCompiler
        fun new_visitor: VISITOR is abstract
 
        # Where global declaration are stored (the main .h)
-       var header: CodeWriter writable
+       var header: CodeWriter is writable
 
        # Provide a declaration that can be requested (before or latter) by a visitor
        fun provide_declaration(key: String, s: String)
@@ -1017,10 +1018,10 @@ abstract class AbstractCompilerVisitor
        var compiler: COMPILER
 
        # The current visited AST node
-       var current_node: nullable ANode writable = null
+       var current_node: nullable ANode = null is writable
 
        # The current `Frame`
-       var frame: nullable Frame writable
+       var frame: nullable Frame is writable
 
        # Alias for self.compiler.mainmodule.object_type
        fun object_type: MClassType do return self.compiler.mainmodule.object_type
@@ -1149,12 +1150,22 @@ abstract class AbstractCompilerVisitor
        # Generate a super call from a method definition
        fun supercall(m: MMethodDef, recvtype: MClassType, args: Array[RuntimeVariable]): nullable RuntimeVariable is abstract
 
+       # Adapt the arguments of a method according to targetted `MMethodDef`
        fun adapt_signature(m: MMethodDef, args: Array[RuntimeVariable]) is abstract
 
+       # Unbox all the arguments of a method when implemented `extern` or `intern`
+       fun unbox_signature_extern(m: MMethodDef, args: Array[RuntimeVariable]) is abstract
+
        # Box or unbox a value to another type iff a C type conversion is needed
        # ENSURE: `result.mtype.ctype == mtype.ctype`
        fun autobox(value: RuntimeVariable, mtype: MType): RuntimeVariable is abstract
 
+       # Box extern classes to be used in the generated code
+       fun box_extern(value: RuntimeVariable, mtype: MType): RuntimeVariable is abstract
+
+       # Unbox extern classes to be used in extern code (legacy NI and FFI)
+       fun unbox_extern(value: RuntimeVariable, mtype: MType): RuntimeVariable is abstract
+
        #  Generate a polymorphic subtype test
        fun type_test(value: RuntimeVariable, mtype: MType, tag: String): RuntimeVariable is abstract
 
@@ -1286,6 +1297,16 @@ abstract class AbstractCompilerVisitor
                return res
        end
 
+       # The difference with `new_var` is the C static type of the local variable
+       fun new_var_extern(mtype: MType): RuntimeVariable
+       do
+               mtype = self.anchor(mtype)
+               var name = self.get_name("var")
+               var res = new RuntimeVariable(name, mtype, mtype)
+               self.add_decl("{mtype.ctype_extern} {name} /* : {mtype} for extern */;")
+               return res
+       end
+
        # Return a new uninitialized named runtime_variable
        fun new_named_var(mtype: MType, name: String): RuntimeVariable
        do
@@ -1523,7 +1544,7 @@ abstract class AbstractRuntimeFunction
        # Non cached version of `c_name`
        protected fun build_c_name: String is abstract
 
-       protected var c_name_cache: nullable String writable = null
+       protected var c_name_cache: nullable String = null is writable
 
        # Implements a call of the runtime_function
        # May inline the body or generate a C function call
@@ -1546,11 +1567,11 @@ class RuntimeVariable
        var mtype: MType
 
        # The current casted type of the variable (as known in Nit)
-       var mcasttype: MType writable
+       var mcasttype: MType is writable
 
        # If the variable exaclty a mcasttype?
        # false (usual value) means that the variable is a mcasttype or a subtype.
-       var is_exact: Bool writable = false
+       var is_exact: Bool = false is writable
 
        init(name: String, mtype: MType, mcasttype: MType)
        do
@@ -1600,21 +1621,25 @@ class Frame
        var arguments: Array[RuntimeVariable]
 
        # The runtime_variable associated to the return (in a function)
-       var returnvar: nullable RuntimeVariable writable = null
+       var returnvar: nullable RuntimeVariable = null is writable
 
        # The label at the end of the property
-       var returnlabel: nullable String writable = null
+       var returnlabel: nullable String = null is writable
 end
 
 redef class MType
        # Return the C type associated to a given Nit static type
        fun ctype: String do return "val*"
 
+       # C type outside of the compiler code and in boxes
+       fun ctype_extern: String do return "val*"
+
+       # Short name of the `ctype` to use in unions
        fun ctypename: String do return "val"
 
        # Return the name of the C structure associated to a Nit live type
        fun c_name: String is abstract
-       protected var c_name_cache: nullable String protected writable
+       protected var c_name_cache: nullable String is protected writable
 end
 
 redef class MClassType
@@ -1641,13 +1666,20 @@ redef class MClassType
                        return "char*"
                else if mclass.name == "NativeArray" then
                        return "val*"
-               else if mclass.kind == extern_kind then
-                       return "void*"
                else
                        return "val*"
                end
        end
 
+       redef fun ctype_extern: String
+       do
+               if mclass.kind == extern_kind then
+                       return "void*"
+               else
+                       return ctype
+               end
+       end
+
        redef fun ctypename: String
        do
                if mclass.name == "Int" then
@@ -1663,8 +1695,6 @@ redef class MClassType
                else if mclass.name == "NativeArray" then
                        #return "{self.arguments.first.ctype}*"
                        return "val"
-               else if mclass.kind == extern_kind then
-                       return "ptr"
                else
                        return "val"
                end
@@ -1862,6 +1892,18 @@ redef class AMethPropdef
                        v.supercall(mpropdef, arguments.first.mtype.as(MClassType), arguments)
                end
 
+               # Try special compilation
+               if mpropdef.is_intern then
+                       if compile_intern_to_c(v, mpropdef, arguments) then return
+               else if mpropdef.is_extern then
+                       if mpropdef.mproperty.is_init then
+                               if compile_externinit_to_c(v, mpropdef, arguments) then return
+                       else
+                               if compile_externmeth_to_c(v, mpropdef, arguments) then return
+                       end
+               end
+
+               # Compile block if any
                var n_block = n_block
                if n_block != null then
                        for i in [0..mpropdef.msignature.arity[ do
@@ -1869,17 +1911,13 @@ redef class AMethPropdef
                                v.assign(v.variable(variable), arguments[i+1])
                        end
                        v.stmt(n_block)
-               else if mpropdef.is_intern then
-                       compile_intern_to_c(v, mpropdef, arguments)
-               else if mpropdef.is_extern then
-                       if mpropdef.mproperty.is_init then
-                               compile_externinit_to_c(v, mpropdef, arguments)
-                       else
-                               compile_externmeth_to_c(v, mpropdef, arguments)
-                       end
-               else
-                       abort
+                       return
                end
+
+               # We have a problem
+               var cn = v.class_name_string(arguments.first)
+               v.add("PRINT_ERROR(\"Runtime error: uncompiled method `%s` called on `%s`. NOT YET IMPLEMENTED\", \"{mpropdef.mproperty.name.escape_to_c}\", {cn});")
+               v.add_raw_abort
        end
 
        redef fun can_inline
@@ -1892,7 +1930,7 @@ redef class AMethPropdef
                return false
        end
 
-       fun compile_intern_to_c(v: AbstractCompilerVisitor, mpropdef: MMethodDef, arguments: Array[RuntimeVariable])
+       fun compile_intern_to_c(v: AbstractCompilerVisitor, mpropdef: MMethodDef, arguments: Array[RuntimeVariable]): Bool
        do
                var pname = mpropdef.mproperty.name
                var cname = mpropdef.mclassdef.mclass.name
@@ -1904,243 +1942,245 @@ redef class AMethPropdef
                end
                if pname != "==" and pname != "!=" then
                        v.adapt_signature(mpropdef, arguments)
+                       v.unbox_signature_extern(mpropdef, arguments)
                end
                if cname == "Int" then
                        if pname == "output" then
                                v.add("printf(\"%ld\\n\", {arguments.first});")
-                               return
+                               return true
                        else if pname == "object_id" then
                                v.ret(arguments.first)
-                               return
+                               return true
                        else if pname == "+" then
                                v.ret(v.new_expr("{arguments[0]} + {arguments[1]}", ret.as(not null)))
-                               return
+                               return true
                        else if pname == "-" then
                                v.ret(v.new_expr("{arguments[0]} - {arguments[1]}", ret.as(not null)))
-                               return
+                               return true
                        else if pname == "unary -" then
                                v.ret(v.new_expr("-{arguments[0]}", ret.as(not null)))
-                               return
+                               return true
                        else if pname == "*" then
                                v.ret(v.new_expr("{arguments[0]} * {arguments[1]}", ret.as(not null)))
-                               return
+                               return true
                        else if pname == "/" then
                                v.ret(v.new_expr("{arguments[0]} / {arguments[1]}", ret.as(not null)))
-                               return
+                               return true
                        else if pname == "%" then
                                v.ret(v.new_expr("{arguments[0]} % {arguments[1]}", ret.as(not null)))
-                               return
+                               return true
                        else if pname == "lshift" then
                                v.ret(v.new_expr("{arguments[0]} << {arguments[1]}", ret.as(not null)))
-                               return
+                               return true
                        else if pname == "rshift" then
                                v.ret(v.new_expr("{arguments[0]} >> {arguments[1]}", ret.as(not null)))
-                               return
+                               return true
                        else if pname == "==" then
                                v.ret(v.equal_test(arguments[0], arguments[1]))
-                               return
+                               return true
                        else if pname == "!=" then
                                var res = v.equal_test(arguments[0], arguments[1])
                                v.ret(v.new_expr("!{res}", ret.as(not null)))
-                               return
+                               return true
                        else if pname == "<" then
                                v.ret(v.new_expr("{arguments[0]} < {arguments[1]}", ret.as(not null)))
-                               return
+                               return true
                        else if pname == ">" then
                                v.ret(v.new_expr("{arguments[0]} > {arguments[1]}", ret.as(not null)))
-                               return
+                               return true
                        else if pname == "<=" then
                                v.ret(v.new_expr("{arguments[0]} <= {arguments[1]}", ret.as(not null)))
-                               return
+                               return true
                        else if pname == ">=" then
                                v.ret(v.new_expr("{arguments[0]} >= {arguments[1]}", ret.as(not null)))
-                               return
+                               return true
                        else if pname == "to_f" then
                                v.ret(v.new_expr("(double){arguments[0]}", ret.as(not null)))
-                               return
+                               return true
                        else if pname == "ascii" then
                                v.ret(v.new_expr("{arguments[0]}", ret.as(not null)))
-                               return
+                               return true
                        end
                else if cname == "Char" then
                        if pname == "output" then
                                v.add("printf(\"%c\", {arguments.first});")
-                               return
+                               return true
                        else if pname == "object_id" then
                                v.ret(v.new_expr("(long){arguments.first}", ret.as(not null)))
-                               return
+                               return true
                        else if pname == "successor" then
                                v.ret(v.new_expr("{arguments[0]} + {arguments[1]}", ret.as(not null)))
-                               return
+                               return true
                        else if pname == "predecessor" then
                                v.ret(v.new_expr("{arguments[0]} - {arguments[1]}", ret.as(not null)))
-                               return
+                               return true
                        else if pname == "==" then
                                v.ret(v.equal_test(arguments[0], arguments[1]))
-                               return
+                               return true
                        else if pname == "!=" then
                                var res = v.equal_test(arguments[0], arguments[1])
                                v.ret(v.new_expr("!{res}", ret.as(not null)))
-                               return
+                               return true
                        else if pname == "<" then
                                v.ret(v.new_expr("{arguments[0]} < {arguments[1]}", ret.as(not null)))
-                               return
+                               return true
                        else if pname == ">" then
                                v.ret(v.new_expr("{arguments[0]} > {arguments[1]}", ret.as(not null)))
-                               return
+                               return true
                        else if pname == "<=" then
                                v.ret(v.new_expr("{arguments[0]} <= {arguments[1]}", ret.as(not null)))
-                               return
+                               return true
                        else if pname == ">=" then
                                v.ret(v.new_expr("{arguments[0]} >= {arguments[1]}", ret.as(not null)))
-                               return
+                               return true
                        else if pname == "to_i" then
                                v.ret(v.new_expr("{arguments[0]}-'0'", ret.as(not null)))
-                               return
+                               return true
                        else if pname == "ascii" then
                                v.ret(v.new_expr("(unsigned char){arguments[0]}", ret.as(not null)))
-                               return
+                               return true
                        end
                else if cname == "Bool" then
                        if pname == "output" then
                                v.add("printf({arguments.first}?\"true\\n\":\"false\\n\");")
-                               return
+                               return true
                        else if pname == "object_id" then
                                v.ret(v.new_expr("(long){arguments.first}", ret.as(not null)))
-                               return
+                               return true
                        else if pname == "==" then
                                v.ret(v.equal_test(arguments[0], arguments[1]))
-                               return
+                               return true
                        else if pname == "!=" then
                                var res = v.equal_test(arguments[0], arguments[1])
                                v.ret(v.new_expr("!{res}", ret.as(not null)))
-                               return
+                               return true
                        end
                else if cname == "Float" then
                        if pname == "output" then
                                v.add("printf(\"%f\\n\", {arguments.first});")
-                               return
+                               return true
                        else if pname == "object_id" then
                                v.ret(v.new_expr("(double){arguments.first}", ret.as(not null)))
-                               return
+                               return true
                        else if pname == "+" then
                                v.ret(v.new_expr("{arguments[0]} + {arguments[1]}", ret.as(not null)))
-                               return
+                               return true
                        else if pname == "-" then
                                v.ret(v.new_expr("{arguments[0]} - {arguments[1]}", ret.as(not null)))
-                               return
+                               return true
                        else if pname == "unary -" then
                                v.ret(v.new_expr("-{arguments[0]}", ret.as(not null)))
-                               return
+                               return true
                        else if pname == "succ" then
                                v.ret(v.new_expr("{arguments[0]}+1", ret.as(not null)))
-                               return
+                               return true
                        else if pname == "prec" then
                                v.ret(v.new_expr("{arguments[0]}-1", ret.as(not null)))
-                               return
+                               return true
                        else if pname == "*" then
                                v.ret(v.new_expr("{arguments[0]} * {arguments[1]}", ret.as(not null)))
-                               return
+                               return true
                        else if pname == "/" then
                                v.ret(v.new_expr("{arguments[0]} / {arguments[1]}", ret.as(not null)))
-                               return
+                               return true
                        else if pname == "==" then
                                v.ret(v.equal_test(arguments[0], arguments[1]))
-                               return
+                               return true
                        else if pname == "!=" then
                                var res = v.equal_test(arguments[0], arguments[1])
                                v.ret(v.new_expr("!{res}", ret.as(not null)))
-                               return
+                               return true
                        else if pname == "<" then
                                v.ret(v.new_expr("{arguments[0]} < {arguments[1]}", ret.as(not null)))
-                               return
+                               return true
                        else if pname == ">" then
                                v.ret(v.new_expr("{arguments[0]} > {arguments[1]}", ret.as(not null)))
-                               return
+                               return true
                        else if pname == "<=" then
                                v.ret(v.new_expr("{arguments[0]} <= {arguments[1]}", ret.as(not null)))
-                               return
+                               return true
                        else if pname == ">=" then
                                v.ret(v.new_expr("{arguments[0]} >= {arguments[1]}", ret.as(not null)))
-                               return
+                               return true
                        else if pname == "to_i" then
                                v.ret(v.new_expr("(long){arguments[0]}", ret.as(not null)))
-                               return
+                               return true
                        end
                else if cname == "NativeString" then
                        if pname == "[]" then
                                v.ret(v.new_expr("{arguments[0]}[{arguments[1]}]", ret.as(not null)))
-                               return
+                               return true
                        else if pname == "[]=" then
                                v.add("{arguments[0]}[{arguments[1]}]={arguments[2]};")
-                               return
+                               return true
                        else if pname == "copy_to" then
                                v.add("memmove({arguments[1]}+{arguments[4]},{arguments[0]}+{arguments[3]},{arguments[2]});")
-                               return
+                               return true
                        else if pname == "atoi" then
                                v.ret(v.new_expr("atoi({arguments[0]});", ret.as(not null)))
-                               return
+                               return true
                        else if pname == "init" then
                                v.ret(v.new_expr("(char*)nit_alloc({arguments[1]})", ret.as(not null)))
-                               return
+                               return true
                        end
                else if cname == "NativeArray" then
                        v.native_array_def(pname, ret, arguments)
-                       return
+                       return true
                end
                if pname == "exit" then
                        v.add("exit({arguments[1]});")
-                       return
+                       return true
                else if pname == "sys" then
                        v.ret(v.new_expr("glob_sys", ret.as(not null)))
-                       return
+                       return true
                else if pname == "calloc_string" then
                        v.ret(v.new_expr("(char*)nit_alloc({arguments[1]})", ret.as(not null)))
-                       return
+                       return true
                else if pname == "calloc_array" then
                        v.calloc_array(ret.as(not null), arguments)
-                       return
+                       return true
                else if pname == "object_id" then
                        v.ret(v.new_expr("(long){arguments.first}", ret.as(not null)))
-                       return
+                       return true
                else if pname == "is_same_type" then
                        v.ret(v.is_same_type_test(arguments[0], arguments[1]))
-                       return
+                       return true
                else if pname == "is_same_instance" then
                        v.ret(v.equal_test(arguments[0], arguments[1]))
-                       return
+                       return true
                else if pname == "output_class_name" then
                        var nat = v.class_name_string(arguments.first)
                        v.add("printf(\"%s\\n\", {nat});")
-                       return
+                       return true
                else if pname == "native_class_name" then
                        var nat = v.class_name_string(arguments.first)
                        v.ret(v.new_expr("(char*){nat}", ret.as(not null)))
-                       return
+                       return true
                else if pname == "force_garbage_collection" then
                        v.add("nit_gcollect();")
-                       return
+                       return true
                else if pname == "native_argc" then
                        v.ret(v.new_expr("glob_argc", ret.as(not null)))
-                       return
+                       return true
                else if pname == "native_argv" then
                        v.ret(v.new_expr("glob_argv[{arguments[1]}]", ret.as(not null)))
-                       return
+                       return true
                end
-               v.add("PRINT_ERROR(\"NOT YET IMPLEMENTED {class_name}:{mpropdef} at {location.to_s}\\n\");")
-               debug("Not implemented {mpropdef}")
+               return false
        end
 
-       fun compile_externmeth_to_c(v: AbstractCompilerVisitor, mpropdef: MMethodDef, arguments: Array[RuntimeVariable])
+       # Compile an extern method
+       # Return `true` if the compilation was successful, `false` if a fall-back is needed
+       fun compile_externmeth_to_c(v: AbstractCompilerVisitor, mpropdef: MMethodDef, arguments: Array[RuntimeVariable]): Bool
        do
                var externname
-               var nextern = self.n_extern
-               if nextern == null then
-                       v.add("PRINT_ERROR(\"NOT YET IMPLEMENTED nitni for {mpropdef} at {location.to_s}\\n\");")
-                       v.add("show_backtrace(1);")
-                       return
+               var at = self.get_single_annotation("extern", v.compiler.modelbuilder)
+               if at != null then
+                       externname = at.arg_as_string(v.compiler.modelbuilder)
+                       if externname == null then return false
+               else
+                       return false
                end
-               externname = nextern.text.substring(1, nextern.text.length-2)
                if location.file != null then
                        var file = location.file.filename
                        v.add_extern(file)
@@ -2149,40 +2189,48 @@ redef class AMethPropdef
                var ret = mpropdef.msignature.return_mtype
                if ret != null then
                        ret = v.resolve_for(ret, arguments.first)
-                       res = v.new_var(ret)
+                       res = v.new_var_extern(ret)
                end
                v.adapt_signature(mpropdef, arguments)
+               v.unbox_signature_extern(mpropdef, arguments)
 
                if res == null then
                        v.add("{externname}({arguments.join(", ")});")
                else
                        v.add("{res} = {externname}({arguments.join(", ")});")
+                       res = v.box_extern(res, ret.as(not null))
                        v.ret(res)
                end
+               return true
        end
 
-       fun compile_externinit_to_c(v: AbstractCompilerVisitor, mpropdef: MMethodDef, arguments: Array[RuntimeVariable])
+       # Compile an extern factory
+       # Return `true` if the compilation was successful, `false` if a fall-back is needed
+       fun compile_externinit_to_c(v: AbstractCompilerVisitor, mpropdef: MMethodDef, arguments: Array[RuntimeVariable]): Bool
        do
                var externname
-               var nextern = self.n_extern
-               if nextern == null then
-                       v.add("PRINT_ERROR(\"NOT YET IMPLEMENTED nitni for {mpropdef} at {location.to_s}\\n\");")
-                       v.add("show_backtrace(1);")
-                       return
+               var at = self.get_single_annotation("extern", v.compiler.modelbuilder)
+               if at != null then
+                       externname = at.arg_as_string(v.compiler.modelbuilder)
+                       if externname == null then return false
+               else
+                       return false
                end
-               externname = nextern.text.substring(1, nextern.text.length-2)
                if location.file != null then
                        var file = location.file.filename
                        v.add_extern(file)
                end
                v.adapt_signature(mpropdef, arguments)
+               v.unbox_signature_extern(mpropdef, arguments)
                var ret = arguments.first.mtype
-               var res = v.new_var(ret)
+               var res = v.new_var_extern(ret)
 
                arguments.shift
 
                v.add("{res} = {externname}({arguments.join(", ")});")
+               res = v.box_extern(res, ret)
                v.ret(res)
+               return true
        end
 end
 
@@ -2875,7 +2923,7 @@ redef class ANewExpr
                        return v.native_array_instance(elttype, l)
                else if ctype == "val*" then
                        recv = v.init_instance(mtype)
-               else if ctype == "void*" then
+               else if ctype == "char*" then
                        recv = v.new_expr("NULL/*special!*/", mtype)
                else
                        recv = v.new_expr("({ctype})0/*special!*/", mtype)
index c06a374..6fec966 100644 (file)
@@ -19,8 +19,8 @@ module android_platform
 
 import platform
 import abstract_compiler
-import common_ffi
-intrude import common_ffi::extra_java_files
+import ffi
+intrude import ffi::extra_java_files
 import android_annotations
 
 redef class ToolContext
index f3ac581..37689d8 100644 (file)
@@ -18,7 +18,7 @@
 module compiler_ffi
 
 intrude import abstract_compiler
-intrude import common_ffi
+intrude import ffi
 import nitni
 
 redef class MModule
@@ -110,8 +110,6 @@ redef class AMethPropdef
                amodule.ensure_compile_ffi_wrapper
                compile_ffi_method(mmodule)
 
-               assert self isa AExternPropdef
-
                # nitni - Compile missing callbacks
                mmodule.ensure_compile_nitni_base(v)
                var ccu = mmodule.nitni_ccu.as(not null)
@@ -144,15 +142,10 @@ redef class AMethPropdef
 
        redef fun compile_externmeth_to_c(v, mpropdef, arguments)
        do
-               var mmodule = mpropdef.mclassdef.mmodule
-
                # if using the old native interface fallback on previous implementation
-               var nextern = self.n_extern
-               if nextern != null then
-                       super
-                       return
-               end
+               if n_extern_code_block == null then return super
 
+               var mmodule = mpropdef.mclassdef.mmodule
                mmodule.uses_ffi = true
 
                var mclass_type = mpropdef.mclassdef.bound_mtype
@@ -167,6 +160,7 @@ redef class AMethPropdef
                end
 
                v.adapt_signature(mpropdef, arguments)
+               v.unbox_signature_extern(mpropdef, arguments)
 
                var arguments_for_c = new Array[String]
                for a in [0..arguments.length[ do
@@ -199,23 +193,20 @@ redef class AMethPropdef
                                v.add("ret_var = {externname}({arguments_for_c.join(", ")});")
                                v.add("{recv_var} = ret_var->value;")
                        end
+                       recv_var = v.box_extern(recv_var, return_mtype)
                        v.ret(recv_var)
                end
 
                compile_ffi_support_to_c(v)
+               return true
        end
 
        redef fun compile_externinit_to_c(v, mpropdef, arguments)
        do
-               var mmodule = mpropdef.mclassdef.mmodule
-
                # if using the old native interface fallback on previous implementation
-               var nextern = self.n_extern
-               if nextern != null then
-                       super
-                       return
-               end
+               if n_extern_code_block == null then return super
 
+               var mmodule = mpropdef.mclassdef.mmodule
                mmodule.uses_ffi = true
 
                var mclass_type = mpropdef.mclassdef.bound_mtype
@@ -225,6 +216,7 @@ redef class AMethPropdef
                var recv_var = v.new_var(return_mtype)
 
                v.adapt_signature(mpropdef, arguments)
+               v.unbox_signature_extern(mpropdef, arguments)
 
                arguments.shift
 
@@ -252,9 +244,11 @@ redef class AMethPropdef
                        v.add("ret_var = {externname}({arguments_for_c.join(", ")});")
                        v.add("{recv_var} = ret_var->value;")
                end
+               recv_var = v.box_extern(recv_var, return_mtype)
                v.ret(recv_var)
 
                compile_ffi_support_to_c(v)
+               return true
        end
 end
 
@@ -391,17 +385,14 @@ redef class MExplicitCall
                var mtype: MType = recv_mtype
                var recv_var = null
                if mproperty.is_init then
-                       if recv_mtype.mclass.kind == extern_kind then
-                               recv_var = nitni_visitor.new_var(mtype)
-                       else
-                               var recv_mtype = recv_mtype
-                               recv_var = nitni_visitor.init_instance(recv_mtype)
-                               nitni_visitor.add("{mtype.ctype} recv /* var self: {mtype} */;")
-                               nitni_visitor.add("recv = {recv_var};")
-                       end
+                       var recv_mtype = recv_mtype
+                       recv_var = nitni_visitor.init_instance(recv_mtype)
+                       nitni_visitor.add("{mtype.ctype} recv /* var self: {mtype} */;")
+                       nitni_visitor.add("recv = {recv_var};")
                else
                        mtype = mtype.anchor_to(v.compiler.mainmodule, recv_mtype)
                        recv_var = nitni_visitor.var_from_c("recv", mtype)
+                       recv_var = nitni_visitor.box_extern(recv_var, mtype)
                end
 
                vars.add(recv_var)
@@ -409,6 +400,7 @@ redef class MExplicitCall
                for p in msignature.mparameters do
                        var arg_mtype = p.mtype.anchor_to(v.compiler.mainmodule, recv_mtype)
                        var arg = nitni_visitor.var_from_c(p.name, arg_mtype)
+                       arg = nitni_visitor.box_extern(arg, arg_mtype)
                        vars.add(arg)
                end
 
@@ -423,6 +415,7 @@ redef class MExplicitCall
                        assert ret_var != null
                        return_mtype = return_mtype.anchor_to(v.compiler.mainmodule, recv_mtype)
                        ret_var = nitni_visitor.autobox(ret_var, return_mtype)
+                       ret_var = nitni_visitor.unbox_extern(ret_var, return_mtype)
                        nitni_visitor.ret_to_c(ret_var, return_mtype)
                end
                nitni_visitor.add("\}")
@@ -459,11 +452,13 @@ redef class MExplicitSuper
                var vars = new Array[RuntimeVariable]
 
                var recv_var = nitni_visitor.var_from_c("recv", mclass_type)
+               recv_var = nitni_visitor.box_extern(recv_var, mclass_type)
                vars.add(recv_var)
 
                for p in msignature.mparameters do
                        var arg_mtype = v.anchor(p.mtype)
                        var arg = nitni_visitor.var_from_c(p.name, arg_mtype)
+                       arg = nitni_visitor.box_extern(arg, arg_mtype)
                        vars.add(arg)
                end
 
@@ -473,6 +468,8 @@ redef class MExplicitSuper
                if return_mtype != null then
                        assert ret_var != null
                        return_mtype = v.anchor(return_mtype)
+                       ret_var = nitni_visitor.autobox(ret_var, return_mtype)
+                       ret_var = nitni_visitor.unbox_extern(ret_var, return_mtype)
                        nitni_visitor.ret_to_c(ret_var, return_mtype)
                end
                nitni_visitor.add("\}")
@@ -500,11 +497,14 @@ redef class MExplicitCast
                var nitni_visitor = v.compiler.new_visitor
                nitni_visitor.frame = v.frame
 
-               var full_internal_csignature = "int {v.compiler.mainmodule.name }___{from.mangled_cname}_is_a_{to.mangled_cname}({from.cname_blind} from)"
+               var full_internal_csignature = "int {v.compiler.mainmodule.name }___{from.mangled_cname}_is_a_{to.mangled_cname}({internal_call_context.name_mtype(from)} from)"
+
                nitni_visitor.add_decl("/* nitni check for {from} to {to} */")
                nitni_visitor.add_decl("{full_internal_csignature} \{")
 
-               var from_var = new RuntimeVariable("from->value", from, from)
+               #var from_var = new RuntimeVariable("from->value", from, from)
+               var from_var = nitni_visitor.var_from_c("from", from)
+               from_var = nitni_visitor.box_extern(from_var, from)
                var recv_var = nitni_visitor.type_test(from_var, to, "FFI isa")
                nitni_visitor.add("return {recv_var};")
 
@@ -531,11 +531,12 @@ redef class MExplicitCast
                nitni_visitor = v.compiler.new_visitor
                nitni_visitor.frame = v.frame
 
-               full_internal_csignature = "{to.cname_blind} {v.compiler.mainmodule.name }___{from.mangled_cname}_as_{to.mangled_cname}({from.cname_blind} from)"
+               full_internal_csignature = "{to.cname_blind} {v.compiler.mainmodule.name }___{from.mangled_cname}_as_{to.mangled_cname}({internal_call_context.name_mtype(from)} from)"
                nitni_visitor.add_decl("/* nitni cast for {from} to {to} */")
                nitni_visitor.add_decl("{full_internal_csignature} \{")
 
                from_var = nitni_visitor.var_from_c("from", from)
+               from_var = nitni_visitor.box_extern(from_var, from)
 
                ## test type
                var check = nitni_visitor.type_test(from_var, to, "FFI cast")
@@ -545,6 +546,7 @@ redef class MExplicitCast
 
                ## internal cast
                recv_var = nitni_visitor.autobox(from_var, to)
+               recv_var = nitni_visitor.unbox_extern(recv_var, to)
 
                nitni_visitor.ret_to_c(recv_var, to)
 
index 9a82243..2196071 100644 (file)
@@ -61,6 +61,9 @@ redef class ModelBuilder
                var compiler = new GlobalCompiler(mainmodule, self, runtime_type_analysis)
                compiler.compile_header
 
+               if mainmodule.model.get_mclasses_by_name("Pointer") != null then
+                       runtime_type_analysis.live_types.add(mainmodule.pointer_type)
+               end
                for t in runtime_type_analysis.live_types do
                        compiler.declare_runtimeclass(t)
                end
@@ -71,6 +74,9 @@ redef class ModelBuilder
                for t in runtime_type_analysis.live_types do
                        if t.ctype == "val*" then
                                compiler.generate_init_instance(t)
+                               if t.mclass.kind == extern_kind then
+                                       compiler.generate_box_instance(t)
+                               end
                        else
                                compiler.generate_box_instance(t)
                        end
@@ -116,7 +122,7 @@ class GlobalCompiler
                self.runtime_type_analysis = runtime_type_analysis
                self.live_primitive_types = new Array[MClassType]
                for t in runtime_type_analysis.live_types do
-                       if t.ctype != "val*" then
+                       if t.ctype != "val*" or t.mclass.name == "Pointer" then
                                self.live_primitive_types.add(t)
                        end
                end
@@ -193,11 +199,11 @@ class GlobalCompiler
                        v.add_decl("{mtype.arguments.first.ctype} values[1];")
                end
 
-               if mtype.ctype != "val*" then
+               if mtype.ctype_extern != "val*" then
                        # Is the Nit type is native then the struct is a box with two fields:
                        # * the `classid` to be polymorph
                        # * the `value` that contains the native value.
-                       v.add_decl("{mtype.ctype} value;")
+                       v.add_decl("{mtype.ctype_extern} value;")
                end
 
                # Collect all attributes and associate them a field in the structure.
@@ -252,7 +258,6 @@ class GlobalCompiler
        fun generate_box_instance(mtype: MClassType)
        do
                assert self.runtime_type_analysis.live_types.has(mtype)
-               assert mtype.ctype != "val*"
                var v = self.new_visitor
 
                self.header.add_decl("val* BOX_{mtype.c_name}({mtype.ctype});")
@@ -318,6 +323,34 @@ class GlobalCompilerVisitor
                end
        end
 
+       redef fun unbox_extern(value, mtype)
+       do
+               if mtype isa MClassType and mtype.mclass.kind == extern_kind and
+                  mtype.mclass.name != "NativeString" then
+                       var res = self.new_var_extern(mtype)
+                       self.add "{res} = ((struct {mtype.c_name}*){value})->value; /* unboxing {value.mtype} */"
+                       return res
+               else
+                       return value
+               end
+       end
+
+       redef fun box_extern(value, mtype)
+       do
+               if not mtype isa MClassType or mtype.mclass.kind != extern_kind or
+                       mtype.mclass.name == "NativeString" then return value
+
+               var valtype = value.mtype.as(MClassType)
+               var res = self.new_var(mtype)
+               if compiler.runtime_type_analysis != null and not compiler.runtime_type_analysis.live_types.has(value.mtype.as(MClassType)) then
+                       self.add("/*no boxing of {value.mtype}: {value.mtype} is not live! */")
+                       self.add("PRINT_ERROR(\"Dead code executed!\\n\"); show_backtrace(1);")
+                       return res
+               end
+               self.add("{res} = BOX_{valtype.c_name}({value}); /* boxing {value.mtype} */")
+               return res
+       end
+
        # The runtime types that are acceptable for a given receiver.
        fun collect_types(recv: RuntimeVariable): Array[MClassType]
        do
@@ -507,6 +540,7 @@ class GlobalCompilerVisitor
        do
                var recv_type = get_recvtype(m, recvtype, args)
                var recv = get_recv(recv_type, args)
+               if m.is_extern then recv = unbox_extern(recv, recv_type)
                var new_args = args.to_a
                self.varargize(m, m.msignature.as(not null), new_args)
                new_args.first = recv
@@ -519,6 +553,7 @@ class GlobalCompilerVisitor
        do
                var recv_type = get_recvtype(m, recvtype, args)
                var recv = get_recv(recv_type, args)
+               if m.is_extern then recv = unbox_extern(recv, recv_type)
                var new_args = args.to_a
                new_args.first = recv
                return finalize_call(m, recv_type, new_args)
@@ -592,6 +627,19 @@ class GlobalCompilerVisitor
                end
        end
 
+       redef fun unbox_signature_extern(m, args)
+       do
+               var recv = args.first
+               for i in [0..m.msignature.arity[ do
+                       var t = m.msignature.mparameters[i].mtype
+                       if i == m.msignature.vararg_rank then
+                               t = args[i+1].mtype
+                       end
+                       t = self.resolve_for(t, recv)
+                       if m.is_extern then args[i+1] = self.unbox_extern(args[i+1], t)
+               end
+       end
+
        # FIXME: this is currently buggy since recv is not exact
        redef fun vararg_instance(mpropdef, recv, varargs, elttype)
        do
@@ -846,6 +894,15 @@ class GlobalCompilerVisitor
                                if not t.is_subtype(self.compiler.mainmodule, null, value2.mcasttype) then continue
                                s.add "({value1}->classid == {self.compiler.classid(t)} && ((struct {t.c_name}*){value1})->value == ((struct {t.c_name}*){value2})->value)"
                        end
+
+                       if self.compiler.mainmodule.model.get_mclasses_by_name("Pointer") != null then
+                               var pointer_type = self.compiler.mainmodule.pointer_type
+                               if value1.mcasttype.is_subtype(self.compiler.mainmodule, null, pointer_type) or
+                                       value2.mcasttype.is_subtype(self.compiler.mainmodule, null, pointer_type) then
+                                       s.add "(((struct {pointer_type.c_name}*){value1})->value == ((struct {pointer_type.c_name}*){value2})->value)"
+                               end
+                       end
+
                        if s.is_empty then
                                self.add("{res} = {value1} == {value2};")
                        else
index 4dfbeb0..84bc443 100644 (file)
@@ -191,7 +191,11 @@ class SeparateCompiler
                        self.header.add_decl("void* val;")
                        for c, v in self.box_kinds do
                                var t = c.mclass_type
-                               self.header.add_decl("{t.ctype} {t.ctypename};")
+
+                               # `Pointer` reuse the `val` field
+                               if t.mclass.name == "Pointer" then continue
+
+                               self.header.add_decl("{t.ctype_extern} {t.ctypename};")
                        end
                        self.header.add_decl("\} nitattribute_t; /* general C type representing a Nit attribute. */")
                end
@@ -213,9 +217,11 @@ class SeparateCompiler
 
        fun box_kind_of(mclass: MClass): Int
        do
-               if mclass.mclass_type.ctype == "val*" then
+               #var pointer_type = self.mainmodule.pointer_type
+               #if mclass.mclass_type.ctype == "val*" or mclass.mclass_type.is_subtype(self.mainmodule, mclass.mclass_type pointer_type) then
+               if mclass.mclass_type.ctype_extern == "val*" then
                        return 0
-               else if mclass.kind == extern_kind then
+               else if mclass.kind == extern_kind and mclass.name != "NativeString" then
                        return self.box_kinds[self.mainmodule.get_primitive_class("Pointer")]
                else
                        return self.box_kinds[mclass]
@@ -662,14 +668,13 @@ class SeparateCompiler
        do
                var mtype = mclass.intro.bound_mtype
                var c_name = mclass.c_name
-               var c_instance_name = mclass.c_instance_name
 
                var vft = self.method_tables[mclass]
                var attrs = self.attr_tables[mclass]
                var v = new_visitor
 
                var rta = runtime_type_analysis
-               var is_dead = rta != null and not rta.live_classes.has(mclass) and mtype.ctype == "val*" and mclass.name != "NativeArray"
+               var is_dead = rta != null and not rta.live_classes.has(mclass) and mtype.ctype == "val*" and mclass.name != "NativeArray" and mclass.name != "Pointer"
 
                v.add_decl("/* runtime class {c_name} */")
 
@@ -698,23 +703,24 @@ class SeparateCompiler
                        v.add_decl("\};")
                end
 
-               if mtype.ctype != "val*" then
-                       if mtype.mclass.name == "Pointer" or mtype.mclass.kind != extern_kind then
-                               #Build instance struct
-                               self.header.add_decl("struct instance_{c_instance_name} \{")
-                               self.header.add_decl("const struct type *type;")
-                               self.header.add_decl("const struct class *class;")
-                               self.header.add_decl("{mtype.ctype} value;")
-                               self.header.add_decl("\};")
-                       end
+               if mtype.ctype != "val*" or mtype.mclass.name == "Pointer" then
+                       # Is a primitive type or the Pointer class, not any other extern class
 
-                       if not rta.live_types.has(mtype) then return
+                       #Build instance struct
+                       self.header.add_decl("struct instance_{c_name} \{")
+                       self.header.add_decl("const struct type *type;")
+                       self.header.add_decl("const struct class *class;")
+                       self.header.add_decl("{mtype.ctype_extern} value;")
+                       self.header.add_decl("\};")
+
+                       if not rta.live_types.has(mtype) and mtype.mclass.name != "Pointer" then return
 
                        #Build BOX
-                       self.provide_declaration("BOX_{c_name}", "val* BOX_{c_name}({mtype.ctype});")
+                       self.provide_declaration("BOX_{c_name}", "val* BOX_{c_name}({mtype.ctype_extern});")
                        v.add_decl("/* allocate {mtype} */")
-                       v.add_decl("val* BOX_{mtype.c_name}({mtype.ctype} value) \{")
-                       v.add("struct instance_{c_instance_name}*res = nit_alloc(sizeof(struct instance_{c_instance_name}));")
+                       v.add_decl("val* BOX_{mtype.c_name}({mtype.ctype_extern} value) \{")
+                       v.add("struct instance_{c_name}*res = nit_alloc(sizeof(struct instance_{c_name}));")
+                       v.compiler.undead_types.add(mtype)
                        v.require_declaration("type_{c_name}")
                        v.add("res->type = &type_{c_name};")
                        v.require_declaration("class_{c_name}")
@@ -722,10 +728,31 @@ class SeparateCompiler
                        v.add("res->value = value;")
                        v.add("return (val*)res;")
                        v.add("\}")
+
+                       if mtype.mclass.name != "Pointer" then return
+
+                       v = new_visitor
+                       self.provide_declaration("NEW_{c_name}", "{mtype.ctype} NEW_{c_name}(const struct type* type);")
+                       v.add_decl("/* allocate {mtype} */")
+                       v.add_decl("{mtype.ctype} NEW_{c_name}(const struct type* type) \{")
+                       if is_dead then
+                               v.add_abort("{mclass} is DEAD")
+                       else
+                               var res = v.new_named_var(mtype, "self")
+                               res.is_exact = true
+                               v.add("{res} = nit_alloc(sizeof(struct instance_{mtype.c_name}));")
+                               v.add("{res}->type = type;")
+                               hardening_live_type(v, "type")
+                               v.require_declaration("class_{c_name}")
+                               v.add("{res}->class = &class_{c_name};")
+                               v.add("((struct instance_{mtype.c_name}*){res})->value = NULL;")
+                               v.add("return {res};")
+                       end
+                       v.add("\}")
                        return
                else if mclass.name == "NativeArray" then
                        #Build instance struct
-                       self.header.add_decl("struct instance_{c_instance_name} \{")
+                       self.header.add_decl("struct instance_{c_name} \{")
                        self.header.add_decl("const struct type *type;")
                        self.header.add_decl("const struct class *class;")
                        # NativeArrays are just a instance header followed by a length and an array of values
@@ -738,9 +765,9 @@ class SeparateCompiler
                        v.add_decl("/* allocate {mtype} */")
                        v.add_decl("{mtype.ctype} NEW_{c_name}(int length, const struct type* type) \{")
                        var res = v.get_name("self")
-                       v.add_decl("struct instance_{c_instance_name} *{res};")
+                       v.add_decl("struct instance_{c_name} *{res};")
                        var mtype_elt = mtype.arguments.first
-                       v.add("{res} = nit_alloc(sizeof(struct instance_{c_instance_name}) + length*sizeof({mtype_elt.ctype}));")
+                       v.add("{res} = nit_alloc(sizeof(struct instance_{c_name}) + length*sizeof({mtype_elt.ctype}));")
                        v.add("{res}->type = type;")
                        hardening_live_type(v, "type")
                        v.require_declaration("class_{c_name}")
@@ -749,6 +776,30 @@ class SeparateCompiler
                        v.add("return (val*){res};")
                        v.add("\}")
                        return
+               else if mtype.mclass.kind == extern_kind and mtype.mclass.name != "NativeString" then
+                       # Is an extern class (other than Pointer and NativeString)
+                       # Pointer is caught in a previous `if`, and NativeString is internal
+
+                       var pointer_type = mainmodule.pointer_type
+
+                       self.provide_declaration("NEW_{c_name}", "{mtype.ctype} NEW_{c_name}(const struct type* type);")
+                       v.add_decl("/* allocate {mtype} */")
+                       v.add_decl("{mtype.ctype} NEW_{c_name}(const struct type* type) \{")
+                       if is_dead then
+                               v.add_abort("{mclass} is DEAD")
+                       else
+                               var res = v.new_named_var(mtype, "self")
+                               res.is_exact = true
+                               v.add("{res} = nit_alloc(sizeof(struct instance_{pointer_type.c_name}));")
+                               v.add("{res}->type = type;")
+                               hardening_live_type(v, "type")
+                               v.require_declaration("class_{c_name}")
+                               v.add("{res}->class = &class_{c_name};")
+                               v.add("((struct instance_{pointer_type.c_name}*){res})->value = NULL;")
+                               v.add("return {res};")
+                       end
+                       v.add("\}")
+                       return
                end
 
                #Build NEW
@@ -909,6 +960,22 @@ class SeparateCompilerVisitor
                end
        end
 
+       redef fun unbox_signature_extern(m, args)
+       do
+               var msignature = m.msignature.resolve_for(m.mclassdef.bound_mtype, m.mclassdef.bound_mtype, m.mclassdef.mmodule, true)
+               var recv = args.first
+               if not m.mproperty.is_init and m.is_extern then
+                       args.first = self.unbox_extern(args.first, m.mclassdef.mclass.mclass_type)
+               end
+               for i in [0..msignature.arity[ do
+                       var t = msignature.mparameters[i].mtype
+                       if i == msignature.vararg_rank then
+                               t = args[i+1].mtype
+                       end
+                       if m.is_extern then args[i+1] = self.unbox_extern(args[i+1], t)
+               end
+       end
+
        redef fun autobox(value, mtype)
        do
                if value.mtype == mtype then
@@ -916,9 +983,12 @@ class SeparateCompilerVisitor
                else if value.mtype.ctype == "val*" and mtype.ctype == "val*" then
                        return value
                else if value.mtype.ctype == "val*" then
-                       return self.new_expr("((struct instance_{mtype.c_instance_name}*){value})->value; /* autounbox from {value.mtype} to {mtype} */", mtype)
+                       return self.new_expr("((struct instance_{mtype.c_name}*){value})->value; /* autounbox from {value.mtype} to {mtype} */", mtype)
                else if mtype.ctype == "val*" then
                        var valtype = value.mtype.as(MClassType)
+                       if mtype isa MClassType and mtype.mclass.kind == extern_kind and mtype.mclass.name != "NativeString" then
+                               valtype = compiler.mainmodule.pointer_type
+                       end
                        var res = self.new_var(mtype)
                        if compiler.runtime_type_analysis != null and not compiler.runtime_type_analysis.live_types.has(valtype) then
                                self.add("/*no autobox from {value.mtype} to {mtype}: {value.mtype} is not live! */")
@@ -941,6 +1011,42 @@ class SeparateCompilerVisitor
                end
        end
 
+       redef fun unbox_extern(value, mtype)
+       do
+               if mtype isa MClassType and mtype.mclass.kind == extern_kind and
+                  mtype.mclass.name != "NativeString" then
+                       var pointer_type = compiler.mainmodule.pointer_type
+                       var res = self.new_var_extern(mtype)
+                       self.add "{res} = ((struct instance_{pointer_type.c_name}*){value})->value; /* unboxing {value.mtype} */"
+                       return res
+               else
+                       return value
+               end
+       end
+
+       redef fun box_extern(value, mtype)
+       do
+               if mtype isa MClassType and mtype.mclass.kind == extern_kind and
+                  mtype.mclass.name != "NativeString" then
+                       var valtype = compiler.mainmodule.pointer_type
+                       var res = self.new_var(mtype)
+                       if compiler.runtime_type_analysis != null and not compiler.runtime_type_analysis.live_types.has(value.mtype.as(MClassType)) then
+                               self.add("/*no boxing of {value.mtype}: {value.mtype} is not live! */")
+                               self.add("PRINT_ERROR(\"Dead code executed!\\n\"); show_backtrace(1);")
+                               return res
+                       end
+                       self.require_declaration("BOX_{valtype.c_name}")
+                       self.add("{res} = BOX_{valtype.c_name}({value}); /* boxing {value.mtype} */")
+                       self.require_declaration("type_{mtype.c_name}")
+                       self.add("{res}->type = &type_{mtype.c_name};")
+                       self.require_declaration("class_{mtype.c_name}")
+                       self.add("{res}->class = &class_{mtype.c_name};")
+                       return res
+               else
+                       return value
+               end
+       end
+
        # Return a C expression returning the runtime type structure of the value
        # The point of the method is to works also with primitives types.
        fun type_info(value: RuntimeVariable): String
@@ -995,13 +1101,13 @@ class SeparateCompilerVisitor
                return table_send(mmethod, arguments, mmethod.const_color)
        end
 
-       # Handel common special cases before doing the effective method invocation
+       # Handle common special cases before doing the effective method invocation
        # This methods handle the `==` and `!=` methods and the case of the null receiver.
        # Note: a { is open in the generated C, that enclose and protect the effective method invocation.
        # Client must not forget to close the } after them.
        #
        # The value returned is the result of the common special cases.
-       # If not null, client must compine it with the result of their own effective method invocation.
+       # If not null, client must compile it with the result of their own effective method invocation.
        #
        # If `before_send` can shortcut the whole message sending, a dummy `if(0){`
        # is generated to cancel the effective method invocation that will follow
@@ -1307,7 +1413,7 @@ class SeparateCompilerVisitor
                                # The attribute is primitive, thus we store it in a box
                                # The trick is to create the box the first time then resuse the box
                                self.add("if ({attr} != NULL) \{")
-                               self.add("((struct instance_{mtype.c_instance_name}*){attr})->value = {value}; /* {a} on {recv.inspect} */")
+                               self.add("((struct instance_{mtype.c_name}*){attr})->value = {value}; /* {a} on {recv.inspect} */")
                                self.add("\} else \{")
                                value = self.autobox(value, self.object_type.as_nullable)
                                self.add("{attr} = {value}; /* {a} on {recv.inspect} */")
@@ -1481,7 +1587,8 @@ class SeparateCompilerVisitor
                self.add_decl("const char* {res};")
                if value.mtype.ctype == "val*" then
                        self.add "{res} = {value} == NULL ? \"null\" : {value}->type->name;"
-               else if value.mtype isa MClassType and value.mtype.as(MClassType).mclass.kind == extern_kind then
+               else if value.mtype isa MClassType and value.mtype.as(MClassType).mclass.kind == extern_kind and
+                       value.mtype.as(MClassType).name != "NativeString" then
                        self.add "{res} = \"{value.mtype.as(MClassType).mclass}\";"
                else
                        self.require_declaration("type_{value.mtype.c_name}")
@@ -1564,12 +1671,12 @@ class SeparateCompilerVisitor
                        end
                end
                if primitive != null then
-                       test.add("((struct instance_{primitive.c_instance_name}*){value1})->value == ((struct instance_{primitive.c_instance_name}*){value2})->value")
+                       test.add("((struct instance_{primitive.c_name}*){value1})->value == ((struct instance_{primitive.c_name}*){value2})->value")
                else if can_be_primitive(value1) and can_be_primitive(value2) then
                        test.add("{value1}->class == {value2}->class")
                        var s = new Array[String]
                        for t, v in self.compiler.box_kinds do
-                               s.add "({value1}->class->box_kind == {v} && ((struct instance_{t.c_instance_name}*){value1})->value == ((struct instance_{t.c_instance_name}*){value2})->value)"
+                               s.add "({value1}->class->box_kind == {v} && ((struct instance_{t.c_name}*){value1})->value == ((struct instance_{t.c_name}*){value2})->value)"
                        end
                        test.add("({s.join(" || ")})")
                else
@@ -1635,7 +1742,7 @@ class SeparateCompilerVisitor
        do
                var elttype = arguments.first.mtype
                var nclass = self.get_class("NativeArray")
-               var recv = "((struct instance_{nclass.c_instance_name}*){arguments[0]})->values"
+               var recv = "((struct instance_{nclass.c_name}*){arguments[0]})->values"
                if pname == "[]" then
                        self.ret(self.new_expr("{recv}[{arguments[1]}]", ret_type.as(not null)))
                        return
@@ -1643,10 +1750,10 @@ class SeparateCompilerVisitor
                        self.add("{recv}[{arguments[1]}]={arguments[2]};")
                        return
                else if pname == "length" then
-                       self.ret(self.new_expr("((struct instance_{nclass.c_instance_name}*){arguments[0]})->length", ret_type.as(not null)))
+                       self.ret(self.new_expr("((struct instance_{nclass.c_name}*){arguments[0]})->length", ret_type.as(not null)))
                        return
                else if pname == "copy_to" then
-                       var recv1 = "((struct instance_{nclass.c_instance_name}*){arguments[1]})->values"
+                       var recv1 = "((struct instance_{nclass.c_name}*){arguments[1]})->values"
                        self.add("memmove({recv1}, {recv}, {arguments[2]}*sizeof({elttype.ctype}));")
                        return
                end
@@ -1851,23 +1958,6 @@ end
 
 redef class MType
        fun const_color: String do return "COLOR_{c_name}"
-
-       # C name of the instance type to use
-       fun c_instance_name: String do return c_name
-end
-
-redef class MClassType
-       redef fun c_instance_name do return mclass.c_instance_name
-end
-
-redef class MClass
-       # Extern classes use the C instance of kernel::Pointer
-       fun c_instance_name: String
-       do
-               if kind == extern_kind then
-                       return "kernel__Pointer"
-               else return c_name
-       end
 end
 
 interface PropertyLayoutElement end
@@ -1881,3 +1971,13 @@ redef class MPropDef
        super PropertyLayoutElement
        fun const_color: String do return "COLOR_{c_name}"
 end
+
+redef class AMethPropdef
+       # The semi-global compilation does not support inlining calls to extern news
+       redef fun can_inline
+       do
+               var m = mpropdef
+               if m != null and m.mproperty.is_init and m.is_extern then return false
+               return super
+       end
+end
index dcb9d6c..af3a43c 100644 (file)
@@ -219,7 +219,6 @@ class SeparateErasureCompiler
        do
                var mtype = mclass.intro.bound_mtype
                var c_name = mclass.c_name
-               var c_instance_name = mclass.c_instance_name
 
                var vft = self.method_tables[mclass]
                var attrs = self.attr_tables[mclass]
@@ -290,25 +289,42 @@ class SeparateErasureCompiler
                v.add_decl("\}")
                v.add_decl("\};")
 
-               if mtype.ctype != "val*" then
-                       if mtype.mclass.name == "Pointer" or mtype.mclass.kind != extern_kind then
-                               #Build instance struct
-                               self.header.add_decl("struct instance_{c_instance_name} \{")
-                               self.header.add_decl("const struct class *class;")
-                               self.header.add_decl("{mtype.ctype} value;")
-                               self.header.add_decl("\};")
-                       end
+               if mtype.ctype != "val*" or mtype.mclass.name == "Pointer" then
+                       #Build instance struct
+                       self.header.add_decl("struct instance_{c_name} \{")
+                       self.header.add_decl("const struct class *class;")
+                       self.header.add_decl("{mtype.ctype} value;")
+                       self.header.add_decl("\};")
 
                        #Build BOX
                        self.provide_declaration("BOX_{c_name}", "val* BOX_{c_name}({mtype.ctype});")
                        v.add_decl("/* allocate {mtype} */")
                        v.add_decl("val* BOX_{mtype.c_name}({mtype.ctype} value) \{")
-                       v.add("struct instance_{c_instance_name}*res = nit_alloc(sizeof(struct instance_{c_instance_name}));")
+                       v.add("struct instance_{c_name}*res = nit_alloc(sizeof(struct instance_{c_name}));")
                        v.require_declaration("class_{c_name}")
                        v.add("res->class = &class_{c_name};")
                        v.add("res->value = value;")
                        v.add("return (val*)res;")
                        v.add("\}")
+
+                       if mtype.mclass.name != "Pointer" then return
+
+                       v = new_visitor
+                       self.provide_declaration("NEW_{c_name}", "{mtype.ctype} NEW_{c_name}();")
+                       v.add_decl("/* allocate {mtype} */")
+                       v.add_decl("{mtype.ctype} NEW_{c_name}() \{")
+                       if is_dead then
+                               v.add_abort("{mclass} is DEAD")
+                       else
+                               var res = v.new_named_var(mtype, "self")
+                               res.is_exact = true
+                               v.add("{res} = nit_alloc(sizeof(struct instance_{mtype.c_name}));")
+                               v.require_declaration("class_{c_name}")
+                               v.add("{res}->class = &class_{c_name};")
+                               v.add("((struct instance_{mtype.c_name}*){res})->value = NULL;")
+                               v.add("return {res};")
+                       end
+                       v.add("\}")
                        return
                else if mclass.name == "NativeArray" then
                        #Build instance struct
@@ -332,6 +348,26 @@ class SeparateErasureCompiler
                        v.add("return (val*){res};")
                        v.add("\}")
                        return
+               else if mtype.mclass.kind == extern_kind and mtype.mclass.name != "NativeString" then
+                       var pointer_type = mainmodule.pointer_type
+
+                       self.provide_declaration("NEW_{c_name}", "{mtype.ctype} NEW_{c_name}();")
+                       v.add_decl("/* allocate {mtype} */")
+                       v.add_decl("{mtype.ctype} NEW_{c_name}() \{")
+                       if is_dead then
+                               v.add_abort("{mclass} is DEAD")
+                       else
+                               var res = v.new_named_var(mtype, "self")
+                               res.is_exact = true
+                               v.add("{res} = nit_alloc(sizeof(struct instance_{pointer_type.c_name}));")
+                               #v.add("{res}->type = type;")
+                               v.require_declaration("class_{c_name}")
+                               v.add("{res}->class = &class_{c_name};")
+                               v.add("((struct instance_{pointer_type.c_name}*){res})->value = NULL;")
+                               v.add("return {res};")
+                       end
+                       v.add("\}")
+                       return
                end
 
                #Build NEW
@@ -579,6 +615,40 @@ class SeparateErasureCompilerVisitor
                return res
        end
 
+       redef fun unbox_extern(value, mtype)
+       do
+               if mtype isa MClassType and mtype.mclass.kind == extern_kind and
+                  mtype.mclass.name != "NativeString" then
+                       var pointer_type = compiler.mainmodule.pointer_type
+                       var res = self.new_var_extern(mtype)
+                       self.add "{res} = ((struct instance_{pointer_type.c_name}*){value})->value; /* unboxing {value.mtype} */"
+                       return res
+               else
+                       return value
+               end
+       end
+
+       redef fun box_extern(value, mtype)
+       do
+               if mtype isa MClassType and mtype.mclass.kind == extern_kind and
+                  mtype.mclass.name != "NativeString" then
+                       var valtype = compiler.mainmodule.pointer_type
+                       var res = self.new_var(mtype)
+                       if compiler.runtime_type_analysis != null and not compiler.runtime_type_analysis.live_types.has(value.mtype.as(MClassType)) then
+                               self.add("/*no boxing of {value.mtype}: {value.mtype} is not live! */")
+                               self.add("PRINT_ERROR(\"Dead code executed!\\n\"); show_backtrace(1);")
+                               return res
+                       end
+                       self.require_declaration("BOX_{valtype.c_name}")
+                       self.add("{res} = BOX_{valtype.c_name}({value}); /* boxing {value.mtype} */")
+                       self.require_declaration("class_{mtype.c_name}")
+                       self.add("{res}->class = &class_{mtype.c_name};")
+                       return res
+               else
+                       return value
+               end
+       end
+
        redef fun class_name_string(value)
        do
                var res = self.get_name("var_class_name")
index 01b7bc7..5d666c8 100644 (file)
@@ -107,7 +107,7 @@ redef class MEntity
                lnk.add tpl_link
                if mdoc != null then
                        lnk.add ": "
-                       lnk.add mdoc.short_comment
+                       lnk.add mdoc.short_markdown
                end
                return new TplListItem.with_content(lnk)
        end
@@ -137,7 +137,7 @@ redef class MConcern
                lnk.add tpl_anchor
                if mdoc != null then
                        lnk.add ": "
-                       lnk.add mdoc.short_comment
+                       lnk.add mdoc.short_markdown
                end
                return new TplListItem.with_content(lnk)
        end
@@ -397,10 +397,10 @@ redef class MClassDef
                lnk.add tpl_link
                if mdoc != null then
                        lnk.add ": "
-                       lnk.add mdoc.short_comment
+                       lnk.add mdoc.short_markdown
                else if mclass.intro.mdoc != null then
                        lnk.add ": "
-                       lnk.add mclass.intro.mdoc.short_comment
+                       lnk.add mclass.intro.mdoc.short_markdown
                end
                return new TplListItem.with_content(lnk)
        end
@@ -482,7 +482,7 @@ redef class MPropDef
                var tpl = new Template
                tpl.add mclassdef.tpl_namespace
                tpl.add "::"
-               tpl.add mproperty.name
+               tpl.add tpl_link
                return tpl
        end
 
@@ -500,14 +500,6 @@ redef class MPropDef
                return tpl
        end
 
-       redef fun tpl_title do
-               var title = new Template
-               title.add tpl_icon
-               title.add tpl_link
-               title.add tpl_signature
-               return title
-       end
-
        redef fun tpl_definition do
                var tpl = new TplDefinition
                tpl.namespace = mclassdef.tpl_namespace
@@ -547,16 +539,35 @@ redef class MPropDef
        redef fun tpl_list_item do
                var lnk = new Template
                lnk.add new TplLabel.with_classes(tpl_css_classes.to_a)
-               lnk.add tpl_link
+               var anchor = tpl_link
+               anchor.href = "{mclassdef.mclass.nitdoc_url}#{mproperty.nitdoc_id}"
+               lnk.add anchor
                if mdoc != null then
                        lnk.add ": "
-                       lnk.add mdoc.short_comment
+                       lnk.add mdoc.short_markdown
                else if mproperty.intro.mdoc != null then
                        lnk.add ": "
-                       lnk.add mproperty.intro.mdoc.short_comment
+                       lnk.add mproperty.intro.mdoc.short_markdown
                end
                return new TplListItem.with_content(lnk)
        end
+
+       fun tpl_inheritance_item: TplListItem do
+               var lnk = new Template
+               lnk.add new TplLabel.with_classes(tpl_css_classes.to_a)
+               lnk.add mclassdef.mmodule.tpl_namespace
+               lnk.add "::"
+               var anchor = mclassdef.tpl_link
+               anchor.href = "{mclassdef.mclass.nitdoc_url}#{mproperty.nitdoc_id}"
+               lnk.add anchor
+               if mdoc != null then
+                       lnk.add ": "
+                       lnk.add mdoc.short_markdown
+               end
+               var li = new TplListItem.with_content(lnk)
+               li.css_classes.add "signature"
+               return li
+       end
 end
 
 redef class MMethod
index 9c38d44..c0a1b2f 100644 (file)
@@ -231,7 +231,9 @@ class QuickSearch
                        tpl.add "\"{mproperty}\":["
                        for mpropdef in mprops do
                                var full_name = mpropdef.mclassdef.mclass.full_name
-                               tpl.add "\{txt:\"{full_name}\",url:\"{mpropdef.nitdoc_url}\"\},"
+                               var cls_url = mpropdef.mclassdef.mclass.nitdoc_url
+                               var def_url = "{cls_url}#{mpropdef.mproperty.nitdoc_id}"
+                               tpl.add "\{txt:\"{full_name}\",url:\"{def_url}\"\},"
                        end
                        tpl.add "],"
                end
@@ -350,7 +352,10 @@ abstract class NitdocPage
        do
                if location == null then return null
                var source = ctx.opt_source.value
-               if source == null then return location.file.filename.simplify_path
+               if source == null then
+                       var url = location.file.filename.simplify_path
+                       return "<a target='_blank' title='Show source' href=\"{url}\">View Source</a>"
+               end
                # THIS IS JUST UGLY ! (but there is no replace yet)
                var x = source.split_with("%f")
                source = x.join(location.file.filename.simplify_path)
@@ -463,28 +468,72 @@ abstract class NitdocPage
        end
 
        # MProp description template
-       fun tpl_mprop_article(mproperty: MProperty, mpropdefs: Array[MPropDef]): TplArticle do
-               var article = mproperty.tpl_article
-               if not mpropdefs.has(mproperty.intro) then
-                       # add intro synopsys
-                       var intro_article = mproperty.intro.tpl_short_article
-                       intro_article.source_link = tpl_showsource(mproperty.intro.location)
-                       article.add_child intro_article
+       #
+       # `main_mpropdef`: The most important mpropdef to display
+       # `local_mpropdefs`: List of other locally defined mpropdefs to display
+       # `lin`: full linearization from local_mpropdefs to intro (displayed in redef tree)
+       fun tpl_mprop_article(main_mpropdef: MPropDef, local_mpropdefs: Array[MPropDef],
+          lin: Array[MPropDef]): TplArticle do
+               var mprop = main_mpropdef.mproperty
+               var article = new TplArticle(mprop.nitdoc_id)
+               var title = new Template
+               title.add mprop.tpl_icon
+               title.add "<span id='{main_mpropdef.nitdoc_id}'></span>"
+               if main_mpropdef.is_intro then
+                       title.add mprop.tpl_link
+                       title.add mprop.intro.tpl_signature
+               else
+                       var cls_url = mprop.intro.mclassdef.mclass.nitdoc_url
+                       var def_url = "{cls_url}#{mprop.nitdoc_id}"
+                       var lnk = new TplLink.with_title(def_url, mprop.name, "Go to introduction")
+                       title.add "redef "
+                       title.add lnk
+               end
+               article.title = title
+               article.title_classes.add "signature"
+               article.summary_title = "{mprop.nitdoc_name}"
+               article.subtitle = main_mpropdef.tpl_namespace
+               if main_mpropdef.mdoc != null then
+                       article.content = main_mpropdef.mdoc.tpl_comment
+               end
+               var subarticle = new TplArticle("{main_mpropdef.nitdoc_id}_redefs")
+               # Add redef in same `MClass`
+               if local_mpropdefs.length > 1 then
+                       for mpropdef in local_mpropdefs do
+                               if mpropdef == main_mpropdef then continue
+                               var redef_article = new TplArticle("{mpropdef.nitdoc_id}")
+                               var redef_title = new Template
+                               redef_title.add "also redef in "
+                               redef_title.add mpropdef.tpl_namespace
+                               redef_article.title = redef_title
+                               redef_article.title_classes.add "signature info"
+                               redef_article.css_classes.add "nospace"
+                               var redef_content = new Template
+                               if mpropdef.mdoc != null then
+                                       redef_content.add mpropdef.mdoc.tpl_comment
+                               end
+                               redef_article.content = redef_content
+                               subarticle.add_child redef_article
+                       end
                end
-               mainmodule.linearize_mpropdefs(mpropdefs)
-               for mpropdef in mpropdefs do
-                       # add mpropdef description
-                       var redef_article = mpropdef.tpl_article
-                       redef_article.source_link = tpl_showsource(mpropdef.location)
-                       article.add_child redef_article
+               # Add linearization
+               if lin.length > 1 then
+                       var lin_article = new TplArticle("{main_mpropdef.nitdoc_id}_lin")
+                       lin_article.title = "Inheritance"
+                       var lst = new TplList.with_classes(["list-unstyled", "list-labeled"])
+                       for mpropdef in lin do
+                               lst.add_li mpropdef.tpl_inheritance_item
+                       end
+                       lin_article.content = lst
+                       subarticle.add_child lin_article
                end
+               article.add_child subarticle
                return article
        end
 
        # MProperty description template
        fun tpl_mpropdef_article(mpropdef: MPropDef): TplArticle do
                var article = mpropdef.tpl_article
-               if mpropdef.is_intro then article.content = null
                article.source_link = tpl_showsource(mpropdef.location)
                return article
        end
@@ -1052,10 +1101,14 @@ class NitdocClass
                var classes = mprop.intro.tpl_css_classes.to_a
                if not mprops2mdefs.has_key(mprop) then
                        classes.add "inherit"
-                       var lnk = new Template
-                       lnk.add new TplLabel.with_classes(classes)
-                       lnk.add mprop.intro.tpl_link
-                       return new TplListItem.with_content(lnk)
+                       var cls_url = mprop.intro.mclassdef.mclass.nitdoc_url
+                       var def_url = "{cls_url}#{mprop.nitdoc_id}"
+                       var lnk = new TplLink(def_url, mprop.name)
+                       if mprop.intro.mdoc != null then lnk.title = mprop.intro.mdoc.short_comment
+                       var item = new Template
+                       item.add new TplLabel.with_classes(classes)
+                       item.add lnk
+                       return new TplListItem.with_content(item)
                end
                var defs = mprops2mdefs[mprop]
                if defs.has(mprop.intro) then
@@ -1065,7 +1118,7 @@ class NitdocClass
                end
                var lnk = new Template
                lnk.add new TplLabel.with_classes(classes)
-               lnk.add mprop.intro.tpl_anchor
+               lnk.add mprop.tpl_anchor
                return new TplListItem.with_content(lnk)
        end
 
@@ -1131,8 +1184,8 @@ class NitdocClass
                var mclasses = new HashSet[MClass]
                mclasses.add_all hancestors
                mclasses.add_all hparents
-               if hchildren.length < 10 then mclasses.add_all hchildren
-               if hdescendants.length < 10 then mclasses.add_all hdescendants
+               mclasses.add_all hchildren
+               mclasses.add_all hdescendants
                mclasses.add mclass
                var graph = tpl_dot(mclasses)
                if graph != null then section.add_child graph
@@ -1152,14 +1205,14 @@ class NitdocClass
                end
 
                # children
-               if not hchildren.is_empty and hchildren.length < 15 then
+               if not hchildren.is_empty then
                        var lst = hchildren.to_a
                        name_sorter.sort lst
                        section.add_child tpl_list("children", "Children", lst)
                end
 
                # descendants
-               if not hdescendants.is_empty and hchildren.length < 15 then
+               if not hdescendants.is_empty then
                        var lst = hdescendants.to_a
                        name_sorter.sort lst
                        section.add_child tpl_list("descendants", "Descendants", lst)
@@ -1170,9 +1223,18 @@ class NitdocClass
 
        private fun tpl_list(id: String, title: String, elts: Array[MClass]): TplArticle do
                var article = new TplArticle.with_title(id, title)
-               var list = new TplList.with_classes(["list-unstyled", "list-definition"])
-               for elt in elts do list.elts.add elt.tpl_list_item
-               article.content = list
+               if elts.length > 20 then
+                       var tpl = new Template
+                       for e in elts do
+                               tpl.add e.tpl_link
+                               if e != elts.last then tpl.add ", "
+                       end
+                       article.content = tpl
+               else
+                       var list = new TplList.with_classes(["list-unstyled", "list-definition"])
+                       for elt in elts do list.elts.add elt.tpl_list_item
+                       article.content = list
+               end
                return article
        end
 
@@ -1196,33 +1258,48 @@ class NitdocClass
                                var kind_map = sort_by_kind(mprops)
 
                                # virtual types
-                               var elts = kind_map["type"].to_a
-                               name_sorter.sort(elts)
-                               for elt in elts do
-                                       var defs = mprops2mdefs[elt].to_a
-                                       section.add_child tpl_mprop_article(elt, defs)
+                               for article in tpl_mproperty_articles(kind_map, "type") do
+                                       section.add_child article
                                end
-
                                # constructors
-                               elts = kind_map["init"].to_a
-                               name_sorter.sort(elts)
-                               for elt in elts do
-                                       var defs = mprops2mdefs[elt].to_a
-                                       section.add_child tpl_mprop_article(elt, defs)
+                               for article in tpl_mproperty_articles(kind_map, "init") do
+                                       section.add_child article
                                end
-
                                # methods
-                               elts = kind_map["fun"].to_a
-                               name_sorter.sort(elts)
-                               for elt in elts do
-                                       var defs = mprops2mdefs[elt].to_a
-                                       section.add_child tpl_mprop_article(elt, defs)
+                               for article in tpl_mproperty_articles(kind_map, "fun") do
+                                       section.add_child article
                                end
                                parent.add_child section
                        end
                end
        end
 
+       private fun tpl_mproperty_articles(kind_map: Map[String, Set[MProperty]],
+               kind_name: String): Sequence[TplArticle] do
+               var articles = new List[TplArticle]
+               var elts = kind_map[kind_name].to_a
+               name_sorter.sort(elts)
+               for elt in elts do
+                       var local_defs = mprops2mdefs[elt]
+                       # var all_defs = elt.mpropdefs
+                       var all_defs = new HashSet[MPropDef]
+                       for local_def in local_defs do
+                               all_defs.add local_def
+                               var mpropdef = local_def
+                               while not mpropdef.is_intro do
+                                       mpropdef = mpropdef.lookup_next_definition(mainmodule, mpropdef.mclassdef.bound_mtype)
+                                       all_defs.add mpropdef
+                               end
+                       end
+                       var loc_lin = local_defs.to_a
+                       mainmodule.linearize_mpropdefs(loc_lin)
+                       var all_lin = all_defs.to_a
+                       mainmodule.linearize_mpropdefs(all_lin)
+                       articles.add tpl_mprop_article(loc_lin.first, loc_lin, all_lin)
+               end
+               return articles
+       end
+
        redef fun tpl_content do
                tpl_sidebar_properties
                var top = tpl_intro
@@ -1305,6 +1382,7 @@ class NitdocClass
                for mclass in mclasses do
                        poset.add_node mclass
                        for oclass in mclasses do
+                               if mclass == oclass then continue
                                poset.add_node oclass
                                if mclass.in_hierarchy(mainmodule) < oclass then
                                        poset.add_edge(mclass, oclass)
@@ -1315,14 +1393,28 @@ class NitdocClass
                var op = new FlatBuffer
                var name = "dep_{mclass.name}"
                op.append("digraph {name} \{ rankdir=BT; node[shape=none,margin=0,width=0,height=0,fontsize=10]; edge[dir=none,color=gray]; ranksep=0.2; nodesep=0.1;\n")
-               for c in poset do
+               var classes = poset.to_a
+               var todo = new Array[MClass]
+               var done = new HashSet[MClass]
+               mainmodule.linearize_mclasses(classes)
+               if not classes.is_empty then todo.add classes.first
+               while not todo.is_empty do
+                       var c = todo.shift
+                       if done.has(c) then continue
+                       done.add c
                        if c == mclass then
                                op.append("\"{c.name}\"[shape=box,margin=0.03];\n")
                        else
                                op.append("\"{c.name}\"[URL=\"{c.nitdoc_url}\"];\n")
                        end
-                       for c2 in poset[c].direct_greaters do
-                               op.append("\"{c.name}\"->\"{c2.name}\";\n")
+                       var smallers = poset[c].direct_smallers
+                       if smallers.length < 10 then
+                               for c2 in smallers do
+                                       op.append("\"{c2.name}\"->\"{c.name}\";\n")
+                               end
+                               todo.add_all smallers
+                       else
+                               op.append("\"...\"->\"{c.name}\";\n")
                        end
                end
                op.append("\}\n")
@@ -1378,13 +1470,12 @@ class NitdocProperty
        end
 
        private fun tpl_intro: TplSection do
-               var section = new TplSection.with_title("top", tpl_title)
-               section.subtitle = mproperty.tpl_declaration
-               var article = new TplArticle("comment")
-               if mproperty.intro.mdoc != null then
-                       article.content = mproperty.intro.mdoc.tpl_comment
-               end
-               section.add_child article
+               var title = new Template
+               title.add mproperty.nitdoc_name
+               title.add mproperty.intro.tpl_signature
+               var section = new TplSection.with_title("top", title)
+               section.subtitle = mproperty.tpl_namespace
+               section.summary_title = mproperty.nitdoc_name
                return section
        end
 
index 4d3b253..200e650 100644 (file)
@@ -274,11 +274,11 @@ class TplSideBox
 
        # Content to display in the box
        # box will not be rendered if the content is null
-       var content: nullable Streamable writable
+       var content: nullable Streamable is writable
 
        # Is the box opened by default
        # otherwise, the user will have to clic on the title to display the content
-       var is_open writable = false
+       var is_open = false is writable
 
        init(title: String) do
                self.title = title
@@ -383,14 +383,14 @@ class TplSectionElt
        # Title to display if any
        # if both `title` and `summary_title` are null then
        # the section will not appear in the summary
-       var title: nullable Streamable writable
+       var title: nullable Streamable is writable
 
        # Subtitle to display if any
-       var subtitle: nullable Streamable writable
+       var subtitle: nullable Streamable is writable
 
        # Title that appear in the summary
        # if null use `title` instead
-       var summary_title: nullable String writable
+       var summary_title: nullable String is writable
 
        # CSS classes to apply on the section element
        var css_classes = new Array[String]
@@ -471,8 +471,8 @@ class TplArticle
        super TplSectionElt
 
        # Content for this article
-       var content: nullable Streamable writable = null
-       var source_link: nullable Streamable writable = null
+       var content: nullable Streamable = null is writable
+       var source_link: nullable Streamable = null is writable
 
        init with_content(id: String, title: Streamable, content: Streamable) do
                with_title(id, title)
@@ -652,13 +652,13 @@ class TplLink
        super Template
 
        # Link href
-       var href: String writable
+       var href: String is writable
 
        # Text to display in the link
-       var text: Streamable writable
+       var text: Streamable is writable
 
        # Optional title
-       var title: nullable String writable
+       var title: nullable String is writable
 
        init(href, text: String) do
                self.href = href
@@ -748,6 +748,67 @@ class TplListItem
        end
 end
 
+# A Bootstrap tab component that contains `TplTabPanel`.
+class TplTab
+       super Template
+
+       # Panels contained in the tab.
+       var panels = new Array[TplTabPanel]
+
+       # Add a new panel.
+       fun add_panel(panel: TplTabPanel) do panels.add panel
+
+       # CSS classes of the tab component.
+       var css_classes = new Array[String]
+
+       redef fun rendering do
+               add "<div class='tab-content'>"
+               for panel in panels do add panel
+               add "</div>"
+       end
+end
+
+# A panel that goes in a `TplTab`.
+class TplTabPanel
+       super Template
+
+       # CSS classes of the pane element.
+       var css_classes = new Array[String]
+
+       # The panel id.
+       #
+       # Used to show/hide panel.
+       var id: String
+
+       # The panel name.
+       #
+       # Displayed in the tab header or in the pointing link.
+       var name: Streamable
+
+       # Is the panel visible by default?
+       var is_active = false is writable
+
+       # Body of the panel
+       var content: nullable Streamable = null is writable
+
+       # Get a link pointing to this panel.
+       fun tpl_link_to: Streamable do
+               var lnk = new Template
+               lnk.add "<a data-target='#{id}' data-toggle='pill'>"
+               lnk.add name
+               lnk.add "</a>"
+               return lnk
+       end
+
+       redef fun rendering do
+               add "<div class='tab-pane {css_classes.join(" ")}"
+               if is_active then add "active"
+               add "' id='{id}'>"
+               if content != null then add content.as(not null)
+               add "</div>"
+       end
+end
+
 # A label with a text content
 class TplLabel
        super Template
similarity index 98%
rename from src/common_ffi/c.nit
rename to src/ffi/c.nit
index 4e4402c..92697f5 100644 (file)
@@ -72,8 +72,8 @@ redef class Location
 end
 
 redef class MModule
-       var c_compiler_options writable = ""
-       var c_linker_options writable = ""
+       var c_compiler_options = "" is writable
+       var c_linker_options = "" is writable
 end
 
 class ForeignCType
similarity index 99%
rename from src/common_ffi/cpp.nit
rename to src/ffi/cpp.nit
index 8cdce81..f75c100 100644 (file)
@@ -27,7 +27,7 @@ end
 redef class MModule
        private var cpp_file: nullable CPPCompilationUnit = null
 
-       var cpp_compiler_options writable = ""
+       var cpp_compiler_options = "" is writable
 end
 
 class CPPLanguage
@@ -63,7 +63,7 @@ class CPPLanguage
                var indirection_sig = mproperty.build_csignature(mclass_type, mmodule, "___cpp_impl_mid", long_signature, internal_call_context)
 
                ## In C file (__ffi.c)
-               
+
                # Declare the indirection function in C
                ecc.body_decl.add("{indirection_sig};\n")
 
similarity index 98%
rename from src/common_ffi/common_ffi.nit
rename to src/ffi/ffi.nit
index cb9c244..a418616 100644 (file)
@@ -17,7 +17,7 @@
 # FFI concers common between the compilers and the interpreter.
 # Offers services to compile modules using foreign code. Mainly allows
 # to wrap foreign code in Nit methods.
-module common_ffi
+module ffi
 
 import modelbuilder
 
@@ -135,7 +135,7 @@ redef class VerifyNitniCallbacksPhase
        do
                super
 
-               if not npropdef isa AExternPropdef then return
+               if not npropdef isa AMethPropdef then return
 
                var code_block = npropdef.n_extern_code_block
                if code_block == null then return
similarity index 98%
rename from src/common_ffi/header_dependency.nit
rename to src/ffi/header_dependency.nit
index de247e5..485ba1f 100644 (file)
@@ -53,7 +53,7 @@ redef class MModule
 
                        # does the super module has inherited dependancies?
                        var hd = m.header_dependencies
-                       if not hd.is_empty then 
+                       if not hd.is_empty then
                                header_dependencies.add_all(hd)
                        end
 
similarity index 99%
rename from src/common_ffi/java.nit
rename to src/ffi/java.nit
index 571c319..7be54ce 100644 (file)
@@ -251,7 +251,7 @@ redef class MModule
        private fun impl_java_class_name: String do return "Nit_{name}"
 end
 
-redef class AExternPropdef
+redef class AMethPropdef
        redef fun verify_nitni_callbacks(toolcontext)
        do
                super
@@ -408,7 +408,7 @@ redef class NitniCallback
 
        # Returns the list of C functions to link with extern Java methods, as required
        # to enable this callback from Java code.
-       # 
+       #
        # Return used by `MModule::ensure_linking_callback_methods`
        #
        # TODO we return an Array to support cast and other features like that
@@ -462,7 +462,7 @@ redef class MType
        private fun jni_type: String do return "jint"
 
        # JNI short type name (for signatures)
-       # 
+       #
        # Is used by `MMethod::build_jni_format` to pass a Java method signature
        # to the JNI function `GetStaticMetodId`.
        private fun jni_format: String do return "I"
@@ -543,7 +543,7 @@ end
 
 redef class MMethod
        # Returns the JNI signature format of this Nit method
-       # 
+       #
        # Example: a Nity signature `(Bool, Int, Float, JavaString)` is represented by
        # the JNI format `(ZIDLjava/lang/string;)V"
        private fun build_jni_format(recv_mtype: MClassType, from_mmodule: MModule): String
similarity index 89%
rename from src/common_ffi/pkgconfig.nit
rename to src/ffi/pkgconfig.nit
index aa9add3..335d8d1 100644 (file)
@@ -43,27 +43,29 @@ class PkgconfigPhase
                        return
                end
 
-               var args = nat.n_args
-               if args.is_empty then
-                       modelbuilder.error(nat, "Syntax error: \"pkgconfig\" expects at least one argument.")
-                       return
-               end
+               # retreive module
+               var nmodule = nmoduledecl.parent.as(AModule)
+               var mmodule = nmodule.mmodule.as(not null)
 
+               # target pkgs
                var pkgs = new Array[String]
-               for arg in args do
-                       var pkg = arg.as_string
-                       if pkg == null then
-                               modelbuilder.error(nat, "Syntax error: \"pkgconfig\" expects its arguments to be the name of the package as String literals.")
-                               return
-                       end
 
-                       pkgs.add(pkg)
+               var args = nat.n_args
+               if args.is_empty then
+                       # use module name
+                       pkgs.add(mmodule.name)
+               else
+                       for arg in args do
+                               var pkg = arg.as_string
+                               if pkg == null then
+                                       modelbuilder.error(nat, "Syntax error: \"pkgconfig\" expects its arguments to be the name of the package as String literals.")
+                                       return
+                               end
+
+                               pkgs.add(pkg)
+                       end
                end
 
-               # retreive module
-               var nmodule = nmoduledecl.parent.as(AModule)
-               var mmodule = nmodule.mmodule.as(not null)
-
                # check availability of pkg-config
                var proc_which = new IProcess("which", "pkg-config")
                proc_which.wait
index 367ba4d..41abe43 100644 (file)
@@ -60,7 +60,7 @@ private class CheckAnnotationPhase
 
                        for m in super_mmodules do
                                if declared_annotations[m].has(name) then
-                                       modelbuilder.warning(annot, "Warning: an annotation `{name}` is already declared in module `{m}`")
+                                       modelbuilder.warning(annot, "multiple-annotation-declarations", "Warning: an annotation `{name}` is already declared in module `{m}`")
                                        break label
                                end
                        end
@@ -75,6 +75,7 @@ private class CheckAnnotationPhase
        var primtives_annotations_list = """
 new_annotation
 
+deprecated
 fixed
 lazy
 noinit
@@ -83,6 +84,9 @@ writable
 cached
 nosuper
 old_style_init
+abstract
+intern
+extern
 
 pkgconfig
 c_compiler_option
@@ -116,7 +120,7 @@ platform
 
                if annots.has(name) then return
 
-               toolcontext.modelbuilder.warning(nat, "Warning: unknown annotation `{name}`")
+               toolcontext.modelbuilder.warning(nat, "unknown-annotation", "Warning: unknown annotation `{name}`")
 
                annots.add(name) # to avoid multiple errors on the same name
        end
index 25574e7..7f0427d 100644 (file)
@@ -122,7 +122,7 @@ private class SerializationPhasePreModel
 
                code.add "end"
 
-               var npropdef = toolcontext.parse_propdef(code.join("\n")).as(AConcreteInitPropdef)
+               var npropdef = toolcontext.parse_propdef(code.join("\n")).as(AMethPropdef)
                npropdefs.add npropdef
                nclassdef.parent.as(AModule).inits_to_retype.add npropdef
        end
@@ -186,11 +186,11 @@ end
 private class PreciseTypeVisitor
        super Visitor
 
-       var npropdef: AConcreteInitPropdef
+       var npropdef: AMethPropdef
        var mclassdef: MClassDef
        var toolcontext: ToolContext
 
-       init(npropdef: AConcreteInitPropdef, mclassdef: MClassDef, toolcontext: ToolContext)
+       init(npropdef: AMethPropdef, mclassdef: MClassDef, toolcontext: ToolContext)
        do
                self.npropdef = npropdef
                self.mclassdef = mclassdef
@@ -223,8 +223,7 @@ end
 redef class AAttrPropdef
        private fun name: String
        do
-               if n_id == null then return n_id2.text
-               return n_id.text
+               return n_id2.text
        end
 end
 
@@ -256,7 +255,7 @@ redef class AModule
                return null
        end
 
-       private var inits_to_retype = new Array[AConcreteInitPropdef]
+       private var inits_to_retype = new Array[AMethPropdef]
 end
 
 redef class AStdClassdef
index 26d6710..a50b45b 100644 (file)
@@ -54,9 +54,9 @@ private class SimpleMiscVisitor
 
        var toolcontext: ToolContext
 
-       fun warning(node: ANode, msg: String)
+       fun warning(node: ANode, tag, msg: String)
        do
-               toolcontext.warning(node.hot_location, msg)
+               toolcontext.warning(node.hot_location, tag, msg)
        end
 
        init(toolcontext: ToolContext)
@@ -81,7 +81,7 @@ redef class ASignature
        redef fun after_simple_misc(v)
        do
                if self.n_opar != null and self.n_params.is_empty then
-                       v.warning(self, "Warning: superfluous parentheses.")
+                       v.warning(self, "parentheses", "Warning: superfluous parentheses.")
                end
        end
 end
@@ -94,7 +94,7 @@ end
 redef class AParExpr
        redef fun warn_parentheses(v)
        do
-               v.warning(self, "Warning: superfluous parentheses.")
+               v.warning(self, "parentheses", "Warning: superfluous parentheses.")
        end
 end
 
@@ -102,7 +102,7 @@ redef class AParExprs
        redef fun after_simple_misc(v)
        do
                if n_exprs.is_empty then
-                       v.warning(self, "Warning: superfluous parentheses.")
+                       v.warning(self, "parentheses", "Warning: superfluous parentheses.")
                end
        end
 end
@@ -141,7 +141,7 @@ redef class AWhileExpr
        redef fun after_simple_misc(v)
        do
                if n_expr isa ATrueExpr then
-                       v.warning(self, "Warning: use 'loop' instead of 'while true do'.")
+                       v.warning(self, "loop", "Warning: use `loop` instead of `while true do`.")
                else
                        n_expr.warn_parentheses(v)
                end
@@ -173,7 +173,7 @@ redef class AOnceExpr
        redef fun accept_simple_misc(v)
        do
                if v.once_count > 0 then
-                       v.warning(self, "Useless once in a once expression.")
+                       v.warning(self, "nested-once", "Warning: useless once in a once expression.")
                end
                v.once_count = v.once_count + 1
 
index a93fec9..4922a79 100644 (file)
@@ -27,13 +27,13 @@ class HighlightVisitor
 
        # Is the HTML include a nested `<span class"{type_of_node}">` element for each `ANode` of the AST?
        # Used to have a really huge and verbose HTML (mainly for debug)
-       var with_ast writable = false
+       var with_ast = false is writable
 
        # The first line to generate, null if start at the first line
-       var first_line: nullable Int writable = null
+       var first_line: nullable Int = null is writable
 
        # The last line to generate, null if finish at the last line
-       var last_line: nullable Int writable = null
+       var last_line: nullable Int = null is writable
 
        init
        do
index cd264f1..d4c9173 100644 (file)
@@ -501,6 +501,10 @@ private class NaiveInterpreter
        do
                return mtype.anchor_to(self.mainmodule, self.frame.arguments.first.mtype.as(MClassType))
        end
+
+       # Placebo instance used to mark internal error result when `null` already have a meaning.
+       # TODO: replace with multiple return or something better
+       var error_instance = new MutableInstance(modelbuilder.model.null_type) is lazy
 end
 
 # An instance represents a value of the executed program.
@@ -671,14 +675,28 @@ redef class AMethPropdef
                        v.call_without_varargs(superpd, arguments)
                end
 
+               if mpropdef.is_intern or mpropdef.is_extern then
+                       var res = intern_call(v, mpropdef, arguments)
+                       if res != v.error_instance then return res
+               end
+
                if n_block != null then
                        v.stmt(self.n_block)
                        return null
+               end
+
+               if mpropdef.is_intern then
+                       fatal(v, "NOT YET IMPLEMENTED intern {mpropdef}")
+               else if mpropdef.is_extern then
+                       fatal(v, "NOT YET IMPLEMENTED extern {mpropdef}")
                else
-                       return intern_call(v, mpropdef, arguments)
+                       fatal(v, "NOT YET IMPLEMENTED <wat?> {mpropdef}")
                end
+               abort
        end
 
+       # Interprets a intern or a shortcut extern method.
+       # Returns the result for a function, `null` for a procedure, or `error_instance` if the method is unknown.
        private fun intern_call(v: NaiveInterpreter, mpropdef: MMethodDef, args: Array[Instance]): nullable Instance
        do
                var pname = mpropdef.mproperty.name
@@ -986,14 +1004,7 @@ redef class AMethPropdef
                else if pname == "address_is_null" then
                        return v.false_instance
                end
-               if mpropdef.is_intern then
-                       fatal(v, "NOT YET IMPLEMENTED intern {mpropdef}")
-               else if mpropdef.is_extern then
-                       fatal(v, "NOT YET IMPLEMENTED extern {mpropdef}")
-               else
-                       fatal(v, "NOT YET IMPLEMENTED <wat?> {mpropdef}")
-               end
-               abort
+               return v.error_instance
        end
 end
 
index 44ddfea..abc733a 100644 (file)
@@ -26,10 +26,22 @@ class MDoc
 
        # The entity where the documentation is originally attached to.
        # This gives some context to resolve identifiers or to run examples.
-       var original_mentity: nullable MEntity writable = null
+       var original_mentity: nullable MEntity = null is writable
 end
 
 redef class MEntity
-       # The documentation assiciated to the entity
-       var mdoc: nullable MDoc writable
+       # The documentation associated to the entity
+       var mdoc: nullable MDoc is writable
+
+       # Is the entity deprecated?
+       #
+       # Used for warnings and in documentation.
+       # Has no other specific effect.
+       var deprecation: nullable MDeprecationInfo = null is writable
+end
+
+# Information about a deprecated entity
+class MDeprecationInfo
+       # Explanation about the deprecation
+       var mdoc: nullable MDoc = null is writable
 end
index 596ea9d..22e10c2 100644 (file)
@@ -57,13 +57,12 @@ redef class MGroup
        # The loaded modules of this group
        var mmodules = new Array[MModule]
 
-       # Placebo stuff to find the owner (module with same name)
-       # null is returned if there is no owner, or if it is not loaded yet
-       fun fuzzy_owner: nullable MModule
-       do
-               for m in mmodules do if m.name == name then return m
-               return null
-       end
+       # The default module of a group (if any, and if loaded)
+       #
+       # The default module of a group is the one that has the same name.
+       # Return `null` if the group has no default module or if the default
+       # module is not loaded.
+       var default_mmodule: nullable MModule = null
 end
 
 # A Nit module is usually associated with a Nit source file.
@@ -73,12 +72,6 @@ class MModule
        # The model considered
        redef var model: Model
 
-       # placebo for old module nesting hierarchy
-       # return null if self is not nested (ie. is a top-level module)
-       #
-       # TODO REMOVE, rely on mgroup instead
-       var direct_owner: nullable MModule
-
        # The group of module in the project if any
        var mgroup: nullable MGroup
 
@@ -124,20 +117,22 @@ class MModule
                self.mgroup = mgroup
                if mgroup != null then
                        mgroup.mmodules.add(self)
+                       if mgroup.name == name then
+                               assert mgroup.default_mmodule == null
+                               mgroup.default_mmodule = self
+                       end
                        # placebo for old module nesting hierarchy
-                       var direct_owner = mgroup.fuzzy_owner
+                       var direct_owner = mgroup.default_mmodule
                        if direct_owner == self then
                                # The module is the new owner of its own group, thus adopt the other modules
                                for m in mgroup.mmodules do
                                        if m == self then continue
-                                       m.direct_owner = self
                                        model.mmodule_nesting_hierarchy.add_edge(self, m)
                                end
-                               # The potential owner is the the fuzzy_owner of the parent group
-                               if mgroup.parent != null then direct_owner = mgroup.parent.fuzzy_owner
+                               # The potential owner is the default_mmodule of the parent group
+                               if mgroup.parent != null then direct_owner = mgroup.parent.default_mmodule
                        end
                        if direct_owner != self and direct_owner != null then
-                               self.direct_owner = direct_owner
                                model.mmodule_nesting_hierarchy.add_edge(direct_owner, self)
                        end
                end
@@ -192,18 +187,6 @@ class MModule
                end
        end
 
-       # placebo for old module nesting hierarchy
-       fun public_owner: nullable MModule
-       do
-               var mgroup = self.mgroup
-               if mgroup == null then return null
-               mgroup = mgroup.mproject.root
-               if mgroup.mmodules.is_empty then return null
-               var res = mgroup.fuzzy_owner
-               if res == self then return null
-               return res
-       end
-
        # Return true if a class or a property introduced in `intro_mmodule` with a visibility of `visibility` is visible in self.
        fun is_visible(intro_mmodule: MModule, visibility: MVisibility): Bool
        do
@@ -224,7 +207,7 @@ class MModule
        # Is the mmodule created for internal purpose?
        # Fictive module are instantied internally but they should not be
        # exposed to the final user
-       var is_fictive: Bool writable = false
+       var is_fictive: Bool = false is writable
 
        redef fun parent_concern do return mgroup
 end
index d4d2c1c..e0d941a 100644 (file)
@@ -214,6 +214,9 @@ redef class MModule
 
        private var object_type_cache: nullable MClassType
 
+       # The type `Pointer`, super class to all extern classes
+       var pointer_type: MClassType = self.get_primitive_class("Pointer").mclass_type is lazy
+
        # The primitive type `Bool`
        fun bool_type: MClassType
        do
@@ -1242,8 +1245,8 @@ end
 # The type associated the a formal parameter generic type of a class
 #
 # Each parameter type is associated to a specific class.
-# It's mean that all refinements of a same class "share" the parameter type,
-# but that a generic subclass has its on parameter types.
+# It means that all refinements of a same class "share" the parameter type,
+# but that a generic subclass has its own parameter types.
 #
 # However, in the sense of the meta-model, a parameter type of a class is
 # a valid type in a subclass. The "in the sense of the meta-model" is
@@ -1818,18 +1821,18 @@ class MMethod
 
        # Is the property defined at the top_level of the module?
        # Currently such a property are stored in `Object`
-       var is_toplevel: Bool writable = false
+       var is_toplevel: Bool = false is writable
 
        # Is the property a constructor?
        # Warning, this property can be inherited by subclasses with or without being a constructor
        # therefore, you should use `is_init_for` the verify if the property is a legal constructor for a given class
-       var is_init: Bool writable = false
+       var is_init: Bool = false is writable
 
        # The constructor is a (the) root init with empty signature but a set of initializers
-       var is_root_init: Bool writable = false
+       var is_root_init: Bool = false is writable
 
        # The the property a 'new' contructor?
-       var is_new: Bool writable = false
+       var is_new: Bool = false is writable
 
        # Is the property a legal constructor for a given class?
        # As usual, visibility is not considered.
@@ -1944,13 +1947,13 @@ class MMethodDef
        end
 
        # The signature attached to the property definition
-       var msignature: nullable MSignature writable = null
+       var msignature: nullable MSignature = null is writable
 
        # The signature attached to the `new` call on a root-init
        # This is a concatenation of the signatures of the initializers
        #
        # REQUIRE `mproperty.is_root_init == (new_msignature != null)`
-       var new_msignature: nullable MSignature writable = null
+       var new_msignature: nullable MSignature = null is writable
 
        # List of initialisers to call in root-inits
        #
@@ -1960,13 +1963,13 @@ class MMethodDef
        var initializers = new Array[MProperty]
 
        # Is the method definition abstract?
-       var is_abstract: Bool writable = false
+       var is_abstract: Bool = false is writable
 
        # Is the method definition intern?
-       var is_intern writable = false
+       var is_intern = false is writable
 
        # Is the method definition extern?
-       var is_extern writable = false
+       var is_extern = false is writable
 end
 
 # A local definition of an attribute
@@ -1982,7 +1985,7 @@ class MAttributeDef
        end
 
        # The static type of the attribute
-       var static_mtype: nullable MType writable = null
+       var static_mtype: nullable MType = null is writable
 end
 
 # A local definition of a virtual type
@@ -1998,10 +2001,10 @@ class MVirtualTypeDef
        end
 
        # The bound of the virtual type
-       var bound: nullable MType writable = null
+       var bound: nullable MType = null is writable
 
        # Is the bound fixed?
-       var is_fixed writable = false
+       var is_fixed = false is writable
 end
 
 # A kind of class.
index ef17543..9420ab8 100644 (file)
@@ -46,6 +46,7 @@ end
 #  * `public_visibility`
 #  * `protected_visibility`
 #  * `none_visibility`
+#  * `private_visiblity`
 #
 # Note this class is basically an enum.
 # FIXME: use a real enum once user-defined enums are available
index 20be8c3..a8a1345 100644 (file)
@@ -154,10 +154,10 @@ class MProjectDot
        end
 
        # Should groups be shown as clusters?
-       var cluster_group writable = true
+       var cluster_group = true is writable
 
        # Should projects be shown as clusters?
-       var project_group writable = true
+       var project_group = true is writable
 
        # Recursively generate noed ans clusters for a mroup
        private fun dot_cluster(o: OStream, mgroup: MGroup)
index 0b8010e..72f2114 100644 (file)
@@ -30,7 +30,7 @@ class MProject
        redef var model: Model
 
        # The root of the group tree
-       var root: nullable MGroup writable = null
+       var root: nullable MGroup = null is writable
 
        # The group tree, as a POSet
        var mgroups = new POSet[MGroup]
@@ -81,7 +81,7 @@ class MGroup
        fun is_root: Bool do return mproject.root == self
 
        # The filepath (usualy a directory) of the group, if any
-       var filepath: nullable String writable
+       var filepath: nullable String is writable
 
        init (name: String, mproject: MProject, parent: nullable MGroup)
        do
index 51c643c..f184eec 100644 (file)
@@ -25,7 +25,7 @@ redef class MConcern
        # see: `MConcernRankSorter`
        # Use a positive booster to push down a result in the list
        # A negative booster can be used to push up the result
-       var booster_rank: Int writable = 0
+       var booster_rank: Int = 0 is writable
 
        # Concern ranking used for ordering
        # see: `MConcernRankSorter`
@@ -213,16 +213,6 @@ end
 
 redef class MClass
 
-       # Get the public owner of 'self'.
-       fun public_owner: MModule do
-               var public_owner = self.intro_mmodule.public_owner
-               if public_owner == null then
-                       return self.intro_mmodule
-               else
-                       return public_owner
-               end
-       end
-
        # Get direct parents of 'self'.
        fun parents: Set[MClass] do
                var ret = new HashSet[MClass]
index eac98df..48bc6fa 100644 (file)
@@ -630,6 +630,8 @@ class ModelBuilder
                                var mdoc = ndoc.to_mdoc
                                mmodule.mdoc = mdoc
                                mdoc.original_mentity = mmodule
+                       else
+                               advice(decl, "missing-doc", "Documentation warning: Undocumented module `{mmodule}`")
                        end
                end
 
@@ -715,9 +717,16 @@ class ModelBuilder
 
        # Helper function to display a warning on a node.
        # Alias for: `self.toolcontext.warning(n.hot_location, text)`
-       fun warning(n: ANode, text: String)
+       fun warning(n: ANode, tag, text: String)
+       do
+               self.toolcontext.warning(n.hot_location, tag, text)
+       end
+
+       # Helper function to display an advice on a node.
+       # Alias for: `self.toolcontext.advice(n.hot_location, text)`
+       fun advice(n: ANode, tag, text: String)
        do
-               self.toolcontext.warning(n.hot_location, text)
+               self.toolcontext.advice(n.hot_location, tag, text)
        end
 
        # Force to get the primitive method named `name` on the type `recv` or do a fatal error on `n`
index ff0295f..8bc6ef2 100644 (file)
@@ -133,7 +133,7 @@ redef class ModelBuilder
                                        return
                                end
                                for c in ptname.chars do if c >= 'a' and c<= 'z' then
-                                       warning(nfd, "Warning: lowercase in the formal parameter type {ptname}")
+                                       warning(nfd, "formal-type-name", "Warning: lowercase in the formal parameter type {ptname}")
                                        break
                                end
                                names.add(ptname)
@@ -155,7 +155,7 @@ redef class ModelBuilder
                                                nfd.bound = bound
                                        end
                                        if bound isa MClassType and bound.mclass.kind == enum_kind then
-                                               warning(nfdt, "Warning: Useless formal parameter type since `{bound}` cannnot have subclasses.")
+                                               warning(nfdt, "useless-bound", "Warning: Useless formal parameter type since `{bound}` cannnot have subclasses.")
                                        end
                                else if mclass.mclassdefs.is_empty then
                                        # No bound, then implicitely bound by nullable Object
@@ -182,6 +182,8 @@ redef class ModelBuilder
                                var mdoc = ndoc.to_mdoc
                                mclassdef.mdoc = mdoc
                                mdoc.original_mentity = mclassdef
+                       else if mclassdef.is_intro and mclass.visibility >= public_visibility then
+                               advice(nclassdef, "missing-doc", "Documentation warning: Undocumented public class `{mclass}`")
                        end
                end
 
@@ -385,12 +387,12 @@ redef class ModelBuilder
                                if not parents.has(sc) or sc == objectclass then
                                        # Skip the warning on generated code
                                        if ntype.location.file != null and not ntype.location.file.filename.is_empty then
-                                               warning(ntype, "Warning: superfluous super-class {mtype} in class {mclassdef.mclass}.")
+                                               warning(ntype, "useless-superclass", "Warning: superfluous super-class {mtype} in class {mclassdef.mclass}.")
                                        end
                                else if not seen_parents.has_key(sc) then
                                        seen_parents[sc] = ntype
                                else
-                                       warning(ntype, "Warning: duplicated super-class {mtype} in class {mclassdef.mclass}.")
+                                       warning(ntype, "useless-superclass", "Warning: duplicated super-class {mtype} in class {mclassdef.mclass}.")
                                end
                        end
                end
index 57e847b..99ff6b4 100644 (file)
@@ -337,7 +337,7 @@ end
 redef class MPropDef
        # Does the MPropDef contains a call to super or a call of a super-constructor?
        # Subsequent phases of the frontend (esp. typing) set it if required
-       var has_supercall: Bool writable = false
+       var has_supercall: Bool = false is writable
 end
 
 redef class AClassdef
@@ -383,7 +383,7 @@ redef class APropdef
        type MPROPDEF: MPropDef
 
        # The associated propdef once build by a `ModelBuilder`
-       var mpropdef: nullable MPROPDEF writable
+       var mpropdef: nullable MPROPDEF is writable
 
        private fun build_property(modelbuilder: ModelBuilder, mclassdef: MClassDef) is abstract
        private fun build_signature(modelbuilder: ModelBuilder) is abstract
@@ -404,21 +404,34 @@ redef class APropdef
                                modelbuilder.error(nvisibility, "Error: The only legal visibility for properties in a private class is private.")
                        else if mvisibility == private_visibility then
                                assert nvisibility != null
-                               # Not yet
-                               # modelbuilder.warning(nvisibility, "Warning: private is unrequired since the only legal visibility for properties in a private class is private.")
+                               modelbuilder.advice(nvisibility, "useless-visibility", "Warning: private is superfluous since the only legal visibility for properties in a private class is private.")
                        end
                        mvisibility = private_visibility
                end
                return mvisibility
        end
 
-       private fun set_doc(mpropdef: MPropDef)
+       private fun set_doc(mpropdef: MPropDef, modelbuilder: ModelBuilder)
        do
                var ndoc = self.n_doc
                if ndoc != null then
                        var mdoc = ndoc.to_mdoc
                        mpropdef.mdoc = mdoc
                        mdoc.original_mentity = mpropdef
+               else if mpropdef.is_intro and mpropdef.mproperty.visibility >= protected_visibility then
+                       modelbuilder.advice(self, "missing-doc", "Documentation warning: Undocumented property `{mpropdef.mproperty}`")
+               end
+
+               var at_deprecated = get_single_annotation("deprecated", modelbuilder)
+               if at_deprecated != null then
+                       if not mpropdef.is_intro then
+                               modelbuilder.error(self, "Error: method redefinition cannot be deprecated.")
+                       else
+                               var info = new MDeprecationInfo
+                               ndoc = at_deprecated.n_doc
+                               if ndoc != null then info.mdoc = ndoc.to_mdoc
+                               mpropdef.mproperty.deprecation = info
+                       end
                end
        end
 
@@ -604,6 +617,10 @@ redef class AMethPropdef
                if not is_init or n_kwredef != null then mprop = modelbuilder.try_get_mproperty_by_name(name_node, mclassdef, name).as(nullable MMethod)
                if mprop == null and look_like_a_root_init(modelbuilder) then
                        mprop = modelbuilder.the_root_init_mmethod
+                       var nb = n_block
+                       if nb isa ABlockExpr and nb.n_expr.is_empty and n_doc == null then
+                               modelbuilder.advice(self, "useless-init", "Warning: useless empty init in {mclassdef}")
+                       end
                end
                if mprop == null then
                        var mvisibility = new_property_visibility(modelbuilder, mclassdef, self.n_visibility)
@@ -624,7 +641,7 @@ redef class AMethPropdef
 
                var mpropdef = new MMethodDef(mclassdef, mprop, self.location)
 
-               set_doc(mpropdef)
+               set_doc(mpropdef, modelbuilder)
 
                self.mpropdef = mpropdef
                modelbuilder.mpropdef2npropdef[mpropdef] = self
@@ -712,9 +729,9 @@ redef class AMethPropdef
 
                msignature = new MSignature(mparameters, ret_type)
                mpropdef.msignature = msignature
-               mpropdef.is_abstract = self isa ADeferredMethPropdef
-               mpropdef.is_intern = self isa AInternMethPropdef
-               mpropdef.is_extern = self isa AExternPropdef
+               mpropdef.is_abstract = self.get_single_annotation("abstract", modelbuilder) != null
+               mpropdef.is_intern = self.get_single_annotation("intern", modelbuilder) != null
+               mpropdef.is_extern = self.n_extern_code_block != null or self.get_single_annotation("extern", modelbuilder) != null
        end
 
        redef fun check_signature(modelbuilder)
@@ -789,20 +806,16 @@ redef class AAttrPropdef
        var mlazypropdef: nullable MAttributeDef
 
        # The associated getter (read accessor) if any
-       var mreadpropdef: nullable MMethodDef writable
+       var mreadpropdef: nullable MMethodDef is writable
        # The associated setter (write accessor) if any
-       var mwritepropdef: nullable MMethodDef writable
+       var mwritepropdef: nullable MMethodDef is writable
 
        redef fun build_property(modelbuilder, mclassdef)
        do
                var mclass = mclassdef.mclass
 
                var name: String
-               if self.n_id != null then
-                       name = self.n_id.text
-               else
-                       name = self.n_id2.text
-               end
+               name = self.n_id2.text
 
                if mclass.kind == interface_kind or mclassdef.mclass.kind == enum_kind then
                        modelbuilder.error(self, "Error: Attempt to define attribute {name} in the interface {mclass}.")
@@ -812,114 +825,84 @@ redef class AAttrPropdef
                        modelbuilder.error(self, "Error: Attempt to define attribute {name} in the extern class {mclass}.")
                end
 
-               var nid = self.n_id
-               if nid != null then
-                       # Old attribute style
-                       var mprop = modelbuilder.try_get_mproperty_by_name(nid, mclassdef, name)
-                       if mprop == null then
-                               var mvisibility = new_property_visibility(modelbuilder, mclassdef, self.n_visibility)
-                               mprop = new MAttribute(mclassdef, name, mvisibility)
-                               if not self.check_redef_keyword(modelbuilder, mclassdef, self.n_kwredef, false, mprop) then return
-                       else
-                               assert mprop isa MAttribute
-                               check_redef_property_visibility(modelbuilder, self.n_visibility, mprop)
-                               if not self.check_redef_keyword(modelbuilder, mclassdef, self.n_kwredef, true, mprop) then return
-                       end
-                       mclassdef.mprop2npropdef[mprop] = self
-
-                       var mpropdef = new MAttributeDef(mclassdef, mprop, self.location)
-                       self.mpropdef = mpropdef
-                       modelbuilder.mpropdef2npropdef[mpropdef] = self
-                       set_doc(mpropdef)
+               # New attribute style
+               var nid2 = self.n_id2
+               var mprop = new MAttribute(mclassdef, "_" + name, private_visibility)
+               var mpropdef = new MAttributeDef(mclassdef, mprop, self.location)
+               self.mpropdef = mpropdef
+               modelbuilder.mpropdef2npropdef[mpropdef] = self
+               set_doc(mpropdef, modelbuilder)
 
-                       var nreadable = self.n_readable
-                       if nreadable != null then modelbuilder.error(nreadable, "Error: old-style getter no more supported")
-                       var nwritable = self.n_writable
-                       if nwritable != null then modelbuilder.error(nwritable, "Error: old-style setter no more supported")
+               var readname = name
+               var mreadprop = modelbuilder.try_get_mproperty_by_name(nid2, mclassdef, readname).as(nullable MMethod)
+               if mreadprop == null then
+                       var mvisibility = new_property_visibility(modelbuilder, mclassdef, self.n_visibility)
+                       mreadprop = new MMethod(mclassdef, readname, mvisibility)
+                       if not self.check_redef_keyword(modelbuilder, mclassdef, n_kwredef, false, mreadprop) then return
+                       mreadprop.deprecation = mprop.deprecation
                else
-                       # New attribute style
-                       var nid2 = self.n_id2.as(not null)
-                       var mprop = new MAttribute(mclassdef, "_" + name, private_visibility)
-                       var mpropdef = new MAttributeDef(mclassdef, mprop, self.location)
-                       self.mpropdef = mpropdef
-                       modelbuilder.mpropdef2npropdef[mpropdef] = self
-                       set_doc(mpropdef)
-
-                       var readname = name
-                       var mreadprop = modelbuilder.try_get_mproperty_by_name(nid2, mclassdef, readname).as(nullable MMethod)
-                       if mreadprop == null then
-                               var mvisibility = new_property_visibility(modelbuilder, mclassdef, self.n_visibility)
-                               mreadprop = new MMethod(mclassdef, readname, mvisibility)
-                               if not self.check_redef_keyword(modelbuilder, mclassdef, n_kwredef, false, mreadprop) then return
-                       else
-                               if not self.check_redef_keyword(modelbuilder, mclassdef, n_kwredef, true, mreadprop) then return
-                               check_redef_property_visibility(modelbuilder, self.n_visibility, mreadprop)
-                       end
-                       mclassdef.mprop2npropdef[mreadprop] = self
+                       if not self.check_redef_keyword(modelbuilder, mclassdef, n_kwredef, true, mreadprop) then return
+                       check_redef_property_visibility(modelbuilder, self.n_visibility, mreadprop)
+               end
+               mclassdef.mprop2npropdef[mreadprop] = self
 
-                       var mreadpropdef = new MMethodDef(mclassdef, mreadprop, self.location)
-                       self.mreadpropdef = mreadpropdef
-                       modelbuilder.mpropdef2npropdef[mreadpropdef] = self
-                       mreadpropdef.mdoc = mpropdef.mdoc
+               var mreadpropdef = new MMethodDef(mclassdef, mreadprop, self.location)
+               self.mreadpropdef = mreadpropdef
+               modelbuilder.mpropdef2npropdef[mreadpropdef] = self
+               mreadpropdef.mdoc = mpropdef.mdoc
 
-                       var atlazy = self.get_single_annotation("lazy", modelbuilder)
-                       if atlazy != null then
-                               if n_expr == null then
-                                       modelbuilder.error(atlazy, "Error: a lazy attribute needs a value")
-                               end
-                               is_lazy = true
-                               var mlazyprop = new MAttribute(mclassdef, "lazy _" + name, none_visibility)
-                               var mlazypropdef = new MAttributeDef(mclassdef, mlazyprop, self.location)
-                               self.mlazypropdef = mlazypropdef
+               var atlazy = self.get_single_annotation("lazy", modelbuilder)
+               if atlazy != null then
+                       if n_expr == null then
+                               modelbuilder.error(atlazy, "Error: a lazy attribute needs a value")
                        end
+                       is_lazy = true
+                       var mlazyprop = new MAttribute(mclassdef, "lazy _" + name, none_visibility)
+                       var mlazypropdef = new MAttributeDef(mclassdef, mlazyprop, self.location)
+                       self.mlazypropdef = mlazypropdef
+               end
 
-                       var atreadonly = self.get_single_annotation("readonly", modelbuilder)
-                       if atreadonly != null then
-                               if n_expr == null then
-                                       modelbuilder.error(atreadonly, "Error: a readonly attribute needs a value")
-                               end
-                               # No setter, so just leave
-                               return
+               var atreadonly = self.get_single_annotation("readonly", modelbuilder)
+               if atreadonly != null then
+                       if n_expr == null then
+                               modelbuilder.error(atreadonly, "Error: a readonly attribute needs a value")
                        end
+                       # No setter, so just leave
+                       return
+               end
 
-                       var writename = name + "="
-                       var nwritable = self.n_writable
-                       var atwritable = self.get_single_annotation("writable", modelbuilder)
-                       if atwritable != null then
-                               if not atwritable.n_args.is_empty then
-                                       writename = atwritable.arg_as_id(modelbuilder) or else writename
-                               end
+               var writename = name + "="
+               var atwritable = self.get_single_annotation("writable", modelbuilder)
+               if atwritable != null then
+                       if not atwritable.n_args.is_empty then
+                               writename = atwritable.arg_as_id(modelbuilder) or else writename
                        end
-                       var mwriteprop = modelbuilder.try_get_mproperty_by_name(nid2, mclassdef, writename).as(nullable MMethod)
-                       var nwkwredef: nullable Token = null
-                       if nwritable != null then nwkwredef = nwritable.n_kwredef
-                       if atwritable != null then nwkwredef = atwritable.n_kwredef
-                       if mwriteprop == null then
-                               var mvisibility
-                               if nwritable != null then
-                                       mvisibility = new_property_visibility(modelbuilder, mclassdef, nwritable.n_visibility)
-                               else if atwritable != null then
-                                       mvisibility = new_property_visibility(modelbuilder, mclassdef, atwritable.n_visibility)
-                               else
-                                       mvisibility = private_visibility
-                               end
-                               mwriteprop = new MMethod(mclassdef, writename, mvisibility)
-                               if not self.check_redef_keyword(modelbuilder, mclassdef, nwkwredef, false, mwriteprop) then return
+               end
+               var mwriteprop = modelbuilder.try_get_mproperty_by_name(nid2, mclassdef, writename).as(nullable MMethod)
+               var nwkwredef: nullable Token = null
+               if atwritable != null then nwkwredef = atwritable.n_kwredef
+               if mwriteprop == null then
+                       var mvisibility
+                       if atwritable != null then
+                               mvisibility = new_property_visibility(modelbuilder, mclassdef, atwritable.n_visibility)
                        else
-                               if not self.check_redef_keyword(modelbuilder, mclassdef, nwkwredef or else n_kwredef, true, mwriteprop) then return
-                               if nwritable != null then
-                                       check_redef_property_visibility(modelbuilder, nwritable.n_visibility, mwriteprop)
-                               else if atwritable != null then
-                                       check_redef_property_visibility(modelbuilder, atwritable.n_visibility, mwriteprop)
-                               end
+                               mvisibility = private_visibility
+                       end
+                       mwriteprop = new MMethod(mclassdef, writename, mvisibility)
+                       if not self.check_redef_keyword(modelbuilder, mclassdef, nwkwredef, false, mwriteprop) then return
+                       mwriteprop.deprecation = mprop.deprecation
+               else
+                       if not self.check_redef_keyword(modelbuilder, mclassdef, nwkwredef or else n_kwredef, true, mwriteprop) then return
+                       if atwritable != null then
+                               check_redef_property_visibility(modelbuilder, atwritable.n_visibility, mwriteprop)
                        end
-                       mclassdef.mprop2npropdef[mwriteprop] = self
-
-                       var mwritepropdef = new MMethodDef(mclassdef, mwriteprop, self.location)
-                       self.mwritepropdef = mwritepropdef
-                       modelbuilder.mpropdef2npropdef[mwritepropdef] = self
-                       mwritepropdef.mdoc = mpropdef.mdoc
                end
+               mclassdef.mprop2npropdef[mwriteprop] = self
+
+               var mwritepropdef = new MMethodDef(mclassdef, mwriteprop, self.location)
+               self.mwritepropdef = mwritepropdef
+               modelbuilder.mpropdef2npropdef[mwritepropdef] = self
+               mwritepropdef.mdoc = mpropdef.mdoc
        end
 
        redef fun build_signature(modelbuilder)
@@ -977,8 +960,8 @@ redef class AAttrPropdef
                else if ntype != null then
                        if nexpr isa ANewExpr then
                                var xmtype = modelbuilder.resolve_mtype(mmodule, mclassdef, nexpr.n_type)
-                               if xmtype == mtype and modelbuilder.toolcontext.opt_warn.value >= 2 then
-                                       modelbuilder.warning(ntype, "Warning: useless type definition")
+                               if xmtype == mtype then
+                                       modelbuilder.advice(ntype, "useless-type", "Warning: useless type definition")
                                end
                        end
                end
@@ -998,11 +981,7 @@ redef class AAttrPropdef
                var mwritepropdef = self.mwritepropdef
                if mwritepropdef != null then
                        var name: String
-                       if n_id != null then
-                               name = n_id.text.substring_from(1)
-                       else
-                               name = n_id2.text
-                       end
+                       name = n_id2.text
                        var mparameter = new MParameter(name, mtype, false)
                        var msignature = new MSignature([mparameter], null)
                        mwritepropdef.msignature = msignature
@@ -1120,7 +1099,7 @@ redef class ATypePropdef
                        var mvisibility = new_property_visibility(modelbuilder, mclassdef, self.n_visibility)
                        mprop = new MVirtualTypeProp(mclassdef, name, mvisibility)
                        for c in name.chars do if c >= 'a' and c<= 'z' then
-                               modelbuilder.warning(n_id, "Warning: lowercase in the virtual type {name}")
+                               modelbuilder.warning(n_id, "bad-type-name", "Warning: lowercase in the virtual type {name}")
                                break
                        end
                        if not self.check_redef_keyword(modelbuilder, mclassdef, self.n_kwredef, false, mprop) then return
@@ -1134,7 +1113,7 @@ redef class ATypePropdef
                var mpropdef = new MVirtualTypeDef(mclassdef, mprop, self.location)
                self.mpropdef = mpropdef
                modelbuilder.mpropdef2npropdef[mpropdef] = self
-               set_doc(mpropdef)
+               set_doc(mpropdef, modelbuilder)
 
                var atfixed = get_single_annotation("fixed", modelbuilder)
                if atfixed != null then
@@ -1199,7 +1178,7 @@ redef class ATypePropdef
                        end
                        if p.mclassdef.mclass == mclassdef.mclass then
                                # Still a warning to pass existing bad code
-                               modelbuilder.warning(n_type, "Redef Error: a virtual type cannot be refined.")
+                               modelbuilder.warning(n_type, "refine-type", "Redef Error: a virtual type cannot be refined.")
                                break
                        end
                        if not bound.is_subtype(mmodule, anchor, supbound) then
index f7ab770..70d593e 100644 (file)
@@ -15,7 +15,8 @@
 # Save and load `Model` from/to Neo4j base.
 #
 # Nit models are composed by MEntities.
-# This module creates NeoNode for each MEntity found in a `Model` and save them into Neo4j database.
+# This module creates NeoNode for each MEntity found in a `Model` and save them
+# into Neo4j database.
 #
 # see `Neo4jClient`.
 #
 #
 # Structure of the nit `Model` in base:
 #
+# Note : Any null or empty attribute will not be saved in the database.
+#
+# For any `MEntity` (in addition to specific data):
+#
+# * labels: model name (`model_name`) and `MEntity`.
+# * `name`: short (unqualified) name.
+# * `mdoc`: JSON array representing the associated Markdown documentation
+# (one item by line).
+#
+# Note : All nodes described here are MEntities.
+#
 # `MProject`
 #
-# * labels: `model_name`, `MEntity`, `MProject`
-# * `(:MProject)-[:ROOT]->(:MGroup)`
+# * labels: `MProject`, `model_name` and `MEntity`.
+# * `(:MProject)-[:ROOT]->(:MGroup)`: root of the group tree.
 #
 # `MGroup`
 #
-# * labels: `model_name`, `MEntity`, `MGroup`
-# * `(:MGroup)-[:PROJECT]->(:MProject)`
-# * `(:MGroup)-[:PARENT]->(:MGroup)`
+# * labels: `MGroup`, `model_name` and `MEntity`.
+# * `full_name`: fully qualified name.
+# * `(:MGroup)-[:PROJECT]->(:MProject)`: associated project.
+# * `(:MGroup)-[:PARENT]->(:MGroup)`: parent group. Does not exist for the root
+# group.
+# * `(:MGroup)-[:DECLARES]->(:MModule)`: modules that are direct children of
+# this group.
+# * `(:MGroup)-[:NESTS]->(:MGroup)`: nested groups that are direct children of
+# this group.
 #
 # `MModule`
 #
-# * labels: `model_name`, `MEntity`, `MModule`
-# * `(:MModule)-[:IMPORTS]->(:MModule)`
-# * `(:MModule)-[:INTRODUCES]->(:MClass)`
-# * `(:MModule)-[:DEFINES]->(:MClassDef)`
+# * labels: `MModule`, `model_name` and `MEntity`.
+# * `full_name`: fully qualified name.
+# * `location`: origin of the definition. SEE: `Location.to_s`
+# * `(:MModule)-[:IMPORTS]->(:MModule)`: modules that are imported directly.
+# * `(:MModule)-[:INTRODUCES]->(:MClass)`: all by classes introduced by this
+# module.
+# * `(:MModule)-[:DEFINES]->(:MClassDef)`: all class definitons contained in
+# this module.
 #
 # `MClass`
 #
-# * labels: `model_name`, `MEntity`, `MClass`
-# * `(:MClass)-[:CLASSTYPE]->(:MClassType)`
+# * labels: `MClass`, `model_name` and `MEntity`.
+# * `full_name`: fully qualified name.
+# * `arity`: number of generic formal parameters. 0 if the class is not generic.
+# * `kind`: kind of the class (`interface`, `abstract class`, etc.)
+# * `visibility`: visibility of the class.
+# * `(:MClass)-[:CLASSTYPE]->(:MClassType)`: SEE: `MClass.mclass_type`
+#
+# Arguments in the `CLASSTYPE` are named following the `parameter_names`
+# attribute of the `MClassDef` that introduces the class. A class definition
+# introduces a class if and only if it has this class as `MCLASS` and
+# has `is_intro` set to `true`.
 #
 # `MClassDef`
 #
-# * labels: `model_name`, `MEntity`, `MClassDef`
-# * `(:MClassDef)-[:BOUNDTYPE]->(:MClassType)`
-# * `(:MClassDef)-[:MCLASS]->(:MClass)`
-# * `(:MClassDef)-[:INTRODUCES]->(:MProperty)`
-# * `(:MClassDef)-[:DECLARES]->(:MPropDef)`
+# * labels: `MClassDef`, `model_name` and `MEntity`.
+# * `is_intro`: Does this definition introduce the class?
+# * `location`: origin of the definition. SEE: `Location.to_s`
+# * `parameter_names`: JSON array listing the name of each formal generic
+# parameter (in order of declaration).
+# * `(:MClassDef)-[:BOUNDTYPE]->(:MClassType)`: bounded type associated to the
+# classdef.
+# * `(:MClassDef)-[:MCLASS]->(:MClass)`: associated `MClass`.
+# * `(:MClassDef)-[:INTRODUCES]->(:MProperty)`: all properties introduced by
+# the classdef.
+# * `(:MClassDef)-[:DECLARES]->(:MPropDef)`: all property definitions in the
+# classdef (introductions and redefinitions).
+# * `(:MClassDef)-[:INHERITS]->(:MClassType)`: all declared super-types
 #
 # `MProperty`
 #
-# * labels: `model_name`, `MEntity`, `MProperty`
-# * `(:MProperty)-[:INTRO_CLASSDEF]->(:MClassDef)`
-#
-# MProperties can also have labels `MMethod`, `MAttribute`, `MVirtualTypeProp`.
+# * labels: `MProperty`, `model_name` and `MEntity`. Must also have `MMethod`,
+# `MAttribute` or `MVirtualTypeProp`, depending on the class of the represented
+# entity.
+# * `full_name`: fully qualified name.
+# * `visibility`: visibility of the property.
+# * `is_init`: Indicates if the property is a constructor. Exists only if the
+# node is a `MMethod`.
+# * `(:MProperty)-[:INTRO_CLASSDEF]->(:MClassDef)`: classdef that introduces
+# the property.
 #
 # `MPropDef`
 #
-# * labels: `model_name`, `MEntity`, `MPropDef`
-# * `(:MPropDef)-[:DEFINES]->(:MProperty)`
+# * labels: `MPropDef`, `model_name` and `MEntity`. Must also have `MMethodDef`,
+# `MAttributeDef` or `MVirtualTypeDef`, depending on the class of the
+# represented entity.
+# * `is_intro`: Does this definition introduce the property?
+# * `location`: origin of the definition. SEE: `Location.to_s`.
+# * `(:MPropDef)-[:DEFINES]->(:MProperty)`: associated property.
 #
-# MPropdefs can also have labels `MMethodDef`, `MAttributeDef`, `MVirtualTypeDef`.
+# Additional attributes and relationship for `MMethodDef`:
 #
-# `MMethodDef` are linked to a `MSignature`:
+# * `is_abstract`: Is the method definition abstract?
+# * `is_intern`: Is the method definition intern?
+# * `is_extern`: Is the method definition extern?
+# * `(:MMethodDef)-[:SIGNATURE]->(:MSignature)`: signature attached to the
+# property definition.
 #
-# * `(:MMethodDef)-[:SIGNATURE]->(:MSignature)`
+# Additional relationship for `MVirtualTypeDef`:
 #
-# `MVirtualTypeDef` are linked to a `MType` (its `bound`):
-#
-# * `(:MVirtualTypeDef)-[:BOUND]->(:MType)`
+# * `(:MVirtualTypeDef)-[:BOUND]->(:MType)`: type to which the virtual type
+# is bound in this definition. Exists only if this definition bound the virtual
+# type to an effective type.
 #
 # `MType`
 #
-# * labels: `model_name`, `MEntity`, `MType`
+# * labels: `MType`, `model_name` and `MEntity`. Must also have `MClassType`,
+# `MNullableType`, `MVirtualType` or `MSignature`, depending on the class of
+# the represented entity.
+#
+# Additional label and relationships for `MClassType`:
 #
-# MTypes can also have labels `MClassType`, `MGenericType`, `MNullableType`, `MVirtualType`
-# and `MSignature`.
+# * If it is a `MGenericType`, also has the `MGenericType` label.
+# * `(:MClassType)-[:CLASS]->(:MClass)`: SEE: `MClassType.mclass`
+# * `(:MClassType)-[:ARGUMENT]->(:MType)`: type arguments.
 #
-# `MClassType` and `MGenericType` both point to a `MClass` and have type `arguments`:
+# Arguments are named following the `parameter_names` attribute of the
+# `MClassDef` that introduces the class referred by `CLASS`.
 #
-# * `(:MClassType)-[:CLASS]->(:MClass)`
-# * `(:MClassType)-[:ARGUMENT]->(:MType)`
+# Additional relationship for `MVirtualType`:
 #
-# `MVirtualType` points to its introducing `MProperty`:
+# * `(:MVirtualType)-[:PROPERTY]->(:MProperty)`: associated property that
+# determines the type (usually a `MVirtualTypeProp`).
 #
-# * `(:MVirtualType)-[:PROPERTY]->(:MVirtualTypeDef)`
+# Additional attribute and relationship for `MParameterType`:
 #
-# `MParameterType` points to its introducing `MClass`:
+# * `rank`: position of the parameter (0 for the first parameter).
+# * `(:MParameterType)-[:CLASS]->(:MClass)`: generic class where the parameter
+# belong.
 #
-# * `(:MParameterType)-[:CLASS]->(:MClass)`
+# Additional relationship for `MNullableType`:
 #
-# `MNullableType` points to its non-nullable `MType`:
+# * `(:MNullableType)-[:TYPE]->(:MType)`: base type of the nullable type.
 #
-# * `(:MNullableType)-[:TYPE]->(:MType)`
+# Additional attribute and relationships for `MSignature`:
 #
-# `MSignature` can have `parameters` and a `return_mtype`:
+# * `parameter_names`: JSON array representing the list of the parameter names.
+# * `(:MSignature)-[:PARAMETER]->(:MParameter)`: parameters.
+# * `(:MSignature)-[:RETURNTYPE]->(:MType)`: return type. Does not exist for
+# procedures.
 #
-# * `(:MSignature)-[:PARAMETER]->(:MParameter)`
-# * `(:MSignature)-[:RETURNTYPE]->(:MType)`
+# In order to maintain the correct parameters order, each `MSignature` node
+# contains an array of parameter names corresponding to the parameter order in
+# the signature.
+#
+# For example, if the source code contains:
+#
+#     fun foo(a: A, b: B, c: C)
+#
+# The `MSignature` node will contain a property
+# `parameter_names = ["a", "b", "c"]` so the MSignature can be reconstructed
+# with the parameters in the correct order.
 #
 # `MParameter`
 #
-# * labels: `model_name`, `MEntity`, `MParameter`
-# * `(:MParameter)-[:TYPE]->(:MType)`
+# * labels: `MParameter`, `model_name` and `MEntity`.
+# * `is_vararg`: Is the parameter a vararg?
+# * `rank`: position of the parameter (0 for the first parameter).
+# * `(:MParameter)-[:TYPE]->(:MType)`: static type of the parameter.
+#
+# MParameters are also ranked by their position in the corresponding signature.
+# Rank 0 for the first parameter, 1 for the next one and etc.
 module neo
 
 import model
@@ -625,9 +702,15 @@ class NeoModel
                        node.out_edges.add(new NeoEdge(node, "TYPE", to_node(mtype.mtype)))
                else if mtype isa MSignature then
                        node.labels.add "MSignature"
+                       var names = new JsonArray
+                       var rank = 0
                        for mparameter in mtype.mparameters do
-                               node.out_edges.add(new NeoEdge(node, "PARAMETER", to_node(mparameter)))
+                               names.add mparameter.name
+                               var pnode = to_node(mparameter)
+                               pnode["rank"] = rank
+                               node.out_edges.add(new NeoEdge(node, "PARAMETER", pnode))
                        end
+                       if not names.is_empty then node["parameter_names"] = names
                        var return_mtype = mtype.return_mtype
                        if return_mtype != null then
                                node.out_edges.add(new NeoEdge(node, "RETURNTYPE", to_node(return_mtype)))
@@ -668,9 +751,20 @@ class NeoModel
                        mentities[node] = mtype
                        return mtype
                else if node.labels.has("MSignature") then
-                       var mparameters = new Array[MParameter]
+                       # Get all param nodes
+                       var mparam_nodes = new HashMap[String, MParameter]
                        for pnode in node.out_nodes("PARAMETER") do
-                               mparameters.add to_mparameter(model, pnode)
+                               var mparam = to_mparameter(model, pnode)
+                               mparam_nodes[mparam.name] = mparam
+                       end
+                       # Load params in the good order
+                       var mparam_names = node["parameter_names"]
+                       var mparameters = new Array[MParameter]
+                       if mparam_names isa JsonArray then
+                               for mparam_name in mparam_names do
+                                       var mparam = mparam_nodes[mparam_name.to_s]
+                                       mparameters.add mparam
+                               end
                        end
                        var return_mtype: nullable MType = null
                        var ret_nodes = node.out_nodes("RETURNTYPE")
index 6e24920..af02fa2 100644 (file)
@@ -22,7 +22,7 @@ import frontend
 
 # Create a tool context to handle options and paths
 var toolcontext = new ToolContext
-toolcontext.tooldescription = "Usage: nit [OPTION]... <file.nit>...\nInterprets and debbugs Nit programs."
+toolcontext.tooldescription = "Usage: nit [OPTION]... <file.nit>...\nInterprets and debugs Nit programs."
 # Add an option "-o" to enable compatibilit with the tests.sh script
 var opt = new OptionString("compatibility (does noting)", "-o")
 toolcontext.option_context.add_option(opt)
index cb75bc8..8af9779 100644 (file)
@@ -33,7 +33,10 @@ class VerifyNitniCallbacksPhase
 
        redef fun process_npropdef(npropdef)
        do
-               if not npropdef isa AExternPropdef then return
+               if not npropdef isa AMethPropdef then return
+               var mpropdef = npropdef.mpropdef
+               if mpropdef == null then return
+               if not mpropdef.is_extern then return
 
                npropdef.verify_nitni_callbacks(toolcontext)
        end
@@ -80,7 +83,7 @@ class ForeignCallbackSet
        end
 end
 
-redef class AExternPropdef
+redef class AMethPropdef
        private var foreign_callbacks_cache: nullable ForeignCallbackSet = null
 
        # All foreign callbacks from this method
@@ -139,6 +142,8 @@ redef class AExternPropdef
 
        redef fun accept_rapid_type_visitor(v)
        do
+               if foreign_callbacks_cache == null then return
+
                for cb in foreign_callbacks.callbacks do v.add_send(cb.recv_mtype, cb.mproperty.as(MMethod))
                for cast in foreign_callbacks.casts do v.add_cast_type(cast.to)
                for sup in foreign_callbacks.supers do
diff --git a/src/nitpick.nit b/src/nitpick.nit
new file mode 100644 (file)
index 0000000..c7664a9
--- /dev/null
@@ -0,0 +1,52 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# A program that collect potential style and code issues
+module nitpick
+
+import frontend
+
+redef class ToolContext
+       # Modules to analyze, other modules will only get a shallow processing.
+       var mmodules_to_check = new HashSet[MModule]
+       redef fun phase_process_npropdef(phase, npropdef)
+       do
+               var pd = npropdef.mpropdef
+
+               # Do not analyze the property bodies outside specified modules
+               if pd != null and not mmodules_to_check.has(pd.mclassdef.mmodule) then return
+               super
+       end
+end
+
+# Create a tool context to handle options and paths
+var toolcontext = new ToolContext
+toolcontext.tooldescription = "Usage: nitpick [OPTION]... <file.nit>...\nCollect potential style and code issues."
+
+# We do not add other options, so process them now!
+toolcontext.process_options(args)
+
+# Get arguments
+var arguments = toolcontext.option_context.rest
+
+# We need a model to collect stuffs
+var model = new Model
+# A model builder to parse files
+var modelbuilder = new ModelBuilder(model, toolcontext)
+
+# Here we load an process all modules passed on the command line
+var mmodules = modelbuilder.parse(arguments)
+toolcontext.mmodules_to_check.add_all mmodules
+
+modelbuilder.run_phases
index d49f60d..e7a733a 100644 (file)
@@ -616,7 +616,11 @@ redef class AAnnotation
        redef fun accept_pretty_printer(v) do
                v.visit n_atid
                if not n_args.is_empty then
-                       v.visit n_opar
+                       if n_opar == null then
+                               v.adds
+                       else
+                               v.visit n_opar
+                       end
                        v.visit_list n_args
                        v.visit n_cpar
                end
@@ -928,8 +932,7 @@ redef class AAttrPropdef
                super
                v.visit n_kwvar
                v.adds
-               if n_id != null then v.visit n_id
-               if n_id2 != null then v.visit n_id2
+               v.visit n_id2
 
                if n_type != null then
                        v.consume ":"
@@ -937,16 +940,6 @@ redef class AAttrPropdef
                        v.visit n_type
                end
 
-               if n_readable != null then
-                       v.adds
-                       v.visit n_readable
-               end
-
-               if n_writable != null then
-                       v.adds
-                       v.visit n_writable
-               end
-
                if n_expr != null then
                        v.adds
                        v.consume "="
@@ -987,6 +980,10 @@ end
 
 redef class AMethPropdef
        redef fun accept_pretty_printer(v) do
+               #  TODO: Handle extern annotations
+
+               var before = v.indent
+               var can_inline = v.can_inline(self)
                super
                if n_kwinit != null then v.visit n_kwinit
                if n_kwmeth != null then v.visit n_kwmeth
@@ -1004,94 +1001,13 @@ redef class AMethPropdef
                else
                        v.adds
                end
-       end
-
-       # Can be inlined if:
-       # * block is empty or can be inlined
-       # * contains no comments
-       redef fun is_inlinable do
-               if not super then return false
-               if n_annotations != null and not n_annotations.is_inlinable then return false
-               if n_block != null and not n_block.is_inlinable then return false
-               if not collect_comments.is_empty then return false
-               return true
-       end
-end
-
-redef class AMainMethPropdef
-       redef fun accept_pretty_printer(v) do
-               v.visit n_block
-               v.addn
-       end
-end
-
-redef class ADeferredMethPropdef
-       redef fun accept_pretty_printer(v) do
-               super
-               if n_annotations == null then
-                       while not v.current_token isa TKwis do v.skip
-                       v.consume "is"
-                       v.adds
-                       while not v.current_token isa TKwabstract do v.skip
-                       v.consume "abstract"
-               end
-               v.finish_line
-               v.addn
-       end
-end
-
-redef class AExternPropdef
-       redef fun accept_pretty_printer(v) do
-               super
-               while v.current_token isa TEol do v.skip
 
-               if v.current_token isa TKwis then
-                       v.consume "is"
-                       v.adds
+               if n_extern_calls != null or n_extern_code_block != null then
+                       if n_annotations != null then v.adds
+                       if n_extern_calls != null then v.visit n_extern_calls
+                       if n_extern_code_block != null then v.visit n_extern_code_block
                end
 
-               if v.current_token isa TKwextern then
-                       v.consume "extern"
-                       v.adds
-               end
-
-               if n_extern != null then v.visit n_extern
-               if n_extern_calls != null then v.visit n_extern_calls
-               if n_extern_code_block != null then v.visit n_extern_code_block
-               v.finish_line
-               v.addn
-       end
-
-       redef fun is_inlinable do
-               if not super then return false
-               if n_block != null and not n_block.is_inlinable then return false
-               if n_extern_calls != null and not n_extern_calls.is_inlinable then return false
-               if n_extern_code_block != null and not n_extern_code_block.is_inlinable then return false
-               return true
-       end
-
-       redef fun must_be_inline do
-               if super then return true
-               return n_extern != null
-       end
-end
-
-redef class AInternMethPropdef
-       redef fun accept_pretty_printer(v) do
-               super
-               v.consume "is"
-               v.adds
-               v.consume "intern"
-               v.finish_line
-               v.addn
-       end
-end
-
-redef class AConcreteMethPropdef
-       redef fun accept_pretty_printer(v) do
-               var before = v.indent
-               var can_inline = v.can_inline(self)
-               super
                var n_block = self.n_block
 
                if n_block != null then
@@ -1149,6 +1065,26 @@ redef class AConcreteMethPropdef
                v.addn
                assert v.indent == before
        end
+
+       # Can be inlined if:
+       # * block is empty or can be inlined
+       # * contains no comments
+       redef fun is_inlinable do
+               if not super then return false
+               if n_annotations != null and not n_annotations.is_inlinable then return false
+               if n_block != null and not n_block.is_inlinable then return false
+               if n_extern_calls != null and not n_extern_calls.is_inlinable then return false
+               if n_extern_code_block != null and not n_extern_code_block.is_inlinable then return false
+               if not collect_comments.is_empty then return false
+               return true
+       end
+end
+
+redef class AMainMethPropdef
+       redef fun accept_pretty_printer(v) do
+               v.visit n_block
+               v.addn
+       end
 end
 
 redef class ASignature
@@ -1903,34 +1839,6 @@ redef class AAttrReassignExpr
        end
 end
 
-redef class AAble
-       redef fun accept_pretty_printer(v) do
-               if n_kwredef != null then
-                       v.visit n_kwredef
-                       v.adds
-               end
-
-               if not n_visibility isa APublicVisibility then
-                       v.visit n_visibility
-                       v.adds
-               end
-       end
-end
-
-redef class AReadAble
-       redef fun accept_pretty_printer(v) do
-               super
-               v.visit n_kwreadable
-       end
-end
-
-redef class AWriteAble
-       redef fun accept_pretty_printer(v) do
-               super
-               v.visit n_kwwritable
-       end
-end
-
 # Exprs
 
 redef class AVardeclExpr
@@ -2228,6 +2136,10 @@ redef class AStarExpr
        redef fun bin_op do return "*"
 end
 
+redef class AStarstarExpr
+       redef fun bin_op do return "**"
+end
+
 redef class AStarshipExpr
        redef fun bin_op do return "<=>"
 end
index 43907aa..5ad0aed 100644 (file)
@@ -149,7 +149,7 @@ for mmodule in mmodules do
                module_name = "{mmodule.name}_serial"
                module_path = null
        else if module_path.has_suffix(".nit") then
-               module_name = mmodule.name.basename(".nit")
+               module_name = module_path.basename(".nit")
        else
                module_name = module_path.basename("")
                module_path += ".nit"
diff --git a/src/nituml.nit b/src/nituml.nit
new file mode 100644 (file)
index 0000000..04cb4b3
--- /dev/null
@@ -0,0 +1,58 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# UML generator in dot format.
+module nituml
+
+import modelbuilder
+import frontend
+import uml
+
+redef class ToolContext
+       var umlphase: Phase = new UMLPhase(self, null)
+
+       var opt_gen = new OptionEnum(["class", "package"], "Choose which type of uml diagram to generate", 0, "--diagram")
+
+       redef init do
+               option_context.add_option opt_gen
+               super
+       end
+end
+
+private class UMLPhase
+       super Phase
+       redef fun process_mainmodule(mainmodule, mmodules)
+       do
+               var d = new UMLModel(mainmodule.model, mainmodule, toolcontext)
+               if toolcontext.opt_gen.value == 0 then
+                       print d.generate_class_uml.write_to_string
+               else if toolcontext.opt_gen.value == 1 then
+                       print d.generate_package_uml.write_to_string
+               end
+       end
+end
+
+# process options
+var toolcontext = new ToolContext
+toolcontext.process_options(args)
+var arguments = toolcontext.option_context.rest
+
+# build model
+var model = new Model
+var mbuilder = new ModelBuilder(model, toolcontext)
+var mmodules = mbuilder.parse(arguments)
+
+if mmodules.is_empty then return
+mbuilder.run_phases
+toolcontext.run_global_phases(mmodules)
index 218f47b..f71a78e 100644 (file)
@@ -780,35 +780,6 @@ redef class MDoc
        end
 end
 
-redef class AAttrPropdef
-       private fun read_accessor: String do
-               var ret = "fun "
-               #FIXME bug with standard::stream::FDStream::fd
-               var name = mreadpropdef.mproperty.name
-               if mpropdef.mproperty.visibility.to_s == "public" then ret = "{ret}{name.green}"
-               if mpropdef.mproperty.visibility.to_s == "private" then ret = "{ret}{name.red}"
-               if mpropdef.mproperty.visibility.to_s == "protected" then ret = "{ret}{name.yellow}"
-               ret = "{ret}: {n_type.to_s}"
-               if n_kwredef != null then ret = "redef {ret}"
-               return ret
-       end
-
-       private fun write_accessor: String do
-               var ret = "fun "
-               var name = "{mreadpropdef.mproperty.name}="
-               if n_readable != null and n_readable.n_visibility != null then
-                       if n_readable.n_visibility isa APublicVisibility then ret = "{ret}{name.green}"
-                       if n_readable.n_visibility isa APrivateVisibility then ret = "{ret}{name.red}"
-                       if n_readable.n_visibility isa AProtectedVisibility then ret = "{ret}{name.yellow}"
-               else
-                       ret = "{ret}{name.red}"
-               end
-               ret = "{ret}({mreadpropdef.mproperty.name}: {n_type.to_s})"
-               if n_kwredef != null then ret = "redef {ret}"
-               return ret
-       end
-end
-
 # Redef String class to add a function to color the string
 redef class String
 
index 5e50cff..e7d48a0 100644 (file)
@@ -198,7 +198,7 @@ redef class TKwdo
     end
 end
 
-redef class TKwreadable
+redef class TKwvar
     redef fun parser_index: Int
     do
        return 16
@@ -210,7 +210,7 @@ redef class TKwreadable
     end
 end
 
-redef class TKwwritable
+redef class TKwextern
     redef fun parser_index: Int
     do
        return 17
@@ -222,7 +222,7 @@ redef class TKwwritable
     end
 end
 
-redef class TKwvar
+redef class TKwpublic
     redef fun parser_index: Int
     do
        return 18
@@ -234,7 +234,7 @@ redef class TKwvar
     end
 end
 
-redef class TKwintern
+redef class TKwprotected
     redef fun parser_index: Int
     do
        return 19
@@ -246,7 +246,7 @@ redef class TKwintern
     end
 end
 
-redef class TKwextern
+redef class TKwprivate
     redef fun parser_index: Int
     do
        return 20
@@ -258,7 +258,7 @@ redef class TKwextern
     end
 end
 
-redef class TKwpublic
+redef class TKwintrude
     redef fun parser_index: Int
     do
        return 21
@@ -270,7 +270,7 @@ redef class TKwpublic
     end
 end
 
-redef class TKwprotected
+redef class TKwif
     redef fun parser_index: Int
     do
        return 22
@@ -282,7 +282,7 @@ redef class TKwprotected
     end
 end
 
-redef class TKwprivate
+redef class TKwthen
     redef fun parser_index: Int
     do
        return 23
@@ -294,7 +294,7 @@ redef class TKwprivate
     end
 end
 
-redef class TKwintrude
+redef class TKwelse
     redef fun parser_index: Int
     do
        return 24
@@ -306,7 +306,7 @@ redef class TKwintrude
     end
 end
 
-redef class TKwif
+redef class TKwwhile
     redef fun parser_index: Int
     do
        return 25
@@ -318,7 +318,7 @@ redef class TKwif
     end
 end
 
-redef class TKwthen
+redef class TKwloop
     redef fun parser_index: Int
     do
        return 26
@@ -330,7 +330,7 @@ redef class TKwthen
     end
 end
 
-redef class TKwelse
+redef class TKwfor
     redef fun parser_index: Int
     do
        return 27
@@ -342,7 +342,7 @@ redef class TKwelse
     end
 end
 
-redef class TKwwhile
+redef class TKwin
     redef fun parser_index: Int
     do
        return 28
@@ -354,7 +354,7 @@ redef class TKwwhile
     end
 end
 
-redef class TKwloop
+redef class TKwand
     redef fun parser_index: Int
     do
        return 29
@@ -366,7 +366,7 @@ redef class TKwloop
     end
 end
 
-redef class TKwfor
+redef class TKwor
     redef fun parser_index: Int
     do
        return 30
@@ -378,7 +378,7 @@ redef class TKwfor
     end
 end
 
-redef class TKwin
+redef class TKwnot
     redef fun parser_index: Int
     do
        return 31
@@ -390,7 +390,7 @@ redef class TKwin
     end
 end
 
-redef class TKwand
+redef class TKwimplies
     redef fun parser_index: Int
     do
        return 32
@@ -402,7 +402,7 @@ redef class TKwand
     end
 end
 
-redef class TKwor
+redef class TKwreturn
     redef fun parser_index: Int
     do
        return 33
@@ -414,7 +414,7 @@ redef class TKwor
     end
 end
 
-redef class TKwnot
+redef class TKwcontinue
     redef fun parser_index: Int
     do
        return 34
@@ -426,7 +426,7 @@ redef class TKwnot
     end
 end
 
-redef class TKwimplies
+redef class TKwbreak
     redef fun parser_index: Int
     do
        return 35
@@ -438,7 +438,7 @@ redef class TKwimplies
     end
 end
 
-redef class TKwreturn
+redef class TKwabort
     redef fun parser_index: Int
     do
        return 36
@@ -450,7 +450,7 @@ redef class TKwreturn
     end
 end
 
-redef class TKwcontinue
+redef class TKwassert
     redef fun parser_index: Int
     do
        return 37
@@ -462,7 +462,7 @@ redef class TKwcontinue
     end
 end
 
-redef class TKwbreak
+redef class TKwnew
     redef fun parser_index: Int
     do
        return 38
@@ -474,7 +474,7 @@ redef class TKwbreak
     end
 end
 
-redef class TKwabort
+redef class TKwisa
     redef fun parser_index: Int
     do
        return 39
@@ -486,7 +486,7 @@ redef class TKwabort
     end
 end
 
-redef class TKwassert
+redef class TKwonce
     redef fun parser_index: Int
     do
        return 40
@@ -498,7 +498,7 @@ redef class TKwassert
     end
 end
 
-redef class TKwnew
+redef class TKwsuper
     redef fun parser_index: Int
     do
        return 41
@@ -510,7 +510,7 @@ redef class TKwnew
     end
 end
 
-redef class TKwisa
+redef class TKwself
     redef fun parser_index: Int
     do
        return 42
@@ -522,7 +522,7 @@ redef class TKwisa
     end
 end
 
-redef class TKwonce
+redef class TKwtrue
     redef fun parser_index: Int
     do
        return 43
@@ -534,7 +534,7 @@ redef class TKwonce
     end
 end
 
-redef class TKwsuper
+redef class TKwfalse
     redef fun parser_index: Int
     do
        return 44
@@ -546,7 +546,7 @@ redef class TKwsuper
     end
 end
 
-redef class TKwself
+redef class TKwnull
     redef fun parser_index: Int
     do
        return 45
@@ -558,7 +558,7 @@ redef class TKwself
     end
 end
 
-redef class TKwtrue
+redef class TKwas
     redef fun parser_index: Int
     do
        return 46
@@ -570,7 +570,7 @@ redef class TKwtrue
     end
 end
 
-redef class TKwfalse
+redef class TKwnullable
     redef fun parser_index: Int
     do
        return 47
@@ -582,7 +582,7 @@ redef class TKwfalse
     end
 end
 
-redef class TKwnull
+redef class TKwisset
     redef fun parser_index: Int
     do
        return 48
@@ -594,7 +594,7 @@ redef class TKwnull
     end
 end
 
-redef class TKwas
+redef class TKwlabel
     redef fun parser_index: Int
     do
        return 49
@@ -606,7 +606,7 @@ redef class TKwas
     end
 end
 
-redef class TKwnullable
+redef class TKwdebug
     redef fun parser_index: Int
     do
        return 50
@@ -618,7 +618,7 @@ redef class TKwnullable
     end
 end
 
-redef class TKwisset
+redef class TOpar
     redef fun parser_index: Int
     do
        return 51
@@ -630,7 +630,7 @@ redef class TKwisset
     end
 end
 
-redef class TKwlabel
+redef class TCpar
     redef fun parser_index: Int
     do
        return 52
@@ -642,7 +642,7 @@ redef class TKwlabel
     end
 end
 
-redef class TKwdebug
+redef class TObra
     redef fun parser_index: Int
     do
        return 53
@@ -654,7 +654,7 @@ redef class TKwdebug
     end
 end
 
-redef class TOpar
+redef class TCbra
     redef fun parser_index: Int
     do
        return 54
@@ -666,7 +666,7 @@ redef class TOpar
     end
 end
 
-redef class TCpar
+redef class TComma
     redef fun parser_index: Int
     do
        return 55
@@ -678,7 +678,7 @@ redef class TCpar
     end
 end
 
-redef class TObra
+redef class TColumn
     redef fun parser_index: Int
     do
        return 56
@@ -690,7 +690,7 @@ redef class TObra
     end
 end
 
-redef class TCbra
+redef class TQuad
     redef fun parser_index: Int
     do
        return 57
@@ -702,7 +702,7 @@ redef class TCbra
     end
 end
 
-redef class TComma
+redef class TAssign
     redef fun parser_index: Int
     do
        return 58
@@ -714,7 +714,7 @@ redef class TComma
     end
 end
 
-redef class TColumn
+redef class TPluseq
     redef fun parser_index: Int
     do
        return 59
@@ -726,7 +726,7 @@ redef class TColumn
     end
 end
 
-redef class TQuad
+redef class TMinuseq
     redef fun parser_index: Int
     do
        return 60
@@ -738,7 +738,7 @@ redef class TQuad
     end
 end
 
-redef class TAssign
+redef class TDotdotdot
     redef fun parser_index: Int
     do
        return 61
@@ -750,7 +750,7 @@ redef class TAssign
     end
 end
 
-redef class TPluseq
+redef class TDotdot
     redef fun parser_index: Int
     do
        return 62
@@ -762,7 +762,7 @@ redef class TPluseq
     end
 end
 
-redef class TMinuseq
+redef class TDot
     redef fun parser_index: Int
     do
        return 63
@@ -774,7 +774,7 @@ redef class TMinuseq
     end
 end
 
-redef class TDotdotdot
+redef class TPlus
     redef fun parser_index: Int
     do
        return 64
@@ -786,7 +786,7 @@ redef class TDotdotdot
     end
 end
 
-redef class TDotdot
+redef class TMinus
     redef fun parser_index: Int
     do
        return 65
@@ -798,7 +798,7 @@ redef class TDotdot
     end
 end
 
-redef class TDot
+redef class TStar
     redef fun parser_index: Int
     do
        return 66
@@ -810,7 +810,7 @@ redef class TDot
     end
 end
 
-redef class TPlus
+redef class TStarstar
     redef fun parser_index: Int
     do
        return 67
@@ -822,7 +822,7 @@ redef class TPlus
     end
 end
 
-redef class TMinus
+redef class TSlash
     redef fun parser_index: Int
     do
        return 68
@@ -834,7 +834,7 @@ redef class TMinus
     end
 end
 
-redef class TStar
+redef class TPercent
     redef fun parser_index: Int
     do
        return 69
@@ -846,7 +846,7 @@ redef class TStar
     end
 end
 
-redef class TSlash
+redef class TEq
     redef fun parser_index: Int
     do
        return 70
@@ -858,7 +858,7 @@ redef class TSlash
     end
 end
 
-redef class TPercent
+redef class TNe
     redef fun parser_index: Int
     do
        return 71
@@ -870,7 +870,7 @@ redef class TPercent
     end
 end
 
-redef class TEq
+redef class TLt
     redef fun parser_index: Int
     do
        return 72
@@ -882,7 +882,7 @@ redef class TEq
     end
 end
 
-redef class TNe
+redef class TLe
     redef fun parser_index: Int
     do
        return 73
@@ -894,7 +894,7 @@ redef class TNe
     end
 end
 
-redef class TLt
+redef class TLl
     redef fun parser_index: Int
     do
        return 74
@@ -906,7 +906,7 @@ redef class TLt
     end
 end
 
-redef class TLe
+redef class TGt
     redef fun parser_index: Int
     do
        return 75
@@ -918,7 +918,7 @@ redef class TLe
     end
 end
 
-redef class TLl
+redef class TGe
     redef fun parser_index: Int
     do
        return 76
@@ -930,7 +930,7 @@ redef class TLl
     end
 end
 
-redef class TGt
+redef class TGg
     redef fun parser_index: Int
     do
        return 77
@@ -942,7 +942,7 @@ redef class TGt
     end
 end
 
-redef class TGe
+redef class TStarship
     redef fun parser_index: Int
     do
        return 78
@@ -954,7 +954,7 @@ redef class TGe
     end
 end
 
-redef class TGg
+redef class TBang
     redef fun parser_index: Int
     do
        return 79
@@ -966,7 +966,7 @@ redef class TGg
     end
 end
 
-redef class TStarship
+redef class TAt
     redef fun parser_index: Int
     do
        return 80
@@ -978,7 +978,7 @@ redef class TStarship
     end
 end
 
-redef class TBang
+redef class TClassid
     redef fun parser_index: Int
     do
        return 81
@@ -990,7 +990,7 @@ redef class TBang
     end
 end
 
-redef class TAt
+redef class TId
     redef fun parser_index: Int
     do
        return 82
@@ -1002,7 +1002,7 @@ redef class TAt
     end
 end
 
-redef class TClassid
+redef class TAttrid
     redef fun parser_index: Int
     do
        return 83
@@ -1014,7 +1014,7 @@ redef class TClassid
     end
 end
 
-redef class TId
+redef class TNumber
     redef fun parser_index: Int
     do
        return 84
@@ -1026,7 +1026,7 @@ redef class TId
     end
 end
 
-redef class TAttrid
+redef class THexNumber
     redef fun parser_index: Int
     do
        return 85
@@ -1038,7 +1038,7 @@ redef class TAttrid
     end
 end
 
-redef class TNumber
+redef class TFloat
     redef fun parser_index: Int
     do
        return 86
@@ -1050,7 +1050,7 @@ redef class TNumber
     end
 end
 
-redef class THexNumber
+redef class TString
     redef fun parser_index: Int
     do
        return 87
@@ -1062,7 +1062,7 @@ redef class THexNumber
     end
 end
 
-redef class TFloat
+redef class TStartString
     redef fun parser_index: Int
     do
        return 88
@@ -1074,7 +1074,7 @@ redef class TFloat
     end
 end
 
-redef class TString
+redef class TMidString
     redef fun parser_index: Int
     do
        return 89
@@ -1086,7 +1086,7 @@ redef class TString
     end
 end
 
-redef class TStartString
+redef class TEndString
     redef fun parser_index: Int
     do
        return 90
@@ -1098,7 +1098,7 @@ redef class TStartString
     end
 end
 
-redef class TMidString
+redef class TChar
     redef fun parser_index: Int
     do
        return 91
@@ -1110,7 +1110,7 @@ redef class TMidString
     end
 end
 
-redef class TEndString
+redef class TBadString
     redef fun parser_index: Int
     do
        return 92
@@ -1122,7 +1122,7 @@ redef class TEndString
     end
 end
 
-redef class TChar
+redef class TBadChar
     redef fun parser_index: Int
     do
        return 93
@@ -1134,7 +1134,7 @@ redef class TChar
     end
 end
 
-redef class TBadString
+redef class TExternCodeSegment
     redef fun parser_index: Int
     do
        return 94
@@ -1146,27 +1146,11 @@ redef class TBadString
     end
 end
 
-redef class TBadChar
-    redef fun parser_index: Int
-    do
-       return 95
-    end
-
-    init init_tk(loc: Location)
-    do
-               _location = loc
-    end
-end
 
-redef class TExternCodeSegment
+redef class EOF
     redef fun parser_index: Int
     do
-       return 96
-    end
-
-    init init_tk(loc: Location)
-    do
-               _location = loc
+       return 95
     end
 end
 
@@ -1222,246 +1206,240 @@ redef class Lexer
                        return new TKwdo.init_tk(location)
                end
                if accept_token == 17 then
-                       return new TKwreadable.init_tk(location)
+                       return new TKwvar.init_tk(location)
                end
                if accept_token == 18 then
-                       return new TKwwritable.init_tk(location)
+                       return new TKwextern.init_tk(location)
                end
                if accept_token == 19 then
-                       return new TKwvar.init_tk(location)
+                       return new TKwpublic.init_tk(location)
                end
                if accept_token == 20 then
-                       return new TKwintern.init_tk(location)
+                       return new TKwprotected.init_tk(location)
                end
                if accept_token == 21 then
-                       return new TKwextern.init_tk(location)
+                       return new TKwprivate.init_tk(location)
                end
                if accept_token == 22 then
-                       return new TKwpublic.init_tk(location)
+                       return new TKwintrude.init_tk(location)
                end
                if accept_token == 23 then
-                       return new TKwprotected.init_tk(location)
+                       return new TKwif.init_tk(location)
                end
                if accept_token == 24 then
-                       return new TKwprivate.init_tk(location)
+                       return new TKwthen.init_tk(location)
                end
                if accept_token == 25 then
-                       return new TKwintrude.init_tk(location)
+                       return new TKwelse.init_tk(location)
                end
                if accept_token == 26 then
-                       return new TKwif.init_tk(location)
+                       return new TKwwhile.init_tk(location)
                end
                if accept_token == 27 then
-                       return new TKwthen.init_tk(location)
+                       return new TKwloop.init_tk(location)
                end
                if accept_token == 28 then
-                       return new TKwelse.init_tk(location)
+                       return new TKwfor.init_tk(location)
                end
                if accept_token == 29 then
-                       return new TKwwhile.init_tk(location)
+                       return new TKwin.init_tk(location)
                end
                if accept_token == 30 then
-                       return new TKwloop.init_tk(location)
+                       return new TKwand.init_tk(location)
                end
                if accept_token == 31 then
-                       return new TKwfor.init_tk(location)
+                       return new TKwor.init_tk(location)
                end
                if accept_token == 32 then
-                       return new TKwin.init_tk(location)
+                       return new TKwnot.init_tk(location)
                end
                if accept_token == 33 then
-                       return new TKwand.init_tk(location)
+                       return new TKwimplies.init_tk(location)
                end
                if accept_token == 34 then
-                       return new TKwor.init_tk(location)
+                       return new TKwreturn.init_tk(location)
                end
                if accept_token == 35 then
-                       return new TKwnot.init_tk(location)
+                       return new TKwcontinue.init_tk(location)
                end
                if accept_token == 36 then
-                       return new TKwimplies.init_tk(location)
+                       return new TKwbreak.init_tk(location)
                end
                if accept_token == 37 then
-                       return new TKwreturn.init_tk(location)
+                       return new TKwabort.init_tk(location)
                end
                if accept_token == 38 then
-                       return new TKwcontinue.init_tk(location)
+                       return new TKwassert.init_tk(location)
                end
                if accept_token == 39 then
-                       return new TKwbreak.init_tk(location)
+                       return new TKwnew.init_tk(location)
                end
                if accept_token == 40 then
-                       return new TKwabort.init_tk(location)
+                       return new TKwisa.init_tk(location)
                end
                if accept_token == 41 then
-                       return new TKwassert.init_tk(location)
+                       return new TKwonce.init_tk(location)
                end
                if accept_token == 42 then
-                       return new TKwnew.init_tk(location)
+                       return new TKwsuper.init_tk(location)
                end
                if accept_token == 43 then
-                       return new TKwisa.init_tk(location)
+                       return new TKwself.init_tk(location)
                end
                if accept_token == 44 then
-                       return new TKwonce.init_tk(location)
+                       return new TKwtrue.init_tk(location)
                end
                if accept_token == 45 then
-                       return new TKwsuper.init_tk(location)
+                       return new TKwfalse.init_tk(location)
                end
                if accept_token == 46 then
-                       return new TKwself.init_tk(location)
+                       return new TKwnull.init_tk(location)
                end
                if accept_token == 47 then
-                       return new TKwtrue.init_tk(location)
+                       return new TKwas.init_tk(location)
                end
                if accept_token == 48 then
-                       return new TKwfalse.init_tk(location)
+                       return new TKwnullable.init_tk(location)
                end
                if accept_token == 49 then
-                       return new TKwnull.init_tk(location)
+                       return new TKwisset.init_tk(location)
                end
                if accept_token == 50 then
-                       return new TKwas.init_tk(location)
+                       return new TKwlabel.init_tk(location)
                end
                if accept_token == 51 then
-                       return new TKwnullable.init_tk(location)
+                       return new TKwdebug.init_tk(location)
                end
                if accept_token == 52 then
-                       return new TKwisset.init_tk(location)
+                       return new TOpar.init_tk(location)
                end
                if accept_token == 53 then
-                       return new TKwlabel.init_tk(location)
+                       return new TCpar.init_tk(location)
                end
                if accept_token == 54 then
-                       return new TKwdebug.init_tk(location)
+                       return new TObra.init_tk(location)
                end
                if accept_token == 55 then
-                       return new TOpar.init_tk(location)
+                       return new TCbra.init_tk(location)
                end
                if accept_token == 56 then
-                       return new TCpar.init_tk(location)
+                       return new TComma.init_tk(location)
                end
                if accept_token == 57 then
-                       return new TObra.init_tk(location)
+                       return new TColumn.init_tk(location)
                end
                if accept_token == 58 then
-                       return new TCbra.init_tk(location)
+                       return new TQuad.init_tk(location)
                end
                if accept_token == 59 then
-                       return new TComma.init_tk(location)
+                       return new TAssign.init_tk(location)
                end
                if accept_token == 60 then
-                       return new TColumn.init_tk(location)
+                       return new TPluseq.init_tk(location)
                end
                if accept_token == 61 then
-                       return new TQuad.init_tk(location)
+                       return new TMinuseq.init_tk(location)
                end
                if accept_token == 62 then
-                       return new TAssign.init_tk(location)
+                       return new TDotdotdot.init_tk(location)
                end
                if accept_token == 63 then
-                       return new TPluseq.init_tk(location)
+                       return new TDotdot.init_tk(location)
                end
                if accept_token == 64 then
-                       return new TMinuseq.init_tk(location)
+                       return new TDot.init_tk(location)
                end
                if accept_token == 65 then
-                       return new TDotdotdot.init_tk(location)
+                       return new TPlus.init_tk(location)
                end
                if accept_token == 66 then
-                       return new TDotdot.init_tk(location)
+                       return new TMinus.init_tk(location)
                end
                if accept_token == 67 then
-                       return new TDot.init_tk(location)
+                       return new TStar.init_tk(location)
                end
                if accept_token == 68 then
-                       return new TPlus.init_tk(location)
+                       return new TStarstar.init_tk(location)
                end
                if accept_token == 69 then
-                       return new TMinus.init_tk(location)
-               end
-               if accept_token == 70 then
-                       return new TStar.init_tk(location)
-               end
-               if accept_token == 71 then
                        return new TSlash.init_tk(location)
                end
-               if accept_token == 72 then
+               if accept_token == 70 then
                        return new TPercent.init_tk(location)
                end
-               if accept_token == 73 then
+               if accept_token == 71 then
                        return new TEq.init_tk(location)
                end
-               if accept_token == 74 then
+               if accept_token == 72 then
                        return new TNe.init_tk(location)
                end
-               if accept_token == 75 then
+               if accept_token == 73 then
                        return new TLt.init_tk(location)
                end
-               if accept_token == 76 then
+               if accept_token == 74 then
                        return new TLe.init_tk(location)
                end
-               if accept_token == 77 then
+               if accept_token == 75 then
                        return new TLl.init_tk(location)
                end
-               if accept_token == 78 then
+               if accept_token == 76 then
                        return new TGt.init_tk(location)
                end
-               if accept_token == 79 then
+               if accept_token == 77 then
                        return new TGe.init_tk(location)
                end
-               if accept_token == 80 then
+               if accept_token == 78 then
                        return new TGg.init_tk(location)
                end
-               if accept_token == 81 then
+               if accept_token == 79 then
                        return new TStarship.init_tk(location)
                end
-               if accept_token == 82 then
+               if accept_token == 80 then
                        return new TBang.init_tk(location)
                end
-               if accept_token == 83 then
+               if accept_token == 81 then
                        return new TAt.init_tk(location)
                end
-               if accept_token == 84 then
+               if accept_token == 82 then
                        return new TClassid.init_tk(location)
                end
-               if accept_token == 85 then
+               if accept_token == 83 then
                        return new TId.init_tk(location)
                end
-               if accept_token == 86 then
+               if accept_token == 84 then
                        return new TAttrid.init_tk(location)
                end
-               if accept_token == 87 then
+               if accept_token == 85 then
                        return new TNumber.init_tk(location)
                end
-               if accept_token == 88 then
+               if accept_token == 86 then
                        return new THexNumber.init_tk(location)
                end
-               if accept_token == 89 then
+               if accept_token == 87 then
                        return new TFloat.init_tk(location)
                end
-               if accept_token == 90 then
+               if accept_token == 88 then
                        return new TString.init_tk(location)
                end
-               if accept_token == 91 then
+               if accept_token == 89 then
                        return new TStartString.init_tk(location)
                end
-               if accept_token == 92 then
+               if accept_token == 90 then
                        return new TMidString.init_tk(location)
                end
-               if accept_token == 93 then
+               if accept_token == 91 then
                        return new TEndString.init_tk(location)
                end
-               if accept_token == 94 then
+               if accept_token == 92 then
                        return new TChar.init_tk(location)
                end
-               if accept_token == 95 then
+               if accept_token == 93 then
                        return new TBadString.init_tk(location)
                end
-               if accept_token == 96 then
+               if accept_token == 94 then
                        return new TBadChar.init_tk(location)
                end
-               if accept_token == 97 then
+               if accept_token == 95 then
                        return new TExternCodeSegment.init_tk(location)
                end
                abort # unknown token index `accept_token`
index e7102b6..2d93018 100644 (file)
@@ -39,11 +39,6 @@ redef class Token
 end
 
 redef class EOF
-    redef fun parser_index: Int
-    do
-       return 97
-    end
-
     init init_tk(loc: Location)
     do
         _cached_text = ""
index 52516c7..e26cf3b 100644 (file)
@@ -110,10 +110,7 @@ kwinit = 'init';
 kwredef = 'redef';
 kwis = 'is';
 kwdo = 'do';
-kwreadable = 'readable';
-kwwritable = 'writable';
 kwvar = 'var';
-kwintern = 'intern';
 kwextern = 'extern';
 kwpublic = 'public';
 kwprotected = 'protected';
@@ -165,6 +162,7 @@ dot = '.';
 plus = '+';
 minus = '-';
 star = '*';
+starstar = '**';
 slash = '/';
 percent = '%';
 eq = '==';
@@ -262,21 +260,15 @@ propdefs~toplevel {-> propdef}
        = propdef~toplevel n1 {-> propdef~toplevel.propdef}
        ;
 propdef~toplevel {-> propdef}
-       = {meth} [doc]:no redef visibility kwmeth methid signature annotation_noend? kwdo stmtso kwend_o {-> New propdef.concrete_meth(doc.doc, redef.kwredef, visibility, kwmeth, methid, signature, annotation_noend.annotations, stmtso.expr)}
-       | {nobody} [doc]:no redef visibility kwmeth methid signature annotation_withend_nonull {-> New propdef.deferred_meth(doc.doc, redef.kwredef, visibility, kwmeth, methid, signature.signature, annotation_withend_nonull.annotations)}
-!toplevel| {deferred} [doc]:no redef visibility kwmeth methid signature kwis kwabstract {-> New propdef.deferred_meth(doc.doc, redef.kwredef, visibility, kwmeth, methid, signature.signature, Null)}
-       | {intern} [doc]:no redef visibility kwmeth methid signature kwis kwintern {-> New propdef.intern_meth(doc.doc, redef.kwredef, visibility, kwmeth, methid, signature.signature)}
-!toplevel| {intern_new} [doc]:no redef visibility kwnew methid? signature kwis kwintern {-> New propdef.intern_new(doc.doc, redef.kwredef, visibility, kwnew, methid, signature)}
-       | {extern} [doc]:no redef visibility kwmeth methid signature kwis kwextern string_o extern_calls extern_code_block_o {-> New propdef.extern_meth(doc.doc, redef.kwredef, visibility, kwmeth, methid, signature.signature, Null, string_o.string, extern_calls, extern_code_block_o.extern_code_block)}
-       | {extern_implicit} [doc]:no redef visibility kwmeth methid signature annotation_noend? extern_calls extern_code_block {-> New propdef.extern_meth(doc.doc, redef.kwredef, visibility, kwmeth, methid, signature.signature, annotation_noend.annotations, Null, extern_calls, extern_code_block)}
-!toplevel| {var} [doc]:no readable? writable? redef visibility kwvar attrid typing_o {-> New propdef.attr(doc.doc, readable.able, writable.able, redef.kwredef, visibility, kwvar, attrid, Null, typing_o.type, Null, Null)}
-!toplevel| {var2} [doc]:no readable? writable? redef visibility kwvar attrid typing_o assign [n2]:no expr {-> New propdef.attr(doc.doc, readable.able, writable.able, redef.kwredef, visibility, kwvar, attrid, Null, typing_o.type, Null, expr)}
-!toplevel| {var3} [doc]:no redef visibility kwvar id typing_o writable? annotation_withend {-> New propdef.attr(doc.doc, Null, writable.able, redef.kwredef, visibility, kwvar, Null, id, typing_o.type, annotation_withend.annotations, Null)}
-!toplevel| {var4} [doc]:no redef visibility kwvar id typing_o writable? assign [n2]:no expr annotation_withend {-> New propdef.attr(doc.doc, Null, writable.able, redef.kwredef, visibility, kwvar, Null, id, typing_o.type, annotation_withend.annotations, expr.expr)}
-!toplevel| {init} [doc]:no redef visibility kwinit methid? signature annotation_noend? kwdo stmtso kwend_o {-> New propdef.concrete_init(doc.doc, redef.kwredef, visibility, kwinit, methid, signature, annotation_noend.annotations, stmtso.expr)}
+       = {meth} [doc]:no redef visibility kwmeth methid signature annotation_noend? kwdo stmtso kwend_o {-> New propdef.meth(doc.doc, redef.kwredef, visibility, kwmeth, Null, Null, methid, signature, annotation_noend.annotations, Null, Null, stmtso.expr)}
+       | {nobody} [doc]:no redef visibility kwmeth methid signature annotation_withend_nonull {-> New propdef.meth(doc.doc, redef.kwredef, visibility, kwmeth, Null, Null, methid, signature.signature, annotation_withend_nonull.annotations, Null, Null, Null)}
+!toplevel| {intern_new} [doc]:no redef visibility kwnew methid? signature annotation_withend_nonull {-> New propdef.meth(doc.doc, redef.kwredef, visibility, Null, Null, kwnew, methid, signature, annotation_withend_nonull.annotations, Null, Null, Null)}
+       | {extern_implicit} [doc]:no redef visibility kwmeth methid signature annotation_noend? extern_calls extern_code_block {-> New propdef.meth(doc.doc, redef.kwredef, visibility, kwmeth, Null, Null, methid, signature.signature, annotation_noend.annotations, extern_calls, extern_code_block, Null)}
+!toplevel| {var3} [doc]:no redef visibility kwvar id typing_o annotation_withend {-> New propdef.attr(doc.doc, redef.kwredef, visibility, kwvar, id, typing_o.type, Null, annotation_withend.annotations)}
+!toplevel| {var4} [doc]:no redef visibility kwvar id typing_o assign [n2]:no expr annotation_withend {-> New propdef.attr(doc.doc, redef.kwredef, visibility, kwvar, id, typing_o.type, expr.expr, annotation_withend.annotations)}
+!toplevel| {init} [doc]:no redef visibility kwinit methid? signature annotation_noend? kwdo stmtso kwend_o {-> New propdef.meth(doc.doc, redef.kwredef, visibility, Null, kwinit, Null, methid, signature, annotation_noend.annotations, Null, Null, stmtso.expr)}
 !toplevel| {type} [doc]:no redef visibility kwtype classid typing annotation_withend {-> New propdef.type(doc.doc, redef.kwredef, visibility, kwtype, classid, typing.type, annotation_withend.annotations)}
-!toplevel| {extern_init} [doc]:no redef visibility kwnew methid? signature kwis kwextern string_o extern_calls extern_code_block_o {-> New propdef.extern_init(doc.doc, redef.kwredef, visibility, kwnew, methid, signature, Null, string_o.string, extern_calls, extern_code_block_o.extern_code_block)}
-!toplevel| {extern_init_implicit} [doc]:no redef visibility kwnew methid? signature annotation_noend? extern_calls extern_code_block {-> New propdef.extern_init(doc.doc, redef.kwredef, visibility, kwnew, methid, signature, annotation_noend.annotations, Null, extern_calls, extern_code_block)}
+!toplevel| {extern_init_implicit} [doc]:no redef visibility kwnew methid? signature annotation_noend? extern_calls extern_code_block {-> New propdef.meth(doc.doc, redef.kwredef, visibility, Null, Null, kwnew, methid, signature, annotation_noend.annotations, extern_calls, extern_code_block, Null)}
        ;
 annotation_withend~nonull {-> annotations?}
        = {oneliner} kwis many_annotations {-> many_annotations.annotations}
@@ -287,12 +279,6 @@ annotation_noend {-> annotations}
        = {oneliner} kwis many_annotations {-> many_annotations.annotations}
        | {more} kwis n1 line_annotations {-> line_annotations.annotations}
        ;
-readable {-> able}
-       = redef visibility kwreadable {-> New able.read(redef.kwredef, kwreadable)}
-       ;
-writable {-> able}
-       = redef visibility kwwritable {-> New able.write(redef.kwredef, visibility, kwwritable)}
-       ;
 
 visibility
        = {public} {-> New visibility.public(Null)}
@@ -307,6 +293,7 @@ methid {-> methid}
        | {plus} plus {-> New methid.plus(plus)}
        | {minus} minus {-> New methid.minus(minus)}
        | {star} star {-> New methid.star(star)}
+       | {starstar} starstar {-> New methid.starstar(starstar)}
        | {slash} slash {-> New methid.slash(slash)}
        | {percent} percent {-> New methid.percent(percent)}
        | {eq} eq {-> New methid.eq(eq)}
@@ -528,10 +515,15 @@ expr_add~nopar~nobra {-> expr}
        ;
 
 expr_mul~nopar~nobra {-> expr}
+       = expr_pow~nopar~nobra {-> expr_pow~nopar~nobra.expr}
+       | {:star} expr_mul~nopar~nobra :star :no [expr2]:expr_pow~nopar~nobra
+       | {:slash} expr_mul~nopar~nobra :slash :no [expr2]:expr_pow~nopar~nobra
+       | {:percent} expr_mul~nopar~nobra :percent :no [expr2]:expr_pow~nopar~nobra
+       ;
+
+expr_pow~nopar~nobra {-> expr}
        = expr_minus~nopar~nobra {-> expr_minus~nopar~nobra.expr}
-       | {:star} expr_mul~nopar~nobra :star :no [expr2]:expr_minus~nopar~nobra
-       | {:slash} expr_mul~nopar~nobra :slash :no [expr2]:expr_minus~nopar~nobra
-       | {:percent} expr_mul~nopar~nobra :percent :no [expr2]:expr_minus~nopar~nobra
+       | {:starstar} expr_minus~nopar~nobra :starstar :no [expr2]:expr_pow~nopar~nobra
        ;
 
 expr_minus~nopar~nobra {-> expr}
@@ -547,17 +539,21 @@ expr_new~nopar~nobra {-> expr}
        ;
 
 expr_atom~nopar~nobra {-> expr}
-       = {attr} recv~nopar~nobra qualified_o attrid {-> New expr.attr(recv~nopar~nobra.expr, attrid)}
+       = expr_single~nopar~nobra {-> expr_single~nopar~nobra.expr}
+       | {attr} recv~nopar~nobra qualified_o attrid {-> New expr.attr(recv~nopar~nobra.expr, attrid)}
        | {call} recv~nopar~nobra qid args {-> New expr.call(recv~nopar~nobra.expr, qid.id, args.exprs)}
        | {super} qualified_o kwsuper args {-> New expr.super(qualified_o.qualified, kwsuper, args.exprs)}
        | {init} recv~nopar~nobra kwinit args {-> New expr.init(recv~nopar~nobra.expr, kwinit, args.exprs)}
 !nobra | {bra} expr_atom~nopar braargs {-> New expr.bra(expr_atom~nopar.expr, braargs.exprs)}
        | {new} kwnew no type~nobra_nopar dot [n2]:no qid args {-> New expr.new(kwnew, type~nobra_nopar.type, qid.id, args.exprs)}
-// !nopar to unambiguise 'foo[5].bar' between '(foo[5]).bar' and 'foo([5].bar),
-!nobra!nopar   | {range} obra no expr [n2]:no dotdot [n3]:no [expr2]:expr_nobra [n4]:no cbra annotations_o {-> New expr.crange(obra, expr, expr2.expr, cbra, annotations_o.annotations)}
-!nobra!nopar   | {orange} obra no expr [n2]:no dotdot [n3]:no [expr2]:expr_nobra [n4]:no [cbra]:obra annotations_o {-> New expr.orange(obra, expr, expr2.expr, cbra, annotations_o.annotations)}
-!nobra!nopar   | {array} braargs annotations_o {-> New expr.array(braargs.exprs, annotations_o.annotations)}
-       | {self} kwself annotations_o {-> New expr.self(kwself, annotations_o.annotations)}
+        | {as_cast} expr_atom~nopar~nobra dot no kwas [n2]:no opar [n3]:no type [n4]:no cpar {-> New expr.as_cast(expr_atom~nopar~nobra.expr, kwas, opar, type, cpar)}
+        | {as_notnull} expr_atom~nopar~nobra dot no kwas [n2]:no opar [n3]:no kwnot [n4]:no kwnull [n5]:no cpar {-> New expr.as_notnull(expr_atom~nopar~nobra.expr, kwas, opar, kwnot, kwnull, cpar)}
+        | {as_notnull2}expr_atom~nopar~nobra dot no kwas [n2]:no kwnot [n4]:no kwnull {-> New expr.as_notnull(expr_atom~nopar~nobra.expr, kwas, Null, kwnot, kwnull, Null)}
+       | {vararg} [expr]:expr_atom~nopar~nobra dotdotdot {-> New expr.vararg(expr.expr, dotdotdot)}
+       ;
+
+expr_single~nopar~nobra {-> expr}
+       = {self} kwself annotations_o {-> New expr.self(kwself, annotations_o.annotations)}
        | {true} kwtrue annotations_o {-> New expr.true(kwtrue, annotations_o.annotations)}
        | {false} kwfalse annotations_o {-> New expr.false(kwfalse, annotations_o.annotations)}
        | {null} kwnull annotations_o {-> New expr.null(kwnull, annotations_o.annotations)}
@@ -568,10 +564,10 @@ expr_atom~nopar~nobra {-> expr}
        | {string} string annotations_o {-> New expr.string(string, annotations_o.annotations)}
        | {superstring} superstring  {-> superstring.expr}
 !nopar | {par} opar no expr [n2]:no cpar annotations_o {-> New expr.par(opar, expr, cpar, annotations_o.annotations)}
-        | {as_cast} expr_atom~nopar~nobra dot no kwas [n2]:no opar [n3]:no type [n4]:no cpar {-> New expr.as_cast(expr_atom~nopar~nobra.expr, kwas, opar, type, cpar)}
-        | {as_notnull} expr_atom~nopar~nobra dot no kwas [n2]:no opar [n3]:no kwnot [n4]:no kwnull [n5]:no cpar {-> New expr.as_notnull(expr_atom~nopar~nobra.expr, kwas, opar, kwnot, kwnull, cpar)}
-        | {as_notnull2}expr_atom~nopar~nobra dot no kwas [n2]:no kwnot [n4]:no kwnull {-> New expr.as_notnull(expr_atom~nopar~nobra.expr, kwas, Null, kwnot, kwnull, Null)}
-       | {vararg} [expr]:expr_atom~nopar~nobra dotdotdot {-> New expr.vararg(expr.expr, dotdotdot)}
+// !nopar to unambiguise 'foo[5].bar' between '(foo[5]).bar' and 'foo([5].bar),
+!nobra!nopar   | {range} obra no expr [n2]:no dotdot [n3]:no [expr2]:expr_nobra [n4]:no cbra annotations_o {-> New expr.crange(obra, expr, expr2.expr, cbra, annotations_o.annotations)}
+!nobra!nopar   | {orange} obra no expr [n2]:no dotdot [n3]:no [expr2]:expr_nobra [n4]:no [cbra]:obra annotations_o {-> New expr.orange(obra, expr, expr2.expr, cbra, annotations_o.annotations)}
+!nobra!nopar   | {array} braargs annotations_o {-> New expr.array(braargs.exprs, annotations_o.annotations)}
        ;
 
 superstring {-> expr} 
@@ -613,7 +609,22 @@ many_annotations {-> annotations}
        ;
 
 annotation_list {-> annotation*}
-       = {many} one_annotation annotations_tail* {-> [one_annotation.annotation, annotations_tail.annotation] }
+       = {many} one_annotation_list annotations_tail* {-> [one_annotation_list.annotation, annotations_tail.annotation] }
+       ;
+
+one_annotation_list~nopar {-> annotation}
+       = {alone} redef visibility atid annotations_o~nopar {-> New annotation(Null, redef.kwredef, visibility, atid, Null, [], Null, annotations_o~nopar.annotations)}
+// !nopar to unambiguise 'new T@foo(bar)' between 'new T@(foo(bar))' and 'new (T@foo)(bar)'
+!nopar | {args} redef visibility atid opar no at_args [n2]:no cpar annotations_o~nopar {-> New annotation(Null, redef.kwredef, visibility, atid, opar, [at_args.at_arg], cpar, annotations_o~nopar.annotations)}
+!nopar | {nopar} redef visibility atid at_arg_single {-> New annotation(Null, redef.kwredef, visibility, atid, Null, [at_arg_single.at_arg], Null, Null)}
+       ;
+at_arg_single {-> at_arg}
+// FIXME: why expr_single but not expr_atom is not clear :(
+       = {expr} [expr]:expr_single_nopar {-> New at_arg.expr(expr.expr)}
+       ;
+
+annotations_tail {-> annotation}
+       = comma no one_annotation_list {-> one_annotation_list.annotation}
        ;
 
 line_annotations {-> annotations}
@@ -633,10 +644,6 @@ line_annotation_forclass {-> annotation}
        | {nopar} [doc]:no atid_forclass at_args_nopar n1 {-> New annotation(doc.doc, Null, Null, atid_forclass.atid, Null, [at_args_nopar.at_arg], Null, Null)}
        ;
 
-annotations_tail {-> annotation}
-       = comma no one_annotation {-> one_annotation.annotation}
-       ;
-
 at_args~nopar {-> at_arg* }
        = {many} at_arg~nopar at_args_tail* {-> [at_arg~nopar.at_arg, at_args_tail.at_arg]}
        ;
@@ -654,11 +661,9 @@ at_arg~nopar {-> at_arg}
 
 atid~forclass {-> atid}
        = {id}  id {-> New atid.id(id)}
-//!forclass    | {kwextern} kwextern {-> New atid.kwextern(kwextern)}
-//!forclass    | {kwintern} kwintern {-> New atid.kwintern(kwintern)}
-!forclass      | {kwreadable} kwreadable {-> New atid.kwreadable(kwreadable)}
-!forclass      | {kwwritable} kwwritable {-> New atid.kwwritable(kwwritable)}
+!forclass      | {kwextern} kwextern {-> New atid.kwextern(kwextern)}
 //     | {kwimport} kwimport {-> New atid.kwimport(kwimport)}
+       | {kwabstract} kwabstract {-> New atid.kwabstract(kwabstract)}
        ;
 
 /* MISC **********************************************************************/
@@ -772,25 +777,13 @@ formaldef = [id]:classid type? annotations?;
 superclass = kwsuper type annotations?;
 
 
-propdef = {attr} doc? [readable]:able? [writable]:able? kwredef? visibility kwvar [id]:attrid? [id2]:id? type? annotations? expr?
-       | {meth} doc? kwredef? visibility methid signature
-       | {deferred_meth} doc? kwredef? visibility kwmeth methid signature annotations?
-       | {intern_meth} doc? kwredef? visibility kwmeth methid signature
-       | {intern_new} doc? kwredef? visibility kwnew methid? signature
-       | {extern_meth} doc? kwredef? visibility kwmeth methid signature annotations? [extern]:string? extern_calls? extern_code_block?
-       | {concrete_meth} doc? kwredef? visibility kwmeth methid signature annotations? [block]:expr?
-       | {concrete_init} doc? kwredef? visibility kwinit methid? signature annotations? [block]:expr?
-       //| {concrete_new} doc? kwredef? visibility kwnew methid? signature [block]:expr?
-       | {extern_init} doc? kwredef? visibility kwnew methid? signature annotations? [extern]:string? extern_calls? extern_code_block?
+propdef = {attr} doc? kwredef? visibility kwvar [id2]:id type? expr? annotations?
        | {main_meth} kwredef? [block]:expr?
        | {type} doc? kwredef? visibility kwtype [id]:classid type annotations?
+       | {meth} doc? kwredef? visibility kwmeth? kwinit? kwnew? methid? signature annotations? extern_calls? extern_code_block? [block]:expr?
        ;
 
-able   = {read} kwredef? kwreadable
-       | {write} kwredef? visibility? kwwritable
-       ;
-
-methid = {id} id | {plus} plus | {minus} minus | {star} star | {slash} slash | {percent} percent | {eq} eq | {ne} ne | {le} le | {ge} ge | {lt} lt | {gt} gt |  {ll} ll | {gg} gg | {bra} obra cbra | {starship} starship | {assign} id assign | {braassign} obra cbra assign;
+methid = {id} id | {plus} plus | {minus} minus | {star} star | {starstar} starstar | {slash} slash | {percent} percent | {eq} eq | {ne} ne | {le} le | {ge} ge | {lt} lt | {gt} gt |  {ll} ll | {gg} gg | {bra} obra cbra | {starship} starship | {assign} id assign | {braassign} obra cbra assign;
 
 signature = opar? [params]:param* cpar? type?;
 
@@ -835,6 +828,7 @@ expr        = {block} expr* kwend?
        | {minus} expr [expr2]:expr 
        | {starship} expr [expr2]:expr 
        | {star} expr [expr2]:expr 
+       | {starstar} expr [expr2]:expr
        | {slash} expr [expr2]:expr 
        | {percent} expr [expr2]:expr 
        | {uminus} minus expr 
@@ -916,7 +910,7 @@ at_arg
        | {expr} expr
        | {at} annotations
        ;
-atid = {id} id | {kwextern} [id]:kwextern | {kwintern} [id]:kwintern | {kwreadable} [id]:kwreadable | {kwwritable} [id]:kwwritable | {kwimport} [id]:kwimport;
+atid = {id} id | {kwextern} [id]:kwextern | {kwabstract} [id]:kwabstract | {kwimport} [id]:kwimport;
 
 /*****************************************************************************/
 
index 924cb87..a5a2ff3 100644 (file)
@@ -85,761 +85,761 @@ redef class Parser
                        new ReduceAction72(14),
                        new ReduceAction73(14),
                        new ReduceAction74(14),
-                       new ReduceAction75(14),
-                       new ReduceAction76(14),
-                       new ReduceAction77(14),
-                       new ReduceAction78(14),
-                       new ReduceAction79(14),
-                       new ReduceAction80(14),
-                       new ReduceAction81(14),
-                       new ReduceAction82(14),
-                       new ReduceAction83(14),
-                       new ReduceAction84(14),
-                       new ReduceAction85(14),
-                       new ReduceAction86(14),
-                       new ReduceAction87(14),
-                       new ReduceAction88(14),
-                       new ReduceAction89(14),
-                       new ReduceAction90(15),
-                       new ReduceAction91(15),
+                       new ReduceAction75(15),
+                       new ReduceAction76(15),
                        new ReduceAction22(15),
-                       new ReduceAction90(16),
-                       new ReduceAction94(16),
-                       new ReduceAction95(17),
+                       new ReduceAction75(16),
+                       new ReduceAction79(16),
+                       new ReduceAction80(17),
+                       new ReduceAction81(17),
+                       new ReduceAction82(17),
+                       new ReduceAction83(17),
+                       new ReduceAction84(17),
+                       new ReduceAction85(18),
+                       new ReduceAction86(18),
+                       new ReduceAction87(18),
+                       new ReduceAction88(18),
+                       new ReduceAction89(18),
+                       new ReduceAction90(18),
+                       new ReduceAction91(18),
+                       new ReduceAction92(18),
+                       new ReduceAction93(18),
+                       new ReduceAction94(18),
+                       new ReduceAction95(18),
                        new ReduceAction96(18),
-                       new ReduceAction97(19),
-                       new ReduceAction98(19),
-                       new ReduceAction99(19),
-                       new ReduceAction100(19),
-                       new ReduceAction101(19),
-                       new ReduceAction102(20),
-                       new ReduceAction103(20),
-                       new ReduceAction104(20),
-                       new ReduceAction105(20),
-                       new ReduceAction106(20),
-                       new ReduceAction107(20),
+                       new ReduceAction97(18),
+                       new ReduceAction98(18),
+                       new ReduceAction99(18),
+                       new ReduceAction100(18),
+                       new ReduceAction101(18),
+                       new ReduceAction102(18),
+                       new ReduceAction103(18),
+                       new ReduceAction104(19),
+                       new ReduceAction105(19),
+                       new ReduceAction106(19),
+                       new ReduceAction107(19),
                        new ReduceAction108(20),
                        new ReduceAction109(20),
-                       new ReduceAction110(20),
-                       new ReduceAction111(20),
-                       new ReduceAction112(20),
-                       new ReduceAction113(20),
-                       new ReduceAction114(20),
-                       new ReduceAction115(20),
-                       new ReduceAction116(20),
-                       new ReduceAction117(20),
-                       new ReduceAction118(20),
-                       new ReduceAction119(20),
-                       new ReduceAction120(21),
-                       new ReduceAction121(21),
-                       new ReduceAction122(21),
-                       new ReduceAction123(21),
-                       new ReduceAction124(22),
-                       new ReduceAction125(22),
-                       new ReduceAction51(22),
-                       new ReduceAction127(23),
-                       new ReduceAction128(24),
-                       new ReduceAction129(24),
-                       new ReduceAction130(24),
-                       new ReduceAction131(24),
-                       new ReduceAction132(24),
-                       new ReduceAction133(25),
-                       new ReduceAction134(25),
-                       new ReduceAction22(25),
-                       new ReduceAction136(26),
-                       new ReduceAction137(27),
-                       new ReduceAction137(27),
-                       new ReduceAction139(27),
-                       new ReduceAction140(28),
-                       new ReduceAction141(28),
-                       new ReduceAction142(28),
-                       new ReduceAction143(29),
-                       new ReduceAction144(29),
-                       new ReduceAction145(29),
-                       new ReduceAction146(29),
-                       new ReduceAction147(29),
-                       new ReduceAction148(29),
-                       new ReduceAction22(30),
-                       new ReduceAction150(30),
-                       new ReduceAction151(31),
-                       new ReduceAction152(32),
-                       new ReduceAction153(32),
-                       new ReduceAction154(33),
-                       new ReduceAction22(33),
-                       new ReduceAction156(34),
-                       new ReduceAction157(35),
-                       new ReduceAction158(35),
-                       new ReduceAction159(35),
-                       new ReduceAction160(35),
-                       new ReduceAction161(36),
-                       new ReduceAction162(36),
-                       new ReduceAction163(37),
-                       new ReduceAction163(38),
-                       new ReduceAction163(39),
-                       new ReduceAction22(39),
-                       new ReduceAction167(40),
-                       new ReduceAction168(40),
-                       new ReduceAction169(40),
-                       new ReduceAction170(40),
-                       new ReduceAction171(41),
-                       new ReduceAction172(41),
-                       new ReduceAction173(42),
-                       new ReduceAction174(42),
-                       new ReduceAction175(43),
-                       new ReduceAction176(43),
-                       new ReduceAction167(44),
-                       new ReduceAction170(45),
-                       new ReduceAction170(45),
-                       new ReduceAction180(45),
-                       new ReduceAction181(45),
-                       new ReduceAction182(45),
-                       new ReduceAction183(45),
-                       new ReduceAction184(45),
-                       new ReduceAction185(45),
-                       new ReduceAction186(45),
-                       new ReduceAction170(45),
-                       new ReduceAction170(45),
-                       new ReduceAction170(45),
-                       new ReduceAction170(45),
-                       new ReduceAction170(45),
-                       new ReduceAction170(45),
+                       new ReduceAction51(20),
+                       new ReduceAction111(21),
+                       new ReduceAction112(22),
+                       new ReduceAction113(22),
+                       new ReduceAction114(22),
+                       new ReduceAction115(22),
+                       new ReduceAction116(22),
+                       new ReduceAction117(23),
+                       new ReduceAction118(23),
+                       new ReduceAction22(23),
+                       new ReduceAction120(24),
+                       new ReduceAction121(25),
+                       new ReduceAction121(25),
+                       new ReduceAction123(25),
+                       new ReduceAction124(26),
+                       new ReduceAction125(26),
+                       new ReduceAction126(26),
+                       new ReduceAction127(27),
+                       new ReduceAction128(27),
+                       new ReduceAction129(27),
+                       new ReduceAction130(27),
+                       new ReduceAction131(27),
+                       new ReduceAction132(27),
+                       new ReduceAction22(28),
+                       new ReduceAction134(28),
+                       new ReduceAction135(29),
+                       new ReduceAction136(30),
+                       new ReduceAction137(30),
+                       new ReduceAction138(31),
+                       new ReduceAction22(31),
+                       new ReduceAction140(32),
+                       new ReduceAction141(33),
+                       new ReduceAction142(33),
+                       new ReduceAction143(33),
+                       new ReduceAction144(33),
+                       new ReduceAction145(34),
+                       new ReduceAction146(34),
+                       new ReduceAction147(35),
+                       new ReduceAction147(36),
+                       new ReduceAction147(37),
+                       new ReduceAction22(37),
+                       new ReduceAction151(38),
+                       new ReduceAction152(38),
+                       new ReduceAction153(38),
+                       new ReduceAction154(38),
+                       new ReduceAction155(39),
+                       new ReduceAction156(39),
+                       new ReduceAction157(40),
+                       new ReduceAction158(40),
+                       new ReduceAction159(41),
+                       new ReduceAction160(41),
+                       new ReduceAction151(42),
+                       new ReduceAction154(43),
+                       new ReduceAction154(43),
+                       new ReduceAction164(43),
+                       new ReduceAction165(43),
+                       new ReduceAction166(43),
+                       new ReduceAction167(43),
+                       new ReduceAction168(43),
+                       new ReduceAction169(43),
+                       new ReduceAction170(43),
+                       new ReduceAction154(43),
+                       new ReduceAction154(43),
+                       new ReduceAction154(43),
+                       new ReduceAction154(43),
+                       new ReduceAction154(43),
+                       new ReduceAction154(43),
+                       new ReduceAction177(43),
+                       new ReduceAction178(43),
+                       new ReduceAction179(43),
+                       new ReduceAction180(43),
+                       new ReduceAction181(43),
+                       new ReduceAction182(43),
+                       new ReduceAction183(43),
+                       new ReduceAction182(43),
+                       new ReduceAction185(43),
+                       new ReduceAction186(43),
+                       new ReduceAction185(43),
+                       new ReduceAction188(43),
+                       new ReduceAction189(44),
+                       new ReduceAction190(44),
+                       new ReduceAction191(45),
+                       new ReduceAction192(45),
                        new ReduceAction193(45),
                        new ReduceAction194(45),
-                       new ReduceAction195(45),
-                       new ReduceAction196(45),
-                       new ReduceAction197(45),
-                       new ReduceAction198(45),
-                       new ReduceAction199(45),
-                       new ReduceAction198(45),
-                       new ReduceAction201(45),
-                       new ReduceAction202(45),
-                       new ReduceAction201(45),
-                       new ReduceAction204(45),
-                       new ReduceAction205(46),
-                       new ReduceAction206(46),
-                       new ReduceAction207(47),
-                       new ReduceAction208(47),
-                       new ReduceAction209(47),
-                       new ReduceAction210(47),
-                       new ReduceAction211(48),
-                       new ReduceAction212(48),
-                       new ReduceAction213(48),
-                       new ReduceAction214(48),
-                       new ReduceAction215(48),
-                       new ReduceAction216(48),
-                       new ReduceAction217(48),
-                       new ReduceAction218(48),
-                       new ReduceAction219(48),
-                       new ReduceAction220(48),
-                       new ReduceAction221(49),
-                       new ReduceAction222(49),
-                       new ReduceAction223(50),
-                       new ReduceAction224(50),
-                       new ReduceAction225(51),
-                       new ReduceAction226(51),
-                       new ReduceAction227(51),
-                       new ReduceAction228(51),
-                       new ReduceAction229(51),
-                       new ReduceAction167(52),
-                       new ReduceAction169(52),
-                       new ReduceAction232(53),
-                       new ReduceAction233(53),
-                       new ReduceAction234(54),
-                       new ReduceAction235(54),
-                       new ReduceAction236(55),
-                       new ReduceAction237(55),
-                       new ReduceAction238(55),
-                       new ReduceAction239(55),
-                       new ReduceAction240(56),
-                       new ReduceAction241(56),
-                       new ReduceAction242(56),
-                       new ReduceAction243(56),
-                       new ReduceAction244(57),
-                       new ReduceAction170(58),
-                       new ReduceAction170(59),
-                       new ReduceAction247(59),
-                       new ReduceAction170(60),
+                       new ReduceAction195(46),
+                       new ReduceAction196(46),
+                       new ReduceAction197(46),
+                       new ReduceAction198(46),
+                       new ReduceAction199(46),
+                       new ReduceAction200(46),
+                       new ReduceAction201(46),
+                       new ReduceAction202(46),
+                       new ReduceAction203(46),
+                       new ReduceAction204(46),
+                       new ReduceAction205(47),
+                       new ReduceAction206(47),
+                       new ReduceAction207(48),
+                       new ReduceAction208(48),
+                       new ReduceAction209(49),
+                       new ReduceAction210(49),
+                       new ReduceAction211(49),
+                       new ReduceAction212(49),
+                       new ReduceAction213(49),
+                       new ReduceAction151(50),
+                       new ReduceAction153(50),
+                       new ReduceAction216(51),
+                       new ReduceAction217(51),
+                       new ReduceAction218(52),
+                       new ReduceAction219(52),
+                       new ReduceAction220(53),
+                       new ReduceAction221(53),
+                       new ReduceAction222(53),
+                       new ReduceAction223(53),
+                       new ReduceAction224(54),
+                       new ReduceAction225(54),
+                       new ReduceAction226(54),
+                       new ReduceAction227(54),
+                       new ReduceAction228(55),
+                       new ReduceAction154(56),
+                       new ReduceAction154(57),
+                       new ReduceAction231(57),
+                       new ReduceAction154(58),
+                       new ReduceAction233(58),
+                       new ReduceAction234(58),
+                       new ReduceAction235(58),
+                       new ReduceAction236(58),
+                       new ReduceAction154(59),
+                       new ReduceAction238(59),
+                       new ReduceAction154(60),
+                       new ReduceAction240(60),
+                       new ReduceAction241(60),
+                       new ReduceAction242(60),
+                       new ReduceAction243(60),
+                       new ReduceAction244(60),
+                       new ReduceAction245(60),
+                       new ReduceAction246(60),
+                       new ReduceAction247(60),
+                       new ReduceAction248(60),
                        new ReduceAction249(60),
-                       new ReduceAction250(60),
-                       new ReduceAction251(60),
-                       new ReduceAction252(60),
-                       new ReduceAction170(61),
-                       new ReduceAction254(61),
-                       new ReduceAction170(62),
+                       new ReduceAction154(61),
+                       new ReduceAction251(61),
+                       new ReduceAction252(61),
+                       new ReduceAction154(62),
+                       new ReduceAction254(62),
+                       new ReduceAction255(62),
                        new ReduceAction256(62),
-                       new ReduceAction257(62),
-                       new ReduceAction258(62),
-                       new ReduceAction259(62),
-                       new ReduceAction260(62),
-                       new ReduceAction261(62),
-                       new ReduceAction262(62),
-                       new ReduceAction263(62),
-                       new ReduceAction264(62),
-                       new ReduceAction265(62),
-                       new ReduceAction170(63),
-                       new ReduceAction267(63),
-                       new ReduceAction268(63),
-                       new ReduceAction170(64),
-                       new ReduceAction270(64),
-                       new ReduceAction271(64),
-                       new ReduceAction272(64),
-                       new ReduceAction170(65),
-                       new ReduceAction274(65),
-                       new ReduceAction275(65),
-                       new ReduceAction170(66),
+                       new ReduceAction154(63),
+                       new ReduceAction258(63),
+                       new ReduceAction154(64),
+                       new ReduceAction260(64),
+                       new ReduceAction261(64),
+                       new ReduceAction154(65),
+                       new ReduceAction263(65),
+                       new ReduceAction264(65),
+                       new ReduceAction265(65),
+                       new ReduceAction154(66),
+                       new ReduceAction267(66),
+                       new ReduceAction268(66),
+                       new ReduceAction177(66),
+                       new ReduceAction178(66),
+                       new ReduceAction179(66),
+                       new ReduceAction180(66),
+                       new ReduceAction181(66),
+                       new ReduceAction274(66),
+                       new ReduceAction275(66),
+                       new ReduceAction276(66),
                        new ReduceAction277(66),
                        new ReduceAction278(66),
                        new ReduceAction279(66),
                        new ReduceAction280(67),
                        new ReduceAction281(67),
-                       new ReduceAction193(67),
-                       new ReduceAction194(67),
-                       new ReduceAction195(67),
-                       new ReduceAction196(67),
-                       new ReduceAction197(67),
+                       new ReduceAction282(67),
+                       new ReduceAction283(67),
+                       new ReduceAction284(67),
+                       new ReduceAction285(67),
+                       new ReduceAction286(67),
                        new ReduceAction287(67),
                        new ReduceAction288(67),
-                       new ReduceAction289(67),
+                       new ReduceAction154(67),
                        new ReduceAction290(67),
                        new ReduceAction291(67),
                        new ReduceAction292(67),
                        new ReduceAction293(67),
-                       new ReduceAction294(67),
-                       new ReduceAction295(67),
-                       new ReduceAction296(67),
-                       new ReduceAction297(67),
-                       new ReduceAction298(67),
-                       new ReduceAction299(67),
-                       new ReduceAction300(67),
-                       new ReduceAction170(67),
-                       new ReduceAction302(67),
-                       new ReduceAction303(67),
-                       new ReduceAction304(67),
-                       new ReduceAction305(67),
-                       new ReduceAction306(67),
-                       new ReduceAction307(68),
-                       new ReduceAction308(68),
-                       new ReduceAction309(69),
-                       new ReduceAction310(69),
-                       new ReduceAction311(70),
-                       new ReduceAction309(71),
-                       new ReduceAction310(71),
-                       new ReduceAction314(72),
-                       new ReduceAction315(73),
-                       new ReduceAction316(74),
-                       new ReduceAction317(74),
-                       new ReduceAction318(75),
+                       new ReduceAction294(68),
+                       new ReduceAction295(68),
+                       new ReduceAction296(69),
+                       new ReduceAction297(69),
+                       new ReduceAction298(70),
+                       new ReduceAction296(71),
+                       new ReduceAction297(71),
+                       new ReduceAction301(72),
+                       new ReduceAction302(73),
+                       new ReduceAction303(74),
+                       new ReduceAction304(74),
+                       new ReduceAction305(75),
                        new ReduceAction22(75),
-                       new ReduceAction320(76),
-                       new ReduceAction321(76),
-                       new ReduceAction322(77),
-                       new ReduceAction323(78),
-                       new ReduceAction324(78),
-                       new ReduceAction322(79),
-                       new ReduceAction326(80),
-                       new ReduceAction327(80),
-                       new ReduceAction328(80),
-                       new ReduceAction329(80),
-                       new ReduceAction330(80),
-                       new ReduceAction331(81),
-                       new ReduceAction332(81),
-                       new ReduceAction333(81),
-                       new ReduceAction334(81),
-                       new ReduceAction335(81),
-                       new ReduceAction336(82),
-                       new ReduceAction337(83),
-                       new ReduceAction338(83),
-                       new ReduceAction339(84),
-                       new ReduceAction340(85),
-                       new ReduceAction341(85),
-                       new ReduceAction341(85),
-                       new ReduceAction343(85),
-                       new ReduceAction344(86),
-                       new ReduceAction345(86),
-                       new ReduceAction346(86),
-                       new ReduceAction347(87),
-                       new ReduceAction348(87),
-                       new ReduceAction349(87),
-                       new ReduceAction347(88),
-                       new ReduceAction351(88),
-                       new ReduceAction348(88),
-                       new ReduceAction349(88),
-                       new ReduceAction354(89),
-                       new ReduceAction310(90),
-                       new ReduceAction356(90),
-                       new ReduceAction357(91),
-                       new ReduceAction358(92),
-                       new ReduceAction359(92),
-                       new ReduceAction360(93),
-                       new ReduceAction361(93),
-                       new ReduceAction362(93),
-                       new ReduceAction363(93),
-                       new ReduceAction364(94),
-                       new ReduceAction365(94),
-                       new ReduceAction366(94),
-                       new ReduceAction22(94),
-                       new ReduceAction368(95),
-                       new ReduceAction369(95),
-                       new ReduceAction370(95),
-                       new ReduceAction369(95),
-                       new ReduceAction372(96),
-                       new ReduceAction373(96),
-                       new ReduceAction374(96),
-                       new ReduceAction373(96),
-                       new ReduceAction376(97),
-                       new ReduceAction377(98),
-                       new ReduceAction22(99),
-                       new ReduceAction379(99),
-                       new ReduceAction380(100),
-                       new ReduceAction380(100),
-                       new ReduceAction382(101),
-                       new ReduceAction383(101),
-                       new ReduceAction23(101),
-                       new ReduceAction22(102),
-                       new ReduceAction386(102),
-                       new ReduceAction387(103),
-                       new ReduceAction388(103),
-                       new ReduceAction380(103),
-                       new ReduceAction56(104),
-                       new ReduceAction57(105),
-                       new ReduceAction58(105),
-                       new ReduceAction59(105),
-                       new ReduceAction61(105),
-                       new ReduceAction64(105),
-                       new ReduceAction65(105),
-                       new ReduceAction66(105),
-                       new ReduceAction90(106),
-                       new ReduceAction91(106),
-                       new ReduceAction157(107),
-                       new ReduceAction158(107),
-                       new ReduceAction170(108),
-                       new ReduceAction170(109),
-                       new ReduceAction247(109),
-                       new ReduceAction170(110),
-                       new ReduceAction249(110),
-                       new ReduceAction250(110),
-                       new ReduceAction251(110),
-                       new ReduceAction252(110),
-                       new ReduceAction170(111),
-                       new ReduceAction254(111),
-                       new ReduceAction170(112),
-                       new ReduceAction256(112),
-                       new ReduceAction257(112),
-                       new ReduceAction258(112),
-                       new ReduceAction259(112),
-                       new ReduceAction260(112),
-                       new ReduceAction261(112),
-                       new ReduceAction262(112),
-                       new ReduceAction263(112),
-                       new ReduceAction264(112),
-                       new ReduceAction265(112),
-                       new ReduceAction170(113),
-                       new ReduceAction267(113),
-                       new ReduceAction268(113),
-                       new ReduceAction170(114),
-                       new ReduceAction270(114),
-                       new ReduceAction271(114),
-                       new ReduceAction272(114),
-                       new ReduceAction170(115),
-                       new ReduceAction274(115),
-                       new ReduceAction275(115),
-                       new ReduceAction170(116),
-                       new ReduceAction277(116),
-                       new ReduceAction278(116),
-                       new ReduceAction279(116),
-                       new ReduceAction280(117),
-                       new ReduceAction281(117),
-                       new ReduceAction193(117),
-                       new ReduceAction194(117),
-                       new ReduceAction195(117),
-                       new ReduceAction196(117),
-                       new ReduceAction197(117),
-                       new ReduceAction288(117),
-                       new ReduceAction292(117),
-                       new ReduceAction293(117),
-                       new ReduceAction294(117),
-                       new ReduceAction295(117),
-                       new ReduceAction296(117),
-                       new ReduceAction297(117),
-                       new ReduceAction298(117),
-                       new ReduceAction299(117),
-                       new ReduceAction300(117),
-                       new ReduceAction170(117),
-                       new ReduceAction302(117),
-                       new ReduceAction303(117),
-                       new ReduceAction304(117),
-                       new ReduceAction305(117),
-                       new ReduceAction306(117),
-                       new ReduceAction157(118),
-                       new ReduceAction158(118),
-                       new ReduceAction159(118),
-                       new ReduceAction160(118),
-                       new ReduceAction170(119),
-                       new ReduceAction170(119),
-                       new ReduceAction180(119),
-                       new ReduceAction181(119),
-                       new ReduceAction182(119),
-                       new ReduceAction183(119),
-                       new ReduceAction184(119),
-                       new ReduceAction185(119),
-                       new ReduceAction186(119),
-                       new ReduceAction170(119),
-                       new ReduceAction170(119),
-                       new ReduceAction170(119),
-                       new ReduceAction170(119),
-                       new ReduceAction170(119),
-                       new ReduceAction170(119),
-                       new ReduceAction193(119),
-                       new ReduceAction194(119),
-                       new ReduceAction195(119),
-                       new ReduceAction196(119),
-                       new ReduceAction197(119),
-                       new ReduceAction198(119),
-                       new ReduceAction199(119),
-                       new ReduceAction198(119),
-                       new ReduceAction201(119),
-                       new ReduceAction202(119),
-                       new ReduceAction201(119),
-                       new ReduceAction204(119),
-                       new ReduceAction211(120),
-                       new ReduceAction212(120),
-                       new ReduceAction213(120),
-                       new ReduceAction214(120),
-                       new ReduceAction215(120),
-                       new ReduceAction216(120),
-                       new ReduceAction217(120),
-                       new ReduceAction218(120),
-                       new ReduceAction219(120),
-                       new ReduceAction220(120),
-                       new ReduceAction170(121),
-                       new ReduceAction170(122),
-                       new ReduceAction247(122),
+                       new ReduceAction307(76),
+                       new ReduceAction308(76),
+                       new ReduceAction309(77),
+                       new ReduceAction310(78),
+                       new ReduceAction311(78),
+                       new ReduceAction307(79),
+                       new ReduceAction308(79),
+                       new ReduceAction314(79),
+                       new ReduceAction315(80),
+                       new ReduceAction316(81),
+                       new ReduceAction309(82),
+                       new ReduceAction318(83),
+                       new ReduceAction319(83),
+                       new ReduceAction320(83),
+                       new ReduceAction321(83),
+                       new ReduceAction322(83),
+                       new ReduceAction323(84),
+                       new ReduceAction324(84),
+                       new ReduceAction325(84),
+                       new ReduceAction326(84),
+                       new ReduceAction327(84),
+                       new ReduceAction328(85),
+                       new ReduceAction329(85),
+                       new ReduceAction330(86),
+                       new ReduceAction331(87),
+                       new ReduceAction315(87),
+                       new ReduceAction315(87),
+                       new ReduceAction334(87),
+                       new ReduceAction335(88),
+                       new ReduceAction336(88),
+                       new ReduceAction337(88),
+                       new ReduceAction338(89),
+                       new ReduceAction339(89),
+                       new ReduceAction340(89),
+                       new ReduceAction338(90),
+                       new ReduceAction342(90),
+                       new ReduceAction339(90),
+                       new ReduceAction340(90),
+                       new ReduceAction345(91),
+                       new ReduceAction297(92),
+                       new ReduceAction347(92),
+                       new ReduceAction348(93),
+                       new ReduceAction349(94),
+                       new ReduceAction350(94),
+                       new ReduceAction351(95),
+                       new ReduceAction352(95),
+                       new ReduceAction353(95),
+                       new ReduceAction354(95),
+                       new ReduceAction355(96),
+                       new ReduceAction356(96),
+                       new ReduceAction357(96),
+                       new ReduceAction22(96),
+                       new ReduceAction359(97),
+                       new ReduceAction360(97),
+                       new ReduceAction361(97),
+                       new ReduceAction360(97),
+                       new ReduceAction363(98),
+                       new ReduceAction364(98),
+                       new ReduceAction365(98),
+                       new ReduceAction364(98),
+                       new ReduceAction367(99),
+                       new ReduceAction368(100),
+                       new ReduceAction22(101),
+                       new ReduceAction370(101),
+                       new ReduceAction371(102),
+                       new ReduceAction371(102),
+                       new ReduceAction373(103),
+                       new ReduceAction374(103),
+                       new ReduceAction23(103),
+                       new ReduceAction22(104),
+                       new ReduceAction377(104),
+                       new ReduceAction378(105),
+                       new ReduceAction379(105),
+                       new ReduceAction371(105),
+                       new ReduceAction56(106),
+                       new ReduceAction57(107),
+                       new ReduceAction58(107),
+                       new ReduceAction59(107),
+                       new ReduceAction62(107),
+                       new ReduceAction63(107),
+                       new ReduceAction75(108),
+                       new ReduceAction76(108),
+                       new ReduceAction141(109),
+                       new ReduceAction142(109),
+                       new ReduceAction154(110),
+                       new ReduceAction154(111),
+                       new ReduceAction231(111),
+                       new ReduceAction154(112),
+                       new ReduceAction233(112),
+                       new ReduceAction234(112),
+                       new ReduceAction235(112),
+                       new ReduceAction236(112),
+                       new ReduceAction154(113),
+                       new ReduceAction238(113),
+                       new ReduceAction154(114),
+                       new ReduceAction240(114),
+                       new ReduceAction241(114),
+                       new ReduceAction242(114),
+                       new ReduceAction243(114),
+                       new ReduceAction244(114),
+                       new ReduceAction245(114),
+                       new ReduceAction246(114),
+                       new ReduceAction247(114),
+                       new ReduceAction248(114),
+                       new ReduceAction249(114),
+                       new ReduceAction154(115),
+                       new ReduceAction251(115),
+                       new ReduceAction252(115),
+                       new ReduceAction154(116),
+                       new ReduceAction254(116),
+                       new ReduceAction255(116),
+                       new ReduceAction256(116),
+                       new ReduceAction154(117),
+                       new ReduceAction258(117),
+                       new ReduceAction154(118),
+                       new ReduceAction260(118),
+                       new ReduceAction261(118),
+                       new ReduceAction154(119),
+                       new ReduceAction263(119),
+                       new ReduceAction264(119),
+                       new ReduceAction265(119),
+                       new ReduceAction154(120),
+                       new ReduceAction267(120),
+                       new ReduceAction268(120),
+                       new ReduceAction177(120),
+                       new ReduceAction178(120),
+                       new ReduceAction179(120),
+                       new ReduceAction180(120),
+                       new ReduceAction181(120),
+                       new ReduceAction275(120),
+                       new ReduceAction276(120),
+                       new ReduceAction277(120),
+                       new ReduceAction278(120),
+                       new ReduceAction279(120),
+                       new ReduceAction280(121),
+                       new ReduceAction281(121),
+                       new ReduceAction282(121),
+                       new ReduceAction283(121),
+                       new ReduceAction284(121),
+                       new ReduceAction285(121),
+                       new ReduceAction286(121),
+                       new ReduceAction287(121),
+                       new ReduceAction288(121),
+                       new ReduceAction154(121),
+                       new ReduceAction290(121),
+                       new ReduceAction141(122),
+                       new ReduceAction142(122),
+                       new ReduceAction143(122),
+                       new ReduceAction144(122),
+                       new ReduceAction154(123),
+                       new ReduceAction154(123),
+                       new ReduceAction164(123),
+                       new ReduceAction165(123),
+                       new ReduceAction166(123),
+                       new ReduceAction167(123),
+                       new ReduceAction168(123),
+                       new ReduceAction169(123),
                        new ReduceAction170(123),
-                       new ReduceAction249(123),
-                       new ReduceAction250(123),
-                       new ReduceAction251(123),
-                       new ReduceAction252(123),
-                       new ReduceAction170(124),
-                       new ReduceAction254(124),
-                       new ReduceAction170(125),
-                       new ReduceAction256(125),
-                       new ReduceAction257(125),
-                       new ReduceAction258(125),
-                       new ReduceAction259(125),
-                       new ReduceAction260(125),
-                       new ReduceAction261(125),
-                       new ReduceAction262(125),
-                       new ReduceAction263(125),
-                       new ReduceAction264(125),
-                       new ReduceAction265(125),
-                       new ReduceAction170(126),
-                       new ReduceAction267(126),
-                       new ReduceAction268(126),
-                       new ReduceAction170(127),
-                       new ReduceAction270(127),
-                       new ReduceAction271(127),
-                       new ReduceAction272(127),
-                       new ReduceAction170(128),
-                       new ReduceAction274(128),
-                       new ReduceAction275(128),
-                       new ReduceAction170(129),
-                       new ReduceAction277(129),
-                       new ReduceAction278(129),
-                       new ReduceAction279(129),
-                       new ReduceAction280(130),
-                       new ReduceAction281(130),
-                       new ReduceAction193(130),
-                       new ReduceAction194(130),
-                       new ReduceAction195(130),
-                       new ReduceAction196(130),
-                       new ReduceAction197(130),
-                       new ReduceAction287(130),
-                       new ReduceAction288(130),
-                       new ReduceAction292(130),
-                       new ReduceAction293(130),
-                       new ReduceAction294(130),
-                       new ReduceAction295(130),
-                       new ReduceAction296(130),
-                       new ReduceAction297(130),
-                       new ReduceAction298(130),
-                       new ReduceAction299(130),
-                       new ReduceAction300(130),
-                       new ReduceAction170(130),
-                       new ReduceAction303(130),
-                       new ReduceAction304(130),
-                       new ReduceAction305(130),
-                       new ReduceAction306(130),
-                       new ReduceAction316(131),
-                       new ReduceAction317(131),
-                       new ReduceAction318(132),
-                       new ReduceAction22(132),
-                       new ReduceAction320(133),
-                       new ReduceAction337(134),
-                       new ReduceAction338(134),
-                       new ReduceAction340(135),
-                       new ReduceAction341(135),
-                       new ReduceAction341(135),
-                       new ReduceAction157(136),
-                       new ReduceAction158(136),
-                       new ReduceAction170(137),
-                       new ReduceAction170(138),
-                       new ReduceAction247(138),
-                       new ReduceAction170(139),
-                       new ReduceAction249(139),
-                       new ReduceAction250(139),
-                       new ReduceAction251(139),
-                       new ReduceAction252(139),
-                       new ReduceAction170(140),
-                       new ReduceAction254(140),
-                       new ReduceAction170(141),
-                       new ReduceAction256(141),
-                       new ReduceAction257(141),
-                       new ReduceAction258(141),
-                       new ReduceAction259(141),
-                       new ReduceAction260(141),
-                       new ReduceAction261(141),
-                       new ReduceAction262(141),
-                       new ReduceAction263(141),
-                       new ReduceAction264(141),
-                       new ReduceAction265(141),
-                       new ReduceAction170(142),
-                       new ReduceAction267(142),
-                       new ReduceAction268(142),
-                       new ReduceAction170(143),
-                       new ReduceAction270(143),
-                       new ReduceAction271(143),
-                       new ReduceAction272(143),
-                       new ReduceAction170(144),
-                       new ReduceAction274(144),
-                       new ReduceAction275(144),
-                       new ReduceAction170(145),
-                       new ReduceAction277(145),
-                       new ReduceAction604(145),
-                       new ReduceAction605(146),
-                       new ReduceAction606(146),
-                       new ReduceAction195(146),
-                       new ReduceAction608(146),
-                       new ReduceAction288(146),
-                       new ReduceAction292(146),
-                       new ReduceAction293(146),
-                       new ReduceAction294(146),
-                       new ReduceAction295(146),
-                       new ReduceAction296(146),
-                       new ReduceAction297(146),
-                       new ReduceAction298(146),
-                       new ReduceAction299(146),
-                       new ReduceAction300(146),
-                       new ReduceAction170(146),
-                       new ReduceAction303(146),
-                       new ReduceAction304(146),
-                       new ReduceAction305(146),
-                       new ReduceAction306(146),
-                       new ReduceAction624(147),
-                       new ReduceAction625(147),
-                       new ReduceAction167(148),
-                       new ReduceAction168(148),
-                       new ReduceAction169(148),
-                       new ReduceAction170(148),
-                       new ReduceAction170(149),
-                       new ReduceAction170(149),
-                       new ReduceAction180(149),
-                       new ReduceAction181(149),
-                       new ReduceAction182(149),
-                       new ReduceAction183(149),
-                       new ReduceAction184(149),
-                       new ReduceAction185(149),
-                       new ReduceAction186(149),
-                       new ReduceAction170(149),
-                       new ReduceAction170(149),
-                       new ReduceAction170(149),
-                       new ReduceAction170(149),
-                       new ReduceAction170(149),
-                       new ReduceAction170(149),
-                       new ReduceAction193(149),
-                       new ReduceAction194(149),
-                       new ReduceAction195(149),
-                       new ReduceAction196(149),
-                       new ReduceAction197(149),
-                       new ReduceAction198(149),
-                       new ReduceAction199(149),
-                       new ReduceAction198(149),
-                       new ReduceAction201(149),
-                       new ReduceAction202(149),
-                       new ReduceAction201(149),
-                       new ReduceAction204(149),
-                       new ReduceAction207(150),
-                       new ReduceAction208(150),
-                       new ReduceAction209(150),
-                       new ReduceAction210(150),
-                       new ReduceAction211(151),
-                       new ReduceAction212(151),
-                       new ReduceAction213(151),
-                       new ReduceAction214(151),
-                       new ReduceAction215(151),
-                       new ReduceAction216(151),
-                       new ReduceAction217(151),
-                       new ReduceAction218(151),
-                       new ReduceAction219(151),
-                       new ReduceAction220(151),
-                       new ReduceAction223(152),
-                       new ReduceAction224(152),
-                       new ReduceAction225(153),
-                       new ReduceAction232(154),
-                       new ReduceAction233(154),
-                       new ReduceAction234(155),
-                       new ReduceAction235(155),
-                       new ReduceAction236(156),
-                       new ReduceAction237(156),
-                       new ReduceAction238(156),
-                       new ReduceAction239(156),
-                       new ReduceAction240(157),
-                       new ReduceAction241(157),
+                       new ReduceAction154(123),
+                       new ReduceAction154(123),
+                       new ReduceAction154(123),
+                       new ReduceAction154(123),
+                       new ReduceAction154(123),
+                       new ReduceAction154(123),
+                       new ReduceAction177(123),
+                       new ReduceAction178(123),
+                       new ReduceAction179(123),
+                       new ReduceAction180(123),
+                       new ReduceAction181(123),
+                       new ReduceAction182(123),
+                       new ReduceAction183(123),
+                       new ReduceAction182(123),
+                       new ReduceAction185(123),
+                       new ReduceAction186(123),
+                       new ReduceAction185(123),
+                       new ReduceAction188(123),
+                       new ReduceAction195(124),
+                       new ReduceAction196(124),
+                       new ReduceAction197(124),
+                       new ReduceAction198(124),
+                       new ReduceAction199(124),
+                       new ReduceAction200(124),
+                       new ReduceAction201(124),
+                       new ReduceAction202(124),
+                       new ReduceAction203(124),
+                       new ReduceAction204(124),
+                       new ReduceAction154(125),
+                       new ReduceAction154(126),
+                       new ReduceAction231(126),
+                       new ReduceAction154(127),
+                       new ReduceAction233(127),
+                       new ReduceAction234(127),
+                       new ReduceAction235(127),
+                       new ReduceAction236(127),
+                       new ReduceAction154(128),
+                       new ReduceAction238(128),
+                       new ReduceAction154(129),
+                       new ReduceAction240(129),
+                       new ReduceAction241(129),
+                       new ReduceAction242(129),
+                       new ReduceAction243(129),
+                       new ReduceAction244(129),
+                       new ReduceAction245(129),
+                       new ReduceAction246(129),
+                       new ReduceAction247(129),
+                       new ReduceAction248(129),
+                       new ReduceAction249(129),
+                       new ReduceAction154(130),
+                       new ReduceAction251(130),
+                       new ReduceAction252(130),
+                       new ReduceAction154(131),
+                       new ReduceAction254(131),
+                       new ReduceAction255(131),
+                       new ReduceAction256(131),
+                       new ReduceAction154(132),
+                       new ReduceAction258(132),
+                       new ReduceAction154(133),
+                       new ReduceAction260(133),
+                       new ReduceAction261(133),
+                       new ReduceAction154(134),
+                       new ReduceAction263(134),
+                       new ReduceAction264(134),
+                       new ReduceAction265(134),
+                       new ReduceAction154(135),
+                       new ReduceAction267(135),
+                       new ReduceAction268(135),
+                       new ReduceAction177(135),
+                       new ReduceAction178(135),
+                       new ReduceAction179(135),
+                       new ReduceAction180(135),
+                       new ReduceAction181(135),
+                       new ReduceAction274(135),
+                       new ReduceAction275(135),
+                       new ReduceAction276(135),
+                       new ReduceAction277(135),
+                       new ReduceAction278(135),
+                       new ReduceAction279(135),
+                       new ReduceAction280(136),
+                       new ReduceAction281(136),
+                       new ReduceAction282(136),
+                       new ReduceAction283(136),
+                       new ReduceAction284(136),
+                       new ReduceAction285(136),
+                       new ReduceAction286(136),
+                       new ReduceAction287(136),
+                       new ReduceAction288(136),
+                       new ReduceAction154(136),
+                       new ReduceAction303(137),
+                       new ReduceAction304(137),
+                       new ReduceAction305(138),
+                       new ReduceAction22(138),
+                       new ReduceAction307(139),
+                       new ReduceAction307(140),
+                       new ReduceAction328(141),
+                       new ReduceAction329(141),
+                       new ReduceAction331(142),
+                       new ReduceAction315(142),
+                       new ReduceAction315(142),
+                       new ReduceAction141(143),
+                       new ReduceAction142(143),
+                       new ReduceAction154(144),
+                       new ReduceAction154(145),
+                       new ReduceAction231(145),
+                       new ReduceAction154(146),
+                       new ReduceAction233(146),
+                       new ReduceAction234(146),
+                       new ReduceAction235(146),
+                       new ReduceAction236(146),
+                       new ReduceAction154(147),
+                       new ReduceAction238(147),
+                       new ReduceAction154(148),
+                       new ReduceAction240(148),
+                       new ReduceAction241(148),
+                       new ReduceAction242(148),
+                       new ReduceAction243(148),
+                       new ReduceAction244(148),
+                       new ReduceAction245(148),
+                       new ReduceAction246(148),
+                       new ReduceAction247(148),
+                       new ReduceAction248(148),
+                       new ReduceAction249(148),
+                       new ReduceAction154(149),
+                       new ReduceAction251(149),
+                       new ReduceAction252(149),
+                       new ReduceAction154(150),
+                       new ReduceAction254(150),
+                       new ReduceAction255(150),
+                       new ReduceAction256(150),
+                       new ReduceAction154(151),
+                       new ReduceAction258(151),
+                       new ReduceAction154(152),
+                       new ReduceAction260(152),
+                       new ReduceAction261(152),
+                       new ReduceAction154(153),
+                       new ReduceAction263(153),
+                       new ReduceAction602(153),
+                       new ReduceAction154(154),
+                       new ReduceAction604(154),
+                       new ReduceAction605(154),
+                       new ReduceAction179(154),
+                       new ReduceAction607(154),
+                       new ReduceAction275(154),
+                       new ReduceAction276(154),
+                       new ReduceAction277(154),
+                       new ReduceAction278(154),
+                       new ReduceAction279(154),
+                       new ReduceAction280(155),
+                       new ReduceAction281(155),
+                       new ReduceAction282(155),
+                       new ReduceAction283(155),
+                       new ReduceAction284(155),
+                       new ReduceAction285(155),
+                       new ReduceAction286(155),
+                       new ReduceAction287(155),
+                       new ReduceAction288(155),
+                       new ReduceAction154(155),
+                       new ReduceAction623(156),
+                       new ReduceAction624(156),
+                       new ReduceAction151(157),
+                       new ReduceAction152(157),
+                       new ReduceAction153(157),
+                       new ReduceAction154(157),
+                       new ReduceAction154(158),
+                       new ReduceAction154(158),
+                       new ReduceAction164(158),
+                       new ReduceAction165(158),
+                       new ReduceAction166(158),
+                       new ReduceAction167(158),
+                       new ReduceAction168(158),
+                       new ReduceAction169(158),
                        new ReduceAction170(158),
-                       new ReduceAction170(159),
-                       new ReduceAction170(160),
-                       new ReduceAction170(160),
-                       new ReduceAction180(160),
-                       new ReduceAction181(160),
-                       new ReduceAction182(160),
-                       new ReduceAction183(160),
-                       new ReduceAction184(160),
-                       new ReduceAction185(160),
-                       new ReduceAction186(160),
-                       new ReduceAction170(160),
-                       new ReduceAction170(160),
-                       new ReduceAction170(160),
-                       new ReduceAction170(160),
-                       new ReduceAction170(160),
-                       new ReduceAction170(160),
-                       new ReduceAction193(160),
-                       new ReduceAction194(160),
+                       new ReduceAction154(158),
+                       new ReduceAction154(158),
+                       new ReduceAction154(158),
+                       new ReduceAction154(158),
+                       new ReduceAction154(158),
+                       new ReduceAction154(158),
+                       new ReduceAction177(158),
+                       new ReduceAction178(158),
+                       new ReduceAction179(158),
+                       new ReduceAction180(158),
+                       new ReduceAction181(158),
+                       new ReduceAction182(158),
+                       new ReduceAction183(158),
+                       new ReduceAction182(158),
+                       new ReduceAction185(158),
+                       new ReduceAction186(158),
+                       new ReduceAction185(158),
+                       new ReduceAction188(158),
+                       new ReduceAction191(159),
+                       new ReduceAction192(159),
+                       new ReduceAction193(159),
+                       new ReduceAction194(159),
                        new ReduceAction195(160),
                        new ReduceAction196(160),
                        new ReduceAction197(160),
                        new ReduceAction198(160),
                        new ReduceAction199(160),
-                       new ReduceAction198(160),
+                       new ReduceAction200(160),
                        new ReduceAction201(160),
                        new ReduceAction202(160),
-                       new ReduceAction201(160),
+                       new ReduceAction203(160),
                        new ReduceAction204(160),
-                       new ReduceAction211(161),
-                       new ReduceAction212(161),
-                       new ReduceAction213(161),
-                       new ReduceAction214(161),
-                       new ReduceAction215(161),
-                       new ReduceAction216(161),
-                       new ReduceAction217(161),
-                       new ReduceAction218(161),
-                       new ReduceAction219(161),
-                       new ReduceAction220(161),
-                       new ReduceAction170(162),
-                       new ReduceAction170(163),
-                       new ReduceAction167(164),
-                       new ReduceAction168(164),
-                       new ReduceAction169(164),
-                       new ReduceAction167(165),
-                       new ReduceAction168(165),
-                       new ReduceAction169(165),
-                       new ReduceAction170(166),
-                       new ReduceAction170(166),
-                       new ReduceAction180(166),
-                       new ReduceAction181(166),
-                       new ReduceAction182(166),
-                       new ReduceAction183(166),
-                       new ReduceAction184(166),
-                       new ReduceAction185(166),
-                       new ReduceAction186(166),
-                       new ReduceAction170(166),
-                       new ReduceAction170(166),
-                       new ReduceAction170(166),
-                       new ReduceAction170(166),
-                       new ReduceAction170(166),
-                       new ReduceAction204(166),
-                       new ReduceAction170(167),
-                       new ReduceAction170(167),
-                       new ReduceAction180(167),
-                       new ReduceAction181(167),
-                       new ReduceAction182(167),
-                       new ReduceAction183(167),
-                       new ReduceAction184(167),
-                       new ReduceAction185(167),
-                       new ReduceAction186(167),
-                       new ReduceAction170(167),
-                       new ReduceAction170(167),
-                       new ReduceAction170(167),
-                       new ReduceAction170(167),
-                       new ReduceAction170(167),
-                       new ReduceAction204(167),
-                       new ReduceAction170(168),
-                       new ReduceAction170(168),
-                       new ReduceAction180(168),
-                       new ReduceAction181(168),
-                       new ReduceAction182(168),
-                       new ReduceAction183(168),
-                       new ReduceAction184(168),
-                       new ReduceAction185(168),
-                       new ReduceAction186(168),
-                       new ReduceAction170(168),
-                       new ReduceAction170(168),
-                       new ReduceAction170(168),
-                       new ReduceAction170(168),
-                       new ReduceAction170(168),
-                       new ReduceAction204(168),
-                       new ReduceAction170(169),
+                       new ReduceAction207(161),
+                       new ReduceAction208(161),
+                       new ReduceAction209(162),
+                       new ReduceAction216(163),
+                       new ReduceAction217(163),
+                       new ReduceAction218(164),
+                       new ReduceAction219(164),
+                       new ReduceAction220(165),
+                       new ReduceAction221(165),
+                       new ReduceAction222(165),
+                       new ReduceAction223(165),
+                       new ReduceAction224(166),
+                       new ReduceAction225(166),
+                       new ReduceAction154(167),
+                       new ReduceAction154(168),
+                       new ReduceAction154(169),
+                       new ReduceAction154(169),
+                       new ReduceAction164(169),
+                       new ReduceAction165(169),
+                       new ReduceAction166(169),
+                       new ReduceAction167(169),
+                       new ReduceAction168(169),
+                       new ReduceAction169(169),
                        new ReduceAction170(169),
+                       new ReduceAction154(169),
+                       new ReduceAction154(169),
+                       new ReduceAction154(169),
+                       new ReduceAction154(169),
+                       new ReduceAction154(169),
+                       new ReduceAction154(169),
+                       new ReduceAction177(169),
+                       new ReduceAction178(169),
+                       new ReduceAction179(169),
                        new ReduceAction180(169),
                        new ReduceAction181(169),
                        new ReduceAction182(169),
                        new ReduceAction183(169),
-                       new ReduceAction184(169),
+                       new ReduceAction182(169),
                        new ReduceAction185(169),
                        new ReduceAction186(169),
-                       new ReduceAction170(169),
-                       new ReduceAction170(169),
-                       new ReduceAction170(169),
-                       new ReduceAction170(169),
-                       new ReduceAction170(169),
-                       new ReduceAction204(169),
-                       new ReduceAction344(170),
-                       new ReduceAction792(171),
-                       new ReduceAction793(171),
-                       new ReduceAction794(172),
-                       new ReduceAction795(172),
-                       new ReduceAction796(173),
-                       new ReduceAction797(173),
-                       new ReduceAction798(174),
-                       new ReduceAction799(174),
-                       new ReduceAction800(175),
-                       new ReduceAction801(175),
-                       new ReduceAction802(176),
-                       new ReduceAction803(176),
-                       new ReduceAction804(177),
-                       new ReduceAction805(177),
-                       new ReduceAction806(178),
-                       new ReduceAction807(178),
-                       new ReduceAction161(179),
-                       new ReduceAction809(179),
-                       new ReduceAction810(180),
-                       new ReduceAction811(180),
-                       new ReduceAction812(181),
-                       new ReduceAction813(181),
-                       new ReduceAction323(182),
-                       new ReduceAction815(182),
-                       new ReduceAction323(183),
-                       new ReduceAction815(183),
-                       new ReduceAction323(184),
-                       new ReduceAction815(184),
-                       new ReduceAction337(185),
-                       new ReduceAction821(185),
-                       new ReduceAction810(186),
-                       new ReduceAction811(186),
-                       new ReduceAction358(187),
-                       new ReduceAction825(187),
-                       new ReduceAction826(188),
-                       new ReduceAction827(188),
-                       new ReduceAction828(189),
-                       new ReduceAction829(189)
+                       new ReduceAction185(169),
+                       new ReduceAction188(169),
+                       new ReduceAction195(170),
+                       new ReduceAction196(170),
+                       new ReduceAction197(170),
+                       new ReduceAction198(170),
+                       new ReduceAction199(170),
+                       new ReduceAction200(170),
+                       new ReduceAction201(170),
+                       new ReduceAction202(170),
+                       new ReduceAction203(170),
+                       new ReduceAction204(170),
+                       new ReduceAction154(171),
+                       new ReduceAction154(172),
+                       new ReduceAction151(173),
+                       new ReduceAction152(173),
+                       new ReduceAction153(173),
+                       new ReduceAction151(174),
+                       new ReduceAction152(174),
+                       new ReduceAction153(174),
+                       new ReduceAction154(175),
+                       new ReduceAction154(175),
+                       new ReduceAction164(175),
+                       new ReduceAction165(175),
+                       new ReduceAction166(175),
+                       new ReduceAction167(175),
+                       new ReduceAction168(175),
+                       new ReduceAction169(175),
+                       new ReduceAction170(175),
+                       new ReduceAction154(175),
+                       new ReduceAction154(175),
+                       new ReduceAction154(175),
+                       new ReduceAction154(175),
+                       new ReduceAction154(175),
+                       new ReduceAction188(175),
+                       new ReduceAction154(176),
+                       new ReduceAction154(176),
+                       new ReduceAction164(176),
+                       new ReduceAction165(176),
+                       new ReduceAction166(176),
+                       new ReduceAction167(176),
+                       new ReduceAction168(176),
+                       new ReduceAction169(176),
+                       new ReduceAction170(176),
+                       new ReduceAction154(176),
+                       new ReduceAction154(176),
+                       new ReduceAction154(176),
+                       new ReduceAction154(176),
+                       new ReduceAction154(176),
+                       new ReduceAction188(176),
+                       new ReduceAction154(177),
+                       new ReduceAction154(177),
+                       new ReduceAction164(177),
+                       new ReduceAction165(177),
+                       new ReduceAction166(177),
+                       new ReduceAction167(177),
+                       new ReduceAction168(177),
+                       new ReduceAction169(177),
+                       new ReduceAction170(177),
+                       new ReduceAction154(177),
+                       new ReduceAction154(177),
+                       new ReduceAction154(177),
+                       new ReduceAction154(177),
+                       new ReduceAction154(177),
+                       new ReduceAction188(177),
+                       new ReduceAction154(178),
+                       new ReduceAction154(178),
+                       new ReduceAction164(178),
+                       new ReduceAction165(178),
+                       new ReduceAction166(178),
+                       new ReduceAction167(178),
+                       new ReduceAction168(178),
+                       new ReduceAction169(178),
+                       new ReduceAction170(178),
+                       new ReduceAction154(178),
+                       new ReduceAction154(178),
+                       new ReduceAction154(178),
+                       new ReduceAction154(178),
+                       new ReduceAction154(178),
+                       new ReduceAction188(178),
+                       new ReduceAction335(179),
+                       new ReduceAction337(179),
+                       new ReduceAction792(180),
+                       new ReduceAction793(180),
+                       new ReduceAction794(181),
+                       new ReduceAction795(181),
+                       new ReduceAction796(182),
+                       new ReduceAction797(182),
+                       new ReduceAction798(183),
+                       new ReduceAction799(183),
+                       new ReduceAction800(184),
+                       new ReduceAction801(184),
+                       new ReduceAction802(185),
+                       new ReduceAction803(185),
+                       new ReduceAction804(186),
+                       new ReduceAction805(186),
+                       new ReduceAction806(187),
+                       new ReduceAction807(187),
+                       new ReduceAction145(188),
+                       new ReduceAction809(188),
+                       new ReduceAction810(189),
+                       new ReduceAction811(189),
+                       new ReduceAction812(190),
+                       new ReduceAction813(190),
+                       new ReduceAction310(191),
+                       new ReduceAction815(191),
+                       new ReduceAction310(192),
+                       new ReduceAction815(192),
+                       new ReduceAction310(193),
+                       new ReduceAction815(193),
+                       new ReduceAction328(194),
+                       new ReduceAction821(194),
+                       new ReduceAction810(195),
+                       new ReduceAction811(195),
+                       new ReduceAction349(196),
+                       new ReduceAction825(196),
+                       new ReduceAction826(197),
+                       new ReduceAction827(197),
+                       new ReduceAction828(198),
+                       new ReduceAction829(198)
                )
        end
 end
@@ -2749,21 +2749,25 @@ private class ReduceAction57
                                        assert pvisibilitynode4 isa nullable AVisibility
                                        var tkwmethnode5 = nodearraylist4
                                        assert tkwmethnode5 isa nullable TKwmeth
-                                       var pmethidnode6 = nodearraylist5
-                                       assert pmethidnode6 isa nullable AMethid
-                                       var psignaturenode7 = nodearraylist6
-                                       assert psignaturenode7 isa nullable ASignature
-                                       var pexprnode9 = nodearraylist8
-                                       assert pexprnode9 isa nullable AExpr
-                                       var ppropdefnode1: nullable AConcreteMethPropdef = new AConcreteMethPropdef.init_aconcretemethpropdef(
+                                       var pmethidnode8 = nodearraylist5
+                                       assert pmethidnode8 isa nullable AMethid
+                                       var psignaturenode9 = nodearraylist6
+                                       assert psignaturenode9 isa nullable ASignature
+                                       var pexprnode13 = nodearraylist8
+                                       assert pexprnode13 isa nullable AExpr
+                                       var ppropdefnode1: nullable AMethPropdef = new AMethPropdef.init_amethpropdef(
                                                pdocnode2,
                                                tkwredefnode3,
                                                pvisibilitynode4,
                                                tkwmethnode5,
-                                               pmethidnode6,
-                                               psignaturenode7,
                                                null,
-                                               pexprnode9
+                                               null,
+                                               pmethidnode8,
+                                               psignaturenode9,
+                                               null,
+                                               null,
+                                               null,
+                                               pexprnode13
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
@@ -2792,23 +2796,27 @@ private class ReduceAction58
                                        assert pvisibilitynode4 isa nullable AVisibility
                                        var tkwmethnode5 = nodearraylist4
                                        assert tkwmethnode5 isa nullable TKwmeth
-                                       var pmethidnode6 = nodearraylist5
-                                       assert pmethidnode6 isa nullable AMethid
-                                       var psignaturenode7 = nodearraylist6
-                                       assert psignaturenode7 isa nullable ASignature
-                                       var pannotationsnode8 = nodearraylist7
-                                       assert pannotationsnode8 isa nullable AAnnotations
-                                       var pexprnode9 = nodearraylist9
-                                       assert pexprnode9 isa nullable AExpr
-                                       var ppropdefnode1: nullable AConcreteMethPropdef = new AConcreteMethPropdef.init_aconcretemethpropdef(
+                                       var pmethidnode8 = nodearraylist5
+                                       assert pmethidnode8 isa nullable AMethid
+                                       var psignaturenode9 = nodearraylist6
+                                       assert psignaturenode9 isa nullable ASignature
+                                       var pannotationsnode10 = nodearraylist7
+                                       assert pannotationsnode10 isa nullable AAnnotations
+                                       var pexprnode13 = nodearraylist9
+                                       assert pexprnode13 isa nullable AExpr
+                                       var ppropdefnode1: nullable AMethPropdef = new AMethPropdef.init_amethpropdef(
                                                pdocnode2,
                                                tkwredefnode3,
                                                pvisibilitynode4,
                                                tkwmethnode5,
-                                               pmethidnode6,
-                                               psignaturenode7,
-                                               pannotationsnode8,
-                                               pexprnode9
+                                               null,
+                                               null,
+                                               pmethidnode8,
+                                               psignaturenode9,
+                                               pannotationsnode10,
+                                               null,
+                                               null,
+                                               pexprnode13
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
@@ -2834,20 +2842,25 @@ private class ReduceAction59
                                        assert pvisibilitynode4 isa nullable AVisibility
                                        var tkwmethnode5 = nodearraylist4
                                        assert tkwmethnode5 isa nullable TKwmeth
-                                       var pmethidnode6 = nodearraylist5
-                                       assert pmethidnode6 isa nullable AMethid
-                                       var psignaturenode7 = nodearraylist6
-                                       assert psignaturenode7 isa nullable ASignature
-                                       var pannotationsnode8 = nodearraylist7
-                                       assert pannotationsnode8 isa nullable AAnnotations
-                                       var ppropdefnode1: nullable ADeferredMethPropdef = new ADeferredMethPropdef.init_adeferredmethpropdef(
+                                       var pmethidnode8 = nodearraylist5
+                                       assert pmethidnode8 isa nullable AMethid
+                                       var psignaturenode9 = nodearraylist6
+                                       assert psignaturenode9 isa nullable ASignature
+                                       var pannotationsnode10 = nodearraylist7
+                                       assert pannotationsnode10 isa nullable AAnnotations
+                                       var ppropdefnode1: nullable AMethPropdef = new AMethPropdef.init_amethpropdef(
                                                pdocnode2,
                                                tkwredefnode3,
                                                pvisibilitynode4,
                                                tkwmethnode5,
-                                               pmethidnode6,
-                                               psignaturenode7,
-                                               pannotationsnode8
+                                               null,
+                                               null,
+                                               pmethidnode8,
+                                               psignaturenode9,
+                                               pannotationsnode10,
+                                               null,
+                                               null,
+                                               null
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
@@ -2858,8 +2871,6 @@ private class ReduceAction60
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
-                                       var nodearraylist8 = p.pop
-                                       var nodearraylist7 = p.pop
                                        var nodearraylist6 = p.pop
                                        var nodearraylist5 = p.pop
                                        var nodearraylist4 = p.pop
@@ -2872,19 +2883,24 @@ private class ReduceAction60
                                        assert tkwredefnode3 isa nullable TKwredef
                                        var pvisibilitynode4 = nodearraylist3
                                        assert pvisibilitynode4 isa nullable AVisibility
-                                       var tkwmethnode5 = nodearraylist4
-                                       assert tkwmethnode5 isa nullable TKwmeth
-                                       var pmethidnode6 = nodearraylist5
-                                       assert pmethidnode6 isa nullable AMethid
-                                       var psignaturenode7 = nodearraylist6
-                                       assert psignaturenode7 isa nullable ASignature
-                                       var ppropdefnode1: nullable ADeferredMethPropdef = new ADeferredMethPropdef.init_adeferredmethpropdef(
+                                       var tkwnewnode7 = nodearraylist4
+                                       assert tkwnewnode7 isa nullable TKwnew
+                                       var psignaturenode9 = nodearraylist5
+                                       assert psignaturenode9 isa nullable ASignature
+                                       var pannotationsnode10 = nodearraylist6
+                                       assert pannotationsnode10 isa nullable AAnnotations
+                                       var ppropdefnode1: nullable AMethPropdef = new AMethPropdef.init_amethpropdef(
                                                pdocnode2,
                                                tkwredefnode3,
                                                pvisibilitynode4,
-                                               tkwmethnode5,
-                                               pmethidnode6,
-                                               psignaturenode7,
+                                               null,
+                                               null,
+                                               tkwnewnode7,
+                                               null,
+                                               psignaturenode9,
+                                               pannotationsnode10,
+                                               null,
+                                               null,
                                                null
                                        )
                                        node_list = ppropdefnode1
@@ -2896,7 +2912,6 @@ private class ReduceAction61
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
-                                       var nodearraylist8 = p.pop
                                        var nodearraylist7 = p.pop
                                        var nodearraylist6 = p.pop
                                        var nodearraylist5 = p.pop
@@ -2910,19 +2925,27 @@ private class ReduceAction61
                                        assert tkwredefnode3 isa nullable TKwredef
                                        var pvisibilitynode4 = nodearraylist3
                                        assert pvisibilitynode4 isa nullable AVisibility
-                                       var tkwmethnode5 = nodearraylist4
-                                       assert tkwmethnode5 isa nullable TKwmeth
-                                       var pmethidnode6 = nodearraylist5
-                                       assert pmethidnode6 isa nullable AMethid
-                                       var psignaturenode7 = nodearraylist6
-                                       assert psignaturenode7 isa nullable ASignature
-                                       var ppropdefnode1: nullable AInternMethPropdef = new AInternMethPropdef.init_ainternmethpropdef(
+                                       var tkwnewnode7 = nodearraylist4
+                                       assert tkwnewnode7 isa nullable TKwnew
+                                       var pmethidnode8 = nodearraylist5
+                                       assert pmethidnode8 isa nullable AMethid
+                                       var psignaturenode9 = nodearraylist6
+                                       assert psignaturenode9 isa nullable ASignature
+                                       var pannotationsnode10 = nodearraylist7
+                                       assert pannotationsnode10 isa nullable AAnnotations
+                                       var ppropdefnode1: nullable AMethPropdef = new AMethPropdef.init_amethpropdef(
                                                pdocnode2,
                                                tkwredefnode3,
                                                pvisibilitynode4,
-                                               tkwmethnode5,
-                                               pmethidnode6,
-                                               psignaturenode7
+                                               null,
+                                               null,
+                                               tkwnewnode7,
+                                               pmethidnode8,
+                                               psignaturenode9,
+                                               pannotationsnode10,
+                                               null,
+                                               null,
+                                               null
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
@@ -2933,6 +2956,7 @@ private class ReduceAction62
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
+                                       var nodearraylist8 = p.pop
                                        var nodearraylist7 = p.pop
                                        var nodearraylist6 = p.pop
                                        var nodearraylist5 = p.pop
@@ -2946,17 +2970,29 @@ private class ReduceAction62
                                        assert tkwredefnode3 isa nullable TKwredef
                                        var pvisibilitynode4 = nodearraylist3
                                        assert pvisibilitynode4 isa nullable AVisibility
-                                       var tkwnewnode5 = nodearraylist4
-                                       assert tkwnewnode5 isa nullable TKwnew
-                                       var psignaturenode7 = nodearraylist5
-                                       assert psignaturenode7 isa nullable ASignature
-                                       var ppropdefnode1: nullable AInternNewPropdef = new AInternNewPropdef.init_ainternnewpropdef(
+                                       var tkwmethnode5 = nodearraylist4
+                                       assert tkwmethnode5 isa nullable TKwmeth
+                                       var pmethidnode8 = nodearraylist5
+                                       assert pmethidnode8 isa nullable AMethid
+                                       var psignaturenode9 = nodearraylist6
+                                       assert psignaturenode9 isa nullable ASignature
+                                       var pexterncallsnode11 = nodearraylist7
+                                       assert pexterncallsnode11 isa nullable AExternCalls
+                                       var pexterncodeblocknode12 = nodearraylist8
+                                       assert pexterncodeblocknode12 isa nullable AExternCodeBlock
+                                       var ppropdefnode1: nullable AMethPropdef = new AMethPropdef.init_amethpropdef(
                                                pdocnode2,
                                                tkwredefnode3,
                                                pvisibilitynode4,
-                                               tkwnewnode5,
+                                               tkwmethnode5,
+                                               null,
+                                               null,
+                                               pmethidnode8,
+                                               psignaturenode9,
                                                null,
-                                               psignaturenode7
+                                               pexterncallsnode11,
+                                               pexterncodeblocknode12,
+                                               null
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
@@ -2967,6 +3003,7 @@ private class ReduceAction63
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
+                                       var nodearraylist9 = p.pop
                                        var nodearraylist8 = p.pop
                                        var nodearraylist7 = p.pop
                                        var nodearraylist6 = p.pop
@@ -2981,19 +3018,31 @@ private class ReduceAction63
                                        assert tkwredefnode3 isa nullable TKwredef
                                        var pvisibilitynode4 = nodearraylist3
                                        assert pvisibilitynode4 isa nullable AVisibility
-                                       var tkwnewnode5 = nodearraylist4
-                                       assert tkwnewnode5 isa nullable TKwnew
-                                       var pmethidnode6 = nodearraylist5
-                                       assert pmethidnode6 isa nullable AMethid
-                                       var psignaturenode7 = nodearraylist6
-                                       assert psignaturenode7 isa nullable ASignature
-                                       var ppropdefnode1: nullable AInternNewPropdef = new AInternNewPropdef.init_ainternnewpropdef(
+                                       var tkwmethnode5 = nodearraylist4
+                                       assert tkwmethnode5 isa nullable TKwmeth
+                                       var pmethidnode8 = nodearraylist5
+                                       assert pmethidnode8 isa nullable AMethid
+                                       var psignaturenode9 = nodearraylist6
+                                       assert psignaturenode9 isa nullable ASignature
+                                       var pannotationsnode10 = nodearraylist7
+                                       assert pannotationsnode10 isa nullable AAnnotations
+                                       var pexterncallsnode11 = nodearraylist8
+                                       assert pexterncallsnode11 isa nullable AExternCalls
+                                       var pexterncodeblocknode12 = nodearraylist9
+                                       assert pexterncodeblocknode12 isa nullable AExternCodeBlock
+                                       var ppropdefnode1: nullable AMethPropdef = new AMethPropdef.init_amethpropdef(
                                                pdocnode2,
                                                tkwredefnode3,
                                                pvisibilitynode4,
-                                               tkwnewnode5,
-                                               pmethidnode6,
-                                               psignaturenode7
+                                               tkwmethnode5,
+                                               null,
+                                               null,
+                                               pmethidnode8,
+                                               psignaturenode9,
+                                               pannotationsnode10,
+                                               pexterncallsnode11,
+                                               pexterncodeblocknode12,
+                                               null
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
@@ -3004,10 +3053,6 @@ private class ReduceAction64
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
-                                       var nodearraylist11 = p.pop
-                                       var nodearraylist10 = p.pop
-                                       var nodearraylist9 = p.pop
-                                       var nodearraylist8 = p.pop
                                        var nodearraylist7 = p.pop
                                        var nodearraylist6 = p.pop
                                        var nodearraylist5 = p.pop
@@ -3021,29 +3066,23 @@ private class ReduceAction64
                                        assert tkwredefnode3 isa nullable TKwredef
                                        var pvisibilitynode4 = nodearraylist3
                                        assert pvisibilitynode4 isa nullable AVisibility
-                                       var tkwmethnode5 = nodearraylist4
-                                       assert tkwmethnode5 isa nullable TKwmeth
-                                       var pmethidnode6 = nodearraylist5
-                                       assert pmethidnode6 isa nullable AMethid
-                                       var psignaturenode7 = nodearraylist6
-                                       assert psignaturenode7 isa nullable ASignature
-                                       var tstringnode9 = nodearraylist9
-                                       assert tstringnode9 isa nullable TString
-                                       var pexterncallsnode10 = nodearraylist10
-                                       assert pexterncallsnode10 isa nullable AExternCalls
-                                       var pexterncodeblocknode11 = nodearraylist11
-                                       assert pexterncodeblocknode11 isa nullable AExternCodeBlock
-                                       var ppropdefnode1: nullable AExternMethPropdef = new AExternMethPropdef.init_aexternmethpropdef(
+                                       var tkwvarnode5 = nodearraylist4
+                                       assert tkwvarnode5 isa nullable TKwvar
+                                       var tidnode6 = nodearraylist5
+                                       assert tidnode6 isa nullable TId
+                                       var ptypenode7 = nodearraylist6
+                                       assert ptypenode7 isa nullable AType
+                                       var pannotationsnode9 = nodearraylist7
+                                       assert pannotationsnode9 isa nullable AAnnotations
+                                       var ppropdefnode1: nullable AAttrPropdef = new AAttrPropdef.init_aattrpropdef(
                                                pdocnode2,
                                                tkwredefnode3,
                                                pvisibilitynode4,
-                                               tkwmethnode5,
-                                               pmethidnode6,
-                                               psignaturenode7,
+                                               tkwvarnode5,
+                                               tidnode6,
+                                               ptypenode7,
                                                null,
-                                               tstringnode9,
-                                               pexterncallsnode10,
-                                               pexterncodeblocknode11
+                                               pannotationsnode9
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
@@ -3054,6 +3093,8 @@ private class ReduceAction65
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
+                                       var nodearraylist10 = p.pop
+                                       var nodearraylist9 = p.pop
                                        var nodearraylist8 = p.pop
                                        var nodearraylist7 = p.pop
                                        var nodearraylist6 = p.pop
@@ -3068,27 +3109,25 @@ private class ReduceAction65
                                        assert tkwredefnode3 isa nullable TKwredef
                                        var pvisibilitynode4 = nodearraylist3
                                        assert pvisibilitynode4 isa nullable AVisibility
-                                       var tkwmethnode5 = nodearraylist4
-                                       assert tkwmethnode5 isa nullable TKwmeth
-                                       var pmethidnode6 = nodearraylist5
-                                       assert pmethidnode6 isa nullable AMethid
-                                       var psignaturenode7 = nodearraylist6
-                                       assert psignaturenode7 isa nullable ASignature
-                                       var pexterncallsnode10 = nodearraylist7
-                                       assert pexterncallsnode10 isa nullable AExternCalls
-                                       var pexterncodeblocknode11 = nodearraylist8
-                                       assert pexterncodeblocknode11 isa nullable AExternCodeBlock
-                                       var ppropdefnode1: nullable AExternMethPropdef = new AExternMethPropdef.init_aexternmethpropdef(
+                                       var tkwvarnode5 = nodearraylist4
+                                       assert tkwvarnode5 isa nullable TKwvar
+                                       var tidnode6 = nodearraylist5
+                                       assert tidnode6 isa nullable TId
+                                       var ptypenode7 = nodearraylist6
+                                       assert ptypenode7 isa nullable AType
+                                       var pexprnode8 = nodearraylist9
+                                       assert pexprnode8 isa nullable AExpr
+                                       var pannotationsnode9 = nodearraylist10
+                                       assert pannotationsnode9 isa nullable AAnnotations
+                                       var ppropdefnode1: nullable AAttrPropdef = new AAttrPropdef.init_aattrpropdef(
                                                pdocnode2,
                                                tkwredefnode3,
                                                pvisibilitynode4,
-                                               tkwmethnode5,
-                                               pmethidnode6,
-                                               psignaturenode7,
-                                               null,
-                                               null,
-                                               pexterncallsnode10,
-                                               pexterncodeblocknode11
+                                               tkwvarnode5,
+                                               tidnode6,
+                                               ptypenode7,
+                                               pexprnode8,
+                                               pannotationsnode9
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
@@ -3099,7 +3138,6 @@ private class ReduceAction66
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
-                                       var nodearraylist9 = p.pop
                                        var nodearraylist8 = p.pop
                                        var nodearraylist7 = p.pop
                                        var nodearraylist6 = p.pop
@@ -3114,29 +3152,25 @@ private class ReduceAction66
                                        assert tkwredefnode3 isa nullable TKwredef
                                        var pvisibilitynode4 = nodearraylist3
                                        assert pvisibilitynode4 isa nullable AVisibility
-                                       var tkwmethnode5 = nodearraylist4
-                                       assert tkwmethnode5 isa nullable TKwmeth
-                                       var pmethidnode6 = nodearraylist5
-                                       assert pmethidnode6 isa nullable AMethid
-                                       var psignaturenode7 = nodearraylist6
-                                       assert psignaturenode7 isa nullable ASignature
-                                       var pannotationsnode8 = nodearraylist7
-                                       assert pannotationsnode8 isa nullable AAnnotations
-                                       var pexterncallsnode10 = nodearraylist8
-                                       assert pexterncallsnode10 isa nullable AExternCalls
-                                       var pexterncodeblocknode11 = nodearraylist9
-                                       assert pexterncodeblocknode11 isa nullable AExternCodeBlock
-                                       var ppropdefnode1: nullable AExternMethPropdef = new AExternMethPropdef.init_aexternmethpropdef(
+                                       var tkwinitnode6 = nodearraylist4
+                                       assert tkwinitnode6 isa nullable TKwinit
+                                       var psignaturenode9 = nodearraylist5
+                                       assert psignaturenode9 isa nullable ASignature
+                                       var pexprnode13 = nodearraylist7
+                                       assert pexprnode13 isa nullable AExpr
+                                       var ppropdefnode1: nullable AMethPropdef = new AMethPropdef.init_amethpropdef(
                                                pdocnode2,
                                                tkwredefnode3,
                                                pvisibilitynode4,
-                                               tkwmethnode5,
-                                               pmethidnode6,
-                                               psignaturenode7,
-                                               pannotationsnode8,
                                                null,
-                                               pexterncallsnode10,
-                                               pexterncodeblocknode11
+                                               tkwinitnode6,
+                                               null,
+                                               null,
+                                               psignaturenode9,
+                                               null,
+                                               null,
+                                               null,
+                                               pexprnode13
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
@@ -3147,6 +3181,9 @@ private class ReduceAction67
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
+                                       var nodearraylist9 = p.pop
+                                       var nodearraylist8 = p.pop
+                                       var nodearraylist7 = p.pop
                                        var nodearraylist6 = p.pop
                                        var nodearraylist5 = p.pop
                                        var nodearraylist4 = p.pop
@@ -3155,28 +3192,31 @@ private class ReduceAction67
                                        var nodearraylist1 = p.pop
                                        var pdocnode2 = nodearraylist1
                                        assert pdocnode2 isa nullable ADoc
-                                       var tkwredefnode5 = nodearraylist2
-                                       assert tkwredefnode5 isa nullable TKwredef
-                                       var pvisibilitynode6 = nodearraylist3
-                                       assert pvisibilitynode6 isa nullable AVisibility
-                                       var tkwvarnode7 = nodearraylist4
-                                       assert tkwvarnode7 isa nullable TKwvar
-                                       var tattridnode8 = nodearraylist5
-                                       assert tattridnode8 isa nullable TAttrid
-                                       var ptypenode10 = nodearraylist6
-                                       assert ptypenode10 isa nullable AType
-                                       var ppropdefnode1: nullable AAttrPropdef = new AAttrPropdef.init_aattrpropdef(
+                                       var tkwredefnode3 = nodearraylist2
+                                       assert tkwredefnode3 isa nullable TKwredef
+                                       var pvisibilitynode4 = nodearraylist3
+                                       assert pvisibilitynode4 isa nullable AVisibility
+                                       var tkwinitnode6 = nodearraylist4
+                                       assert tkwinitnode6 isa nullable TKwinit
+                                       var pmethidnode8 = nodearraylist5
+                                       assert pmethidnode8 isa nullable AMethid
+                                       var psignaturenode9 = nodearraylist6
+                                       assert psignaturenode9 isa nullable ASignature
+                                       var pexprnode13 = nodearraylist8
+                                       assert pexprnode13 isa nullable AExpr
+                                       var ppropdefnode1: nullable AMethPropdef = new AMethPropdef.init_amethpropdef(
                                                pdocnode2,
+                                               tkwredefnode3,
+                                               pvisibilitynode4,
                                                null,
+                                               tkwinitnode6,
                                                null,
-                                               tkwredefnode5,
-                                               pvisibilitynode6,
-                                               tkwvarnode7,
-                                               tattridnode8,
+                                               pmethidnode8,
+                                               psignaturenode9,
                                                null,
-                                               ptypenode10,
                                                null,
-                                               null
+                                               null,
+                                               pexprnode13
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
@@ -3187,6 +3227,8 @@ private class ReduceAction68
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
+                                       var nodearraylist9 = p.pop
+                                       var nodearraylist8 = p.pop
                                        var nodearraylist7 = p.pop
                                        var nodearraylist6 = p.pop
                                        var nodearraylist5 = p.pop
@@ -3196,30 +3238,31 @@ private class ReduceAction68
                                        var nodearraylist1 = p.pop
                                        var pdocnode2 = nodearraylist1
                                        assert pdocnode2 isa nullable ADoc
-                                       var pablenode3 = nodearraylist2
-                                       assert pablenode3 isa nullable AAble
-                                       var tkwredefnode5 = nodearraylist3
-                                       assert tkwredefnode5 isa nullable TKwredef
-                                       var pvisibilitynode6 = nodearraylist4
-                                       assert pvisibilitynode6 isa nullable AVisibility
-                                       var tkwvarnode7 = nodearraylist5
-                                       assert tkwvarnode7 isa nullable TKwvar
-                                       var tattridnode8 = nodearraylist6
-                                       assert tattridnode8 isa nullable TAttrid
-                                       var ptypenode10 = nodearraylist7
-                                       assert ptypenode10 isa nullable AType
-                                       var ppropdefnode1: nullable AAttrPropdef = new AAttrPropdef.init_aattrpropdef(
+                                       var tkwredefnode3 = nodearraylist2
+                                       assert tkwredefnode3 isa nullable TKwredef
+                                       var pvisibilitynode4 = nodearraylist3
+                                       assert pvisibilitynode4 isa nullable AVisibility
+                                       var tkwinitnode6 = nodearraylist4
+                                       assert tkwinitnode6 isa nullable TKwinit
+                                       var psignaturenode9 = nodearraylist5
+                                       assert psignaturenode9 isa nullable ASignature
+                                       var pannotationsnode10 = nodearraylist6
+                                       assert pannotationsnode10 isa nullable AAnnotations
+                                       var pexprnode13 = nodearraylist8
+                                       assert pexprnode13 isa nullable AExpr
+                                       var ppropdefnode1: nullable AMethPropdef = new AMethPropdef.init_amethpropdef(
                                                pdocnode2,
-                                               pablenode3,
+                                               tkwredefnode3,
+                                               pvisibilitynode4,
                                                null,
-                                               tkwredefnode5,
-                                               pvisibilitynode6,
-                                               tkwvarnode7,
-                                               tattridnode8,
+                                               tkwinitnode6,
                                                null,
-                                               ptypenode10,
                                                null,
-                                               null
+                                               psignaturenode9,
+                                               pannotationsnode10,
+                                               null,
+                                               null,
+                                               pexprnode13
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
@@ -3230,6 +3273,9 @@ private class ReduceAction69
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
+                                       var nodearraylist10 = p.pop
+                                       var nodearraylist9 = p.pop
+                                       var nodearraylist8 = p.pop
                                        var nodearraylist7 = p.pop
                                        var nodearraylist6 = p.pop
                                        var nodearraylist5 = p.pop
@@ -3239,30 +3285,33 @@ private class ReduceAction69
                                        var nodearraylist1 = p.pop
                                        var pdocnode2 = nodearraylist1
                                        assert pdocnode2 isa nullable ADoc
-                                       var pablenode4 = nodearraylist2
-                                       assert pablenode4 isa nullable AAble
-                                       var tkwredefnode5 = nodearraylist3
-                                       assert tkwredefnode5 isa nullable TKwredef
-                                       var pvisibilitynode6 = nodearraylist4
-                                       assert pvisibilitynode6 isa nullable AVisibility
-                                       var tkwvarnode7 = nodearraylist5
-                                       assert tkwvarnode7 isa nullable TKwvar
-                                       var tattridnode8 = nodearraylist6
-                                       assert tattridnode8 isa nullable TAttrid
-                                       var ptypenode10 = nodearraylist7
-                                       assert ptypenode10 isa nullable AType
-                                       var ppropdefnode1: nullable AAttrPropdef = new AAttrPropdef.init_aattrpropdef(
+                                       var tkwredefnode3 = nodearraylist2
+                                       assert tkwredefnode3 isa nullable TKwredef
+                                       var pvisibilitynode4 = nodearraylist3
+                                       assert pvisibilitynode4 isa nullable AVisibility
+                                       var tkwinitnode6 = nodearraylist4
+                                       assert tkwinitnode6 isa nullable TKwinit
+                                       var pmethidnode8 = nodearraylist5
+                                       assert pmethidnode8 isa nullable AMethid
+                                       var psignaturenode9 = nodearraylist6
+                                       assert psignaturenode9 isa nullable ASignature
+                                       var pannotationsnode10 = nodearraylist7
+                                       assert pannotationsnode10 isa nullable AAnnotations
+                                       var pexprnode13 = nodearraylist9
+                                       assert pexprnode13 isa nullable AExpr
+                                       var ppropdefnode1: nullable AMethPropdef = new AMethPropdef.init_amethpropdef(
                                                pdocnode2,
+                                               tkwredefnode3,
+                                               pvisibilitynode4,
                                                null,
-                                               pablenode4,
-                                               tkwredefnode5,
-                                               pvisibilitynode6,
-                                               tkwvarnode7,
-                                               tattridnode8,
+                                               tkwinitnode6,
                                                null,
-                                               ptypenode10,
+                                               pmethidnode8,
+                                               psignaturenode9,
+                                               pannotationsnode10,
                                                null,
-                                               null
+                                               null,
+                                               pexprnode13
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
@@ -3273,7 +3322,6 @@ private class ReduceAction70
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
-                                       var nodearraylist8 = p.pop
                                        var nodearraylist7 = p.pop
                                        var nodearraylist6 = p.pop
                                        var nodearraylist5 = p.pop
@@ -3283,32 +3331,26 @@ private class ReduceAction70
                                        var nodearraylist1 = p.pop
                                        var pdocnode2 = nodearraylist1
                                        assert pdocnode2 isa nullable ADoc
-                                       var pablenode3 = nodearraylist2
-                                       assert pablenode3 isa nullable AAble
-                                       var pablenode4 = nodearraylist3
-                                       assert pablenode4 isa nullable AAble
-                                       var tkwredefnode5 = nodearraylist4
-                                       assert tkwredefnode5 isa nullable TKwredef
-                                       var pvisibilitynode6 = nodearraylist5
-                                       assert pvisibilitynode6 isa nullable AVisibility
-                                       var tkwvarnode7 = nodearraylist6
-                                       assert tkwvarnode7 isa nullable TKwvar
-                                       var tattridnode8 = nodearraylist7
-                                       assert tattridnode8 isa nullable TAttrid
-                                       var ptypenode10 = nodearraylist8
-                                       assert ptypenode10 isa nullable AType
-                                       var ppropdefnode1: nullable AAttrPropdef = new AAttrPropdef.init_aattrpropdef(
+                                       var tkwredefnode3 = nodearraylist2
+                                       assert tkwredefnode3 isa nullable TKwredef
+                                       var pvisibilitynode4 = nodearraylist3
+                                       assert pvisibilitynode4 isa nullable AVisibility
+                                       var tkwtypenode5 = nodearraylist4
+                                       assert tkwtypenode5 isa nullable TKwtype
+                                       var tclassidnode6 = nodearraylist5
+                                       assert tclassidnode6 isa nullable TClassid
+                                       var ptypenode7 = nodearraylist6
+                                       assert ptypenode7 isa nullable AType
+                                       var pannotationsnode8 = nodearraylist7
+                                       assert pannotationsnode8 isa nullable AAnnotations
+                                       var ppropdefnode1: nullable ATypePropdef = new ATypePropdef.init_atypepropdef(
                                                pdocnode2,
-                                               pablenode3,
-                                               pablenode4,
-                                               tkwredefnode5,
-                                               pvisibilitynode6,
-                                               tkwvarnode7,
-                                               tattridnode8,
-                                               null,
-                                               ptypenode10,
-                                               null,
-                                               null
+                                               tkwredefnode3,
+                                               pvisibilitynode4,
+                                               tkwtypenode5,
+                                               tclassidnode6,
+                                               ptypenode7,
+                                               pannotationsnode8
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
@@ -3319,8 +3361,6 @@ private class ReduceAction71
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
-                                       var nodearraylist9 = p.pop
-                                       var nodearraylist8 = p.pop
                                        var nodearraylist7 = p.pop
                                        var nodearraylist6 = p.pop
                                        var nodearraylist5 = p.pop
@@ -3330,30 +3370,31 @@ private class ReduceAction71
                                        var nodearraylist1 = p.pop
                                        var pdocnode2 = nodearraylist1
                                        assert pdocnode2 isa nullable ADoc
-                                       var tkwredefnode5 = nodearraylist2
-                                       assert tkwredefnode5 isa nullable TKwredef
-                                       var pvisibilitynode6 = nodearraylist3
-                                       assert pvisibilitynode6 isa nullable AVisibility
-                                       var tkwvarnode7 = nodearraylist4
-                                       assert tkwvarnode7 isa nullable TKwvar
-                                       var tattridnode8 = nodearraylist5
-                                       assert tattridnode8 isa nullable TAttrid
-                                       var ptypenode10 = nodearraylist6
-                                       assert ptypenode10 isa nullable AType
-                                       var pexprnode12 = nodearraylist9
-                                       assert pexprnode12 isa nullable AExpr
-                                       var ppropdefnode1: nullable AAttrPropdef = new AAttrPropdef.init_aattrpropdef(
+                                       var tkwredefnode3 = nodearraylist2
+                                       assert tkwredefnode3 isa nullable TKwredef
+                                       var pvisibilitynode4 = nodearraylist3
+                                       assert pvisibilitynode4 isa nullable AVisibility
+                                       var tkwnewnode7 = nodearraylist4
+                                       assert tkwnewnode7 isa nullable TKwnew
+                                       var psignaturenode9 = nodearraylist5
+                                       assert psignaturenode9 isa nullable ASignature
+                                       var pexterncallsnode11 = nodearraylist6
+                                       assert pexterncallsnode11 isa nullable AExternCalls
+                                       var pexterncodeblocknode12 = nodearraylist7
+                                       assert pexterncodeblocknode12 isa nullable AExternCodeBlock
+                                       var ppropdefnode1: nullable AMethPropdef = new AMethPropdef.init_amethpropdef(
                                                pdocnode2,
+                                               tkwredefnode3,
+                                               pvisibilitynode4,
                                                null,
                                                null,
-                                               tkwredefnode5,
-                                               pvisibilitynode6,
-                                               tkwvarnode7,
-                                               tattridnode8,
+                                               tkwnewnode7,
                                                null,
-                                               ptypenode10,
+                                               psignaturenode9,
                                                null,
-                                               pexprnode12
+                                               pexterncallsnode11,
+                                               pexterncodeblocknode12,
+                                               null
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
@@ -3364,8 +3405,6 @@ private class ReduceAction72
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
-                                       var nodearraylist10 = p.pop
-                                       var nodearraylist9 = p.pop
                                        var nodearraylist8 = p.pop
                                        var nodearraylist7 = p.pop
                                        var nodearraylist6 = p.pop
@@ -3376,32 +3415,33 @@ private class ReduceAction72
                                        var nodearraylist1 = p.pop
                                        var pdocnode2 = nodearraylist1
                                        assert pdocnode2 isa nullable ADoc
-                                       var pablenode3 = nodearraylist2
-                                       assert pablenode3 isa nullable AAble
-                                       var tkwredefnode5 = nodearraylist3
-                                       assert tkwredefnode5 isa nullable TKwredef
-                                       var pvisibilitynode6 = nodearraylist4
-                                       assert pvisibilitynode6 isa nullable AVisibility
-                                       var tkwvarnode7 = nodearraylist5
-                                       assert tkwvarnode7 isa nullable TKwvar
-                                       var tattridnode8 = nodearraylist6
-                                       assert tattridnode8 isa nullable TAttrid
-                                       var ptypenode10 = nodearraylist7
-                                       assert ptypenode10 isa nullable AType
-                                       var pexprnode12 = nodearraylist10
-                                       assert pexprnode12 isa nullable AExpr
-                                       var ppropdefnode1: nullable AAttrPropdef = new AAttrPropdef.init_aattrpropdef(
+                                       var tkwredefnode3 = nodearraylist2
+                                       assert tkwredefnode3 isa nullable TKwredef
+                                       var pvisibilitynode4 = nodearraylist3
+                                       assert pvisibilitynode4 isa nullable AVisibility
+                                       var tkwnewnode7 = nodearraylist4
+                                       assert tkwnewnode7 isa nullable TKwnew
+                                       var pmethidnode8 = nodearraylist5
+                                       assert pmethidnode8 isa nullable AMethid
+                                       var psignaturenode9 = nodearraylist6
+                                       assert psignaturenode9 isa nullable ASignature
+                                       var pexterncallsnode11 = nodearraylist7
+                                       assert pexterncallsnode11 isa nullable AExternCalls
+                                       var pexterncodeblocknode12 = nodearraylist8
+                                       assert pexterncodeblocknode12 isa nullable AExternCodeBlock
+                                       var ppropdefnode1: nullable AMethPropdef = new AMethPropdef.init_amethpropdef(
                                                pdocnode2,
-                                               pablenode3,
+                                               tkwredefnode3,
+                                               pvisibilitynode4,
                                                null,
-                                               tkwredefnode5,
-                                               pvisibilitynode6,
-                                               tkwvarnode7,
-                                               tattridnode8,
                                                null,
-                                               ptypenode10,
+                                               tkwnewnode7,
+                                               pmethidnode8,
+                                               psignaturenode9,
                                                null,
-                                               pexprnode12
+                                               pexterncallsnode11,
+                                               pexterncodeblocknode12,
+                                               null
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
@@ -3412,8 +3452,6 @@ private class ReduceAction73
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
-                                       var nodearraylist10 = p.pop
-                                       var nodearraylist9 = p.pop
                                        var nodearraylist8 = p.pop
                                        var nodearraylist7 = p.pop
                                        var nodearraylist6 = p.pop
@@ -3424,32 +3462,33 @@ private class ReduceAction73
                                        var nodearraylist1 = p.pop
                                        var pdocnode2 = nodearraylist1
                                        assert pdocnode2 isa nullable ADoc
-                                       var pablenode4 = nodearraylist2
-                                       assert pablenode4 isa nullable AAble
-                                       var tkwredefnode5 = nodearraylist3
-                                       assert tkwredefnode5 isa nullable TKwredef
-                                       var pvisibilitynode6 = nodearraylist4
-                                       assert pvisibilitynode6 isa nullable AVisibility
-                                       var tkwvarnode7 = nodearraylist5
-                                       assert tkwvarnode7 isa nullable TKwvar
-                                       var tattridnode8 = nodearraylist6
-                                       assert tattridnode8 isa nullable TAttrid
-                                       var ptypenode10 = nodearraylist7
-                                       assert ptypenode10 isa nullable AType
-                                       var pexprnode12 = nodearraylist10
-                                       assert pexprnode12 isa nullable AExpr
-                                       var ppropdefnode1: nullable AAttrPropdef = new AAttrPropdef.init_aattrpropdef(
+                                       var tkwredefnode3 = nodearraylist2
+                                       assert tkwredefnode3 isa nullable TKwredef
+                                       var pvisibilitynode4 = nodearraylist3
+                                       assert pvisibilitynode4 isa nullable AVisibility
+                                       var tkwnewnode7 = nodearraylist4
+                                       assert tkwnewnode7 isa nullable TKwnew
+                                       var psignaturenode9 = nodearraylist5
+                                       assert psignaturenode9 isa nullable ASignature
+                                       var pannotationsnode10 = nodearraylist6
+                                       assert pannotationsnode10 isa nullable AAnnotations
+                                       var pexterncallsnode11 = nodearraylist7
+                                       assert pexterncallsnode11 isa nullable AExternCalls
+                                       var pexterncodeblocknode12 = nodearraylist8
+                                       assert pexterncodeblocknode12 isa nullable AExternCodeBlock
+                                       var ppropdefnode1: nullable AMethPropdef = new AMethPropdef.init_amethpropdef(
                                                pdocnode2,
+                                               tkwredefnode3,
+                                               pvisibilitynode4,
                                                null,
-                                               pablenode4,
-                                               tkwredefnode5,
-                                               pvisibilitynode6,
-                                               tkwvarnode7,
-                                               tattridnode8,
                                                null,
-                                               ptypenode10,
+                                               tkwnewnode7,
                                                null,
-                                               pexprnode12
+                                               psignaturenode9,
+                                               pannotationsnode10,
+                                               pexterncallsnode11,
+                                               pexterncodeblocknode12,
+                                               null
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
@@ -3460,8 +3499,6 @@ private class ReduceAction74
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
-                                       var nodearraylist11 = p.pop
-                                       var nodearraylist10 = p.pop
                                        var nodearraylist9 = p.pop
                                        var nodearraylist8 = p.pop
                                        var nodearraylist7 = p.pop
@@ -3473,34 +3510,35 @@ private class ReduceAction74
                                        var nodearraylist1 = p.pop
                                        var pdocnode2 = nodearraylist1
                                        assert pdocnode2 isa nullable ADoc
-                                       var pablenode3 = nodearraylist2
-                                       assert pablenode3 isa nullable AAble
-                                       var pablenode4 = nodearraylist3
-                                       assert pablenode4 isa nullable AAble
-                                       var tkwredefnode5 = nodearraylist4
-                                       assert tkwredefnode5 isa nullable TKwredef
-                                       var pvisibilitynode6 = nodearraylist5
-                                       assert pvisibilitynode6 isa nullable AVisibility
-                                       var tkwvarnode7 = nodearraylist6
-                                       assert tkwvarnode7 isa nullable TKwvar
-                                       var tattridnode8 = nodearraylist7
-                                       assert tattridnode8 isa nullable TAttrid
-                                       var ptypenode10 = nodearraylist8
-                                       assert ptypenode10 isa nullable AType
-                                       var pexprnode12 = nodearraylist11
-                                       assert pexprnode12 isa nullable AExpr
-                                       var ppropdefnode1: nullable AAttrPropdef = new AAttrPropdef.init_aattrpropdef(
+                                       var tkwredefnode3 = nodearraylist2
+                                       assert tkwredefnode3 isa nullable TKwredef
+                                       var pvisibilitynode4 = nodearraylist3
+                                       assert pvisibilitynode4 isa nullable AVisibility
+                                       var tkwnewnode7 = nodearraylist4
+                                       assert tkwnewnode7 isa nullable TKwnew
+                                       var pmethidnode8 = nodearraylist5
+                                       assert pmethidnode8 isa nullable AMethid
+                                       var psignaturenode9 = nodearraylist6
+                                       assert psignaturenode9 isa nullable ASignature
+                                       var pannotationsnode10 = nodearraylist7
+                                       assert pannotationsnode10 isa nullable AAnnotations
+                                       var pexterncallsnode11 = nodearraylist8
+                                       assert pexterncallsnode11 isa nullable AExternCalls
+                                       var pexterncodeblocknode12 = nodearraylist9
+                                       assert pexterncodeblocknode12 isa nullable AExternCodeBlock
+                                       var ppropdefnode1: nullable AMethPropdef = new AMethPropdef.init_amethpropdef(
                                                pdocnode2,
-                                               pablenode3,
-                                               pablenode4,
-                                               tkwredefnode5,
-                                               pvisibilitynode6,
-                                               tkwvarnode7,
-                                               tattridnode8,
+                                               tkwredefnode3,
+                                               pvisibilitynode4,
                                                null,
-                                               ptypenode10,
                                                null,
-                                               pexprnode12
+                                               tkwnewnode7,
+                                               pmethidnode8,
+                                               psignaturenode9,
+                                               pannotationsnode10,
+                                               pexterncallsnode11,
+                                               pexterncodeblocknode12,
+                                               null
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
@@ -3511,41 +3549,10 @@ private class ReduceAction75
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
-                                       var nodearraylist7 = p.pop
-                                       var nodearraylist6 = p.pop
-                                       var nodearraylist5 = p.pop
-                                       var nodearraylist4 = p.pop
-                                       var nodearraylist3 = p.pop
                                        var nodearraylist2 = p.pop
                                        var nodearraylist1 = p.pop
-                                       var pdocnode2 = nodearraylist1
-                                       assert pdocnode2 isa nullable ADoc
-                                       var tkwredefnode5 = nodearraylist2
-                                       assert tkwredefnode5 isa nullable TKwredef
-                                       var pvisibilitynode6 = nodearraylist3
-                                       assert pvisibilitynode6 isa nullable AVisibility
-                                       var tkwvarnode7 = nodearraylist4
-                                       assert tkwvarnode7 isa nullable TKwvar
-                                       var tidnode9 = nodearraylist5
-                                       assert tidnode9 isa nullable TId
-                                       var ptypenode10 = nodearraylist6
-                                       assert ptypenode10 isa nullable AType
-                                       var pannotationsnode11 = nodearraylist7
-                                       assert pannotationsnode11 isa nullable AAnnotations
-                                       var ppropdefnode1: nullable AAttrPropdef = new AAttrPropdef.init_aattrpropdef(
-                                               pdocnode2,
-                                               null,
-                                               null,
-                                               tkwredefnode5,
-                                               pvisibilitynode6,
-                                               tkwvarnode7,
-                                               null,
-                                               tidnode9,
-                                               ptypenode10,
-                                               pannotationsnode11,
-                                               null
-                                       )
-                                       node_list = ppropdefnode1
+                                       var pannotationsnode1 = nodearraylist2
+                                       node_list = pannotationsnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
@@ -3554,657 +3561,16 @@ private class ReduceAction76
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
-                                       var nodearraylist8 = p.pop
-                                       var nodearraylist7 = p.pop
-                                       var nodearraylist6 = p.pop
-                                       var nodearraylist5 = p.pop
                                        var nodearraylist4 = p.pop
                                        var nodearraylist3 = p.pop
                                        var nodearraylist2 = p.pop
                                        var nodearraylist1 = p.pop
-                                       var pdocnode2 = nodearraylist1
-                                       assert pdocnode2 isa nullable ADoc
-                                       var pablenode4 = nodearraylist7
-                                       assert pablenode4 isa nullable AAble
-                                       var tkwredefnode5 = nodearraylist2
-                                       assert tkwredefnode5 isa nullable TKwredef
-                                       var pvisibilitynode6 = nodearraylist3
-                                       assert pvisibilitynode6 isa nullable AVisibility
-                                       var tkwvarnode7 = nodearraylist4
-                                       assert tkwvarnode7 isa nullable TKwvar
-                                       var tidnode9 = nodearraylist5
-                                       assert tidnode9 isa nullable TId
-                                       var ptypenode10 = nodearraylist6
-                                       assert ptypenode10 isa nullable AType
-                                       var pannotationsnode11 = nodearraylist8
-                                       assert pannotationsnode11 isa nullable AAnnotations
-                                       var ppropdefnode1: nullable AAttrPropdef = new AAttrPropdef.init_aattrpropdef(
-                                               pdocnode2,
-                                               null,
-                                               pablenode4,
-                                               tkwredefnode5,
-                                               pvisibilitynode6,
-                                               tkwvarnode7,
-                                               null,
-                                               tidnode9,
-                                               ptypenode10,
-                                               pannotationsnode11,
-                                               null
-                                       )
-                                       node_list = ppropdefnode1
+                                       var pannotationsnode1 = nodearraylist3
+                                       node_list = pannotationsnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction77
-       super ReduceAction
-       redef fun action(p: Parser)
-       do
-                                       var node_list: nullable Object = null
-                                       var nodearraylist10 = p.pop
-                                       var nodearraylist9 = p.pop
-                                       var nodearraylist8 = p.pop
-                                       var nodearraylist7 = p.pop
-                                       var nodearraylist6 = p.pop
-                                       var nodearraylist5 = p.pop
-                                       var nodearraylist4 = p.pop
-                                       var nodearraylist3 = p.pop
-                                       var nodearraylist2 = p.pop
-                                       var nodearraylist1 = p.pop
-                                       var pdocnode2 = nodearraylist1
-                                       assert pdocnode2 isa nullable ADoc
-                                       var tkwredefnode5 = nodearraylist2
-                                       assert tkwredefnode5 isa nullable TKwredef
-                                       var pvisibilitynode6 = nodearraylist3
-                                       assert pvisibilitynode6 isa nullable AVisibility
-                                       var tkwvarnode7 = nodearraylist4
-                                       assert tkwvarnode7 isa nullable TKwvar
-                                       var tidnode9 = nodearraylist5
-                                       assert tidnode9 isa nullable TId
-                                       var ptypenode10 = nodearraylist6
-                                       assert ptypenode10 isa nullable AType
-                                       var pannotationsnode11 = nodearraylist10
-                                       assert pannotationsnode11 isa nullable AAnnotations
-                                       var pexprnode12 = nodearraylist9
-                                       assert pexprnode12 isa nullable AExpr
-                                       var ppropdefnode1: nullable AAttrPropdef = new AAttrPropdef.init_aattrpropdef(
-                                               pdocnode2,
-                                               null,
-                                               null,
-                                               tkwredefnode5,
-                                               pvisibilitynode6,
-                                               tkwvarnode7,
-                                               null,
-                                               tidnode9,
-                                               ptypenode10,
-                                               pannotationsnode11,
-                                               pexprnode12
-                                       )
-                                       node_list = ppropdefnode1
-                                       p.push(p.go_to(_goto), node_list)
-       end
-end
-private class ReduceAction78
-       super ReduceAction
-       redef fun action(p: Parser)
-       do
-                                       var node_list: nullable Object = null
-                                       var nodearraylist11 = p.pop
-                                       var nodearraylist10 = p.pop
-                                       var nodearraylist9 = p.pop
-                                       var nodearraylist8 = p.pop
-                                       var nodearraylist7 = p.pop
-                                       var nodearraylist6 = p.pop
-                                       var nodearraylist5 = p.pop
-                                       var nodearraylist4 = p.pop
-                                       var nodearraylist3 = p.pop
-                                       var nodearraylist2 = p.pop
-                                       var nodearraylist1 = p.pop
-                                       var pdocnode2 = nodearraylist1
-                                       assert pdocnode2 isa nullable ADoc
-                                       var pablenode4 = nodearraylist7
-                                       assert pablenode4 isa nullable AAble
-                                       var tkwredefnode5 = nodearraylist2
-                                       assert tkwredefnode5 isa nullable TKwredef
-                                       var pvisibilitynode6 = nodearraylist3
-                                       assert pvisibilitynode6 isa nullable AVisibility
-                                       var tkwvarnode7 = nodearraylist4
-                                       assert tkwvarnode7 isa nullable TKwvar
-                                       var tidnode9 = nodearraylist5
-                                       assert tidnode9 isa nullable TId
-                                       var ptypenode10 = nodearraylist6
-                                       assert ptypenode10 isa nullable AType
-                                       var pannotationsnode11 = nodearraylist11
-                                       assert pannotationsnode11 isa nullable AAnnotations
-                                       var pexprnode12 = nodearraylist10
-                                       assert pexprnode12 isa nullable AExpr
-                                       var ppropdefnode1: nullable AAttrPropdef = new AAttrPropdef.init_aattrpropdef(
-                                               pdocnode2,
-                                               null,
-                                               pablenode4,
-                                               tkwredefnode5,
-                                               pvisibilitynode6,
-                                               tkwvarnode7,
-                                               null,
-                                               tidnode9,
-                                               ptypenode10,
-                                               pannotationsnode11,
-                                               pexprnode12
-                                       )
-                                       node_list = ppropdefnode1
-                                       p.push(p.go_to(_goto), node_list)
-       end
-end
-private class ReduceAction79
-       super ReduceAction
-       redef fun action(p: Parser)
-       do
-                                       var node_list: nullable Object = null
-                                       var nodearraylist8 = p.pop
-                                       var nodearraylist7 = p.pop
-                                       var nodearraylist6 = p.pop
-                                       var nodearraylist5 = p.pop
-                                       var nodearraylist4 = p.pop
-                                       var nodearraylist3 = p.pop
-                                       var nodearraylist2 = p.pop
-                                       var nodearraylist1 = p.pop
-                                       var pdocnode2 = nodearraylist1
-                                       assert pdocnode2 isa nullable ADoc
-                                       var tkwredefnode3 = nodearraylist2
-                                       assert tkwredefnode3 isa nullable TKwredef
-                                       var pvisibilitynode4 = nodearraylist3
-                                       assert pvisibilitynode4 isa nullable AVisibility
-                                       var tkwinitnode5 = nodearraylist4
-                                       assert tkwinitnode5 isa nullable TKwinit
-                                       var psignaturenode7 = nodearraylist5
-                                       assert psignaturenode7 isa nullable ASignature
-                                       var pexprnode9 = nodearraylist7
-                                       assert pexprnode9 isa nullable AExpr
-                                       var ppropdefnode1: nullable AConcreteInitPropdef = new AConcreteInitPropdef.init_aconcreteinitpropdef(
-                                               pdocnode2,
-                                               tkwredefnode3,
-                                               pvisibilitynode4,
-                                               tkwinitnode5,
-                                               null,
-                                               psignaturenode7,
-                                               null,
-                                               pexprnode9
-                                       )
-                                       node_list = ppropdefnode1
-                                       p.push(p.go_to(_goto), node_list)
-       end
-end
-private class ReduceAction80
-       super ReduceAction
-       redef fun action(p: Parser)
-       do
-                                       var node_list: nullable Object = null
-                                       var nodearraylist9 = p.pop
-                                       var nodearraylist8 = p.pop
-                                       var nodearraylist7 = p.pop
-                                       var nodearraylist6 = p.pop
-                                       var nodearraylist5 = p.pop
-                                       var nodearraylist4 = p.pop
-                                       var nodearraylist3 = p.pop
-                                       var nodearraylist2 = p.pop
-                                       var nodearraylist1 = p.pop
-                                       var pdocnode2 = nodearraylist1
-                                       assert pdocnode2 isa nullable ADoc
-                                       var tkwredefnode3 = nodearraylist2
-                                       assert tkwredefnode3 isa nullable TKwredef
-                                       var pvisibilitynode4 = nodearraylist3
-                                       assert pvisibilitynode4 isa nullable AVisibility
-                                       var tkwinitnode5 = nodearraylist4
-                                       assert tkwinitnode5 isa nullable TKwinit
-                                       var pmethidnode6 = nodearraylist5
-                                       assert pmethidnode6 isa nullable AMethid
-                                       var psignaturenode7 = nodearraylist6
-                                       assert psignaturenode7 isa nullable ASignature
-                                       var pexprnode9 = nodearraylist8
-                                       assert pexprnode9 isa nullable AExpr
-                                       var ppropdefnode1: nullable AConcreteInitPropdef = new AConcreteInitPropdef.init_aconcreteinitpropdef(
-                                               pdocnode2,
-                                               tkwredefnode3,
-                                               pvisibilitynode4,
-                                               tkwinitnode5,
-                                               pmethidnode6,
-                                               psignaturenode7,
-                                               null,
-                                               pexprnode9
-                                       )
-                                       node_list = ppropdefnode1
-                                       p.push(p.go_to(_goto), node_list)
-       end
-end
-private class ReduceAction81
-       super ReduceAction
-       redef fun action(p: Parser)
-       do
-                                       var node_list: nullable Object = null
-                                       var nodearraylist9 = p.pop
-                                       var nodearraylist8 = p.pop
-                                       var nodearraylist7 = p.pop
-                                       var nodearraylist6 = p.pop
-                                       var nodearraylist5 = p.pop
-                                       var nodearraylist4 = p.pop
-                                       var nodearraylist3 = p.pop
-                                       var nodearraylist2 = p.pop
-                                       var nodearraylist1 = p.pop
-                                       var pdocnode2 = nodearraylist1
-                                       assert pdocnode2 isa nullable ADoc
-                                       var tkwredefnode3 = nodearraylist2
-                                       assert tkwredefnode3 isa nullable TKwredef
-                                       var pvisibilitynode4 = nodearraylist3
-                                       assert pvisibilitynode4 isa nullable AVisibility
-                                       var tkwinitnode5 = nodearraylist4
-                                       assert tkwinitnode5 isa nullable TKwinit
-                                       var psignaturenode7 = nodearraylist5
-                                       assert psignaturenode7 isa nullable ASignature
-                                       var pannotationsnode8 = nodearraylist6
-                                       assert pannotationsnode8 isa nullable AAnnotations
-                                       var pexprnode9 = nodearraylist8
-                                       assert pexprnode9 isa nullable AExpr
-                                       var ppropdefnode1: nullable AConcreteInitPropdef = new AConcreteInitPropdef.init_aconcreteinitpropdef(
-                                               pdocnode2,
-                                               tkwredefnode3,
-                                               pvisibilitynode4,
-                                               tkwinitnode5,
-                                               null,
-                                               psignaturenode7,
-                                               pannotationsnode8,
-                                               pexprnode9
-                                       )
-                                       node_list = ppropdefnode1
-                                       p.push(p.go_to(_goto), node_list)
-       end
-end
-private class ReduceAction82
-       super ReduceAction
-       redef fun action(p: Parser)
-       do
-                                       var node_list: nullable Object = null
-                                       var nodearraylist10 = p.pop
-                                       var nodearraylist9 = p.pop
-                                       var nodearraylist8 = p.pop
-                                       var nodearraylist7 = p.pop
-                                       var nodearraylist6 = p.pop
-                                       var nodearraylist5 = p.pop
-                                       var nodearraylist4 = p.pop
-                                       var nodearraylist3 = p.pop
-                                       var nodearraylist2 = p.pop
-                                       var nodearraylist1 = p.pop
-                                       var pdocnode2 = nodearraylist1
-                                       assert pdocnode2 isa nullable ADoc
-                                       var tkwredefnode3 = nodearraylist2
-                                       assert tkwredefnode3 isa nullable TKwredef
-                                       var pvisibilitynode4 = nodearraylist3
-                                       assert pvisibilitynode4 isa nullable AVisibility
-                                       var tkwinitnode5 = nodearraylist4
-                                       assert tkwinitnode5 isa nullable TKwinit
-                                       var pmethidnode6 = nodearraylist5
-                                       assert pmethidnode6 isa nullable AMethid
-                                       var psignaturenode7 = nodearraylist6
-                                       assert psignaturenode7 isa nullable ASignature
-                                       var pannotationsnode8 = nodearraylist7
-                                       assert pannotationsnode8 isa nullable AAnnotations
-                                       var pexprnode9 = nodearraylist9
-                                       assert pexprnode9 isa nullable AExpr
-                                       var ppropdefnode1: nullable AConcreteInitPropdef = new AConcreteInitPropdef.init_aconcreteinitpropdef(
-                                               pdocnode2,
-                                               tkwredefnode3,
-                                               pvisibilitynode4,
-                                               tkwinitnode5,
-                                               pmethidnode6,
-                                               psignaturenode7,
-                                               pannotationsnode8,
-                                               pexprnode9
-                                       )
-                                       node_list = ppropdefnode1
-                                       p.push(p.go_to(_goto), node_list)
-       end
-end
-private class ReduceAction83
-       super ReduceAction
-       redef fun action(p: Parser)
-       do
-                                       var node_list: nullable Object = null
-                                       var nodearraylist7 = p.pop
-                                       var nodearraylist6 = p.pop
-                                       var nodearraylist5 = p.pop
-                                       var nodearraylist4 = p.pop
-                                       var nodearraylist3 = p.pop
-                                       var nodearraylist2 = p.pop
-                                       var nodearraylist1 = p.pop
-                                       var pdocnode2 = nodearraylist1
-                                       assert pdocnode2 isa nullable ADoc
-                                       var tkwredefnode3 = nodearraylist2
-                                       assert tkwredefnode3 isa nullable TKwredef
-                                       var pvisibilitynode4 = nodearraylist3
-                                       assert pvisibilitynode4 isa nullable AVisibility
-                                       var tkwtypenode5 = nodearraylist4
-                                       assert tkwtypenode5 isa nullable TKwtype
-                                       var tclassidnode6 = nodearraylist5
-                                       assert tclassidnode6 isa nullable TClassid
-                                       var ptypenode7 = nodearraylist6
-                                       assert ptypenode7 isa nullable AType
-                                       var pannotationsnode8 = nodearraylist7
-                                       assert pannotationsnode8 isa nullable AAnnotations
-                                       var ppropdefnode1: nullable ATypePropdef = new ATypePropdef.init_atypepropdef(
-                                               pdocnode2,
-                                               tkwredefnode3,
-                                               pvisibilitynode4,
-                                               tkwtypenode5,
-                                               tclassidnode6,
-                                               ptypenode7,
-                                               pannotationsnode8
-                                       )
-                                       node_list = ppropdefnode1
-                                       p.push(p.go_to(_goto), node_list)
-       end
-end
-private class ReduceAction84
-       super ReduceAction
-       redef fun action(p: Parser)
-       do
-                                       var node_list: nullable Object = null
-                                       var nodearraylist10 = p.pop
-                                       var nodearraylist9 = p.pop
-                                       var nodearraylist8 = p.pop
-                                       var nodearraylist7 = p.pop
-                                       var nodearraylist6 = p.pop
-                                       var nodearraylist5 = p.pop
-                                       var nodearraylist4 = p.pop
-                                       var nodearraylist3 = p.pop
-                                       var nodearraylist2 = p.pop
-                                       var nodearraylist1 = p.pop
-                                       var pdocnode2 = nodearraylist1
-                                       assert pdocnode2 isa nullable ADoc
-                                       var tkwredefnode3 = nodearraylist2
-                                       assert tkwredefnode3 isa nullable TKwredef
-                                       var pvisibilitynode4 = nodearraylist3
-                                       assert pvisibilitynode4 isa nullable AVisibility
-                                       var tkwnewnode5 = nodearraylist4
-                                       assert tkwnewnode5 isa nullable TKwnew
-                                       var psignaturenode7 = nodearraylist5
-                                       assert psignaturenode7 isa nullable ASignature
-                                       var tstringnode9 = nodearraylist8
-                                       assert tstringnode9 isa nullable TString
-                                       var pexterncallsnode10 = nodearraylist9
-                                       assert pexterncallsnode10 isa nullable AExternCalls
-                                       var pexterncodeblocknode11 = nodearraylist10
-                                       assert pexterncodeblocknode11 isa nullable AExternCodeBlock
-                                       var ppropdefnode1: nullable AExternInitPropdef = new AExternInitPropdef.init_aexterninitpropdef(
-                                               pdocnode2,
-                                               tkwredefnode3,
-                                               pvisibilitynode4,
-                                               tkwnewnode5,
-                                               null,
-                                               psignaturenode7,
-                                               null,
-                                               tstringnode9,
-                                               pexterncallsnode10,
-                                               pexterncodeblocknode11
-                                       )
-                                       node_list = ppropdefnode1
-                                       p.push(p.go_to(_goto), node_list)
-       end
-end
-private class ReduceAction85
-       super ReduceAction
-       redef fun action(p: Parser)
-       do
-                                       var node_list: nullable Object = null
-                                       var nodearraylist11 = p.pop
-                                       var nodearraylist10 = p.pop
-                                       var nodearraylist9 = p.pop
-                                       var nodearraylist8 = p.pop
-                                       var nodearraylist7 = p.pop
-                                       var nodearraylist6 = p.pop
-                                       var nodearraylist5 = p.pop
-                                       var nodearraylist4 = p.pop
-                                       var nodearraylist3 = p.pop
-                                       var nodearraylist2 = p.pop
-                                       var nodearraylist1 = p.pop
-                                       var pdocnode2 = nodearraylist1
-                                       assert pdocnode2 isa nullable ADoc
-                                       var tkwredefnode3 = nodearraylist2
-                                       assert tkwredefnode3 isa nullable TKwredef
-                                       var pvisibilitynode4 = nodearraylist3
-                                       assert pvisibilitynode4 isa nullable AVisibility
-                                       var tkwnewnode5 = nodearraylist4
-                                       assert tkwnewnode5 isa nullable TKwnew
-                                       var pmethidnode6 = nodearraylist5
-                                       assert pmethidnode6 isa nullable AMethid
-                                       var psignaturenode7 = nodearraylist6
-                                       assert psignaturenode7 isa nullable ASignature
-                                       var tstringnode9 = nodearraylist9
-                                       assert tstringnode9 isa nullable TString
-                                       var pexterncallsnode10 = nodearraylist10
-                                       assert pexterncallsnode10 isa nullable AExternCalls
-                                       var pexterncodeblocknode11 = nodearraylist11
-                                       assert pexterncodeblocknode11 isa nullable AExternCodeBlock
-                                       var ppropdefnode1: nullable AExternInitPropdef = new AExternInitPropdef.init_aexterninitpropdef(
-                                               pdocnode2,
-                                               tkwredefnode3,
-                                               pvisibilitynode4,
-                                               tkwnewnode5,
-                                               pmethidnode6,
-                                               psignaturenode7,
-                                               null,
-                                               tstringnode9,
-                                               pexterncallsnode10,
-                                               pexterncodeblocknode11
-                                       )
-                                       node_list = ppropdefnode1
-                                       p.push(p.go_to(_goto), node_list)
-       end
-end
-private class ReduceAction86
-       super ReduceAction
-       redef fun action(p: Parser)
-       do
-                                       var node_list: nullable Object = null
-                                       var nodearraylist7 = p.pop
-                                       var nodearraylist6 = p.pop
-                                       var nodearraylist5 = p.pop
-                                       var nodearraylist4 = p.pop
-                                       var nodearraylist3 = p.pop
-                                       var nodearraylist2 = p.pop
-                                       var nodearraylist1 = p.pop
-                                       var pdocnode2 = nodearraylist1
-                                       assert pdocnode2 isa nullable ADoc
-                                       var tkwredefnode3 = nodearraylist2
-                                       assert tkwredefnode3 isa nullable TKwredef
-                                       var pvisibilitynode4 = nodearraylist3
-                                       assert pvisibilitynode4 isa nullable AVisibility
-                                       var tkwnewnode5 = nodearraylist4
-                                       assert tkwnewnode5 isa nullable TKwnew
-                                       var psignaturenode7 = nodearraylist5
-                                       assert psignaturenode7 isa nullable ASignature
-                                       var pexterncallsnode10 = nodearraylist6
-                                       assert pexterncallsnode10 isa nullable AExternCalls
-                                       var pexterncodeblocknode11 = nodearraylist7
-                                       assert pexterncodeblocknode11 isa nullable AExternCodeBlock
-                                       var ppropdefnode1: nullable AExternInitPropdef = new AExternInitPropdef.init_aexterninitpropdef(
-                                               pdocnode2,
-                                               tkwredefnode3,
-                                               pvisibilitynode4,
-                                               tkwnewnode5,
-                                               null,
-                                               psignaturenode7,
-                                               null,
-                                               null,
-                                               pexterncallsnode10,
-                                               pexterncodeblocknode11
-                                       )
-                                       node_list = ppropdefnode1
-                                       p.push(p.go_to(_goto), node_list)
-       end
-end
-private class ReduceAction87
-       super ReduceAction
-       redef fun action(p: Parser)
-       do
-                                       var node_list: nullable Object = null
-                                       var nodearraylist8 = p.pop
-                                       var nodearraylist7 = p.pop
-                                       var nodearraylist6 = p.pop
-                                       var nodearraylist5 = p.pop
-                                       var nodearraylist4 = p.pop
-                                       var nodearraylist3 = p.pop
-                                       var nodearraylist2 = p.pop
-                                       var nodearraylist1 = p.pop
-                                       var pdocnode2 = nodearraylist1
-                                       assert pdocnode2 isa nullable ADoc
-                                       var tkwredefnode3 = nodearraylist2
-                                       assert tkwredefnode3 isa nullable TKwredef
-                                       var pvisibilitynode4 = nodearraylist3
-                                       assert pvisibilitynode4 isa nullable AVisibility
-                                       var tkwnewnode5 = nodearraylist4
-                                       assert tkwnewnode5 isa nullable TKwnew
-                                       var pmethidnode6 = nodearraylist5
-                                       assert pmethidnode6 isa nullable AMethid
-                                       var psignaturenode7 = nodearraylist6
-                                       assert psignaturenode7 isa nullable ASignature
-                                       var pexterncallsnode10 = nodearraylist7
-                                       assert pexterncallsnode10 isa nullable AExternCalls
-                                       var pexterncodeblocknode11 = nodearraylist8
-                                       assert pexterncodeblocknode11 isa nullable AExternCodeBlock
-                                       var ppropdefnode1: nullable AExternInitPropdef = new AExternInitPropdef.init_aexterninitpropdef(
-                                               pdocnode2,
-                                               tkwredefnode3,
-                                               pvisibilitynode4,
-                                               tkwnewnode5,
-                                               pmethidnode6,
-                                               psignaturenode7,
-                                               null,
-                                               null,
-                                               pexterncallsnode10,
-                                               pexterncodeblocknode11
-                                       )
-                                       node_list = ppropdefnode1
-                                       p.push(p.go_to(_goto), node_list)
-       end
-end
-private class ReduceAction88
-       super ReduceAction
-       redef fun action(p: Parser)
-       do
-                                       var node_list: nullable Object = null
-                                       var nodearraylist8 = p.pop
-                                       var nodearraylist7 = p.pop
-                                       var nodearraylist6 = p.pop
-                                       var nodearraylist5 = p.pop
-                                       var nodearraylist4 = p.pop
-                                       var nodearraylist3 = p.pop
-                                       var nodearraylist2 = p.pop
-                                       var nodearraylist1 = p.pop
-                                       var pdocnode2 = nodearraylist1
-                                       assert pdocnode2 isa nullable ADoc
-                                       var tkwredefnode3 = nodearraylist2
-                                       assert tkwredefnode3 isa nullable TKwredef
-                                       var pvisibilitynode4 = nodearraylist3
-                                       assert pvisibilitynode4 isa nullable AVisibility
-                                       var tkwnewnode5 = nodearraylist4
-                                       assert tkwnewnode5 isa nullable TKwnew
-                                       var psignaturenode7 = nodearraylist5
-                                       assert psignaturenode7 isa nullable ASignature
-                                       var pannotationsnode8 = nodearraylist6
-                                       assert pannotationsnode8 isa nullable AAnnotations
-                                       var pexterncallsnode10 = nodearraylist7
-                                       assert pexterncallsnode10 isa nullable AExternCalls
-                                       var pexterncodeblocknode11 = nodearraylist8
-                                       assert pexterncodeblocknode11 isa nullable AExternCodeBlock
-                                       var ppropdefnode1: nullable AExternInitPropdef = new AExternInitPropdef.init_aexterninitpropdef(
-                                               pdocnode2,
-                                               tkwredefnode3,
-                                               pvisibilitynode4,
-                                               tkwnewnode5,
-                                               null,
-                                               psignaturenode7,
-                                               pannotationsnode8,
-                                               null,
-                                               pexterncallsnode10,
-                                               pexterncodeblocknode11
-                                       )
-                                       node_list = ppropdefnode1
-                                       p.push(p.go_to(_goto), node_list)
-       end
-end
-private class ReduceAction89
-       super ReduceAction
-       redef fun action(p: Parser)
-       do
-                                       var node_list: nullable Object = null
-                                       var nodearraylist9 = p.pop
-                                       var nodearraylist8 = p.pop
-                                       var nodearraylist7 = p.pop
-                                       var nodearraylist6 = p.pop
-                                       var nodearraylist5 = p.pop
-                                       var nodearraylist4 = p.pop
-                                       var nodearraylist3 = p.pop
-                                       var nodearraylist2 = p.pop
-                                       var nodearraylist1 = p.pop
-                                       var pdocnode2 = nodearraylist1
-                                       assert pdocnode2 isa nullable ADoc
-                                       var tkwredefnode3 = nodearraylist2
-                                       assert tkwredefnode3 isa nullable TKwredef
-                                       var pvisibilitynode4 = nodearraylist3
-                                       assert pvisibilitynode4 isa nullable AVisibility
-                                       var tkwnewnode5 = nodearraylist4
-                                       assert tkwnewnode5 isa nullable TKwnew
-                                       var pmethidnode6 = nodearraylist5
-                                       assert pmethidnode6 isa nullable AMethid
-                                       var psignaturenode7 = nodearraylist6
-                                       assert psignaturenode7 isa nullable ASignature
-                                       var pannotationsnode8 = nodearraylist7
-                                       assert pannotationsnode8 isa nullable AAnnotations
-                                       var pexterncallsnode10 = nodearraylist8
-                                       assert pexterncallsnode10 isa nullable AExternCalls
-                                       var pexterncodeblocknode11 = nodearraylist9
-                                       assert pexterncodeblocknode11 isa nullable AExternCodeBlock
-                                       var ppropdefnode1: nullable AExternInitPropdef = new AExternInitPropdef.init_aexterninitpropdef(
-                                               pdocnode2,
-                                               tkwredefnode3,
-                                               pvisibilitynode4,
-                                               tkwnewnode5,
-                                               pmethidnode6,
-                                               psignaturenode7,
-                                               pannotationsnode8,
-                                               null,
-                                               pexterncallsnode10,
-                                               pexterncodeblocknode11
-                                       )
-                                       node_list = ppropdefnode1
-                                       p.push(p.go_to(_goto), node_list)
-       end
-end
-private class ReduceAction90
-       super ReduceAction
-       redef fun action(p: Parser)
-       do
-                                       var node_list: nullable Object = null
-                                       var nodearraylist2 = p.pop
-                                       var nodearraylist1 = p.pop
-                                       var pannotationsnode1 = nodearraylist2
-                                       node_list = pannotationsnode1
-                                       p.push(p.go_to(_goto), node_list)
-       end
-end
-private class ReduceAction91
-       super ReduceAction
-       redef fun action(p: Parser)
-       do
-                                       var node_list: nullable Object = null
-                                       var nodearraylist4 = p.pop
-                                       var nodearraylist3 = p.pop
-                                       var nodearraylist2 = p.pop
-                                       var nodearraylist1 = p.pop
-                                       var pannotationsnode1 = nodearraylist3
-                                       node_list = pannotationsnode1
-                                       p.push(p.go_to(_goto), node_list)
-       end
-end
-private class ReduceAction94
+private class ReduceAction79
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4217,50 +3583,7 @@ private class ReduceAction94
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction95
-       super ReduceAction
-       redef fun action(p: Parser)
-       do
-                                       var node_list: nullable Object = null
-                                       var nodearraylist3 = p.pop
-                                       var nodearraylist2 = p.pop
-                                       var nodearraylist1 = p.pop
-                                       var tkwredefnode2 = nodearraylist1
-                                       assert tkwredefnode2 isa nullable TKwredef
-                                       var tkwreadablenode3 = nodearraylist3
-                                       assert tkwreadablenode3 isa nullable TKwreadable
-                                       var pablenode1: nullable AReadAble = new AReadAble.init_areadable(
-                                               tkwredefnode2,
-                                               tkwreadablenode3
-                                       )
-                                       node_list = pablenode1
-                                       p.push(p.go_to(_goto), node_list)
-       end
-end
-private class ReduceAction96
-       super ReduceAction
-       redef fun action(p: Parser)
-       do
-                                       var node_list: nullable Object = null
-                                       var nodearraylist3 = p.pop
-                                       var nodearraylist2 = p.pop
-                                       var nodearraylist1 = p.pop
-                                       var tkwredefnode2 = nodearraylist1
-                                       assert tkwredefnode2 isa nullable TKwredef
-                                       var pvisibilitynode3 = nodearraylist2
-                                       assert pvisibilitynode3 isa nullable AVisibility
-                                       var tkwwritablenode4 = nodearraylist3
-                                       assert tkwwritablenode4 isa nullable TKwwritable
-                                       var pablenode1: nullable AWriteAble = new AWriteAble.init_awriteable(
-                                               tkwredefnode2,
-                                               pvisibilitynode3,
-                                               tkwwritablenode4
-                                       )
-                                       node_list = pablenode1
-                                       p.push(p.go_to(_goto), node_list)
-       end
-end
-private class ReduceAction97
+private class ReduceAction80
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4272,7 +3595,7 @@ private class ReduceAction97
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction98
+private class ReduceAction81
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4288,7 +3611,7 @@ private class ReduceAction98
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction99
+private class ReduceAction82
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4304,7 +3627,7 @@ private class ReduceAction99
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction100
+private class ReduceAction83
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4320,7 +3643,7 @@ private class ReduceAction100
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction101
+private class ReduceAction84
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4336,7 +3659,7 @@ private class ReduceAction101
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction102
+private class ReduceAction85
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4351,7 +3674,7 @@ private class ReduceAction102
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction103
+private class ReduceAction86
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4366,7 +3689,7 @@ private class ReduceAction103
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction104
+private class ReduceAction87
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4381,7 +3704,7 @@ private class ReduceAction104
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction105
+private class ReduceAction88
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4396,7 +3719,22 @@ private class ReduceAction105
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction106
+private class ReduceAction89
+       super ReduceAction
+       redef fun action(p: Parser)
+       do
+                                       var node_list: nullable Object = null
+                                       var nodearraylist1 = p.pop
+                                       var tstarstarnode2 = nodearraylist1
+                                       assert tstarstarnode2 isa nullable TStarstar
+                                       var pmethidnode1: nullable AStarstarMethid = new AStarstarMethid.init_astarstarmethid(
+                                               tstarstarnode2
+                                       )
+                                       node_list = pmethidnode1
+                                       p.push(p.go_to(_goto), node_list)
+       end
+end
+private class ReduceAction90
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4411,7 +3749,7 @@ private class ReduceAction106
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction107
+private class ReduceAction91
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4426,7 +3764,7 @@ private class ReduceAction107
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction108
+private class ReduceAction92
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4441,7 +3779,7 @@ private class ReduceAction108
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction109
+private class ReduceAction93
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4456,7 +3794,7 @@ private class ReduceAction109
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction110
+private class ReduceAction94
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4471,7 +3809,7 @@ private class ReduceAction110
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction111
+private class ReduceAction95
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4486,7 +3824,7 @@ private class ReduceAction111
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction112
+private class ReduceAction96
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4501,7 +3839,7 @@ private class ReduceAction112
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction113
+private class ReduceAction97
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4516,7 +3854,7 @@ private class ReduceAction113
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction114
+private class ReduceAction98
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4531,7 +3869,7 @@ private class ReduceAction114
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction115
+private class ReduceAction99
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4546,7 +3884,7 @@ private class ReduceAction115
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction116
+private class ReduceAction100
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4565,7 +3903,7 @@ private class ReduceAction116
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction117
+private class ReduceAction101
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4580,7 +3918,7 @@ private class ReduceAction117
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction118
+private class ReduceAction102
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4599,7 +3937,7 @@ private class ReduceAction118
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction119
+private class ReduceAction103
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4622,7 +3960,7 @@ private class ReduceAction119
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction120
+private class ReduceAction104
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4653,7 +3991,7 @@ private class ReduceAction120
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction121
+private class ReduceAction105
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4681,7 +4019,7 @@ private class ReduceAction121
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction122
+private class ReduceAction106
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4701,7 +4039,7 @@ private class ReduceAction122
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction123
+private class ReduceAction107
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4718,7 +4056,7 @@ private class ReduceAction123
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction124
+private class ReduceAction108
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4734,7 +4072,7 @@ private class ReduceAction124
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction125
+private class ReduceAction109
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4754,7 +4092,7 @@ private class ReduceAction125
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction127
+private class ReduceAction111
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4767,7 +4105,7 @@ private class ReduceAction127
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction128
+private class ReduceAction112
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4788,7 +4126,7 @@ private class ReduceAction128
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction129
+private class ReduceAction113
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4809,7 +4147,7 @@ private class ReduceAction129
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction130
+private class ReduceAction114
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4833,7 +4171,7 @@ private class ReduceAction130
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction131
+private class ReduceAction115
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4857,7 +4195,7 @@ private class ReduceAction131
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction132
+private class ReduceAction116
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4884,7 +4222,7 @@ private class ReduceAction132
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction133
+private class ReduceAction117
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4908,7 +4246,7 @@ private class ReduceAction133
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction134
+private class ReduceAction118
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4936,7 +4274,7 @@ private class ReduceAction134
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction136
+private class ReduceAction120
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4949,7 +4287,7 @@ private class ReduceAction136
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction137
+private class ReduceAction121
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4960,7 +4298,7 @@ private class ReduceAction137
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction139
+private class ReduceAction123
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4975,7 +4313,7 @@ private class ReduceAction139
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction140
+private class ReduceAction124
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4990,7 +4328,7 @@ private class ReduceAction140
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction141
+private class ReduceAction125
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5013,7 +4351,7 @@ private class ReduceAction141
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction142
+private class ReduceAction126
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5028,7 +4366,7 @@ private class ReduceAction142
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction143
+private class ReduceAction127
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5060,7 +4398,7 @@ private class ReduceAction143
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction144
+private class ReduceAction128
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5088,7 +4426,7 @@ private class ReduceAction144
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction145
+private class ReduceAction129
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5117,7 +4455,7 @@ private class ReduceAction145
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction146
+private class ReduceAction130
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5142,7 +4480,7 @@ private class ReduceAction146
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction147
+private class ReduceAction131
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5176,7 +4514,7 @@ private class ReduceAction147
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction148
+private class ReduceAction132
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5206,7 +4544,7 @@ private class ReduceAction148
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction150
+private class ReduceAction134
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5217,7 +4555,7 @@ private class ReduceAction150
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction151
+private class ReduceAction135
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5238,7 +4576,7 @@ private class ReduceAction151
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction152
+private class ReduceAction136
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5254,7 +4592,7 @@ private class ReduceAction152
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction153
+private class ReduceAction137
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5273,7 +4611,7 @@ private class ReduceAction153
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction154
+private class ReduceAction138
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5284,7 +4622,7 @@ private class ReduceAction154
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction156
+private class ReduceAction140
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5296,7 +4634,7 @@ private class ReduceAction156
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction157
+private class ReduceAction141
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5318,7 +4656,7 @@ private class ReduceAction157
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction158
+private class ReduceAction142
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5343,7 +4681,7 @@ private class ReduceAction158
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction159
+private class ReduceAction143
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5373,7 +4711,7 @@ private class ReduceAction159
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction160
+private class ReduceAction144
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5406,7 +4744,7 @@ private class ReduceAction160
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction161
+private class ReduceAction145
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5421,7 +4759,7 @@ private class ReduceAction161
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction162
+private class ReduceAction146
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5440,7 +4778,7 @@ private class ReduceAction162
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction163
+private class ReduceAction147
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5453,7 +4791,7 @@ private class ReduceAction163
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction167
+private class ReduceAction151
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5465,7 +4803,7 @@ private class ReduceAction167
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction168
+private class ReduceAction152
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5483,7 +4821,7 @@ private class ReduceAction168
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction169
+private class ReduceAction153
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5500,7 +4838,7 @@ private class ReduceAction169
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction170
+private class ReduceAction154
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5511,7 +4849,7 @@ private class ReduceAction170
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction171
+private class ReduceAction155
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5531,7 +4869,7 @@ private class ReduceAction171
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction172
+private class ReduceAction156
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5555,7 +4893,7 @@ private class ReduceAction172
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction173
+private class ReduceAction157
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5576,7 +4914,7 @@ private class ReduceAction173
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction174
+private class ReduceAction158
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5601,7 +4939,7 @@ private class ReduceAction174
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction175
+private class ReduceAction159
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5625,7 +4963,7 @@ private class ReduceAction175
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction176
+private class ReduceAction160
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5653,7 +4991,7 @@ private class ReduceAction176
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction180
+private class ReduceAction164
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5669,7 +5007,7 @@ private class ReduceAction180
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction181
+private class ReduceAction165
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5688,7 +5026,7 @@ private class ReduceAction181
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction182
+private class ReduceAction166
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5704,7 +5042,7 @@ private class ReduceAction182
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction183
+private class ReduceAction167
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5723,7 +5061,7 @@ private class ReduceAction183
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction184
+private class ReduceAction168
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5738,7 +5076,7 @@ private class ReduceAction184
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction185
+private class ReduceAction169
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5754,7 +5092,7 @@ private class ReduceAction185
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction186
+private class ReduceAction170
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5773,7 +5111,7 @@ private class ReduceAction186
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction193
+private class ReduceAction177
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5798,7 +5136,7 @@ private class ReduceAction193
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction194
+private class ReduceAction178
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5819,7 +5157,7 @@ private class ReduceAction194
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction195
+private class ReduceAction179
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5842,7 +5180,7 @@ private class ReduceAction195
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction196
+private class ReduceAction180
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5867,7 +5205,7 @@ private class ReduceAction196
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction197
+private class ReduceAction181
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5888,7 +5226,7 @@ private class ReduceAction197
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction198
+private class ReduceAction182
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5914,7 +5252,7 @@ private class ReduceAction198
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction199
+private class ReduceAction183
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5941,7 +5279,7 @@ private class ReduceAction199
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction201
+private class ReduceAction185
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5963,7 +5301,7 @@ private class ReduceAction201
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction202
+private class ReduceAction186
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5986,7 +5324,7 @@ private class ReduceAction202
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction204
+private class ReduceAction188
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6014,7 +5352,7 @@ private class ReduceAction204
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction205
+private class ReduceAction189
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6030,7 +5368,7 @@ private class ReduceAction205
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction206
+private class ReduceAction190
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6049,7 +5387,7 @@ private class ReduceAction206
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction207
+private class ReduceAction191
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6075,7 +5413,7 @@ private class ReduceAction207
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction208
+private class ReduceAction192
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6104,7 +5442,7 @@ private class ReduceAction208
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction209
+private class ReduceAction193
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6137,7 +5475,7 @@ private class ReduceAction209
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction210
+private class ReduceAction194
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6173,7 +5511,7 @@ private class ReduceAction210
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction211
+private class ReduceAction195
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6203,7 +5541,7 @@ private class ReduceAction211
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction212
+private class ReduceAction196
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6229,7 +5567,7 @@ private class ReduceAction212
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction213
+private class ReduceAction197
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6262,7 +5600,7 @@ private class ReduceAction213
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction214
+private class ReduceAction198
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6291,7 +5629,7 @@ private class ReduceAction214
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction215
+private class ReduceAction199
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6318,7 +5656,7 @@ private class ReduceAction215
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction216
+private class ReduceAction200
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6348,7 +5686,7 @@ private class ReduceAction216
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction217
+private class ReduceAction201
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6374,7 +5712,7 @@ private class ReduceAction217
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction218
+private class ReduceAction202
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6407,7 +5745,7 @@ private class ReduceAction218
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction219
+private class ReduceAction203
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6436,7 +5774,7 @@ private class ReduceAction219
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction220
+private class ReduceAction204
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6463,7 +5801,7 @@ private class ReduceAction220
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction221
+private class ReduceAction205
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6478,7 +5816,7 @@ private class ReduceAction221
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction222
+private class ReduceAction206
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6493,7 +5831,7 @@ private class ReduceAction222
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction223
+private class ReduceAction207
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6516,7 +5854,7 @@ private class ReduceAction223
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction224
+private class ReduceAction208
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6536,7 +5874,7 @@ private class ReduceAction224
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction225
+private class ReduceAction209
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6567,7 +5905,7 @@ private class ReduceAction225
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction226
+private class ReduceAction210
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6594,7 +5932,7 @@ private class ReduceAction226
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction227
+private class ReduceAction211
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6625,7 +5963,7 @@ private class ReduceAction227
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction228
+private class ReduceAction212
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6652,7 +5990,7 @@ private class ReduceAction228
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction229
+private class ReduceAction213
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6680,7 +6018,7 @@ private class ReduceAction229
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction232
+private class ReduceAction216
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6703,7 +6041,7 @@ private class ReduceAction232
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction233
+private class ReduceAction217
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6723,7 +6061,7 @@ private class ReduceAction233
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction234
+private class ReduceAction218
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6756,7 +6094,7 @@ private class ReduceAction234
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction235
+private class ReduceAction219
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6786,7 +6124,7 @@ private class ReduceAction235
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction236
+private class ReduceAction220
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6832,7 +6170,7 @@ private class ReduceAction236
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction237
+private class ReduceAction221
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6874,7 +6212,7 @@ private class ReduceAction237
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction238
+private class ReduceAction222
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6917,7 +6255,7 @@ private class ReduceAction238
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction239
+private class ReduceAction223
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6956,7 +6294,7 @@ private class ReduceAction239
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction240
+private class ReduceAction224
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6981,7 +6319,7 @@ private class ReduceAction240
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction241
+private class ReduceAction225
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7009,7 +6347,7 @@ private class ReduceAction241
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction242
+private class ReduceAction226
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7030,7 +6368,7 @@ private class ReduceAction242
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction243
+private class ReduceAction227
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7054,7 +6392,7 @@ private class ReduceAction243
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction244
+private class ReduceAction228
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7066,7 +6404,7 @@ private class ReduceAction244
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction247
+private class ReduceAction231
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7106,7 +6444,7 @@ private class ReduceAction247
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction249
+private class ReduceAction233
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7127,7 +6465,7 @@ private class ReduceAction249
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction250
+private class ReduceAction234
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7148,7 +6486,7 @@ private class ReduceAction250
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction251
+private class ReduceAction235
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7170,7 +6508,7 @@ private class ReduceAction251
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction252
+private class ReduceAction236
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7191,7 +6529,7 @@ private class ReduceAction252
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction254
+private class ReduceAction238
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7211,7 +6549,7 @@ private class ReduceAction254
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction256
+private class ReduceAction240
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7232,7 +6570,7 @@ private class ReduceAction256
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction257
+private class ReduceAction241
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7253,7 +6591,7 @@ private class ReduceAction257
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction258
+private class ReduceAction242
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7274,7 +6612,7 @@ private class ReduceAction258
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction259
+private class ReduceAction243
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7295,7 +6633,7 @@ private class ReduceAction259
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction260
+private class ReduceAction244
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7316,7 +6654,7 @@ private class ReduceAction260
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction261
+private class ReduceAction245
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7337,7 +6675,7 @@ private class ReduceAction261
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction262
+private class ReduceAction246
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7358,7 +6696,7 @@ private class ReduceAction262
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction263
+private class ReduceAction247
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7379,7 +6717,7 @@ private class ReduceAction263
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction264
+private class ReduceAction248
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7400,7 +6738,7 @@ private class ReduceAction264
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction265
+private class ReduceAction249
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7421,7 +6759,7 @@ private class ReduceAction265
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction267
+private class ReduceAction251
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7442,7 +6780,7 @@ private class ReduceAction267
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction268
+private class ReduceAction252
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7463,7 +6801,7 @@ private class ReduceAction268
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction270
+private class ReduceAction254
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7484,7 +6822,7 @@ private class ReduceAction270
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction271
+private class ReduceAction255
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7505,7 +6843,7 @@ private class ReduceAction271
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction272
+private class ReduceAction256
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7526,7 +6864,28 @@ private class ReduceAction272
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction274
+private class ReduceAction258
+       super ReduceAction
+       redef fun action(p: Parser)
+       do
+                                       var node_list: nullable Object = null
+                                       var nodearraylist4 = p.pop
+                                       var nodearraylist3 = p.pop
+                                       var nodearraylist2 = p.pop
+                                       var nodearraylist1 = p.pop
+                                       var pexprnode2 = nodearraylist1
+                                       assert pexprnode2 isa nullable AExpr
+                                       var pexprnode3 = nodearraylist4
+                                       assert pexprnode3 isa nullable AExpr
+                                       var pexprnode1: nullable AStarstarExpr = new AStarstarExpr.init_astarstarexpr(
+                                               pexprnode2,
+                                               pexprnode3
+                                       )
+                                       node_list = pexprnode1
+                                       p.push(p.go_to(_goto), node_list)
+       end
+end
+private class ReduceAction260
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7546,7 +6905,7 @@ private class ReduceAction274
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction275
+private class ReduceAction261
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7566,7 +6925,7 @@ private class ReduceAction275
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction277
+private class ReduceAction263
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7591,7 +6950,7 @@ private class ReduceAction277
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction278
+private class ReduceAction264
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7617,7 +6976,7 @@ private class ReduceAction278
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction279
+private class ReduceAction265
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7639,7 +6998,7 @@ private class ReduceAction279
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction280
+private class ReduceAction267
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7661,7 +7020,7 @@ private class ReduceAction280
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction281
+private class ReduceAction268
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7679,7 +7038,7 @@ private class ReduceAction281
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction287
+private class ReduceAction274
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7698,7 +7057,7 @@ private class ReduceAction287
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction288
+private class ReduceAction275
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7728,7 +7087,7 @@ private class ReduceAction288
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction289
+private class ReduceAction276
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7743,32 +7102,34 @@ private class ReduceAction289
                                        var nodearraylist3 = p.pop
                                        var nodearraylist2 = p.pop
                                        var nodearraylist1 = p.pop
-                                       var tobranode2 = nodearraylist1
-                                       assert tobranode2 isa nullable TObra
-                                       var pexprnode3 = nodearraylist3
-                                       assert pexprnode3 isa nullable AExpr
-                                       var pexprnode4 = nodearraylist7
-                                       assert pexprnode4 isa nullable AExpr
-                                       var tcbranode5 = nodearraylist9
-                                       assert tcbranode5 isa nullable TCbra
-                                       var pannotationsnode6 = nodearraylist10
-                                       assert pannotationsnode6 isa nullable AAnnotations
-                                       var pexprnode1: nullable ACrangeExpr = new ACrangeExpr.init_acrangeexpr(
-                                               tobranode2,
-                                               pexprnode3,
-                                               pexprnode4,
-                                               tcbranode5,
-                                               pannotationsnode6
+                                       var pexprnode2 = nodearraylist1
+                                       assert pexprnode2 isa nullable AExpr
+                                       var tkwasnode3 = nodearraylist4
+                                       assert tkwasnode3 isa nullable TKwas
+                                       var toparnode4 = nodearraylist6
+                                       assert toparnode4 isa nullable TOpar
+                                       var ptypenode5 = nodearraylist8
+                                       assert ptypenode5 isa nullable AType
+                                       var tcparnode6 = nodearraylist10
+                                       assert tcparnode6 isa nullable TCpar
+                                       var pexprnode1: nullable AAsCastExpr = new AAsCastExpr.init_aascastexpr(
+                                               pexprnode2,
+                                               tkwasnode3,
+                                               toparnode4,
+                                               ptypenode5,
+                                               tcparnode6
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction290
+private class ReduceAction277
        super ReduceAction
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
+                                       var nodearraylist12 = p.pop
+                                       var nodearraylist11 = p.pop
                                        var nodearraylist10 = p.pop
                                        var nodearraylist9 = p.pop
                                        var nodearraylist8 = p.pop
@@ -7779,47 +7140,83 @@ private class ReduceAction290
                                        var nodearraylist3 = p.pop
                                        var nodearraylist2 = p.pop
                                        var nodearraylist1 = p.pop
-                                       var tobranode2 = nodearraylist1
-                                       assert tobranode2 isa nullable TObra
-                                       var pexprnode3 = nodearraylist3
-                                       assert pexprnode3 isa nullable AExpr
-                                       var pexprnode4 = nodearraylist7
-                                       assert pexprnode4 isa nullable AExpr
-                                       var tobranode5 = nodearraylist9
-                                       assert tobranode5 isa nullable TObra
-                                       var pannotationsnode6 = nodearraylist10
-                                       assert pannotationsnode6 isa nullable AAnnotations
-                                       var pexprnode1: nullable AOrangeExpr = new AOrangeExpr.init_aorangeexpr(
-                                               tobranode2,
-                                               pexprnode3,
-                                               pexprnode4,
-                                               tobranode5,
-                                               pannotationsnode6
+                                       var pexprnode2 = nodearraylist1
+                                       assert pexprnode2 isa nullable AExpr
+                                       var tkwasnode3 = nodearraylist4
+                                       assert tkwasnode3 isa nullable TKwas
+                                       var toparnode4 = nodearraylist6
+                                       assert toparnode4 isa nullable TOpar
+                                       var tkwnotnode5 = nodearraylist8
+                                       assert tkwnotnode5 isa nullable TKwnot
+                                       var tkwnullnode6 = nodearraylist10
+                                       assert tkwnullnode6 isa nullable TKwnull
+                                       var tcparnode7 = nodearraylist12
+                                       assert tcparnode7 isa nullable TCpar
+                                       var pexprnode1: nullable AAsNotnullExpr = new AAsNotnullExpr.init_aasnotnullexpr(
+                                               pexprnode2,
+                                               tkwasnode3,
+                                               toparnode4,
+                                               tkwnotnode5,
+                                               tkwnullnode6,
+                                               tcparnode7
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction291
+private class ReduceAction278
        super ReduceAction
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
+                                       var nodearraylist8 = p.pop
+                                       var nodearraylist7 = p.pop
+                                       var nodearraylist6 = p.pop
+                                       var nodearraylist5 = p.pop
+                                       var nodearraylist4 = p.pop
+                                       var nodearraylist3 = p.pop
                                        var nodearraylist2 = p.pop
                                        var nodearraylist1 = p.pop
-                                       var pexprsnode2 = nodearraylist1
-                                       assert pexprsnode2 isa nullable AExprs
-                                       var pannotationsnode3 = nodearraylist2
-                                       assert pannotationsnode3 isa nullable AAnnotations
-                                       var pexprnode1: nullable AArrayExpr = new AArrayExpr.init_aarrayexpr(
-                                               pexprsnode2,
-                                               pannotationsnode3
+                                       var pexprnode2 = nodearraylist1
+                                       assert pexprnode2 isa nullable AExpr
+                                       var tkwasnode3 = nodearraylist4
+                                       assert tkwasnode3 isa nullable TKwas
+                                       var tkwnotnode5 = nodearraylist6
+                                       assert tkwnotnode5 isa nullable TKwnot
+                                       var tkwnullnode6 = nodearraylist8
+                                       assert tkwnullnode6 isa nullable TKwnull
+                                       var pexprnode1: nullable AAsNotnullExpr = new AAsNotnullExpr.init_aasnotnullexpr(
+                                               pexprnode2,
+                                               tkwasnode3,
+                                               null,
+                                               tkwnotnode5,
+                                               tkwnullnode6,
+                                               null
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction292
+private class ReduceAction279
+       super ReduceAction
+       redef fun action(p: Parser)
+       do
+                                       var node_list: nullable Object = null
+                                       var nodearraylist2 = p.pop
+                                       var nodearraylist1 = p.pop
+                                       var pexprnode2 = nodearraylist1
+                                       assert pexprnode2 isa nullable AExpr
+                                       var tdotdotdotnode3 = nodearraylist2
+                                       assert tdotdotdotnode3 isa nullable TDotdotdot
+                                       var pexprnode1: nullable AVarargExpr = new AVarargExpr.init_avarargexpr(
+                                               pexprnode2,
+                                               tdotdotdotnode3
+                                       )
+                                       node_list = pexprnode1
+                                       p.push(p.go_to(_goto), node_list)
+       end
+end
+private class ReduceAction280
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7838,7 +7235,7 @@ private class ReduceAction292
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction293
+private class ReduceAction281
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7857,7 +7254,7 @@ private class ReduceAction293
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction294
+private class ReduceAction282
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7876,7 +7273,7 @@ private class ReduceAction294
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction295
+private class ReduceAction283
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7895,7 +7292,7 @@ private class ReduceAction295
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction296
+private class ReduceAction284
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7914,7 +7311,7 @@ private class ReduceAction296
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction297
+private class ReduceAction285
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7933,7 +7330,7 @@ private class ReduceAction297
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction298
+private class ReduceAction286
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7952,7 +7349,7 @@ private class ReduceAction298
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction299
+private class ReduceAction287
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7971,7 +7368,7 @@ private class ReduceAction299
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction300
+private class ReduceAction288
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7990,7 +7387,7 @@ private class ReduceAction300
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction302
+private class ReduceAction290
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8019,49 +7416,11 @@ private class ReduceAction302
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction303
-       super ReduceAction
-       redef fun action(p: Parser)
-       do
-                                       var node_list: nullable Object = null
-                                       var nodearraylist10 = p.pop
-                                       var nodearraylist9 = p.pop
-                                       var nodearraylist8 = p.pop
-                                       var nodearraylist7 = p.pop
-                                       var nodearraylist6 = p.pop
-                                       var nodearraylist5 = p.pop
-                                       var nodearraylist4 = p.pop
-                                       var nodearraylist3 = p.pop
-                                       var nodearraylist2 = p.pop
-                                       var nodearraylist1 = p.pop
-                                       var pexprnode2 = nodearraylist1
-                                       assert pexprnode2 isa nullable AExpr
-                                       var tkwasnode3 = nodearraylist4
-                                       assert tkwasnode3 isa nullable TKwas
-                                       var toparnode4 = nodearraylist6
-                                       assert toparnode4 isa nullable TOpar
-                                       var ptypenode5 = nodearraylist8
-                                       assert ptypenode5 isa nullable AType
-                                       var tcparnode6 = nodearraylist10
-                                       assert tcparnode6 isa nullable TCpar
-                                       var pexprnode1: nullable AAsCastExpr = new AAsCastExpr.init_aascastexpr(
-                                               pexprnode2,
-                                               tkwasnode3,
-                                               toparnode4,
-                                               ptypenode5,
-                                               tcparnode6
-                                       )
-                                       node_list = pexprnode1
-                                       p.push(p.go_to(_goto), node_list)
-       end
-end
-private class ReduceAction304
+private class ReduceAction291
        super ReduceAction
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
-                                       var nodearraylist12 = p.pop
-                                       var nodearraylist11 = p.pop
                                        var nodearraylist10 = p.pop
                                        var nodearraylist9 = p.pop
                                        var nodearraylist8 = p.pop
@@ -8072,35 +7431,34 @@ private class ReduceAction304
                                        var nodearraylist3 = p.pop
                                        var nodearraylist2 = p.pop
                                        var nodearraylist1 = p.pop
-                                       var pexprnode2 = nodearraylist1
-                                       assert pexprnode2 isa nullable AExpr
-                                       var tkwasnode3 = nodearraylist4
-                                       assert tkwasnode3 isa nullable TKwas
-                                       var toparnode4 = nodearraylist6
-                                       assert toparnode4 isa nullable TOpar
-                                       var tkwnotnode5 = nodearraylist8
-                                       assert tkwnotnode5 isa nullable TKwnot
-                                       var tkwnullnode6 = nodearraylist10
-                                       assert tkwnullnode6 isa nullable TKwnull
-                                       var tcparnode7 = nodearraylist12
-                                       assert tcparnode7 isa nullable TCpar
-                                       var pexprnode1: nullable AAsNotnullExpr = new AAsNotnullExpr.init_aasnotnullexpr(
-                                               pexprnode2,
-                                               tkwasnode3,
-                                               toparnode4,
-                                               tkwnotnode5,
-                                               tkwnullnode6,
-                                               tcparnode7
+                                       var tobranode2 = nodearraylist1
+                                       assert tobranode2 isa nullable TObra
+                                       var pexprnode3 = nodearraylist3
+                                       assert pexprnode3 isa nullable AExpr
+                                       var pexprnode4 = nodearraylist7
+                                       assert pexprnode4 isa nullable AExpr
+                                       var tcbranode5 = nodearraylist9
+                                       assert tcbranode5 isa nullable TCbra
+                                       var pannotationsnode6 = nodearraylist10
+                                       assert pannotationsnode6 isa nullable AAnnotations
+                                       var pexprnode1: nullable ACrangeExpr = new ACrangeExpr.init_acrangeexpr(
+                                               tobranode2,
+                                               pexprnode3,
+                                               pexprnode4,
+                                               tcbranode5,
+                                               pannotationsnode6
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction305
+private class ReduceAction292
        super ReduceAction
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
+                                       var nodearraylist10 = p.pop
+                                       var nodearraylist9 = p.pop
                                        var nodearraylist8 = p.pop
                                        var nodearraylist7 = p.pop
                                        var nodearraylist6 = p.pop
@@ -8109,46 +7467,47 @@ private class ReduceAction305
                                        var nodearraylist3 = p.pop
                                        var nodearraylist2 = p.pop
                                        var nodearraylist1 = p.pop
-                                       var pexprnode2 = nodearraylist1
-                                       assert pexprnode2 isa nullable AExpr
-                                       var tkwasnode3 = nodearraylist4
-                                       assert tkwasnode3 isa nullable TKwas
-                                       var tkwnotnode5 = nodearraylist6
-                                       assert tkwnotnode5 isa nullable TKwnot
-                                       var tkwnullnode6 = nodearraylist8
-                                       assert tkwnullnode6 isa nullable TKwnull
-                                       var pexprnode1: nullable AAsNotnullExpr = new AAsNotnullExpr.init_aasnotnullexpr(
-                                               pexprnode2,
-                                               tkwasnode3,
-                                               null,
-                                               tkwnotnode5,
-                                               tkwnullnode6,
-                                               null
+                                       var tobranode2 = nodearraylist1
+                                       assert tobranode2 isa nullable TObra
+                                       var pexprnode3 = nodearraylist3
+                                       assert pexprnode3 isa nullable AExpr
+                                       var pexprnode4 = nodearraylist7
+                                       assert pexprnode4 isa nullable AExpr
+                                       var tobranode5 = nodearraylist9
+                                       assert tobranode5 isa nullable TObra
+                                       var pannotationsnode6 = nodearraylist10
+                                       assert pannotationsnode6 isa nullable AAnnotations
+                                       var pexprnode1: nullable AOrangeExpr = new AOrangeExpr.init_aorangeexpr(
+                                               tobranode2,
+                                               pexprnode3,
+                                               pexprnode4,
+                                               tobranode5,
+                                               pannotationsnode6
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction306
+private class ReduceAction293
        super ReduceAction
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
                                        var nodearraylist2 = p.pop
                                        var nodearraylist1 = p.pop
-                                       var pexprnode2 = nodearraylist1
-                                       assert pexprnode2 isa nullable AExpr
-                                       var tdotdotdotnode3 = nodearraylist2
-                                       assert tdotdotdotnode3 isa nullable TDotdotdot
-                                       var pexprnode1: nullable AVarargExpr = new AVarargExpr.init_avarargexpr(
-                                               pexprnode2,
-                                               tdotdotdotnode3
+                                       var pexprsnode2 = nodearraylist1
+                                       assert pexprsnode2 isa nullable AExprs
+                                       var pannotationsnode3 = nodearraylist2
+                                       assert pannotationsnode3 isa nullable AAnnotations
+                                       var pexprnode1: nullable AArrayExpr = new AArrayExpr.init_aarrayexpr(
+                                               pexprsnode2,
+                                               pannotationsnode3
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction307
+private class ReduceAction294
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8175,7 +7534,7 @@ private class ReduceAction307
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction308
+private class ReduceAction295
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8206,7 +7565,7 @@ private class ReduceAction308
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction309
+private class ReduceAction296
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8228,7 +7587,7 @@ private class ReduceAction309
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction310
+private class ReduceAction297
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8244,7 +7603,7 @@ private class ReduceAction310
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction311
+private class ReduceAction298
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8259,7 +7618,7 @@ private class ReduceAction311
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction314
+private class ReduceAction301
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8274,7 +7633,7 @@ private class ReduceAction314
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction315
+private class ReduceAction302
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8289,7 +7648,7 @@ private class ReduceAction315
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction316
+private class ReduceAction303
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8314,7 +7673,7 @@ private class ReduceAction316
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction317
+private class ReduceAction304
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8345,7 +7704,7 @@ private class ReduceAction317
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction318
+private class ReduceAction305
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8356,7 +7715,7 @@ private class ReduceAction318
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction320
+private class ReduceAction307
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8388,7 +7747,7 @@ private class ReduceAction320
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction321
+private class ReduceAction308
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8432,7 +7791,7 @@ private class ReduceAction321
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction322
+private class ReduceAction309
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8452,7 +7811,7 @@ private class ReduceAction322
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction323
+private class ReduceAction310
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8467,7 +7826,7 @@ private class ReduceAction323
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction324
+private class ReduceAction311
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8486,7 +7845,70 @@ private class ReduceAction324
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction326
+private class ReduceAction314
+       super ReduceAction
+       redef fun action(p: Parser)
+       do
+                                       var node_list: nullable Object = null
+                                       var nodearraylist4 = p.pop
+                                       var nodearraylist3 = p.pop
+                                       var nodearraylist2 = p.pop
+                                       var nodearraylist1 = p.pop
+                                       var listnode8 = new Array[Object]
+                                       var tkwredefnode3 = nodearraylist1
+                                       assert tkwredefnode3 isa nullable TKwredef
+                                       var pvisibilitynode4 = nodearraylist2
+                                       assert pvisibilitynode4 isa nullable AVisibility
+                                       var patidnode5 = nodearraylist3
+                                       assert patidnode5 isa nullable AAtid
+                                       var patargnode7 = nodearraylist4
+                                       assert patargnode7 isa nullable AAtArg
+                                       if patargnode7 != null then
+                                               listnode8.add(patargnode7)
+                                       end
+                                       var pannotationnode1: nullable AAnnotation = new AAnnotation.init_aannotation(
+                                               null,
+                                               tkwredefnode3,
+                                               pvisibilitynode4,
+                                               patidnode5,
+                                               null,
+                                               listnode8,
+                                               null,
+                                               null
+                                       )
+                                       node_list = pannotationnode1
+                                       p.push(p.go_to(_goto), node_list)
+       end
+end
+private class ReduceAction315
+       super ReduceAction
+       redef fun action(p: Parser)
+       do
+                                       var node_list: nullable Object = null
+                                       var nodearraylist1 = p.pop
+                                       var pexprnode2 = nodearraylist1
+                                       assert pexprnode2 isa nullable AExpr
+                                       var patargnode1: nullable AExprAtArg = new AExprAtArg.init_aexpratarg(
+                                               pexprnode2
+                                       )
+                                       node_list = patargnode1
+                                       p.push(p.go_to(_goto), node_list)
+       end
+end
+private class ReduceAction316
+       super ReduceAction
+       redef fun action(p: Parser)
+       do
+                                       var node_list: nullable Object = null
+                                       var nodearraylist3 = p.pop
+                                       var nodearraylist2 = p.pop
+                                       var nodearraylist1 = p.pop
+                                       var pannotationnode1 = nodearraylist3
+                                       node_list = pannotationnode1
+                                       p.push(p.go_to(_goto), node_list)
+       end
+end
+private class ReduceAction318
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8519,7 +7941,7 @@ private class ReduceAction326
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction327
+private class ReduceAction319
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8555,7 +7977,7 @@ private class ReduceAction327
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction328
+private class ReduceAction320
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8599,7 +8021,7 @@ private class ReduceAction328
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction329
+private class ReduceAction321
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8646,7 +8068,7 @@ private class ReduceAction329
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction330
+private class ReduceAction322
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8683,7 +8105,7 @@ private class ReduceAction330
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction331
+private class ReduceAction323
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8710,7 +8132,7 @@ private class ReduceAction331
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction332
+private class ReduceAction324
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8740,7 +8162,7 @@ private class ReduceAction332
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction333
+private class ReduceAction325
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8778,7 +8200,7 @@ private class ReduceAction333
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction334
+private class ReduceAction326
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8819,7 +8241,7 @@ private class ReduceAction334
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction335
+private class ReduceAction327
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8850,20 +8272,7 @@ private class ReduceAction335
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction336
-       super ReduceAction
-       redef fun action(p: Parser)
-       do
-                                       var node_list: nullable Object = null
-                                       var nodearraylist3 = p.pop
-                                       var nodearraylist2 = p.pop
-                                       var nodearraylist1 = p.pop
-                                       var pannotationnode1 = nodearraylist3
-                                       node_list = pannotationnode1
-                                       p.push(p.go_to(_goto), node_list)
-       end
-end
-private class ReduceAction337
+private class ReduceAction328
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8878,7 +8287,7 @@ private class ReduceAction337
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction338
+private class ReduceAction329
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8897,7 +8306,7 @@ private class ReduceAction338
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction339
+private class ReduceAction330
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8910,7 +8319,7 @@ private class ReduceAction339
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction340
+private class ReduceAction331
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8925,22 +8334,7 @@ private class ReduceAction340
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction341
-       super ReduceAction
-       redef fun action(p: Parser)
-       do
-                                       var node_list: nullable Object = null
-                                       var nodearraylist1 = p.pop
-                                       var pexprnode2 = nodearraylist1
-                                       assert pexprnode2 isa nullable AExpr
-                                       var patargnode1: nullable AExprAtArg = new AExprAtArg.init_aexpratarg(
-                                               pexprnode2
-                                       )
-                                       node_list = patargnode1
-                                       p.push(p.go_to(_goto), node_list)
-       end
-end
-private class ReduceAction343
+private class ReduceAction334
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8955,7 +8349,7 @@ private class ReduceAction343
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction344
+private class ReduceAction335
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8970,37 +8364,37 @@ private class ReduceAction344
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction345
+private class ReduceAction336
        super ReduceAction
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
                                        var nodearraylist1 = p.pop
-                                       var tkwreadablenode2 = nodearraylist1
-                                       assert tkwreadablenode2 isa nullable TKwreadable
-                                       var patidnode1: nullable AKwreadableAtid = new AKwreadableAtid.init_akwreadableatid(
-                                               tkwreadablenode2
+                                       var tkwexternnode2 = nodearraylist1
+                                       assert tkwexternnode2 isa nullable TKwextern
+                                       var patidnode1: nullable AKwexternAtid = new AKwexternAtid.init_akwexternatid(
+                                               tkwexternnode2
                                        )
                                        node_list = patidnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction346
+private class ReduceAction337
        super ReduceAction
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
                                        var nodearraylist1 = p.pop
-                                       var tkwwritablenode2 = nodearraylist1
-                                       assert tkwwritablenode2 isa nullable TKwwritable
-                                       var patidnode1: nullable AKwwritableAtid = new AKwwritableAtid.init_akwwritableatid(
-                                               tkwwritablenode2
+                                       var tkwabstractnode2 = nodearraylist1
+                                       assert tkwabstractnode2 isa nullable TKwabstract
+                                       var patidnode1: nullable AKwabstractAtid = new AKwabstractAtid.init_akwabstractatid(
+                                               tkwabstractnode2
                                        )
                                        node_list = patidnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction347
+private class ReduceAction338
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9026,7 +8420,7 @@ private class ReduceAction347
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction348
+private class ReduceAction339
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9048,7 +8442,7 @@ private class ReduceAction348
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction349
+private class ReduceAction340
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9061,7 +8455,7 @@ private class ReduceAction349
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction351
+private class ReduceAction342
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9080,7 +8474,7 @@ private class ReduceAction351
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction354
+private class ReduceAction345
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9106,7 +8500,7 @@ private class ReduceAction354
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction356
+private class ReduceAction347
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9126,7 +8520,7 @@ private class ReduceAction356
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction357
+private class ReduceAction348
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9140,7 +8534,7 @@ private class ReduceAction357
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction358
+private class ReduceAction349
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9155,7 +8549,7 @@ private class ReduceAction358
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction359
+private class ReduceAction350
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9177,7 +8571,7 @@ private class ReduceAction359
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction360
+private class ReduceAction351
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9195,7 +8589,7 @@ private class ReduceAction360
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction361
+private class ReduceAction352
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9217,7 +8611,7 @@ private class ReduceAction361
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction362
+private class ReduceAction353
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9239,7 +8633,7 @@ private class ReduceAction362
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction363
+private class ReduceAction354
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9265,7 +8659,7 @@ private class ReduceAction363
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction364
+private class ReduceAction355
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9282,7 +8676,7 @@ private class ReduceAction364
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction365
+private class ReduceAction356
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9303,7 +8697,7 @@ private class ReduceAction365
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction366
+private class ReduceAction357
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9321,7 +8715,7 @@ private class ReduceAction366
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction368
+private class ReduceAction359
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9332,7 +8726,7 @@ private class ReduceAction368
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction369
+private class ReduceAction360
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9344,7 +8738,7 @@ private class ReduceAction369
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction370
+private class ReduceAction361
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9357,7 +8751,7 @@ private class ReduceAction370
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction372
+private class ReduceAction363
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9368,7 +8762,7 @@ private class ReduceAction372
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction373
+private class ReduceAction364
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9380,7 +8774,7 @@ private class ReduceAction373
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction374
+private class ReduceAction365
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9393,7 +8787,7 @@ private class ReduceAction374
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction376
+private class ReduceAction367
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9406,7 +8800,7 @@ private class ReduceAction376
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction377
+private class ReduceAction368
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9419,7 +8813,7 @@ private class ReduceAction377
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction379
+private class ReduceAction370
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9430,7 +8824,7 @@ private class ReduceAction379
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction380
+private class ReduceAction371
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9439,7 +8833,7 @@ private class ReduceAction380
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction382
+private class ReduceAction373
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9456,7 +8850,7 @@ private class ReduceAction382
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction383
+private class ReduceAction374
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9474,7 +8868,7 @@ private class ReduceAction383
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction386
+private class ReduceAction377
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9485,7 +8879,7 @@ private class ReduceAction386
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction387
+private class ReduceAction378
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9495,7 +8889,7 @@ private class ReduceAction387
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction388
+private class ReduceAction379
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9506,7 +8900,7 @@ private class ReduceAction388
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction604
+private class ReduceAction602
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9530,7 +8924,7 @@ private class ReduceAction604
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction605
+private class ReduceAction604
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9550,7 +8944,7 @@ private class ReduceAction605
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction606
+private class ReduceAction605
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9573,7 +8967,7 @@ private class ReduceAction606
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction608
+private class ReduceAction607
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9596,7 +8990,7 @@ private class ReduceAction608
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction624
+private class ReduceAction623
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9609,7 +9003,7 @@ private class ReduceAction624
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction625
+private class ReduceAction624
        super ReduceAction
        redef fun action(p: Parser)
        do
index d10c615..9e74516 100644 (file)
@@ -52,18 +52,9 @@ end
 class TKwdo
        super Token
 end
-class TKwreadable
-       super Token
-end
-class TKwwritable
-       super Token
-end
 class TKwvar
        super Token
 end
-class TKwintern
-       super Token
-end
 class TKwextern
        super Token
 end
@@ -214,6 +205,9 @@ end
 class TStar
        super Token
 end
+class TStarstar
+       super Token
+end
 class TSlash
        super Token
 end
@@ -317,7 +311,6 @@ class AClasskind super Prod end
 class AFormaldef super Prod end
 class ASuperclass super Prod end
 class APropdef super Prod end
-class AAble super Prod end
 class AMethid super Prod end
 class ASignature super Prod end
 class AParam super Prod end
@@ -442,127 +435,44 @@ end
 class AAttrPropdef
        super APropdef
        var n_doc: nullable ADoc = null is writable
-       var n_readable: nullable AAble = null is writable
-       var n_writable: nullable AAble = null is writable
        var n_kwredef: nullable TKwredef = null is writable
        var n_visibility: AVisibility is writable, noinit
        var n_kwvar: TKwvar is writable, noinit
-       var n_id: nullable TAttrid = null is writable
-       var n_id2: nullable TId = null is writable
+       var n_id2: TId is writable, noinit
        var n_type: nullable AType = null is writable
-       var n_annotations: nullable AAnnotations = null is writable
        var n_expr: nullable AExpr = null is writable
-end
-class AMethPropdef
-       super APropdef
-       var n_doc: nullable ADoc = null is writable
-       var n_kwredef: nullable TKwredef = null is writable
-       var n_visibility: AVisibility is writable, noinit
-       var n_methid: AMethid is writable, noinit
-       var n_signature: ASignature is writable, noinit
-end
-class ADeferredMethPropdef
-       super APropdef
-       var n_doc: nullable ADoc = null is writable
-       var n_kwredef: nullable TKwredef = null is writable
-       var n_visibility: AVisibility is writable, noinit
-       var n_kwmeth: TKwmeth is writable, noinit
-       var n_methid: AMethid is writable, noinit
-       var n_signature: ASignature is writable, noinit
-       var n_annotations: nullable AAnnotations = null is writable
-end
-class AInternMethPropdef
-       super APropdef
-       var n_doc: nullable ADoc = null is writable
-       var n_kwredef: nullable TKwredef = null is writable
-       var n_visibility: AVisibility is writable, noinit
-       var n_kwmeth: TKwmeth is writable, noinit
-       var n_methid: AMethid is writable, noinit
-       var n_signature: ASignature is writable, noinit
-end
-class AInternNewPropdef
-       super APropdef
-       var n_doc: nullable ADoc = null is writable
-       var n_kwredef: nullable TKwredef = null is writable
-       var n_visibility: AVisibility is writable, noinit
-       var n_kwnew: TKwnew is writable, noinit
-       var n_methid: nullable AMethid = null is writable
-       var n_signature: ASignature is writable, noinit
-end
-class AExternMethPropdef
-       super APropdef
-       var n_doc: nullable ADoc = null is writable
-       var n_kwredef: nullable TKwredef = null is writable
-       var n_visibility: AVisibility is writable, noinit
-       var n_kwmeth: TKwmeth is writable, noinit
-       var n_methid: AMethid is writable, noinit
-       var n_signature: ASignature is writable, noinit
        var n_annotations: nullable AAnnotations = null is writable
-       var n_extern: nullable TString = null is writable
-       var n_extern_calls: nullable AExternCalls = null is writable
-       var n_extern_code_block: nullable AExternCodeBlock = null is writable
 end
-class AConcreteMethPropdef
+class AMainMethPropdef
        super APropdef
-       var n_doc: nullable ADoc = null is writable
        var n_kwredef: nullable TKwredef = null is writable
-       var n_visibility: AVisibility is writable, noinit
-       var n_kwmeth: TKwmeth is writable, noinit
-       var n_methid: AMethid is writable, noinit
-       var n_signature: ASignature is writable, noinit
-       var n_annotations: nullable AAnnotations = null is writable
        var n_block: nullable AExpr = null is writable
 end
-class AConcreteInitPropdef
+class ATypePropdef
        super APropdef
        var n_doc: nullable ADoc = null is writable
        var n_kwredef: nullable TKwredef = null is writable
        var n_visibility: AVisibility is writable, noinit
-       var n_kwinit: TKwinit is writable, noinit
-       var n_methid: nullable AMethid = null is writable
-       var n_signature: ASignature is writable, noinit
+       var n_kwtype: TKwtype is writable, noinit
+       var n_id: TClassid is writable, noinit
+       var n_type: AType is writable, noinit
        var n_annotations: nullable AAnnotations = null is writable
-       var n_block: nullable AExpr = null is writable
 end
-class AExternInitPropdef
+class AMethPropdef
        super APropdef
        var n_doc: nullable ADoc = null is writable
        var n_kwredef: nullable TKwredef = null is writable
        var n_visibility: AVisibility is writable, noinit
-       var n_kwnew: TKwnew is writable, noinit
+       var n_kwmeth: nullable TKwmeth = null is writable
+       var n_kwinit: nullable TKwinit = null is writable
+       var n_kwnew: nullable TKwnew = null is writable
        var n_methid: nullable AMethid = null is writable
        var n_signature: ASignature is writable, noinit
        var n_annotations: nullable AAnnotations = null is writable
-       var n_extern: nullable TString = null is writable
        var n_extern_calls: nullable AExternCalls = null is writable
        var n_extern_code_block: nullable AExternCodeBlock = null is writable
-end
-class AMainMethPropdef
-       super APropdef
-       var n_kwredef: nullable TKwredef = null is writable
        var n_block: nullable AExpr = null is writable
 end
-class ATypePropdef
-       super APropdef
-       var n_doc: nullable ADoc = null is writable
-       var n_kwredef: nullable TKwredef = null is writable
-       var n_visibility: AVisibility is writable, noinit
-       var n_kwtype: TKwtype is writable, noinit
-       var n_id: TClassid is writable, noinit
-       var n_type: AType is writable, noinit
-       var n_annotations: nullable AAnnotations = null is writable
-end
-class AReadAble
-       super AAble
-       var n_kwredef: nullable TKwredef = null is writable
-       var n_kwreadable: TKwreadable is writable, noinit
-end
-class AWriteAble
-       super AAble
-       var n_kwredef: nullable TKwredef = null is writable
-       var n_visibility: nullable AVisibility = null is writable
-       var n_kwwritable: TKwwritable is writable, noinit
-end
 class AIdMethid
        super AMethid
        var n_id: TId is writable, noinit
@@ -579,6 +489,10 @@ class AStarMethid
        super AMethid
        var n_star: TStar is writable, noinit
 end
+class AStarstarMethid
+       super AMethid
+       var n_starstar: TStarstar is writable, noinit
+end
 class ASlashMethid
        super AMethid
        var n_slash: TSlash is writable, noinit
@@ -854,6 +768,11 @@ class AStarExpr
        var n_expr: AExpr is writable, noinit
        var n_expr2: AExpr is writable, noinit
 end
+class AStarstarExpr
+       super AExpr
+       var n_expr: AExpr is writable, noinit
+       var n_expr2: AExpr is writable, noinit
+end
 class ASlashExpr
        super AExpr
        var n_expr: AExpr is writable, noinit
@@ -1231,17 +1150,9 @@ class AKwexternAtid
        super AAtid
        var n_id: TKwextern is writable, noinit
 end
-class AKwinternAtid
-       super AAtid
-       var n_id: TKwintern is writable, noinit
-end
-class AKwreadableAtid
-       super AAtid
-       var n_id: TKwreadable is writable, noinit
-end
-class AKwwritableAtid
+class AKwabstractAtid
        super AAtid
-       var n_id: TKwwritable is writable, noinit
+       var n_id: TKwabstract is writable, noinit
 end
 class AKwimportAtid
        super AAtid
index 3cc5296..d335917 100644 (file)
@@ -363,18 +363,9 @@ end
 class TKwdo
        super TokenKeyword
 end
-class TKwreadable
-       super TokenKeyword
-end
-class TKwwritable
-       super TokenKeyword
-end
 class TKwvar
        super TokenKeyword
 end
-class TKwintern
-       super TokenKeyword
-end
 class TKwextern
        super TokenKeyword
 end
@@ -534,6 +525,9 @@ end
 class TStar
        super TokenOperator
 end
+class TStarstar
+       super TokenOperator
+end
 class TSlash
        super TokenOperator
 end
@@ -832,26 +826,21 @@ class AAttrPropdef
        super APropdef
        var n_kwvar: TKwvar is writable, noinit
 
-       # The identifier for an old-style attribute (null if new-style)
-       var n_id: nullable TAttrid is writable
-
        # The identifier for a new-style attribute (null if old-style)
-       var n_id2: nullable TId is writable
+       var n_id2: TId is writable, noinit
 
        var n_type: nullable AType = null is writable
-       var n_readable: nullable AAble = null is writable
-       var n_writable: nullable AAble = null is writable
 
        # The initial value, if any
        var n_expr: nullable AExpr = null is writable
        redef fun hot_location
        do
-               if n_id != null then return n_id.location else return n_id2.location
+               return n_id2.location
        end
 end
 
 # A definition of all kind of method (including constructors)
-abstract class AMethPropdef
+class AMethPropdef
        super APropdef
        var n_kwmeth: nullable TKwmeth = null is writable
        var n_kwinit: nullable TKwinit = null is writable
@@ -859,7 +848,6 @@ abstract class AMethPropdef
        var n_methid: nullable AMethid = null is writable
        var n_signature: nullable ASignature = null is writable
        var n_block: nullable AExpr = null is writable
-       var n_extern: nullable TString = null is writable
        var n_extern_calls: nullable AExternCalls = null is writable
        var n_extern_code_block: nullable AExternCodeBlock = null is writable
        redef fun hot_location
@@ -876,57 +864,9 @@ abstract class AMethPropdef
        end
 end
 
-# A method marked abstract
-# *deferred* is a old synonynmous of *abstract* that comes from PRM, that comes from Eiffel.
-class ADeferredMethPropdef
-       super AMethPropdef
-end
-
-# A method marked intern
-class AInternMethPropdef
-       super AMethPropdef
-end
-
-# A method of a constructor marked extern
-abstract class AExternPropdef
-       super AMethPropdef
-end
-
-# A method marked extern
-class AExternMethPropdef
-       super AExternPropdef
-end
-
-# A method with a body
-class AConcreteMethPropdef
-       super AMethPropdef
-end
-
-# A constructor
-abstract class AInitPropdef
-       super AMethPropdef
-end
-
-# A constructor with a body
-class AConcreteInitPropdef
-       super AConcreteMethPropdef
-       super AInitPropdef
-end
-
-class AInternNewPropdef
-       super AInternMethPropdef
-       super AInitPropdef
-end
-
-# A constructor marked extern (defined with the `new` keyword)
-class AExternInitPropdef
-       super AExternPropdef
-       super AInitPropdef
-end
-
 # The implicit main method
 class AMainMethPropdef
-       super AConcreteMethPropdef
+       super AMethPropdef
 end
 
 # Declaration of callbacks for extern methods
@@ -991,25 +931,6 @@ class ATypePropdef
        var n_type: AType is writable, noinit
 end
 
-# A `writable` or `readable` modifier
-abstract class AAble
-       super Prod
-       var n_visibility: nullable AVisibility = null is writable
-       var n_kwredef: nullable TKwredef = null is writable
-end
-
-# A `readable` modifier
-class AReadAble
-       super AAble
-       var n_kwreadable: TKwreadable is writable, noinit
-end
-
-# A `writable` modifier
-class AWriteAble
-       super AAble
-       var n_kwwritable: TKwwritable is writable, noinit
-end
-
 # The identifier of a method in a method declaration.
 # There is a specific class because of operator and setters.
 abstract class AMethid
@@ -1031,6 +952,10 @@ class AStarMethid
        super AMethid
        var n_star: TStar is writable, noinit
 end
+class AStarstarMethid
+       super AMethid
+       var n_starstar: TStarstar is writable, noinit
+end
 class ASlashMethid
        super AMethid
        var n_slash: TSlash is writable, noinit
@@ -1398,6 +1323,11 @@ class AStarExpr
        super ABinopExpr
 end
 
+# A `**` expression
+class AStarstarExpr
+       super ABinopExpr
+end
+
 # A `/` expression
 class ASlashExpr
        super ABinopExpr
@@ -1834,16 +1764,10 @@ end
 class AKwexternAtid
        super AAtid
 end
-class AKwinternAtid
-       super AAtid
-end
-class AKwreadableAtid
-       super AAtid
-end
-class AKwwritableAtid
+class AKwimportAtid
        super AAtid
 end
-class AKwimportAtid
+class AKwabstractAtid
        super AAtid
 end
 
index c7125ee..384769c 100644 (file)
@@ -836,40 +836,31 @@ end
 redef class AAttrPropdef
        init init_aattrpropdef (
                n_doc: nullable ADoc,
-               n_readable: nullable AAble,
-               n_writable: nullable AAble,
                n_kwredef: nullable TKwredef,
                n_visibility: nullable AVisibility,
                n_kwvar: nullable TKwvar,
-               n_id: nullable TAttrid,
                n_id2: nullable TId,
                n_type: nullable AType,
-               n_annotations: nullable AAnnotations,
-               n_expr: nullable AExpr
+               n_expr: nullable AExpr,
+               n_annotations: nullable AAnnotations
        )
        do
                _n_doc = n_doc
                if n_doc != null then n_doc.parent = self
-               _n_readable = n_readable
-               if n_readable != null then n_readable.parent = self
-               _n_writable = n_writable
-               if n_writable != null then n_writable.parent = self
                _n_kwredef = n_kwredef
                if n_kwredef != null then n_kwredef.parent = self
                _n_visibility = n_visibility.as(not null)
                n_visibility.parent = self
                _n_kwvar = n_kwvar.as(not null)
                n_kwvar.parent = self
-               _n_id = n_id
-               if n_id != null then n_id.parent = self
-               _n_id2 = n_id2
-               if n_id2 != null then n_id2.parent = self
+               _n_id2 = n_id2.as(not null)
+               n_id2.parent = self
                _n_type = n_type
                if n_type != null then n_type.parent = self
-               _n_annotations = n_annotations
-               if n_annotations != null then n_annotations.parent = self
                _n_expr = n_expr
                if n_expr != null then n_expr.parent = self
+               _n_annotations = n_annotations
+               if n_annotations != null then n_annotations.parent = self
        end
 
        redef fun replace_child(old_child: ANode, new_child: nullable ANode)
@@ -878,14 +869,6 @@ redef class AAttrPropdef
                        n_doc = new_child.as(nullable ADoc)
                        return
                end
-               if _n_readable == old_child then
-                       n_readable = new_child.as(nullable AAble)
-                       return
-               end
-               if _n_writable == old_child then
-                       n_writable = new_child.as(nullable AAble)
-                       return
-               end
                if _n_kwredef == old_child then
                        n_kwredef = new_child.as(nullable TKwredef)
                        return
@@ -898,26 +881,22 @@ redef class AAttrPropdef
                        n_kwvar = new_child.as(TKwvar)
                        return
                end
-               if _n_id == old_child then
-                       n_id = new_child.as(nullable TAttrid)
-                       return
-               end
                if _n_id2 == old_child then
-                       n_id2 = new_child.as(nullable TId)
+                       n_id2 = new_child.as(TId)
                        return
                end
                if _n_type == old_child then
                        n_type = new_child.as(nullable AType)
                        return
                end
-               if _n_annotations == old_child then
-                       n_annotations = new_child.as(nullable AAnnotations)
-                       return
-               end
                if _n_expr == old_child then
                        n_expr = new_child.as(nullable AExpr)
                        return
                end
+               if _n_annotations == old_child then
+                       n_annotations = new_child.as(nullable AAnnotations)
+                       return
+               end
        end
 
        redef fun n_doc=(node)
@@ -925,16 +904,6 @@ redef class AAttrPropdef
                _n_doc = node
                if node != null then node.parent = self
        end
-       redef fun n_readable=(node)
-       do
-               _n_readable = node
-               if node != null then node.parent = self
-       end
-       redef fun n_writable=(node)
-       do
-               _n_writable = node
-               if node != null then node.parent = self
-       end
        redef fun n_kwredef=(node)
        do
                _n_kwredef = node
@@ -950,218 +919,21 @@ redef class AAttrPropdef
                _n_kwvar = node
                node.parent = self
        end
-       redef fun n_id=(node)
-       do
-               _n_id = node
-               if node != null then node.parent = self
-       end
        redef fun n_id2=(node)
        do
                _n_id2 = node
-               if node != null then node.parent = self
+               node.parent = self
        end
        redef fun n_type=(node)
        do
                _n_type = node
                if node != null then node.parent = self
        end
-       redef fun n_annotations=(node)
-       do
-               _n_annotations = node
-               if node != null then node.parent = self
-       end
        redef fun n_expr=(node)
        do
                _n_expr = node
                if node != null then node.parent = self
        end
-
-
-       redef fun visit_all(v: Visitor)
-       do
-               v.enter_visit(_n_doc)
-               v.enter_visit(_n_readable)
-               v.enter_visit(_n_writable)
-               v.enter_visit(_n_kwredef)
-               v.enter_visit(_n_visibility)
-               v.enter_visit(_n_kwvar)
-               v.enter_visit(_n_id)
-               v.enter_visit(_n_id2)
-               v.enter_visit(_n_type)
-               v.enter_visit(_n_annotations)
-               v.enter_visit(_n_expr)
-       end
-end
-redef class AMethPropdef
-       init init_amethpropdef (
-               n_doc: nullable ADoc,
-               n_kwredef: nullable TKwredef,
-               n_visibility: nullable AVisibility,
-               n_methid: nullable AMethid,
-               n_signature: nullable ASignature
-       )
-       do
-               _n_doc = n_doc
-               if n_doc != null then n_doc.parent = self
-               _n_kwredef = n_kwredef
-               if n_kwredef != null then n_kwredef.parent = self
-               _n_visibility = n_visibility.as(not null)
-               n_visibility.parent = self
-               _n_methid = n_methid.as(not null)
-               n_methid.parent = self
-               _n_signature = n_signature.as(not null)
-               n_signature.parent = self
-       end
-
-       redef fun replace_child(old_child: ANode, new_child: nullable ANode)
-       do
-               if _n_doc == old_child then
-                       n_doc = new_child.as(nullable ADoc)
-                       return
-               end
-               if _n_kwredef == old_child then
-                       n_kwredef = new_child.as(nullable TKwredef)
-                       return
-               end
-               if _n_visibility == old_child then
-                       n_visibility = new_child.as(AVisibility)
-                       return
-               end
-               if _n_methid == old_child then
-                       n_methid = new_child.as(AMethid)
-                       return
-               end
-               if _n_signature == old_child then
-                       n_signature = new_child.as(ASignature)
-                       return
-               end
-       end
-
-       redef fun n_doc=(node)
-       do
-               _n_doc = node
-               if node != null then node.parent = self
-       end
-       redef fun n_kwredef=(node)
-       do
-               _n_kwredef = node
-               if node != null then node.parent = self
-       end
-       redef fun n_visibility=(node)
-       do
-               _n_visibility = node
-               node.parent = self
-       end
-       redef fun n_methid=(node)
-       do
-               _n_methid = node
-               node.parent = self
-       end
-       redef fun n_signature=(node)
-       do
-               _n_signature = node
-               node.parent = self
-       end
-
-
-       redef fun visit_all(v: Visitor)
-       do
-               v.enter_visit(_n_doc)
-               v.enter_visit(_n_kwredef)
-               v.enter_visit(_n_visibility)
-               v.enter_visit(_n_methid)
-               v.enter_visit(_n_signature)
-       end
-end
-redef class ADeferredMethPropdef
-       init init_adeferredmethpropdef (
-               n_doc: nullable ADoc,
-               n_kwredef: nullable TKwredef,
-               n_visibility: nullable AVisibility,
-               n_kwmeth: nullable TKwmeth,
-               n_methid: nullable AMethid,
-               n_signature: nullable ASignature,
-               n_annotations: nullable AAnnotations
-       )
-       do
-               _n_doc = n_doc
-               if n_doc != null then n_doc.parent = self
-               _n_kwredef = n_kwredef
-               if n_kwredef != null then n_kwredef.parent = self
-               _n_visibility = n_visibility.as(not null)
-               n_visibility.parent = self
-               _n_kwmeth = n_kwmeth.as(not null)
-               n_kwmeth.parent = self
-               _n_methid = n_methid.as(not null)
-               n_methid.parent = self
-               _n_signature = n_signature.as(not null)
-               n_signature.parent = self
-               _n_annotations = n_annotations
-               if n_annotations != null then n_annotations.parent = self
-       end
-
-       redef fun replace_child(old_child: ANode, new_child: nullable ANode)
-       do
-               if _n_doc == old_child then
-                       n_doc = new_child.as(nullable ADoc)
-                       return
-               end
-               if _n_kwredef == old_child then
-                       n_kwredef = new_child.as(nullable TKwredef)
-                       return
-               end
-               if _n_visibility == old_child then
-                       n_visibility = new_child.as(AVisibility)
-                       return
-               end
-               if _n_kwmeth == old_child then
-                       n_kwmeth = new_child.as(TKwmeth)
-                       return
-               end
-               if _n_methid == old_child then
-                       n_methid = new_child.as(AMethid)
-                       return
-               end
-               if _n_signature == old_child then
-                       n_signature = new_child.as(ASignature)
-                       return
-               end
-               if _n_annotations == old_child then
-                       n_annotations = new_child.as(nullable AAnnotations)
-                       return
-               end
-       end
-
-       redef fun n_doc=(node)
-       do
-               _n_doc = node
-               if node != null then node.parent = self
-       end
-       redef fun n_kwredef=(node)
-       do
-               _n_kwredef = node
-               if node != null then node.parent = self
-       end
-       redef fun n_visibility=(node)
-       do
-               _n_visibility = node
-               node.parent = self
-       end
-       redef fun n_kwmeth=(node)
-       do
-               _n_kwmeth = node
-               node.parent = self
-       end
-       redef fun n_methid=(node)
-       do
-               _n_methid = node
-               node.parent = self
-       end
-       redef fun n_signature=(node)
-       do
-               _n_signature = node
-               node.parent = self
-       end
        redef fun n_annotations=(node)
        do
                _n_annotations = node
@@ -1174,730 +946,11 @@ redef class ADeferredMethPropdef
                v.enter_visit(_n_doc)
                v.enter_visit(_n_kwredef)
                v.enter_visit(_n_visibility)
-               v.enter_visit(_n_kwmeth)
-               v.enter_visit(_n_methid)
-               v.enter_visit(_n_signature)
-               v.enter_visit(_n_annotations)
-       end
-end
-redef class AInternMethPropdef
-       init init_ainternmethpropdef (
-               n_doc: nullable ADoc,
-               n_kwredef: nullable TKwredef,
-               n_visibility: nullable AVisibility,
-               n_kwmeth: nullable TKwmeth,
-               n_methid: nullable AMethid,
-               n_signature: nullable ASignature
-       )
-       do
-               _n_doc = n_doc
-               if n_doc != null then n_doc.parent = self
-               _n_kwredef = n_kwredef
-               if n_kwredef != null then n_kwredef.parent = self
-               _n_visibility = n_visibility.as(not null)
-               n_visibility.parent = self
-               _n_kwmeth = n_kwmeth.as(not null)
-               n_kwmeth.parent = self
-               _n_methid = n_methid.as(not null)
-               n_methid.parent = self
-               _n_signature = n_signature.as(not null)
-               n_signature.parent = self
-       end
-
-       redef fun replace_child(old_child: ANode, new_child: nullable ANode)
-       do
-               if _n_doc == old_child then
-                       n_doc = new_child.as(nullable ADoc)
-                       return
-               end
-               if _n_kwredef == old_child then
-                       n_kwredef = new_child.as(nullable TKwredef)
-                       return
-               end
-               if _n_visibility == old_child then
-                       n_visibility = new_child.as(AVisibility)
-                       return
-               end
-               if _n_kwmeth == old_child then
-                       n_kwmeth = new_child.as(TKwmeth)
-                       return
-               end
-               if _n_methid == old_child then
-                       n_methid = new_child.as(AMethid)
-                       return
-               end
-               if _n_signature == old_child then
-                       n_signature = new_child.as(ASignature)
-                       return
-               end
-       end
-
-       redef fun n_doc=(node)
-       do
-               _n_doc = node
-               if node != null then node.parent = self
-       end
-       redef fun n_kwredef=(node)
-       do
-               _n_kwredef = node
-               if node != null then node.parent = self
-       end
-       redef fun n_visibility=(node)
-       do
-               _n_visibility = node
-               node.parent = self
-       end
-       redef fun n_kwmeth=(node)
-       do
-               _n_kwmeth = node
-               node.parent = self
-       end
-       redef fun n_methid=(node)
-       do
-               _n_methid = node
-               node.parent = self
-       end
-       redef fun n_signature=(node)
-       do
-               _n_signature = node
-               node.parent = self
-       end
-
-
-       redef fun visit_all(v: Visitor)
-       do
-               v.enter_visit(_n_doc)
-               v.enter_visit(_n_kwredef)
-               v.enter_visit(_n_visibility)
-               v.enter_visit(_n_kwmeth)
-               v.enter_visit(_n_methid)
-               v.enter_visit(_n_signature)
-       end
-end
-redef class AInternNewPropdef
-       init init_ainternnewpropdef (
-               n_doc: nullable ADoc,
-               n_kwredef: nullable TKwredef,
-               n_visibility: nullable AVisibility,
-               n_kwnew: nullable TKwnew,
-               n_methid: nullable AMethid,
-               n_signature: nullable ASignature
-       )
-       do
-               _n_doc = n_doc
-               if n_doc != null then n_doc.parent = self
-               _n_kwredef = n_kwredef
-               if n_kwredef != null then n_kwredef.parent = self
-               _n_visibility = n_visibility.as(not null)
-               n_visibility.parent = self
-               _n_kwnew = n_kwnew.as(not null)
-               n_kwnew.parent = self
-               _n_methid = n_methid
-               if n_methid != null then n_methid.parent = self
-               _n_signature = n_signature.as(not null)
-               n_signature.parent = self
-       end
-
-       redef fun replace_child(old_child: ANode, new_child: nullable ANode)
-       do
-               if _n_doc == old_child then
-                       n_doc = new_child.as(nullable ADoc)
-                       return
-               end
-               if _n_kwredef == old_child then
-                       n_kwredef = new_child.as(nullable TKwredef)
-                       return
-               end
-               if _n_visibility == old_child then
-                       n_visibility = new_child.as(AVisibility)
-                       return
-               end
-               if _n_kwnew == old_child then
-                       n_kwnew = new_child.as(TKwnew)
-                       return
-               end
-               if _n_methid == old_child then
-                       n_methid = new_child.as(nullable AMethid)
-                       return
-               end
-               if _n_signature == old_child then
-                       n_signature = new_child.as(ASignature)
-                       return
-               end
-       end
-
-       redef fun n_doc=(node)
-       do
-               _n_doc = node
-               if node != null then node.parent = self
-       end
-       redef fun n_kwredef=(node)
-       do
-               _n_kwredef = node
-               if node != null then node.parent = self
-       end
-       redef fun n_visibility=(node)
-       do
-               _n_visibility = node
-               node.parent = self
-       end
-       redef fun n_kwnew=(node)
-       do
-               _n_kwnew = node
-               node.parent = self
-       end
-       redef fun n_methid=(node)
-       do
-               _n_methid = node
-               if node != null then node.parent = self
-       end
-       redef fun n_signature=(node)
-       do
-               _n_signature = node
-               node.parent = self
-       end
-
-
-       redef fun visit_all(v: Visitor)
-       do
-               v.enter_visit(_n_doc)
-               v.enter_visit(_n_kwredef)
-               v.enter_visit(_n_visibility)
-               v.enter_visit(_n_kwnew)
-               v.enter_visit(_n_methid)
-               v.enter_visit(_n_signature)
-       end
-end
-redef class AExternMethPropdef
-       init init_aexternmethpropdef (
-               n_doc: nullable ADoc,
-               n_kwredef: nullable TKwredef,
-               n_visibility: nullable AVisibility,
-               n_kwmeth: nullable TKwmeth,
-               n_methid: nullable AMethid,
-               n_signature: nullable ASignature,
-               n_annotations: nullable AAnnotations,
-               n_extern: nullable TString,
-               n_extern_calls: nullable AExternCalls,
-               n_extern_code_block: nullable AExternCodeBlock
-       )
-       do
-               _n_doc = n_doc
-               if n_doc != null then n_doc.parent = self
-               _n_kwredef = n_kwredef
-               if n_kwredef != null then n_kwredef.parent = self
-               _n_visibility = n_visibility.as(not null)
-               n_visibility.parent = self
-               _n_kwmeth = n_kwmeth.as(not null)
-               n_kwmeth.parent = self
-               _n_methid = n_methid.as(not null)
-               n_methid.parent = self
-               _n_signature = n_signature.as(not null)
-               n_signature.parent = self
-               _n_annotations = n_annotations
-               if n_annotations != null then n_annotations.parent = self
-               _n_extern = n_extern
-               if n_extern != null then n_extern.parent = self
-               _n_extern_calls = n_extern_calls
-               if n_extern_calls != null then n_extern_calls.parent = self
-               _n_extern_code_block = n_extern_code_block
-               if n_extern_code_block != null then n_extern_code_block.parent = self
-       end
-
-       redef fun replace_child(old_child: ANode, new_child: nullable ANode)
-       do
-               if _n_doc == old_child then
-                       n_doc = new_child.as(nullable ADoc)
-                       return
-               end
-               if _n_kwredef == old_child then
-                       n_kwredef = new_child.as(nullable TKwredef)
-                       return
-               end
-               if _n_visibility == old_child then
-                       n_visibility = new_child.as(AVisibility)
-                       return
-               end
-               if _n_kwmeth == old_child then
-                       n_kwmeth = new_child.as(TKwmeth)
-                       return
-               end
-               if _n_methid == old_child then
-                       n_methid = new_child.as(AMethid)
-                       return
-               end
-               if _n_signature == old_child then
-                       n_signature = new_child.as(ASignature)
-                       return
-               end
-               if _n_annotations == old_child then
-                       n_annotations = new_child.as(nullable AAnnotations)
-                       return
-               end
-               if _n_extern == old_child then
-                       n_extern = new_child.as(nullable TString)
-                       return
-               end
-               if _n_extern_calls == old_child then
-                       n_extern_calls = new_child.as(nullable AExternCalls)
-                       return
-               end
-               if _n_extern_code_block == old_child then
-                       n_extern_code_block = new_child.as(nullable AExternCodeBlock)
-                       return
-               end
-       end
-
-       redef fun n_doc=(node)
-       do
-               _n_doc = node
-               if node != null then node.parent = self
-       end
-       redef fun n_kwredef=(node)
-       do
-               _n_kwredef = node
-               if node != null then node.parent = self
-       end
-       redef fun n_visibility=(node)
-       do
-               _n_visibility = node
-               node.parent = self
-       end
-       redef fun n_kwmeth=(node)
-       do
-               _n_kwmeth = node
-               node.parent = self
-       end
-       redef fun n_methid=(node)
-       do
-               _n_methid = node
-               node.parent = self
-       end
-       redef fun n_signature=(node)
-       do
-               _n_signature = node
-               node.parent = self
-       end
-       redef fun n_annotations=(node)
-       do
-               _n_annotations = node
-               if node != null then node.parent = self
-       end
-       redef fun n_extern=(node)
-       do
-               _n_extern = node
-               if node != null then node.parent = self
-       end
-       redef fun n_extern_calls=(node)
-       do
-               _n_extern_calls = node
-               if node != null then node.parent = self
-       end
-       redef fun n_extern_code_block=(node)
-       do
-               _n_extern_code_block = node
-               if node != null then node.parent = self
-       end
-
-
-       redef fun visit_all(v: Visitor)
-       do
-               v.enter_visit(_n_doc)
-               v.enter_visit(_n_kwredef)
-               v.enter_visit(_n_visibility)
-               v.enter_visit(_n_kwmeth)
-               v.enter_visit(_n_methid)
-               v.enter_visit(_n_signature)
-               v.enter_visit(_n_annotations)
-               v.enter_visit(_n_extern)
-               v.enter_visit(_n_extern_calls)
-               v.enter_visit(_n_extern_code_block)
-       end
-end
-redef class AConcreteMethPropdef
-       init init_aconcretemethpropdef (
-               n_doc: nullable ADoc,
-               n_kwredef: nullable TKwredef,
-               n_visibility: nullable AVisibility,
-               n_kwmeth: nullable TKwmeth,
-               n_methid: nullable AMethid,
-               n_signature: nullable ASignature,
-               n_annotations: nullable AAnnotations,
-               n_block: nullable AExpr
-       )
-       do
-               _n_doc = n_doc
-               if n_doc != null then n_doc.parent = self
-               _n_kwredef = n_kwredef
-               if n_kwredef != null then n_kwredef.parent = self
-               _n_visibility = n_visibility.as(not null)
-               n_visibility.parent = self
-               _n_kwmeth = n_kwmeth.as(not null)
-               n_kwmeth.parent = self
-               _n_methid = n_methid.as(not null)
-               n_methid.parent = self
-               _n_signature = n_signature.as(not null)
-               n_signature.parent = self
-               _n_annotations = n_annotations
-               if n_annotations != null then n_annotations.parent = self
-               _n_block = n_block
-               if n_block != null then n_block.parent = self
-       end
-
-       redef fun replace_child(old_child: ANode, new_child: nullable ANode)
-       do
-               if _n_doc == old_child then
-                       n_doc = new_child.as(nullable ADoc)
-                       return
-               end
-               if _n_kwredef == old_child then
-                       n_kwredef = new_child.as(nullable TKwredef)
-                       return
-               end
-               if _n_visibility == old_child then
-                       n_visibility = new_child.as(AVisibility)
-                       return
-               end
-               if _n_kwmeth == old_child then
-                       n_kwmeth = new_child.as(TKwmeth)
-                       return
-               end
-               if _n_methid == old_child then
-                       n_methid = new_child.as(AMethid)
-                       return
-               end
-               if _n_signature == old_child then
-                       n_signature = new_child.as(ASignature)
-                       return
-               end
-               if _n_annotations == old_child then
-                       n_annotations = new_child.as(nullable AAnnotations)
-                       return
-               end
-               if _n_block == old_child then
-                       n_block = new_child.as(nullable AExpr)
-                       return
-               end
-       end
-
-       redef fun n_doc=(node)
-       do
-               _n_doc = node
-               if node != null then node.parent = self
-       end
-       redef fun n_kwredef=(node)
-       do
-               _n_kwredef = node
-               if node != null then node.parent = self
-       end
-       redef fun n_visibility=(node)
-       do
-               _n_visibility = node
-               node.parent = self
-       end
-       redef fun n_kwmeth=(node)
-       do
-               _n_kwmeth = node
-               node.parent = self
-       end
-       redef fun n_methid=(node)
-       do
-               _n_methid = node
-               node.parent = self
-       end
-       redef fun n_signature=(node)
-       do
-               _n_signature = node
-               node.parent = self
-       end
-       redef fun n_annotations=(node)
-       do
-               _n_annotations = node
-               if node != null then node.parent = self
-       end
-       redef fun n_block=(node)
-       do
-               _n_block = node
-               if node != null then node.parent = self
-       end
-
-
-       redef fun visit_all(v: Visitor)
-       do
-               v.enter_visit(_n_doc)
-               v.enter_visit(_n_kwredef)
-               v.enter_visit(_n_visibility)
-               v.enter_visit(_n_kwmeth)
-               v.enter_visit(_n_methid)
-               v.enter_visit(_n_signature)
-               v.enter_visit(_n_annotations)
-               v.enter_visit(_n_block)
-       end
-end
-redef class AConcreteInitPropdef
-       init init_aconcreteinitpropdef (
-               n_doc: nullable ADoc,
-               n_kwredef: nullable TKwredef,
-               n_visibility: nullable AVisibility,
-               n_kwinit: nullable TKwinit,
-               n_methid: nullable AMethid,
-               n_signature: nullable ASignature,
-               n_annotations: nullable AAnnotations,
-               n_block: nullable AExpr
-       )
-       do
-               _n_doc = n_doc
-               if n_doc != null then n_doc.parent = self
-               _n_kwredef = n_kwredef
-               if n_kwredef != null then n_kwredef.parent = self
-               _n_visibility = n_visibility.as(not null)
-               n_visibility.parent = self
-               _n_kwinit = n_kwinit.as(not null)
-               n_kwinit.parent = self
-               _n_methid = n_methid
-               if n_methid != null then n_methid.parent = self
-               _n_signature = n_signature.as(not null)
-               n_signature.parent = self
-               _n_annotations = n_annotations
-               if n_annotations != null then n_annotations.parent = self
-               _n_block = n_block
-               if n_block != null then n_block.parent = self
-       end
-
-       redef fun replace_child(old_child: ANode, new_child: nullable ANode)
-       do
-               if _n_doc == old_child then
-                       n_doc = new_child.as(nullable ADoc)
-                       return
-               end
-               if _n_kwredef == old_child then
-                       n_kwredef = new_child.as(nullable TKwredef)
-                       return
-               end
-               if _n_visibility == old_child then
-                       n_visibility = new_child.as(AVisibility)
-                       return
-               end
-               if _n_kwinit == old_child then
-                       n_kwinit = new_child.as(TKwinit)
-                       return
-               end
-               if _n_methid == old_child then
-                       n_methid = new_child.as(nullable AMethid)
-                       return
-               end
-               if _n_signature == old_child then
-                       n_signature = new_child.as(ASignature)
-                       return
-               end
-               if _n_annotations == old_child then
-                       n_annotations = new_child.as(nullable AAnnotations)
-                       return
-               end
-               if _n_block == old_child then
-                       n_block = new_child.as(nullable AExpr)
-                       return
-               end
-       end
-
-       redef fun n_doc=(node)
-       do
-               _n_doc = node
-               if node != null then node.parent = self
-       end
-       redef fun n_kwredef=(node)
-       do
-               _n_kwredef = node
-               if node != null then node.parent = self
-       end
-       redef fun n_visibility=(node)
-       do
-               _n_visibility = node
-               node.parent = self
-       end
-       redef fun n_kwinit=(node)
-       do
-               _n_kwinit = node
-               node.parent = self
-       end
-       redef fun n_methid=(node)
-       do
-               _n_methid = node
-               if node != null then node.parent = self
-       end
-       redef fun n_signature=(node)
-       do
-               _n_signature = node
-               node.parent = self
-       end
-       redef fun n_annotations=(node)
-       do
-               _n_annotations = node
-               if node != null then node.parent = self
-       end
-       redef fun n_block=(node)
-       do
-               _n_block = node
-               if node != null then node.parent = self
-       end
-
-
-       redef fun visit_all(v: Visitor)
-       do
-               v.enter_visit(_n_doc)
-               v.enter_visit(_n_kwredef)
-               v.enter_visit(_n_visibility)
-               v.enter_visit(_n_kwinit)
-               v.enter_visit(_n_methid)
-               v.enter_visit(_n_signature)
-               v.enter_visit(_n_annotations)
-               v.enter_visit(_n_block)
-       end
-end
-redef class AExternInitPropdef
-       init init_aexterninitpropdef (
-               n_doc: nullable ADoc,
-               n_kwredef: nullable TKwredef,
-               n_visibility: nullable AVisibility,
-               n_kwnew: nullable TKwnew,
-               n_methid: nullable AMethid,
-               n_signature: nullable ASignature,
-               n_annotations: nullable AAnnotations,
-               n_extern: nullable TString,
-               n_extern_calls: nullable AExternCalls,
-               n_extern_code_block: nullable AExternCodeBlock
-       )
-       do
-               _n_doc = n_doc
-               if n_doc != null then n_doc.parent = self
-               _n_kwredef = n_kwredef
-               if n_kwredef != null then n_kwredef.parent = self
-               _n_visibility = n_visibility.as(not null)
-               n_visibility.parent = self
-               _n_kwnew = n_kwnew.as(not null)
-               n_kwnew.parent = self
-               _n_methid = n_methid
-               if n_methid != null then n_methid.parent = self
-               _n_signature = n_signature.as(not null)
-               n_signature.parent = self
-               _n_annotations = n_annotations
-               if n_annotations != null then n_annotations.parent = self
-               _n_extern = n_extern
-               if n_extern != null then n_extern.parent = self
-               _n_extern_calls = n_extern_calls
-               if n_extern_calls != null then n_extern_calls.parent = self
-               _n_extern_code_block = n_extern_code_block
-               if n_extern_code_block != null then n_extern_code_block.parent = self
-       end
-
-       redef fun replace_child(old_child: ANode, new_child: nullable ANode)
-       do
-               if _n_doc == old_child then
-                       n_doc = new_child.as(nullable ADoc)
-                       return
-               end
-               if _n_kwredef == old_child then
-                       n_kwredef = new_child.as(nullable TKwredef)
-                       return
-               end
-               if _n_visibility == old_child then
-                       n_visibility = new_child.as(AVisibility)
-                       return
-               end
-               if _n_kwnew == old_child then
-                       n_kwnew = new_child.as(TKwnew)
-                       return
-               end
-               if _n_methid == old_child then
-                       n_methid = new_child.as(nullable AMethid)
-                       return
-               end
-               if _n_signature == old_child then
-                       n_signature = new_child.as(ASignature)
-                       return
-               end
-               if _n_annotations == old_child then
-                       n_annotations = new_child.as(nullable AAnnotations)
-                       return
-               end
-               if _n_extern == old_child then
-                       n_extern = new_child.as(nullable TString)
-                       return
-               end
-               if _n_extern_calls == old_child then
-                       n_extern_calls = new_child.as(nullable AExternCalls)
-                       return
-               end
-               if _n_extern_code_block == old_child then
-                       n_extern_code_block = new_child.as(nullable AExternCodeBlock)
-                       return
-               end
-       end
-
-       redef fun n_doc=(node)
-       do
-               _n_doc = node
-               if node != null then node.parent = self
-       end
-       redef fun n_kwredef=(node)
-       do
-               _n_kwredef = node
-               if node != null then node.parent = self
-       end
-       redef fun n_visibility=(node)
-       do
-               _n_visibility = node
-               node.parent = self
-       end
-       redef fun n_kwnew=(node)
-       do
-               _n_kwnew = node
-               node.parent = self
-       end
-       redef fun n_methid=(node)
-       do
-               _n_methid = node
-               if node != null then node.parent = self
-       end
-       redef fun n_signature=(node)
-       do
-               _n_signature = node
-               node.parent = self
-       end
-       redef fun n_annotations=(node)
-       do
-               _n_annotations = node
-               if node != null then node.parent = self
-       end
-       redef fun n_extern=(node)
-       do
-               _n_extern = node
-               if node != null then node.parent = self
-       end
-       redef fun n_extern_calls=(node)
-       do
-               _n_extern_calls = node
-               if node != null then node.parent = self
-       end
-       redef fun n_extern_code_block=(node)
-       do
-               _n_extern_code_block = node
-               if node != null then node.parent = self
-       end
-
-
-       redef fun visit_all(v: Visitor)
-       do
-               v.enter_visit(_n_doc)
-               v.enter_visit(_n_kwredef)
-               v.enter_visit(_n_visibility)
-               v.enter_visit(_n_kwnew)
-               v.enter_visit(_n_methid)
-               v.enter_visit(_n_signature)
-               v.enter_visit(_n_annotations)
-               v.enter_visit(_n_extern)
-               v.enter_visit(_n_extern_calls)
-               v.enter_visit(_n_extern_code_block)
+               v.enter_visit(_n_kwvar)
+               v.enter_visit(_n_id2)
+               v.enter_visit(_n_type)
+               v.enter_visit(_n_expr)
+               v.enter_visit(_n_annotations)
        end
 end
 redef class AMainMethPropdef
@@ -2049,101 +1102,176 @@ redef class ATypePropdef
                v.enter_visit(_n_annotations)
        end
 end
-redef class AReadAble
-       init init_areadable (
+redef class AMethPropdef
+       init init_amethpropdef (
+               n_doc: nullable ADoc,
                n_kwredef: nullable TKwredef,
-               n_kwreadable: nullable TKwreadable
+               n_visibility: nullable AVisibility,
+               n_kwmeth: nullable TKwmeth,
+               n_kwinit: nullable TKwinit,
+               n_kwnew: nullable TKwnew,
+               n_methid: nullable AMethid,
+               n_signature: nullable ASignature,
+               n_annotations: nullable AAnnotations,
+               n_extern_calls: nullable AExternCalls,
+               n_extern_code_block: nullable AExternCodeBlock,
+               n_block: nullable AExpr
        )
        do
+               _n_doc = n_doc
+               if n_doc != null then n_doc.parent = self
                _n_kwredef = n_kwredef
                if n_kwredef != null then n_kwredef.parent = self
-               _n_kwreadable = n_kwreadable.as(not null)
-               n_kwreadable.parent = self
+               _n_visibility = n_visibility.as(not null)
+               n_visibility.parent = self
+               _n_kwmeth = n_kwmeth
+               if n_kwmeth != null then n_kwmeth.parent = self
+               _n_kwinit = n_kwinit
+               if n_kwinit != null then n_kwinit.parent = self
+               _n_kwnew = n_kwnew
+               if n_kwnew != null then n_kwnew.parent = self
+               _n_methid = n_methid
+               if n_methid != null then n_methid.parent = self
+               _n_signature = n_signature.as(not null)
+               n_signature.parent = self
+               _n_annotations = n_annotations
+               if n_annotations != null then n_annotations.parent = self
+               _n_extern_calls = n_extern_calls
+               if n_extern_calls != null then n_extern_calls.parent = self
+               _n_extern_code_block = n_extern_code_block
+               if n_extern_code_block != null then n_extern_code_block.parent = self
+               _n_block = n_block
+               if n_block != null then n_block.parent = self
        end
 
        redef fun replace_child(old_child: ANode, new_child: nullable ANode)
        do
+               if _n_doc == old_child then
+                       n_doc = new_child.as(nullable ADoc)
+                       return
+               end
                if _n_kwredef == old_child then
                        n_kwredef = new_child.as(nullable TKwredef)
                        return
                end
-               if _n_kwreadable == old_child then
-                       n_kwreadable = new_child.as(TKwreadable)
+               if _n_visibility == old_child then
+                       n_visibility = new_child.as(AVisibility)
+                       return
+               end
+               if _n_kwmeth == old_child then
+                       n_kwmeth = new_child.as(nullable TKwmeth)
+                       return
+               end
+               if _n_kwinit == old_child then
+                       n_kwinit = new_child.as(nullable TKwinit)
+                       return
+               end
+               if _n_kwnew == old_child then
+                       n_kwnew = new_child.as(nullable TKwnew)
+                       return
+               end
+               if _n_methid == old_child then
+                       n_methid = new_child.as(nullable AMethid)
+                       return
+               end
+               if _n_signature == old_child then
+                       n_signature = new_child.as(ASignature)
+                       return
+               end
+               if _n_annotations == old_child then
+                       n_annotations = new_child.as(nullable AAnnotations)
+                       return
+               end
+               if _n_extern_calls == old_child then
+                       n_extern_calls = new_child.as(nullable AExternCalls)
+                       return
+               end
+               if _n_extern_code_block == old_child then
+                       n_extern_code_block = new_child.as(nullable AExternCodeBlock)
+                       return
+               end
+               if _n_block == old_child then
+                       n_block = new_child.as(nullable AExpr)
                        return
                end
        end
 
+       redef fun n_doc=(node)
+       do
+               _n_doc = node
+               if node != null then node.parent = self
+       end
        redef fun n_kwredef=(node)
        do
                _n_kwredef = node
                if node != null then node.parent = self
        end
-       redef fun n_kwreadable=(node)
+       redef fun n_visibility=(node)
        do
-               _n_kwreadable = node
+               _n_visibility = node
                node.parent = self
        end
-
-
-       redef fun visit_all(v: Visitor)
+       redef fun n_kwmeth=(node)
        do
-               v.enter_visit(_n_kwredef)
-               v.enter_visit(_n_kwreadable)
+               _n_kwmeth = node
+               if node != null then node.parent = self
        end
-end
-redef class AWriteAble
-       init init_awriteable (
-               n_kwredef: nullable TKwredef,
-               n_visibility: nullable AVisibility,
-               n_kwwritable: nullable TKwwritable
-       )
+       redef fun n_kwinit=(node)
        do
-               _n_kwredef = n_kwredef
-               if n_kwredef != null then n_kwredef.parent = self
-               _n_visibility = n_visibility
-               if n_visibility != null then n_visibility.parent = self
-               _n_kwwritable = n_kwwritable.as(not null)
-               n_kwwritable.parent = self
+               _n_kwinit = node
+               if node != null then node.parent = self
        end
-
-       redef fun replace_child(old_child: ANode, new_child: nullable ANode)
+       redef fun n_kwnew=(node)
        do
-               if _n_kwredef == old_child then
-                       n_kwredef = new_child.as(nullable TKwredef)
-                       return
-               end
-               if _n_visibility == old_child then
-                       n_visibility = new_child.as(nullable AVisibility)
-                       return
-               end
-               if _n_kwwritable == old_child then
-                       n_kwwritable = new_child.as(TKwwritable)
-                       return
-               end
+               _n_kwnew = node
+               if node != null then node.parent = self
        end
-
-       redef fun n_kwredef=(node)
+       redef fun n_methid=(node)
        do
-               _n_kwredef = node
+               _n_methid = node
                if node != null then node.parent = self
        end
-       redef fun n_visibility=(node)
+       redef fun n_signature=(node)
        do
-               _n_visibility = node
+               _n_signature = node
+               node.parent = self
+       end
+       redef fun n_annotations=(node)
+       do
+               _n_annotations = node
                if node != null then node.parent = self
        end
-       redef fun n_kwwritable=(node)
+       redef fun n_extern_calls=(node)
        do
-               _n_kwwritable = node
-               node.parent = self
+               _n_extern_calls = node
+               if node != null then node.parent = self
+       end
+       redef fun n_extern_code_block=(node)
+       do
+               _n_extern_code_block = node
+               if node != null then node.parent = self
+       end
+       redef fun n_block=(node)
+       do
+               _n_block = node
+               if node != null then node.parent = self
        end
 
 
        redef fun visit_all(v: Visitor)
        do
+               v.enter_visit(_n_doc)
                v.enter_visit(_n_kwredef)
                v.enter_visit(_n_visibility)
-               v.enter_visit(_n_kwwritable)
+               v.enter_visit(_n_kwmeth)
+               v.enter_visit(_n_kwinit)
+               v.enter_visit(_n_kwnew)
+               v.enter_visit(_n_methid)
+               v.enter_visit(_n_signature)
+               v.enter_visit(_n_annotations)
+               v.enter_visit(_n_extern_calls)
+               v.enter_visit(_n_extern_code_block)
+               v.enter_visit(_n_block)
        end
 end
 redef class AIdMethid
@@ -2262,6 +1390,35 @@ redef class AStarMethid
                v.enter_visit(_n_star)
        end
 end
+redef class AStarstarMethid
+       init init_astarstarmethid (
+               n_starstar: nullable TStarstar
+       )
+       do
+               _n_starstar = n_starstar.as(not null)
+               n_starstar.parent = self
+       end
+
+       redef fun replace_child(old_child: ANode, new_child: nullable ANode)
+       do
+               if _n_starstar == old_child then
+                       n_starstar = new_child.as(TStarstar)
+                       return
+               end
+       end
+
+       redef fun n_starstar=(node)
+       do
+               _n_starstar = node
+               node.parent = self
+       end
+
+
+       redef fun visit_all(v: Visitor)
+       do
+               v.enter_visit(_n_starstar)
+       end
+end
 redef class ASlashMethid
        init init_aslashmethid (
                n_slash: nullable TSlash
@@ -4605,6 +3762,48 @@ redef class AStarExpr
                v.enter_visit(_n_expr2)
        end
 end
+redef class AStarstarExpr
+       init init_astarstarexpr (
+               n_expr: nullable AExpr,
+               n_expr2: nullable AExpr
+       )
+       do
+               _n_expr = n_expr.as(not null)
+               n_expr.parent = self
+               _n_expr2 = n_expr2.as(not null)
+               n_expr2.parent = self
+       end
+
+       redef fun replace_child(old_child: ANode, new_child: nullable ANode)
+       do
+               if _n_expr == old_child then
+                       n_expr = new_child.as(AExpr)
+                       return
+               end
+               if _n_expr2 == old_child then
+                       n_expr2 = new_child.as(AExpr)
+                       return
+               end
+       end
+
+       redef fun n_expr=(node)
+       do
+               _n_expr = node
+               node.parent = self
+       end
+       redef fun n_expr2=(node)
+       do
+               _n_expr2 = node
+               node.parent = self
+       end
+
+
+       redef fun visit_all(v: Visitor)
+       do
+               v.enter_visit(_n_expr)
+               v.enter_visit(_n_expr2)
+       end
+end
 redef class ASlashExpr
        init init_aslashexpr (
                n_expr: nullable AExpr,
@@ -7850,67 +7049,9 @@ redef class AKwexternAtid
                v.enter_visit(_n_id)
        end
 end
-redef class AKwinternAtid
-       init init_akwinternatid (
-               n_id: nullable TKwintern
-       )
-       do
-               _n_id = n_id.as(not null)
-               n_id.parent = self
-       end
-
-       redef fun replace_child(old_child: ANode, new_child: nullable ANode)
-       do
-               if _n_id == old_child then
-                       n_id = new_child.as(TKwintern)
-                       return
-               end
-       end
-
-       redef fun n_id=(node)
-       do
-               _n_id = node
-               node.parent = self
-       end
-
-
-       redef fun visit_all(v: Visitor)
-       do
-               v.enter_visit(_n_id)
-       end
-end
-redef class AKwreadableAtid
-       init init_akwreadableatid (
-               n_id: nullable TKwreadable
-       )
-       do
-               _n_id = n_id.as(not null)
-               n_id.parent = self
-       end
-
-       redef fun replace_child(old_child: ANode, new_child: nullable ANode)
-       do
-               if _n_id == old_child then
-                       n_id = new_child.as(TKwreadable)
-                       return
-               end
-       end
-
-       redef fun n_id=(node)
-       do
-               _n_id = node
-               node.parent = self
-       end
-
-
-       redef fun visit_all(v: Visitor)
-       do
-               v.enter_visit(_n_id)
-       end
-end
-redef class AKwwritableAtid
-       init init_akwwritableatid (
-               n_id: nullable TKwwritable
+redef class AKwabstractAtid
+       init init_akwabstractatid (
+               n_id: nullable TKwabstract
        )
        do
                _n_id = n_id.as(not null)
@@ -7920,7 +7061,7 @@ redef class AKwwritableAtid
        redef fun replace_child(old_child: ANode, new_child: nullable ANode)
        do
                if _n_id == old_child then
-                       n_id = new_child.as(TKwwritable)
+                       n_id = new_child.as(TKwabstract)
                        return
                end
        end
index 646ce11..e161f75 100644 (file)
@@ -104,25 +104,29 @@ static const int lexer_goto_row10[] = {
        92, 92, 61,
        93, 255, 59
 };
+static const int lexer_goto_row13[] = {
+       1,
+       42, 42, 62
+};
 static const int lexer_goto_row14[] = {
        1,
-       61, 61, 62
+       61, 61, 63
 };
 static const int lexer_goto_row16[] = {
        1,
-       61, 61, 63
+       61, 61, 64
 };
 static const int lexer_goto_row17[] = {
        2,
-       46, 46, 64,
-       48, 57, 65
+       46, 46, 65,
+       48, 57, 66
 };
 static const int lexer_goto_row19[] = {
        4,
-       46, 46, 66,
+       46, 46, 67,
        48, 57, 19,
-       88, 88, 67,
-       120, 120, 68
+       88, 88, 68,
+       120, 120, 69
 };
 static const int lexer_goto_row20[] = {
        1,
@@ -130,199 +134,197 @@ static const int lexer_goto_row20[] = {
 };
 static const int lexer_goto_row21[] = {
        1,
-       58, 58, 69
+       58, 58, 70
 };
 static const int lexer_goto_row22[] = {
        2,
-       60, 60, 70,
-       61, 61, 71
+       60, 60, 71,
+       61, 61, 72
 };
 static const int lexer_goto_row23[] = {
        1,
-       61, 61, 72
+       61, 61, 73
 };
 static const int lexer_goto_row24[] = {
        2,
-       61, 61, 73,
-       62, 62, 74
+       61, 61, 74,
+       62, 62, 75
 };
 static const int lexer_goto_row26[] = {
        4,
-       48, 57, 75,
-       65, 90, 76,
-       95, 95, 77,
-       97, 122, 78
+       48, 57, 76,
+       65, 90, 77,
+       95, 95, 78,
+       97, 122, 79
 };
 static const int lexer_goto_row29[] = {
        2,
-       95, 95, 79,
-       97, 122, 80
+       95, 95, 80,
+       97, 122, 81
 };
 static const int lexer_goto_row30[] = {
        1,
-       123, 123, 81
+       123, 123, 82
 };
 static const int lexer_goto_row31[] = {
        10,
-       48, 57, 82,
-       65, 90, 83,
-       95, 95, 84,
-       97, 97, 85,
-       98, 98, 86,
-       99, 109, 85,
-       110, 110, 87,
-       111, 114, 85,
-       115, 115, 88,
-       116, 122, 85
+       48, 57, 83,
+       65, 90, 84,
+       95, 95, 85,
+       97, 97, 86,
+       98, 98, 87,
+       99, 109, 86,
+       110, 110, 88,
+       111, 114, 86,
+       115, 115, 89,
+       116, 122, 86
 };
 static const int lexer_goto_row32[] = {
        4,
        48, 95, -32,
-       97, 113, 85,
-       114, 114, 89,
-       115, 122, 85
+       97, 113, 86,
+       114, 114, 90,
+       115, 122, 86
 };
 static const int lexer_goto_row33[] = {
        6,
        48, 95, -32,
-       97, 107, 85,
-       108, 108, 90,
-       109, 110, 85,
-       111, 111, 91,
-       112, 122, 85
+       97, 107, 86,
+       108, 108, 91,
+       109, 110, 86,
+       111, 111, 92,
+       112, 122, 86
 };
 static const int lexer_goto_row34[] = {
        4,
        48, 95, -32,
-       97, 110, 85,
-       111, 111, 92,
-       112, 122, 85
+       97, 110, 86,
+       111, 111, 93,
+       112, 122, 86
 };
 static const int lexer_goto_row35[] = {
        7,
        48, 107, -34,
-       108, 108, 93,
-       109, 109, 85,
-       110, 110, 94,
-       111, 119, 85,
-       120, 120, 95,
-       121, 122, 85
+       108, 108, 94,
+       109, 109, 86,
+       110, 110, 95,
+       111, 119, 86,
+       120, 120, 96,
+       121, 122, 86
 };
 static const int lexer_goto_row36[] = {
        7,
        48, 95, -32,
-       97, 97, 96,
-       98, 110, 85,
-       111, 111, 97,
-       112, 116, 85,
-       117, 117, 98,
-       118, 122, 85
+       97, 97, 97,
+       98, 110, 86,
+       111, 111, 98,
+       112, 116, 86,
+       117, 117, 99,
+       118, 122, 86
 };
 static const int lexer_goto_row37[] = {
        2,
        48, 95, -32,
-       97, 122, 85
+       97, 122, 86
 };
 static const int lexer_goto_row38[] = {
        9,
        48, 95, -32,
-       97, 101, 85,
-       102, 102, 99,
-       103, 108, 85,
-       109, 109, 100,
-       110, 110, 101,
-       111, 114, 85,
-       115, 115, 102,
-       116, 122, 85
+       97, 101, 86,
+       102, 102, 100,
+       103, 108, 86,
+       109, 109, 101,
+       110, 110, 102,
+       111, 114, 86,
+       115, 115, 103,
+       116, 122, 86
 };
 static const int lexer_goto_row39[] = {
        5,
        48, 95, -32,
-       97, 97, 103,
-       98, 110, 85,
-       111, 111, 104,
-       112, 122, 85
+       97, 97, 104,
+       98, 110, 86,
+       111, 111, 105,
+       112, 122, 86
 };
 static const int lexer_goto_row40[] = {
        3,
        48, 110, -35,
-       111, 111, 105,
-       112, 122, 85
+       111, 111, 106,
+       112, 122, 86
 };
 static const int lexer_goto_row41[] = {
        8,
        48, 95, -32,
-       97, 100, 85,
-       101, 101, 106,
-       102, 110, 85,
-       111, 111, 107,
-       112, 116, 85,
-       117, 117, 108,
-       118, 122, 85
+       97, 100, 86,
+       101, 101, 107,
+       102, 110, 86,
+       111, 111, 108,
+       112, 116, 86,
+       117, 117, 109,
+       118, 122, 86
 };
 static const int lexer_goto_row42[] = {
        6,
        48, 95, -32,
-       97, 109, 85,
-       110, 110, 109,
-       111, 113, 85,
-       114, 114, 110,
-       115, 122, 85
+       97, 109, 86,
+       110, 110, 110,
+       111, 113, 86,
+       114, 114, 111,
+       115, 122, 86
 };
 static const int lexer_goto_row43[] = {
        7,
        48, 95, -32,
-       97, 97, 111,
-       98, 113, 85,
-       114, 114, 112,
-       115, 116, 85,
-       117, 117, 113,
-       118, 122, 85
+       97, 97, 112,
+       98, 113, 86,
+       114, 114, 113,
+       115, 116, 86,
+       117, 117, 114,
+       118, 122, 86
 };
 static const int lexer_goto_row44[] = {
        3,
        48, 100, -42,
-       101, 101, 114,
-       102, 122, 85
+       101, 101, 115,
+       102, 122, 86
 };
 static const int lexer_goto_row45[] = {
        5,
        48, 100, -42,
-       101, 101, 115,
-       102, 116, 85,
-       117, 117, 116,
-       118, 122, 85
+       101, 101, 116,
+       102, 116, 86,
+       117, 117, 117,
+       118, 122, 86
 };
 static const int lexer_goto_row46[] = {
        8,
        48, 95, -32,
-       97, 103, 85,
-       104, 104, 117,
-       105, 113, 85,
-       114, 114, 118,
-       115, 120, 85,
-       121, 121, 119,
-       122, 122, 85
+       97, 103, 86,
+       104, 104, 118,
+       105, 113, 86,
+       114, 114, 119,
+       115, 120, 86,
+       121, 121, 120,
+       122, 122, 86
 };
 static const int lexer_goto_row47[] = {
        3,
        48, 109, -43,
-       110, 110, 120,
-       111, 122, 85
+       110, 110, 121,
+       111, 122, 86
 };
 static const int lexer_goto_row48[] = {
        3,
        48, 95, -32,
-       97, 97, 121,
-       98, 122, 85
+       97, 97, 122,
+       98, 122, 86
 };
 static const int lexer_goto_row49[] = {
-       5,
+       3,
        48, 103, -47,
-       104, 104, 122,
-       105, 113, 85,
-       114, 114, 123,
-       115, 122, 85
+       104, 104, 123,
+       105, 122, 86
 };
 static const int lexer_goto_row50[] = {
        11,
@@ -376,36 +378,32 @@ static const int lexer_goto_row62[] = {
        11, 12, 135,
        14, 255, 135
 };
-static const int lexer_goto_row65[] = {
-       1,
-       46, 46, 136
-};
 static const int lexer_goto_row66[] = {
        1,
-       48, 57, 65
+       46, 46, 136
 };
 static const int lexer_goto_row67[] = {
        1,
-       48, 57, 65
+       48, 57, 66
 };
 static const int lexer_goto_row68[] = {
+       1,
+       48, 57, 66
+};
+static const int lexer_goto_row69[] = {
        3,
        48, 57, 137,
        65, 70, 138,
        97, 102, 139
 };
-static const int lexer_goto_row69[] = {
+static const int lexer_goto_row70[] = {
        1,
-       48, 102, -69
+       48, 102, -70
 };
-static const int lexer_goto_row72[] = {
+static const int lexer_goto_row73[] = {
        1,
        62, 62, 140
 };
-static const int lexer_goto_row76[] = {
-       1,
-       48, 122, -27
-};
 static const int lexer_goto_row77[] = {
        1,
        48, 122, -27
@@ -420,16 +418,20 @@ static const int lexer_goto_row79[] = {
 };
 static const int lexer_goto_row80[] = {
        1,
-       100, 100, 141
+       48, 122, -27
 };
 static const int lexer_goto_row81[] = {
+       1,
+       100, 100, 141
+};
+static const int lexer_goto_row82[] = {
        4,
        48, 57, 142,
        65, 90, 143,
        95, 95, 144,
        97, 122, 145
 };
-static const int lexer_goto_row82[] = {
+static const int lexer_goto_row83[] = {
        5,
        0, 91, 146,
        92, 92, 147,
@@ -437,10 +439,6 @@ static const int lexer_goto_row82[] = {
        96, 96, 148,
        97, 255, 146
 };
-static const int lexer_goto_row83[] = {
-       1,
-       48, 122, -38
-};
 static const int lexer_goto_row84[] = {
        1,
        48, 122, -38
@@ -454,248 +452,244 @@ static const int lexer_goto_row86[] = {
        48, 122, -38
 };
 static const int lexer_goto_row87[] = {
+       1,
+       48, 122, -38
+};
+static const int lexer_goto_row88[] = {
        5,
        48, 110, -35,
        111, 111, 149,
-       112, 114, 85,
+       112, 114, 86,
        115, 115, 150,
-       116, 122, 85
+       116, 122, 86
 };
-static const int lexer_goto_row88[] = {
+static const int lexer_goto_row89[] = {
        4,
        48, 95, -32,
-       97, 99, 85,
+       97, 99, 86,
        100, 100, 151,
-       101, 122, 85
+       101, 122, 86
 };
-static const int lexer_goto_row89[] = {
+static const int lexer_goto_row90[] = {
        4,
        48, 95, -32,
-       97, 114, 85,
+       97, 114, 86,
        115, 115, 152,
-       116, 122, 85
+       116, 122, 86
 };
-static const int lexer_goto_row90[] = {
+static const int lexer_goto_row91[] = {
        3,
        48, 100, -42,
        101, 101, 153,
-       102, 122, 85
+       102, 122, 86
 };
-static const int lexer_goto_row91[] = {
+static const int lexer_goto_row92[] = {
        3,
        48, 95, -32,
        97, 97, 154,
-       98, 122, 85
+       98, 122, 86
 };
-static const int lexer_goto_row92[] = {
+static const int lexer_goto_row93[] = {
        3,
        48, 109, -43,
        110, 110, 155,
-       111, 122, 85
+       111, 122, 86
 };
-static const int lexer_goto_row93[] = {
+static const int lexer_goto_row94[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row94[] = {
+static const int lexer_goto_row95[] = {
        3,
-       48, 114, -90,
+       48, 114, -91,
        115, 115, 156,
-       116, 122, 85
+       116, 122, 86
 };
-static const int lexer_goto_row95[] = {
+static const int lexer_goto_row96[] = {
        5,
-       48, 99, -89,
+       48, 99, -90,
        100, 100, 157,
-       101, 116, 85,
+       101, 116, 86,
        117, 117, 158,
-       118, 122, 85
+       118, 122, 86
 };
-static const int lexer_goto_row96[] = {
+static const int lexer_goto_row97[] = {
        4,
        48, 95, -32,
-       97, 115, 85,
+       97, 115, 86,
        116, 116, 159,
-       117, 122, 85
+       117, 122, 86
 };
-static const int lexer_goto_row97[] = {
+static const int lexer_goto_row98[] = {
        3,
        48, 107, -34,
        108, 108, 160,
-       109, 122, 85
+       109, 122, 86
 };
-static const int lexer_goto_row98[] = {
+static const int lexer_goto_row99[] = {
        3,
        48, 113, -33,
        114, 114, 161,
-       115, 122, 85
+       115, 122, 86
 };
-static const int lexer_goto_row99[] = {
+static const int lexer_goto_row100[] = {
        3,
        48, 109, -43,
        110, 110, 162,
-       111, 122, 85
+       111, 122, 86
 };
-static const int lexer_goto_row100[] = {
+static const int lexer_goto_row101[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row101[] = {
+static const int lexer_goto_row102[] = {
        4,
        48, 95, -32,
-       97, 111, 85,
+       97, 111, 86,
        112, 112, 163,
-       113, 122, 85
+       113, 122, 86
 };
-static const int lexer_goto_row102[] = {
+static const int lexer_goto_row103[] = {
        6,
        48, 95, -32,
-       97, 104, 85,
+       97, 104, 86,
        105, 105, 164,
-       106, 115, 85,
+       106, 115, 86,
        116, 116, 165,
-       117, 122, 85
+       117, 122, 86
 };
-static const int lexer_goto_row103[] = {
+static const int lexer_goto_row104[] = {
        5,
        48, 95, -32,
        97, 97, 166,
-       98, 114, 85,
+       98, 114, 86,
        115, 115, 167,
-       116, 122, 85
+       116, 122, 86
 };
-static const int lexer_goto_row104[] = {
+static const int lexer_goto_row105[] = {
        3,
        48, 97, -32,
        98, 98, 168,
-       99, 122, 85
+       99, 122, 86
 };
-static const int lexer_goto_row105[] = {
+static const int lexer_goto_row106[] = {
        3,
        48, 110, -35,
        111, 111, 169,
-       112, 122, 85
+       112, 122, 86
 };
-static const int lexer_goto_row106[] = {
+static const int lexer_goto_row107[] = {
        3,
-       48, 99, -89,
+       48, 99, -90,
        100, 100, 170,
-       101, 122, 85
+       101, 122, 86
 };
-static const int lexer_goto_row107[] = {
+static const int lexer_goto_row108[] = {
        4,
        48, 95, -32,
-       97, 118, 85,
+       97, 118, 86,
        119, 119, 171,
-       120, 122, 85
+       120, 122, 86
 };
-static const int lexer_goto_row108[] = {
+static const int lexer_goto_row109[] = {
        3,
-       48, 115, -97,
+       48, 115, -98,
        116, 116, 172,
-       117, 122, 85
+       117, 122, 86
 };
-static const int lexer_goto_row109[] = {
+static const int lexer_goto_row110[] = {
        3,
        48, 107, -34,
        108, 108, 173,
-       109, 122, 85
+       109, 122, 86
 };
-static const int lexer_goto_row110[] = {
+static const int lexer_goto_row111[] = {
        4,
        48, 95, -32,
-       97, 98, 85,
+       97, 98, 86,
        99, 99, 174,
-       100, 122, 85
+       100, 122, 86
 };
-static const int lexer_goto_row111[] = {
+static const int lexer_goto_row112[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row112[] = {
+static const int lexer_goto_row113[] = {
        3,
-       48, 98, -111,
+       48, 98, -112,
        99, 99, 175,
-       100, 122, 85
+       100, 122, 86
 };
-static const int lexer_goto_row113[] = {
+static const int lexer_goto_row114[] = {
        5,
-       48, 104, -103,
+       48, 104, -104,
        105, 105, 176,
-       106, 110, 85,
+       106, 110, 86,
        111, 111, 177,
-       112, 122, 85
+       112, 122, 86
 };
-static const int lexer_goto_row114[] = {
+static const int lexer_goto_row115[] = {
        3,
        48, 97, -32,
        98, 98, 178,
-       99, 122, 85
-};
-static const int lexer_goto_row115[] = {
-       7,
-       48, 95, -32,
-       97, 97, 179,
-       98, 99, 85,
-       100, 100, 180,
-       101, 115, 85,
-       116, 116, 181,
-       117, 122, 85
+       99, 122, 86
 };
 static const int lexer_goto_row116[] = {
-       3,
-       48, 107, -34,
-       108, 108, 182,
-       109, 122, 85
+       5,
+       48, 99, -90,
+       100, 100, 179,
+       101, 115, 86,
+       116, 116, 180,
+       117, 122, 86
 };
 static const int lexer_goto_row117[] = {
        3,
-       48, 111, -102,
-       112, 112, 183,
-       113, 122, 85
+       48, 107, -34,
+       108, 108, 181,
+       109, 122, 86
 };
 static const int lexer_goto_row118[] = {
        3,
-       48, 100, -42,
-       101, 101, 184,
-       102, 122, 85
+       48, 111, -103,
+       112, 112, 182,
+       113, 122, 86
 };
 static const int lexer_goto_row119[] = {
-       4,
-       48, 95, -32,
-       97, 116, 85,
-       117, 117, 185,
-       118, 122, 85
+       3,
+       48, 100, -42,
+       101, 101, 183,
+       102, 122, 86
 };
 static const int lexer_goto_row120[] = {
-       3,
-       48, 111, -102,
-       112, 112, 186,
-       113, 122, 85
+       4,
+       48, 95, -32,
+       97, 116, 86,
+       117, 117, 184,
+       118, 122, 86
 };
 static const int lexer_goto_row121[] = {
        3,
-       48, 104, -103,
-       105, 105, 187,
-       106, 122, 85
+       48, 111, -103,
+       112, 112, 185,
+       113, 122, 86
 };
 static const int lexer_goto_row122[] = {
        3,
-       48, 113, -33,
-       114, 114, 188,
-       115, 122, 85
+       48, 104, -104,
+       105, 105, 186,
+       106, 122, 86
 };
 static const int lexer_goto_row123[] = {
        3,
-       48, 104, -103,
-       105, 105, 189,
-       106, 122, 85
+       48, 113, -33,
+       114, 114, 187,
+       115, 122, 86
 };
 static const int lexer_goto_row124[] = {
        3,
-       48, 104, -103,
-       105, 105, 190,
-       106, 122, 85
+       48, 104, -104,
+       105, 105, 188,
+       106, 122, 86
 };
 static const int lexer_goto_row125[] = {
        2,
@@ -704,29 +698,29 @@ static const int lexer_goto_row125[] = {
 };
 static const int lexer_goto_row127[] = {
        3,
-       0, 9, 191,
-       11, 12, 191,
-       14, 255, 191
+       0, 9, 189,
+       11, 12, 189,
+       14, 255, 189
 };
 static const int lexer_goto_row129[] = {
        3,
        0, 124, -51,
-       125, 125, 192,
+       125, 125, 190,
        126, 255, 124
 };
 static const int lexer_goto_row131[] = {
        11,
-       0, 9, 193,
-       10, 10, 194,
-       11, 12, 193,
-       13, 13, 195,
-       14, 33, 193,
-       34, 34, 196,
-       35, 91, 193,
-       92, 92, 197,
-       93, 122, 193,
-       123, 123, 198,
-       124, 255, 193
+       0, 9, 191,
+       10, 10, 192,
+       11, 12, 191,
+       13, 13, 193,
+       14, 33, 191,
+       34, 34, 194,
+       35, 91, 191,
+       92, 92, 195,
+       93, 122, 191,
+       123, 123, 196,
+       124, 255, 191
 };
 static const int lexer_goto_row132[] = {
        1,
@@ -734,75 +728,75 @@ static const int lexer_goto_row132[] = {
 };
 static const int lexer_goto_row135[] = {
        9,
-       0, 9, 199,
-       10, 10, 200,
-       11, 12, 199,
-       13, 13, 201,
-       14, 38, 199,
-       39, 39, 202,
-       40, 91, 199,
-       92, 92, 203,
-       93, 255, 199
+       0, 9, 197,
+       10, 10, 198,
+       11, 12, 197,
+       13, 13, 199,
+       14, 38, 197,
+       39, 39, 200,
+       40, 91, 197,
+       92, 92, 201,
+       93, 255, 197
 };
 static const int lexer_goto_row136[] = {
        1,
-       39, 39, 204
+       39, 39, 202
 };
 static const int lexer_goto_row138[] = {
        1,
-       48, 102, -69
+       48, 102, -70
 };
 static const int lexer_goto_row139[] = {
        1,
-       48, 102, -69
+       48, 102, -70
 };
 static const int lexer_goto_row140[] = {
        1,
-       48, 102, -69
+       48, 102, -70
 };
 static const int lexer_goto_row142[] = {
        1,
-       101, 101, 205
+       101, 101, 203
 };
 static const int lexer_goto_row143[] = {
        1,
-       48, 122, -82
+       48, 122, -83
 };
 static const int lexer_goto_row144[] = {
        1,
-       48, 122, -82
+       48, 122, -83
 };
 static const int lexer_goto_row145[] = {
        1,
-       48, 122, -82
+       48, 122, -83
 };
 static const int lexer_goto_row146[] = {
        1,
-       48, 122, -82
+       48, 122, -83
 };
 static const int lexer_goto_row147[] = {
        1,
-       0, 255, -83
+       0, 255, -84
 };
 static const int lexer_goto_row148[] = {
        1,
-       0, 255, 206
+       0, 255, 204
 };
 static const int lexer_goto_row149[] = {
        1,
-       125, 125, 207
+       125, 125, 205
 };
 static const int lexer_goto_row150[] = {
        3,
        48, 113, -33,
-       114, 114, 208,
-       115, 122, 85
+       114, 114, 206,
+       115, 122, 86
 };
 static const int lexer_goto_row151[] = {
        3,
-       48, 115, -97,
-       116, 116, 209,
-       117, 122, 85
+       48, 115, -98,
+       116, 116, 207,
+       117, 122, 86
 };
 static const int lexer_goto_row152[] = {
        1,
@@ -811,32 +805,32 @@ static const int lexer_goto_row152[] = {
 static const int lexer_goto_row153[] = {
        3,
        48, 100, -42,
-       101, 101, 210,
-       102, 122, 85
+       101, 101, 208,
+       102, 122, 86
 };
 static const int lexer_goto_row154[] = {
        3,
        48, 95, -32,
-       97, 97, 211,
-       98, 122, 85
+       97, 97, 209,
+       98, 122, 86
 };
 static const int lexer_goto_row155[] = {
        3,
-       48, 114, -90,
-       115, 115, 212,
-       116, 122, 85
+       48, 114, -91,
+       115, 115, 210,
+       116, 122, 86
 };
 static const int lexer_goto_row156[] = {
        3,
-       48, 115, -97,
-       116, 116, 213,
-       117, 122, 85
+       48, 115, -98,
+       116, 116, 211,
+       117, 122, 86
 };
 static const int lexer_goto_row157[] = {
        3,
        48, 100, -42,
-       101, 101, 214,
-       102, 122, 85
+       101, 101, 212,
+       102, 122, 86
 };
 static const int lexer_goto_row158[] = {
        1,
@@ -845,21 +839,21 @@ static const int lexer_goto_row158[] = {
 static const int lexer_goto_row159[] = {
        4,
        48, 95, -32,
-       97, 108, 85,
-       109, 109, 215,
-       110, 122, 85
+       97, 108, 86,
+       109, 109, 213,
+       110, 122, 86
 };
 static const int lexer_goto_row160[] = {
        3,
        48, 100, -42,
-       101, 101, 216,
-       102, 122, 85
+       101, 101, 214,
+       102, 122, 86
 };
 static const int lexer_goto_row161[] = {
        3,
-       48, 114, -90,
-       115, 115, 217,
-       116, 122, 85
+       48, 114, -91,
+       115, 115, 215,
+       116, 122, 86
 };
 static const int lexer_goto_row162[] = {
        1,
@@ -872,24 +866,24 @@ static const int lexer_goto_row163[] = {
 static const int lexer_goto_row164[] = {
        5,
        48, 107, -34,
-       108, 108, 218,
-       109, 110, 85,
-       111, 111, 219,
-       112, 122, 85
+       108, 108, 216,
+       109, 110, 86,
+       111, 111, 217,
+       112, 122, 86
 };
 static const int lexer_goto_row165[] = {
        3,
-       48, 115, -97,
-       116, 116, 220,
-       117, 122, 85
+       48, 115, -98,
+       116, 116, 218,
+       117, 122, 86
 };
 static const int lexer_goto_row166[] = {
        5,
        48, 100, -42,
-       101, 101, 221,
-       102, 113, 85,
-       114, 114, 222,
-       115, 122, 85
+       101, 101, 219,
+       102, 113, 86,
+       114, 114, 220,
+       115, 122, 86
 };
 static const int lexer_goto_row167[] = {
        1,
@@ -898,26 +892,26 @@ static const int lexer_goto_row167[] = {
 static const int lexer_goto_row168[] = {
        3,
        48, 100, -42,
-       101, 101, 223,
-       102, 122, 85
+       101, 101, 221,
+       102, 122, 86
 };
 static const int lexer_goto_row169[] = {
        3,
        48, 100, -42,
-       101, 101, 224,
-       102, 122, 85
+       101, 101, 222,
+       102, 122, 86
 };
 static const int lexer_goto_row170[] = {
        3,
-       48, 111, -102,
-       112, 112, 225,
-       113, 122, 85
+       48, 111, -103,
+       112, 112, 223,
+       113, 122, 86
 };
 static const int lexer_goto_row171[] = {
        3,
-       48, 116, -120,
-       117, 117, 226,
-       118, 122, 85
+       48, 116, -121,
+       117, 117, 224,
+       118, 122, 86
 };
 static const int lexer_goto_row172[] = {
        1,
@@ -930,1003 +924,929 @@ static const int lexer_goto_row173[] = {
 static const int lexer_goto_row174[] = {
        3,
        48, 107, -34,
-       108, 108, 227,
-       109, 122, 85
+       108, 108, 225,
+       109, 122, 86
 };
 static const int lexer_goto_row175[] = {
        3,
        48, 100, -42,
-       101, 101, 228,
-       102, 122, 85
+       101, 101, 226,
+       102, 122, 86
 };
 static const int lexer_goto_row176[] = {
        4,
        48, 95, -32,
-       97, 106, 85,
-       107, 107, 229,
-       108, 122, 85
+       97, 106, 86,
+       107, 107, 227,
+       108, 122, 86
 };
 static const int lexer_goto_row177[] = {
        4,
        48, 95, -32,
-       97, 117, 85,
-       118, 118, 230,
-       119, 122, 85
+       97, 117, 86,
+       118, 118, 228,
+       119, 122, 86
 };
 static const int lexer_goto_row178[] = {
        3,
-       48, 115, -97,
-       116, 116, 231,
-       117, 122, 85
+       48, 115, -98,
+       116, 116, 229,
+       117, 122, 86
 };
 static const int lexer_goto_row179[] = {
        3,
        48, 107, -34,
-       108, 108, 232,
-       109, 122, 85
+       108, 108, 230,
+       109, 122, 86
 };
 static const int lexer_goto_row180[] = {
        3,
-       48, 99, -89,
-       100, 100, 233,
-       101, 122, 85
+       48, 100, -42,
+       101, 101, 231,
+       102, 122, 86
 };
 static const int lexer_goto_row181[] = {
        3,
-       48, 100, -42,
-       101, 101, 234,
-       102, 122, 85
+       48, 116, -121,
+       117, 117, 232,
+       118, 122, 86
 };
 static const int lexer_goto_row182[] = {
        3,
-       48, 116, -120,
-       117, 117, 235,
-       118, 122, 85
+       48, 101, -39,
+       102, 102, 233,
+       103, 122, 86
 };
 static const int lexer_goto_row183[] = {
        3,
-       48, 101, -39,
-       102, 102, 236,
-       103, 122, 85
+       48, 100, -42,
+       101, 101, 234,
+       102, 122, 86
 };
 static const int lexer_goto_row184[] = {
        3,
-       48, 100, -42,
-       101, 101, 237,
-       102, 122, 85
+       48, 109, -43,
+       110, 110, 235,
+       111, 122, 86
 };
 static const int lexer_goto_row185[] = {
        3,
-       48, 109, -43,
-       110, 110, 238,
-       111, 122, 85
+       48, 100, -42,
+       101, 101, 236,
+       102, 122, 86
 };
 static const int lexer_goto_row186[] = {
        3,
        48, 100, -42,
-       101, 101, 239,
-       102, 122, 85
+       101, 101, 237,
+       102, 122, 86
 };
 static const int lexer_goto_row187[] = {
        3,
-       48, 100, -42,
-       101, 101, 240,
-       102, 122, 85
-};
-static const int lexer_goto_row188[] = {
-       3,
        48, 117, -178,
-       118, 118, 241,
-       119, 122, 85
+       118, 118, 238,
+       119, 122, 86
 };
-static const int lexer_goto_row189[] = {
+static const int lexer_goto_row188[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row190[] = {
+static const int lexer_goto_row189[] = {
        3,
        48, 107, -34,
-       108, 108, 242,
-       109, 122, 85
-};
-static const int lexer_goto_row191[] = {
-       3,
-       48, 115, -97,
-       116, 116, 243,
-       117, 122, 85
+       108, 108, 239,
+       109, 122, 86
 };
-static const int lexer_goto_row192[] = {
+static const int lexer_goto_row190[] = {
        1,
        0, 255, -126
 };
-static const int lexer_goto_row193[] = {
+static const int lexer_goto_row191[] = {
        11,
-       0, 9, 244,
-       10, 10, 245,
-       11, 12, 244,
-       13, 13, 246,
-       14, 33, 244,
-       34, 34, 247,
-       35, 91, 244,
-       92, 92, 248,
-       93, 122, 244,
-       123, 123, 249,
-       124, 255, 244
+       0, 9, 240,
+       10, 10, 241,
+       11, 12, 240,
+       13, 13, 242,
+       14, 33, 240,
+       34, 34, 243,
+       35, 91, 240,
+       92, 92, 244,
+       93, 122, 240,
+       123, 123, 245,
+       124, 255, 240
 };
-static const int lexer_goto_row194[] = {
+static const int lexer_goto_row192[] = {
        1,
        0, 255, -132
 };
-static const int lexer_goto_row195[] = {
+static const int lexer_goto_row193[] = {
        1,
        0, 255, -132
 };
-static const int lexer_goto_row196[] = {
+static const int lexer_goto_row194[] = {
        1,
        0, 255, -132
 };
-static const int lexer_goto_row197[] = {
+static const int lexer_goto_row195[] = {
        5,
        0, 33, -132,
-       34, 34, 250,
+       34, 34, 246,
        35, 122, -132,
-       123, 123, 251,
-       124, 255, 193
+       123, 123, 247,
+       124, 255, 191
 };
-static const int lexer_goto_row198[] = {
+static const int lexer_goto_row196[] = {
        3,
-       0, 9, 252,
-       11, 12, 252,
-       14, 255, 252
+       0, 9, 248,
+       11, 12, 248,
+       14, 255, 248
 };
-static const int lexer_goto_row199[] = {
+static const int lexer_goto_row197[] = {
        5,
        0, 33, -132,
-       34, 34, 253,
+       34, 34, 249,
        35, 122, -132,
-       123, 123, 254,
-       124, 255, 193
+       123, 123, 250,
+       124, 255, 191
 };
-static const int lexer_goto_row200[] = {
+static const int lexer_goto_row198[] = {
        1,
        0, 255, -136
 };
-static const int lexer_goto_row201[] = {
+static const int lexer_goto_row199[] = {
        1,
        0, 255, -136
 };
-static const int lexer_goto_row202[] = {
+static const int lexer_goto_row200[] = {
        1,
        0, 255, -136
 };
-static const int lexer_goto_row203[] = {
+static const int lexer_goto_row201[] = {
        9,
-       0, 9, 255,
-       10, 10, 256,
-       11, 12, 255,
-       13, 13, 257,
-       14, 38, 255,
-       39, 39, 258,
-       40, 91, 255,
-       92, 92, 259,
-       93, 255, 255
+       0, 9, 251,
+       10, 10, 252,
+       11, 12, 251,
+       13, 13, 253,
+       14, 38, 251,
+       39, 39, 254,
+       40, 91, 251,
+       92, 92, 255,
+       93, 255, 251
 };
-static const int lexer_goto_row204[] = {
+static const int lexer_goto_row202[] = {
        3,
-       0, 9, 260,
-       11, 12, 260,
-       14, 255, 260
+       0, 9, 256,
+       11, 12, 256,
+       14, 255, 256
 };
-static const int lexer_goto_row206[] = {
+static const int lexer_goto_row204[] = {
        1,
-       98, 98, 261
+       98, 98, 257
 };
-static const int lexer_goto_row207[] = {
+static const int lexer_goto_row205[] = {
        1,
-       0, 255, -83
+       0, 255, -84
 };
-static const int lexer_goto_row209[] = {
+static const int lexer_goto_row207[] = {
        3,
-       48, 115, -97,
-       116, 116, 262,
-       117, 122, 85
+       48, 115, -98,
+       116, 116, 258,
+       117, 122, 86
 };
-static const int lexer_goto_row210[] = {
+static const int lexer_goto_row208[] = {
        3,
        48, 113, -33,
-       114, 114, 263,
-       115, 122, 85
+       114, 114, 259,
+       115, 122, 86
 };
-static const int lexer_goto_row211[] = {
+static const int lexer_goto_row209[] = {
        3,
        48, 113, -33,
-       114, 114, 264,
-       115, 122, 85
+       114, 114, 260,
+       115, 122, 86
 };
-static const int lexer_goto_row212[] = {
+static const int lexer_goto_row210[] = {
        3,
        48, 106, -177,
-       107, 107, 265,
-       108, 122, 85
+       107, 107, 261,
+       108, 122, 86
 };
-static const int lexer_goto_row213[] = {
+static const int lexer_goto_row211[] = {
        3,
-       48, 114, -90,
-       115, 115, 266,
-       116, 122, 85
+       48, 114, -91,
+       115, 115, 262,
+       116, 122, 86
 };
-static const int lexer_goto_row214[] = {
+static const int lexer_goto_row212[] = {
        3,
-       48, 104, -103,
-       105, 105, 267,
-       106, 122, 85
+       48, 104, -104,
+       105, 105, 263,
+       106, 122, 86
 };
-static const int lexer_goto_row215[] = {
+static const int lexer_goto_row213[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row216[] = {
+static const int lexer_goto_row214[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row217[] = {
+static const int lexer_goto_row215[] = {
        3,
        48, 113, -33,
-       114, 114, 268,
-       115, 122, 85
+       114, 114, 264,
+       115, 122, 86
 };
-static const int lexer_goto_row218[] = {
+static const int lexer_goto_row216[] = {
        3,
        48, 100, -42,
-       101, 101, 269,
-       102, 122, 85
+       101, 101, 265,
+       102, 122, 86
 };
-static const int lexer_goto_row219[] = {
+static const int lexer_goto_row217[] = {
        3,
-       48, 104, -103,
-       105, 105, 270,
-       106, 122, 85
+       48, 104, -104,
+       105, 105, 266,
+       106, 122, 86
 };
-static const int lexer_goto_row220[] = {
+static const int lexer_goto_row218[] = {
        3,
        48, 113, -33,
-       114, 114, 271,
-       115, 122, 85
+       114, 114, 267,
+       115, 122, 86
 };
-static const int lexer_goto_row221[] = {
+static const int lexer_goto_row219[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row222[] = {
+static const int lexer_goto_row220[] = {
        3,
        48, 113, -33,
-       114, 114, 272,
-       115, 122, 85
+       114, 114, 268,
+       115, 122, 86
 };
-static const int lexer_goto_row223[] = {
+static const int lexer_goto_row221[] = {
        3,
-       48, 116, -120,
-       117, 117, 273,
-       118, 122, 85
+       48, 116, -121,
+       117, 117, 269,
+       118, 122, 86
 };
-static const int lexer_goto_row224[] = {
+static const int lexer_goto_row222[] = {
        3,
-       48, 115, -97,
-       116, 116, 274,
-       117, 122, 85
+       48, 115, -98,
+       116, 116, 270,
+       117, 122, 86
 };
-static const int lexer_goto_row225[] = {
+static const int lexer_goto_row223[] = {
        3,
        48, 107, -34,
-       108, 108, 275,
-       109, 122, 85
+       108, 108, 271,
+       109, 122, 86
 };
-static const int lexer_goto_row226[] = {
+static const int lexer_goto_row224[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row227[] = {
+static const int lexer_goto_row225[] = {
        3,
        48, 107, -34,
-       108, 108, 276,
-       109, 122, 85
+       108, 108, 272,
+       109, 122, 86
 };
-static const int lexer_goto_row228[] = {
+static const int lexer_goto_row226[] = {
        3,
        48, 95, -32,
-       97, 97, 277,
-       98, 122, 85
+       97, 97, 273,
+       98, 122, 86
 };
-static const int lexer_goto_row229[] = {
+static const int lexer_goto_row227[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row230[] = {
+static const int lexer_goto_row228[] = {
        3,
        48, 95, -32,
-       97, 97, 278,
-       98, 122, 85
+       97, 97, 274,
+       98, 122, 86
 };
-static const int lexer_goto_row231[] = {
+static const int lexer_goto_row229[] = {
        3,
        48, 95, -32,
-       97, 97, 279,
-       98, 122, 85
+       97, 97, 275,
+       98, 122, 86
 };
-static const int lexer_goto_row232[] = {
+static const int lexer_goto_row230[] = {
        3,
        48, 100, -42,
-       101, 101, 280,
-       102, 122, 85
-};
-static const int lexer_goto_row233[] = {
-       3,
-       48, 104, -103,
-       105, 105, 281,
-       106, 122, 85
+       101, 101, 276,
+       102, 122, 86
 };
-static const int lexer_goto_row234[] = {
+static const int lexer_goto_row231[] = {
        3,
-       48, 95, -32,
-       97, 97, 282,
-       98, 122, 85
+       48, 104, -104,
+       105, 105, 277,
+       106, 122, 86
 };
-static const int lexer_goto_row235[] = {
+static const int lexer_goto_row232[] = {
        3,
        48, 101, -39,
-       102, 102, 283,
-       103, 122, 85
+       102, 102, 278,
+       103, 122, 86
 };
-static const int lexer_goto_row236[] = {
+static const int lexer_goto_row233[] = {
        3,
        48, 113, -33,
-       114, 114, 284,
-       115, 122, 85
+       114, 114, 279,
+       115, 122, 86
 };
-static const int lexer_goto_row237[] = {
+static const int lexer_goto_row234[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row238[] = {
+static const int lexer_goto_row235[] = {
        3,
        48, 113, -33,
-       114, 114, 285,
-       115, 122, 85
+       114, 114, 280,
+       115, 122, 86
 };
-static const int lexer_goto_row239[] = {
+static const int lexer_goto_row236[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row240[] = {
+static const int lexer_goto_row237[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row241[] = {
+static const int lexer_goto_row238[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row242[] = {
+static const int lexer_goto_row239[] = {
        3,
        48, 100, -42,
-       101, 101, 286,
-       102, 122, 85
+       101, 101, 281,
+       102, 122, 86
 };
-static const int lexer_goto_row243[] = {
+static const int lexer_goto_row240[] = {
        3,
        48, 100, -42,
-       101, 101, 287,
-       102, 122, 85
-};
-static const int lexer_goto_row244[] = {
-       3,
-       48, 95, -32,
-       97, 97, 288,
-       98, 122, 85
+       101, 101, 282,
+       102, 122, 86
 };
-static const int lexer_goto_row245[] = {
+static const int lexer_goto_row241[] = {
        1,
-       0, 255, -194
+       0, 255, -192
 };
-static const int lexer_goto_row246[] = {
+static const int lexer_goto_row242[] = {
        11,
-       0, 9, 289,
-       10, 10, 245,
-       11, 12, 289,
-       13, 13, 246,
-       14, 33, 289,
-       34, 34, 290,
-       35, 91, 289,
-       92, 92, 291,
-       93, 122, 289,
-       123, 123, 292,
-       124, 255, 289
+       0, 9, 283,
+       10, 10, 241,
+       11, 12, 283,
+       13, 13, 242,
+       14, 33, 283,
+       34, 34, 284,
+       35, 91, 283,
+       92, 92, 285,
+       93, 122, 283,
+       123, 123, 286,
+       124, 255, 283
 };
-static const int lexer_goto_row247[] = {
+static const int lexer_goto_row243[] = {
        1,
-       0, 255, -247
+       0, 255, -243
 };
-static const int lexer_goto_row248[] = {
+static const int lexer_goto_row244[] = {
        5,
-       0, 33, -247,
-       34, 34, 293,
-       35, 122, -247,
-       123, 123, 294,
-       124, 255, 289
+       0, 33, -243,
+       34, 34, 287,
+       35, 122, -243,
+       123, 123, 288,
+       124, 255, 283
 };
-static const int lexer_goto_row249[] = {
+static const int lexer_goto_row245[] = {
        3,
-       0, 9, 295,
-       11, 12, 295,
-       14, 255, 295
+       0, 9, 289,
+       11, 12, 289,
+       14, 255, 289
 };
-static const int lexer_goto_row250[] = {
+static const int lexer_goto_row246[] = {
        5,
-       0, 33, -247,
-       34, 34, 296,
-       35, 122, -247,
-       123, 123, 297,
-       124, 255, 289
+       0, 33, -243,
+       34, 34, 290,
+       35, 122, -243,
+       123, 123, 291,
+       124, 255, 283
 };
-static const int lexer_goto_row251[] = {
+static const int lexer_goto_row247[] = {
        3,
        0, 33, -132,
-       34, 34, 298,
-       35, 255, -198
+       34, 34, 292,
+       35, 255, -196
 };
-static const int lexer_goto_row252[] = {
+static const int lexer_goto_row248[] = {
        3,
-       0, 122, -200,
-       123, 123, 299,
-       124, 255, 193
+       0, 122, -198,
+       123, 123, 293,
+       124, 255, 191
 };
-static const int lexer_goto_row253[] = {
+static const int lexer_goto_row249[] = {
        1,
        0, 255, -132
 };
-static const int lexer_goto_row254[] = {
+static const int lexer_goto_row250[] = {
        3,
        0, 33, -132,
-       34, 34, 300,
-       35, 255, -198
+       34, 34, 294,
+       35, 255, -196
 };
-static const int lexer_goto_row255[] = {
+static const int lexer_goto_row251[] = {
        3,
-       0, 122, -200,
-       123, 123, 301,
-       124, 255, 193
+       0, 122, -198,
+       123, 123, 295,
+       124, 255, 191
 };
-static const int lexer_goto_row256[] = {
+static const int lexer_goto_row252[] = {
        1,
        0, 255, -136
 };
-static const int lexer_goto_row257[] = {
+static const int lexer_goto_row253[] = {
        1,
        0, 255, -136
 };
-static const int lexer_goto_row258[] = {
+static const int lexer_goto_row254[] = {
        1,
        0, 255, -136
 };
-static const int lexer_goto_row259[] = {
+static const int lexer_goto_row255[] = {
        9,
-       0, 9, 302,
-       10, 10, 303,
-       11, 12, 302,
-       13, 13, 304,
-       14, 38, 302,
-       39, 39, 305,
-       40, 91, 302,
-       92, 92, 306,
-       93, 255, 302
+       0, 9, 296,
+       10, 10, 297,
+       11, 12, 296,
+       13, 13, 298,
+       14, 38, 296,
+       39, 39, 299,
+       40, 91, 296,
+       92, 92, 300,
+       93, 255, 296
 };
-static const int lexer_goto_row260[] = {
+static const int lexer_goto_row256[] = {
        3,
-       0, 9, 307,
-       11, 12, 307,
-       14, 255, 307
+       0, 9, 301,
+       11, 12, 301,
+       14, 255, 301
 };
-static const int lexer_goto_row261[] = {
+static const int lexer_goto_row257[] = {
        1,
        0, 255, -136
 };
-static const int lexer_goto_row262[] = {
+static const int lexer_goto_row258[] = {
        1,
-       117, 117, 308
+       117, 117, 302
 };
-static const int lexer_goto_row263[] = {
+static const int lexer_goto_row259[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row264[] = {
+static const int lexer_goto_row260[] = {
        3,
        48, 95, -32,
-       97, 97, 309,
-       98, 122, 85
+       97, 97, 303,
+       98, 122, 86
 };
-static const int lexer_goto_row265[] = {
+static const int lexer_goto_row261[] = {
        3,
-       48, 115, -97,
-       116, 116, 310,
-       117, 122, 85
+       48, 115, -98,
+       116, 116, 304,
+       117, 122, 86
 };
-static const int lexer_goto_row266[] = {
+static const int lexer_goto_row262[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row267[] = {
+static const int lexer_goto_row263[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row268[] = {
+static const int lexer_goto_row264[] = {
        3,
        48, 109, -43,
-       110, 110, 311,
-       111, 122, 85
+       110, 110, 305,
+       111, 122, 86
 };
-static const int lexer_goto_row269[] = {
+static const int lexer_goto_row265[] = {
        3,
        48, 109, -43,
-       110, 110, 312,
-       111, 122, 85
+       110, 110, 306,
+       111, 122, 86
 };
-static const int lexer_goto_row270[] = {
+static const int lexer_goto_row266[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row271[] = {
+static const int lexer_goto_row267[] = {
        3,
        48, 100, -42,
-       101, 101, 313,
-       102, 122, 85
+       101, 101, 307,
+       102, 122, 86
 };
-static const int lexer_goto_row272[] = {
+static const int lexer_goto_row268[] = {
        3,
-       48, 115, -97,
-       116, 116, 314,
-       117, 122, 85
+       48, 115, -98,
+       116, 116, 308,
+       117, 122, 86
 };
-static const int lexer_goto_row273[] = {
-       5,
+static const int lexer_goto_row269[] = {
+       3,
        48, 101, -39,
-       102, 102, 315,
-       103, 109, 85,
-       110, 110, 316,
-       111, 122, 85
+       102, 102, 309,
+       103, 122, 86
 };
-static const int lexer_goto_row274[] = {
+static const int lexer_goto_row270[] = {
        3,
-       48, 99, -89,
-       100, 100, 317,
-       101, 122, 85
+       48, 99, -90,
+       100, 100, 310,
+       101, 122, 86
 };
-static const int lexer_goto_row275[] = {
+static const int lexer_goto_row271[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row276[] = {
+static const int lexer_goto_row272[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row277[] = {
+static const int lexer_goto_row273[] = {
        3,
        48, 100, -42,
-       101, 101, 318,
-       102, 122, 85
+       101, 101, 311,
+       102, 122, 86
 };
-static const int lexer_goto_row278[] = {
+static const int lexer_goto_row274[] = {
        3,
        48, 97, -32,
-       98, 98, 319,
-       99, 122, 85
+       98, 98, 312,
+       99, 122, 86
 };
-static const int lexer_goto_row279[] = {
+static const int lexer_goto_row275[] = {
        4,
        48, 95, -32,
-       97, 102, 85,
-       103, 103, 320,
-       104, 122, 85
-};
-static const int lexer_goto_row280[] = {
-       3,
-       48, 115, -97,
-       116, 116, 321,
-       117, 122, 85
+       97, 102, 86,
+       103, 103, 313,
+       104, 122, 86
 };
-static const int lexer_goto_row281[] = {
+static const int lexer_goto_row276[] = {
        3,
-       48, 98, -111,
-       99, 99, 322,
-       100, 122, 85
+       48, 115, -98,
+       116, 116, 314,
+       117, 122, 86
 };
-static const int lexer_goto_row282[] = {
+static const int lexer_goto_row277[] = {
        3,
-       48, 98, -111,
-       99, 99, 323,
-       100, 122, 85
+       48, 98, -112,
+       99, 99, 315,
+       100, 122, 86
 };
-static const int lexer_goto_row283[] = {
+static const int lexer_goto_row278[] = {
        3,
-       48, 97, -32,
-       98, 98, 324,
-       99, 122, 85
+       48, 98, -112,
+       99, 99, 316,
+       100, 122, 86
 };
-static const int lexer_goto_row284[] = {
+static const int lexer_goto_row279[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row285[] = {
+static const int lexer_goto_row280[] = {
        3,
        48, 109, -43,
-       110, 110, 325,
-       111, 122, 85
+       110, 110, 317,
+       111, 122, 86
 };
-static const int lexer_goto_row286[] = {
+static const int lexer_goto_row281[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row287[] = {
+static const int lexer_goto_row282[] = {
        3,
        48, 113, -33,
-       114, 114, 326,
-       115, 122, 85
+       114, 114, 318,
+       115, 122, 86
 };
-static const int lexer_goto_row288[] = {
+static const int lexer_goto_row283[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row289[] = {
-       3,
-       48, 97, -32,
-       98, 98, 327,
-       99, 122, 85
-};
-static const int lexer_goto_row290[] = {
+static const int lexer_goto_row284[] = {
        1,
-       0, 255, -247
+       0, 255, -243
 };
-static const int lexer_goto_row291[] = {
+static const int lexer_goto_row285[] = {
        1,
-       0, 255, -249
+       0, 255, -245
 };
-static const int lexer_goto_row292[] = {
+static const int lexer_goto_row286[] = {
        3,
-       0, 9, 328,
-       11, 12, 328,
-       14, 255, 328
+       0, 9, 319,
+       11, 12, 319,
+       14, 255, 319
 };
-static const int lexer_goto_row293[] = {
+static const int lexer_goto_row287[] = {
        1,
-       0, 255, -251
+       0, 255, -247
 };
-static const int lexer_goto_row294[] = {
+static const int lexer_goto_row288[] = {
        3,
-       0, 33, -247,
-       34, 34, 329,
-       35, 255, -249
+       0, 33, -243,
+       34, 34, 320,
+       35, 255, -245
 };
-static const int lexer_goto_row295[] = {
+static const int lexer_goto_row289[] = {
        3,
-       0, 122, -251,
-       123, 123, 330,
-       124, 255, 289
+       0, 122, -247,
+       123, 123, 321,
+       124, 255, 283
 };
-static const int lexer_goto_row296[] = {
+static const int lexer_goto_row290[] = {
        1,
-       0, 255, -194
+       0, 255, -192
 };
-static const int lexer_goto_row297[] = {
+static const int lexer_goto_row291[] = {
        3,
-       0, 33, -247,
-       34, 34, 331,
-       35, 255, -249
+       0, 33, -243,
+       34, 34, 322,
+       35, 255, -245
 };
-static const int lexer_goto_row298[] = {
+static const int lexer_goto_row292[] = {
        3,
-       0, 122, -251,
-       123, 123, 332,
-       124, 255, 289
+       0, 122, -247,
+       123, 123, 323,
+       124, 255, 283
 };
-static const int lexer_goto_row299[] = {
+static const int lexer_goto_row293[] = {
        1,
-       34, 34, 333
+       34, 34, 324
 };
-static const int lexer_goto_row300[] = {
+static const int lexer_goto_row294[] = {
        1,
-       0, 255, -256
+       0, 255, -252
 };
-static const int lexer_goto_row301[] = {
+static const int lexer_goto_row295[] = {
        1,
-       0, 255, -252
+       0, 255, -248
 };
-static const int lexer_goto_row302[] = {
+static const int lexer_goto_row296[] = {
        1,
-       123, 123, 334
+       123, 123, 325
 };
-static const int lexer_goto_row303[] = {
+static const int lexer_goto_row297[] = {
        1,
        0, 255, -136
 };
-static const int lexer_goto_row304[] = {
+static const int lexer_goto_row298[] = {
        1,
        0, 255, -136
 };
-static const int lexer_goto_row305[] = {
+static const int lexer_goto_row299[] = {
        1,
        0, 255, -136
 };
-static const int lexer_goto_row307[] = {
+static const int lexer_goto_row301[] = {
        3,
-       0, 9, 335,
-       11, 12, 335,
-       14, 255, 335
+       0, 9, 326,
+       11, 12, 326,
+       14, 255, 326
 };
-static const int lexer_goto_row308[] = {
+static const int lexer_goto_row302[] = {
        1,
        0, 255, -136
 };
-static const int lexer_goto_row309[] = {
+static const int lexer_goto_row303[] = {
        1,
-       103, 103, 336
+       103, 103, 327
 };
-static const int lexer_goto_row310[] = {
+static const int lexer_goto_row304[] = {
        3,
-       48, 98, -111,
-       99, 99, 337,
-       100, 122, 85
+       48, 98, -112,
+       99, 99, 328,
+       100, 122, 86
 };
-static const int lexer_goto_row311[] = {
+static const int lexer_goto_row305[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row312[] = {
+static const int lexer_goto_row306[] = {
        3,
-       48, 116, -120,
-       117, 117, 338,
-       118, 122, 85
+       48, 116, -121,
+       117, 117, 329,
+       118, 122, 86
 };
-static const int lexer_goto_row313[] = {
+static const int lexer_goto_row307[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row314[] = {
+static const int lexer_goto_row308[] = {
        3,
-       48, 114, -90,
-       115, 115, 339,
-       116, 122, 85
+       48, 114, -91,
+       115, 115, 330,
+       116, 122, 86
 };
-static const int lexer_goto_row315[] = {
+static const int lexer_goto_row309[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row316[] = {
+static const int lexer_goto_row310[] = {
        3,
        48, 95, -32,
-       97, 97, 340,
-       98, 122, 85
-};
-static const int lexer_goto_row317[] = {
-       1,
-       48, 122, -38
+       97, 97, 331,
+       98, 122, 86
 };
-static const int lexer_goto_row318[] = {
+static const int lexer_goto_row311[] = {
        3,
        48, 100, -42,
-       101, 101, 341,
-       102, 122, 85
+       101, 101, 332,
+       102, 122, 86
 };
-static const int lexer_goto_row319[] = {
+static const int lexer_goto_row312[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row320[] = {
+static const int lexer_goto_row313[] = {
        3,
        48, 107, -34,
-       108, 108, 342,
-       109, 122, 85
+       108, 108, 333,
+       109, 122, 86
 };
-static const int lexer_goto_row321[] = {
+static const int lexer_goto_row314[] = {
        3,
        48, 100, -42,
-       101, 101, 343,
-       102, 122, 85
+       101, 101, 334,
+       102, 122, 86
 };
-static const int lexer_goto_row322[] = {
+static const int lexer_goto_row315[] = {
        3,
        48, 100, -42,
-       101, 101, 344,
-       102, 122, 85
+       101, 101, 335,
+       102, 122, 86
 };
-static const int lexer_goto_row323[] = {
+static const int lexer_goto_row316[] = {
        3,
-       48, 115, -97,
-       116, 116, 345,
-       117, 122, 85
+       48, 115, -98,
+       116, 116, 336,
+       117, 122, 86
 };
-static const int lexer_goto_row324[] = {
+static const int lexer_goto_row317[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row325[] = {
-       3,
-       48, 107, -34,
-       108, 108, 346,
-       109, 122, 85
-};
-static const int lexer_goto_row326[] = {
+static const int lexer_goto_row318[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row327[] = {
-       3,
-       48, 114, -90,
-       115, 115, 347,
-       116, 122, 85
-};
-static const int lexer_goto_row328[] = {
+static const int lexer_goto_row319[] = {
        3,
-       48, 107, -34,
-       108, 108, 348,
-       109, 122, 85
+       48, 114, -91,
+       115, 115, 337,
+       116, 122, 86
 };
-static const int lexer_goto_row329[] = {
+static const int lexer_goto_row320[] = {
        1,
-       0, 255, -247
+       0, 255, -243
 };
-static const int lexer_goto_row330[] = {
+static const int lexer_goto_row321[] = {
        1,
-       34, 34, 349
+       34, 34, 338
 };
-static const int lexer_goto_row331[] = {
+static const int lexer_goto_row322[] = {
        1,
-       0, 255, -299
+       0, 255, -293
 };
-static const int lexer_goto_row332[] = {
+static const int lexer_goto_row323[] = {
        1,
-       0, 255, -295
+       0, 255, -289
 };
-static const int lexer_goto_row333[] = {
+static const int lexer_goto_row324[] = {
        1,
-       123, 123, 350
+       123, 123, 339
 };
-static const int lexer_goto_row334[] = {
+static const int lexer_goto_row325[] = {
        1,
-       34, 34, 333
+       34, 34, 324
 };
-static const int lexer_goto_row335[] = {
+static const int lexer_goto_row326[] = {
        1,
-       123, 123, 334
+       123, 123, 325
 };
-static const int lexer_goto_row336[] = {
+static const int lexer_goto_row327[] = {
        1,
        0, 255, -136
 };
-static const int lexer_goto_row337[] = {
+static const int lexer_goto_row328[] = {
        1,
-       95, 95, 351
+       95, 95, 340
 };
-static const int lexer_goto_row338[] = {
+static const int lexer_goto_row329[] = {
        3,
-       48, 115, -97,
-       116, 116, 352,
-       117, 122, 85
+       48, 115, -98,
+       116, 116, 341,
+       117, 122, 86
 };
-static const int lexer_goto_row339[] = {
+static const int lexer_goto_row330[] = {
        3,
        48, 100, -42,
-       101, 101, 353,
-       102, 122, 85
+       101, 101, 342,
+       102, 122, 86
 };
-static const int lexer_goto_row340[] = {
+static const int lexer_goto_row331[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row341[] = {
+static const int lexer_goto_row332[] = {
        3,
-       48, 98, -111,
-       99, 99, 354,
-       100, 122, 85
+       48, 98, -112,
+       99, 99, 343,
+       100, 122, 86
 };
-static const int lexer_goto_row342[] = {
+static const int lexer_goto_row333[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row343[] = {
+static const int lexer_goto_row334[] = {
        3,
        48, 100, -42,
-       101, 101, 355,
-       102, 122, 85
+       101, 101, 344,
+       102, 122, 86
 };
-static const int lexer_goto_row344[] = {
+static const int lexer_goto_row335[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row345[] = {
+static const int lexer_goto_row336[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row346[] = {
-       3,
-       48, 100, -42,
-       101, 101, 356,
-       102, 122, 85
-};
-static const int lexer_goto_row347[] = {
+static const int lexer_goto_row337[] = {
        3,
        48, 100, -42,
-       101, 101, 357,
-       102, 122, 85
+       101, 101, 345,
+       102, 122, 86
 };
-static const int lexer_goto_row348[] = {
+static const int lexer_goto_row338[] = {
        3,
        48, 95, -32,
-       97, 97, 358,
-       98, 122, 85
-};
-static const int lexer_goto_row349[] = {
-       3,
-       48, 100, -42,
-       101, 101, 359,
-       102, 122, 85
+       97, 97, 346,
+       98, 122, 86
 };
-static const int lexer_goto_row350[] = {
+static const int lexer_goto_row339[] = {
        1,
-       34, 34, 349
+       34, 34, 338
 };
-static const int lexer_goto_row351[] = {
+static const int lexer_goto_row340[] = {
        1,
-       123, 123, 350
+       123, 123, 339
 };
-static const int lexer_goto_row352[] = {
+static const int lexer_goto_row341[] = {
        1,
-       95, 95, 360
+       95, 95, 347
 };
-static const int lexer_goto_row353[] = {
+static const int lexer_goto_row342[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row354[] = {
+static const int lexer_goto_row343[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row355[] = {
+static const int lexer_goto_row344[] = {
        3,
        48, 100, -42,
-       101, 101, 361,
-       102, 122, 85
+       101, 101, 348,
+       102, 122, 86
 };
-static const int lexer_goto_row356[] = {
+static const int lexer_goto_row345[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row357[] = {
+static const int lexer_goto_row346[] = {
        3,
-       48, 99, -89,
-       100, 100, 362,
-       101, 122, 85
-};
-static const int lexer_goto_row358[] = {
-       1,
-       48, 122, -38
+       48, 99, -90,
+       100, 100, 349,
+       101, 122, 86
 };
-static const int lexer_goto_row359[] = {
+static const int lexer_goto_row347[] = {
        3,
        48, 107, -34,
-       108, 108, 363,
-       109, 122, 85
-};
-static const int lexer_goto_row360[] = {
-       1,
-       48, 122, -38
+       108, 108, 350,
+       109, 122, 86
 };
-static const int lexer_goto_row362[] = {
+static const int lexer_goto_row349[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row363[] = {
+static const int lexer_goto_row350[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row364[] = {
+static const int lexer_goto_row351[] = {
        1,
        48, 122, -38
 };
@@ -1944,7 +1864,7 @@ const int* const lexer_goto_table[] = {
        lexer_goto_row10,
        lexer_goto_row_null,
        lexer_goto_row_null,
-       lexer_goto_row_null,
+       lexer_goto_row13,
        lexer_goto_row14,
        lexer_goto_row_null,
        lexer_goto_row16,
@@ -1996,18 +1916,18 @@ const int* const lexer_goto_table[] = {
        lexer_goto_row62,
        lexer_goto_row_null,
        lexer_goto_row_null,
-       lexer_goto_row65,
+       lexer_goto_row_null,
        lexer_goto_row66,
        lexer_goto_row67,
        lexer_goto_row68,
        lexer_goto_row69,
+       lexer_goto_row70,
        lexer_goto_row_null,
        lexer_goto_row_null,
-       lexer_goto_row72,
+       lexer_goto_row73,
        lexer_goto_row_null,
        lexer_goto_row_null,
        lexer_goto_row_null,
-       lexer_goto_row76,
        lexer_goto_row77,
        lexer_goto_row78,
        lexer_goto_row79,
@@ -2134,12 +2054,12 @@ const int* const lexer_goto_table[] = {
        lexer_goto_row200,
        lexer_goto_row201,
        lexer_goto_row202,
-       lexer_goto_row203,
+       lexer_goto_row_null,
        lexer_goto_row204,
+       lexer_goto_row205,
        lexer_goto_row_null,
-       lexer_goto_row206,
        lexer_goto_row207,
-       lexer_goto_row_null,
+       lexer_goto_row208,
        lexer_goto_row209,
        lexer_goto_row210,
        lexer_goto_row211,
@@ -2231,13 +2151,13 @@ const int* const lexer_goto_table[] = {
        lexer_goto_row297,
        lexer_goto_row298,
        lexer_goto_row299,
-       lexer_goto_row300,
+       lexer_goto_row_null,
        lexer_goto_row301,
        lexer_goto_row302,
        lexer_goto_row303,
        lexer_goto_row304,
        lexer_goto_row305,
-       lexer_goto_row_null,
+       lexer_goto_row306,
        lexer_goto_row307,
        lexer_goto_row308,
        lexer_goto_row309,
@@ -2279,35 +2199,22 @@ const int* const lexer_goto_table[] = {
        lexer_goto_row345,
        lexer_goto_row346,
        lexer_goto_row347,
-       lexer_goto_row348,
+       lexer_goto_row_null,
        lexer_goto_row349,
        lexer_goto_row350,
-       lexer_goto_row351,
-       lexer_goto_row352,
-       lexer_goto_row353,
-       lexer_goto_row354,
-       lexer_goto_row355,
-       lexer_goto_row356,
-       lexer_goto_row357,
-       lexer_goto_row358,
-       lexer_goto_row359,
-       lexer_goto_row360,
-       lexer_goto_row_null,
-       lexer_goto_row362,
-       lexer_goto_row363,
-       lexer_goto_row364
+       lexer_goto_row351
 };
 
 const int lexer_accept_table[] = {
-       -1,0,1,1,0,82,95,2,72,-1,55,56,70,68,59,69,67,71,87,87,60,75,62,78,83,84,57,58,-1,-1,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,95,1,74,95,90,-1,91,2,2,2,96,96,96,63,64,66,89,-1,-1,-1,61,77,76,73,79,80,84,84,84,84,-1,86,-1,85,85,85,85,85,85,50,85,85,85,16,85,85,85,85,85,85,26,85,32,15,85,85,85,85,85,85,85,34,85,85,85,85,85,85,85,85,85,85,85,85,85,95,93,-1,92,95,90,95,95,2,94,95,96,65,88,88,88,81,-1,86,86,86,86,-1,-1,-1,85,85,33,85,85,85,85,85,10,85,85,85,31,11,85,85,85,43,85,85,85,85,42,35,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,19,85,85,95,95,95,95,95,-1,-1,-1,95,95,95,-1,-1,94,-1,-1,97,85,85,85,85,85,85,28,9,85,85,85,85,13,85,85,85,85,30,85,49,44,85,85,85,85,85,85,85,46,85,27,47,12,85,85,85,95,-1,-1,93,-1,92,-1,-1,95,-1,-1,95,95,95,-1,-1,95,-1,40,85,85,39,6,85,85,48,85,85,85,85,52,53,85,85,85,85,85,85,85,14,85,45,85,29,85,-1,-1,-1,-1,-1,-1,95,-1,-1,90,-1,-1,91,95,95,95,90,-1,95,-1,85,41,85,21,85,5,85,20,85,4,85,85,85,85,22,85,37,85,85,-1,93,-1,-1,92,90,91,95,-1,85,85,36,85,25,85,3,24,85,85,85,85,93,92,-1,7,38,85,51,85,17,85,18,54,8,23,9
+       -1,0,1,1,0,80,93,2,70,-1,52,53,67,65,56,66,64,69,85,85,57,73,59,76,81,82,54,55,-1,-1,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,93,1,72,93,88,-1,89,2,2,2,94,94,94,68,60,61,63,87,-1,-1,-1,58,75,74,71,77,78,82,82,82,82,-1,84,-1,83,83,83,83,83,83,47,83,83,83,16,83,83,83,83,83,83,23,83,29,15,83,83,83,83,83,83,83,31,83,83,83,83,83,83,83,83,83,83,83,83,93,91,-1,90,93,88,93,93,2,92,93,94,62,86,86,86,79,-1,84,84,84,84,-1,-1,-1,83,83,30,83,83,83,83,83,10,83,83,83,28,11,83,83,83,40,83,83,83,83,39,32,83,83,83,83,83,83,83,83,83,83,83,83,83,83,17,83,93,93,93,93,93,-1,-1,-1,93,93,93,-1,-1,92,-1,-1,95,83,83,83,83,83,83,25,9,83,83,83,83,13,83,83,83,83,27,83,46,41,83,83,83,83,83,83,43,83,24,44,12,83,83,93,-1,-1,91,-1,90,-1,-1,93,-1,-1,93,93,93,-1,-1,93,-1,37,83,83,36,6,83,83,45,83,83,83,83,49,50,83,83,83,83,83,83,14,83,42,83,26,-1,-1,-1,-1,-1,-1,93,-1,-1,88,-1,-1,89,93,93,93,88,-1,93,-1,83,38,83,18,83,5,83,83,4,83,83,83,83,19,34,83,-1,91,-1,-1,90,88,89,93,-1,83,83,33,83,22,83,3,21,83,83,91,90,-1,7,35,83,48,83,83,51,8,20,9
 };
 
 static int parser_action_row1[] = {
        4,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2,
-       97, 1, 22
+       95, 1, 22
 };
 static int parser_action_row2[] = {
        1,
@@ -2320,14 +2227,14 @@ static int parser_action_row3[] = {
 static int parser_action_row4[] = {
        2,
        -1, 3, 3,
-       97, 2, -1
+       95, 2, -1
 };
 static int parser_action_row5[] = {
        4,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2,
-       97, 1, 22
+       95, 1, 22
 };
 static int parser_action_row6[] = {
        1,
@@ -2355,8 +2262,8 @@ static int parser_action_row11[] = {
 };
 static int parser_action_row12[] = {
        2,
-       -1, 1, 386,
-       97, 1, 23
+       -1, 1, 377,
+       95, 1, 23
 };
 static int parser_action_row13[] = {
        34,
@@ -2364,40 +2271,40 @@ static int parser_action_row13[] = {
        12, 0, 26,
        13, 0, 27,
        15, 0, 28,
-       18, 0, 29,
-       25, 0, 30,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       31, 0, 34,
-       36, 0, 35,
-       37, 0, 36,
-       38, 0, 37,
-       39, 0, 38,
-       40, 0, 39,
-       41, 0, 40,
-       44, 1, 367,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 45,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       85, 1, 367,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55,
-       96, 0, 56
+       16, 0, 29,
+       22, 0, 30,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       28, 0, 34,
+       33, 0, 35,
+       34, 0, 36,
+       35, 0, 37,
+       36, 0, 38,
+       37, 0, 39,
+       38, 0, 40,
+       41, 1, 358,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 45,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       83, 1, 358,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55,
+       94, 0, 56
 };
 static int parser_action_row14[] = {
        2,
-       -1, 1, 384,
+       -1, 1, 375,
        1, 0, 2
 };
 static int parser_action_row15[] = {
@@ -2407,40 +2314,40 @@ static int parser_action_row15[] = {
 static int parser_action_row16[] = {
        3,
        -1, 3, 15,
-       0, 0, 82,
-       1, 0, 83
+       0, 0, 83,
+       1, 0, 84
 };
 static int parser_action_row17[] = {
        4,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2,
-       97, 1, 22
+       95, 1, 22
 };
 static int parser_action_row18[] = {
        4,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2,
-       97, 1, 22
+       95, 1, 22
 };
 static int parser_action_row19[] = {
        4,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2,
-       97, 1, 22
+       95, 1, 22
 };
 static int parser_action_row20[] = {
        3,
-       -1, 1, 382,
+       -1, 1, 373,
        0, 0, 1,
-       1, 0, 96
+       1, 0, 97
 };
 static int parser_action_row21[] = {
        2,
-       -1, 1, 389,
-       0, 0, 98
+       -1, 1, 380,
+       0, 0, 99
 };
 static int parser_action_row22[] = {
        1,
@@ -2452,86 +2359,86 @@ static int parser_action_row23[] = {
        12, 0, 26,
        13, 0, 27,
        15, 0, 28,
-       18, 0, 29,
-       25, 0, 30,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       31, 0, 34,
-       36, 0, 35,
-       37, 0, 36,
-       38, 0, 37,
-       39, 0, 38,
-       40, 0, 39,
-       41, 0, 40,
-       44, 1, 367,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 45,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       85, 1, 367,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55,
-       96, 0, 56
+       16, 0, 29,
+       22, 0, 30,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       28, 0, 34,
+       33, 0, 35,
+       34, 0, 36,
+       35, 0, 37,
+       36, 0, 38,
+       37, 0, 39,
+       38, 0, 40,
+       41, 1, 358,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 45,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       83, 1, 358,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55,
+       94, 0, 56
 };
 static int parser_action_row24[] = {
        4,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2,
-       97, 1, 22
+       95, 1, 22
 };
 static int parser_action_row25[] = {
        4,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2,
-       97, 1, 22
+       95, 1, 22
 };
 static int parser_action_row26[] = {
        4,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2,
-       97, 1, 22
+       95, 1, 22
 };
 static int parser_action_row27[] = {
        26,
-       -1, 1, 353,
-       12, 0, 106,
-       25, 0, 107,
-       34, 0, 108,
-       41, 0, 109,
-       43, 0, 110,
-       44, 1, 367,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       54, 0, 116,
-       56, 1, 349,
-       64, 1, 349,
-       66, 1, 349,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       85, 1, 367,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       -1, 1, 344,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 358,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       51, 0, 117,
+       53, 1, 340,
+       61, 1, 340,
+       63, 1, 340,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       83, 1, 358,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
 static int parser_action_row28[] = {
        1,
@@ -2539,271 +2446,271 @@ static int parser_action_row28[] = {
 };
 static int parser_action_row29[] = {
        32,
-       -1, 1, 367,
+       -1, 1, 358,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 139,
+       9, 0, 142,
        12, 0, 26,
        15, 0, 28,
-       18, 0, 29,
-       25, 0, 30,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       36, 0, 35,
-       37, 0, 36,
-       38, 0, 37,
-       39, 0, 38,
-       40, 0, 39,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 45,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       16, 0, 29,
+       22, 0, 30,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       33, 0, 35,
+       34, 0, 36,
+       35, 0, 37,
+       36, 0, 38,
+       37, 0, 39,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 45,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row30[] = {
        2,
        -1, 3, 29,
-       84, 0, 144
+       82, 0, 147
 };
 static int parser_action_row31[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row32[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row33[] = {
        32,
-       -1, 1, 367,
+       -1, 1, 358,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 139,
+       9, 0, 142,
        12, 0, 26,
        15, 0, 28,
-       18, 0, 29,
-       25, 0, 30,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       36, 0, 35,
-       37, 0, 36,
-       38, 0, 37,
-       39, 0, 38,
-       40, 0, 39,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 45,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       16, 0, 29,
+       22, 0, 30,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       33, 0, 35,
+       34, 0, 36,
+       35, 0, 37,
+       36, 0, 38,
+       37, 0, 39,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 45,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row34[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row35[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row36[] = {
        24,
-       -1, 1, 180,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       44, 1, 367,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       85, 1, 367,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 164,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       41, 1, 358,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       83, 1, 358,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row37[] = {
        2,
-       -1, 1, 185,
-       52, 0, 171
+       -1, 1, 169,
+       49, 0, 175
 };
 static int parser_action_row38[] = {
        2,
-       -1, 1, 182,
-       52, 0, 171
+       -1, 1, 166,
+       49, 0, 175
 };
 static int parser_action_row39[] = {
        1,
-       -1, 1, 184
+       -1, 1, 168
 };
 static int parser_action_row40[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 174,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 178,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row41[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row42[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
 static int parser_action_row43[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
 static int parser_action_row44[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
 static int parser_action_row45[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
 static int parser_action_row46[] = {
        2,
        -1, 3, 45,
-       11, 0, 186
+       11, 0, 190
 };
 static int parser_action_row47[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row48[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row49[] = {
        2,
        -1, 3, 48,
-       60, 0, 189
+       57, 0, 193
 };
 static int parser_action_row50[] = {
        2,
-       -1, 1, 368,
-       60, 0, 190
+       -1, 1, 359,
+       57, 0, 194
 };
 static int parser_action_row51[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
 static int parser_action_row52[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
 static int parser_action_row53[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
 static int parser_action_row54[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
 static int parser_action_row55[] = {
        1,
-       -1, 1, 311
+       -1, 1, 298
 };
 static int parser_action_row56[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
 static int parser_action_row57[] = {
        1,
-       -1, 1, 152
+       -1, 1, 136
 };
 static int parser_action_row58[] = {
        5,
-       -1, 1, 97,
-       21, 0, 196,
-       22, 0, 197,
-       23, 0, 198,
-       24, 0, 199
+       -1, 1, 80,
+       18, 0, 200,
+       19, 0, 201,
+       20, 0, 202,
+       21, 0, 203
 };
 static int parser_action_row59[] = {
        2,
        -1, 3, 58,
-       96, 0, 201
+       94, 0, 205
 };
 static int parser_action_row60[] = {
        1,
-       -1, 1, 156
+       -1, 1, 140
 };
 static int parser_action_row61[] = {
        1,
@@ -2815,12366 +2722,12156 @@ static int parser_action_row62[] = {
 };
 static int parser_action_row63[] = {
        3,
-       -1, 1, 171,
+       -1, 1, 155,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row64[] = {
        1,
-       -1, 1, 178
+       -1, 1, 162
 };
 static int parser_action_row65[] = {
        1,
-       -1, 1, 179
+       -1, 1, 163
 };
 static int parser_action_row66[] = {
        1,
-       -1, 1, 187
+       -1, 1, 171
 };
 static int parser_action_row67[] = {
        1,
-       -1, 1, 188
+       -1, 1, 172
 };
 static int parser_action_row68[] = {
        1,
-       -1, 1, 190
+       -1, 1, 174
 };
 static int parser_action_row69[] = {
        1,
-       -1, 1, 189
+       -1, 1, 173
 };
 static int parser_action_row70[] = {
        1,
-       -1, 1, 191
+       -1, 1, 175
 };
 static int parser_action_row71[] = {
        1,
-       -1, 1, 192
+       -1, 1, 176
 };
 static int parser_action_row72[] = {
        4,
        -1, 3, 71,
-       56, 0, 205,
-       64, 0, 206,
-       66, 0, 207
+       53, 0, 209,
+       61, 0, 210,
+       63, 0, 211
 };
 static int parser_action_row73[] = {
        1,
-       -1, 1, 301
+       -1, 1, 266
 };
 static int parser_action_row74[] = {
-       3,
-       -1, 3, 73,
-       91, 0, 209,
-       92, 0, 210
+       1,
+       -1, 1, 289
 };
 static int parser_action_row75[] = {
        3,
-       -1, 1, 385,
+       -1, 3, 74,
+       89, 0, 213,
+       90, 0, 214
+};
+static int parser_action_row76[] = {
+       3,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row76[] = {
+static int parser_action_row77[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
-static int parser_action_row77[] = {
+static int parser_action_row78[] = {
        3,
-       -1, 3, 76,
-       44, 0, 217,
-       85, 0, 218
+       -1, 3, 77,
+       41, 0, 221,
+       83, 0, 222
 };
-static int parser_action_row78[] = {
+static int parser_action_row79[] = {
        29,
-       -1, 1, 349,
-       0, 1, 353,
-       1, 1, 353,
-       9, 1, 353,
-       12, 0, 106,
-       25, 0, 107,
-       34, 0, 108,
-       41, 0, 109,
-       43, 0, 110,
-       44, 1, 367,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       54, 0, 116,
-       55, 1, 353,
-       58, 1, 353,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       85, 1, 367,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122,
-       97, 1, 353
+       -1, 1, 340,
+       0, 1, 344,
+       1, 1, 344,
+       9, 1, 344,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 358,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       51, 0, 117,
+       52, 1, 344,
+       55, 1, 344,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       83, 1, 358,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123,
+       95, 1, 344
 };
-static int parser_action_row79[] = {
+static int parser_action_row80[] = {
        1,
        -1, 1, 824
 };
-static int parser_action_row80[] = {
+static int parser_action_row81[] = {
        3,
-       -1, 1, 364,
-       12, 0, 221,
-       84, 0, 222
+       -1, 1, 355,
+       12, 0, 225,
+       82, 0, 226
 };
-static int parser_action_row81[] = {
+static int parser_action_row82[] = {
        4,
-       -1, 1, 366,
-       12, 0, 223,
-       83, 0, 48,
-       84, 0, 224
+       -1, 1, 357,
+       12, 0, 227,
+       81, 0, 48,
+       82, 0, 228
 };
-static int parser_action_row82[] = {
+static int parser_action_row83[] = {
        3,
-       -1, 1, 383,
+       -1, 1, 374,
        0, 0, 1,
-       1, 0, 96
-};
-static int parser_action_row83[] = {
-       1,
-       -1, 1, 381
+       1, 0, 97
 };
 static int parser_action_row84[] = {
        1,
-       -1, 1, 380
+       -1, 1, 372
 };
 static int parser_action_row85[] = {
        1,
-       -1, 1, 390
+       -1, 1, 371
 };
 static int parser_action_row86[] = {
        1,
-       -1, 1, 793
+       -1, 1, 381
 };
 static int parser_action_row87[] = {
        1,
-       -1, 1, 2
+       -1, 1, 793
 };
 static int parser_action_row88[] = {
+       1,
+       -1, 1, 2
+};
+static int parser_action_row89[] = {
        4,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2,
-       97, 1, 22
+       95, 1, 22
 };
-static int parser_action_row89[] = {
+static int parser_action_row90[] = {
        4,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2,
-       97, 1, 22
+       95, 1, 22
 };
-static int parser_action_row90[] = {
+static int parser_action_row91[] = {
        1,
        -1, 1, 4
 };
-static int parser_action_row91[] = {
+static int parser_action_row92[] = {
        1,
        -1, 1, 795
 };
-static int parser_action_row92[] = {
+static int parser_action_row93[] = {
        34,
        -1, 1, 42,
        12, 0, 26,
        13, 0, 27,
        15, 0, 28,
-       18, 0, 29,
-       25, 0, 30,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       31, 0, 34,
-       36, 0, 35,
-       37, 0, 36,
-       38, 0, 37,
-       39, 0, 38,
-       40, 0, 39,
-       41, 0, 40,
-       44, 1, 367,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 45,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       85, 1, 367,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55,
-       96, 0, 56
+       16, 0, 29,
+       22, 0, 30,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       28, 0, 34,
+       33, 0, 35,
+       34, 0, 36,
+       35, 0, 37,
+       36, 0, 38,
+       37, 0, 39,
+       38, 0, 40,
+       41, 1, 358,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 45,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       83, 1, 358,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55,
+       94, 0, 56
 };
-static int parser_action_row93[] = {
+static int parser_action_row94[] = {
        4,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2,
-       97, 1, 22
+       95, 1, 22
 };
-static int parser_action_row94[] = {
+static int parser_action_row95[] = {
        1,
        -1, 1, 797
 };
-static int parser_action_row95[] = {
+static int parser_action_row96[] = {
        1,
        -1, 1, 8
 };
-static int parser_action_row96[] = {
+static int parser_action_row97[] = {
        32,
        -1, 1, 42,
        12, 0, 26,
        13, 0, 27,
        15, 0, 28,
-       18, 0, 29,
-       25, 0, 30,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       36, 0, 35,
-       37, 0, 36,
-       38, 0, 37,
-       39, 0, 38,
-       40, 0, 39,
-       41, 0, 40,
-       44, 1, 367,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 45,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       85, 1, 367,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       16, 0, 29,
+       22, 0, 30,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       33, 0, 35,
+       34, 0, 36,
+       35, 0, 37,
+       36, 0, 38,
+       37, 0, 39,
+       38, 0, 40,
+       41, 1, 358,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 45,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       83, 1, 358,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row97[] = {
+static int parser_action_row98[] = {
        1,
        -1, 1, 827
 };
-static int parser_action_row98[] = {
+static int parser_action_row99[] = {
        2,
-       -1, 1, 387,
-       0, 0, 98
+       -1, 1, 378,
+       0, 0, 99
 };
-static int parser_action_row99[] = {
+static int parser_action_row100[] = {
        1,
        -1, 1, 829
 };
-static int parser_action_row100[] = {
+static int parser_action_row101[] = {
        5,
-       -1, 1, 97,
-       21, 0, 196,
-       22, 0, 197,
-       23, 0, 198,
-       24, 0, 199
+       -1, 1, 80,
+       18, 0, 200,
+       19, 0, 201,
+       20, 0, 202,
+       21, 0, 203
 };
-static int parser_action_row101[] = {
+static int parser_action_row102[] = {
        1,
        -1, 1, 3
 };
-static int parser_action_row102[] = {
+static int parser_action_row103[] = {
        4,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2,
-       97, 1, 22
+       95, 1, 22
 };
-static int parser_action_row103[] = {
+static int parser_action_row104[] = {
        4,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2,
-       97, 1, 22
+       95, 1, 22
 };
-static int parser_action_row104[] = {
+static int parser_action_row105[] = {
        1,
        -1, 1, 5
 };
-static int parser_action_row105[] = {
+static int parser_action_row106[] = {
        4,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2,
-       97, 1, 22
+       95, 1, 22
 };
-static int parser_action_row106[] = {
+static int parser_action_row107[] = {
        1,
        -1, 1, 9
 };
-static int parser_action_row107[] = {
-       2,
-       -1, 1, 349,
-       54, 0, 238
-};
 static int parser_action_row108[] = {
-       3,
-       -1, 1, 385,
-       0, 0, 1,
-       1, 0, 2
+       2,
+       -1, 1, 340,
+       51, 0, 242
 };
 static int parser_action_row109[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row110[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row111[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row112[] = {
-       2,
-       -1, 1, 319,
-       82, 0, 180
+       3,
+       -1, 1, 376,
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row113[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
 static int parser_action_row114[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
 static int parser_action_row115[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
 static int parser_action_row116[] = {
-       15,
-       -1, 1, 367,
-       12, 0, 106,
-       41, 0, 248,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       2,
+       -1, 1, 306,
+       80, 0, 184
 };
 static int parser_action_row117[] = {
-       3,
-       -1, 1, 385,
-       0, 0, 1,
-       1, 0, 2
+       15,
+       -1, 1, 358,
+       12, 0, 107,
+       38, 0, 252,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
 static int parser_action_row118[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row119[] = {
-       2,
-       -1, 1, 319,
-       82, 0, 180
+       3,
+       -1, 1, 376,
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row120[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
 static int parser_action_row121[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
 static int parser_action_row122[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
 static int parser_action_row123[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
 static int parser_action_row124[] = {
-       1,
-       -1, 1, 554
+       2,
+       -1, 1, 306,
+       80, 0, 184
 };
 static int parser_action_row125[] = {
        1,
-       -1, 1, 286
+       -1, 1, 553
 };
 static int parser_action_row126[] = {
        1,
-       -1, 1, 197
+       -1, 1, 273
 };
 static int parser_action_row127[] = {
-       3,
-       -1, 3, 126,
-       44, 0, 258,
-       85, 0, 259
+       1,
+       -1, 1, 181
 };
 static int parser_action_row128[] = {
-       2,
-       -1, 1, 349,
-       54, 0, 238
+       3,
+       -1, 3, 127,
+       41, 0, 262,
+       83, 0, 263
 };
 static int parser_action_row129[] = {
        2,
-       -1, 1, 364,
-       84, 0, 222
+       -1, 1, 340,
+       51, 0, 242
 };
 static int parser_action_row130[] = {
-       1,
-       -1, 1, 351
+       2,
+       -1, 1, 355,
+       82, 0, 226
 };
 static int parser_action_row131[] = {
-       4,
-       -1, 1, 502,
-       32, 0, 261,
-       33, 0, 262,
-       35, 0, 263
+       1,
+       -1, 1, 342
 };
 static int parser_action_row132[] = {
-       1,
-       -1, 1, 504
+       4,
+       -1, 1, 494,
+       29, 0, 265,
+       30, 0, 266,
+       32, 0, 267
 };
 static int parser_action_row133[] = {
-       3,
-       -1, 1, 509,
-       76, 0, 264,
-       79, 0, 265
+       1,
+       -1, 1, 496
 };
 static int parser_action_row134[] = {
-       11,
-       -1, 1, 511,
-       42, 0, 266,
-       67, 0, 267,
-       68, 0, 268,
-       72, 0, 269,
-       73, 0, 270,
-       74, 0, 271,
-       75, 0, 272,
-       77, 0, 273,
-       78, 0, 274,
-       80, 0, 275
+       3,
+       -1, 1, 501,
+       74, 0, 268,
+       77, 0, 269
 };
 static int parser_action_row135[] = {
-       4,
-       -1, 1, 522,
-       69, 0, 276,
-       70, 0, 277,
-       71, 0, 278
+       11,
+       -1, 1, 503,
+       39, 0, 270,
+       64, 0, 271,
+       65, 0, 272,
+       70, 0, 273,
+       71, 0, 274,
+       72, 0, 275,
+       73, 0, 276,
+       75, 0, 277,
+       76, 0, 278,
+       78, 0, 279
 };
 static int parser_action_row136[] = {
-       1,
-       -1, 1, 525
+       4,
+       -1, 1, 514,
+       66, 0, 280,
+       68, 0, 281,
+       69, 0, 282
 };
 static int parser_action_row137[] = {
        1,
-       -1, 1, 529
+       -1, 1, 517
 };
 static int parser_action_row138[] = {
-       4,
-       -1, 1, 532,
-       56, 0, 205,
-       64, 0, 279,
-       66, 0, 280
+       2,
+       -1, 1, 521,
+       67, 0, 283
 };
 static int parser_action_row139[] = {
-       3,
-       -1, 1, 366,
-       83, 0, 48,
-       84, 0, 224
+       1,
+       -1, 1, 523
 };
 static int parser_action_row140[] = {
-       2,
-       -1, 1, 169,
-       52, 1, 727
+       4,
+       -1, 1, 526,
+       53, 0, 209,
+       61, 0, 284,
+       63, 0, 285
 };
 static int parser_action_row141[] = {
        1,
-       -1, 1, 224
+       -1, 1, 530
 };
 static int parser_action_row142[] = {
-       1,
-       -1, 1, 170
+       3,
+       -1, 1, 357,
+       81, 0, 48,
+       82, 0, 228
 };
 static int parser_action_row143[] = {
-       30,
-       -1, 1, 367,
-       9, 0, 283,
-       12, 0, 26,
-       15, 0, 28,
-       18, 0, 29,
-       25, 0, 30,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       36, 0, 35,
-       37, 0, 36,
-       38, 0, 37,
-       39, 0, 38,
-       40, 0, 39,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 45,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       2,
+       -1, 1, 153,
+       49, 1, 726
 };
 static int parser_action_row144[] = {
-       2,
-       -1, 3, 143,
-       52, 0, 171
+       1,
+       -1, 1, 208
 };
 static int parser_action_row145[] = {
-       3,
-       -1, 1, 166,
-       59, 0, 287,
-       82, 0, 180
+       1,
+       -1, 1, 154
 };
 static int parser_action_row146[] = {
-       1,
-       -1, 1, 386
+       30,
+       -1, 1, 358,
+       9, 0, 288,
+       12, 0, 26,
+       15, 0, 28,
+       16, 0, 29,
+       22, 0, 30,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       33, 0, 35,
+       34, 0, 36,
+       35, 0, 37,
+       36, 0, 38,
+       37, 0, 39,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 45,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row147[] = {
-       22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       2,
+       -1, 3, 146,
+       49, 0, 175
 };
 static int parser_action_row148[] = {
-       22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       3,
+       -1, 1, 150,
+       56, 0, 292,
+       80, 0, 184
 };
 static int parser_action_row149[] = {
        1,
-       -1, 1, 233
+       -1, 1, 377
 };
 static int parser_action_row150[] = {
-       2,
-       -1, 3, 149,
-       52, 0, 171
+       22,
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row151[] = {
-       3,
-       -1, 3, 150,
-       54, 0, 293,
-       84, 0, 294
+       22,
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row152[] = {
-       2,
-       -1, 3, 151,
-       89, 0, 296
+       1,
+       -1, 1, 217
 };
 static int parser_action_row153[] = {
        2,
-       -1, 1, 349,
-       54, 0, 238
+       -1, 3, 152,
+       49, 0, 175
 };
 static int parser_action_row154[] = {
        3,
-       -1, 1, 385,
-       0, 0, 1,
-       1, 0, 2
+       -1, 3, 153,
+       51, 0, 298,
+       82, 0, 299
 };
 static int parser_action_row155[] = {
-       3,
-       -1, 1, 385,
-       0, 0, 1,
-       1, 0, 2
+       2,
+       -1, 3, 154,
+       87, 0, 301
 };
 static int parser_action_row156[] = {
-       3,
-       -1, 1, 385,
-       0, 0, 1,
-       1, 0, 2
+       2,
+       -1, 1, 340,
+       51, 0, 242
 };
 static int parser_action_row157[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row158[] = {
-       17,
-       -1, 1, 367,
-       12, 0, 152,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       3,
+       -1, 1, 376,
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row159[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row160[] = {
-       1,
-       -1, 1, 181
+       3,
+       -1, 1, 376,
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row161[] = {
-       1,
-       -1, 1, 245
+       17,
+       -1, 1, 358,
+       12, 0, 155,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row162[] = {
-       4,
-       -1, 1, 246,
-       32, 0, 304,
-       33, 0, 305,
-       35, 0, 306
+       3,
+       -1, 1, 376,
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row163[] = {
        1,
-       -1, 1, 248
+       -1, 1, 165
 };
 static int parser_action_row164[] = {
-       3,
-       -1, 1, 253,
-       76, 0, 307,
-       79, 0, 308
+       1,
+       -1, 1, 229
 };
 static int parser_action_row165[] = {
-       11,
-       -1, 1, 255,
-       42, 0, 309,
-       67, 0, 310,
-       68, 0, 311,
-       72, 0, 312,
-       73, 0, 313,
-       74, 0, 314,
-       75, 0, 315,
-       77, 0, 316,
-       78, 0, 317,
-       80, 0, 318
+       4,
+       -1, 1, 230,
+       29, 0, 309,
+       30, 0, 310,
+       32, 0, 311
 };
 static int parser_action_row166[] = {
-       4,
-       -1, 1, 266,
-       69, 0, 319,
-       70, 0, 320,
-       71, 0, 321
+       1,
+       -1, 1, 232
 };
 static int parser_action_row167[] = {
-       1,
-       -1, 1, 269
+       3,
+       -1, 1, 237,
+       74, 0, 312,
+       77, 0, 313
 };
 static int parser_action_row168[] = {
-       1,
-       -1, 1, 273
+       11,
+       -1, 1, 239,
+       39, 0, 314,
+       64, 0, 315,
+       65, 0, 316,
+       70, 0, 317,
+       71, 0, 318,
+       72, 0, 319,
+       73, 0, 320,
+       75, 0, 321,
+       76, 0, 322,
+       78, 0, 323
 };
 static int parser_action_row169[] = {
        4,
-       -1, 1, 276,
-       56, 0, 205,
-       64, 0, 206,
-       66, 0, 322
+       -1, 1, 250,
+       66, 0, 324,
+       68, 0, 325,
+       69, 0, 326
 };
 static int parser_action_row170[] = {
-       3,
-       -1, 3, 169,
-       44, 0, 324,
-       85, 0, 325
+       1,
+       -1, 1, 253
 };
 static int parser_action_row171[] = {
        2,
-       -1, 1, 349,
-       54, 0, 238
+       -1, 1, 257,
+       67, 0, 327
 };
 static int parser_action_row172[] = {
-       2,
-       -1, 1, 205,
-       84, 0, 327
+       1,
+       -1, 1, 259
 };
 static int parser_action_row173[] = {
-       1,
-       -1, 1, 186
+       4,
+       -1, 1, 262,
+       53, 0, 209,
+       61, 0, 210,
+       63, 0, 328
 };
 static int parser_action_row174[] = {
-       1,
-       -1, 1, 183
+       3,
+       -1, 3, 173,
+       41, 0, 330,
+       83, 0, 331
 };
 static int parser_action_row175[] = {
-       3,
-       -1, 1, 368,
-       59, 0, 328,
-       60, 0, 190
+       2,
+       -1, 1, 340,
+       51, 0, 242
 };
 static int parser_action_row176[] = {
-       22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       2,
+       -1, 1, 189,
+       82, 0, 333
 };
 static int parser_action_row177[] = {
        1,
-       -1, 1, 242
+       -1, 1, 170
 };
 static int parser_action_row178[] = {
-       2,
-       -1, 1, 245,
-       27, 1, 684
+       1,
+       -1, 1, 167
 };
 static int parser_action_row179[] = {
-       2,
-       -1, 3, 178,
-       27, 0, 331
+       3,
+       -1, 1, 359,
+       56, 0, 334,
+       57, 0, 194
 };
 static int parser_action_row180[] = {
-       3,
-       -1, 3, 179,
-       50, 0, 332,
-       83, 0, 333
+       22,
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row181[] = {
+       1,
+       -1, 1, 226
+};
+static int parser_action_row182[] = {
+       2,
+       -1, 1, 229,
+       24, 1, 683
+};
+static int parser_action_row183[] = {
+       2,
+       -1, 3, 182,
+       24, 0, 337
+};
+static int parser_action_row184[] = {
+       3,
+       -1, 3, 183,
+       47, 0, 338,
+       81, 0, 339
+};
+static int parser_action_row185[] = {
        3,
        -1, 1, 42,
        13, 0, 27,
-       54, 0, 335
+       51, 0, 341
 };
-static int parser_action_row182[] = {
+static int parser_action_row186[] = {
        1,
-       -1, 1, 318
+       -1, 1, 305
 };
-static int parser_action_row183[] = {
+static int parser_action_row187[] = {
        1,
-       -1, 1, 292
+       -1, 1, 280
 };
-static int parser_action_row184[] = {
+static int parser_action_row188[] = {
        1,
-       -1, 1, 293
+       -1, 1, 281
 };
-static int parser_action_row185[] = {
+static int parser_action_row189[] = {
        1,
-       -1, 1, 294
+       -1, 1, 282
 };
-static int parser_action_row186[] = {
+static int parser_action_row190[] = {
        1,
-       -1, 1, 295
+       -1, 1, 283
 };
-static int parser_action_row187[] = {
+static int parser_action_row191[] = {
        3,
-       -1, 3, 186,
-       50, 0, 338,
-       83, 0, 339
+       -1, 3, 190,
+       47, 0, 344,
+       81, 0, 345
 };
-static int parser_action_row188[] = {
+static int parser_action_row192[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row189[] = {
+static int parser_action_row193[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row190[] = {
+static int parser_action_row194[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row191[] = {
+static int parser_action_row195[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row192[] = {
+static int parser_action_row196[] = {
        1,
-       -1, 1, 296
+       -1, 1, 284
 };
-static int parser_action_row193[] = {
+static int parser_action_row197[] = {
        1,
-       -1, 1, 297
+       -1, 1, 285
 };
-static int parser_action_row194[] = {
+static int parser_action_row198[] = {
        1,
-       -1, 1, 298
+       -1, 1, 286
 };
-static int parser_action_row195[] = {
+static int parser_action_row199[] = {
        1,
-       -1, 1, 300
+       -1, 1, 288
 };
-static int parser_action_row196[] = {
+static int parser_action_row200[] = {
        1,
-       -1, 1, 299
+       -1, 1, 287
 };
-static int parser_action_row197[] = {
+static int parser_action_row201[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row198[] = {
+static int parser_action_row202[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row199[] = {
+static int parser_action_row203[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row200[] = {
+static int parser_action_row204[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row201[] = {
+static int parser_action_row205[] = {
        9,
-       -1, 3, 200,
-       3, 0, 350,
-       4, 0, 351,
-       5, 0, 352,
-       6, 0, 353,
-       7, 0, 354,
-       8, 0, 355,
-       10, 0, 356,
-       20, 0, 357
+       -1, 3, 204,
+       3, 0, 356,
+       4, 0, 357,
+       5, 0, 358,
+       6, 0, 359,
+       7, 0, 360,
+       8, 0, 361,
+       10, 0, 362,
+       17, 0, 363
 };
-static int parser_action_row202[] = {
+static int parser_action_row206[] = {
        1,
-       -1, 1, 153
+       -1, 1, 137
 };
-static int parser_action_row203[] = {
+static int parser_action_row207[] = {
        1,
        -1, 1, 810
 };
-static int parser_action_row204[] = {
+static int parser_action_row208[] = {
        31,
-       -1, 1, 173,
+       -1, 1, 157,
        12, 0, 26,
        15, 0, 28,
-       18, 0, 29,
-       25, 0, 30,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       36, 0, 35,
-       37, 0, 36,
-       38, 0, 37,
-       39, 0, 38,
-       40, 0, 39,
-       41, 0, 40,
-       44, 1, 367,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 45,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       85, 1, 367,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       16, 0, 29,
+       22, 0, 30,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       33, 0, 35,
+       34, 0, 36,
+       35, 0, 37,
+       36, 0, 38,
+       37, 0, 39,
+       38, 0, 40,
+       41, 1, 358,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 45,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       83, 1, 358,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row205[] = {
+static int parser_action_row209[] = {
        3,
-       -1, 1, 172,
+       -1, 1, 156,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row206[] = {
+static int parser_action_row210[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row207[] = {
+static int parser_action_row211[] = {
        1,
-       -1, 1, 306
+       -1, 1, 279
 };
-static int parser_action_row208[] = {
+static int parser_action_row212[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row209[] = {
+static int parser_action_row213[] = {
        4,
-       -1, 1, 287,
-       61, 0, 364,
-       62, 0, 365,
-       63, 0, 366
+       -1, 1, 274,
+       58, 0, 370,
+       59, 0, 371,
+       60, 0, 372
 };
-static int parser_action_row210[] = {
+static int parser_action_row214[] = {
        1,
-       -1, 1, 314
+       -1, 1, 301
 };
-static int parser_action_row211[] = {
+static int parser_action_row215[] = {
        1,
-       -1, 1, 315
+       -1, 1, 302
 };
-static int parser_action_row212[] = {
+static int parser_action_row216[] = {
        1,
        -1, 1, 812
 };
-static int parser_action_row213[] = {
+static int parser_action_row217[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row214[] = {
+static int parser_action_row218[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
-static int parser_action_row215[] = {
+static int parser_action_row219[] = {
        3,
-       -1, 3, 214,
-       91, 0, 209,
-       92, 0, 210
+       -1, 3, 218,
+       89, 0, 213,
+       90, 0, 214
 };
-static int parser_action_row216[] = {
+static int parser_action_row220[] = {
        24,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       91, 1, 310,
-       92, 1, 310,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       89, 1, 297,
+       90, 1, 297,
+       91, 0, 55
 };
-static int parser_action_row217[] = {
+static int parser_action_row221[] = {
        1,
-       -1, 1, 291
+       -1, 1, 293
 };
-static int parser_action_row218[] = {
+static int parser_action_row222[] = {
        26,
-       -1, 1, 353,
-       12, 0, 106,
-       25, 0, 107,
-       34, 0, 108,
-       41, 0, 109,
-       43, 0, 110,
-       44, 1, 367,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       54, 0, 116,
-       56, 1, 349,
-       64, 1, 349,
-       66, 1, 349,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       85, 1, 367,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       -1, 1, 344,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 358,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       51, 0, 117,
+       53, 1, 340,
+       61, 1, 340,
+       63, 1, 340,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       83, 1, 358,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
-static int parser_action_row219[] = {
+static int parser_action_row223[] = {
        4,
-       -1, 1, 281,
-       61, 0, 375,
-       62, 0, 365,
-       63, 0, 366
+       -1, 1, 268,
+       58, 0, 381,
+       59, 0, 371,
+       60, 0, 372
 };
-static int parser_action_row220[] = {
+static int parser_action_row224[] = {
        4,
-       -1, 1, 283,
-       61, 0, 377,
-       62, 0, 365,
-       63, 0, 366
+       -1, 1, 270,
+       58, 0, 383,
+       59, 0, 371,
+       60, 0, 372
 };
-static int parser_action_row221[] = {
+static int parser_action_row225[] = {
        1,
-       -1, 1, 194
+       -1, 1, 178
 };
-static int parser_action_row222[] = {
+static int parser_action_row226[] = {
        23,
-       -1, 1, 353,
-       12, 0, 106,
-       25, 0, 107,
-       34, 0, 108,
-       41, 0, 109,
-       43, 0, 110,
-       44, 1, 367,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       54, 0, 379,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       85, 1, 367,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       -1, 1, 344,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 358,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       51, 0, 385,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       83, 1, 358,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
-static int parser_action_row223[] = {
+static int parser_action_row227[] = {
        1,
-       -1, 1, 369
+       -1, 1, 360
 };
-static int parser_action_row224[] = {
+static int parser_action_row228[] = {
        23,
-       -1, 1, 353,
-       12, 0, 106,
-       25, 0, 107,
-       34, 0, 108,
-       41, 0, 109,
-       43, 0, 110,
-       44, 1, 367,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       54, 0, 379,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       85, 1, 367,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       -1, 1, 344,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 358,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       51, 0, 385,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       83, 1, 358,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
-static int parser_action_row225[] = {
+static int parser_action_row229[] = {
        2,
-       -1, 1, 371,
-       60, 0, 190
+       -1, 1, 362,
+       57, 0, 194
 };
-static int parser_action_row226[] = {
+static int parser_action_row230[] = {
        1,
        -1, 1, 825
 };
-static int parser_action_row227[] = {
+static int parser_action_row231[] = {
        3,
-       -1, 1, 365,
-       12, 0, 382,
-       84, 0, 383
+       -1, 1, 356,
+       12, 0, 388,
+       82, 0, 389
 };
-static int parser_action_row228[] = {
+static int parser_action_row232[] = {
        2,
-       -1, 1, 388,
-       0, 0, 98
+       -1, 1, 379,
+       0, 0, 99
 };
-static int parser_action_row229[] = {
+static int parser_action_row233[] = {
        1,
        -1, 1, 6
 };
-static int parser_action_row230[] = {
+static int parser_action_row234[] = {
        4,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2,
-       97, 1, 22
+       95, 1, 22
 };
-static int parser_action_row231[] = {
+static int parser_action_row235[] = {
        1,
        -1, 1, 10
 };
-static int parser_action_row232[] = {
+static int parser_action_row236[] = {
        5,
-       -1, 1, 97,
-       21, 0, 196,
-       22, 0, 197,
-       23, 0, 198,
-       24, 0, 199
+       -1, 1, 80,
+       18, 0, 200,
+       19, 0, 201,
+       20, 0, 202,
+       21, 0, 203
 };
-static int parser_action_row233[] = {
+static int parser_action_row237[] = {
        1,
        -1, 1, 12
 };
-static int parser_action_row234[] = {
+static int parser_action_row238[] = {
        8,
-       -1, 3, 233,
-       4, 0, 351,
-       5, 0, 352,
-       6, 0, 353,
-       7, 0, 354,
-       8, 0, 355,
-       10, 0, 356,
-       20, 0, 357
+       -1, 3, 237,
+       4, 0, 357,
+       5, 0, 358,
+       6, 0, 359,
+       7, 0, 360,
+       8, 0, 361,
+       10, 0, 362,
+       17, 0, 363
 };
-static int parser_action_row235[] = {
+static int parser_action_row239[] = {
        1,
        -1, 1, 7
 };
-static int parser_action_row236[] = {
+static int parser_action_row240[] = {
        4,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2,
-       97, 1, 22
+       95, 1, 22
 };
-static int parser_action_row237[] = {
+static int parser_action_row241[] = {
        1,
        -1, 1, 11
 };
-static int parser_action_row238[] = {
+static int parser_action_row242[] = {
        1,
        -1, 1, 13
 };
-static int parser_action_row239[] = {
+static int parser_action_row243[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row240[] = {
+static int parser_action_row244[] = {
        1,
-       -1, 1, 542
+       -1, 1, 537
 };
-static int parser_action_row241[] = {
+static int parser_action_row245[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row242[] = {
+static int parser_action_row246[] = {
        19,
-       -1, 1, 367,
-       12, 0, 106,
-       34, 0, 108,
-       41, 0, 109,
-       43, 0, 110,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       -1, 1, 358,
+       12, 0, 107,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
-static int parser_action_row243[] = {
+static int parser_action_row247[] = {
        3,
-       -1, 3, 242,
-       50, 0, 332,
-       83, 0, 333
+       -1, 3, 246,
+       47, 0, 338,
+       81, 0, 339
 };
-static int parser_action_row244[] = {
+static int parser_action_row248[] = {
        18,
-       -1, 1, 367,
-       12, 0, 106,
-       41, 0, 109,
-       43, 0, 110,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       -1, 1, 358,
+       12, 0, 107,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
-static int parser_action_row245[] = {
+static int parser_action_row249[] = {
+       1,
+       -1, 1, 544
+};
+static int parser_action_row250[] = {
        1,
        -1, 1, 545
 };
-static int parser_action_row246[] = {
+static int parser_action_row251[] = {
        1,
        -1, 1, 546
 };
-static int parser_action_row247[] = {
+static int parser_action_row252[] = {
        1,
        -1, 1, 547
 };
-static int parser_action_row248[] = {
-       1,
-       -1, 1, 548
-};
-static int parser_action_row249[] = {
+static int parser_action_row253[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row250[] = {
-       3,
-       -1, 3, 249,
-       44, 0, 258,
-       85, 0, 393
-};
-static int parser_action_row251[] = {
-       4,
-       -1, 3, 250,
-       56, 0, 205,
-       64, 0, 279,
-       66, 0, 394
-};
-static int parser_action_row252[] = {
-       23,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       55, 0, 395,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
-};
-static int parser_action_row253[] = {
-       18,
-       -1, 1, 367,
-       12, 0, 106,
-       41, 0, 109,
-       43, 0, 110,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
-};
 static int parser_action_row254[] = {
-       1,
-       -1, 1, 549
+       3,
+       -1, 3, 253,
+       41, 0, 262,
+       83, 0, 399
 };
 static int parser_action_row255[] = {
-       1,
-       -1, 1, 550
+       4,
+       -1, 3, 254,
+       53, 0, 209,
+       61, 0, 284,
+       63, 0, 400
 };
 static int parser_action_row256[] = {
-       1,
-       -1, 1, 551
+       23,
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       52, 0, 401,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row257[] = {
-       1,
-       -1, 1, 553
+       18,
+       -1, 1, 358,
+       12, 0, 107,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
 static int parser_action_row258[] = {
        1,
-       -1, 1, 552
+       -1, 1, 548
 };
 static int parser_action_row259[] = {
-       2,
-       -1, 1, 349,
-       54, 0, 238
+       1,
+       -1, 1, 549
 };
 static int parser_action_row260[] = {
        1,
-       -1, 1, 537
+       -1, 1, 550
 };
 static int parser_action_row261[] = {
        1,
-       -1, 1, 539
+       -1, 1, 552
 };
 static int parser_action_row262[] = {
-       3,
-       -1, 1, 385,
-       0, 0, 1,
-       1, 0, 2
+       1,
+       -1, 1, 551
 };
 static int parser_action_row263[] = {
-       4,
-       -1, 1, 385,
-       0, 0, 1,
-       1, 0, 2,
-       27, 0, 401
+       2,
+       -1, 1, 340,
+       51, 0, 242
 };
 static int parser_action_row264[] = {
-       3,
-       -1, 1, 385,
-       0, 0, 1,
-       1, 0, 2
+       1,
+       -1, 1, 532
 };
 static int parser_action_row265[] = {
-       3,
-       -1, 1, 385,
-       0, 0, 1,
-       1, 0, 2
+       1,
+       -1, 1, 534
 };
 static int parser_action_row266[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row267[] = {
-       3,
-       -1, 1, 385,
+       4,
+       -1, 1, 376,
        0, 0, 1,
-       1, 0, 2
+       1, 0, 2,
+       24, 0, 407
 };
 static int parser_action_row268[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row269[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row270[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row271[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row272[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row273[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row274[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row275[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row276[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row277[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row278[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row279[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row280[] = {
-       1,
-       -1, 1, 558
+       3,
+       -1, 1, 376,
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row281[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row282[] = {
-       1,
-       -1, 1, 543
+       3,
+       -1, 1, 376,
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row283[] = {
-       2,
-       -1, 1, 365,
-       84, 0, 383
+       3,
+       -1, 1, 376,
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row284[] = {
-       2,
-       -1, 1, 168,
-       52, 1, 726
+       3,
+       -1, 1, 376,
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row285[] = {
-       2,
-       -1, 1, 167,
-       52, 1, 725
+       1,
+       -1, 1, 543
 };
 static int parser_action_row286[] = {
        3,
-       -1, 3, 285,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row287[] = {
        1,
-       -1, 1, 223
+       -1, 1, 538
 };
 static int parser_action_row288[] = {
-       3,
-       -1, 1, 385,
-       0, 0, 1,
-       1, 0, 2
+       2,
+       -1, 1, 356,
+       82, 0, 389
 };
 static int parser_action_row289[] = {
        2,
-       -1, 1, 207,
-       61, 0, 423
+       -1, 1, 152,
+       49, 1, 725
 };
 static int parser_action_row290[] = {
        2,
-       -1, 1, 166,
-       59, 0, 287
+       -1, 1, 151,
+       49, 1, 724
 };
 static int parser_action_row291[] = {
        3,
-       -1, 1, 385,
+       -1, 3, 290,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row292[] = {
-       3,
-       -1, 1, 385,
-       0, 0, 1,
-       1, 0, 2
-};
-static int parser_action_row293[] = {
        1,
-       -1, 1, 232
+       -1, 1, 207
 };
-static int parser_action_row294[] = {
+static int parser_action_row293[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
+static int parser_action_row294[] = {
+       2,
+       -1, 1, 191,
+       58, 0, 430
+};
 static int parser_action_row295[] = {
-       1,
-       -1, 1, 358
+       2,
+       -1, 1, 150,
+       56, 0, 292
 };
 static int parser_action_row296[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row297[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row298[] = {
-       22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       1,
+       -1, 1, 216
 };
 static int parser_action_row299[] = {
-       21,
-       -1, 1, 367,
-       12, 0, 152,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       3,
+       -1, 1, 376,
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row300[] = {
-       3,
-       -1, 3, 299,
-       50, 0, 332,
-       83, 0, 333
+       1,
+       -1, 1, 349
 };
 static int parser_action_row301[] = {
-       20,
-       -1, 1, 367,
-       12, 0, 152,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       3,
+       -1, 1, 376,
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row302[] = {
-       4,
-       -1, 3, 301,
-       56, 0, 205,
-       64, 0, 206,
-       66, 0, 434
+       3,
+       -1, 1, 376,
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row303[] = {
-       3,
-       -1, 3, 302,
-       44, 0, 324,
-       85, 0, 435
+       22,
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row304[] = {
-       20,
-       -1, 1, 367,
-       12, 0, 152,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       21,
+       -1, 1, 358,
+       12, 0, 155,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row305[] = {
        3,
-       -1, 1, 385,
-       0, 0, 1,
-       1, 0, 2
+       -1, 3, 304,
+       47, 0, 338,
+       81, 0, 339
 };
 static int parser_action_row306[] = {
-       4,
-       -1, 1, 385,
-       0, 0, 1,
-       1, 0, 2,
-       27, 0, 438
+       20,
+       -1, 1, 358,
+       12, 0, 155,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row307[] = {
-       3,
-       -1, 1, 385,
-       0, 0, 1,
-       1, 0, 2
+       4,
+       -1, 3, 306,
+       53, 0, 209,
+       61, 0, 210,
+       63, 0, 441
 };
 static int parser_action_row308[] = {
        3,
-       -1, 1, 385,
-       0, 0, 1,
-       1, 0, 2
+       -1, 3, 307,
+       41, 0, 330,
+       83, 0, 442
 };
 static int parser_action_row309[] = {
-       3,
-       -1, 1, 385,
-       0, 0, 1,
-       1, 0, 2
+       20,
+       -1, 1, 358,
+       12, 0, 155,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row310[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row311[] = {
-       3,
-       -1, 1, 385,
+       4,
+       -1, 1, 376,
        0, 0, 1,
-       1, 0, 2
+       1, 0, 2,
+       24, 0, 445
 };
 static int parser_action_row312[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row313[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row314[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row315[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row316[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row317[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row318[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row319[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row320[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row321[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row322[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row323[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row324[] = {
-       1,
-       -1, 1, 287
+       3,
+       -1, 1, 376,
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row325[] = {
-       2,
-       -1, 1, 349,
-       54, 0, 238
+       3,
+       -1, 1, 376,
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row326[] = {
-       1,
-       -1, 1, 281
+       3,
+       -1, 1, 376,
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row327[] = {
-       1,
-       -1, 1, 283
+       3,
+       -1, 1, 376,
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row328[] = {
-       1,
-       -1, 1, 206
+       3,
+       -1, 1, 376,
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row329[] = {
-       1,
-       -1, 1, 244
+       3,
+       -1, 1, 376,
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row330[] = {
        1,
-       -1, 1, 243
+       -1, 1, 274
 };
 static int parser_action_row331[] = {
        2,
-       -1, 3, 330,
-       27, 0, 457
+       -1, 1, 340,
+       51, 0, 242
 };
 static int parser_action_row332[] = {
-       32,
-       -1, 1, 367,
-       0, 0, 1,
-       1, 0, 2,
-       9, 0, 458,
-       12, 0, 26,
-       15, 0, 28,
-       18, 0, 29,
-       25, 0, 30,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       36, 0, 35,
-       37, 0, 36,
-       38, 0, 37,
-       39, 0, 38,
-       40, 0, 39,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 45,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       1,
+       -1, 1, 268
 };
 static int parser_action_row333[] = {
-       2,
-       -1, 3, 332,
-       83, 0, 461
+       1,
+       -1, 1, 270
 };
 static int parser_action_row334[] = {
-       3,
-       -1, 1, 562,
-       56, 0, 462,
-       82, 0, 463
+       1,
+       -1, 1, 190
 };
 static int parser_action_row335[] = {
-       2,
-       -1, 3, 334,
-       66, 0, 466
+       1,
+       -1, 1, 228
 };
 static int parser_action_row336[] = {
-       3,
-       -1, 1, 385,
-       0, 0, 1,
-       1, 0, 2
+       1,
+       -1, 1, 227
 };
 static int parser_action_row337[] = {
-       5,
-       -1, 1, 97,
-       21, 0, 196,
-       22, 0, 197,
-       23, 0, 198,
-       24, 0, 199
+       2,
+       -1, 3, 336,
+       24, 0, 465
 };
 static int parser_action_row338[] = {
-       1,
-       -1, 1, 316
+       32,
+       -1, 1, 358,
+       0, 0, 1,
+       1, 0, 2,
+       9, 0, 466,
+       12, 0, 26,
+       15, 0, 28,
+       16, 0, 29,
+       22, 0, 30,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       33, 0, 35,
+       34, 0, 36,
+       35, 0, 37,
+       36, 0, 38,
+       37, 0, 39,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 45,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row339[] = {
        2,
        -1, 3, 338,
-       83, 0, 469
+       81, 0, 469
 };
 static int parser_action_row340[] = {
        3,
-       -1, 1, 319,
-       56, 0, 470,
-       82, 0, 180
+       -1, 1, 557,
+       53, 0, 470,
+       80, 0, 471
 };
 static int parser_action_row341[] = {
        2,
        -1, 3, 340,
-       59, 0, 472
+       63, 0, 474
 };
 static int parser_action_row342[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row343[] = {
+       5,
+       -1, 1, 80,
+       18, 0, 200,
+       19, 0, 201,
+       20, 0, 202,
+       21, 0, 203
+};
+static int parser_action_row344[] = {
+       1,
+       -1, 1, 303
+};
+static int parser_action_row345[] = {
+       2,
+       -1, 3, 344,
+       81, 0, 477
+};
+static int parser_action_row346[] = {
+       3,
+       -1, 1, 306,
+       53, 0, 478,
+       80, 0, 184
+};
+static int parser_action_row347[] = {
+       2,
+       -1, 3, 346,
+       56, 0, 480
+};
+static int parser_action_row348[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row344[] = {
+static int parser_action_row349[] = {
+       3,
+       -1, 1, 376,
+       0, 0, 1,
+       1, 0, 2
+};
+static int parser_action_row350[] = {
        2,
-       -1, 3, 343,
-       57, 0, 475
+       -1, 3, 349,
+       54, 0, 483
 };
-static int parser_action_row345[] = {
+static int parser_action_row351[] = {
        1,
-       -1, 1, 377
+       -1, 1, 368
 };
-static int parser_action_row346[] = {
+static int parser_action_row352[] = {
        1,
-       -1, 1, 376
+       -1, 1, 367
 };
-static int parser_action_row347[] = {
+static int parser_action_row353[] = {
        1,
-       -1, 1, 98
+       -1, 1, 81
 };
-static int parser_action_row348[] = {
+static int parser_action_row354[] = {
        1,
-       -1, 1, 100
+       -1, 1, 83
 };
-static int parser_action_row349[] = {
+static int parser_action_row355[] = {
        1,
-       -1, 1, 99
+       -1, 1, 82
 };
-static int parser_action_row350[] = {
+static int parser_action_row356[] = {
        1,
-       -1, 1, 101
+       -1, 1, 84
 };
-static int parser_action_row351[] = {
+static int parser_action_row357[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row352[] = {
+static int parser_action_row358[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row353[] = {
+static int parser_action_row359[] = {
        1,
        -1, 1, 44
 };
-static int parser_action_row354[] = {
+static int parser_action_row360[] = {
        2,
-       -1, 3, 353,
-       5, 0, 478
+       -1, 3, 359,
+       5, 0, 486
 };
-static int parser_action_row355[] = {
+static int parser_action_row361[] = {
        1,
        -1, 1, 46
 };
-static int parser_action_row356[] = {
+static int parser_action_row362[] = {
        1,
        -1, 1, 47
 };
-static int parser_action_row357[] = {
-       17,
-       -1, 3, 356,
-       56, 0, 479,
-       67, 0, 480,
-       68, 0, 481,
-       69, 0, 482,
-       70, 0, 483,
-       71, 0, 484,
-       72, 0, 485,
-       73, 0, 486,
-       74, 0, 487,
-       75, 0, 488,
-       76, 0, 489,
-       77, 0, 490,
-       78, 0, 491,
-       79, 0, 492,
-       80, 0, 493,
-       84, 0, 494
+static int parser_action_row363[] = {
+       18,
+       -1, 3, 362,
+       53, 0, 487,
+       64, 0, 488,
+       65, 0, 489,
+       66, 0, 490,
+       67, 0, 491,
+       68, 0, 492,
+       69, 0, 493,
+       70, 0, 494,
+       71, 0, 495,
+       72, 0, 496,
+       73, 0, 497,
+       74, 0, 498,
+       75, 0, 499,
+       76, 0, 500,
+       77, 0, 501,
+       78, 0, 502,
+       82, 0, 503
 };
-static int parser_action_row358[] = {
+static int parser_action_row364[] = {
        2,
-       -1, 3, 357,
-       5, 0, 496
+       -1, 3, 363,
+       5, 0, 505
 };
-static int parser_action_row359[] = {
+static int parser_action_row365[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row360[] = {
+static int parser_action_row366[] = {
        1,
-       -1, 1, 177
+       -1, 1, 161
 };
-static int parser_action_row361[] = {
+static int parser_action_row367[] = {
        1,
        -1, 1, 811
 };
-static int parser_action_row362[] = {
+static int parser_action_row368[] = {
        31,
-       -1, 1, 174,
+       -1, 1, 158,
        12, 0, 26,
        15, 0, 28,
-       18, 0, 29,
-       25, 0, 30,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       36, 0, 35,
-       37, 0, 36,
-       38, 0, 37,
-       39, 0, 38,
-       40, 0, 39,
-       41, 0, 40,
-       44, 1, 367,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 45,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       85, 1, 367,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       16, 0, 29,
+       22, 0, 30,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       33, 0, 35,
+       34, 0, 36,
+       35, 0, 37,
+       36, 0, 38,
+       37, 0, 39,
+       38, 0, 40,
+       41, 1, 358,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 45,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       83, 1, 358,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row363[] = {
+static int parser_action_row369[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row364[] = {
+static int parser_action_row370[] = {
        5,
-       -1, 1, 367,
-       12, 0, 498,
-       49, 0, 499,
-       83, 0, 48,
-       84, 0, 49
+       -1, 1, 358,
+       12, 0, 507,
+       46, 0, 508,
+       81, 0, 48,
+       82, 0, 49
 };
-static int parser_action_row365[] = {
+static int parser_action_row371[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row366[] = {
+static int parser_action_row372[] = {
        1,
-       -1, 1, 221
+       -1, 1, 205
 };
-static int parser_action_row367[] = {
+static int parser_action_row373[] = {
        1,
-       -1, 1, 222
+       -1, 1, 206
 };
-static int parser_action_row368[] = {
+static int parser_action_row374[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row369[] = {
+static int parser_action_row375[] = {
        24,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       91, 1, 313,
-       92, 1, 313,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       89, 1, 300,
+       90, 1, 300,
+       91, 0, 55
 };
-static int parser_action_row370[] = {
+static int parser_action_row376[] = {
        1,
-       -1, 1, 307
+       -1, 1, 294
 };
-static int parser_action_row371[] = {
+static int parser_action_row377[] = {
        1,
        -1, 1, 813
 };
-static int parser_action_row372[] = {
+static int parser_action_row378[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
-static int parser_action_row373[] = {
+static int parser_action_row379[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row374[] = {
+static int parser_action_row380[] = {
        1,
-       -1, 1, 284
+       -1, 1, 271
 };
-static int parser_action_row375[] = {
+static int parser_action_row381[] = {
        1,
-       -1, 1, 195
+       -1, 1, 179
 };
-static int parser_action_row376[] = {
+static int parser_action_row382[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row377[] = {
+static int parser_action_row383[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row378[] = {
+static int parser_action_row384[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row379[] = {
+static int parser_action_row385[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row380[] = {
+static int parser_action_row386[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row381[] = {
+static int parser_action_row387[] = {
        1,
-       -1, 1, 201
+       -1, 1, 185
 };
-static int parser_action_row382[] = {
+static int parser_action_row388[] = {
        1,
-       -1, 1, 203
+       -1, 1, 187
 };
-static int parser_action_row383[] = {
+static int parser_action_row389[] = {
        23,
-       -1, 1, 353,
-       12, 0, 106,
-       25, 0, 107,
-       34, 0, 108,
-       41, 0, 109,
-       43, 0, 110,
-       44, 1, 367,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       54, 0, 379,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       85, 1, 367,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       -1, 1, 344,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 358,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       51, 0, 385,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       83, 1, 358,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
-static int parser_action_row384[] = {
+static int parser_action_row390[] = {
        1,
-       -1, 1, 370
+       -1, 1, 361
 };
-static int parser_action_row385[] = {
+static int parser_action_row391[] = {
        1,
        -1, 1, 14
 };
-static int parser_action_row386[] = {
+static int parser_action_row392[] = {
        7,
-       -1, 3, 385,
-       5, 0, 352,
-       6, 0, 353,
-       7, 0, 354,
-       8, 0, 355,
-       10, 0, 356,
-       20, 0, 357
+       -1, 3, 391,
+       5, 0, 358,
+       6, 0, 359,
+       7, 0, 360,
+       8, 0, 361,
+       10, 0, 362,
+       17, 0, 363
 };
-static int parser_action_row387[] = {
+static int parser_action_row393[] = {
        1,
        -1, 1, 15
 };
-static int parser_action_row388[] = {
+static int parser_action_row394[] = {
        23,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       55, 0, 515,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       52, 0, 524,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row389[] = {
+static int parser_action_row395[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row390[] = {
+static int parser_action_row396[] = {
        1,
-       -1, 1, 510
+       -1, 1, 502
 };
-static int parser_action_row391[] = {
+static int parser_action_row397[] = {
        3,
-       -1, 1, 349,
-       54, 0, 238,
-       66, 0, 518
+       -1, 1, 340,
+       51, 0, 242,
+       63, 0, 527
 };
-static int parser_action_row392[] = {
+static int parser_action_row398[] = {
        1,
-       -1, 1, 531
+       -1, 1, 525
 };
-static int parser_action_row393[] = {
+static int parser_action_row399[] = {
        3,
-       -1, 3, 392,
-       50, 0, 332,
-       83, 0, 333
+       -1, 3, 398,
+       47, 0, 338,
+       81, 0, 339
 };
-static int parser_action_row394[] = {
+static int parser_action_row400[] = {
        4,
-       -1, 1, 535,
-       56, 1, 537,
-       64, 1, 537,
-       66, 1, 537
+       -1, 1, 529,
+       53, 1, 532,
+       61, 1, 532,
+       63, 1, 532
 };
-static int parser_action_row395[] = {
+static int parser_action_row401[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row396[] = {
+static int parser_action_row402[] = {
        7,
-       -1, 1, 352,
-       56, 1, 348,
-       61, 1, 348,
-       62, 1, 348,
-       63, 1, 348,
-       64, 1, 348,
-       66, 1, 348
+       -1, 1, 343,
+       53, 1, 339,
+       58, 1, 339,
+       59, 1, 339,
+       60, 1, 339,
+       61, 1, 339,
+       63, 1, 339
 };
-static int parser_action_row397[] = {
+static int parser_action_row403[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row398[] = {
+static int parser_action_row404[] = {
        2,
-       -1, 3, 397,
-       55, 0, 523
+       -1, 3, 403,
+       52, 0, 532
 };
-static int parser_action_row399[] = {
+static int parser_action_row405[] = {
        1,
-       -1, 1, 530
+       -1, 1, 524
 };
-static int parser_action_row400[] = {
+static int parser_action_row406[] = {
        1,
-       -1, 1, 540
+       -1, 1, 535
 };
-static int parser_action_row401[] = {
+static int parser_action_row407[] = {
        19,
-       -1, 1, 367,
-       12, 0, 106,
-       34, 0, 108,
-       41, 0, 109,
-       43, 0, 110,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       -1, 1, 358,
+       12, 0, 107,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
-static int parser_action_row402[] = {
+static int parser_action_row408[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row403[] = {
-       19,
-       -1, 1, 367,
-       12, 0, 106,
-       34, 0, 108,
-       41, 0, 109,
-       43, 0, 110,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
-};
-static int parser_action_row404[] = {
-       19,
-       -1, 1, 367,
-       12, 0, 106,
-       34, 0, 108,
-       41, 0, 109,
-       43, 0, 110,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
-};
-static int parser_action_row405[] = {
-       18,
-       -1, 1, 367,
-       12, 0, 106,
-       41, 0, 109,
-       43, 0, 110,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
-};
-static int parser_action_row406[] = {
-       18,
-       -1, 1, 367,
-       12, 0, 106,
-       41, 0, 109,
-       43, 0, 110,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
-};
-static int parser_action_row407[] = {
-       3,
-       -1, 3, 406,
-       50, 0, 338,
-       83, 0, 339
-};
-static int parser_action_row408[] = {
-       18,
-       -1, 1, 367,
-       12, 0, 106,
-       41, 0, 109,
-       43, 0, 110,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
-};
 static int parser_action_row409[] = {
-       18,
-       -1, 1, 367,
-       12, 0, 106,
-       41, 0, 109,
-       43, 0, 110,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       19,
+       -1, 1, 358,
+       12, 0, 107,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
 static int parser_action_row410[] = {
-       18,
-       -1, 1, 367,
-       12, 0, 106,
-       41, 0, 109,
-       43, 0, 110,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       19,
+       -1, 1, 358,
+       12, 0, 107,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
 static int parser_action_row411[] = {
        18,
-       -1, 1, 367,
-       12, 0, 106,
-       41, 0, 109,
-       43, 0, 110,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       -1, 1, 358,
+       12, 0, 107,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
 static int parser_action_row412[] = {
        18,
-       -1, 1, 367,
-       12, 0, 106,
-       41, 0, 109,
-       43, 0, 110,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       -1, 1, 358,
+       12, 0, 107,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
 static int parser_action_row413[] = {
-       18,
-       -1, 1, 367,
-       12, 0, 106,
-       41, 0, 109,
-       43, 0, 110,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       3,
+       -1, 3, 412,
+       47, 0, 344,
+       81, 0, 345
 };
 static int parser_action_row414[] = {
        18,
-       -1, 1, 367,
-       12, 0, 106,
-       41, 0, 109,
-       43, 0, 110,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       -1, 1, 358,
+       12, 0, 107,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
 static int parser_action_row415[] = {
        18,
-       -1, 1, 367,
-       12, 0, 106,
-       41, 0, 109,
-       43, 0, 110,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       -1, 1, 358,
+       12, 0, 107,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
 static int parser_action_row416[] = {
        18,
-       -1, 1, 367,
-       12, 0, 106,
-       41, 0, 109,
-       43, 0, 110,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       -1, 1, 358,
+       12, 0, 107,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
 static int parser_action_row417[] = {
        18,
-       -1, 1, 367,
-       12, 0, 106,
-       41, 0, 109,
-       43, 0, 110,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       -1, 1, 358,
+       12, 0, 107,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
 static int parser_action_row418[] = {
        18,
-       -1, 1, 367,
-       12, 0, 106,
-       41, 0, 109,
-       43, 0, 110,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       -1, 1, 358,
+       12, 0, 107,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
 static int parser_action_row419[] = {
        18,
-       -1, 1, 367,
-       12, 0, 106,
-       41, 0, 109,
-       43, 0, 110,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       -1, 1, 358,
+       12, 0, 107,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
 static int parser_action_row420[] = {
-       5,
-       -1, 1, 367,
-       12, 0, 543,
-       49, 0, 544,
-       83, 0, 48,
-       84, 0, 49
+       18,
+       -1, 1, 358,
+       12, 0, 107,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
 static int parser_action_row421[] = {
-       30,
-       -1, 1, 367,
-       9, 0, 547,
-       12, 0, 26,
-       15, 0, 28,
-       18, 0, 29,
-       25, 0, 30,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       36, 0, 35,
-       37, 0, 36,
-       38, 0, 37,
-       39, 0, 38,
-       40, 0, 39,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 45,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       18,
+       -1, 1, 358,
+       12, 0, 107,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
 static int parser_action_row422[] = {
-       3,
-       -1, 3, 421,
-       0, 0, 1,
-       1, 0, 2
+       18,
+       -1, 1, 358,
+       12, 0, 107,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
 static int parser_action_row423[] = {
-       3,
-       -1, 3, 422,
-       50, 0, 338,
-       83, 0, 339
+       18,
+       -1, 1, 358,
+       12, 0, 107,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
 static int parser_action_row424[] = {
-       3,
-       -1, 1, 385,
-       0, 0, 1,
-       1, 0, 2
+       18,
+       -1, 1, 358,
+       12, 0, 107,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
 static int parser_action_row425[] = {
-       2,
-       -1, 1, 208,
-       61, 0, 551
+       18,
+       -1, 1, 358,
+       12, 0, 107,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
 static int parser_action_row426[] = {
-       2,
-       -1, 3, 425,
-       26, 0, 552
+       18,
+       -1, 1, 358,
+       12, 0, 107,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
 static int parser_action_row427[] = {
-       2,
-       -1, 3, 426,
-       15, 0, 553
+       5,
+       -1, 1, 358,
+       12, 0, 553,
+       46, 0, 554,
+       81, 0, 48,
+       82, 0, 49
 };
 static int parser_action_row428[] = {
-       2,
-       -1, 3, 427,
-       84, 0, 294
+       30,
+       -1, 1, 358,
+       9, 0, 557,
+       12, 0, 26,
+       15, 0, 28,
+       16, 0, 29,
+       22, 0, 30,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       33, 0, 35,
+       34, 0, 36,
+       35, 0, 37,
+       36, 0, 38,
+       37, 0, 39,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 45,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row429[] = {
        3,
        -1, 3, 428,
-       31, 0, 555,
-       58, 0, 556
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row430[] = {
-       1,
-       -1, 1, 151
+       3,
+       -1, 3, 429,
+       47, 0, 344,
+       81, 0, 345
 };
 static int parser_action_row431[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row432[] = {
-       1,
-       -1, 1, 254
+       2,
+       -1, 1, 192,
+       58, 0, 561
 };
 static int parser_action_row433[] = {
-       3,
-       -1, 1, 349,
-       54, 0, 238,
-       66, 0, 466
+       2,
+       -1, 3, 432,
+       23, 0, 562
 };
 static int parser_action_row434[] = {
-       1,
-       -1, 1, 275
+       2,
+       -1, 3, 433,
+       15, 0, 563
 };
 static int parser_action_row435[] = {
-       3,
-       -1, 1, 385,
-       0, 0, 1,
-       1, 0, 2
+       2,
+       -1, 3, 434,
+       82, 0, 299
 };
 static int parser_action_row436[] = {
-       4,
-       -1, 1, 279,
-       56, 1, 281,
-       64, 1, 281,
-       66, 1, 281
+       3,
+       -1, 3, 435,
+       28, 0, 565,
+       55, 0, 566
 };
 static int parser_action_row437[] = {
        1,
-       -1, 1, 274
+       -1, 1, 135
 };
 static int parser_action_row438[] = {
-       21,
-       -1, 1, 367,
-       12, 0, 152,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
-};
-static int parser_action_row439[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
+static int parser_action_row439[] = {
+       1,
+       -1, 1, 238
+};
 static int parser_action_row440[] = {
-       21,
-       -1, 1, 367,
-       12, 0, 152,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       3,
+       -1, 1, 340,
+       51, 0, 242,
+       63, 0, 474
 };
 static int parser_action_row441[] = {
-       21,
-       -1, 1, 367,
-       12, 0, 152,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       1,
+       -1, 1, 261
 };
 static int parser_action_row442[] = {
-       20,
-       -1, 1, 367,
-       12, 0, 152,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       3,
+       -1, 1, 376,
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row443[] = {
-       20,
-       -1, 1, 367,
-       12, 0, 152,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       4,
+       -1, 1, 265,
+       53, 1, 268,
+       61, 1, 268,
+       63, 1, 268
 };
 static int parser_action_row444[] = {
-       3,
-       -1, 3, 443,
-       50, 0, 338,
-       83, 0, 339
+       1,
+       -1, 1, 260
 };
 static int parser_action_row445[] = {
-       20,
-       -1, 1, 367,
-       12, 0, 152,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       21,
+       -1, 1, 358,
+       12, 0, 155,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row446[] = {
-       20,
-       -1, 1, 367,
-       12, 0, 152,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       3,
+       -1, 1, 376,
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row447[] = {
-       20,
-       -1, 1, 367,
-       12, 0, 152,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       21,
+       -1, 1, 358,
+       12, 0, 155,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row448[] = {
-       20,
-       -1, 1, 367,
-       12, 0, 152,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       21,
+       -1, 1, 358,
+       12, 0, 155,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row449[] = {
        20,
-       -1, 1, 367,
-       12, 0, 152,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row450[] = {
        20,
-       -1, 1, 367,
-       12, 0, 152,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row451[] = {
-       20,
-       -1, 1, 367,
-       12, 0, 152,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       3,
+       -1, 3, 450,
+       47, 0, 344,
+       81, 0, 345
 };
 static int parser_action_row452[] = {
        20,
-       -1, 1, 367,
-       12, 0, 152,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row453[] = {
        20,
-       -1, 1, 367,
-       12, 0, 152,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row454[] = {
        20,
-       -1, 1, 367,
-       12, 0, 152,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row455[] = {
        20,
-       -1, 1, 367,
-       12, 0, 152,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row456[] = {
        20,
-       -1, 1, 367,
-       12, 0, 152,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row457[] = {
-       5,
-       -1, 1, 367,
-       12, 0, 579,
-       49, 0, 499,
-       83, 0, 48,
-       84, 0, 49
+       20,
+       -1, 1, 358,
+       12, 0, 155,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row458[] = {
-       32,
-       -1, 1, 367,
-       0, 0, 1,
-       1, 0, 2,
-       9, 0, 458,
-       12, 0, 26,
-       15, 0, 28,
-       18, 0, 29,
-       25, 0, 30,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       36, 0, 35,
-       37, 0, 36,
-       38, 0, 37,
-       39, 0, 38,
-       40, 0, 39,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 45,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       20,
+       -1, 1, 358,
+       12, 0, 155,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row459[] = {
-       1,
-       -1, 1, 169
+       20,
+       -1, 1, 358,
+       12, 0, 155,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row460[] = {
-       1,
-       -1, 1, 240
+       20,
+       -1, 1, 358,
+       12, 0, 155,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row461[] = {
-       30,
-       -1, 1, 367,
-       9, 0, 583,
-       12, 0, 26,
-       15, 0, 28,
-       18, 0, 29,
-       25, 0, 30,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       36, 0, 35,
-       37, 0, 36,
-       38, 0, 37,
-       39, 0, 38,
-       40, 0, 39,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 45,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       20,
+       -1, 1, 358,
+       12, 0, 155,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row462[] = {
-       3,
-       -1, 1, 562,
-       56, 0, 585,
-       82, 0, 463
+       20,
+       -1, 1, 358,
+       12, 0, 155,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row463[] = {
-       3,
-       -1, 1, 385,
-       0, 0, 1,
-       1, 0, 2
+       20,
+       -1, 1, 358,
+       12, 0, 155,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row464[] = {
-       3,
-       -1, 1, 42,
-       13, 0, 27,
-       54, 0, 588
+       20,
+       -1, 1, 358,
+       12, 0, 155,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row465[] = {
-       1,
-       -1, 1, 561
+       5,
+       -1, 1, 358,
+       12, 0, 590,
+       46, 0, 508,
+       81, 0, 48,
+       82, 0, 49
 };
 static int parser_action_row466[] = {
-       1,
-       -1, 1, 460
+       32,
+       -1, 1, 358,
+       0, 0, 1,
+       1, 0, 2,
+       9, 0, 466,
+       12, 0, 26,
+       15, 0, 28,
+       16, 0, 29,
+       22, 0, 30,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       33, 0, 35,
+       34, 0, 36,
+       35, 0, 37,
+       36, 0, 38,
+       37, 0, 39,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 45,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row467[] = {
-       3,
-       -1, 1, 385,
-       0, 0, 1,
-       1, 0, 2
+       1,
+       -1, 1, 153
 };
 static int parser_action_row468[] = {
-       2,
-       -1, 1, 42,
-       13, 0, 27
+       1,
+       -1, 1, 224
 };
 static int parser_action_row469[] = {
-       4,
-       -1, 3, 468,
-       16, 0, 594,
-       17, 0, 595,
-       84, 0, 596
+       30,
+       -1, 1, 358,
+       9, 0, 594,
+       12, 0, 26,
+       15, 0, 28,
+       16, 0, 29,
+       22, 0, 30,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       33, 0, 35,
+       34, 0, 36,
+       35, 0, 37,
+       36, 0, 38,
+       37, 0, 39,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 45,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row470[] = {
        3,
-       -1, 1, 319,
-       56, 0, 598,
-       82, 0, 180
+       -1, 1, 557,
+       53, 0, 596,
+       80, 0, 471
 };
 static int parser_action_row471[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row472[] = {
-       1,
-       -1, 1, 157
+       3,
+       -1, 1, 42,
+       13, 0, 27,
+       51, 0, 599
 };
 static int parser_action_row473[] = {
-       22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       1,
+       -1, 1, 556
 };
 static int parser_action_row474[] = {
-       2,
-       -1, 3, 473,
-       55, 0, 602
+       1,
+       -1, 1, 452
 };
 static int parser_action_row475[] = {
        3,
-       -1, 1, 355,
-       58, 0, 603,
-       65, 0, 604
+       -1, 1, 376,
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row476[] = {
-       1,
-       -1, 1, 354
+       2,
+       -1, 1, 42,
+       13, 0, 27
 };
 static int parser_action_row477[] = {
-       3,
+       4,
        -1, 3, 476,
-       60, 0, 607,
-       84, 0, 608
+       6, 0, 606,
+       17, 0, 607,
+       82, 0, 608
 };
 static int parser_action_row478[] = {
-       4,
-       -1, 3, 477,
-       9, 0, 611,
-       60, 0, 607,
-       84, 0, 608
+       3,
+       -1, 1, 306,
+       53, 0, 610,
+       80, 0, 184
 };
 static int parser_action_row479[] = {
-       1,
-       -1, 1, 45
+       3,
+       -1, 1, 376,
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row480[] = {
-       2,
-       -1, 3, 479,
-       57, 0, 613
+       1,
+       -1, 1, 141
 };
 static int parser_action_row481[] = {
-       1,
-       -1, 1, 103
+       22,
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row482[] = {
-       1,
-       -1, 1, 104
+       2,
+       -1, 3, 481,
+       52, 0, 614
 };
 static int parser_action_row483[] = {
-       1,
-       -1, 1, 105
+       3,
+       -1, 1, 346,
+       55, 0, 615,
+       62, 0, 616
 };
 static int parser_action_row484[] = {
        1,
-       -1, 1, 106
+       -1, 1, 345
 };
 static int parser_action_row485[] = {
-       1,
-       -1, 1, 107
+       3,
+       -1, 3, 484,
+       57, 0, 619,
+       82, 0, 620
 };
 static int parser_action_row486[] = {
-       1,
-       -1, 1, 108
+       4,
+       -1, 3, 485,
+       9, 0, 623,
+       57, 0, 619,
+       82, 0, 620
 };
 static int parser_action_row487[] = {
        1,
-       -1, 1, 109
+       -1, 1, 45
 };
 static int parser_action_row488[] = {
-       1,
-       -1, 1, 112
+       2,
+       -1, 3, 487,
+       54, 0, 625
 };
 static int parser_action_row489[] = {
        1,
-       -1, 1, 110
+       -1, 1, 86
 };
 static int parser_action_row490[] = {
        1,
-       -1, 1, 114
+       -1, 1, 87
 };
 static int parser_action_row491[] = {
        1,
-       -1, 1, 113
+       -1, 1, 88
 };
 static int parser_action_row492[] = {
        1,
-       -1, 1, 111
+       -1, 1, 89
 };
 static int parser_action_row493[] = {
        1,
-       -1, 1, 115
+       -1, 1, 90
 };
 static int parser_action_row494[] = {
        1,
-       -1, 1, 117
+       -1, 1, 91
 };
 static int parser_action_row495[] = {
-       2,
-       -1, 1, 102,
-       61, 0, 614
+       1,
+       -1, 1, 92
 };
 static int parser_action_row496[] = {
+       1,
+       -1, 1, 93
+};
+static int parser_action_row497[] = {
+       1,
+       -1, 1, 96
+};
+static int parser_action_row498[] = {
+       1,
+       -1, 1, 94
+};
+static int parser_action_row499[] = {
+       1,
+       -1, 1, 98
+};
+static int parser_action_row500[] = {
+       1,
+       -1, 1, 97
+};
+static int parser_action_row501[] = {
+       1,
+       -1, 1, 95
+};
+static int parser_action_row502[] = {
+       1,
+       -1, 1, 99
+};
+static int parser_action_row503[] = {
+       1,
+       -1, 1, 101
+};
+static int parser_action_row504[] = {
+       2,
+       -1, 1, 85,
+       58, 0, 626
+};
+static int parser_action_row505[] = {
        5,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2,
-       54, 0, 615,
-       59, 0, 616
+       51, 0, 627,
+       56, 0, 628
 };
-static int parser_action_row497[] = {
+static int parser_action_row506[] = {
        1,
        -1, 1, 48
 };
-static int parser_action_row498[] = {
+static int parser_action_row507[] = {
        3,
-       -1, 3, 497,
-       83, 0, 620,
-       84, 0, 621
+       -1, 3, 506,
+       81, 0, 632,
+       82, 0, 633
 };
-static int parser_action_row499[] = {
+static int parser_action_row508[] = {
        26,
-       -1, 1, 353,
-       12, 0, 106,
-       25, 0, 107,
-       34, 0, 108,
-       41, 0, 109,
-       43, 0, 110,
-       44, 1, 367,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       54, 0, 116,
-       56, 1, 349,
-       64, 1, 349,
-       66, 1, 349,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       85, 1, 367,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       -1, 1, 344,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 358,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       51, 0, 117,
+       53, 1, 340,
+       61, 1, 340,
+       63, 1, 340,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       83, 1, 358,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
-static int parser_action_row500[] = {
+static int parser_action_row509[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row501[] = {
+static int parser_action_row510[] = {
        2,
-       -1, 3, 500,
-       85, 0, 628
+       -1, 3, 509,
+       83, 0, 640
 };
-static int parser_action_row502[] = {
+static int parser_action_row511[] = {
        29,
-       -1, 1, 349,
-       0, 1, 353,
-       1, 1, 353,
-       9, 1, 353,
-       12, 0, 106,
-       25, 0, 107,
-       34, 0, 108,
-       41, 0, 109,
-       43, 0, 110,
-       44, 1, 367,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       54, 0, 116,
-       55, 1, 353,
-       58, 1, 353,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       85, 1, 367,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122,
-       97, 1, 353
+       -1, 1, 340,
+       0, 1, 344,
+       1, 1, 344,
+       9, 1, 344,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 358,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       51, 0, 117,
+       52, 1, 344,
+       55, 1, 344,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       83, 1, 358,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123,
+       95, 1, 344
 };
-static int parser_action_row503[] = {
+static int parser_action_row512[] = {
        3,
-       -1, 1, 364,
-       12, 0, 631,
-       84, 0, 222
+       -1, 1, 355,
+       12, 0, 643,
+       82, 0, 226
 };
-static int parser_action_row504[] = {
+static int parser_action_row513[] = {
        4,
-       -1, 1, 366,
-       12, 0, 632,
-       83, 0, 48,
-       84, 0, 224
+       -1, 1, 357,
+       12, 0, 644,
+       81, 0, 48,
+       82, 0, 228
 };
-static int parser_action_row505[] = {
+static int parser_action_row514[] = {
        1,
-       -1, 1, 215
+       -1, 1, 199
 };
-static int parser_action_row506[] = {
+static int parser_action_row515[] = {
        1,
-       -1, 1, 220
+       -1, 1, 204
 };
-static int parser_action_row507[] = {
+static int parser_action_row516[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row508[] = {
+static int parser_action_row517[] = {
        1,
-       -1, 1, 308
+       -1, 1, 295
 };
-static int parser_action_row509[] = {
+static int parser_action_row518[] = {
        1,
-       -1, 1, 309
+       -1, 1, 296
 };
-static int parser_action_row510[] = {
+static int parser_action_row519[] = {
        1,
-       -1, 1, 212
+       -1, 1, 196
 };
-static int parser_action_row511[] = {
+static int parser_action_row520[] = {
        1,
-       -1, 1, 217
+       -1, 1, 201
 };
-static int parser_action_row512[] = {
+static int parser_action_row521[] = {
        1,
-       -1, 1, 214
+       -1, 1, 198
 };
-static int parser_action_row513[] = {
+static int parser_action_row522[] = {
        1,
-       -1, 1, 219
+       -1, 1, 203
 };
-static int parser_action_row514[] = {
+static int parser_action_row523[] = {
        23,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       55, 0, 635,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       52, 0, 647,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row515[] = {
+static int parser_action_row524[] = {
        1,
-       -1, 1, 202
+       -1, 1, 186
 };
-static int parser_action_row516[] = {
+static int parser_action_row525[] = {
        1,
-       -1, 1, 348
+       -1, 1, 339
 };
-static int parser_action_row517[] = {
+static int parser_action_row526[] = {
        2,
-       -1, 3, 516,
-       55, 0, 637
+       -1, 3, 525,
+       52, 0, 649
 };
-static int parser_action_row518[] = {
+static int parser_action_row527[] = {
        2,
-       -1, 3, 517,
-       26, 0, 638
+       -1, 3, 526,
+       23, 0, 650
 };
-static int parser_action_row519[] = {
+static int parser_action_row528[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row520[] = {
+static int parser_action_row529[] = {
        1,
-       -1, 1, 533
+       -1, 1, 527
 };
-static int parser_action_row521[] = {
+static int parser_action_row530[] = {
        2,
-       -1, 3, 520,
-       66, 0, 518
+       -1, 3, 529,
+       63, 0, 527
 };
-static int parser_action_row522[] = {
+static int parser_action_row531[] = {
        5,
-       -1, 1, 367,
-       12, 0, 543,
-       49, 0, 544,
-       83, 0, 48,
-       84, 0, 49
+       -1, 1, 358,
+       12, 0, 553,
+       46, 0, 554,
+       81, 0, 48,
+       82, 0, 49
 };
-static int parser_action_row523[] = {
+static int parser_action_row532[] = {
        2,
-       -1, 1, 355,
-       58, 0, 603
+       -1, 1, 346,
+       55, 0, 615
 };
-static int parser_action_row524[] = {
+static int parser_action_row533[] = {
        7,
-       -1, 1, 350,
-       56, 1, 347,
-       61, 1, 347,
-       62, 1, 347,
-       63, 1, 347,
-       64, 1, 347,
-       66, 1, 347
+       -1, 1, 341,
+       53, 1, 338,
+       58, 1, 338,
+       59, 1, 338,
+       60, 1, 338,
+       61, 1, 338,
+       63, 1, 338
 };
-static int parser_action_row525[] = {
+static int parser_action_row534[] = {
        1,
-       -1, 1, 506
+       -1, 1, 498
 };
-static int parser_action_row526[] = {
+static int parser_action_row535[] = {
        19,
-       -1, 1, 367,
-       12, 0, 106,
-       34, 0, 108,
-       41, 0, 109,
-       43, 0, 110,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       -1, 1, 358,
+       12, 0, 107,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
-static int parser_action_row527[] = {
+static int parser_action_row536[] = {
        1,
-       -1, 1, 505
+       -1, 1, 497
 };
-static int parser_action_row528[] = {
+static int parser_action_row537[] = {
        1,
-       -1, 1, 508
+       -1, 1, 500
 };
-static int parser_action_row529[] = {
+static int parser_action_row538[] = {
        3,
-       -1, 1, 516,
-       67, 0, 267,
-       68, 0, 268
+       -1, 1, 508,
+       64, 0, 271,
+       65, 0, 272
 };
-static int parser_action_row530[] = {
+static int parser_action_row539[] = {
        3,
-       -1, 1, 519,
-       67, 0, 267,
-       68, 0, 268
+       -1, 1, 511,
+       64, 0, 271,
+       65, 0, 272
 };
-static int parser_action_row531[] = {
+static int parser_action_row540[] = {
        1,
-       -1, 1, 521
+       -1, 1, 513
 };
-static int parser_action_row532[] = {
+static int parser_action_row541[] = {
        4,
-       -1, 1, 523,
-       69, 0, 276,
-       70, 0, 277,
-       71, 0, 278
+       -1, 1, 515,
+       66, 0, 280,
+       68, 0, 281,
+       69, 0, 282
 };
-static int parser_action_row533[] = {
+static int parser_action_row542[] = {
        4,
-       -1, 1, 524,
-       69, 0, 276,
-       70, 0, 277,
-       71, 0, 278
+       -1, 1, 516,
+       66, 0, 280,
+       68, 0, 281,
+       69, 0, 282
 };
-static int parser_action_row534[] = {
+static int parser_action_row543[] = {
        3,
-       -1, 1, 512,
-       67, 0, 267,
-       68, 0, 268
+       -1, 1, 504,
+       64, 0, 271,
+       65, 0, 272
 };
-static int parser_action_row535[] = {
+static int parser_action_row544[] = {
        3,
-       -1, 1, 513,
-       67, 0, 267,
-       68, 0, 268
+       -1, 1, 505,
+       64, 0, 271,
+       65, 0, 272
 };
-static int parser_action_row536[] = {
+static int parser_action_row545[] = {
        3,
-       -1, 1, 514,
-       67, 0, 267,
-       68, 0, 268
+       -1, 1, 506,
+       64, 0, 271,
+       65, 0, 272
 };
-static int parser_action_row537[] = {
+static int parser_action_row546[] = {
        3,
-       -1, 1, 515,
-       67, 0, 267,
-       68, 0, 268
+       -1, 1, 507,
+       64, 0, 271,
+       65, 0, 272
 };
-static int parser_action_row538[] = {
+static int parser_action_row547[] = {
        3,
-       -1, 1, 517,
-       67, 0, 267,
-       68, 0, 268
+       -1, 1, 509,
+       64, 0, 271,
+       65, 0, 272
 };
-static int parser_action_row539[] = {
+static int parser_action_row548[] = {
        3,
-       -1, 1, 518,
-       67, 0, 267,
-       68, 0, 268
+       -1, 1, 510,
+       64, 0, 271,
+       65, 0, 272
 };
-static int parser_action_row540[] = {
+static int parser_action_row549[] = {
        3,
-       -1, 1, 520,
-       67, 0, 267,
-       68, 0, 268
+       -1, 1, 512,
+       64, 0, 271,
+       65, 0, 272
 };
-static int parser_action_row541[] = {
+static int parser_action_row550[] = {
        1,
-       -1, 1, 526
+       -1, 1, 518
 };
-static int parser_action_row542[] = {
+static int parser_action_row551[] = {
        1,
-       -1, 1, 527
+       -1, 1, 519
 };
-static int parser_action_row543[] = {
+static int parser_action_row552[] = {
        1,
-       -1, 1, 528
+       -1, 1, 520
 };
-static int parser_action_row544[] = {
+static int parser_action_row553[] = {
+       1,
+       -1, 1, 522
+};
+static int parser_action_row554[] = {
        2,
-       -1, 1, 349,
-       54, 0, 238
+       -1, 1, 340,
+       51, 0, 242
 };
-static int parser_action_row545[] = {
+static int parser_action_row555[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row546[] = {
+static int parser_action_row556[] = {
        2,
-       -1, 3, 545,
-       85, 0, 644
+       -1, 3, 555,
+       83, 0, 656
 };
-static int parser_action_row547[] = {
+static int parser_action_row557[] = {
        2,
-       -1, 1, 349,
-       54, 0, 238
+       -1, 1, 340,
+       51, 0, 242
 };
-static int parser_action_row548[] = {
+static int parser_action_row558[] = {
        1,
-       -1, 1, 175
+       -1, 1, 159
 };
-static int parser_action_row549[] = {
+static int parser_action_row559[] = {
        30,
-       -1, 1, 367,
-       9, 0, 646,
+       -1, 1, 358,
+       9, 0, 658,
        12, 0, 26,
        15, 0, 28,
-       18, 0, 29,
-       25, 0, 30,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       36, 0, 35,
-       37, 0, 36,
-       38, 0, 37,
-       39, 0, 38,
-       40, 0, 39,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 45,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       16, 0, 29,
+       22, 0, 30,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       33, 0, 35,
+       34, 0, 36,
+       35, 0, 37,
+       36, 0, 38,
+       37, 0, 39,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 45,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row550[] = {
+static int parser_action_row560[] = {
        1,
-       -1, 1, 165
+       -1, 1, 149
 };
-static int parser_action_row551[] = {
+static int parser_action_row561[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row552[] = {
+static int parser_action_row562[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row553[] = {
+static int parser_action_row563[] = {
        33,
-       -1, 1, 367,
+       -1, 1, 358,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 649,
-       12, 0, 650,
-       15, 0, 651,
-       18, 0, 652,
-       25, 0, 653,
-       27, 0, 654,
-       28, 0, 655,
-       29, 0, 656,
-       30, 0, 657,
-       36, 0, 658,
-       37, 0, 659,
-       38, 0, 660,
-       39, 0, 661,
-       40, 0, 662,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 663,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       9, 0, 661,
+       12, 0, 662,
+       15, 0, 663,
+       16, 0, 664,
+       22, 0, 665,
+       24, 0, 666,
+       25, 0, 667,
+       26, 0, 668,
+       27, 0, 669,
+       33, 0, 670,
+       34, 0, 671,
+       35, 0, 672,
+       36, 0, 673,
+       37, 0, 674,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 675,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row554[] = {
+static int parser_action_row564[] = {
        32,
-       -1, 1, 367,
+       -1, 1, 358,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 139,
+       9, 0, 142,
        12, 0, 26,
        15, 0, 28,
-       18, 0, 29,
-       25, 0, 30,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       36, 0, 35,
-       37, 0, 36,
-       38, 0, 37,
-       39, 0, 38,
-       40, 0, 39,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 45,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       16, 0, 29,
+       22, 0, 30,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       33, 0, 35,
+       34, 0, 36,
+       35, 0, 37,
+       36, 0, 38,
+       37, 0, 39,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 45,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row555[] = {
+static int parser_action_row565[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row556[] = {
+static int parser_action_row566[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row557[] = {
+static int parser_action_row567[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row558[] = {
+static int parser_action_row568[] = {
        2,
-       -1, 3, 557,
-       26, 0, 686
+       -1, 3, 567,
+       23, 0, 698
 };
-static int parser_action_row559[] = {
+static int parser_action_row569[] = {
        1,
-       -1, 1, 277
+       -1, 1, 263
 };
-static int parser_action_row560[] = {
+static int parser_action_row570[] = {
        5,
-       -1, 1, 367,
-       12, 0, 579,
-       49, 0, 499,
-       83, 0, 48,
-       84, 0, 49
+       -1, 1, 358,
+       12, 0, 590,
+       46, 0, 508,
+       81, 0, 48,
+       82, 0, 49
 };
-static int parser_action_row561[] = {
+static int parser_action_row571[] = {
        1,
-       -1, 1, 250
+       -1, 1, 234
 };
-static int parser_action_row562[] = {
+static int parser_action_row572[] = {
        21,
-       -1, 1, 367,
-       12, 0, 152,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row563[] = {
+static int parser_action_row573[] = {
        1,
-       -1, 1, 249
+       -1, 1, 233
 };
-static int parser_action_row564[] = {
+static int parser_action_row574[] = {
        1,
-       -1, 1, 252
+       -1, 1, 236
 };
-static int parser_action_row565[] = {
+static int parser_action_row575[] = {
        3,
-       -1, 1, 260,
-       67, 0, 310,
-       68, 0, 311
+       -1, 1, 244,
+       64, 0, 315,
+       65, 0, 316
 };
-static int parser_action_row566[] = {
+static int parser_action_row576[] = {
        3,
-       -1, 1, 263,
-       67, 0, 310,
-       68, 0, 311
+       -1, 1, 247,
+       64, 0, 315,
+       65, 0, 316
 };
-static int parser_action_row567[] = {
+static int parser_action_row577[] = {
        1,
-       -1, 1, 265
+       -1, 1, 249
 };
-static int parser_action_row568[] = {
+static int parser_action_row578[] = {
        4,
-       -1, 1, 267,
-       69, 0, 319,
-       70, 0, 320,
-       71, 0, 321
+       -1, 1, 251,
+       66, 0, 324,
+       68, 0, 325,
+       69, 0, 326
 };
-static int parser_action_row569[] = {
+static int parser_action_row579[] = {
        4,
-       -1, 1, 268,
-       69, 0, 319,
-       70, 0, 320,
-       71, 0, 321
+       -1, 1, 252,
+       66, 0, 324,
+       68, 0, 325,
+       69, 0, 326
 };
-static int parser_action_row570[] = {
+static int parser_action_row580[] = {
        3,
-       -1, 1, 256,
-       67, 0, 310,
-       68, 0, 311
+       -1, 1, 240,
+       64, 0, 315,
+       65, 0, 316
 };
-static int parser_action_row571[] = {
+static int parser_action_row581[] = {
        3,
-       -1, 1, 257,
-       67, 0, 310,
-       68, 0, 311
+       -1, 1, 241,
+       64, 0, 315,
+       65, 0, 316
 };
-static int parser_action_row572[] = {
+static int parser_action_row582[] = {
        3,
-       -1, 1, 258,
-       67, 0, 310,
-       68, 0, 311
+       -1, 1, 242,
+       64, 0, 315,
+       65, 0, 316
 };
-static int parser_action_row573[] = {
+static int parser_action_row583[] = {
        3,
-       -1, 1, 259,
-       67, 0, 310,
-       68, 0, 311
+       -1, 1, 243,
+       64, 0, 315,
+       65, 0, 316
 };
-static int parser_action_row574[] = {
+static int parser_action_row584[] = {
        3,
-       -1, 1, 261,
-       67, 0, 310,
-       68, 0, 311
+       -1, 1, 245,
+       64, 0, 315,
+       65, 0, 316
 };
-static int parser_action_row575[] = {
+static int parser_action_row585[] = {
        3,
-       -1, 1, 262,
-       67, 0, 310,
-       68, 0, 311
+       -1, 1, 246,
+       64, 0, 315,
+       65, 0, 316
 };
-static int parser_action_row576[] = {
+static int parser_action_row586[] = {
        3,
-       -1, 1, 264,
-       67, 0, 310,
-       68, 0, 311
+       -1, 1, 248,
+       64, 0, 315,
+       65, 0, 316
 };
-static int parser_action_row577[] = {
+static int parser_action_row587[] = {
        1,
-       -1, 1, 270
+       -1, 1, 254
 };
-static int parser_action_row578[] = {
+static int parser_action_row588[] = {
        1,
-       -1, 1, 271
+       -1, 1, 255
 };
-static int parser_action_row579[] = {
+static int parser_action_row589[] = {
        1,
-       -1, 1, 272
+       -1, 1, 256
 };
-static int parser_action_row580[] = {
+static int parser_action_row590[] = {
+       1,
+       -1, 1, 258
+};
+static int parser_action_row591[] = {
        2,
-       -1, 1, 349,
-       54, 0, 238
+       -1, 1, 340,
+       51, 0, 242
 };
-static int parser_action_row581[] = {
+static int parser_action_row592[] = {
        2,
-       -1, 3, 580,
-       85, 0, 689
+       -1, 3, 591,
+       83, 0, 701
 };
-static int parser_action_row582[] = {
+static int parser_action_row593[] = {
        2,
-       -1, 1, 349,
-       54, 0, 238
+       -1, 1, 340,
+       51, 0, 242
 };
-static int parser_action_row583[] = {
+static int parser_action_row594[] = {
        1,
-       -1, 1, 241
+       -1, 1, 225
 };
-static int parser_action_row584[] = {
+static int parser_action_row595[] = {
        1,
-       -1, 1, 168
+       -1, 1, 152
 };
-static int parser_action_row585[] = {
+static int parser_action_row596[] = {
        1,
-       -1, 1, 167
+       -1, 1, 151
 };
-static int parser_action_row586[] = {
+static int parser_action_row597[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row587[] = {
+static int parser_action_row598[] = {
        1,
-       -1, 1, 461
+       -1, 1, 453
 };
-static int parser_action_row588[] = {
+static int parser_action_row599[] = {
        3,
-       -1, 3, 587,
-       50, 0, 338,
-       83, 0, 339
+       -1, 3, 598,
+       47, 0, 344,
+       81, 0, 345
 };
-static int parser_action_row589[] = {
+static int parser_action_row600[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row590[] = {
+static int parser_action_row601[] = {
        5,
-       -1, 1, 97,
-       21, 0, 196,
-       22, 0, 197,
-       23, 0, 198,
-       24, 0, 199
+       -1, 1, 80,
+       18, 0, 200,
+       19, 0, 201,
+       20, 0, 202,
+       21, 0, 203
 };
-static int parser_action_row591[] = {
+static int parser_action_row602[] = {
        1,
-       -1, 1, 559
+       -1, 1, 554
 };
-static int parser_action_row592[] = {
+static int parser_action_row603[] = {
        3,
-       -1, 3, 591,
-       83, 0, 48,
-       84, 0, 49
+       -1, 3, 602,
+       81, 0, 48,
+       82, 0, 49
 };
-static int parser_action_row593[] = {
-       2,
-       -1, 1, 323,
-       58, 0, 699
+static int parser_action_row604[] = {
+       5,
+       -1, 1, 80,
+       18, 0, 200,
+       19, 0, 201,
+       20, 0, 202,
+       21, 0, 203
 };
-static int parser_action_row594[] = {
+static int parser_action_row605[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row595[] = {
+static int parser_action_row606[] = {
+       2,
+       -1, 1, 310,
+       55, 0, 713
+};
+static int parser_action_row607[] = {
        1,
-       -1, 1, 345
+       -1, 1, 337
 };
-static int parser_action_row596[] = {
+static int parser_action_row608[] = {
        1,
-       -1, 1, 346
+       -1, 1, 336
 };
-static int parser_action_row597[] = {
+static int parser_action_row609[] = {
        1,
-       -1, 1, 344
+       -1, 1, 335
 };
-static int parser_action_row598[] = {
+static int parser_action_row610[] = {
        3,
-       -1, 1, 319,
-       54, 0, 703,
-       82, 0, 180
+       -1, 1, 306,
+       51, 0, 716,
+       80, 0, 184
 };
-static int parser_action_row599[] = {
+static int parser_action_row611[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row600[] = {
+static int parser_action_row612[] = {
        1,
-       -1, 1, 158
+       -1, 1, 142
 };
-static int parser_action_row601[] = {
+static int parser_action_row613[] = {
        3,
-       -1, 3, 600,
-       50, 0, 338,
-       83, 0, 339
+       -1, 3, 612,
+       47, 0, 344,
+       81, 0, 345
 };
-static int parser_action_row602[] = {
+static int parser_action_row614[] = {
        1,
-       -1, 1, 204
+       -1, 1, 188
 };
-static int parser_action_row603[] = {
+static int parser_action_row615[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
-static int parser_action_row604[] = {
+static int parser_action_row616[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row605[] = {
+static int parser_action_row617[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row606[] = {
+static int parser_action_row618[] = {
        1,
        -1, 1, 822
 };
-static int parser_action_row607[] = {
+static int parser_action_row619[] = {
        2,
-       -1, 1, 356,
-       58, 0, 603
+       -1, 1, 347,
+       55, 0, 615
 };
-static int parser_action_row608[] = {
+static int parser_action_row620[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row609[] = {
+static int parser_action_row621[] = {
        2,
-       -1, 1, 360,
-       60, 0, 190
+       -1, 1, 351,
+       57, 0, 194
 };
-static int parser_action_row610[] = {
+static int parser_action_row622[] = {
        2,
-       -1, 1, 92,
-       14, 0, 712
+       -1, 1, 77,
+       14, 0, 725
 };
-static int parser_action_row611[] = {
+static int parser_action_row623[] = {
        2,
-       -1, 3, 610,
-       84, 0, 714
+       -1, 3, 622,
+       82, 0, 727
 };
-static int parser_action_row612[] = {
+static int parser_action_row624[] = {
        3,
-       -1, 3, 611,
-       0, 0, 82,
-       1, 0, 83
+       -1, 3, 623,
+       0, 0, 83,
+       1, 0, 84
 };
-static int parser_action_row613[] = {
+static int parser_action_row625[] = {
        2,
-       -1, 1, 92,
-       14, 0, 712
+       -1, 1, 77,
+       14, 0, 725
 };
-static int parser_action_row614[] = {
+static int parser_action_row626[] = {
        2,
-       -1, 1, 116,
-       61, 0, 717
+       -1, 1, 100,
+       58, 0, 730
 };
-static int parser_action_row615[] = {
+static int parser_action_row627[] = {
        1,
-       -1, 1, 118
+       -1, 1, 102
 };
-static int parser_action_row616[] = {
+static int parser_action_row628[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row617[] = {
+static int parser_action_row629[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row618[] = {
+static int parser_action_row630[] = {
        4,
-       -1, 1, 135,
-       4, 0, 720,
-       14, 0, 721,
-       15, 0, 722
+       -1, 1, 119,
+       4, 0, 733,
+       14, 0, 734,
+       15, 0, 735
 };
-static int parser_action_row619[] = {
+static int parser_action_row631[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row620[] = {
+static int parser_action_row632[] = {
        1,
-       -1, 1, 123
+       -1, 1, 107
 };
-static int parser_action_row621[] = {
+static int parser_action_row633[] = {
        2,
-       -1, 1, 372,
-       60, 0, 189
+       -1, 1, 363,
+       57, 0, 193
 };
-static int parser_action_row622[] = {
+static int parser_action_row634[] = {
        2,
-       -1, 3, 621,
-       60, 0, 190
+       -1, 3, 633,
+       57, 0, 194
 };
-static int parser_action_row623[] = {
+static int parser_action_row635[] = {
        2,
        -1, 1, 51,
-       56, 0, 727
+       53, 0, 740
 };
-static int parser_action_row624[] = {
+static int parser_action_row636[] = {
        2,
-       -1, 3, 623,
-       83, 0, 729
+       -1, 3, 635,
+       81, 0, 742
 };
-static int parser_action_row625[] = {
+static int parser_action_row637[] = {
        3,
-       -1, 3, 624,
-       83, 0, 730,
-       84, 0, 621
+       -1, 3, 636,
+       81, 0, 743,
+       82, 0, 633
 };
-static int parser_action_row626[] = {
+static int parser_action_row638[] = {
        1,
-       -1, 1, 285
+       -1, 1, 272
 };
-static int parser_action_row627[] = {
+static int parser_action_row639[] = {
        1,
-       -1, 1, 196
+       -1, 1, 180
 };
-static int parser_action_row628[] = {
+static int parser_action_row640[] = {
        3,
-       -1, 3, 627,
-       34, 0, 732,
-       54, 0, 733
+       -1, 3, 639,
+       31, 0, 745,
+       51, 0, 746
 };
-static int parser_action_row629[] = {
+static int parser_action_row641[] = {
        4,
-       -1, 1, 280,
-       61, 0, 734,
-       62, 0, 365,
-       63, 0, 366
+       -1, 1, 267,
+       58, 0, 747,
+       59, 0, 371,
+       60, 0, 372
 };
-static int parser_action_row630[] = {
+static int parser_action_row642[] = {
        4,
-       -1, 1, 282,
-       61, 0, 736,
-       62, 0, 365,
-       63, 0, 366
+       -1, 1, 269,
+       58, 0, 749,
+       59, 0, 371,
+       60, 0, 372
 };
-static int parser_action_row631[] = {
+static int parser_action_row643[] = {
        1,
-       -1, 1, 193
+       -1, 1, 177
 };
-static int parser_action_row632[] = {
+static int parser_action_row644[] = {
        23,
-       -1, 1, 353,
-       12, 0, 106,
-       25, 0, 107,
-       34, 0, 108,
-       41, 0, 109,
-       43, 0, 110,
-       44, 1, 367,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       54, 0, 379,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       85, 1, 367,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       -1, 1, 344,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 358,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       51, 0, 385,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       83, 1, 358,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
-static int parser_action_row633[] = {
+static int parser_action_row645[] = {
        23,
-       -1, 1, 353,
-       12, 0, 106,
-       25, 0, 107,
-       34, 0, 108,
-       41, 0, 109,
-       43, 0, 110,
-       44, 1, 367,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       54, 0, 379,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       85, 1, 367,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       -1, 1, 344,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 358,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       51, 0, 385,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       83, 1, 358,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
-static int parser_action_row634[] = {
+static int parser_action_row646[] = {
        3,
-       -1, 1, 365,
-       12, 0, 740,
-       84, 0, 383
+       -1, 1, 356,
+       12, 0, 753,
+       82, 0, 389
 };
-static int parser_action_row635[] = {
+static int parser_action_row647[] = {
        1,
-       -1, 1, 312
+       -1, 1, 299
 };
-static int parser_action_row636[] = {
+static int parser_action_row648[] = {
        1,
-       -1, 1, 352
+       -1, 1, 343
 };
-static int parser_action_row637[] = {
+static int parser_action_row649[] = {
        2,
-       -1, 3, 636,
-       55, 0, 741
+       -1, 3, 648,
+       52, 0, 754
 };
-static int parser_action_row638[] = {
+static int parser_action_row650[] = {
        1,
-       -1, 1, 347
+       -1, 1, 338
 };
-static int parser_action_row639[] = {
+static int parser_action_row651[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row640[] = {
+static int parser_action_row652[] = {
        3,
-       -1, 3, 639,
-       83, 0, 48,
-       84, 0, 49
+       -1, 3, 651,
+       81, 0, 48,
+       82, 0, 49
 };
-static int parser_action_row641[] = {
+static int parser_action_row653[] = {
        2,
-       -1, 3, 640,
-       85, 0, 744
+       -1, 3, 652,
+       83, 0, 757
 };
-static int parser_action_row642[] = {
+static int parser_action_row654[] = {
        1,
-       -1, 1, 507
+       -1, 1, 499
 };
-static int parser_action_row643[] = {
+static int parser_action_row655[] = {
        1,
-       -1, 1, 541
+       -1, 1, 536
 };
-static int parser_action_row644[] = {
+static int parser_action_row656[] = {
        3,
-       -1, 3, 643,
-       34, 0, 745,
-       54, 0, 746
+       -1, 3, 655,
+       31, 0, 758,
+       51, 0, 759
 };
-static int parser_action_row645[] = {
+static int parser_action_row657[] = {
        1,
-       -1, 1, 536
+       -1, 1, 531
 };
-static int parser_action_row646[] = {
+static int parser_action_row658[] = {
        1,
-       -1, 1, 538
+       -1, 1, 533
 };
-static int parser_action_row647[] = {
+static int parser_action_row659[] = {
        1,
-       -1, 1, 176
+       -1, 1, 160
 };
-static int parser_action_row648[] = {
+static int parser_action_row660[] = {
        1,
-       -1, 1, 209
+       -1, 1, 193
 };
-static int parser_action_row649[] = {
+static int parser_action_row661[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row650[] = {
+static int parser_action_row662[] = {
        1,
-       -1, 1, 231
+       -1, 1, 215
 };
-static int parser_action_row651[] = {
+static int parser_action_row663[] = {
        26,
-       -1, 1, 353,
-       12, 0, 106,
-       25, 0, 107,
-       34, 0, 108,
-       41, 0, 109,
-       43, 0, 110,
-       44, 1, 367,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       54, 0, 116,
-       56, 1, 349,
-       64, 1, 349,
-       66, 1, 349,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       85, 1, 367,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       -1, 1, 344,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 358,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       51, 0, 117,
+       53, 1, 340,
+       61, 1, 340,
+       63, 1, 340,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       83, 1, 358,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
-static int parser_action_row652[] = {
+static int parser_action_row664[] = {
        32,
-       -1, 1, 367,
+       -1, 1, 358,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 749,
-       12, 0, 650,
-       15, 0, 651,
-       18, 0, 652,
-       25, 0, 653,
-       28, 0, 655,
-       29, 0, 656,
-       30, 0, 657,
-       36, 0, 658,
-       37, 0, 659,
-       38, 0, 660,
-       39, 0, 661,
-       40, 0, 662,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 663,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       9, 0, 762,
+       12, 0, 662,
+       15, 0, 663,
+       16, 0, 664,
+       22, 0, 665,
+       25, 0, 667,
+       26, 0, 668,
+       27, 0, 669,
+       33, 0, 670,
+       34, 0, 671,
+       35, 0, 672,
+       36, 0, 673,
+       37, 0, 674,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 675,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row653[] = {
+static int parser_action_row665[] = {
        2,
-       -1, 3, 652,
-       84, 0, 754
+       -1, 3, 664,
+       82, 0, 767
 };
-static int parser_action_row654[] = {
+static int parser_action_row666[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row655[] = {
+static int parser_action_row667[] = {
        32,
-       -1, 1, 367,
+       -1, 1, 358,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 458,
+       9, 0, 466,
        12, 0, 26,
        15, 0, 28,
-       18, 0, 29,
-       25, 0, 30,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       36, 0, 35,
-       37, 0, 36,
-       38, 0, 37,
-       39, 0, 38,
-       40, 0, 39,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 45,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       16, 0, 29,
+       22, 0, 30,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       33, 0, 35,
+       34, 0, 36,
+       35, 0, 37,
+       36, 0, 38,
+       37, 0, 39,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 45,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row656[] = {
+static int parser_action_row668[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row657[] = {
+static int parser_action_row669[] = {
        32,
-       -1, 1, 367,
+       -1, 1, 358,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 749,
-       12, 0, 650,
-       15, 0, 651,
-       18, 0, 652,
-       25, 0, 653,
-       28, 0, 655,
-       29, 0, 656,
-       30, 0, 657,
-       36, 0, 658,
-       37, 0, 659,
-       38, 0, 660,
-       39, 0, 661,
-       40, 0, 662,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 663,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       9, 0, 762,
+       12, 0, 662,
+       15, 0, 663,
+       16, 0, 664,
+       22, 0, 665,
+       25, 0, 667,
+       26, 0, 668,
+       27, 0, 669,
+       33, 0, 670,
+       34, 0, 671,
+       35, 0, 672,
+       36, 0, 673,
+       37, 0, 674,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 675,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row658[] = {
+static int parser_action_row670[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row659[] = {
+static int parser_action_row671[] = {
        25,
-       -1, 1, 180,
-       12, 0, 152,
-       25, 0, 153,
-       27, 1, 632,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       44, 1, 367,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       85, 1, 367,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 164,
+       12, 0, 155,
+       22, 0, 156,
+       24, 1, 631,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       41, 1, 358,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       83, 1, 358,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row660[] = {
+static int parser_action_row672[] = {
        3,
-       -1, 1, 185,
-       27, 1, 637,
-       52, 0, 171
+       -1, 1, 169,
+       24, 1, 636,
+       49, 0, 175
 };
-static int parser_action_row661[] = {
+static int parser_action_row673[] = {
        3,
-       -1, 1, 182,
-       27, 1, 634,
-       52, 0, 171
+       -1, 1, 166,
+       24, 1, 633,
+       49, 0, 175
 };
-static int parser_action_row662[] = {
+static int parser_action_row674[] = {
        2,
-       -1, 1, 184,
-       27, 1, 636
+       -1, 1, 168,
+       24, 1, 635
 };
-static int parser_action_row663[] = {
+static int parser_action_row675[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 174,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 178,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row664[] = {
+static int parser_action_row676[] = {
        2,
-       -1, 3, 663,
-       11, 0, 766
+       -1, 3, 675,
+       11, 0, 779
 };
-static int parser_action_row665[] = {
+static int parser_action_row677[] = {
        1,
-       -1, 1, 226
+       -1, 1, 210
 };
-static int parser_action_row666[] = {
+static int parser_action_row678[] = {
        1,
-       -1, 1, 228
+       -1, 1, 212
 };
-static int parser_action_row667[] = {
+static int parser_action_row679[] = {
        4,
-       -1, 3, 666,
-       56, 0, 205,
-       64, 0, 206,
-       66, 0, 767
+       -1, 3, 678,
+       53, 0, 209,
+       61, 0, 210,
+       63, 0, 780
 };
-static int parser_action_row668[] = {
+static int parser_action_row680[] = {
        3,
-       -1, 3, 667,
-       44, 0, 769,
-       85, 0, 770
+       -1, 3, 679,
+       41, 0, 782,
+       83, 0, 783
 };
-static int parser_action_row669[] = {
+static int parser_action_row681[] = {
        29,
-       -1, 1, 353,
-       12, 0, 106,
-       25, 0, 107,
-       34, 0, 108,
-       41, 0, 109,
-       43, 0, 110,
-       44, 1, 367,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       54, 0, 116,
-       56, 1, 349,
-       61, 1, 349,
-       62, 1, 349,
-       63, 1, 349,
-       64, 1, 349,
-       66, 1, 349,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       85, 1, 367,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       -1, 1, 344,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 358,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       51, 0, 117,
+       53, 1, 340,
+       58, 1, 340,
+       59, 1, 340,
+       60, 1, 340,
+       61, 1, 340,
+       63, 1, 340,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       83, 1, 358,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
-static int parser_action_row670[] = {
+static int parser_action_row682[] = {
        3,
-       -1, 1, 364,
-       12, 0, 773,
-       84, 0, 222
+       -1, 1, 355,
+       12, 0, 786,
+       82, 0, 226
 };
-static int parser_action_row671[] = {
+static int parser_action_row683[] = {
        31,
-       -1, 1, 367,
-       9, 0, 649,
+       -1, 1, 358,
+       9, 0, 661,
        12, 0, 26,
        15, 0, 28,
-       18, 0, 29,
-       25, 0, 30,
-       27, 0, 654,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       36, 0, 35,
-       37, 0, 36,
-       38, 0, 37,
-       39, 0, 38,
-       40, 0, 39,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 45,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       16, 0, 29,
+       22, 0, 30,
+       24, 0, 666,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       33, 0, 35,
+       34, 0, 36,
+       35, 0, 37,
+       36, 0, 38,
+       37, 0, 39,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 45,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row672[] = {
+static int parser_action_row684[] = {
        2,
-       -1, 3, 671,
-       27, 0, 777
+       -1, 3, 683,
+       24, 0, 790
 };
-static int parser_action_row673[] = {
+static int parser_action_row685[] = {
+       1,
+       -1, 1, 629
+};
+static int parser_action_row686[] = {
        1,
        -1, 1, 630
 };
-static int parser_action_row674[] = {
+static int parser_action_row687[] = {
        1,
-       -1, 1, 631
+       -1, 1, 638
 };
-static int parser_action_row675[] = {
+static int parser_action_row688[] = {
        1,
        -1, 1, 639
 };
-static int parser_action_row676[] = {
+static int parser_action_row689[] = {
        1,
-       -1, 1, 640
+       -1, 1, 641
 };
-static int parser_action_row677[] = {
+static int parser_action_row690[] = {
        1,
-       -1, 1, 642
+       -1, 1, 640
 };
-static int parser_action_row678[] = {
+static int parser_action_row691[] = {
        1,
-       -1, 1, 641
+       -1, 1, 642
 };
-static int parser_action_row679[] = {
+static int parser_action_row692[] = {
        1,
        -1, 1, 643
 };
-static int parser_action_row680[] = {
-       1,
-       -1, 1, 644
-};
-static int parser_action_row681[] = {
+static int parser_action_row693[] = {
        4,
-       -1, 1, 366,
-       12, 0, 778,
-       83, 0, 48,
-       84, 0, 224
+       -1, 1, 357,
+       12, 0, 791,
+       81, 0, 48,
+       82, 0, 228
 };
-static int parser_action_row682[] = {
+static int parser_action_row694[] = {
        1,
-       -1, 1, 235
+       -1, 1, 219
 };
-static int parser_action_row683[] = {
+static int parser_action_row695[] = {
        2,
-       -1, 3, 682,
-       52, 0, 171
+       -1, 3, 694,
+       49, 0, 175
 };
-static int parser_action_row684[] = {
+static int parser_action_row696[] = {
        3,
-       -1, 3, 683,
-       55, 0, 781,
-       58, 0, 556
+       -1, 3, 695,
+       52, 0, 794,
+       55, 0, 566
 };
-static int parser_action_row685[] = {
+static int parser_action_row697[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row686[] = {
+static int parser_action_row698[] = {
        2,
-       -1, 3, 685,
-       84, 0, 783
+       -1, 3, 697,
+       82, 0, 796
 };
-static int parser_action_row687[] = {
+static int parser_action_row699[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row688[] = {
+static int parser_action_row700[] = {
        2,
-       -1, 3, 687,
-       85, 0, 785
+       -1, 3, 699,
+       83, 0, 798
 };
-static int parser_action_row689[] = {
+static int parser_action_row701[] = {
        1,
-       -1, 1, 251
+       -1, 1, 235
 };
-static int parser_action_row690[] = {
+static int parser_action_row702[] = {
        1,
-       -1, 1, 280
+       -1, 1, 267
 };
-static int parser_action_row691[] = {
+static int parser_action_row703[] = {
        1,
-       -1, 1, 282
+       -1, 1, 269
 };
-static int parser_action_row692[] = {
+static int parser_action_row704[] = {
        3,
-       -1, 3, 691,
-       50, 0, 338,
-       83, 0, 339
+       -1, 3, 703,
+       47, 0, 344,
+       81, 0, 345
 };
-static int parser_action_row693[] = {
+static int parser_action_row705[] = {
        2,
-       -1, 1, 161,
-       58, 0, 787
+       -1, 1, 145,
+       55, 0, 800
 };
-static int parser_action_row694[] = {
+static int parser_action_row706[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row695[] = {
+static int parser_action_row707[] = {
        2,
        -1, 1, 42,
        13, 0, 27
 };
-static int parser_action_row696[] = {
+static int parser_action_row708[] = {
        4,
-       -1, 3, 695,
-       16, 0, 594,
-       17, 0, 595,
-       84, 0, 596
+       -1, 3, 707,
+       6, 0, 606,
+       17, 0, 607,
+       82, 0, 608
 };
-static int parser_action_row697[] = {
+static int parser_action_row709[] = {
        2,
-       -1, 1, 349,
-       54, 0, 238
+       -1, 1, 340,
+       51, 0, 242
 };
-static int parser_action_row698[] = {
+static int parser_action_row710[] = {
        2,
-       -1, 3, 697,
-       84, 0, 222
+       -1, 3, 709,
+       82, 0, 226
 };
-static int parser_action_row699[] = {
+static int parser_action_row711[] = {
        3,
-       -1, 3, 698,
-       83, 0, 48,
-       84, 0, 224
+       -1, 3, 710,
+       81, 0, 48,
+       82, 0, 228
 };
-static int parser_action_row700[] = {
+static int parser_action_row712[] = {
+       4,
+       -1, 3, 711,
+       6, 0, 606,
+       17, 0, 607,
+       82, 0, 608
+};
+static int parser_action_row713[] = {
+       2,
+       -1, 3, 712,
+       52, 0, 809
+};
+static int parser_action_row714[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row701[] = {
+static int parser_action_row715[] = {
        1,
        -1, 1, 814
 };
-static int parser_action_row702[] = {
-       2,
-       -1, 1, 324,
-       58, 0, 699
-};
-static int parser_action_row703[] = {
+static int parser_action_row716[] = {
        2,
-       -1, 3, 702,
-       55, 0, 797
+       -1, 1, 311,
+       55, 0, 713
 };
-static int parser_action_row704[] = {
+static int parser_action_row717[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row705[] = {
+static int parser_action_row718[] = {
        1,
-       -1, 1, 320
+       -1, 1, 307
 };
-static int parser_action_row706[] = {
+static int parser_action_row719[] = {
        3,
-       -1, 3, 705,
-       50, 0, 338,
-       83, 0, 339
+       -1, 3, 718,
+       47, 0, 344,
+       81, 0, 345
 };
-static int parser_action_row707[] = {
+static int parser_action_row720[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row708[] = {
+static int parser_action_row721[] = {
        1,
-       -1, 1, 302
+       -1, 1, 290
 };
-static int parser_action_row709[] = {
+static int parser_action_row722[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row710[] = {
+static int parser_action_row723[] = {
        21,
-       -1, 1, 367,
-       12, 0, 802,
-       25, 0, 803,
-       34, 0, 804,
-       41, 0, 805,
-       43, 0, 806,
-       45, 0, 807,
-       46, 0, 808,
-       47, 0, 809,
-       48, 0, 810,
-       51, 0, 811,
-       54, 0, 812,
-       68, 0, 813,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 814,
-       87, 0, 815,
-       88, 0, 816,
-       89, 0, 817,
-       90, 0, 54,
-       93, 0, 818
+       -1, 1, 358,
+       12, 0, 816,
+       22, 0, 817,
+       31, 0, 818,
+       38, 0, 819,
+       40, 0, 820,
+       42, 0, 821,
+       43, 0, 822,
+       44, 0, 823,
+       45, 0, 824,
+       48, 0, 825,
+       51, 0, 826,
+       65, 0, 827,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 828,
+       85, 0, 829,
+       86, 0, 830,
+       87, 0, 831,
+       88, 0, 54,
+       91, 0, 832
 };
-static int parser_action_row711[] = {
+static int parser_action_row724[] = {
        1,
        -1, 1, 823
 };
-static int parser_action_row712[] = {
+static int parser_action_row725[] = {
        2,
-       -1, 3, 711,
-       84, 0, 831
+       -1, 3, 724,
+       82, 0, 847
 };
-static int parser_action_row713[] = {
+static int parser_action_row726[] = {
        4,
        -1, 1, 42,
-       0, 0, 82,
-       1, 0, 83,
+       0, 0, 83,
+       1, 0, 84,
        13, 0, 27
 };
-static int parser_action_row714[] = {
+static int parser_action_row727[] = {
        3,
-       -1, 3, 713,
-       0, 0, 82,
-       1, 0, 83
+       -1, 3, 726,
+       0, 0, 83,
+       1, 0, 84
 };
-static int parser_action_row715[] = {
+static int parser_action_row728[] = {
        2,
-       -1, 1, 361,
-       60, 0, 190
+       -1, 1, 352,
+       57, 0, 194
 };
-static int parser_action_row716[] = {
+static int parser_action_row729[] = {
        1,
        -1, 1, 18
 };
-static int parser_action_row717[] = {
+static int parser_action_row730[] = {
        3,
-       -1, 3, 716,
-       0, 0, 82,
-       1, 0, 83
+       -1, 3, 729,
+       0, 0, 83,
+       1, 0, 84
 };
-static int parser_action_row718[] = {
+static int parser_action_row731[] = {
        1,
-       -1, 1, 119
+       -1, 1, 103
 };
-static int parser_action_row719[] = {
+static int parser_action_row732[] = {
        2,
-       -1, 1, 126,
-       84, 0, 838
+       -1, 1, 110,
+       82, 0, 854
 };
-static int parser_action_row720[] = {
+static int parser_action_row733[] = {
        3,
-       -1, 3, 719,
-       50, 0, 338,
-       83, 0, 339
+       -1, 3, 732,
+       47, 0, 344,
+       81, 0, 345
 };
-static int parser_action_row721[] = {
+static int parser_action_row734[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row722[] = {
-       6,
+static int parser_action_row735[] = {
+       4,
        -1, 1, 42,
-       0, 0, 82,
-       1, 0, 83,
-       13, 0, 27,
-       19, 0, 843,
-       20, 0, 844
+       0, 0, 83,
+       1, 0, 84,
+       13, 0, 27
 };
-static int parser_action_row723[] = {
+static int parser_action_row736[] = {
        32,
-       -1, 1, 367,
+       -1, 1, 358,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 458,
+       9, 0, 466,
        12, 0, 26,
        15, 0, 28,
-       18, 0, 29,
-       25, 0, 30,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       36, 0, 35,
-       37, 0, 36,
-       38, 0, 37,
-       39, 0, 38,
-       40, 0, 39,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 45,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       16, 0, 29,
+       22, 0, 30,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       33, 0, 35,
+       34, 0, 36,
+       35, 0, 37,
+       36, 0, 38,
+       37, 0, 39,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 45,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row724[] = {
+static int parser_action_row737[] = {
        3,
-       -1, 1, 135,
-       4, 0, 720,
-       15, 0, 848
+       -1, 1, 119,
+       4, 0, 733,
+       15, 0, 862
 };
-static int parser_action_row725[] = {
+static int parser_action_row738[] = {
        3,
-       -1, 3, 724,
-       31, 0, 34,
-       96, 0, 56
+       -1, 3, 737,
+       28, 0, 34,
+       94, 0, 56
 };
-static int parser_action_row726[] = {
+static int parser_action_row739[] = {
        1,
-       -1, 1, 393
+       -1, 1, 384
 };
-static int parser_action_row727[] = {
+static int parser_action_row740[] = {
        1,
-       -1, 1, 122
+       -1, 1, 106
 };
-static int parser_action_row728[] = {
+static int parser_action_row741[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row729[] = {
+static int parser_action_row742[] = {
        5,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2,
-       31, 0, 34,
-       96, 0, 56
+       28, 0, 34,
+       94, 0, 56
 };
-static int parser_action_row730[] = {
+static int parser_action_row743[] = {
        1,
-       -1, 1, 373
+       -1, 1, 364
 };
-static int parser_action_row731[] = {
+static int parser_action_row744[] = {
        2,
-       -1, 1, 375,
-       60, 0, 189
+       -1, 1, 366,
+       57, 0, 193
 };
-static int parser_action_row732[] = {
+static int parser_action_row745[] = {
        2,
-       -1, 3, 731,
-       83, 0, 861
+       -1, 3, 744,
+       81, 0, 875
 };
-static int parser_action_row733[] = {
+static int parser_action_row746[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row734[] = {
+static int parser_action_row747[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row735[] = {
+static int parser_action_row748[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row736[] = {
+static int parser_action_row749[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row737[] = {
+static int parser_action_row750[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row738[] = {
+static int parser_action_row751[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row739[] = {
+static int parser_action_row752[] = {
        1,
-       -1, 1, 198
+       -1, 1, 182
 };
-static int parser_action_row740[] = {
+static int parser_action_row753[] = {
        1,
-       -1, 1, 200
+       -1, 1, 184
 };
-static int parser_action_row741[] = {
+static int parser_action_row754[] = {
        23,
-       -1, 1, 353,
-       12, 0, 106,
-       25, 0, 107,
-       34, 0, 108,
-       41, 0, 109,
-       43, 0, 110,
-       44, 1, 367,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       54, 0, 379,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       85, 1, 367,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       -1, 1, 344,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 358,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       51, 0, 385,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       83, 1, 358,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
-static int parser_action_row742[] = {
+static int parser_action_row755[] = {
        1,
-       -1, 1, 350
+       -1, 1, 341
 };
-static int parser_action_row743[] = {
+static int parser_action_row756[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row744[] = {
+static int parser_action_row757[] = {
        2,
-       -1, 1, 349,
-       54, 0, 238
+       -1, 1, 340,
+       51, 0, 242
 };
-static int parser_action_row745[] = {
+static int parser_action_row758[] = {
        4,
-       -1, 1, 534,
-       56, 1, 536,
-       64, 1, 536,
-       66, 1, 536
+       -1, 1, 528,
+       53, 1, 531,
+       61, 1, 531,
+       63, 1, 531
 };
-static int parser_action_row746[] = {
+static int parser_action_row759[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row747[] = {
+static int parser_action_row760[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row748[] = {
+static int parser_action_row761[] = {
        1,
-       -1, 1, 210
+       -1, 1, 194
 };
-static int parser_action_row749[] = {
+static int parser_action_row762[] = {
        2,
-       -1, 1, 197,
-       27, 1, 649
+       -1, 1, 181,
+       24, 1, 648
 };
-static int parser_action_row750[] = {
+static int parser_action_row763[] = {
        3,
-       -1, 1, 169,
-       27, 1, 628,
-       52, 1, 727
+       -1, 1, 153,
+       24, 1, 627,
+       49, 1, 726
 };
-static int parser_action_row751[] = {
+static int parser_action_row764[] = {
        30,
-       -1, 1, 367,
-       9, 0, 873,
+       -1, 1, 358,
+       9, 0, 887,
        12, 0, 26,
        15, 0, 28,
-       18, 0, 29,
-       25, 0, 30,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       36, 0, 35,
-       37, 0, 36,
-       38, 0, 37,
-       39, 0, 38,
-       40, 0, 39,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 45,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       16, 0, 29,
+       22, 0, 30,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       33, 0, 35,
+       34, 0, 36,
+       35, 0, 37,
+       36, 0, 38,
+       37, 0, 39,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 45,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row752[] = {
+static int parser_action_row765[] = {
        1,
-       -1, 1, 672
+       -1, 1, 671
 };
-static int parser_action_row753[] = {
+static int parser_action_row766[] = {
        1,
-       -1, 1, 629
+       -1, 1, 628
 };
-static int parser_action_row754[] = {
+static int parser_action_row767[] = {
        2,
-       -1, 3, 753,
-       52, 0, 171
+       -1, 3, 766,
+       49, 0, 175
 };
-static int parser_action_row755[] = {
+static int parser_action_row768[] = {
        3,
-       -1, 1, 166,
-       59, 0, 287,
-       82, 0, 180
+       -1, 1, 150,
+       56, 0, 292,
+       80, 0, 184
 };
-static int parser_action_row756[] = {
+static int parser_action_row769[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row757[] = {
+static int parser_action_row770[] = {
        1,
-       -1, 1, 230
+       -1, 1, 214
 };
-static int parser_action_row758[] = {
+static int parser_action_row771[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row759[] = {
+static int parser_action_row772[] = {
        1,
-       -1, 1, 675
+       -1, 1, 674
 };
-static int parser_action_row760[] = {
+static int parser_action_row773[] = {
        2,
-       -1, 3, 759,
-       52, 0, 171
+       -1, 3, 772,
+       49, 0, 175
 };
-static int parser_action_row761[] = {
+static int parser_action_row774[] = {
        3,
-       -1, 3, 760,
-       54, 0, 881,
-       84, 0, 294
+       -1, 3, 773,
+       51, 0, 895,
+       82, 0, 299
 };
-static int parser_action_row762[] = {
+static int parser_action_row775[] = {
        1,
-       -1, 1, 633
+       -1, 1, 632
 };
-static int parser_action_row763[] = {
+static int parser_action_row776[] = {
        2,
-       -1, 1, 186,
-       27, 1, 638
+       -1, 1, 170,
+       24, 1, 637
 };
-static int parser_action_row764[] = {
+static int parser_action_row777[] = {
        2,
-       -1, 1, 183,
-       27, 1, 635
+       -1, 1, 167,
+       24, 1, 634
 };
-static int parser_action_row765[] = {
+static int parser_action_row778[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row766[] = {
+static int parser_action_row779[] = {
        2,
-       -1, 3, 765,
-       27, 0, 884
+       -1, 3, 778,
+       24, 0, 898
 };
-static int parser_action_row767[] = {
+static int parser_action_row780[] = {
        3,
-       -1, 3, 766,
-       50, 0, 338,
-       83, 0, 339
+       -1, 3, 779,
+       47, 0, 344,
+       81, 0, 345
 };
-static int parser_action_row768[] = {
+static int parser_action_row781[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row769[] = {
+static int parser_action_row782[] = {
        4,
-       -1, 1, 287,
-       61, 0, 887,
-       62, 0, 365,
-       63, 0, 366
+       -1, 1, 274,
+       58, 0, 901,
+       59, 0, 371,
+       60, 0, 372
 };
-static int parser_action_row770[] = {
+static int parser_action_row783[] = {
        26,
-       -1, 1, 353,
-       12, 0, 106,
-       25, 0, 107,
-       34, 0, 108,
-       41, 0, 109,
-       43, 0, 110,
-       44, 1, 367,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       54, 0, 116,
-       56, 1, 349,
-       64, 1, 349,
-       66, 1, 349,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       85, 1, 367,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       -1, 1, 344,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 358,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       51, 0, 117,
+       53, 1, 340,
+       61, 1, 340,
+       63, 1, 340,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       83, 1, 358,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
-static int parser_action_row771[] = {
+static int parser_action_row784[] = {
        4,
-       -1, 1, 281,
-       61, 0, 890,
-       62, 0, 365,
-       63, 0, 366
+       -1, 1, 268,
+       58, 0, 904,
+       59, 0, 371,
+       60, 0, 372
 };
-static int parser_action_row772[] = {
+static int parser_action_row785[] = {
        4,
-       -1, 1, 283,
-       61, 0, 892,
-       62, 0, 365,
-       63, 0, 366
+       -1, 1, 270,
+       58, 0, 906,
+       59, 0, 371,
+       60, 0, 372
 };
-static int parser_action_row773[] = {
+static int parser_action_row786[] = {
        2,
-       -1, 1, 194,
-       27, 1, 646
+       -1, 1, 178,
+       24, 1, 645
 };
-static int parser_action_row774[] = {
+static int parser_action_row787[] = {
        23,
-       -1, 1, 353,
-       12, 0, 106,
-       25, 0, 107,
-       34, 0, 108,
-       41, 0, 109,
-       43, 0, 110,
-       44, 1, 367,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       54, 0, 379,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       85, 1, 367,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       -1, 1, 344,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 358,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       51, 0, 385,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       83, 1, 358,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
-static int parser_action_row775[] = {
+static int parser_action_row788[] = {
        3,
-       -1, 3, 774,
-       9, 0, 649,
-       27, 0, 654
+       -1, 3, 787,
+       9, 0, 661,
+       24, 0, 666
 };
-static int parser_action_row776[] = {
+static int parser_action_row789[] = {
        3,
-       -1, 3, 775,
+       -1, 3, 788,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row777[] = {
+static int parser_action_row790[] = {
        1,
-       -1, 1, 229
+       -1, 1, 213
 };
-static int parser_action_row778[] = {
+static int parser_action_row791[] = {
        32,
-       -1, 1, 367,
+       -1, 1, 358,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 458,
+       9, 0, 466,
        12, 0, 26,
        15, 0, 28,
-       18, 0, 29,
-       25, 0, 30,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       36, 0, 35,
-       37, 0, 36,
-       38, 0, 37,
-       39, 0, 38,
-       40, 0, 39,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 45,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       16, 0, 29,
+       22, 0, 30,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       33, 0, 35,
+       34, 0, 36,
+       35, 0, 37,
+       36, 0, 38,
+       37, 0, 39,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 45,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row779[] = {
+static int parser_action_row792[] = {
        23,
-       -1, 1, 353,
-       12, 0, 106,
-       25, 0, 107,
-       34, 0, 108,
-       41, 0, 109,
-       43, 0, 110,
-       44, 1, 367,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       54, 0, 379,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       85, 1, 367,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       -1, 1, 344,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 358,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       51, 0, 385,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       83, 1, 358,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
-static int parser_action_row780[] = {
+static int parser_action_row793[] = {
        3,
-       -1, 1, 365,
-       12, 0, 899,
-       84, 0, 383
+       -1, 1, 356,
+       12, 0, 913,
+       82, 0, 389
 };
-static int parser_action_row781[] = {
+static int parser_action_row794[] = {
        1,
-       -1, 1, 234
+       -1, 1, 218
 };
-static int parser_action_row782[] = {
+static int parser_action_row795[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row783[] = {
+static int parser_action_row796[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row784[] = {
+static int parser_action_row797[] = {
        1,
-       -1, 1, 359
+       -1, 1, 350
 };
-static int parser_action_row785[] = {
+static int parser_action_row798[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row786[] = {
+static int parser_action_row799[] = {
        4,
-       -1, 1, 278,
-       56, 1, 280,
-       64, 1, 280,
-       66, 1, 280
+       -1, 1, 264,
+       53, 1, 267,
+       61, 1, 267,
+       63, 1, 267
 };
-static int parser_action_row787[] = {
+static int parser_action_row800[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row788[] = {
+static int parser_action_row801[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row789[] = {
+static int parser_action_row802[] = {
        1,
        -1, 1, 808
 };
-static int parser_action_row790[] = {
+static int parser_action_row803[] = {
        2,
-       -1, 1, 162,
-       58, 0, 787
+       -1, 1, 146,
+       55, 0, 800
 };
-static int parser_action_row791[] = {
+static int parser_action_row804[] = {
        2,
-       -1, 3, 790,
-       57, 0, 906
+       -1, 3, 803,
+       54, 0, 920
 };
-static int parser_action_row792[] = {
+static int parser_action_row805[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row793[] = {
+static int parser_action_row806[] = {
        2,
-       -1, 1, 562,
-       82, 0, 463
+       -1, 1, 557,
+       80, 0, 471
 };
-static int parser_action_row794[] = {
+static int parser_action_row807[] = {
        1,
-       -1, 1, 288
+       -1, 1, 275
 };
-static int parser_action_row795[] = {
+static int parser_action_row808[] = {
        2,
-       -1, 3, 794,
-       84, 0, 383
+       -1, 3, 807,
+       82, 0, 389
 };
-static int parser_action_row796[] = {
+static int parser_action_row809[] = {
+       13,
+       -1, 1, 306,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       51, 0, 923,
+       80, 0, 184,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
+};
+static int parser_action_row810[] = {
+       1,
+       -1, 1, 304
+};
+static int parser_action_row811[] = {
        2,
        -1, 1, 42,
        13, 0, 27
 };
-static int parser_action_row797[] = {
+static int parser_action_row812[] = {
        1,
        -1, 1, 815
 };
-static int parser_action_row798[] = {
-       1,
-       -1, 1, 317
-};
-static int parser_action_row799[] = {
+static int parser_action_row813[] = {
        35,
-       -1, 1, 367,
-       12, 0, 152,
+       -1, 1, 358,
+       12, 0, 155,
        15, 0, 28,
-       18, 0, 29,
-       25, 0, 153,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       34, 0, 154,
-       36, 0, 910,
-       37, 0, 911,
-       38, 0, 912,
-       39, 0, 913,
-       40, 0, 39,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       50, 0, 338,
-       51, 0, 157,
-       53, 0, 914,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       82, 0, 180,
-       83, 0, 915,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       16, 0, 29,
+       22, 0, 156,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       31, 0, 157,
+       33, 0, 928,
+       34, 0, 929,
+       35, 0, 930,
+       36, 0, 931,
+       37, 0, 39,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       47, 0, 344,
+       48, 0, 160,
+       50, 0, 932,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       80, 0, 184,
+       81, 0, 933,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row800[] = {
+static int parser_action_row814[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row801[] = {
+static int parser_action_row815[] = {
        2,
-       -1, 3, 800,
-       57, 0, 933
+       -1, 3, 814,
+       54, 0, 951
 };
-static int parser_action_row802[] = {
+static int parser_action_row816[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row803[] = {
+static int parser_action_row817[] = {
        2,
-       -1, 1, 349,
-       54, 0, 238
+       -1, 1, 340,
+       51, 0, 242
 };
-static int parser_action_row804[] = {
+static int parser_action_row818[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row805[] = {
+static int parser_action_row819[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row806[] = {
+static int parser_action_row820[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row807[] = {
+static int parser_action_row821[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row808[] = {
+static int parser_action_row822[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
-static int parser_action_row809[] = {
+static int parser_action_row823[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
-static int parser_action_row810[] = {
+static int parser_action_row824[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
-static int parser_action_row811[] = {
+static int parser_action_row825[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
-static int parser_action_row812[] = {
+static int parser_action_row826[] = {
        16,
-       -1, 1, 367,
-       12, 0, 802,
-       41, 0, 944,
-       45, 0, 807,
-       46, 0, 808,
-       47, 0, 809,
-       48, 0, 810,
-       54, 0, 812,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 814,
-       87, 0, 815,
-       88, 0, 816,
-       89, 0, 817,
-       90, 0, 54,
-       93, 0, 818
+       -1, 1, 358,
+       12, 0, 816,
+       38, 0, 962,
+       42, 0, 821,
+       43, 0, 822,
+       44, 0, 823,
+       45, 0, 824,
+       51, 0, 826,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 828,
+       85, 0, 829,
+       86, 0, 830,
+       87, 0, 831,
+       88, 0, 54,
+       91, 0, 832
 };
-static int parser_action_row813[] = {
+static int parser_action_row827[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row814[] = {
+static int parser_action_row828[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row815[] = {
+static int parser_action_row829[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
-static int parser_action_row816[] = {
+static int parser_action_row830[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
-static int parser_action_row817[] = {
+static int parser_action_row831[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
-static int parser_action_row818[] = {
+static int parser_action_row832[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
-static int parser_action_row819[] = {
+static int parser_action_row833[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
-static int parser_action_row820[] = {
+static int parser_action_row834[] = {
        1,
-       -1, 1, 454
+       -1, 1, 450
 };
-static int parser_action_row821[] = {
+static int parser_action_row835[] = {
        3,
-       -1, 3, 820,
-       44, 0, 954,
-       85, 0, 955
+       -1, 3, 834,
+       41, 0, 972,
+       83, 0, 973
 };
-static int parser_action_row822[] = {
+static int parser_action_row836[] = {
        2,
-       -1, 1, 349,
-       54, 0, 238
+       -1, 1, 340,
+       51, 0, 242
 };
-static int parser_action_row823[] = {
+static int parser_action_row837[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row824[] = {
+static int parser_action_row838[] = {
        4,
-       -1, 1, 403,
-       32, 0, 958,
-       33, 0, 959,
-       35, 0, 960
+       -1, 1, 392,
+       29, 0, 976,
+       30, 0, 977,
+       32, 0, 978
 };
-static int parser_action_row825[] = {
+static int parser_action_row839[] = {
        1,
-       -1, 1, 405
+       -1, 1, 394
 };
-static int parser_action_row826[] = {
+static int parser_action_row840[] = {
        3,
-       -1, 1, 410,
-       76, 0, 961,
-       79, 0, 962
+       -1, 1, 399,
+       74, 0, 979,
+       77, 0, 980
 };
-static int parser_action_row827[] = {
+static int parser_action_row841[] = {
        11,
-       -1, 1, 412,
-       42, 0, 963,
-       67, 0, 964,
-       68, 0, 965,
-       72, 0, 966,
-       73, 0, 967,
-       74, 0, 968,
-       75, 0, 969,
-       77, 0, 970,
-       78, 0, 971,
-       80, 0, 972
+       -1, 1, 401,
+       39, 0, 981,
+       64, 0, 982,
+       65, 0, 983,
+       70, 0, 984,
+       71, 0, 985,
+       72, 0, 986,
+       73, 0, 987,
+       75, 0, 988,
+       76, 0, 989,
+       78, 0, 990
 };
-static int parser_action_row828[] = {
+static int parser_action_row842[] = {
        4,
-       -1, 1, 423,
-       69, 0, 973,
-       70, 0, 974,
-       71, 0, 975
+       -1, 1, 412,
+       66, 0, 991,
+       68, 0, 992,
+       69, 0, 993
 };
-static int parser_action_row829[] = {
+static int parser_action_row843[] = {
        1,
-       -1, 1, 426
+       -1, 1, 415
 };
-static int parser_action_row830[] = {
+static int parser_action_row844[] = {
+       2,
+       -1, 1, 419,
+       67, 0, 994
+};
+static int parser_action_row845[] = {
        1,
-       -1, 1, 430
+       -1, 1, 421
 };
-static int parser_action_row831[] = {
+static int parser_action_row846[] = {
        3,
-       -1, 1, 433,
-       64, 0, 976,
-       66, 0, 977
+       -1, 1, 424,
+       61, 0, 995,
+       63, 0, 996
 };
-static int parser_action_row832[] = {
+static int parser_action_row847[] = {
+       1,
+       -1, 1, 428
+};
+static int parser_action_row848[] = {
        2,
-       -1, 1, 362,
-       60, 0, 190
+       -1, 1, 353,
+       57, 0, 194
 };
-static int parser_action_row833[] = {
+static int parser_action_row849[] = {
        2,
-       -1, 3, 832,
-       84, 0, 978
+       -1, 3, 848,
+       82, 0, 997
 };
-static int parser_action_row834[] = {
+static int parser_action_row850[] = {
        1,
-       -1, 1, 90
+       -1, 1, 75
 };
-static int parser_action_row835[] = {
+static int parser_action_row851[] = {
        1,
-       -1, 1, 322
+       -1, 1, 309
 };
-static int parser_action_row836[] = {
+static int parser_action_row852[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row837[] = {
+static int parser_action_row853[] = {
        1,
        -1, 1, 16
 };
-static int parser_action_row838[] = {
+static int parser_action_row854[] = {
        1,
        -1, 1, 17
 };
-static int parser_action_row839[] = {
+static int parser_action_row855[] = {
        3,
-       -1, 1, 319,
-       59, 0, 616,
-       82, 0, 180
+       -1, 1, 306,
+       56, 0, 628,
+       80, 0, 184
 };
-static int parser_action_row840[] = {
+static int parser_action_row856[] = {
        2,
-       -1, 3, 839,
-       55, 0, 986
+       -1, 3, 855,
+       52, 0, 1005
 };
-static int parser_action_row841[] = {
+static int parser_action_row857[] = {
        4,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2,
-       58, 0, 987
-};
-static int parser_action_row842[] = {
-       1,
-       -1, 1, 164
-};
-static int parser_action_row843[] = {
-       20,
-       -1, 3, 842,
-       44, 0, 991,
-       50, 0, 338,
-       56, 0, 479,
-       67, 0, 480,
-       68, 0, 481,
-       69, 0, 482,
-       70, 0, 483,
-       71, 0, 484,
-       72, 0, 485,
-       73, 0, 486,
-       74, 0, 487,
-       75, 0, 488,
-       76, 0, 489,
-       77, 0, 490,
-       78, 0, 491,
-       79, 0, 492,
-       80, 0, 493,
-       83, 0, 339,
-       84, 0, 494
+       55, 0, 1006
 };
-static int parser_action_row844[] = {
+static int parser_action_row858[] = {
        1,
-       -1, 1, 394
+       -1, 1, 148
 };
-static int parser_action_row845[] = {
-       2,
-       -1, 1, 149,
-       89, 0, 997
+static int parser_action_row859[] = {
+       21,
+       -1, 3, 858,
+       41, 0, 1010,
+       47, 0, 344,
+       53, 0, 487,
+       64, 0, 488,
+       65, 0, 489,
+       66, 0, 490,
+       67, 0, 491,
+       68, 0, 492,
+       69, 0, 493,
+       70, 0, 494,
+       71, 0, 495,
+       72, 0, 496,
+       73, 0, 497,
+       74, 0, 498,
+       75, 0, 499,
+       76, 0, 500,
+       77, 0, 501,
+       78, 0, 502,
+       81, 0, 345,
+       82, 0, 503
 };
-static int parser_action_row846[] = {
+static int parser_action_row860[] = {
        3,
-       -1, 1, 93,
-       0, 1, 398,
-       1, 1, 398
+       -1, 1, 78,
+       0, 1, 387,
+       1, 1, 387
 };
-static int parser_action_row847[] = {
+static int parser_action_row861[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row848[] = {
+static int parser_action_row862[] = {
        2,
-       -1, 1, 378,
-       9, 0, 1000
+       -1, 1, 369,
+       9, 0, 1017
 };
-static int parser_action_row849[] = {
+static int parser_action_row863[] = {
        32,
-       -1, 1, 367,
+       -1, 1, 358,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 458,
+       9, 0, 466,
        12, 0, 26,
        15, 0, 28,
-       18, 0, 29,
-       25, 0, 30,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       36, 0, 35,
-       37, 0, 36,
-       38, 0, 37,
-       39, 0, 38,
-       40, 0, 39,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 45,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       16, 0, 29,
+       22, 0, 30,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       33, 0, 35,
+       34, 0, 36,
+       35, 0, 37,
+       36, 0, 38,
+       37, 0, 39,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 45,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row850[] = {
+static int parser_action_row864[] = {
        3,
-       -1, 3, 849,
-       31, 0, 34,
-       96, 0, 56
+       -1, 3, 863,
+       28, 0, 34,
+       94, 0, 56
 };
-static int parser_action_row851[] = {
+static int parser_action_row865[] = {
        1,
-       -1, 1, 396
+       -1, 1, 385
 };
-static int parser_action_row852[] = {
+static int parser_action_row866[] = {
        2,
-       -1, 3, 851,
-       83, 0, 1004
+       -1, 3, 865,
+       81, 0, 1021
 };
-static int parser_action_row853[] = {
+static int parser_action_row867[] = {
        1,
        -1, 1, 798
 };
-static int parser_action_row854[] = {
+static int parser_action_row868[] = {
        1,
        -1, 1, 800
 };
-static int parser_action_row855[] = {
+static int parser_action_row869[] = {
        3,
-       -1, 3, 854,
-       0, 0, 82,
-       1, 0, 83
+       -1, 3, 868,
+       0, 0, 83,
+       1, 0, 84
 };
-static int parser_action_row856[] = {
+static int parser_action_row870[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row857[] = {
+static int parser_action_row871[] = {
        1,
        -1, 1, 818
 };
-static int parser_action_row858[] = {
-       5,
-       -1, 1, 42,
-       9, 0, 1010,
+static int parser_action_row872[] = {
+       6,
+       -1, 1, 42,
+       6, 0, 1027,
+       9, 0, 1028,
        13, 0, 27,
-       44, 0, 1011,
-       84, 0, 1012
+       41, 0, 1029,
+       82, 0, 1030
 };
-static int parser_action_row859[] = {
+static int parser_action_row873[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row860[] = {
+static int parser_action_row874[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row861[] = {
+static int parser_action_row875[] = {
        5,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2,
-       31, 0, 34,
-       96, 0, 56
+       28, 0, 34,
+       94, 0, 56
 };
-static int parser_action_row862[] = {
+static int parser_action_row876[] = {
        1,
-       -1, 1, 374
+       -1, 1, 365
 };
-static int parser_action_row863[] = {
+static int parser_action_row877[] = {
        2,
-       -1, 3, 862,
-       48, 0, 1027
+       -1, 3, 876,
+       45, 0, 1043
 };
-static int parser_action_row864[] = {
+static int parser_action_row878[] = {
        4,
-       -1, 3, 863,
-       34, 0, 1028,
-       50, 0, 338,
-       83, 0, 339
+       -1, 3, 877,
+       31, 0, 1044,
+       47, 0, 344,
+       81, 0, 345
 };
-static int parser_action_row865[] = {
+static int parser_action_row879[] = {
        1,
-       -1, 1, 211
+       -1, 1, 195
 };
-static int parser_action_row866[] = {
+static int parser_action_row880[] = {
        1,
-       -1, 1, 216
+       -1, 1, 200
 };
-static int parser_action_row867[] = {
+static int parser_action_row881[] = {
        1,
-       -1, 1, 213
+       -1, 1, 197
 };
-static int parser_action_row868[] = {
+static int parser_action_row882[] = {
        1,
-       -1, 1, 218
+       -1, 1, 202
 };
-static int parser_action_row869[] = {
+static int parser_action_row883[] = {
        1,
-       -1, 1, 199
+       -1, 1, 183
 };
-static int parser_action_row870[] = {
+static int parser_action_row884[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row871[] = {
+static int parser_action_row885[] = {
        1,
-       -1, 1, 544
+       -1, 1, 539
 };
-static int parser_action_row872[] = {
+static int parser_action_row886[] = {
        2,
-       -1, 3, 871,
-       48, 0, 1031
+       -1, 3, 885,
+       45, 0, 1047
 };
-static int parser_action_row873[] = {
+static int parser_action_row887[] = {
        4,
-       -1, 3, 872,
-       34, 0, 1032,
-       50, 0, 338,
-       83, 0, 339
+       -1, 3, 886,
+       31, 0, 1048,
+       47, 0, 344,
+       81, 0, 345
 };
-static int parser_action_row874[] = {
+static int parser_action_row888[] = {
        3,
-       -1, 1, 168,
-       27, 1, 627,
-       52, 1, 726
+       -1, 1, 152,
+       24, 1, 626,
+       49, 1, 725
 };
-static int parser_action_row875[] = {
+static int parser_action_row889[] = {
        3,
-       -1, 1, 167,
-       27, 1, 626,
-       52, 1, 725
+       -1, 1, 151,
+       24, 1, 625,
+       49, 1, 724
 };
-static int parser_action_row876[] = {
+static int parser_action_row890[] = {
        2,
-       -1, 1, 223,
-       27, 1, 671
+       -1, 1, 207,
+       24, 1, 670
 };
-static int parser_action_row877[] = {
+static int parser_action_row891[] = {
        3,
-       -1, 1, 207,
-       27, 1, 657,
-       61, 0, 1034
+       -1, 1, 191,
+       24, 1, 656,
+       58, 0, 1050
 };
-static int parser_action_row878[] = {
+static int parser_action_row892[] = {
        2,
-       -1, 1, 166,
-       59, 0, 287
+       -1, 1, 150,
+       56, 0, 292
 };
-static int parser_action_row879[] = {
+static int parser_action_row893[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row880[] = {
+static int parser_action_row894[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row881[] = {
+static int parser_action_row895[] = {
        2,
-       -1, 1, 232,
-       27, 1, 674
+       -1, 1, 216,
+       24, 1, 673
 };
-static int parser_action_row882[] = {
+static int parser_action_row896[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row883[] = {
+static int parser_action_row897[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row884[] = {
+static int parser_action_row898[] = {
        2,
-       -1, 3, 883,
-       27, 0, 1040
+       -1, 3, 897,
+       24, 0, 1056
 };
-static int parser_action_row885[] = {
+static int parser_action_row899[] = {
        32,
-       -1, 1, 367,
+       -1, 1, 358,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 1041,
-       12, 0, 650,
-       15, 0, 651,
-       18, 0, 652,
-       25, 0, 653,
-       28, 0, 655,
-       29, 0, 656,
-       30, 0, 657,
-       36, 0, 658,
-       37, 0, 659,
-       38, 0, 660,
-       39, 0, 661,
-       40, 0, 662,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 663,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
-};
-static int parser_action_row886[] = {
-       2,
-       -1, 3, 885,
-       59, 0, 1044
-};
-static int parser_action_row887[] = {
-       5,
-       -1, 1, 367,
-       12, 0, 1045,
-       49, 0, 499,
-       83, 0, 48,
-       84, 0, 49
-};
-static int parser_action_row888[] = {
-       22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
-};
-static int parser_action_row889[] = {
-       22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
-};
-static int parser_action_row890[] = {
-       2,
-       -1, 1, 195,
-       27, 1, 647
-};
-static int parser_action_row891[] = {
-       22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
-};
-static int parser_action_row892[] = {
-       22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
-};
-static int parser_action_row893[] = {
-       22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
-};
-static int parser_action_row894[] = {
-       22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
-};
-static int parser_action_row895[] = {
-       2,
-       -1, 1, 201,
-       27, 1, 653
-};
-static int parser_action_row896[] = {
-       1,
-       -1, 1, 227
-};
-static int parser_action_row897[] = {
-       3,
-       -1, 3, 896,
-       0, 0, 1,
-       1, 0, 2
-};
-static int parser_action_row898[] = {
-       1,
-       -1, 1, 225
-};
-static int parser_action_row899[] = {
-       2,
-       -1, 1, 203,
-       27, 1, 655
+       9, 0, 1057,
+       12, 0, 662,
+       15, 0, 663,
+       16, 0, 664,
+       22, 0, 665,
+       25, 0, 667,
+       26, 0, 668,
+       27, 0, 669,
+       33, 0, 670,
+       34, 0, 671,
+       35, 0, 672,
+       36, 0, 673,
+       37, 0, 674,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 675,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row900[] = {
-       23,
-       -1, 1, 353,
-       12, 0, 106,
-       25, 0, 107,
-       34, 0, 108,
-       41, 0, 109,
-       43, 0, 110,
-       44, 1, 367,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       54, 0, 379,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       85, 1, 367,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       2,
+       -1, 3, 899,
+       56, 0, 1060
 };
 static int parser_action_row901[] = {
-       2,
-       -1, 3, 900,
-       31, 0, 1057
+       5,
+       -1, 1, 358,
+       12, 0, 1061,
+       46, 0, 508,
+       81, 0, 48,
+       82, 0, 49
 };
 static int parser_action_row902[] = {
-       2,
-       -1, 3, 901,
-       15, 0, 1058
+       22,
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row903[] = {
-       3,
-       -1, 1, 385,
-       0, 0, 1,
-       1, 0, 2
+       22,
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row904[] = {
        2,
-       -1, 3, 903,
-       57, 0, 1060
+       -1, 1, 179,
+       24, 1, 646
 };
 static int parser_action_row905[] = {
-       3,
-       -1, 3, 904,
-       50, 0, 338,
-       83, 0, 339
+       22,
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row906[] = {
-       1,
-       -1, 1, 809
+       22,
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row907[] = {
-       2,
-       -1, 1, 562,
-       82, 0, 463
+       22,
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row908[] = {
-       2,
-       -1, 3, 907,
-       55, 0, 1063
+       22,
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row909[] = {
-       1,
-       -1, 1, 563
+       2,
+       -1, 1, 185,
+       24, 1, 652
 };
 static int parser_action_row910[] = {
        1,
-       -1, 1, 336
+       -1, 1, 211
 };
 static int parser_action_row911[] = {
-       24,
-       -1, 1, 733,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       44, 1, 367,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       85, 1, 367,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       3,
+       -1, 3, 910,
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row912[] = {
-       2,
-       -1, 1, 738,
-       52, 0, 171
+       1,
+       -1, 1, 209
 };
 static int parser_action_row913[] = {
        2,
-       -1, 1, 735,
-       52, 0, 171
+       -1, 1, 187,
+       24, 1, 654
 };
 static int parser_action_row914[] = {
-       1,
-       -1, 1, 737
+       23,
+       -1, 1, 344,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 358,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       51, 0, 385,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       83, 1, 358,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
 static int parser_action_row915[] = {
        2,
        -1, 3, 914,
-       11, 0, 1067
+       28, 0, 1073
 };
 static int parser_action_row916[] = {
-       4,
-       -1, 1, 319,
-       56, 0, 470,
-       60, 0, 189,
-       82, 0, 180
+       2,
+       -1, 3, 915,
+       15, 0, 1074
 };
 static int parser_action_row917[] = {
-       1,
-       -1, 1, 340
+       3,
+       -1, 1, 376,
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row918[] = {
-       1,
-       -1, 1, 731
+       2,
+       -1, 3, 917,
+       54, 0, 1076
 };
 static int parser_action_row919[] = {
-       1,
-       -1, 1, 732
+       3,
+       -1, 3, 918,
+       47, 0, 344,
+       81, 0, 345
 };
 static int parser_action_row920[] = {
        1,
-       -1, 1, 740
+       -1, 1, 809
 };
 static int parser_action_row921[] = {
-       1,
-       -1, 1, 742
+       2,
+       -1, 1, 557,
+       80, 0, 471
 };
 static int parser_action_row922[] = {
-       1,
-       -1, 1, 741
+       2,
+       -1, 3, 921,
+       52, 0, 1079
 };
 static int parser_action_row923[] = {
        1,
-       -1, 1, 743
+       -1, 1, 558
 };
 static int parser_action_row924[] = {
-       1,
-       -1, 1, 744
+       3,
+       -1, 1, 376,
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row925[] = {
        1,
-       -1, 1, 341
+       -1, 1, 312
 };
 static int parser_action_row926[] = {
-       4,
-       -1, 1, 276,
-       56, 0, 205,
-       64, 0, 206,
-       66, 0, 1068
+       1,
+       -1, 1, 314
 };
 static int parser_action_row927[] = {
        1,
-       -1, 1, 343
+       -1, 1, 315
 };
 static int parser_action_row928[] = {
-       3,
-       -1, 1, 385,
-       0, 0, 1,
-       1, 0, 2
+       1,
+       -1, 1, 316
 };
 static int parser_action_row929[] = {
-       2,
-       -1, 1, 337,
-       58, 0, 1070
+       24,
+       -1, 1, 732,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       41, 1, 358,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       83, 1, 358,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row930[] = {
-       3,
-       -1, 3, 929,
-       44, 0, 324,
-       85, 0, 218
+       2,
+       -1, 1, 737,
+       49, 0, 175
 };
 static int parser_action_row931[] = {
        2,
-       -1, 1, 349,
-       54, 0, 238
+       -1, 1, 734,
+       49, 0, 175
 };
 static int parser_action_row932[] = {
        1,
-       -1, 1, 342
+       -1, 1, 736
 };
 static int parser_action_row933[] = {
        2,
        -1, 3, 932,
-       57, 0, 1073
+       11, 0, 1084
 };
 static int parser_action_row934[] = {
-       2,
-       -1, 1, 319,
-       82, 0, 180
+       4,
+       -1, 1, 306,
+       53, 0, 478,
+       57, 0, 193,
+       80, 0, 184
 };
 static int parser_action_row935[] = {
        1,
-       -1, 1, 357
+       -1, 1, 331
 };
 static int parser_action_row936[] = {
        1,
-       -1, 1, 443
+       -1, 1, 730
 };
 static int parser_action_row937[] = {
-       22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       1,
+       -1, 1, 731
 };
 static int parser_action_row938[] = {
-       20,
-       -1, 1, 367,
-       12, 0, 802,
-       34, 0, 804,
-       41, 0, 805,
-       43, 0, 806,
-       45, 0, 807,
-       46, 0, 808,
-       47, 0, 809,
-       48, 0, 810,
-       51, 0, 811,
-       54, 0, 812,
-       68, 0, 813,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 814,
-       87, 0, 815,
-       88, 0, 816,
-       89, 0, 817,
-       90, 0, 54,
-       93, 0, 818
+       1,
+       -1, 1, 739
 };
 static int parser_action_row939[] = {
-       3,
-       -1, 3, 938,
-       50, 0, 1077,
-       83, 0, 1078
+       1,
+       -1, 1, 741
 };
 static int parser_action_row940[] = {
-       19,
-       -1, 1, 367,
-       12, 0, 802,
-       41, 0, 805,
-       43, 0, 806,
-       45, 0, 807,
-       46, 0, 808,
-       47, 0, 809,
-       48, 0, 810,
-       51, 0, 811,
-       54, 0, 812,
-       68, 0, 813,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 814,
-       87, 0, 815,
-       88, 0, 816,
-       89, 0, 817,
-       90, 0, 54,
-       93, 0, 818
+       1,
+       -1, 1, 740
 };
 static int parser_action_row941[] = {
        1,
-       -1, 1, 445
+       -1, 1, 742
 };
 static int parser_action_row942[] = {
        1,
-       -1, 1, 446
+       -1, 1, 743
 };
 static int parser_action_row943[] = {
        1,
-       -1, 1, 447
+       -1, 1, 332
 };
 static int parser_action_row944[] = {
-       1,
-       -1, 1, 448
+       4,
+       -1, 1, 262,
+       53, 0, 209,
+       61, 0, 210,
+       63, 0, 1085
 };
 static int parser_action_row945[] = {
-       3,
-       -1, 1, 385,
-       0, 0, 1,
-       1, 0, 2
+       1,
+       -1, 1, 334
 };
 static int parser_action_row946[] = {
        3,
-       -1, 3, 945,
-       44, 0, 954,
-       85, 0, 1082
+       -1, 1, 376,
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row947[] = {
-       3,
-       -1, 3, 946,
-       64, 0, 976,
-       66, 0, 1083
+       2,
+       -1, 1, 328,
+       55, 0, 1087
 };
 static int parser_action_row948[] = {
-       22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       3,
+       -1, 3, 947,
+       41, 0, 330,
+       83, 0, 222
 };
 static int parser_action_row949[] = {
-       19,
-       -1, 1, 367,
-       12, 0, 802,
-       41, 0, 805,
-       43, 0, 806,
-       45, 0, 807,
-       46, 0, 808,
-       47, 0, 809,
-       48, 0, 810,
-       51, 0, 811,
-       54, 0, 812,
-       68, 0, 813,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 814,
-       87, 0, 815,
-       88, 0, 816,
-       89, 0, 817,
-       90, 0, 54,
-       93, 0, 818
+       2,
+       -1, 1, 340,
+       51, 0, 242
 };
 static int parser_action_row950[] = {
        1,
-       -1, 1, 449
+       -1, 1, 333
 };
 static int parser_action_row951[] = {
-       1,
-       -1, 1, 450
+       2,
+       -1, 3, 950,
+       54, 0, 1090
 };
 static int parser_action_row952[] = {
-       1,
-       -1, 1, 451
+       2,
+       -1, 1, 306,
+       80, 0, 184
 };
 static int parser_action_row953[] = {
        1,
-       -1, 1, 453
+       -1, 1, 348
 };
 static int parser_action_row954[] = {
        1,
-       -1, 1, 452
+       -1, 1, 435
 };
 static int parser_action_row955[] = {
-       2,
-       -1, 1, 349,
-       54, 0, 238
+       22,
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row956[] = {
-       1,
-       -1, 1, 438
+       20,
+       -1, 1, 358,
+       12, 0, 816,
+       31, 0, 818,
+       38, 0, 819,
+       40, 0, 820,
+       42, 0, 821,
+       43, 0, 822,
+       44, 0, 823,
+       45, 0, 824,
+       48, 0, 825,
+       51, 0, 826,
+       65, 0, 827,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 828,
+       85, 0, 829,
+       86, 0, 830,
+       87, 0, 831,
+       88, 0, 54,
+       91, 0, 832
 };
 static int parser_action_row957[] = {
-       1,
-       -1, 1, 440
+       3,
+       -1, 3, 956,
+       47, 0, 1094,
+       81, 0, 1095
 };
 static int parser_action_row958[] = {
-       3,
-       -1, 3, 957,
-       56, 0, 1087,
-       57, 0, 1088
+       19,
+       -1, 1, 358,
+       12, 0, 816,
+       38, 0, 819,
+       40, 0, 820,
+       42, 0, 821,
+       43, 0, 822,
+       44, 0, 823,
+       45, 0, 824,
+       48, 0, 825,
+       51, 0, 826,
+       65, 0, 827,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 828,
+       85, 0, 829,
+       86, 0, 830,
+       87, 0, 831,
+       88, 0, 54,
+       91, 0, 832
 };
 static int parser_action_row959[] = {
+       1,
+       -1, 1, 441
+};
+static int parser_action_row960[] = {
+       1,
+       -1, 1, 442
+};
+static int parser_action_row961[] = {
+       1,
+       -1, 1, 443
+};
+static int parser_action_row962[] = {
+       1,
+       -1, 1, 444
+};
+static int parser_action_row963[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row960[] = {
+static int parser_action_row964[] = {
+       3,
+       -1, 3, 963,
+       41, 0, 972,
+       83, 0, 1099
+};
+static int parser_action_row965[] = {
+       3,
+       -1, 3, 964,
+       61, 0, 995,
+       63, 0, 1100
+};
+static int parser_action_row966[] = {
+       22,
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
+};
+static int parser_action_row967[] = {
+       19,
+       -1, 1, 358,
+       12, 0, 816,
+       38, 0, 819,
+       40, 0, 820,
+       42, 0, 821,
+       43, 0, 822,
+       44, 0, 823,
+       45, 0, 824,
+       48, 0, 825,
+       51, 0, 826,
+       65, 0, 827,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 828,
+       85, 0, 829,
+       86, 0, 830,
+       87, 0, 831,
+       88, 0, 54,
+       91, 0, 832
+};
+static int parser_action_row968[] = {
+       1,
+       -1, 1, 445
+};
+static int parser_action_row969[] = {
+       1,
+       -1, 1, 446
+};
+static int parser_action_row970[] = {
+       1,
+       -1, 1, 447
+};
+static int parser_action_row971[] = {
+       1,
+       -1, 1, 449
+};
+static int parser_action_row972[] = {
+       1,
+       -1, 1, 448
+};
+static int parser_action_row973[] = {
+       2,
+       -1, 1, 340,
+       51, 0, 242
+};
+static int parser_action_row974[] = {
+       1,
+       -1, 1, 430
+};
+static int parser_action_row975[] = {
+       1,
+       -1, 1, 432
+};
+static int parser_action_row976[] = {
+       3,
+       -1, 3, 975,
+       53, 0, 1104,
+       54, 0, 1105
+};
+static int parser_action_row977[] = {
+       3,
+       -1, 1, 376,
+       0, 0, 1,
+       1, 0, 2
+};
+static int parser_action_row978[] = {
        4,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2,
-       27, 0, 1090
+       24, 0, 1107
 };
-static int parser_action_row961[] = {
+static int parser_action_row979[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row962[] = {
+static int parser_action_row980[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row963[] = {
+static int parser_action_row981[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row964[] = {
+static int parser_action_row982[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row965[] = {
+static int parser_action_row983[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row966[] = {
+static int parser_action_row984[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row967[] = {
+static int parser_action_row985[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row968[] = {
+static int parser_action_row986[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row969[] = {
+static int parser_action_row987[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row970[] = {
+static int parser_action_row988[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row971[] = {
+static int parser_action_row989[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row972[] = {
+static int parser_action_row990[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row973[] = {
+static int parser_action_row991[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row974[] = {
+static int parser_action_row992[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row975[] = {
+static int parser_action_row993[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row976[] = {
+static int parser_action_row994[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row977[] = {
+static int parser_action_row995[] = {
+       3,
+       -1, 1, 376,
+       0, 0, 1,
+       1, 0, 2
+};
+static int parser_action_row996[] = {
        1,
-       -1, 1, 459
+       -1, 1, 440
 };
-static int parser_action_row978[] = {
+static int parser_action_row997[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row979[] = {
+static int parser_action_row998[] = {
        2,
-       -1, 1, 363,
-       60, 0, 190
+       -1, 1, 354,
+       57, 0, 194
 };
-static int parser_action_row980[] = {
+static int parser_action_row999[] = {
        2,
-       -1, 3, 979,
-       9, 0, 1109
+       -1, 3, 998,
+       9, 0, 1127
 };
-static int parser_action_row981[] = {
+static int parser_action_row1000[] = {
        1,
        -1, 1, 816
 };
-static int parser_action_row982[] = {
+static int parser_action_row1001[] = {
        2,
        -1, 1, 42,
        13, 0, 27
 };
-static int parser_action_row983[] = {
+static int parser_action_row1002[] = {
        8,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2,
-       4, 1, 325,
-       9, 1, 325,
-       15, 1, 325,
-       31, 1, 325,
-       96, 1, 325
+       4, 1, 317,
+       9, 1, 317,
+       15, 1, 317,
+       28, 1, 317,
+       94, 1, 317
 };
-static int parser_action_row984[] = {
+static int parser_action_row1003[] = {
        2,
-       -1, 1, 129,
-       64, 0, 1112
+       -1, 1, 113,
+       61, 0, 1130
 };
-static int parser_action_row985[] = {
+static int parser_action_row1004[] = {
        2,
-       -1, 1, 318,
-       59, 0, 616
+       -1, 1, 305,
+       56, 0, 628
 };
-static int parser_action_row986[] = {
+static int parser_action_row1005[] = {
        1,
-       -1, 1, 128
+       -1, 1, 112
 };
-static int parser_action_row987[] = {
+static int parser_action_row1006[] = {
        4,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2,
-       59, 0, 616
+       56, 0, 628
 };
-static int parser_action_row988[] = {
+static int parser_action_row1007[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row989[] = {
+static int parser_action_row1008[] = {
        1,
        -1, 1, 804
 };
-static int parser_action_row990[] = {
+static int parser_action_row1009[] = {
        1,
-       -1, 1, 124
+       -1, 1, 108
 };
-static int parser_action_row991[] = {
+static int parser_action_row1010[] = {
        4,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2,
-       58, 0, 987
+       55, 0, 1006
 };
-static int parser_action_row992[] = {
+static int parser_action_row1011[] = {
        1,
-       -1, 1, 139
+       -1, 1, 123
 };
-static int parser_action_row993[] = {
+static int parser_action_row1012[] = {
        1,
-       -1, 1, 140
+       -1, 1, 124
 };
-static int parser_action_row994[] = {
+static int parser_action_row1013[] = {
        2,
-       -1, 1, 133,
-       58, 0, 1119
-};
-static int parser_action_row995[] = {
-       1,
-       -1, 1, 137
+       -1, 1, 117,
+       55, 0, 1137
 };
-static int parser_action_row996[] = {
+static int parser_action_row1014[] = {
        1,
-       -1, 1, 138
-};
-static int parser_action_row997[] = {
-       2,
-       -1, 1, 142,
-       66, 0, 1122
+       -1, 1, 121
 };
-static int parser_action_row998[] = {
+static int parser_action_row1015[] = {
        1,
-       -1, 1, 150
+       -1, 1, 122
 };
-static int parser_action_row999[] = {
+static int parser_action_row1016[] = {
        2,
-       -1, 1, 135,
-       4, 0, 720
+       -1, 1, 126,
+       63, 0, 1140
 };
-static int parser_action_row1000[] = {
+static int parser_action_row1017[] = {
        2,
-       -1, 1, 94,
-       9, 0, 1124
+       -1, 1, 79,
+       9, 0, 1141
 };
-static int parser_action_row1001[] = {
+static int parser_action_row1018[] = {
        1,
-       -1, 1, 379
+       -1, 1, 370
 };
-static int parser_action_row1002[] = {
+static int parser_action_row1019[] = {
        1,
-       -1, 1, 391
+       -1, 1, 382
 };
-static int parser_action_row1003[] = {
+static int parser_action_row1020[] = {
        2,
-       -1, 1, 378,
-       9, 0, 1000
+       -1, 1, 369,
+       9, 0, 1017
 };
-static int parser_action_row1004[] = {
+static int parser_action_row1021[] = {
        1,
-       -1, 1, 397
+       -1, 1, 386
 };
-static int parser_action_row1005[] = {
+static int parser_action_row1022[] = {
        3,
-       -1, 1, 166,
-       59, 0, 287,
-       82, 0, 180
+       -1, 1, 150,
+       56, 0, 292,
+       80, 0, 184
 };
-static int parser_action_row1006[] = {
+static int parser_action_row1023[] = {
        4,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2,
-       58, 0, 1128
+       55, 0, 1145
 };
-static int parser_action_row1007[] = {
+static int parser_action_row1024[] = {
        1,
        -1, 1, 56
 };
-static int parser_action_row1008[] = {
+static int parser_action_row1025[] = {
        4,
        -1, 1, 42,
-       9, 0, 1132,
+       9, 0, 1149,
        13, 0, 27,
-       44, 0, 1011
+       41, 0, 1029
 };
-static int parser_action_row1009[] = {
+static int parser_action_row1026[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1010[] = {
+static int parser_action_row1027[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1011[] = {
+static int parser_action_row1028[] = {
+       1,
+       -1, 1, 791
+};
+static int parser_action_row1029[] = {
        1,
        -1, 1, 26
 };
-static int parser_action_row1012[] = {
+static int parser_action_row1030[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1013[] = {
+static int parser_action_row1031[] = {
        1,
-       -1, 1, 791
+       -1, 1, 790
 };
-static int parser_action_row1014[] = {
+static int parser_action_row1032[] = {
        5,
-       -1, 1, 97,
-       21, 0, 196,
-       22, 0, 197,
-       23, 0, 198,
-       24, 0, 199
-};
-static int parser_action_row1015[] = {
-       2,
-       -1, 1, 42,
-       13, 0, 27
-};
-static int parser_action_row1016[] = {
-       2,
-       -1, 1, 42,
-       13, 0, 27
+       -1, 1, 80,
+       18, 0, 200,
+       19, 0, 201,
+       20, 0, 202,
+       21, 0, 203
 };
-static int parser_action_row1017[] = {
+static int parser_action_row1033[] = {
        36,
-       -1, 1, 367,
-       0, 0, 82,
-       1, 0, 83,
-       12, 0, 106,
+       -1, 1, 358,
+       0, 0, 83,
+       1, 0, 84,
+       12, 0, 107,
        15, 0, 28,
-       18, 0, 29,
-       25, 0, 107,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       34, 0, 108,
-       36, 0, 1141,
-       37, 0, 1142,
-       38, 0, 1143,
-       39, 0, 1144,
-       40, 0, 39,
-       41, 0, 109,
-       43, 0, 110,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       50, 0, 338,
-       51, 0, 115,
-       53, 0, 1145,
-       54, 0, 1146,
-       68, 0, 117,
-       82, 0, 180,
-       83, 0, 915,
-       84, 0, 49,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       16, 0, 29,
+       22, 0, 108,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       31, 0, 109,
+       33, 0, 1155,
+       34, 0, 1156,
+       35, 0, 1157,
+       36, 0, 1158,
+       37, 0, 39,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       47, 0, 344,
+       48, 0, 116,
+       50, 0, 1159,
+       51, 0, 1160,
+       65, 0, 118,
+       80, 0, 184,
+       81, 0, 933,
+       82, 0, 49,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
-static int parser_action_row1018[] = {
+static int parser_action_row1034[] = {
        1,
        -1, 1, 799
 };
-static int parser_action_row1019[] = {
+static int parser_action_row1035[] = {
        4,
        -1, 1, 42,
-       9, 0, 1164,
+       9, 0, 1178,
        13, 0, 27,
-       44, 0, 1011
+       41, 0, 1029
 };
-static int parser_action_row1020[] = {
+static int parser_action_row1036[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1021[] = {
+static int parser_action_row1037[] = {
        1,
        -1, 1, 801
 };
-static int parser_action_row1022[] = {
+static int parser_action_row1038[] = {
        3,
        -1, 1, 42,
-       9, 0, 1166,
+       9, 0, 1180,
        13, 0, 27
 };
-static int parser_action_row1023[] = {
+static int parser_action_row1039[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1024[] = {
+static int parser_action_row1040[] = {
        1,
        -1, 1, 819
 };
-static int parser_action_row1025[] = {
-       5,
+static int parser_action_row1041[] = {
+       6,
        -1, 1, 42,
-       9, 0, 1170,
+       6, 0, 1027,
+       9, 0, 1184,
        13, 0, 27,
-       44, 0, 1011,
-       84, 0, 1012
+       41, 0, 1029,
+       82, 0, 1030
 };
-static int parser_action_row1026[] = {
+static int parser_action_row1042[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1027[] = {
+static int parser_action_row1043[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1028[] = {
+static int parser_action_row1044[] = {
        1,
-       -1, 1, 305
+       -1, 1, 278
 };
-static int parser_action_row1029[] = {
+static int parser_action_row1045[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1030[] = {
+static int parser_action_row1046[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1031[] = {
+static int parser_action_row1047[] = {
        2,
-       -1, 3, 1030,
-       27, 0, 1176
+       -1, 3, 1046,
+       24, 0, 1190
 };
-static int parser_action_row1032[] = {
+static int parser_action_row1048[] = {
        1,
-       -1, 1, 557
+       -1, 1, 542
 };
-static int parser_action_row1033[] = {
+static int parser_action_row1049[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1034[] = {
+static int parser_action_row1050[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1035[] = {
+static int parser_action_row1051[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1036[] = {
+static int parser_action_row1052[] = {
        3,
-       -1, 1, 208,
-       27, 1, 658,
-       61, 0, 1180
+       -1, 1, 192,
+       24, 1, 657,
+       58, 0, 1194
 };
-static int parser_action_row1037[] = {
+static int parser_action_row1053[] = {
        2,
-       -1, 3, 1036,
-       26, 0, 1181
+       -1, 3, 1052,
+       23, 0, 1195
 };
-static int parser_action_row1038[] = {
+static int parser_action_row1054[] = {
        2,
-       -1, 3, 1037,
-       15, 0, 1182
+       -1, 3, 1053,
+       15, 0, 1196
 };
-static int parser_action_row1039[] = {
+static int parser_action_row1055[] = {
        2,
-       -1, 3, 1038,
-       84, 0, 294
+       -1, 3, 1054,
+       82, 0, 299
 };
-static int parser_action_row1040[] = {
+static int parser_action_row1056[] = {
        3,
-       -1, 3, 1039,
-       31, 0, 1184,
-       58, 0, 556
+       -1, 3, 1055,
+       28, 0, 1198,
+       55, 0, 566
 };
-static int parser_action_row1041[] = {
+static int parser_action_row1057[] = {
        32,
-       -1, 1, 367,
+       -1, 1, 358,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 1041,
-       12, 0, 650,
-       15, 0, 651,
-       18, 0, 652,
-       25, 0, 653,
-       28, 0, 655,
-       29, 0, 656,
-       30, 0, 657,
-       36, 0, 658,
-       37, 0, 659,
-       38, 0, 660,
-       39, 0, 661,
-       40, 0, 662,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 663,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       9, 0, 1057,
+       12, 0, 662,
+       15, 0, 663,
+       16, 0, 664,
+       22, 0, 665,
+       25, 0, 667,
+       26, 0, 668,
+       27, 0, 669,
+       33, 0, 670,
+       34, 0, 671,
+       35, 0, 672,
+       36, 0, 673,
+       37, 0, 674,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 675,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1042[] = {
+static int parser_action_row1058[] = {
        2,
-       -1, 1, 169,
-       27, 1, 628
+       -1, 1, 153,
+       24, 1, 627
 };
-static int parser_action_row1043[] = {
+static int parser_action_row1059[] = {
        30,
-       -1, 1, 367,
-       9, 0, 1186,
+       -1, 1, 358,
+       9, 0, 1200,
        12, 0, 26,
        15, 0, 28,
-       18, 0, 29,
-       25, 0, 30,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       36, 0, 35,
-       37, 0, 36,
-       38, 0, 37,
-       39, 0, 38,
-       40, 0, 39,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 45,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       16, 0, 29,
+       22, 0, 30,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       33, 0, 35,
+       34, 0, 36,
+       35, 0, 37,
+       36, 0, 38,
+       37, 0, 39,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 45,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1044[] = {
+static int parser_action_row1060[] = {
        1,
-       -1, 1, 682
+       -1, 1, 681
 };
-static int parser_action_row1045[] = {
+static int parser_action_row1061[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1046[] = {
+static int parser_action_row1062[] = {
        26,
-       -1, 1, 353,
-       12, 0, 106,
-       25, 0, 107,
-       34, 0, 108,
-       41, 0, 109,
-       43, 0, 110,
-       44, 1, 367,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       54, 0, 116,
-       56, 1, 349,
-       64, 1, 349,
-       66, 1, 349,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       85, 1, 367,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       -1, 1, 344,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 358,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       51, 0, 117,
+       53, 1, 340,
+       61, 1, 340,
+       63, 1, 340,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       83, 1, 358,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
-static int parser_action_row1047[] = {
+static int parser_action_row1063[] = {
        2,
-       -1, 3, 1046,
-       85, 0, 1190
+       -1, 3, 1062,
+       83, 0, 1204
 };
-static int parser_action_row1048[] = {
+static int parser_action_row1064[] = {
        29,
-       -1, 1, 353,
-       12, 0, 106,
-       25, 0, 107,
-       34, 0, 108,
-       41, 0, 109,
-       43, 0, 110,
-       44, 1, 367,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       54, 0, 116,
-       56, 1, 349,
-       61, 1, 349,
-       62, 1, 349,
-       63, 1, 349,
-       64, 1, 349,
-       66, 1, 349,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       85, 1, 367,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       -1, 1, 344,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 358,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       51, 0, 117,
+       53, 1, 340,
+       58, 1, 340,
+       59, 1, 340,
+       60, 1, 340,
+       61, 1, 340,
+       63, 1, 340,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       83, 1, 358,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
-static int parser_action_row1049[] = {
+static int parser_action_row1065[] = {
        3,
-       -1, 1, 364,
-       12, 0, 1193,
-       84, 0, 222
+       -1, 1, 355,
+       12, 0, 1207,
+       82, 0, 226
 };
-static int parser_action_row1050[] = {
+static int parser_action_row1066[] = {
        4,
-       -1, 1, 366,
-       12, 0, 1194,
-       83, 0, 48,
-       84, 0, 224
+       -1, 1, 357,
+       12, 0, 1208,
+       81, 0, 48,
+       82, 0, 228
 };
-static int parser_action_row1051[] = {
+static int parser_action_row1067[] = {
        1,
-       -1, 1, 665
+       -1, 1, 664
 };
-static int parser_action_row1052[] = {
+static int parser_action_row1068[] = {
        1,
-       -1, 1, 670
+       -1, 1, 669
 };
-static int parser_action_row1053[] = {
+static int parser_action_row1069[] = {
        1,
-       -1, 1, 662
+       -1, 1, 661
 };
-static int parser_action_row1054[] = {
+static int parser_action_row1070[] = {
        1,
-       -1, 1, 667
+       -1, 1, 666
 };
-static int parser_action_row1055[] = {
+static int parser_action_row1071[] = {
        1,
-       -1, 1, 664
+       -1, 1, 663
 };
-static int parser_action_row1056[] = {
+static int parser_action_row1072[] = {
        1,
-       -1, 1, 669
+       -1, 1, 668
 };
-static int parser_action_row1057[] = {
+static int parser_action_row1073[] = {
        2,
-       -1, 1, 202,
-       27, 1, 654
+       -1, 1, 186,
+       24, 1, 653
 };
-static int parser_action_row1058[] = {
+static int parser_action_row1074[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1059[] = {
+static int parser_action_row1075[] = {
        32,
-       -1, 1, 367,
+       -1, 1, 358,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 139,
+       9, 0, 142,
        12, 0, 26,
        15, 0, 28,
-       18, 0, 29,
-       25, 0, 30,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       36, 0, 35,
-       37, 0, 36,
-       38, 0, 37,
-       39, 0, 38,
-       40, 0, 39,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 45,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       16, 0, 29,
+       22, 0, 30,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       33, 0, 35,
+       34, 0, 36,
+       35, 0, 37,
+       36, 0, 38,
+       37, 0, 39,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 45,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1060[] = {
+static int parser_action_row1076[] = {
        2,
-       -1, 3, 1059,
-       27, 0, 1199
+       -1, 3, 1075,
+       24, 0, 1213
 };
-static int parser_action_row1061[] = {
+static int parser_action_row1077[] = {
        2,
-       -1, 1, 562,
-       82, 0, 463
+       -1, 1, 557,
+       80, 0, 471
 };
-static int parser_action_row1062[] = {
+static int parser_action_row1078[] = {
        1,
-       -1, 1, 163
+       -1, 1, 147
 };
-static int parser_action_row1063[] = {
+static int parser_action_row1079[] = {
        1,
-       -1, 1, 462
+       -1, 1, 454
 };
-static int parser_action_row1064[] = {
+static int parser_action_row1080[] = {
        1,
-       -1, 1, 560
+       -1, 1, 555
 };
-static int parser_action_row1065[] = {
+static int parser_action_row1081[] = {
+       35,
+       -1, 1, 358,
+       12, 0, 155,
+       15, 0, 28,
+       16, 0, 29,
+       22, 0, 156,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       31, 0, 157,
+       33, 0, 928,
+       34, 0, 929,
+       35, 0, 930,
+       36, 0, 931,
+       37, 0, 39,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       47, 0, 344,
+       48, 0, 160,
+       50, 0, 932,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       80, 0, 184,
+       81, 0, 933,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
+};
+static int parser_action_row1082[] = {
        1,
-       -1, 1, 734
+       -1, 1, 733
 };
-static int parser_action_row1066[] = {
+static int parser_action_row1083[] = {
        1,
-       -1, 1, 739
+       -1, 1, 738
 };
-static int parser_action_row1067[] = {
+static int parser_action_row1084[] = {
        1,
-       -1, 1, 736
+       -1, 1, 735
 };
-static int parser_action_row1068[] = {
+static int parser_action_row1085[] = {
        3,
-       -1, 3, 1067,
-       50, 0, 338,
-       83, 0, 339
+       -1, 3, 1084,
+       47, 0, 344,
+       81, 0, 345
 };
-static int parser_action_row1069[] = {
+static int parser_action_row1086[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1070[] = {
+static int parser_action_row1087[] = {
        2,
-       -1, 3, 1069,
-       55, 0, 1203
+       -1, 3, 1086,
+       52, 0, 1218
 };
-static int parser_action_row1071[] = {
+static int parser_action_row1088[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1072[] = {
+static int parser_action_row1089[] = {
        1,
        -1, 1, 820
 };
-static int parser_action_row1073[] = {
+static int parser_action_row1090[] = {
        2,
-       -1, 1, 338,
-       58, 0, 1070
+       -1, 1, 329,
+       55, 0, 1087
 };
-static int parser_action_row1074[] = {
+static int parser_action_row1091[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
-static int parser_action_row1075[] = {
+static int parser_action_row1092[] = {
        1,
-       -1, 1, 159
+       -1, 1, 143
 };
-static int parser_action_row1076[] = {
+static int parser_action_row1093[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1077[] = {
+static int parser_action_row1094[] = {
        1,
-       -1, 1, 411
+       -1, 1, 400
 };
-static int parser_action_row1078[] = {
+static int parser_action_row1095[] = {
        2,
-       -1, 3, 1077,
-       83, 0, 1208
+       -1, 3, 1094,
+       81, 0, 1223
 };
-static int parser_action_row1079[] = {
+static int parser_action_row1096[] = {
        2,
-       -1, 1, 562,
-       82, 0, 463
+       -1, 1, 557,
+       80, 0, 471
 };
-static int parser_action_row1080[] = {
+static int parser_action_row1097[] = {
        3,
-       -1, 1, 349,
-       54, 0, 238,
-       66, 0, 1210
+       -1, 1, 340,
+       51, 0, 242,
+       63, 0, 1225
 };
-static int parser_action_row1081[] = {
+static int parser_action_row1098[] = {
        1,
-       -1, 1, 432
+       -1, 1, 423
 };
-static int parser_action_row1082[] = {
+static int parser_action_row1099[] = {
        3,
-       -1, 3, 1081,
-       50, 0, 1077,
-       83, 0, 1078
+       -1, 3, 1098,
+       47, 0, 1094,
+       81, 0, 1095
 };
-static int parser_action_row1083[] = {
+static int parser_action_row1100[] = {
        3,
-       -1, 1, 436,
-       64, 1, 438,
-       66, 1, 438
+       -1, 1, 427,
+       61, 1, 430,
+       63, 1, 430
 };
-static int parser_action_row1084[] = {
+static int parser_action_row1101[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1085[] = {
+static int parser_action_row1102[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1086[] = {
+static int parser_action_row1103[] = {
        1,
-       -1, 1, 431
+       -1, 1, 422
 };
-static int parser_action_row1087[] = {
+static int parser_action_row1104[] = {
        1,
-       -1, 1, 441
+       -1, 1, 433
 };
-static int parser_action_row1088[] = {
+static int parser_action_row1105[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
-static int parser_action_row1089[] = {
+static int parser_action_row1106[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
-static int parser_action_row1090[] = {
+static int parser_action_row1107[] = {
        20,
-       -1, 1, 367,
-       12, 0, 802,
-       34, 0, 804,
-       41, 0, 805,
-       43, 0, 806,
-       45, 0, 807,
-       46, 0, 808,
-       47, 0, 809,
-       48, 0, 810,
-       51, 0, 811,
-       54, 0, 812,
-       68, 0, 813,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 814,
-       87, 0, 815,
-       88, 0, 816,
-       89, 0, 817,
-       90, 0, 54,
-       93, 0, 818
+       -1, 1, 358,
+       12, 0, 816,
+       31, 0, 818,
+       38, 0, 819,
+       40, 0, 820,
+       42, 0, 821,
+       43, 0, 822,
+       44, 0, 823,
+       45, 0, 824,
+       48, 0, 825,
+       51, 0, 826,
+       65, 0, 827,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 828,
+       85, 0, 829,
+       86, 0, 830,
+       87, 0, 831,
+       88, 0, 54,
+       91, 0, 832
 };
-static int parser_action_row1091[] = {
+static int parser_action_row1108[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1092[] = {
+static int parser_action_row1109[] = {
        20,
-       -1, 1, 367,
-       12, 0, 802,
-       34, 0, 804,
-       41, 0, 805,
-       43, 0, 806,
-       45, 0, 807,
-       46, 0, 808,
-       47, 0, 809,
-       48, 0, 810,
-       51, 0, 811,
-       54, 0, 812,
-       68, 0, 813,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 814,
-       87, 0, 815,
-       88, 0, 816,
-       89, 0, 817,
-       90, 0, 54,
-       93, 0, 818
+       -1, 1, 358,
+       12, 0, 816,
+       31, 0, 818,
+       38, 0, 819,
+       40, 0, 820,
+       42, 0, 821,
+       43, 0, 822,
+       44, 0, 823,
+       45, 0, 824,
+       48, 0, 825,
+       51, 0, 826,
+       65, 0, 827,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 828,
+       85, 0, 829,
+       86, 0, 830,
+       87, 0, 831,
+       88, 0, 54,
+       91, 0, 832
 };
-static int parser_action_row1093[] = {
+static int parser_action_row1110[] = {
        20,
-       -1, 1, 367,
-       12, 0, 802,
-       34, 0, 804,
-       41, 0, 805,
-       43, 0, 806,
-       45, 0, 807,
-       46, 0, 808,
-       47, 0, 809,
-       48, 0, 810,
-       51, 0, 811,
-       54, 0, 812,
-       68, 0, 813,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 814,
-       87, 0, 815,
-       88, 0, 816,
-       89, 0, 817,
-       90, 0, 54,
-       93, 0, 818
+       -1, 1, 358,
+       12, 0, 816,
+       31, 0, 818,
+       38, 0, 819,
+       40, 0, 820,
+       42, 0, 821,
+       43, 0, 822,
+       44, 0, 823,
+       45, 0, 824,
+       48, 0, 825,
+       51, 0, 826,
+       65, 0, 827,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 828,
+       85, 0, 829,
+       86, 0, 830,
+       87, 0, 831,
+       88, 0, 54,
+       91, 0, 832
 };
-static int parser_action_row1094[] = {
+static int parser_action_row1111[] = {
        19,
-       -1, 1, 367,
-       12, 0, 802,
-       41, 0, 805,
-       43, 0, 806,
-       45, 0, 807,
-       46, 0, 808,
-       47, 0, 809,
-       48, 0, 810,
-       51, 0, 811,
-       54, 0, 812,
-       68, 0, 813,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 814,
-       87, 0, 815,
-       88, 0, 816,
-       89, 0, 817,
-       90, 0, 54,
-       93, 0, 818
+       -1, 1, 358,
+       12, 0, 816,
+       38, 0, 819,
+       40, 0, 820,
+       42, 0, 821,
+       43, 0, 822,
+       44, 0, 823,
+       45, 0, 824,
+       48, 0, 825,
+       51, 0, 826,
+       65, 0, 827,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 828,
+       85, 0, 829,
+       86, 0, 830,
+       87, 0, 831,
+       88, 0, 54,
+       91, 0, 832
 };
-static int parser_action_row1095[] = {
+static int parser_action_row1112[] = {
        19,
-       -1, 1, 367,
-       12, 0, 802,
-       41, 0, 805,
-       43, 0, 806,
-       45, 0, 807,
-       46, 0, 808,
-       47, 0, 809,
-       48, 0, 810,
-       51, 0, 811,
-       54, 0, 812,
-       68, 0, 813,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 814,
-       87, 0, 815,
-       88, 0, 816,
-       89, 0, 817,
-       90, 0, 54,
-       93, 0, 818
+       -1, 1, 358,
+       12, 0, 816,
+       38, 0, 819,
+       40, 0, 820,
+       42, 0, 821,
+       43, 0, 822,
+       44, 0, 823,
+       45, 0, 824,
+       48, 0, 825,
+       51, 0, 826,
+       65, 0, 827,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 828,
+       85, 0, 829,
+       86, 0, 830,
+       87, 0, 831,
+       88, 0, 54,
+       91, 0, 832
 };
-static int parser_action_row1096[] = {
+static int parser_action_row1113[] = {
        3,
-       -1, 3, 1095,
-       50, 0, 1223,
-       83, 0, 1224
+       -1, 3, 1112,
+       47, 0, 1238,
+       81, 0, 1239
 };
-static int parser_action_row1097[] = {
+static int parser_action_row1114[] = {
        19,
-       -1, 1, 367,
-       12, 0, 802,
-       41, 0, 805,
-       43, 0, 806,
-       45, 0, 807,
-       46, 0, 808,
-       47, 0, 809,
-       48, 0, 810,
-       51, 0, 811,
-       54, 0, 812,
-       68, 0, 813,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 814,
-       87, 0, 815,
-       88, 0, 816,
-       89, 0, 817,
-       90, 0, 54,
-       93, 0, 818
+       -1, 1, 358,
+       12, 0, 816,
+       38, 0, 819,
+       40, 0, 820,
+       42, 0, 821,
+       43, 0, 822,
+       44, 0, 823,
+       45, 0, 824,
+       48, 0, 825,
+       51, 0, 826,
+       65, 0, 827,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 828,
+       85, 0, 829,
+       86, 0, 830,
+       87, 0, 831,
+       88, 0, 54,
+       91, 0, 832
 };
-static int parser_action_row1098[] = {
+static int parser_action_row1115[] = {
        19,
-       -1, 1, 367,
-       12, 0, 802,
-       41, 0, 805,
-       43, 0, 806,
-       45, 0, 807,
-       46, 0, 808,
-       47, 0, 809,
-       48, 0, 810,
-       51, 0, 811,
-       54, 0, 812,
-       68, 0, 813,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 814,
-       87, 0, 815,
-       88, 0, 816,
-       89, 0, 817,
-       90, 0, 54,
-       93, 0, 818
+       -1, 1, 358,
+       12, 0, 816,
+       38, 0, 819,
+       40, 0, 820,
+       42, 0, 821,
+       43, 0, 822,
+       44, 0, 823,
+       45, 0, 824,
+       48, 0, 825,
+       51, 0, 826,
+       65, 0, 827,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 828,
+       85, 0, 829,
+       86, 0, 830,
+       87, 0, 831,
+       88, 0, 54,
+       91, 0, 832
 };
-static int parser_action_row1099[] = {
+static int parser_action_row1116[] = {
        19,
-       -1, 1, 367,
-       12, 0, 802,
-       41, 0, 805,
-       43, 0, 806,
-       45, 0, 807,
-       46, 0, 808,
-       47, 0, 809,
-       48, 0, 810,
-       51, 0, 811,
-       54, 0, 812,
-       68, 0, 813,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 814,
-       87, 0, 815,
-       88, 0, 816,
-       89, 0, 817,
-       90, 0, 54,
-       93, 0, 818
+       -1, 1, 358,
+       12, 0, 816,
+       38, 0, 819,
+       40, 0, 820,
+       42, 0, 821,
+       43, 0, 822,
+       44, 0, 823,
+       45, 0, 824,
+       48, 0, 825,
+       51, 0, 826,
+       65, 0, 827,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 828,
+       85, 0, 829,
+       86, 0, 830,
+       87, 0, 831,
+       88, 0, 54,
+       91, 0, 832
 };
-static int parser_action_row1100[] = {
+static int parser_action_row1117[] = {
        19,
-       -1, 1, 367,
-       12, 0, 802,
-       41, 0, 805,
-       43, 0, 806,
-       45, 0, 807,
-       46, 0, 808,
-       47, 0, 809,
-       48, 0, 810,
-       51, 0, 811,
-       54, 0, 812,
-       68, 0, 813,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 814,
-       87, 0, 815,
-       88, 0, 816,
-       89, 0, 817,
-       90, 0, 54,
-       93, 0, 818
+       -1, 1, 358,
+       12, 0, 816,
+       38, 0, 819,
+       40, 0, 820,
+       42, 0, 821,
+       43, 0, 822,
+       44, 0, 823,
+       45, 0, 824,
+       48, 0, 825,
+       51, 0, 826,
+       65, 0, 827,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 828,
+       85, 0, 829,
+       86, 0, 830,
+       87, 0, 831,
+       88, 0, 54,
+       91, 0, 832
 };
-static int parser_action_row1101[] = {
+static int parser_action_row1118[] = {
        19,
-       -1, 1, 367,
-       12, 0, 802,
-       41, 0, 805,
-       43, 0, 806,
-       45, 0, 807,
-       46, 0, 808,
-       47, 0, 809,
-       48, 0, 810,
-       51, 0, 811,
-       54, 0, 812,
-       68, 0, 813,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 814,
-       87, 0, 815,
-       88, 0, 816,
-       89, 0, 817,
-       90, 0, 54,
-       93, 0, 818
+       -1, 1, 358,
+       12, 0, 816,
+       38, 0, 819,
+       40, 0, 820,
+       42, 0, 821,
+       43, 0, 822,
+       44, 0, 823,
+       45, 0, 824,
+       48, 0, 825,
+       51, 0, 826,
+       65, 0, 827,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 828,
+       85, 0, 829,
+       86, 0, 830,
+       87, 0, 831,
+       88, 0, 54,
+       91, 0, 832
 };
-static int parser_action_row1102[] = {
+static int parser_action_row1119[] = {
        19,
-       -1, 1, 367,
-       12, 0, 802,
-       41, 0, 805,
-       43, 0, 806,
-       45, 0, 807,
-       46, 0, 808,
-       47, 0, 809,
-       48, 0, 810,
-       51, 0, 811,
-       54, 0, 812,
-       68, 0, 813,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 814,
-       87, 0, 815,
-       88, 0, 816,
-       89, 0, 817,
-       90, 0, 54,
-       93, 0, 818
+       -1, 1, 358,
+       12, 0, 816,
+       38, 0, 819,
+       40, 0, 820,
+       42, 0, 821,
+       43, 0, 822,
+       44, 0, 823,
+       45, 0, 824,
+       48, 0, 825,
+       51, 0, 826,
+       65, 0, 827,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 828,
+       85, 0, 829,
+       86, 0, 830,
+       87, 0, 831,
+       88, 0, 54,
+       91, 0, 832
 };
-static int parser_action_row1103[] = {
+static int parser_action_row1120[] = {
        19,
-       -1, 1, 367,
-       12, 0, 802,
-       41, 0, 805,
-       43, 0, 806,
-       45, 0, 807,
-       46, 0, 808,
-       47, 0, 809,
-       48, 0, 810,
-       51, 0, 811,
-       54, 0, 812,
-       68, 0, 813,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 814,
-       87, 0, 815,
-       88, 0, 816,
-       89, 0, 817,
-       90, 0, 54,
-       93, 0, 818
+       -1, 1, 358,
+       12, 0, 816,
+       38, 0, 819,
+       40, 0, 820,
+       42, 0, 821,
+       43, 0, 822,
+       44, 0, 823,
+       45, 0, 824,
+       48, 0, 825,
+       51, 0, 826,
+       65, 0, 827,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 828,
+       85, 0, 829,
+       86, 0, 830,
+       87, 0, 831,
+       88, 0, 54,
+       91, 0, 832
 };
-static int parser_action_row1104[] = {
+static int parser_action_row1121[] = {
        19,
-       -1, 1, 367,
-       12, 0, 802,
-       41, 0, 805,
-       43, 0, 806,
-       45, 0, 807,
-       46, 0, 808,
-       47, 0, 809,
-       48, 0, 810,
-       51, 0, 811,
-       54, 0, 812,
-       68, 0, 813,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 814,
-       87, 0, 815,
-       88, 0, 816,
-       89, 0, 817,
-       90, 0, 54,
-       93, 0, 818
+       -1, 1, 358,
+       12, 0, 816,
+       38, 0, 819,
+       40, 0, 820,
+       42, 0, 821,
+       43, 0, 822,
+       44, 0, 823,
+       45, 0, 824,
+       48, 0, 825,
+       51, 0, 826,
+       65, 0, 827,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 828,
+       85, 0, 829,
+       86, 0, 830,
+       87, 0, 831,
+       88, 0, 54,
+       91, 0, 832
 };
-static int parser_action_row1105[] = {
+static int parser_action_row1122[] = {
        19,
-       -1, 1, 367,
-       12, 0, 802,
-       41, 0, 805,
-       43, 0, 806,
-       45, 0, 807,
-       46, 0, 808,
-       47, 0, 809,
-       48, 0, 810,
-       51, 0, 811,
-       54, 0, 812,
-       68, 0, 813,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 814,
-       87, 0, 815,
-       88, 0, 816,
-       89, 0, 817,
-       90, 0, 54,
-       93, 0, 818
+       -1, 1, 358,
+       12, 0, 816,
+       38, 0, 819,
+       40, 0, 820,
+       42, 0, 821,
+       43, 0, 822,
+       44, 0, 823,
+       45, 0, 824,
+       48, 0, 825,
+       51, 0, 826,
+       65, 0, 827,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 828,
+       85, 0, 829,
+       86, 0, 830,
+       87, 0, 831,
+       88, 0, 54,
+       91, 0, 832
 };
-static int parser_action_row1106[] = {
+static int parser_action_row1123[] = {
        19,
-       -1, 1, 367,
-       12, 0, 802,
-       41, 0, 805,
-       43, 0, 806,
-       45, 0, 807,
-       46, 0, 808,
-       47, 0, 809,
-       48, 0, 810,
-       51, 0, 811,
-       54, 0, 812,
-       68, 0, 813,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 814,
-       87, 0, 815,
-       88, 0, 816,
-       89, 0, 817,
-       90, 0, 54,
-       93, 0, 818
+       -1, 1, 358,
+       12, 0, 816,
+       38, 0, 819,
+       40, 0, 820,
+       42, 0, 821,
+       43, 0, 822,
+       44, 0, 823,
+       45, 0, 824,
+       48, 0, 825,
+       51, 0, 826,
+       65, 0, 827,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 828,
+       85, 0, 829,
+       86, 0, 830,
+       87, 0, 831,
+       88, 0, 54,
+       91, 0, 832
 };
-static int parser_action_row1107[] = {
+static int parser_action_row1124[] = {
        19,
-       -1, 1, 367,
-       12, 0, 802,
-       41, 0, 805,
-       43, 0, 806,
-       45, 0, 807,
-       46, 0, 808,
-       47, 0, 809,
-       48, 0, 810,
-       51, 0, 811,
-       54, 0, 812,
-       68, 0, 813,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 814,
-       87, 0, 815,
-       88, 0, 816,
-       89, 0, 817,
-       90, 0, 54,
-       93, 0, 818
+       -1, 1, 358,
+       12, 0, 816,
+       38, 0, 819,
+       40, 0, 820,
+       42, 0, 821,
+       43, 0, 822,
+       44, 0, 823,
+       45, 0, 824,
+       48, 0, 825,
+       51, 0, 826,
+       65, 0, 827,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 828,
+       85, 0, 829,
+       86, 0, 830,
+       87, 0, 831,
+       88, 0, 54,
+       91, 0, 832
 };
-static int parser_action_row1108[] = {
+static int parser_action_row1125[] = {
        19,
-       -1, 1, 367,
-       12, 0, 802,
-       41, 0, 805,
-       43, 0, 806,
-       45, 0, 807,
-       46, 0, 808,
-       47, 0, 809,
-       48, 0, 810,
-       51, 0, 811,
-       54, 0, 812,
-       68, 0, 813,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 814,
-       87, 0, 815,
-       88, 0, 816,
-       89, 0, 817,
-       90, 0, 54,
-       93, 0, 818
+       -1, 1, 358,
+       12, 0, 816,
+       38, 0, 819,
+       40, 0, 820,
+       42, 0, 821,
+       43, 0, 822,
+       44, 0, 823,
+       45, 0, 824,
+       48, 0, 825,
+       51, 0, 826,
+       65, 0, 827,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 828,
+       85, 0, 829,
+       86, 0, 830,
+       87, 0, 831,
+       88, 0, 54,
+       91, 0, 832
 };
-static int parser_action_row1109[] = {
+static int parser_action_row1126[] = {
+       19,
+       -1, 1, 358,
+       12, 0, 816,
+       38, 0, 819,
+       40, 0, 820,
+       42, 0, 821,
+       43, 0, 822,
+       44, 0, 823,
+       45, 0, 824,
+       48, 0, 825,
+       51, 0, 826,
+       65, 0, 827,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 828,
+       85, 0, 829,
+       86, 0, 830,
+       87, 0, 831,
+       88, 0, 54,
+       91, 0, 832
+};
+static int parser_action_row1127[] = {
        5,
-       -1, 1, 367,
-       12, 0, 1238,
-       49, 0, 1239,
-       83, 0, 48,
-       84, 0, 49
+       -1, 1, 358,
+       12, 0, 1254,
+       46, 0, 1255,
+       81, 0, 48,
+       82, 0, 49
 };
-static int parser_action_row1110[] = {
+static int parser_action_row1128[] = {
        1,
-       -1, 1, 91
+       -1, 1, 76
 };
-static int parser_action_row1111[] = {
+static int parser_action_row1129[] = {
        5,
-       -1, 1, 97,
-       21, 0, 196,
-       22, 0, 197,
-       23, 0, 198,
-       24, 0, 199
+       -1, 1, 80,
+       18, 0, 200,
+       19, 0, 201,
+       20, 0, 202,
+       21, 0, 203
 };
-static int parser_action_row1112[] = {
+static int parser_action_row1130[] = {
        1,
        -1, 1, 817
 };
-static int parser_action_row1113[] = {
+static int parser_action_row1131[] = {
        1,
-       -1, 1, 131
+       -1, 1, 115
 };
-static int parser_action_row1114[] = {
+static int parser_action_row1132[] = {
        2,
-       -1, 1, 130,
-       64, 0, 1243
+       -1, 1, 114,
+       61, 0, 1259
 };
-static int parser_action_row1115[] = {
+static int parser_action_row1133[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1116[] = {
+static int parser_action_row1134[] = {
        1,
-       -1, 1, 121
+       -1, 1, 105
 };
-static int parser_action_row1117[] = {
+static int parser_action_row1135[] = {
        2,
-       -1, 3, 1116,
-       84, 0, 838
+       -1, 3, 1134,
+       82, 0, 854
 };
-static int parser_action_row1118[] = {
+static int parser_action_row1136[] = {
        1,
        -1, 1, 805
 };
-static int parser_action_row1119[] = {
+static int parser_action_row1137[] = {
        1,
-       -1, 1, 125
+       -1, 1, 109
 };
-static int parser_action_row1120[] = {
+static int parser_action_row1138[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1121[] = {
+static int parser_action_row1139[] = {
        1,
        -1, 1, 806
 };
-static int parser_action_row1122[] = {
+static int parser_action_row1140[] = {
        2,
-       -1, 1, 134,
-       58, 0, 1119
-};
-static int parser_action_row1123[] = {
-       18,
-       -1, 3, 1122,
-       49, 0, 1248,
-       56, 0, 479,
-       67, 0, 480,
-       68, 0, 481,
-       69, 0, 482,
-       70, 0, 483,
-       71, 0, 484,
-       72, 0, 485,
-       73, 0, 486,
-       74, 0, 487,
-       75, 0, 488,
-       76, 0, 489,
-       77, 0, 490,
-       78, 0, 491,
-       79, 0, 492,
-       80, 0, 493,
-       84, 0, 494
+       -1, 1, 118,
+       55, 0, 1137
 };
-static int parser_action_row1124[] = {
-       3,
-       -1, 1, 155,
-       31, 0, 34,
-       96, 0, 56
+static int parser_action_row1141[] = {
+       19,
+       -1, 3, 1140,
+       46, 0, 1264,
+       53, 0, 487,
+       64, 0, 488,
+       65, 0, 489,
+       66, 0, 490,
+       67, 0, 491,
+       68, 0, 492,
+       69, 0, 493,
+       70, 0, 494,
+       71, 0, 495,
+       72, 0, 496,
+       73, 0, 497,
+       74, 0, 498,
+       75, 0, 499,
+       76, 0, 500,
+       77, 0, 501,
+       78, 0, 502,
+       82, 0, 503
 };
-static int parser_action_row1125[] = {
+static int parser_action_row1142[] = {
        1,
-       -1, 1, 399
+       -1, 1, 388
 };
-static int parser_action_row1126[] = {
+static int parser_action_row1143[] = {
        1,
-       -1, 1, 392
+       -1, 1, 383
 };
-static int parser_action_row1127[] = {
+static int parser_action_row1144[] = {
        1,
        -1, 1, 53
 };
-static int parser_action_row1128[] = {
+static int parser_action_row1145[] = {
        2,
-       -1, 1, 166,
-       59, 0, 287
+       -1, 1, 150,
+       56, 0, 292
 };
-static int parser_action_row1129[] = {
+static int parser_action_row1146[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1130[] = {
+static int parser_action_row1147[] = {
        1,
        -1, 1, 802
 };
-static int parser_action_row1131[] = {
+static int parser_action_row1148[] = {
        2,
-       -1, 3, 1130,
-       57, 0, 1254
+       -1, 3, 1147,
+       54, 0, 1268
 };
-static int parser_action_row1132[] = {
+static int parser_action_row1149[] = {
        4,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2,
-       58, 0, 1128
+       55, 0, 1145
 };
-static int parser_action_row1133[] = {
+static int parser_action_row1150[] = {
        1,
        -1, 1, 28
 };
-static int parser_action_row1134[] = {
+static int parser_action_row1151[] = {
        4,
        -1, 1, 42,
-       9, 0, 1257,
+       9, 0, 1271,
        13, 0, 27,
-       44, 0, 1011
+       41, 0, 1029
 };
-static int parser_action_row1135[] = {
+static int parser_action_row1152[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1136[] = {
+static int parser_action_row1153[] = {
        3,
        -1, 1, 42,
-       9, 0, 1259,
+       9, 0, 1273,
        13, 0, 27
 };
-static int parser_action_row1137[] = {
+static int parser_action_row1154[] = {
        3,
-       -1, 3, 1136,
-       50, 0, 338,
-       83, 0, 339
-};
-static int parser_action_row1138[] = {
-       8,
-       -1, 3, 1137,
-       10, 0, 1261,
-       11, 0, 1262,
-       12, 0, 1263,
-       16, 0, 1264,
-       17, 0, 1265,
-       18, 0, 1266,
-       41, 0, 1267
+       -1, 3, 1153,
+       47, 0, 344,
+       81, 0, 345
 };
-static int parser_action_row1139[] = {
-       5,
-       -1, 1, 97,
-       21, 0, 196,
-       22, 0, 197,
-       23, 0, 198,
-       24, 0, 199
-};
-static int parser_action_row1140[] = {
-       2,
-       -1, 1, 42,
-       13, 0, 27
-};
-static int parser_action_row1141[] = {
-       5,
-       -1, 1, 97,
-       21, 0, 196,
-       22, 0, 197,
-       23, 0, 198,
-       24, 0, 199
+static int parser_action_row1155[] = {
+       6,
+       -1, 3, 1154,
+       10, 0, 1275,
+       11, 0, 1276,
+       12, 0, 1277,
+       16, 0, 1278,
+       38, 0, 1279
 };
-static int parser_action_row1142[] = {
+static int parser_action_row1156[] = {
        24,
-       -1, 1, 748,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       44, 1, 367,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       85, 1, 367,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 747,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       41, 1, 358,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       83, 1, 358,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1143[] = {
+static int parser_action_row1157[] = {
        2,
-       -1, 1, 753,
-       52, 0, 171
+       -1, 1, 752,
+       49, 0, 175
 };
-static int parser_action_row1144[] = {
+static int parser_action_row1158[] = {
        2,
-       -1, 1, 750,
-       52, 0, 171
+       -1, 1, 749,
+       49, 0, 175
 };
-static int parser_action_row1145[] = {
+static int parser_action_row1159[] = {
        1,
-       -1, 1, 752
+       -1, 1, 751
 };
-static int parser_action_row1146[] = {
+static int parser_action_row1160[] = {
        2,
-       -1, 3, 1145,
-       11, 0, 1274
+       -1, 3, 1159,
+       11, 0, 1283
 };
-static int parser_action_row1147[] = {
+static int parser_action_row1161[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1148[] = {
+static int parser_action_row1162[] = {
        1,
-       -1, 1, 566
+       -1, 1, 562
 };
-static int parser_action_row1149[] = {
+static int parser_action_row1163[] = {
        1,
-       -1, 1, 746
+       -1, 1, 745
 };
-static int parser_action_row1150[] = {
+static int parser_action_row1164[] = {
        1,
-       -1, 1, 755
+       -1, 1, 754
 };
-static int parser_action_row1151[] = {
+static int parser_action_row1165[] = {
        1,
-       -1, 1, 757
+       -1, 1, 756
 };
-static int parser_action_row1152[] = {
+static int parser_action_row1166[] = {
        1,
-       -1, 1, 756
+       -1, 1, 755
 };
-static int parser_action_row1153[] = {
+static int parser_action_row1167[] = {
        1,
-       -1, 1, 758
+       -1, 1, 757
 };
-static int parser_action_row1154[] = {
+static int parser_action_row1168[] = {
        1,
-       -1, 1, 759
+       -1, 1, 758
 };
-static int parser_action_row1155[] = {
+static int parser_action_row1169[] = {
        3,
-       -1, 3, 1154,
-       0, 0, 82,
-       1, 0, 83
+       -1, 3, 1168,
+       0, 0, 83,
+       1, 0, 84
 };
-static int parser_action_row1156[] = {
+static int parser_action_row1170[] = {
        3,
-       -1, 3, 1155,
-       44, 0, 258,
-       85, 0, 1277
+       -1, 3, 1169,
+       41, 0, 262,
+       83, 0, 1286
 };
-static int parser_action_row1157[] = {
+static int parser_action_row1171[] = {
        2,
-       -1, 1, 349,
-       54, 0, 238
+       -1, 1, 340,
+       51, 0, 242
 };
-static int parser_action_row1158[] = {
+static int parser_action_row1172[] = {
        1,
-       -1, 1, 331
+       -1, 1, 323
 };
-static int parser_action_row1159[] = {
+static int parser_action_row1173[] = {
        1,
-       -1, 1, 747
+       -1, 1, 746
 };
-static int parser_action_row1160[] = {
+static int parser_action_row1174[] = {
        1,
-       -1, 1, 567
+       -1, 1, 563
 };
-static int parser_action_row1161[] = {
+static int parser_action_row1175[] = {
        4,
-       -1, 1, 532,
-       56, 0, 205,
-       64, 0, 279,
-       66, 0, 1279
+       -1, 1, 526,
+       53, 0, 209,
+       61, 0, 284,
+       63, 0, 1288
 };
-static int parser_action_row1162[] = {
+static int parser_action_row1176[] = {
        3,
-       -1, 3, 1161,
-       0, 0, 82,
-       1, 0, 83
+       -1, 3, 1175,
+       0, 0, 83,
+       1, 0, 84
 };
-static int parser_action_row1163[] = {
+static int parser_action_row1177[] = {
        2,
-       -1, 1, 564,
-       58, 0, 1070
+       -1, 1, 560,
+       55, 0, 1087
 };
-static int parser_action_row1164[] = {
+static int parser_action_row1178[] = {
        1,
-       -1, 1, 568
+       -1, 1, 564
 };
-static int parser_action_row1165[] = {
+static int parser_action_row1179[] = {
        1,
        -1, 1, 30
 };
-static int parser_action_row1166[] = {
+static int parser_action_row1180[] = {
        3,
        -1, 1, 42,
-       9, 0, 1283,
+       9, 0, 1292,
        13, 0, 27
 };
-static int parser_action_row1167[] = {
+static int parser_action_row1181[] = {
        1,
        -1, 1, 34
 };
-static int parser_action_row1168[] = {
+static int parser_action_row1182[] = {
        4,
        -1, 1, 42,
-       9, 0, 1284,
+       9, 0, 1293,
        13, 0, 27,
-       44, 0, 1011
+       41, 0, 1029
 };
-static int parser_action_row1169[] = {
+static int parser_action_row1183[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1170[] = {
+static int parser_action_row1184[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1171[] = {
+static int parser_action_row1185[] = {
        1,
        -1, 1, 27
 };
-static int parser_action_row1172[] = {
+static int parser_action_row1186[] = {
        4,
        -1, 1, 42,
-       9, 0, 1288,
+       9, 0, 1297,
        13, 0, 27,
-       44, 0, 1011
+       41, 0, 1029
 };
-static int parser_action_row1173[] = {
+static int parser_action_row1187[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1174[] = {
+static int parser_action_row1188[] = {
        3,
        -1, 1, 42,
-       9, 0, 1290,
+       9, 0, 1299,
        13, 0, 27
 };
-static int parser_action_row1175[] = {
+static int parser_action_row1189[] = {
        2,
-       -1, 3, 1174,
-       48, 0, 1291
+       -1, 3, 1188,
+       45, 0, 1300
 };
-static int parser_action_row1176[] = {
+static int parser_action_row1190[] = {
        2,
-       -1, 3, 1175,
-       55, 0, 1292
+       -1, 3, 1189,
+       52, 0, 1301
 };
-static int parser_action_row1177[] = {
+static int parser_action_row1191[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1178[] = {
+static int parser_action_row1192[] = {
        2,
-       -1, 3, 1177,
-       48, 0, 1294
+       -1, 3, 1191,
+       45, 0, 1303
 };
-static int parser_action_row1179[] = {
+static int parser_action_row1193[] = {
        2,
-       -1, 3, 1178,
-       55, 0, 1295
+       -1, 3, 1192,
+       52, 0, 1304
 };
-static int parser_action_row1180[] = {
+static int parser_action_row1194[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1181[] = {
+static int parser_action_row1195[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1182[] = {
+static int parser_action_row1196[] = {
        33,
-       -1, 1, 367,
+       -1, 1, 358,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 649,
-       12, 0, 650,
-       15, 0, 651,
-       18, 0, 652,
-       25, 0, 653,
-       27, 0, 654,
-       28, 0, 655,
-       29, 0, 656,
-       30, 0, 657,
-       36, 0, 658,
-       37, 0, 659,
-       38, 0, 660,
-       39, 0, 661,
-       40, 0, 662,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 663,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       9, 0, 661,
+       12, 0, 662,
+       15, 0, 663,
+       16, 0, 664,
+       22, 0, 665,
+       24, 0, 666,
+       25, 0, 667,
+       26, 0, 668,
+       27, 0, 669,
+       33, 0, 670,
+       34, 0, 671,
+       35, 0, 672,
+       36, 0, 673,
+       37, 0, 674,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 675,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1183[] = {
+static int parser_action_row1197[] = {
        32,
-       -1, 1, 367,
+       -1, 1, 358,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 749,
-       12, 0, 650,
-       15, 0, 651,
-       18, 0, 652,
-       25, 0, 653,
-       28, 0, 655,
-       29, 0, 656,
-       30, 0, 657,
-       36, 0, 658,
-       37, 0, 659,
-       38, 0, 660,
-       39, 0, 661,
-       40, 0, 662,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 663,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       9, 0, 762,
+       12, 0, 662,
+       15, 0, 663,
+       16, 0, 664,
+       22, 0, 665,
+       25, 0, 667,
+       26, 0, 668,
+       27, 0, 669,
+       33, 0, 670,
+       34, 0, 671,
+       35, 0, 672,
+       36, 0, 673,
+       37, 0, 674,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 675,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1184[] = {
+static int parser_action_row1198[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1185[] = {
+static int parser_action_row1199[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1186[] = {
+static int parser_action_row1200[] = {
        1,
-       -1, 1, 683
+       -1, 1, 682
 };
-static int parser_action_row1187[] = {
+static int parser_action_row1201[] = {
        2,
-       -1, 1, 168,
-       27, 1, 627
+       -1, 1, 152,
+       24, 1, 626
 };
-static int parser_action_row1188[] = {
+static int parser_action_row1202[] = {
        2,
-       -1, 1, 167,
-       27, 1, 626
+       -1, 1, 151,
+       24, 1, 625
 };
-static int parser_action_row1189[] = {
+static int parser_action_row1203[] = {
        1,
-       -1, 1, 656
+       -1, 1, 655
 };
-static int parser_action_row1190[] = {
+static int parser_action_row1204[] = {
        2,
-       -1, 1, 196,
-       27, 1, 648
+       -1, 1, 180,
+       24, 1, 647
 };
-static int parser_action_row1191[] = {
+static int parser_action_row1205[] = {
        4,
-       -1, 1, 280,
-       61, 0, 1303,
-       62, 0, 365,
-       63, 0, 366
+       -1, 1, 267,
+       58, 0, 1312,
+       59, 0, 371,
+       60, 0, 372
 };
-static int parser_action_row1192[] = {
+static int parser_action_row1206[] = {
        4,
-       -1, 1, 282,
-       61, 0, 1305,
-       62, 0, 365,
-       63, 0, 366
+       -1, 1, 269,
+       58, 0, 1314,
+       59, 0, 371,
+       60, 0, 372
 };
-static int parser_action_row1193[] = {
+static int parser_action_row1207[] = {
        2,
-       -1, 1, 193,
-       27, 1, 645
+       -1, 1, 177,
+       24, 1, 644
 };
-static int parser_action_row1194[] = {
+static int parser_action_row1208[] = {
        23,
-       -1, 1, 353,
-       12, 0, 106,
-       25, 0, 107,
-       34, 0, 108,
-       41, 0, 109,
-       43, 0, 110,
-       44, 1, 367,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       54, 0, 379,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       85, 1, 367,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       -1, 1, 344,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 358,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       51, 0, 385,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       83, 1, 358,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
-static int parser_action_row1195[] = {
+static int parser_action_row1209[] = {
        23,
-       -1, 1, 353,
-       12, 0, 106,
-       25, 0, 107,
-       34, 0, 108,
-       41, 0, 109,
-       43, 0, 110,
-       44, 1, 367,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       54, 0, 379,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       85, 1, 367,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       -1, 1, 344,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 358,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       51, 0, 385,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       83, 1, 358,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
-static int parser_action_row1196[] = {
+static int parser_action_row1210[] = {
        3,
-       -1, 1, 365,
-       12, 0, 1309,
-       84, 0, 383
+       -1, 1, 356,
+       12, 0, 1318,
+       82, 0, 389
 };
-static int parser_action_row1197[] = {
+static int parser_action_row1211[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1198[] = {
+static int parser_action_row1212[] = {
        1,
-       -1, 1, 239
+       -1, 1, 223
 };
-static int parser_action_row1199[] = {
+static int parser_action_row1213[] = {
        2,
-       -1, 3, 1198,
-       52, 0, 171
+       -1, 3, 1212,
+       49, 0, 175
 };
-static int parser_action_row1200[] = {
+static int parser_action_row1214[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1201[] = {
+static int parser_action_row1215[] = {
        1,
-       -1, 1, 463
+       -1, 1, 455
 };
-static int parser_action_row1202[] = {
+static int parser_action_row1216[] = {
+       3,
+       -1, 1, 376,
+       0, 0, 1,
+       1, 0, 2
+};
+static int parser_action_row1217[] = {
        2,
-       -1, 3, 1201,
-       59, 0, 1313
+       -1, 3, 1216,
+       56, 0, 1323
 };
-static int parser_action_row1203[] = {
+static int parser_action_row1218[] = {
        5,
-       -1, 1, 367,
-       12, 0, 579,
-       49, 0, 499,
-       83, 0, 48,
-       84, 0, 49
+       -1, 1, 358,
+       12, 0, 590,
+       46, 0, 508,
+       81, 0, 48,
+       82, 0, 49
 };
-static int parser_action_row1204[] = {
+static int parser_action_row1219[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
-static int parser_action_row1205[] = {
+static int parser_action_row1220[] = {
        35,
-       -1, 1, 367,
-       12, 0, 152,
+       -1, 1, 358,
+       12, 0, 155,
        15, 0, 28,
-       18, 0, 29,
-       25, 0, 153,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       34, 0, 154,
-       36, 0, 910,
-       37, 0, 911,
-       38, 0, 912,
-       39, 0, 913,
-       40, 0, 39,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       50, 0, 338,
-       51, 0, 157,
-       53, 0, 914,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       82, 0, 180,
-       83, 0, 915,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       16, 0, 29,
+       22, 0, 156,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       31, 0, 157,
+       33, 0, 928,
+       34, 0, 929,
+       35, 0, 930,
+       36, 0, 931,
+       37, 0, 39,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       47, 0, 344,
+       48, 0, 160,
+       50, 0, 932,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       80, 0, 184,
+       81, 0, 933,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1206[] = {
+static int parser_action_row1221[] = {
        1,
        -1, 1, 821
 };
-static int parser_action_row1207[] = {
+static int parser_action_row1222[] = {
        1,
-       -1, 1, 160
+       -1, 1, 144
 };
-static int parser_action_row1208[] = {
+static int parser_action_row1223[] = {
        2,
-       -1, 3, 1207,
-       26, 0, 1317
+       -1, 3, 1222,
+       23, 0, 1327
 };
-static int parser_action_row1209[] = {
+static int parser_action_row1224[] = {
        2,
-       -1, 1, 562,
-       82, 0, 463
+       -1, 1, 557,
+       80, 0, 471
 };
-static int parser_action_row1210[] = {
+static int parser_action_row1225[] = {
        1,
-       -1, 1, 569
+       -1, 1, 565
 };
-static int parser_action_row1211[] = {
+static int parser_action_row1226[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1212[] = {
+static int parser_action_row1227[] = {
        1,
-       -1, 1, 434
+       -1, 1, 425
 };
-static int parser_action_row1213[] = {
+static int parser_action_row1228[] = {
        2,
-       -1, 3, 1212,
-       66, 0, 1210
+       -1, 3, 1227,
+       63, 0, 1225
 };
-static int parser_action_row1214[] = {
+static int parser_action_row1229[] = {
        5,
-       -1, 1, 367,
-       12, 0, 1238,
-       49, 0, 1239,
-       83, 0, 48,
-       84, 0, 49
+       -1, 1, 358,
+       12, 0, 1254,
+       46, 0, 1255,
+       81, 0, 48,
+       82, 0, 49
 };
-static int parser_action_row1215[] = {
+static int parser_action_row1230[] = {
        2,
-       -1, 3, 1214,
-       55, 0, 1321
+       -1, 3, 1229,
+       52, 0, 1331
 };
-static int parser_action_row1216[] = {
+static int parser_action_row1231[] = {
        1,
-       -1, 1, 290
+       -1, 1, 292
 };
-static int parser_action_row1217[] = {
+static int parser_action_row1232[] = {
        1,
-       -1, 1, 289
+       -1, 1, 291
 };
-static int parser_action_row1218[] = {
+static int parser_action_row1233[] = {
        1,
-       -1, 1, 407
+       -1, 1, 396
 };
-static int parser_action_row1219[] = {
+static int parser_action_row1234[] = {
        20,
-       -1, 1, 367,
-       12, 0, 802,
-       34, 0, 804,
-       41, 0, 805,
-       43, 0, 806,
-       45, 0, 807,
-       46, 0, 808,
-       47, 0, 809,
-       48, 0, 810,
-       51, 0, 811,
-       54, 0, 812,
-       68, 0, 813,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 814,
-       87, 0, 815,
-       88, 0, 816,
-       89, 0, 817,
-       90, 0, 54,
-       93, 0, 818
+       -1, 1, 358,
+       12, 0, 816,
+       31, 0, 818,
+       38, 0, 819,
+       40, 0, 820,
+       42, 0, 821,
+       43, 0, 822,
+       44, 0, 823,
+       45, 0, 824,
+       48, 0, 825,
+       51, 0, 826,
+       65, 0, 827,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 828,
+       85, 0, 829,
+       86, 0, 830,
+       87, 0, 831,
+       88, 0, 54,
+       91, 0, 832
 };
-static int parser_action_row1220[] = {
+static int parser_action_row1235[] = {
        1,
-       -1, 1, 406
+       -1, 1, 395
 };
-static int parser_action_row1221[] = {
+static int parser_action_row1236[] = {
        1,
-       -1, 1, 409
+       -1, 1, 398
 };
-static int parser_action_row1222[] = {
+static int parser_action_row1237[] = {
        3,
-       -1, 1, 417,
-       67, 0, 964,
-       68, 0, 965
+       -1, 1, 406,
+       64, 0, 982,
+       65, 0, 983
 };
-static int parser_action_row1223[] = {
+static int parser_action_row1238[] = {
        3,
-       -1, 1, 420,
-       67, 0, 964,
-       68, 0, 965
+       -1, 1, 409,
+       64, 0, 982,
+       65, 0, 983
 };
-static int parser_action_row1224[] = {
+static int parser_action_row1239[] = {
        2,
-       -1, 3, 1223,
-       83, 0, 1323
+       -1, 3, 1238,
+       81, 0, 1333
 };
-static int parser_action_row1225[] = {
+static int parser_action_row1240[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
-static int parser_action_row1226[] = {
+static int parser_action_row1241[] = {
        1,
-       -1, 1, 422
+       -1, 1, 411
 };
-static int parser_action_row1227[] = {
+static int parser_action_row1242[] = {
        4,
-       -1, 1, 424,
-       69, 0, 973,
-       70, 0, 974,
-       71, 0, 975
+       -1, 1, 413,
+       66, 0, 991,
+       68, 0, 992,
+       69, 0, 993
 };
-static int parser_action_row1228[] = {
+static int parser_action_row1243[] = {
        4,
-       -1, 1, 425,
-       69, 0, 973,
-       70, 0, 974,
-       71, 0, 975
+       -1, 1, 414,
+       66, 0, 991,
+       68, 0, 992,
+       69, 0, 993
 };
-static int parser_action_row1229[] = {
+static int parser_action_row1244[] = {
        3,
-       -1, 1, 413,
-       67, 0, 964,
-       68, 0, 965
+       -1, 1, 402,
+       64, 0, 982,
+       65, 0, 983
 };
-static int parser_action_row1230[] = {
+static int parser_action_row1245[] = {
        3,
-       -1, 1, 414,
-       67, 0, 964,
-       68, 0, 965
+       -1, 1, 403,
+       64, 0, 982,
+       65, 0, 983
 };
-static int parser_action_row1231[] = {
+static int parser_action_row1246[] = {
        3,
-       -1, 1, 415,
-       67, 0, 964,
-       68, 0, 965
+       -1, 1, 404,
+       64, 0, 982,
+       65, 0, 983
 };
-static int parser_action_row1232[] = {
+static int parser_action_row1247[] = {
        3,
-       -1, 1, 416,
-       67, 0, 964,
-       68, 0, 965
+       -1, 1, 405,
+       64, 0, 982,
+       65, 0, 983
 };
-static int parser_action_row1233[] = {
+static int parser_action_row1248[] = {
        3,
-       -1, 1, 418,
-       67, 0, 964,
-       68, 0, 965
+       -1, 1, 407,
+       64, 0, 982,
+       65, 0, 983
 };
-static int parser_action_row1234[] = {
+static int parser_action_row1249[] = {
        3,
-       -1, 1, 419,
-       67, 0, 964,
-       68, 0, 965
+       -1, 1, 408,
+       64, 0, 982,
+       65, 0, 983
 };
-static int parser_action_row1235[] = {
+static int parser_action_row1250[] = {
        3,
-       -1, 1, 421,
-       67, 0, 964,
-       68, 0, 965
+       -1, 1, 410,
+       64, 0, 982,
+       65, 0, 983
 };
-static int parser_action_row1236[] = {
+static int parser_action_row1251[] = {
        1,
-       -1, 1, 427
+       -1, 1, 416
 };
-static int parser_action_row1237[] = {
+static int parser_action_row1252[] = {
        1,
-       -1, 1, 428
+       -1, 1, 417
 };
-static int parser_action_row1238[] = {
+static int parser_action_row1253[] = {
        1,
-       -1, 1, 429
+       -1, 1, 418
 };
-static int parser_action_row1239[] = {
+static int parser_action_row1254[] = {
+       1,
+       -1, 1, 420
+};
+static int parser_action_row1255[] = {
        2,
-       -1, 1, 349,
-       54, 0, 238
+       -1, 1, 340,
+       51, 0, 242
 };
-static int parser_action_row1240[] = {
+static int parser_action_row1256[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1241[] = {
+static int parser_action_row1257[] = {
        2,
-       -1, 3, 1240,
-       85, 0, 1327
+       -1, 3, 1256,
+       83, 0, 1337
 };
-static int parser_action_row1242[] = {
+static int parser_action_row1258[] = {
        2,
-       -1, 1, 349,
-       54, 0, 238
+       -1, 1, 340,
+       51, 0, 242
 };
-static int parser_action_row1243[] = {
+static int parser_action_row1259[] = {
        4,
-       -1, 3, 1242,
-       16, 0, 594,
-       17, 0, 595,
-       84, 0, 596
+       -1, 3, 1258,
+       6, 0, 606,
+       17, 0, 607,
+       82, 0, 608
 };
-static int parser_action_row1244[] = {
+static int parser_action_row1260[] = {
        1,
-       -1, 1, 132
+       -1, 1, 116
 };
-static int parser_action_row1245[] = {
+static int parser_action_row1261[] = {
        1,
-       -1, 1, 120
+       -1, 1, 104
 };
-static int parser_action_row1246[] = {
+static int parser_action_row1262[] = {
        1,
-       -1, 1, 127
+       -1, 1, 111
 };
-static int parser_action_row1247[] = {
-       20,
-       -1, 3, 1246,
-       44, 0, 991,
-       50, 0, 338,
-       56, 0, 479,
-       67, 0, 480,
-       68, 0, 481,
-       69, 0, 482,
-       70, 0, 483,
-       71, 0, 484,
-       72, 0, 485,
-       73, 0, 486,
-       74, 0, 487,
-       75, 0, 488,
-       76, 0, 489,
-       77, 0, 490,
-       78, 0, 491,
-       79, 0, 492,
-       80, 0, 493,
-       83, 0, 339,
-       84, 0, 494
+static int parser_action_row1263[] = {
+       21,
+       -1, 3, 1262,
+       41, 0, 1010,
+       47, 0, 344,
+       53, 0, 487,
+       64, 0, 488,
+       65, 0, 489,
+       66, 0, 490,
+       67, 0, 491,
+       68, 0, 492,
+       69, 0, 493,
+       70, 0, 494,
+       71, 0, 495,
+       72, 0, 496,
+       73, 0, 497,
+       74, 0, 498,
+       75, 0, 499,
+       76, 0, 500,
+       77, 0, 501,
+       78, 0, 502,
+       81, 0, 345,
+       82, 0, 503
 };
-static int parser_action_row1248[] = {
+static int parser_action_row1264[] = {
        1,
        -1, 1, 807
 };
-static int parser_action_row1249[] = {
+static int parser_action_row1265[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1250[] = {
-       1,
-       -1, 1, 141
-};
-static int parser_action_row1251[] = {
-       1,
-       -1, 1, 154
-};
-static int parser_action_row1252[] = {
+static int parser_action_row1266[] = {
        1,
-       -1, 1, 395
+       -1, 1, 125
 };
-static int parser_action_row1253[] = {
+static int parser_action_row1267[] = {
        1,
        -1, 1, 54
 };
-static int parser_action_row1254[] = {
+static int parser_action_row1268[] = {
        2,
-       -1, 3, 1253,
-       83, 0, 1004
+       -1, 3, 1267,
+       81, 0, 1021
 };
-static int parser_action_row1255[] = {
+static int parser_action_row1269[] = {
        1,
        -1, 1, 49
 };
-static int parser_action_row1256[] = {
+static int parser_action_row1270[] = {
        1,
        -1, 1, 803
 };
-static int parser_action_row1257[] = {
+static int parser_action_row1271[] = {
        2,
-       -1, 3, 1256,
-       57, 0, 1333
+       -1, 3, 1270,
+       54, 0, 1343
 };
-static int parser_action_row1258[] = {
+static int parser_action_row1272[] = {
        1,
        -1, 1, 32
 };
-static int parser_action_row1259[] = {
+static int parser_action_row1273[] = {
        3,
        -1, 1, 42,
-       9, 0, 1334,
+       9, 0, 1344,
        13, 0, 27
 };
-static int parser_action_row1260[] = {
+static int parser_action_row1274[] = {
        1,
        -1, 1, 36
 };
-static int parser_action_row1261[] = {
+static int parser_action_row1275[] = {
        2,
-       -1, 1, 92,
-       14, 0, 712
+       -1, 1, 77,
+       14, 0, 725
 };
-static int parser_action_row1262[] = {
-       17,
-       -1, 3, 1261,
-       56, 0, 479,
-       67, 0, 480,
-       68, 0, 481,
-       69, 0, 482,
-       70, 0, 483,
-       71, 0, 484,
-       72, 0, 485,
-       73, 0, 486,
-       74, 0, 487,
-       75, 0, 488,
-       76, 0, 489,
-       77, 0, 490,
-       78, 0, 491,
-       79, 0, 492,
-       80, 0, 493,
-       84, 0, 494
+static int parser_action_row1276[] = {
+       18,
+       -1, 3, 1275,
+       53, 0, 487,
+       64, 0, 488,
+       65, 0, 489,
+       66, 0, 490,
+       67, 0, 491,
+       68, 0, 492,
+       69, 0, 493,
+       70, 0, 494,
+       71, 0, 495,
+       72, 0, 496,
+       73, 0, 497,
+       74, 0, 498,
+       75, 0, 499,
+       76, 0, 500,
+       77, 0, 501,
+       78, 0, 502,
+       82, 0, 503
 };
-static int parser_action_row1263[] = {
+static int parser_action_row1277[] = {
        2,
-       -1, 3, 1262,
-       83, 0, 1337
+       -1, 3, 1276,
+       81, 0, 1347
 };
-static int parser_action_row1264[] = {
-       21,
-       -1, 1, 385,
+static int parser_action_row1278[] = {
+       22,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2,
-       54, 0, 615,
-       56, 0, 479,
-       59, 0, 616,
-       67, 0, 480,
-       68, 0, 481,
-       69, 0, 482,
-       70, 0, 483,
-       71, 0, 484,
-       72, 0, 485,
-       73, 0, 486,
-       74, 0, 487,
-       75, 0, 488,
-       76, 0, 489,
-       77, 0, 490,
-       78, 0, 491,
-       79, 0, 492,
-       80, 0, 493,
-       84, 0, 494
-};
-static int parser_action_row1265[] = {
-       1,
-       -1, 1, 95
-};
-static int parser_action_row1266[] = {
-       1,
-       -1, 1, 96
+       51, 0, 627,
+       53, 0, 487,
+       56, 0, 628,
+       64, 0, 488,
+       65, 0, 489,
+       66, 0, 490,
+       67, 0, 491,
+       68, 0, 492,
+       69, 0, 493,
+       70, 0, 494,
+       71, 0, 495,
+       72, 0, 496,
+       73, 0, 497,
+       74, 0, 498,
+       75, 0, 499,
+       76, 0, 500,
+       77, 0, 501,
+       78, 0, 502,
+       82, 0, 503
 };
-static int parser_action_row1267[] = {
-       3,
-       -1, 3, 1266,
-       84, 0, 1340,
-       85, 0, 1341
+static int parser_action_row1279[] = {
+       2,
+       -1, 3, 1278,
+       82, 0, 1350
 };
-static int parser_action_row1268[] = {
-       21,
-       -1, 1, 385,
+static int parser_action_row1280[] = {
+       22,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2,
-       54, 0, 615,
-       56, 0, 479,
-       59, 0, 616,
-       67, 0, 480,
-       68, 0, 481,
-       69, 0, 482,
-       70, 0, 483,
-       71, 0, 484,
-       72, 0, 485,
-       73, 0, 486,
-       74, 0, 487,
-       75, 0, 488,
-       76, 0, 489,
-       77, 0, 490,
-       78, 0, 491,
-       79, 0, 492,
-       80, 0, 493,
-       84, 0, 494
-};
-static int parser_action_row1269[] = {
-       3,
-       -1, 3, 1268,
-       17, 0, 1265,
-       18, 0, 1344
-};
-static int parser_action_row1270[] = {
-       5,
-       -1, 1, 97,
-       21, 0, 196,
-       22, 0, 197,
-       23, 0, 198,
-       24, 0, 199
-};
-static int parser_action_row1271[] = {
-       2,
-       -1, 3, 1270,
-       18, 0, 1346
+       51, 0, 627,
+       53, 0, 487,
+       56, 0, 628,
+       64, 0, 488,
+       65, 0, 489,
+       66, 0, 490,
+       67, 0, 491,
+       68, 0, 492,
+       69, 0, 493,
+       70, 0, 494,
+       71, 0, 495,
+       72, 0, 496,
+       73, 0, 497,
+       74, 0, 498,
+       75, 0, 499,
+       76, 0, 500,
+       77, 0, 501,
+       78, 0, 502,
+       82, 0, 503
 };
-static int parser_action_row1272[] = {
+static int parser_action_row1281[] = {
        1,
-       -1, 1, 749
+       -1, 1, 748
 };
-static int parser_action_row1273[] = {
+static int parser_action_row1282[] = {
        1,
-       -1, 1, 754
+       -1, 1, 753
 };
-static int parser_action_row1274[] = {
+static int parser_action_row1283[] = {
        1,
-       -1, 1, 751
+       -1, 1, 750
 };
-static int parser_action_row1275[] = {
+static int parser_action_row1284[] = {
        3,
-       -1, 3, 1274,
-       50, 0, 338,
-       83, 0, 339
+       -1, 3, 1283,
+       47, 0, 344,
+       81, 0, 345
 };
-static int parser_action_row1276[] = {
+static int parser_action_row1285[] = {
        35,
-       -1, 1, 367,
-       12, 0, 152,
+       -1, 1, 358,
+       12, 0, 155,
        15, 0, 28,
-       18, 0, 29,
-       25, 0, 153,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       34, 0, 154,
-       36, 0, 910,
-       37, 0, 911,
-       38, 0, 912,
-       39, 0, 913,
-       40, 0, 39,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       50, 0, 338,
-       51, 0, 157,
-       53, 0, 914,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       82, 0, 180,
-       83, 0, 915,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       16, 0, 29,
+       22, 0, 156,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       31, 0, 157,
+       33, 0, 928,
+       34, 0, 929,
+       35, 0, 930,
+       36, 0, 931,
+       37, 0, 39,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       47, 0, 344,
+       48, 0, 160,
+       50, 0, 932,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       80, 0, 184,
+       81, 0, 933,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1277[] = {
+static int parser_action_row1286[] = {
        1,
-       -1, 1, 332
+       -1, 1, 324
 };
-static int parser_action_row1278[] = {
+static int parser_action_row1287[] = {
        4,
-       -1, 1, 537,
-       61, 0, 1349,
-       62, 0, 365,
-       63, 0, 366
+       -1, 1, 532,
+       58, 0, 1355,
+       59, 0, 371,
+       60, 0, 372
 };
-static int parser_action_row1279[] = {
+static int parser_action_row1288[] = {
        4,
-       -1, 1, 539,
-       61, 0, 1351,
-       62, 0, 365,
-       63, 0, 366
+       -1, 1, 534,
+       58, 0, 1357,
+       59, 0, 371,
+       60, 0, 372
 };
-static int parser_action_row1280[] = {
+static int parser_action_row1289[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1281[] = {
+static int parser_action_row1290[] = {
        4,
-       -1, 1, 543,
-       61, 0, 1354,
-       62, 0, 365,
-       63, 0, 366
+       -1, 1, 538,
+       58, 0, 1360,
+       59, 0, 371,
+       60, 0, 372
 };
-static int parser_action_row1282[] = {
+static int parser_action_row1291[] = {
        1,
-       -1, 1, 335
+       -1, 1, 327
 };
-static int parser_action_row1283[] = {
+static int parser_action_row1292[] = {
        2,
-       -1, 1, 565,
-       58, 0, 1070
+       -1, 1, 561,
+       55, 0, 1087
 };
-static int parser_action_row1284[] = {
+static int parser_action_row1293[] = {
        1,
        -1, 1, 38
 };
-static int parser_action_row1285[] = {
+static int parser_action_row1294[] = {
        1,
        -1, 1, 29
 };
-static int parser_action_row1286[] = {
+static int parser_action_row1295[] = {
        4,
        -1, 1, 42,
-       9, 0, 1356,
+       9, 0, 1362,
        13, 0, 27,
-       44, 0, 1011
+       41, 0, 1029
 };
-static int parser_action_row1287[] = {
+static int parser_action_row1296[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1288[] = {
+static int parser_action_row1297[] = {
        3,
        -1, 1, 42,
-       9, 0, 1358,
+       9, 0, 1364,
        13, 0, 27
 };
-static int parser_action_row1289[] = {
+static int parser_action_row1298[] = {
        1,
        -1, 1, 31
 };
-static int parser_action_row1290[] = {
+static int parser_action_row1299[] = {
        3,
        -1, 1, 42,
-       9, 0, 1359,
+       9, 0, 1365,
        13, 0, 27
 };
-static int parser_action_row1291[] = {
+static int parser_action_row1300[] = {
        1,
        -1, 1, 35
 };
-static int parser_action_row1292[] = {
+static int parser_action_row1301[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1293[] = {
+static int parser_action_row1302[] = {
        1,
-       -1, 1, 303
+       -1, 1, 276
 };
-static int parser_action_row1294[] = {
+static int parser_action_row1303[] = {
        20,
-       -1, 1, 367,
-       12, 0, 106,
-       25, 0, 107,
-       34, 0, 108,
-       41, 0, 109,
-       43, 0, 110,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       -1, 1, 358,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
-static int parser_action_row1295[] = {
+static int parser_action_row1304[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1296[] = {
+static int parser_action_row1305[] = {
        1,
-       -1, 1, 555
+       -1, 1, 540
 };
-static int parser_action_row1297[] = {
+static int parser_action_row1306[] = {
        1,
-       -1, 1, 659
+       -1, 1, 658
 };
-static int parser_action_row1298[] = {
+static int parser_action_row1307[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1299[] = {
+static int parser_action_row1308[] = {
        2,
-       -1, 3, 1298,
-       27, 0, 1364
+       -1, 3, 1307,
+       24, 0, 1370
 };
-static int parser_action_row1300[] = {
+static int parser_action_row1309[] = {
        1,
-       -1, 1, 677
+       -1, 1, 676
 };
-static int parser_action_row1301[] = {
+static int parser_action_row1310[] = {
        2,
-       -1, 3, 1300,
-       52, 0, 171
+       -1, 3, 1309,
+       49, 0, 175
 };
-static int parser_action_row1302[] = {
+static int parser_action_row1311[] = {
        3,
-       -1, 3, 1301,
-       55, 0, 1366,
-       58, 0, 556
+       -1, 3, 1310,
+       52, 0, 1372,
+       55, 0, 566
 };
-static int parser_action_row1303[] = {
+static int parser_action_row1312[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1304[] = {
+static int parser_action_row1313[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1305[] = {
+static int parser_action_row1314[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1306[] = {
+static int parser_action_row1315[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1307[] = {
+static int parser_action_row1316[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1308[] = {
+static int parser_action_row1317[] = {
        2,
-       -1, 1, 198,
-       27, 1, 650
+       -1, 1, 182,
+       24, 1, 649
 };
-static int parser_action_row1309[] = {
+static int parser_action_row1318[] = {
        2,
-       -1, 1, 200,
-       27, 1, 652
+       -1, 1, 184,
+       24, 1, 651
 };
-static int parser_action_row1310[] = {
+static int parser_action_row1319[] = {
        23,
-       -1, 1, 353,
-       12, 0, 106,
-       25, 0, 107,
-       34, 0, 108,
-       41, 0, 109,
-       43, 0, 110,
-       44, 1, 367,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       54, 0, 379,
-       68, 0, 117,
-       83, 0, 48,
-       84, 0, 49,
-       85, 1, 367,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       -1, 1, 344,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 358,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       51, 0, 385,
+       65, 0, 118,
+       81, 0, 48,
+       82, 0, 49,
+       83, 1, 358,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
-static int parser_action_row1311[] = {
+static int parser_action_row1320[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1312[] = {
+static int parser_action_row1321[] = {
        1,
-       -1, 1, 237
+       -1, 1, 221
 };
-static int parser_action_row1313[] = {
+static int parser_action_row1322[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1314[] = {
+static int parser_action_row1323[] = {
+       2,
+       -1, 3, 1322,
+       52, 0, 1381
+};
+static int parser_action_row1324[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1315[] = {
+static int parser_action_row1325[] = {
        2,
-       -1, 1, 349,
-       54, 0, 238
+       -1, 1, 340,
+       51, 0, 242
 };
-static int parser_action_row1316[] = {
+static int parser_action_row1326[] = {
        1,
-       -1, 1, 321
+       -1, 1, 308
 };
-static int parser_action_row1317[] = {
+static int parser_action_row1327[] = {
        1,
-       -1, 1, 339
+       -1, 1, 330
 };
-static int parser_action_row1318[] = {
+static int parser_action_row1328[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1319[] = {
+static int parser_action_row1329[] = {
        1,
-       -1, 1, 570
+       -1, 1, 566
 };
-static int parser_action_row1320[] = {
+static int parser_action_row1330[] = {
        3,
-       -1, 3, 1319,
-       83, 0, 48,
-       84, 0, 49
+       -1, 3, 1329,
+       81, 0, 48,
+       82, 0, 49
 };
-static int parser_action_row1321[] = {
+static int parser_action_row1331[] = {
        2,
-       -1, 3, 1320,
-       85, 0, 1378
+       -1, 3, 1330,
+       83, 0, 1385
 };
-static int parser_action_row1322[] = {
+static int parser_action_row1332[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
-static int parser_action_row1323[] = {
+static int parser_action_row1333[] = {
        1,
-       -1, 1, 408
+       -1, 1, 397
 };
-static int parser_action_row1324[] = {
+static int parser_action_row1334[] = {
        2,
-       -1, 1, 319,
-       82, 0, 180
+       -1, 1, 306,
+       80, 0, 184
 };
-static int parser_action_row1325[] = {
+static int parser_action_row1335[] = {
        1,
-       -1, 1, 400
+       -1, 1, 389
 };
-static int parser_action_row1326[] = {
+static int parser_action_row1336[] = {
        1,
-       -1, 1, 442
+       -1, 1, 434
 };
-static int parser_action_row1327[] = {
+static int parser_action_row1337[] = {
        3,
-       -1, 3, 1326,
-       34, 0, 1381,
-       54, 0, 1382
+       -1, 3, 1336,
+       31, 0, 1388,
+       51, 0, 1389
 };
-static int parser_action_row1328[] = {
+static int parser_action_row1338[] = {
        1,
-       -1, 1, 437
+       -1, 1, 429
 };
-static int parser_action_row1329[] = {
+static int parser_action_row1339[] = {
        1,
-       -1, 1, 439
+       -1, 1, 431
 };
-static int parser_action_row1330[] = {
+static int parser_action_row1340[] = {
        36,
-       -1, 1, 367,
-       0, 0, 82,
-       1, 0, 83,
-       12, 0, 106,
+       -1, 1, 358,
+       0, 0, 83,
+       1, 0, 84,
+       12, 0, 107,
        15, 0, 28,
-       18, 0, 29,
-       25, 0, 107,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       34, 0, 108,
-       36, 0, 1141,
-       37, 0, 1142,
-       38, 0, 1143,
-       39, 0, 1144,
-       40, 0, 39,
-       41, 0, 109,
-       43, 0, 110,
-       45, 0, 111,
-       46, 0, 112,
-       47, 0, 113,
-       48, 0, 114,
-       50, 0, 338,
-       51, 0, 115,
-       53, 0, 1145,
-       54, 0, 1383,
-       68, 0, 117,
-       82, 0, 180,
-       83, 0, 915,
-       84, 0, 49,
-       86, 0, 118,
-       87, 0, 119,
-       88, 0, 120,
-       89, 0, 121,
-       90, 0, 54,
-       93, 0, 122
+       16, 0, 29,
+       22, 0, 108,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       31, 0, 109,
+       33, 0, 1155,
+       34, 0, 1156,
+       35, 0, 1157,
+       36, 0, 1158,
+       37, 0, 39,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       47, 0, 344,
+       48, 0, 116,
+       50, 0, 1159,
+       51, 0, 1390,
+       65, 0, 118,
+       80, 0, 184,
+       81, 0, 933,
+       82, 0, 49,
+       84, 0, 119,
+       85, 0, 120,
+       86, 0, 121,
+       87, 0, 122,
+       88, 0, 54,
+       91, 0, 123
 };
-static int parser_action_row1331[] = {
+static int parser_action_row1341[] = {
        1,
-       -1, 1, 136
+       -1, 1, 120
 };
-static int parser_action_row1332[] = {
+static int parser_action_row1342[] = {
        5,
-       -1, 3, 1331,
-       34, 0, 1387,
-       50, 0, 1388,
-       54, 0, 1389,
-       83, 0, 339
+       -1, 3, 1341,
+       31, 0, 1394,
+       47, 0, 1395,
+       51, 0, 1396,
+       81, 0, 345
 };
-static int parser_action_row1333[] = {
+static int parser_action_row1343[] = {
        1,
        -1, 1, 52
 };
-static int parser_action_row1334[] = {
+static int parser_action_row1344[] = {
        1,
        -1, 1, 50
 };
-static int parser_action_row1335[] = {
+static int parser_action_row1345[] = {
        1,
        -1, 1, 40
 };
-static int parser_action_row1336[] = {
+static int parser_action_row1346[] = {
        1,
        -1, 1, 55
 };
-static int parser_action_row1337[] = {
+static int parser_action_row1347[] = {
        5,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2,
-       54, 0, 615,
-       59, 0, 616
+       51, 0, 627,
+       56, 0, 628
 };
-static int parser_action_row1338[] = {
+static int parser_action_row1348[] = {
        2,
-       -1, 3, 1337,
-       59, 0, 616
+       -1, 3, 1347,
+       56, 0, 628
 };
-static int parser_action_row1339[] = {
+static int parser_action_row1349[] = {
        5,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2,
-       54, 0, 615,
-       59, 0, 616
+       51, 0, 627,
+       56, 0, 628
 };
-static int parser_action_row1340[] = {
+static int parser_action_row1350[] = {
        3,
-       -1, 3, 1339,
-       14, 0, 1394,
-       15, 0, 1395
+       -1, 3, 1349,
+       14, 0, 1401,
+       15, 0, 1402
 };
-static int parser_action_row1341[] = {
-       2,
-       -1, 1, 166,
-       59, 0, 287
-};
-static int parser_action_row1342[] = {
+static int parser_action_row1351[] = {
        2,
-       -1, 1, 166,
-       59, 0, 287
+       -1, 1, 150,
+       56, 0, 292
 };
-static int parser_action_row1343[] = {
+static int parser_action_row1352[] = {
        5,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2,
-       54, 0, 615,
-       59, 0, 616
+       51, 0, 627,
+       56, 0, 628
 };
-static int parser_action_row1344[] = {
+static int parser_action_row1353[] = {
        3,
-       -1, 1, 135,
-       4, 0, 720,
-       14, 0, 1400
-};
-static int parser_action_row1345[] = {
-       2,
-       -1, 3, 1344,
-       85, 0, 1403
-};
-static int parser_action_row1346[] = {
-       2,
-       -1, 3, 1345,
-       18, 0, 1404
-};
-static int parser_action_row1347[] = {
-       2,
-       -1, 3, 1346,
-       85, 0, 1405
+       -1, 1, 119,
+       4, 0, 733,
+       14, 0, 734
 };
-static int parser_action_row1348[] = {
+static int parser_action_row1354[] = {
        2,
-       -1, 3, 1347,
-       59, 0, 1406
+       -1, 3, 1353,
+       56, 0, 1409
 };
-static int parser_action_row1349[] = {
+static int parser_action_row1355[] = {
        2,
-       -1, 3, 1348,
-       55, 0, 1407
+       -1, 3, 1354,
+       52, 0, 1410
 };
-static int parser_action_row1350[] = {
+static int parser_action_row1356[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1351[] = {
+static int parser_action_row1357[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1352[] = {
+static int parser_action_row1358[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1353[] = {
+static int parser_action_row1359[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1354[] = {
+static int parser_action_row1360[] = {
        5,
-       -1, 1, 367,
-       12, 0, 543,
-       49, 0, 544,
-       83, 0, 48,
-       84, 0, 49
+       -1, 1, 358,
+       12, 0, 553,
+       46, 0, 554,
+       81, 0, 48,
+       82, 0, 49
 };
-static int parser_action_row1355[] = {
+static int parser_action_row1361[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1356[] = {
+static int parser_action_row1362[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1357[] = {
+static int parser_action_row1363[] = {
        1,
        -1, 1, 33
 };
-static int parser_action_row1358[] = {
+static int parser_action_row1364[] = {
        3,
        -1, 1, 42,
-       9, 0, 1416,
+       9, 0, 1419,
        13, 0, 27
 };
-static int parser_action_row1359[] = {
+static int parser_action_row1365[] = {
        1,
        -1, 1, 37
 };
-static int parser_action_row1360[] = {
+static int parser_action_row1366[] = {
        1,
        -1, 1, 39
 };
-static int parser_action_row1361[] = {
+static int parser_action_row1367[] = {
        2,
-       -1, 3, 1360,
-       55, 0, 1417
+       -1, 3, 1366,
+       52, 0, 1420
 };
-static int parser_action_row1362[] = {
+static int parser_action_row1368[] = {
        1,
-       -1, 1, 503
+       -1, 1, 495
 };
-static int parser_action_row1363[] = {
+static int parser_action_row1369[] = {
        2,
-       -1, 3, 1362,
-       55, 0, 1418
+       -1, 3, 1368,
+       52, 0, 1421
 };
-static int parser_action_row1364[] = {
+static int parser_action_row1370[] = {
        1,
-       -1, 1, 660
+       -1, 1, 659
 };
-static int parser_action_row1365[] = {
+static int parser_action_row1371[] = {
        32,
-       -1, 1, 367,
+       -1, 1, 358,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 1041,
-       12, 0, 650,
-       15, 0, 651,
-       18, 0, 652,
-       25, 0, 653,
-       28, 0, 655,
-       29, 0, 656,
-       30, 0, 657,
-       36, 0, 658,
-       37, 0, 659,
-       38, 0, 660,
-       39, 0, 661,
-       40, 0, 662,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 663,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       9, 0, 1057,
+       12, 0, 662,
+       15, 0, 663,
+       16, 0, 664,
+       22, 0, 665,
+       25, 0, 667,
+       26, 0, 668,
+       27, 0, 669,
+       33, 0, 670,
+       34, 0, 671,
+       35, 0, 672,
+       36, 0, 673,
+       37, 0, 674,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 675,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1366[] = {
+static int parser_action_row1372[] = {
        2,
-       -1, 1, 234,
-       27, 1, 676
+       -1, 1, 218,
+       24, 1, 675
 };
-static int parser_action_row1367[] = {
+static int parser_action_row1373[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1368[] = {
+static int parser_action_row1374[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1369[] = {
+static int parser_action_row1375[] = {
        1,
-       -1, 1, 661
+       -1, 1, 660
 };
-static int parser_action_row1370[] = {
+static int parser_action_row1376[] = {
        1,
-       -1, 1, 666
+       -1, 1, 665
 };
-static int parser_action_row1371[] = {
+static int parser_action_row1377[] = {
        1,
-       -1, 1, 663
+       -1, 1, 662
 };
-static int parser_action_row1372[] = {
+static int parser_action_row1378[] = {
        1,
-       -1, 1, 668
+       -1, 1, 667
 };
-static int parser_action_row1373[] = {
+static int parser_action_row1379[] = {
        2,
-       -1, 1, 199,
-       27, 1, 651
+       -1, 1, 183,
+       24, 1, 650
 };
-static int parser_action_row1374[] = {
+static int parser_action_row1380[] = {
        2,
-       -1, 3, 1373,
-       15, 0, 1422
+       -1, 3, 1379,
+       15, 0, 1425
 };
-static int parser_action_row1375[] = {
+static int parser_action_row1381[] = {
        1,
-       -1, 1, 247
+       -1, 1, 231
 };
-static int parser_action_row1376[] = {
+static int parser_action_row1382[] = {
+       2,
+       -1, 1, 306,
+       80, 0, 184
+};
+static int parser_action_row1383[] = {
        1,
-       -1, 1, 745
+       -1, 1, 744
 };
-static int parser_action_row1377[] = {
+static int parser_action_row1384[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1378[] = {
+static int parser_action_row1385[] = {
        2,
-       -1, 1, 349,
-       54, 0, 238
+       -1, 1, 340,
+       51, 0, 242
 };
-static int parser_action_row1379[] = {
+static int parser_action_row1386[] = {
        3,
-       -1, 1, 435,
-       64, 1, 437,
-       66, 1, 437
+       -1, 1, 426,
+       61, 1, 429,
+       63, 1, 429
 };
-static int parser_action_row1380[] = {
+static int parser_action_row1387[] = {
        1,
-       -1, 1, 455
+       -1, 1, 451
 };
-static int parser_action_row1381[] = {
+static int parser_action_row1388[] = {
        1,
-       -1, 1, 401
+       -1, 1, 390
 };
-static int parser_action_row1382[] = {
+static int parser_action_row1389[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1383[] = {
+static int parser_action_row1390[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1384[] = {
+static int parser_action_row1391[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1385[] = {
+static int parser_action_row1392[] = {
        3,
-       -1, 3, 1384,
-       0, 0, 82,
-       1, 0, 83
+       -1, 3, 1391,
+       0, 0, 83,
+       1, 0, 84
 };
-static int parser_action_row1386[] = {
+static int parser_action_row1393[] = {
        1,
-       -1, 1, 326
+       -1, 1, 318
 };
-static int parser_action_row1387[] = {
+static int parser_action_row1394[] = {
        3,
-       -1, 3, 1386,
-       0, 0, 82,
-       1, 0, 83
+       -1, 3, 1393,
+       0, 0, 83,
+       1, 0, 84
 };
-static int parser_action_row1388[] = {
+static int parser_action_row1395[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1389[] = {
+static int parser_action_row1396[] = {
        2,
-       -1, 1, 146,
-       83, 0, 469
+       -1, 1, 130,
+       81, 0, 477
 };
-static int parser_action_row1390[] = {
+static int parser_action_row1397[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1391[] = {
+static int parser_action_row1398[] = {
        1,
-       -1, 1, 144
+       -1, 1, 128
 };
-static int parser_action_row1392[] = {
+static int parser_action_row1399[] = {
        4,
-       -1, 1, 135,
-       4, 0, 720,
-       14, 0, 1432,
-       15, 0, 1433
+       -1, 1, 119,
+       4, 0, 733,
+       14, 0, 734,
+       15, 0, 1436
 };
-static int parser_action_row1393[] = {
+static int parser_action_row1400[] = {
        2,
-       -1, 1, 92,
-       14, 0, 712
+       -1, 1, 77,
+       14, 0, 725
 };
-static int parser_action_row1394[] = {
+static int parser_action_row1401[] = {
        3,
-       -1, 3, 1393,
-       14, 0, 1394,
-       15, 0, 1438
+       -1, 3, 1400,
+       14, 0, 1401,
+       15, 0, 1441
 };
-static int parser_action_row1395[] = {
+static int parser_action_row1402[] = {
        4,
        -1, 1, 42,
-       0, 0, 82,
-       1, 0, 83,
+       0, 0, 83,
+       1, 0, 84,
        13, 0, 27
 };
-static int parser_action_row1396[] = {
+static int parser_action_row1403[] = {
        32,
-       -1, 1, 367,
+       -1, 1, 358,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 458,
+       9, 0, 466,
        12, 0, 26,
        15, 0, 28,
-       18, 0, 29,
-       25, 0, 30,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       36, 0, 35,
-       37, 0, 36,
-       38, 0, 37,
-       39, 0, 38,
-       40, 0, 39,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 45,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
-};
-static int parser_action_row1397[] = {
-       2,
-       -1, 3, 1396,
-       15, 0, 1443
-};
-static int parser_action_row1398[] = {
-       6,
-       -1, 1, 42,
-       0, 1, 92,
-       1, 1, 92,
-       13, 0, 27,
-       14, 0, 712,
-       61, 0, 1444
-};
-static int parser_action_row1399[] = {
-       2,
-       -1, 1, 67,
-       61, 0, 1448
-};
-static int parser_action_row1400[] = {
-       3,
-       -1, 1, 135,
-       4, 0, 720,
-       14, 0, 1449
-};
-static int parser_action_row1401[] = {
-       6,
-       -1, 1, 42,
-       0, 0, 82,
-       1, 0, 83,
-       13, 0, 27,
-       19, 0, 1452,
-       20, 0, 1453
-};
-static int parser_action_row1402[] = {
-       2,
-       -1, 1, 135,
-       4, 0, 720
-};
-static int parser_action_row1403[] = {
-       3,
-       -1, 3, 1402,
-       31, 0, 34,
-       96, 0, 56
+       16, 0, 29,
+       22, 0, 30,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       33, 0, 35,
+       34, 0, 36,
+       35, 0, 37,
+       36, 0, 38,
+       37, 0, 39,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 45,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row1404[] = {
        2,
-       -1, 1, 166,
-       59, 0, 287
+       -1, 3, 1403,
+       15, 0, 1446
 };
 static int parser_action_row1405[] = {
-       2,
-       -1, 3, 1404,
-       85, 0, 1457
+       3,
+       -1, 1, 77,
+       14, 0, 725,
+       58, 0, 1447
 };
 static int parser_action_row1406[] = {
-       2,
-       -1, 1, 166,
-       59, 0, 287
+       3,
+       -1, 1, 119,
+       4, 0, 733,
+       14, 0, 734
 };
 static int parser_action_row1407[] = {
-       22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       2,
+       -1, 1, 119,
+       4, 0, 733
 };
 static int parser_action_row1408[] = {
-       4,
+       3,
        -1, 3, 1407,
-       0, 0, 82,
-       1, 0, 83,
-       82, 0, 180
+       28, 0, 34,
+       94, 0, 56
 };
 static int parser_action_row1409[] = {
        1,
-       -1, 1, 492
+       -1, 1, 60
 };
 static int parser_action_row1410[] = {
-       1,
-       -1, 1, 497
+       22,
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
 static int parser_action_row1411[] = {
-       1,
-       -1, 1, 494
+       4,
+       -1, 3, 1410,
+       0, 0, 83,
+       1, 0, 84,
+       80, 0, 184
 };
 static int parser_action_row1412[] = {
        1,
-       -1, 1, 499
+       -1, 1, 484
 };
 static int parser_action_row1413[] = {
-       2,
-       -1, 3, 1412,
-       85, 0, 1462
+       1,
+       -1, 1, 489
 };
 static int parser_action_row1414[] = {
-       2,
-       -1, 1, 349,
-       54, 0, 238
+       1,
+       -1, 1, 486
 };
 static int parser_action_row1415[] = {
        1,
-       -1, 1, 495
+       -1, 1, 491
 };
 static int parser_action_row1416[] = {
-       1,
-       -1, 1, 500
+       2,
+       -1, 3, 1415,
+       83, 0, 1457
 };
 static int parser_action_row1417[] = {
-       1,
-       -1, 1, 41
+       2,
+       -1, 1, 340,
+       51, 0, 242
 };
 static int parser_action_row1418[] = {
        1,
-       -1, 1, 304
+       -1, 1, 487
 };
 static int parser_action_row1419[] = {
        1,
-       -1, 1, 556
+       -1, 1, 492
 };
 static int parser_action_row1420[] = {
        1,
-       -1, 1, 673
+       -1, 1, 41
 };
 static int parser_action_row1421[] = {
-       2,
-       -1, 3, 1420,
-       31, 0, 1464
+       1,
+       -1, 1, 277
 };
 static int parser_action_row1422[] = {
-       2,
-       -1, 3, 1421,
-       15, 0, 1465
+       1,
+       -1, 1, 541
 };
 static int parser_action_row1423[] = {
+       1,
+       -1, 1, 672
+};
+static int parser_action_row1424[] = {
+       2,
+       -1, 3, 1423,
+       28, 0, 1459
+};
+static int parser_action_row1425[] = {
+       2,
+       -1, 3, 1424,
+       15, 0, 1460
+};
+static int parser_action_row1426[] = {
        32,
-       -1, 1, 367,
+       -1, 1, 358,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 139,
+       9, 0, 142,
        12, 0, 26,
        15, 0, 28,
-       18, 0, 29,
-       25, 0, 30,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       36, 0, 35,
-       37, 0, 36,
-       38, 0, 37,
-       39, 0, 38,
-       40, 0, 39,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 45,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       16, 0, 29,
+       22, 0, 30,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       33, 0, 35,
+       34, 0, 36,
+       35, 0, 37,
+       36, 0, 38,
+       37, 0, 39,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 45,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1424[] = {
+static int parser_action_row1427[] = {
+       1,
+       -1, 1, 313
+};
+static int parser_action_row1428[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1425[] = {
+static int parser_action_row1429[] = {
        1,
-       -1, 1, 444
+       -1, 1, 436
 };
-static int parser_action_row1426[] = {
+static int parser_action_row1430[] = {
        2,
-       -1, 3, 1425,
-       48, 0, 1469
+       -1, 3, 1429,
+       45, 0, 1464
 };
-static int parser_action_row1427[] = {
+static int parser_action_row1431[] = {
        4,
-       -1, 3, 1426,
-       34, 0, 1470,
-       50, 0, 338,
-       83, 0, 339
+       -1, 3, 1430,
+       31, 0, 1465,
+       47, 0, 344,
+       81, 0, 345
 };
-static int parser_action_row1428[] = {
+static int parser_action_row1432[] = {
        35,
-       -1, 1, 367,
-       12, 0, 152,
+       -1, 1, 358,
+       12, 0, 155,
        15, 0, 28,
-       18, 0, 29,
-       25, 0, 153,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       34, 0, 154,
-       36, 0, 910,
-       37, 0, 911,
-       38, 0, 912,
-       39, 0, 913,
-       40, 0, 39,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       50, 0, 338,
-       51, 0, 157,
-       53, 0, 914,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       82, 0, 180,
-       83, 0, 915,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       16, 0, 29,
+       22, 0, 156,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       31, 0, 157,
+       33, 0, 928,
+       34, 0, 929,
+       35, 0, 930,
+       36, 0, 931,
+       37, 0, 39,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       47, 0, 344,
+       48, 0, 160,
+       50, 0, 932,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       80, 0, 184,
+       81, 0, 933,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1429[] = {
+static int parser_action_row1433[] = {
        1,
-       -1, 1, 327
+       -1, 1, 319
 };
-static int parser_action_row1430[] = {
+static int parser_action_row1434[] = {
        1,
-       -1, 1, 330
+       -1, 1, 322
 };
-static int parser_action_row1431[] = {
+static int parser_action_row1435[] = {
        2,
-       -1, 3, 1430,
-       50, 0, 1473
+       -1, 3, 1434,
+       47, 0, 1468
 };
-static int parser_action_row1432[] = {
+static int parser_action_row1436[] = {
        4,
-       -1, 3, 1431,
-       34, 0, 1474,
-       50, 0, 1475,
-       83, 0, 339
-};
-static int parser_action_row1433[] = {
-       7,
-       -1, 1, 42,
-       0, 0, 82,
-       1, 0, 83,
-       6, 0, 1477,
-       13, 0, 27,
-       19, 0, 1478,
-       20, 0, 1479
+       -1, 3, 1435,
+       31, 0, 1469,
+       47, 0, 1470,
+       81, 0, 345
 };
-static int parser_action_row1434[] = {
+static int parser_action_row1437[] = {
        32,
-       -1, 1, 367,
+       -1, 1, 358,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 458,
+       9, 0, 466,
        12, 0, 26,
        15, 0, 28,
-       18, 0, 29,
-       25, 0, 30,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       36, 0, 35,
-       37, 0, 36,
-       38, 0, 37,
-       39, 0, 38,
-       40, 0, 39,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 45,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       16, 0, 29,
+       22, 0, 30,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       33, 0, 35,
+       34, 0, 36,
+       35, 0, 37,
+       36, 0, 38,
+       37, 0, 39,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 45,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1435[] = {
+static int parser_action_row1438[] = {
        3,
-       -1, 1, 135,
-       4, 0, 720,
-       15, 0, 1481
+       -1, 1, 119,
+       4, 0, 733,
+       15, 0, 1473
 };
-static int parser_action_row1436[] = {
+static int parser_action_row1439[] = {
        3,
-       -1, 3, 1435,
-       31, 0, 34,
-       96, 0, 56
+       -1, 3, 1438,
+       28, 0, 34,
+       94, 0, 56
 };
-static int parser_action_row1437[] = {
+static int parser_action_row1440[] = {
        1,
        -1, 1, 59
 };
-static int parser_action_row1438[] = {
+static int parser_action_row1441[] = {
        1,
-       -1, 1, 83
+       -1, 1, 70
 };
-static int parser_action_row1439[] = {
+static int parser_action_row1442[] = {
        32,
-       -1, 1, 367,
+       -1, 1, 358,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 458,
+       9, 0, 466,
        12, 0, 26,
        15, 0, 28,
-       18, 0, 29,
-       25, 0, 30,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       36, 0, 35,
-       37, 0, 36,
-       38, 0, 37,
-       39, 0, 38,
-       40, 0, 39,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 45,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       16, 0, 29,
+       22, 0, 30,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       33, 0, 35,
+       34, 0, 36,
+       35, 0, 37,
+       36, 0, 38,
+       37, 0, 39,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 45,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1440[] = {
+static int parser_action_row1443[] = {
        2,
-       -1, 3, 1439,
-       15, 0, 1485
+       -1, 3, 1442,
+       15, 0, 1477
 };
-static int parser_action_row1441[] = {
+static int parser_action_row1444[] = {
        1,
-       -1, 1, 93
+       -1, 1, 78
 };
-static int parser_action_row1442[] = {
+static int parser_action_row1445[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1443[] = {
+static int parser_action_row1446[] = {
        2,
-       -1, 1, 378,
-       9, 0, 1000
+       -1, 1, 369,
+       9, 0, 1017
 };
-static int parser_action_row1444[] = {
+static int parser_action_row1447[] = {
        32,
-       -1, 1, 367,
+       -1, 1, 358,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 458,
+       9, 0, 466,
        12, 0, 26,
        15, 0, 28,
-       18, 0, 29,
-       25, 0, 30,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       36, 0, 35,
-       37, 0, 36,
-       38, 0, 37,
-       39, 0, 38,
-       40, 0, 39,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 45,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       16, 0, 29,
+       22, 0, 30,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       33, 0, 35,
+       34, 0, 36,
+       35, 0, 37,
+       36, 0, 38,
+       37, 0, 39,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 45,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1445[] = {
+static int parser_action_row1448[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1446[] = {
-       5,
-       -1, 1, 97,
-       21, 0, 196,
-       22, 0, 197,
-       23, 0, 198,
-       24, 0, 199
-};
-static int parser_action_row1447[] = {
-       1,
-       -1, 1, 75
-};
-static int parser_action_row1448[] = {
-       3,
-       -1, 1, 92,
-       14, 0, 712,
-       61, 0, 1491
-};
 static int parser_action_row1449[] = {
-       3,
-       -1, 1, 385,
-       0, 0, 1,
-       1, 0, 2
+       1,
+       -1, 1, 64
 };
 static int parser_action_row1450[] = {
-       6,
-       -1, 1, 42,
-       0, 0, 82,
-       1, 0, 83,
-       13, 0, 27,
-       19, 0, 1494,
-       20, 0, 1495
-};
-static int parser_action_row1451[] = {
        2,
-       -1, 1, 135,
-       4, 0, 720
+       -1, 1, 119,
+       4, 0, 733
 };
-static int parser_action_row1452[] = {
+static int parser_action_row1451[] = {
        3,
-       -1, 3, 1451,
-       31, 0, 34,
-       96, 0, 56
+       -1, 3, 1450,
+       28, 0, 34,
+       94, 0, 56
 };
-static int parser_action_row1453[] = {
+static int parser_action_row1452[] = {
        1,
-       -1, 1, 62
-};
-static int parser_action_row1454[] = {
-       2,
-       -1, 1, 149,
-       89, 0, 997
+       -1, 1, 61
 };
-static int parser_action_row1455[] = {
+static int parser_action_row1453[] = {
        3,
-       -1, 3, 1454,
-       31, 0, 34,
-       96, 0, 56
+       -1, 3, 1452,
+       28, 0, 34,
+       94, 0, 56
 };
-static int parser_action_row1456[] = {
+static int parser_action_row1454[] = {
        1,
-       -1, 1, 86
-};
-static int parser_action_row1457[] = {
-       2,
-       -1, 1, 68,
-       61, 0, 1500
-};
-static int parser_action_row1458[] = {
-       2,
-       -1, 1, 166,
-       59, 0, 287
-};
-static int parser_action_row1459[] = {
-       2,
-       -1, 1, 69,
-       61, 0, 1502
+       -1, 1, 71
 };
-static int parser_action_row1460[] = {
+static int parser_action_row1455[] = {
        1,
-       -1, 1, 760
+       -1, 1, 759
 };
-static int parser_action_row1461[] = {
+static int parser_action_row1456[] = {
        3,
-       -1, 3, 1460,
-       0, 0, 82,
-       1, 0, 83
+       -1, 3, 1455,
+       0, 0, 83,
+       1, 0, 84
 };
-static int parser_action_row1462[] = {
+static int parser_action_row1457[] = {
        1,
-       -1, 1, 333
+       -1, 1, 325
 };
-static int parser_action_row1463[] = {
+static int parser_action_row1458[] = {
        4,
-       -1, 1, 536,
-       61, 0, 1504,
-       62, 0, 365,
-       63, 0, 366
+       -1, 1, 531,
+       58, 0, 1486,
+       59, 0, 371,
+       60, 0, 372
 };
-static int parser_action_row1464[] = {
+static int parser_action_row1459[] = {
        4,
-       -1, 1, 538,
-       61, 0, 1506,
-       62, 0, 365,
-       63, 0, 366
+       -1, 1, 533,
+       58, 0, 1488,
+       59, 0, 371,
+       60, 0, 372
 };
-static int parser_action_row1465[] = {
+static int parser_action_row1460[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1466[] = {
+static int parser_action_row1461[] = {
        32,
-       -1, 1, 367,
+       -1, 1, 358,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 749,
-       12, 0, 650,
-       15, 0, 651,
-       18, 0, 652,
-       25, 0, 653,
-       28, 0, 655,
-       29, 0, 656,
-       30, 0, 657,
-       36, 0, 658,
-       37, 0, 659,
-       38, 0, 660,
-       39, 0, 661,
-       40, 0, 662,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 663,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       9, 0, 762,
+       12, 0, 662,
+       15, 0, 663,
+       16, 0, 664,
+       22, 0, 665,
+       25, 0, 667,
+       26, 0, 668,
+       27, 0, 669,
+       33, 0, 670,
+       34, 0, 671,
+       35, 0, 672,
+       36, 0, 673,
+       37, 0, 674,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 675,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1467[] = {
+static int parser_action_row1462[] = {
        1,
-       -1, 1, 238
+       -1, 1, 222
 };
-static int parser_action_row1468[] = {
+static int parser_action_row1463[] = {
        2,
-       -1, 3, 1467,
-       52, 0, 171
+       -1, 3, 1462,
+       49, 0, 175
 };
-static int parser_action_row1469[] = {
+static int parser_action_row1464[] = {
        2,
-       -1, 3, 1468,
-       27, 0, 1512
+       -1, 3, 1463,
+       24, 0, 1494
 };
-static int parser_action_row1470[] = {
+static int parser_action_row1465[] = {
        1,
-       -1, 1, 458
+       -1, 1, 439
 };
-static int parser_action_row1471[] = {
+static int parser_action_row1466[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1472[] = {
+static int parser_action_row1467[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1473[] = {
+static int parser_action_row1468[] = {
        2,
-       -1, 3, 1472,
-       55, 0, 1515
+       -1, 3, 1467,
+       52, 0, 1497
 };
-static int parser_action_row1474[] = {
+static int parser_action_row1469[] = {
        1,
-       -1, 1, 148
+       -1, 1, 132
 };
-static int parser_action_row1475[] = {
+static int parser_action_row1470[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1476[] = {
+static int parser_action_row1471[] = {
        4,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2,
-       83, 0, 469
+       81, 0, 477
 };
-static int parser_action_row1477[] = {
+static int parser_action_row1472[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1478[] = {
-       1,
-       -1, 1, 60
-};
-static int parser_action_row1479[] = {
-       1,
-       -1, 1, 61
-};
-static int parser_action_row1480[] = {
-       2,
-       -1, 1, 149,
-       89, 0, 997
-};
-static int parser_action_row1481[] = {
+static int parser_action_row1473[] = {
        2,
-       -1, 1, 378,
-       9, 0, 1000
+       -1, 1, 369,
+       9, 0, 1017
 };
-static int parser_action_row1482[] = {
+static int parser_action_row1474[] = {
        32,
-       -1, 1, 367,
+       -1, 1, 358,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 458,
+       9, 0, 466,
        12, 0, 26,
        15, 0, 28,
-       18, 0, 29,
-       25, 0, 30,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       36, 0, 35,
-       37, 0, 36,
-       38, 0, 37,
-       39, 0, 38,
-       40, 0, 39,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 45,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       16, 0, 29,
+       22, 0, 30,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       33, 0, 35,
+       34, 0, 36,
+       35, 0, 37,
+       36, 0, 38,
+       37, 0, 39,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 45,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1483[] = {
+static int parser_action_row1475[] = {
        3,
-       -1, 3, 1482,
-       31, 0, 34,
-       96, 0, 56
+       -1, 3, 1474,
+       28, 0, 34,
+       94, 0, 56
 };
-static int parser_action_row1484[] = {
+static int parser_action_row1476[] = {
        1,
-       -1, 1, 65
+       -1, 1, 62
 };
-static int parser_action_row1485[] = {
+static int parser_action_row1477[] = {
        2,
-       -1, 1, 378,
-       9, 0, 1000
+       -1, 1, 369,
+       9, 0, 1017
 };
-static int parser_action_row1486[] = {
+static int parser_action_row1478[] = {
        32,
-       -1, 1, 367,
+       -1, 1, 358,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 458,
+       9, 0, 466,
        12, 0, 26,
        15, 0, 28,
-       18, 0, 29,
-       25, 0, 30,
-       28, 0, 31,
-       29, 0, 32,
-       30, 0, 33,
-       36, 0, 35,
-       37, 0, 36,
-       38, 0, 37,
-       39, 0, 38,
-       40, 0, 39,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 45,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
-};
-static int parser_action_row1487[] = {
-       1,
-       -1, 1, 94
+       16, 0, 29,
+       22, 0, 30,
+       25, 0, 31,
+       26, 0, 32,
+       27, 0, 33,
+       33, 0, 35,
+       34, 0, 36,
+       35, 0, 37,
+       36, 0, 38,
+       37, 0, 39,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 45,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1488[] = {
+static int parser_action_row1479[] = {
        1,
        -1, 1, 79
 };
-static int parser_action_row1489[] = {
-       2,
-       -1, 1, 378,
-       9, 0, 1000
-};
-static int parser_action_row1490[] = {
-       22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+static int parser_action_row1480[] = {
+       1,
+       -1, 1, 66
 };
-static int parser_action_row1491[] = {
+static int parser_action_row1481[] = {
        2,
-       -1, 3, 1490,
-       17, 0, 1265
-};
-static int parser_action_row1492[] = {
-       3,
-       -1, 1, 385,
-       0, 0, 1,
-       1, 0, 2
-};
-static int parser_action_row1493[] = {
-       1,
-       -1, 1, 76
+       -1, 1, 369,
+       9, 0, 1017
 };
-static int parser_action_row1494[] = {
+static int parser_action_row1482[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
-};
-static int parser_action_row1495[] = {
-       1,
-       -1, 1, 63
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1496[] = {
-       2,
-       -1, 1, 149,
-       89, 0, 997
-};
-static int parser_action_row1497[] = {
+static int parser_action_row1483[] = {
        3,
-       -1, 3, 1496,
-       31, 0, 34,
-       96, 0, 56
+       -1, 3, 1482,
+       28, 0, 34,
+       94, 0, 56
 };
-static int parser_action_row1498[] = {
+static int parser_action_row1484[] = {
        1,
-       -1, 1, 87
-};
-static int parser_action_row1499[] = {
-       2,
-       -1, 1, 135,
-       4, 0, 720
+       -1, 1, 72
 };
-static int parser_action_row1500[] = {
+static int parser_action_row1485[] = {
        1,
-       -1, 1, 88
-};
-static int parser_action_row1501[] = {
-       3,
-       -1, 1, 385,
-       0, 0, 1,
-       1, 0, 2
-};
-static int parser_action_row1502[] = {
-       2,
-       -1, 1, 70,
-       61, 0, 1533
-};
-static int parser_action_row1503[] = {
-       3,
-       -1, 1, 385,
-       0, 0, 1,
-       1, 0, 2
+       -1, 1, 73
 };
-static int parser_action_row1504[] = {
+static int parser_action_row1486[] = {
        1,
-       -1, 1, 334
+       -1, 1, 326
 };
-static int parser_action_row1505[] = {
+static int parser_action_row1487[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1506[] = {
+static int parser_action_row1488[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1507[] = {
+static int parser_action_row1489[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1508[] = {
+static int parser_action_row1490[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1509[] = {
+static int parser_action_row1491[] = {
        22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 358,
+       12, 0, 155,
+       22, 0, 156,
+       31, 0, 157,
+       38, 0, 158,
+       40, 0, 159,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       48, 0, 160,
+       51, 0, 46,
+       53, 0, 47,
+       65, 0, 161,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
 };
-static int parser_action_row1510[] = {
+static int parser_action_row1492[] = {
        1,
-       -1, 1, 681
+       -1, 1, 680
 };
-static int parser_action_row1511[] = {
+static int parser_action_row1493[] = {
        2,
-       -1, 3, 1510,
-       52, 0, 171
+       -1, 3, 1492,
+       49, 0, 175
 };
-static int parser_action_row1512[] = {
+static int parser_action_row1494[] = {
        1,
-       -1, 1, 236
+       -1, 1, 220
 };
-static int parser_action_row1513[] = {
+static int parser_action_row1495[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1514[] = {
+static int parser_action_row1496[] = {
        2,
-       -1, 3, 1513,
-       48, 0, 1542
+       -1, 3, 1495,
+       45, 0, 1516
 };
-static int parser_action_row1515[] = {
+static int parser_action_row1497[] = {
        2,
-       -1, 3, 1514,
-       55, 0, 1543
+       -1, 3, 1496,
+       52, 0, 1517
 };
-static int parser_action_row1516[] = {
+static int parser_action_row1498[] = {
        4,
-       -1, 3, 1515,
-       0, 0, 82,
-       1, 0, 83,
-       82, 0, 180
-};
-static int parser_action_row1517[] = {
-       2,
-       -1, 3, 1516,
-       50, 0, 1546
+       -1, 3, 1497,
+       0, 0, 83,
+       1, 0, 84,
+       80, 0, 184
 };
-static int parser_action_row1518[] = {
+static int parser_action_row1499[] = {
        2,
-       -1, 3, 1517,
-       55, 0, 1547
+       -1, 3, 1498,
+       47, 0, 1520
 };
-static int parser_action_row1519[] = {
+static int parser_action_row1500[] = {
        2,
-       -1, 3, 1518,
-       55, 0, 1548
+       -1, 3, 1499,
+       52, 0, 1521
 };
-static int parser_action_row1520[] = {
+static int parser_action_row1501[] = {
        2,
-       -1, 1, 135,
-       4, 0, 720
+       -1, 3, 1500,
+       52, 0, 1522
 };
-static int parser_action_row1521[] = {
+static int parser_action_row1502[] = {
        1,
        -1, 1, 57
 };
-static int parser_action_row1522[] = {
+static int parser_action_row1503[] = {
        2,
-       -1, 1, 378,
-       9, 0, 1000
-};
-static int parser_action_row1523[] = {
-       1,
-       -1, 1, 66
+       -1, 1, 369,
+       9, 0, 1017
 };
-static int parser_action_row1524[] = {
+static int parser_action_row1504[] = {
        1,
-       -1, 1, 80
-};
-static int parser_action_row1525[] = {
-       2,
-       -1, 1, 378,
-       9, 0, 1000
+       -1, 1, 63
 };
-static int parser_action_row1526[] = {
+static int parser_action_row1505[] = {
        1,
-       -1, 1, 81
+       -1, 1, 67
 };
-static int parser_action_row1527[] = {
+static int parser_action_row1506[] = {
        2,
-       -1, 1, 92,
-       14, 0, 712
-};
-static int parser_action_row1528[] = {
-       22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 369,
+       9, 0, 1017
 };
-static int parser_action_row1529[] = {
+static int parser_action_row1507[] = {
        1,
-       -1, 1, 71
+       -1, 1, 68
 };
-static int parser_action_row1530[] = {
+static int parser_action_row1508[] = {
        2,
-       -1, 1, 135,
-       4, 0, 720
+       -1, 1, 77,
+       14, 0, 725
 };
-static int parser_action_row1531[] = {
+static int parser_action_row1509[] = {
        1,
-       -1, 1, 89
-};
-static int parser_action_row1532[] = {
-       3,
-       -1, 1, 155,
-       31, 0, 34,
-       96, 0, 56
-};
-static int parser_action_row1533[] = {
-       22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
-};
-static int parser_action_row1534[] = {
-       3,
-       -1, 1, 385,
-       0, 0, 1,
-       1, 0, 2
-};
-static int parser_action_row1535[] = {
-       22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
+       -1, 1, 74
 };
-static int parser_action_row1536[] = {
+static int parser_action_row1510[] = {
        1,
-       -1, 1, 491
+       -1, 1, 483
 };
-static int parser_action_row1537[] = {
+static int parser_action_row1511[] = {
        1,
-       -1, 1, 496
+       -1, 1, 488
 };
-static int parser_action_row1538[] = {
+static int parser_action_row1512[] = {
        1,
-       -1, 1, 493
+       -1, 1, 485
 };
-static int parser_action_row1539[] = {
+static int parser_action_row1513[] = {
        1,
-       -1, 1, 498
+       -1, 1, 490
 };
-static int parser_action_row1540[] = {
+static int parser_action_row1514[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1541[] = {
+static int parser_action_row1515[] = {
        2,
-       -1, 1, 237,
-       27, 1, 679
+       -1, 1, 221,
+       24, 1, 678
 };
-static int parser_action_row1542[] = {
+static int parser_action_row1516[] = {
        21,
-       -1, 1, 367,
-       12, 0, 802,
-       25, 0, 803,
-       34, 0, 804,
-       41, 0, 805,
-       43, 0, 806,
-       45, 0, 807,
-       46, 0, 808,
-       47, 0, 809,
-       48, 0, 810,
-       51, 0, 811,
-       54, 0, 812,
-       68, 0, 813,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 814,
-       87, 0, 815,
-       88, 0, 816,
-       89, 0, 817,
-       90, 0, 54,
-       93, 0, 818
-};
-static int parser_action_row1543[] = {
-       3,
-       -1, 1, 385,
-       0, 0, 1,
-       1, 0, 2
-};
-static int parser_action_row1544[] = {
-       1,
-       -1, 1, 456
-};
-static int parser_action_row1545[] = {
-       3,
-       -1, 3, 1544,
-       0, 0, 82,
-       1, 0, 83
+       -1, 1, 358,
+       12, 0, 816,
+       22, 0, 817,
+       31, 0, 818,
+       38, 0, 819,
+       40, 0, 820,
+       42, 0, 821,
+       43, 0, 822,
+       44, 0, 823,
+       45, 0, 824,
+       48, 0, 825,
+       51, 0, 826,
+       65, 0, 827,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 828,
+       85, 0, 829,
+       86, 0, 830,
+       87, 0, 831,
+       88, 0, 54,
+       91, 0, 832
 };
-static int parser_action_row1546[] = {
-       1,
-       -1, 1, 328
-};
-static int parser_action_row1547[] = {
+static int parser_action_row1517[] = {
        3,
-       -1, 1, 385,
+       -1, 1, 376,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1548[] = {
-       1,
-       -1, 1, 145
-};
-static int parser_action_row1549[] = {
-       1,
-       -1, 1, 143
-};
-static int parser_action_row1550[] = {
-       3,
-       -1, 1, 155,
-       31, 0, 34,
-       96, 0, 56
-};
-static int parser_action_row1551[] = {
+static int parser_action_row1518[] = {
        1,
-       -1, 1, 58
+       -1, 1, 437
 };
-static int parser_action_row1552[] = {
-       1,
-       -1, 1, 82
+static int parser_action_row1519[] = {
+       3,
+       -1, 3, 1518,
+       0, 0, 83,
+       1, 0, 84
 };
-static int parser_action_row1553[] = {
+static int parser_action_row1520[] = {
        1,
-       -1, 1, 77
-};
-static int parser_action_row1554[] = {
-       2,
-       -1, 1, 92,
-       14, 0, 712
+       -1, 1, 320
 };
-static int parser_action_row1555[] = {
+static int parser_action_row1521[] = {
        3,
-       -1, 1, 155,
-       31, 0, 34,
-       96, 0, 56
+       -1, 1, 376,
+       0, 0, 1,
+       1, 0, 2
 };
-static int parser_action_row1556[] = {
+static int parser_action_row1522[] = {
        1,
-       -1, 1, 84
+       -1, 1, 129
 };
-static int parser_action_row1557[] = {
+static int parser_action_row1523[] = {
        1,
-       -1, 1, 72
+       -1, 1, 127
 };
-static int parser_action_row1558[] = {
-       22,
-       -1, 1, 367,
-       12, 0, 152,
-       25, 0, 153,
-       34, 0, 154,
-       41, 0, 155,
-       43, 0, 156,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       51, 0, 157,
-       54, 0, 46,
-       56, 0, 47,
-       68, 0, 158,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
-};
-static int parser_action_row1559[] = {
+static int parser_action_row1524[] = {
        1,
-       -1, 1, 73
-};
-static int parser_action_row1560[] = {
-       2,
-       -1, 3, 1559,
-       15, 0, 1568
+       -1, 1, 58
 };
-static int parser_action_row1561[] = {
+static int parser_action_row1525[] = {
        1,
-       -1, 1, 404
-};
-static int parser_action_row1562[] = {
-       2,
-       -1, 3, 1561,
-       55, 0, 1569
+       -1, 1, 69
 };
-static int parser_action_row1563[] = {
+static int parser_action_row1526[] = {
        1,
-       -1, 1, 329
+       -1, 1, 65
 };
-static int parser_action_row1564[] = {
+static int parser_action_row1527[] = {
        2,
-       -1, 3, 1563,
-       55, 0, 1570
+       -1, 3, 1526,
+       15, 0, 1531
 };
-static int parser_action_row1565[] = {
+static int parser_action_row1528[] = {
        1,
-       -1, 1, 64
+       -1, 1, 393
 };
-static int parser_action_row1566[] = {
-       1,
-       -1, 1, 78
+static int parser_action_row1529[] = {
+       2,
+       -1, 3, 1528,
+       52, 0, 1532
 };
-static int parser_action_row1567[] = {
+static int parser_action_row1530[] = {
        1,
-       -1, 1, 85
+       -1, 1, 321
 };
-static int parser_action_row1568[] = {
-       1,
-       -1, 1, 74
+static int parser_action_row1531[] = {
+       2,
+       -1, 3, 1530,
+       52, 0, 1533
 };
-static int parser_action_row1569[] = {
+static int parser_action_row1532[] = {
        32,
-       -1, 1, 367,
+       -1, 1, 358,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 749,
-       12, 0, 650,
-       15, 0, 651,
-       18, 0, 652,
-       25, 0, 653,
-       28, 0, 655,
-       29, 0, 656,
-       30, 0, 657,
-       36, 0, 658,
-       37, 0, 659,
-       38, 0, 660,
-       39, 0, 661,
-       40, 0, 662,
-       41, 0, 40,
-       45, 0, 41,
-       46, 0, 42,
-       47, 0, 43,
-       48, 0, 44,
-       53, 0, 663,
-       54, 0, 46,
-       56, 0, 47,
-       83, 0, 48,
-       84, 0, 49,
-       86, 0, 50,
-       87, 0, 51,
-       88, 0, 52,
-       89, 0, 53,
-       90, 0, 54,
-       93, 0, 55
-};
-static int parser_action_row1570[] = {
-       1,
-       -1, 1, 457
-};
-static int parser_action_row1571[] = {
+       9, 0, 762,
+       12, 0, 662,
+       15, 0, 663,
+       16, 0, 664,
+       22, 0, 665,
+       25, 0, 667,
+       26, 0, 668,
+       27, 0, 669,
+       33, 0, 670,
+       34, 0, 671,
+       35, 0, 672,
+       36, 0, 673,
+       37, 0, 674,
+       38, 0, 40,
+       42, 0, 41,
+       43, 0, 42,
+       44, 0, 43,
+       45, 0, 44,
+       50, 0, 675,
+       51, 0, 46,
+       53, 0, 47,
+       81, 0, 48,
+       82, 0, 49,
+       84, 0, 50,
+       85, 0, 51,
+       86, 0, 52,
+       87, 0, 53,
+       88, 0, 54,
+       91, 0, 55
+};
+static int parser_action_row1533[] = {
        1,
-       -1, 1, 147
+       -1, 1, 438
 };
-static int parser_action_row1572[] = {
+static int parser_action_row1534[] = {
        1,
-       -1, 1, 680
+       -1, 1, 131
+};
+static int parser_action_row1535[] = {
+       1,
+       -1, 1, 679
 };
-static int parser_action_row1573[] = {
+static int parser_action_row1536[] = {
        2,
-       -1, 3, 1572,
-       52, 0, 171
+       -1, 3, 1535,
+       49, 0, 175
 };
-static int parser_action_row1574[] = {
+static int parser_action_row1537[] = {
        2,
-       -1, 1, 236,
-       27, 1, 678
+       -1, 1, 220,
+       24, 1, 677
 };
 
 const int* const parser_action_table[] = {
@@ -16714,44 +16411,7 @@ const int* const parser_action_table[] = {
        parser_action_row1534,
        parser_action_row1535,
        parser_action_row1536,
-       parser_action_row1537,
-       parser_action_row1538,
-       parser_action_row1539,
-       parser_action_row1540,
-       parser_action_row1541,
-       parser_action_row1542,
-       parser_action_row1543,
-       parser_action_row1544,
-       parser_action_row1545,
-       parser_action_row1546,
-       parser_action_row1547,
-       parser_action_row1548,
-       parser_action_row1549,
-       parser_action_row1550,
-       parser_action_row1551,
-       parser_action_row1552,
-       parser_action_row1553,
-       parser_action_row1554,
-       parser_action_row1555,
-       parser_action_row1556,
-       parser_action_row1557,
-       parser_action_row1558,
-       parser_action_row1559,
-       parser_action_row1560,
-       parser_action_row1561,
-       parser_action_row1562,
-       parser_action_row1563,
-       parser_action_row1564,
-       parser_action_row1565,
-       parser_action_row1566,
-       parser_action_row1567,
-       parser_action_row1568,
-       parser_action_row1569,
-       parser_action_row1570,
-       parser_action_row1571,
-       parser_action_row1572,
-       parser_action_row1573,
-       parser_action_row1574
+       parser_action_row1537
 };
 
 static int parser_goto_row1[] = {
@@ -16765,39 +16425,39 @@ static int parser_goto_row2[] = {
 static int parser_goto_row3[] = {
        3,
        -1, 5,
-       16, 85,
-       23, 85
+       16, 86,
+       23, 86
 };
 static int parser_goto_row4[] = {
        9,
        -1, 6,
-       18, 93,
-       25, 93,
-       88, 93,
-       92, 93,
-       102, 93,
-       104, 93,
-       229, 93,
-       235, 93
+       18, 94,
+       25, 94,
+       89, 94,
+       93, 94,
+       103, 94,
+       105, 94,
+       233, 94,
+       239, 94
 };
 static int parser_goto_row5[] = {
        16,
        -1, 7,
        4, 21,
-       16, 86,
-       17, 89,
-       18, 94,
-       23, 100,
-       24, 103,
-       25, 105,
-       87, 228,
-       88, 230,
-       92, 232,
-       101, 234,
-       102, 236,
-       104, 237,
-       229, 384,
-       235, 386
+       16, 87,
+       17, 90,
+       18, 95,
+       23, 101,
+       24, 104,
+       25, 106,
+       88, 232,
+       89, 234,
+       93, 236,
+       102, 238,
+       103, 240,
+       105, 241,
+       233, 390,
+       239, 392
 };
 static int parser_goto_row6[] = {
        1,
@@ -16808,1369 +16468,1362 @@ static int parser_goto_row7[] = {
        -1, 9
 };
 static int parser_goto_row8[] = {
-       21,
-       -1, 1013,
+       14,
+       -1, 1031,
        12, 57,
-       22, 99,
-       91, 231,
-       95, 231,
-       180, 336,
-       463, 589,
-       467, 336,
-       694, 336,
-       712, 336,
-       721, 336,
-       795, 336,
-       981, 1110,
-       1014, 1138,
-       1015, 1140,
-       1139, 1269,
-       1394, 336,
-       1397, 1445,
-       1400, 336,
-       1432, 336,
-       1449, 336
+       22, 100,
+       92, 235,
+       96, 235,
+       184, 342,
+       471, 600,
+       475, 603,
+       706, 603,
+       725, 603,
+       734, 603,
+       810, 603,
+       1000, 1128,
+       1401, 603
 };
 static int parser_goto_row9[] = {
        1,
-       -1, 358
+       -1, 364
 };
 static int parser_goto_row10[] = {
        1,
-       -1, 728
+       -1, 741
 };
 static int parser_goto_row11[] = {
        2,
-       -1, 1129,
-       1131, 1255
+       -1, 1146,
+       1148, 1269
 };
 static int parser_goto_row12[] = {
        2,
-       -1, 1005,
-       1253, 1332
+       -1, 1022,
+       1267, 1342
 };
 static int parser_goto_row13[] = {
        5,
-       -1, 852,
-       858, 1017,
-       1008, 1017,
-       1025, 1017,
-       1168, 1017
+       -1, 866,
+       872, 1033,
+       1025, 1033,
+       1041, 1033,
+       1182, 1033
 };
 static int parser_goto_row14[] = {
        9,
-       -1, 853,
-       859, 1020,
-       1009, 1020,
-       1019, 1020,
-       1026, 1020,
-       1134, 1020,
-       1169, 1020,
-       1172, 1020,
-       1286, 1020
+       -1, 867,
+       873, 1036,
+       1026, 1036,
+       1035, 1036,
+       1042, 1036,
+       1151, 1036,
+       1183, 1036,
+       1186, 1036,
+       1295, 1036
 };
 static int parser_goto_row15[] = {
        1,
-       -1, 854
+       -1, 868
 };
 static int parser_goto_row16[] = {
-       8,
-       -1, 713,
-       612, 716,
-       1260, 1335,
-       1392, 1437,
-       1397, 1446,
-       1447, 1492,
-       1526, 1552,
-       1553, 1565
+       6,
+       -1, 726,
+       624, 729,
+       1274, 1345,
+       1399, 1440,
+       1404, 1448,
+       1507, 1525
 };
 static int parser_goto_row17[] = {
        6,
-       -1, 723,
-       1339, 1396,
-       1343, 1401,
-       1391, 1434,
-       1393, 1439,
-       1399, 1450
+       -1, 736,
+       1349, 1403,
+       1352, 1406,
+       1398, 1437,
+       1400, 1442,
+       1405, 1449
 };
 static int parser_goto_row18[] = {
-       1,
-       -1, 1014
+       8,
+       -1, 204,
+       100, 237,
+       235, 391,
+       342, 476,
+       600, 707,
+       603, 711,
+       1031, 1154,
+       1128, 1258
 };
 static int parser_goto_row19[] = {
-       3,
-       -1, 1015,
-       1014, 1139,
-       1397, 1447
+       6,
+       -1, 1011,
+       362, 504,
+       1140, 1265,
+       1275, 1346,
+       1277, 1348,
+       1279, 1351
 };
 static int parser_goto_row20[] = {
-       11,
-       -1, 200,
-       99, 233,
-       231, 385,
-       336, 468,
-       589, 695,
-       1013, 1137,
-       1110, 1242,
-       1138, 1268,
-       1140, 1270,
-       1269, 1345,
-       1445, 1490
+       6,
+       -1, 629,
+       1277, 1349,
+       1279, 1352,
+       1346, 1398,
+       1348, 1400,
+       1351, 1405
 };
 static int parser_goto_row21[] = {
-       6,
-       -1, 992,
-       356, 495,
-       1122, 1249,
-       1261, 1336,
-       1263, 1338,
-       1267, 1342
+       1,
+       -1, 855
 };
 static int parser_goto_row22[] = {
-       6,
-       -1, 617,
-       1263, 1339,
-       1267, 1343,
-       1336, 1391,
-       1338, 1393,
-       1342, 1399
+       2,
+       -1, 1007,
+       1009, 1135
 };
 static int parser_goto_row23[] = {
-       1,
-       -1, 839
+       2,
+       -1, 856,
+       1134, 1261
 };
 static int parser_goto_row24[] = {
-       2,
-       -1, 988,
-       990, 1117
+       8,
+       -1, 737,
+       736, 863,
+       1352, 1407,
+       1398, 1438,
+       1405, 1450,
+       1406, 1452,
+       1437, 1474,
+       1449, 1482
 };
 static int parser_goto_row25[] = {
        2,
-       -1, 840,
-       1116, 1245
+       -1, 1138,
+       1139, 1263
 };
 static int parser_goto_row26[] = {
-       12,
-       -1, 724,
-       723, 849,
-       998, 1123,
-       1343, 1402,
-       1391, 1435,
-       1399, 1451,
-       1401, 1454,
-       1434, 1482,
-       1450, 1496,
-       1498, 1531,
-       1519, 1549,
-       1529, 1554
+       2,
+       -1, 1012,
+       1262, 1340
 };
 static int parser_goto_row27[] = {
-       2,
-       -1, 1120,
-       1121, 1247
+       1,
+       -1, 1013
 };
 static int parser_goto_row28[] = {
-       2,
-       -1, 993,
-       1246, 1330
+       1,
+       -1, 1014
 };
 static int parser_goto_row29[] = {
        1,
-       -1, 994
+       -1, -1
 };
 static int parser_goto_row30[] = {
        1,
-       -1, 995
+       -1, 58
 };
 static int parser_goto_row31[] = {
-       4,
-       -1, 998,
-       1453, 1498,
-       1479, 1519,
-       1495, 1529
+       11,
+       -1, 59,
+       737, 864,
+       741, 869,
+       863, 1020,
+       874, 1038,
+       1407, 1453,
+       1438, 1475,
+       1450, 1483,
+       1452, 1484,
+       1474, 1503,
+       1482, 1508
 };
 static int parser_goto_row32[] = {
        1,
-       -1, 58
+       -1, -1
 };
 static int parser_goto_row33[] = {
-       14,
-       -1, 1250,
-       12, 59,
-       22, 59,
-       91, 59,
-       724, 850,
-       728, 855,
-       849, 1003,
-       860, 1022,
-       1402, 1455,
-       1435, 1483,
-       1451, 1497,
-       1454, 1499,
-       1482, 1522,
-       1496, 1530
-};
-static int parser_goto_row34[] = {
-       4,
-       -1, 1251,
-       1531, 1555,
-       1549, 1564,
-       1554, 1566
-};
-static int parser_goto_row35[] = {
        5,
        -1, 10,
-       17, 90,
-       24, 90,
-       87, 90,
-       101, 90
+       17, 91,
+       24, 91,
+       88, 91,
+       102, 91
 };
-static int parser_goto_row36[] = {
+static int parser_goto_row34[] = {
        24,
-       -1, 692,
-       186, 340,
-       406, 530,
-       422, 549,
-       443, 566,
-       719, 841,
-       766, 885,
-       798, 916,
-       842, 996,
-       863, 1029,
-       872, 1033,
-       904, 1061,
-       1016, 1147,
-       1067, 1201,
-       1136, 1260,
-       1204, 916,
-       1246, 996,
-       1274, 1347,
-       1275, 916,
-       1329, 1147,
-       1331, 1390,
-       1426, 1471,
-       1427, 916,
-       1431, 1476
+       -1, 934,
+       190, 346,
+       412, 539,
+       429, 559,
+       450, 576,
+       598, 704,
+       612, 704,
+       703, 704,
+       718, 704,
+       732, 857,
+       779, 899,
+       858, 1015,
+       877, 1045,
+       886, 1049,
+       918, 1077,
+       1032, 1161,
+       1084, 1216,
+       1153, 1274,
+       1262, 1015,
+       1283, 1353,
+       1339, 1161,
+       1341, 1397,
+       1430, 1466,
+       1435, 1471
 };
-static int parser_goto_row37[] = {
+static int parser_goto_row35[] = {
        4,
-       -1, 693,
-       600, 706,
-       691, 786,
-       705, 799
+       -1, 705,
+       612, 719,
+       703, 799,
+       718, 813
 };
-static int parser_goto_row38[] = {
+static int parser_goto_row36[] = {
        2,
-       -1, 788,
-       789, 905
+       -1, 801,
+       802, 919
 };
-static int parser_goto_row39[] = {
+static int parser_goto_row37[] = {
        5,
-       -1, 618,
-       838, 983,
-       984, 1113,
-       986, 1114,
-       1337, 1392
+       -1, 630,
+       854, 1002,
+       1003, 1131,
+       1005, 1132,
+       1347, 1399
 };
-static int parser_goto_row40[] = {
-       11,
-       -1, 288,
-       289, 424,
-       754, 876,
-       877, 1035,
-       1004, 1126,
-       1127, 1252,
-       1340, 1397,
-       1341, 1398,
-       1403, 1456,
-       1405, 1458,
-       1457, 1501
+static int parser_goto_row38[] = {
+       7,
+       -1, 293,
+       294, 431,
+       767, 890,
+       891, 1051,
+       1021, 1143,
+       1144, 1266,
+       1350, 1404
 };
-static int parser_goto_row41[] = {
+static int parser_goto_row39[] = {
        24,
-       -1, 140,
-       32, 148,
-       331, 459,
-       457, 582,
-       553, 681,
-       654, 756,
-       656, 148,
-       722, 847,
-       777, 897,
-       848, 1002,
-       884, 459,
-       1040, 582,
-       1058, 1197,
-       1182, 681,
-       1364, 897,
-       1395, 1442,
-       1422, 1466,
-       1433, 1480,
-       1438, 1484,
-       1443, 1488,
-       1465, 1197,
-       1481, 1521,
-       1485, 1524,
-       1568, 1466
+       -1, 143,
+       32, 151,
+       337, 467,
+       465, 593,
+       563, 693,
+       666, 769,
+       668, 151,
+       735, 861,
+       790, 911,
+       862, 1019,
+       898, 467,
+       1056, 593,
+       1074, 1211,
+       1196, 693,
+       1370, 911,
+       1402, 1445,
+       1425, 1461,
+       1436, 1472,
+       1441, 1476,
+       1446, 1480,
+       1460, 1211,
+       1473, 1502,
+       1477, 1505,
+       1531, 1461
 };
-static int parser_goto_row42[] = {
+static int parser_goto_row40[] = {
        1,
        -1, 60
 };
-static int parser_goto_row43[] = {
+static int parser_goto_row41[] = {
        2,
        -1, 61,
-       670, 774
+       682, 787
 };
-static int parser_goto_row44[] = {
+static int parser_goto_row42[] = {
        4,
-       -1, 284,
-       460, 584,
-       750, 874,
-       1042, 1187
+       -1, 289,
+       468, 595,
+       763, 888,
+       1058, 1201
 };
-static int parser_goto_row45[] = {
+static int parser_goto_row43[] = {
        4,
-       -1, 202,
-       204, 360,
-       421, 360,
-       896, 360
+       -1, 206,
+       208, 366,
+       428, 366,
+       910, 366
 };
-static int parser_goto_row46[] = {
+static int parser_goto_row44[] = {
        16,
-       -1, 141,
+       -1, 144,
        12, 62,
        22, 62,
-       91, 62,
-       95, 62,
-       142, 285,
-       203, 359,
-       361, 359,
-       420, 359,
-       460, 285,
-       548, 359,
-       552, 664,
-       670, 775,
-       750, 285,
-       1042, 285,
-       1181, 664
+       92, 62,
+       96, 62,
+       145, 290,
+       207, 365,
+       367, 365,
+       427, 365,
+       468, 290,
+       558, 365,
+       562, 676,
+       682, 788,
+       763, 290,
+       1058, 290,
+       1195, 676
 };
-static int parser_goto_row47[] = {
+static int parser_goto_row45[] = {
        18,
-       -1, 172,
-       37, 173,
-       143, 286,
-       149, 292,
-       659, 762,
-       660, 763,
-       682, 780,
-       753, 875,
-       759, 880,
-       911, 1065,
-       912, 1066,
-       1142, 1272,
-       1143, 1273,
-       1198, 1311,
-       1300, 1365,
-       1467, 1511,
-       1510, 1540,
-       1572, 1573
+       -1, 176,
+       37, 177,
+       146, 291,
+       152, 297,
+       671, 775,
+       672, 776,
+       694, 793,
+       766, 889,
+       772, 894,
+       929, 1082,
+       930, 1083,
+       1156, 1281,
+       1157, 1282,
+       1212, 1320,
+       1309, 1371,
+       1462, 1493,
+       1492, 1514,
+       1535, 1536
 };
-static int parser_goto_row48[] = {
-       7,
+static int parser_goto_row46[] = {
+       8,
        -1, 63,
-       798, 917,
-       1016, 1148,
-       1204, 917,
-       1275, 917,
-       1329, 1148,
-       1427, 917
+       812, 935,
+       1032, 1162,
+       1080, 935,
+       1219, 935,
+       1284, 935,
+       1339, 1162,
+       1431, 935
 };
-static int parser_goto_row49[] = {
-       5,
+static int parser_goto_row47[] = {
+       6,
        -1, 64,
-       798, 918,
-       1204, 918,
-       1275, 918,
-       1427, 918
+       812, 936,
+       1080, 936,
+       1219, 936,
+       1284, 936,
+       1431, 936
 };
-static int parser_goto_row50[] = {
+static int parser_goto_row48[] = {
        15,
-       -1, 367,
-       218, 376,
-       219, 378,
-       628, 735,
-       629, 737,
-       768, 888,
-       770, 891,
-       771, 893,
-       1190, 1304,
-       1191, 1306,
-       1277, 1350,
-       1278, 1352,
-       1280, 1355,
-       1462, 1505,
-       1463, 1507
+       -1, 373,
+       222, 382,
+       223, 384,
+       640, 748,
+       641, 750,
+       781, 902,
+       783, 905,
+       784, 907,
+       1204, 1313,
+       1205, 1315,
+       1286, 1356,
+       1287, 1358,
+       1289, 1361,
+       1457, 1487,
+       1458, 1489
 };
-static int parser_goto_row51[] = {
-       7,
+static int parser_goto_row49[] = {
+       8,
        -1, 65,
-       798, 919,
-       1016, 1149,
-       1204, 919,
-       1275, 919,
-       1329, 1149,
-       1427, 919
+       812, 937,
+       1032, 1163,
+       1080, 937,
+       1219, 937,
+       1284, 937,
+       1339, 1163,
+       1431, 937
 };
-static int parser_goto_row52[] = {
+static int parser_goto_row50[] = {
        1,
        -1, 66
 };
-static int parser_goto_row53[] = {
+static int parser_goto_row51[] = {
        3,
-       -1, 665,
-       670, 776,
-       774, 895
+       -1, 677,
+       682, 789,
+       787, 909
 };
-static int parser_goto_row54[] = {
-       7,
+static int parser_goto_row52[] = {
+       8,
        -1, 67,
-       798, 920,
-       1016, 1150,
-       1204, 920,
-       1275, 920,
-       1329, 1150,
-       1427, 920
+       812, 938,
+       1032, 1164,
+       1080, 938,
+       1219, 938,
+       1284, 938,
+       1339, 1164,
+       1431, 938
 };
-static int parser_goto_row55[] = {
-       7,
+static int parser_goto_row53[] = {
+       8,
        -1, 68,
-       798, 921,
-       1016, 1151,
-       1204, 921,
-       1275, 921,
-       1329, 1151,
-       1427, 921
+       812, 939,
+       1032, 1165,
+       1080, 939,
+       1219, 939,
+       1284, 939,
+       1339, 1165,
+       1431, 939
 };
-static int parser_goto_row56[] = {
-       7,
+static int parser_goto_row54[] = {
+       8,
        -1, 69,
-       798, 922,
-       1016, 1152,
-       1204, 922,
-       1275, 922,
-       1329, 1152,
-       1427, 922
+       812, 940,
+       1032, 1166,
+       1080, 940,
+       1219, 940,
+       1284, 940,
+       1339, 1166,
+       1431, 940
 };
-static int parser_goto_row57[] = {
-       7,
+static int parser_goto_row55[] = {
+       8,
        -1, 70,
-       798, 923,
-       1016, 1153,
-       1204, 923,
-       1275, 923,
-       1329, 1153,
-       1427, 923
+       812, 941,
+       1032, 1167,
+       1080, 941,
+       1219, 941,
+       1284, 941,
+       1339, 1167,
+       1431, 941
 };
-static int parser_goto_row58[] = {
+static int parser_goto_row56[] = {
        2,
-       -1, 175,
-       662, 764
+       -1, 179,
+       674, 777
 };
-static int parser_goto_row59[] = {
+static int parser_goto_row57[] = {
        45,
-       -1, 159,
-       39, 176,
-       175, 329,
-       364, 504,
-       367, 505,
-       375, 509,
-       376, 510,
-       377, 511,
-       378, 512,
-       472, 601,
-       550, 647,
-       648, 747,
-       662, 176,
-       734, 864,
-       735, 865,
-       736, 866,
-       737, 867,
-       764, 329,
-       887, 504,
-       888, 505,
-       890, 509,
-       891, 510,
-       892, 511,
-       893, 512,
-       910, 1064,
-       1044, 601,
-       1141, 1271,
-       1179, 647,
-       1297, 747,
-       1303, 864,
-       1304, 865,
-       1305, 866,
-       1306, 867,
-       1313, 1375,
-       1349, 1408,
-       1350, 1409,
-       1351, 1410,
-       1352, 1411,
-       1354, 1414,
-       1355, 1415,
-       1406, 1459,
-       1504, 1535,
-       1505, 1536,
-       1506, 1537,
-       1507, 1538
+       -1, 162,
+       39, 180,
+       179, 335,
+       370, 513,
+       373, 514,
+       381, 518,
+       382, 519,
+       383, 520,
+       384, 521,
+       480, 613,
+       560, 659,
+       660, 760,
+       674, 180,
+       747, 878,
+       748, 879,
+       749, 880,
+       750, 881,
+       777, 335,
+       901, 513,
+       902, 514,
+       904, 518,
+       905, 519,
+       906, 520,
+       907, 521,
+       928, 1081,
+       1060, 613,
+       1155, 1280,
+       1193, 659,
+       1306, 760,
+       1312, 878,
+       1313, 879,
+       1314, 880,
+       1315, 881,
+       1323, 1382,
+       1355, 1411,
+       1356, 1412,
+       1357, 1413,
+       1358, 1414,
+       1360, 1417,
+       1361, 1418,
+       1409, 1454,
+       1486, 1509,
+       1487, 1510,
+       1488, 1511,
+       1489, 1512
+};
+static int parser_goto_row58[] = {
+       50,
+       -1, 163,
+       39, 181,
+       149, 295,
+       150, 296,
+       179, 181,
+       191, 347,
+       192, 348,
+       219, 378,
+       244, 394,
+       255, 402,
+       302, 437,
+       368, 402,
+       374, 515,
+       393, 402,
+       522, 402,
+       670, 181,
+       674, 181,
+       696, 795,
+       721, 815,
+       755, 883,
+       768, 892,
+       770, 893,
+       777, 181,
+       797, 916,
+       812, 942,
+       901, 181,
+       902, 181,
+       904, 181,
+       905, 181,
+       906, 181,
+       907, 181,
+       954, 1092,
+       965, 1101,
+       1060, 181,
+       1080, 942,
+       1193, 181,
+       1210, 1319,
+       1219, 942,
+       1284, 942,
+       1306, 181,
+       1311, 1373,
+       1312, 181,
+       1313, 181,
+       1314, 181,
+       1315, 181,
+       1321, 1380,
+       1383, 1427,
+       1431, 942,
+       1481, 1507,
+       1490, 1513
+};
+static int parser_goto_row59[] = {
+       1,
+       -1, 164
 };
 static int parser_goto_row60[] = {
-       54,
-       -1, 160,
-       39, 177,
-       146, 290,
-       147, 291,
-       175, 177,
-       187, 341,
-       188, 342,
-       215, 372,
-       240, 388,
-       251, 396,
-       297, 430,
-       362, 396,
-       368, 506,
-       387, 396,
-       513, 396,
-       658, 177,
-       662, 177,
-       684, 782,
-       708, 801,
-       742, 869,
-       755, 878,
-       757, 879,
-       764, 177,
-       784, 902,
-       798, 924,
-       887, 177,
-       888, 177,
-       890, 177,
-       891, 177,
-       892, 177,
-       893, 177,
-       936, 1075,
-       947, 1084,
-       1044, 177,
-       1179, 177,
-       1196, 1310,
-       1204, 924,
-       1275, 924,
-       1297, 177,
-       1302, 1367,
-       1303, 177,
-       1304, 177,
-       1305, 177,
-       1306, 177,
-       1312, 1374,
-       1376, 1423,
-       1427, 924,
-       1489, 1526,
-       1493, 1528,
-       1508, 1539,
-       1527, 1553,
-       1532, 1556,
-       1534, 1558,
-       1557, 1567
+       6,
+       -1, 165,
+       303, 438,
+       444, 570,
+       446, 572,
+       447, 573,
+       571, 700
 };
 static int parser_goto_row61[] = {
        1,
-       -1, 161
+       -1, 166
 };
 static int parser_goto_row62[] = {
-       6,
-       -1, 162,
-       298, 431,
-       437, 560,
-       439, 562,
-       440, 563,
-       561, 688
+       10,
+       -1, 167,
+       448, 574,
+       449, 575,
+       453, 579,
+       454, 580,
+       455, 581,
+       456, 582,
+       457, 583,
+       458, 584,
+       459, 585
 };
 static int parser_goto_row63[] = {
-       1,
-       -1, 163
+       3,
+       -1, 168,
+       451, 577,
+       452, 578
 };
 static int parser_goto_row64[] = {
-       10,
-       -1, 164,
-       441, 564,
-       442, 565,
-       446, 569,
-       447, 570,
-       448, 571,
-       449, 572,
-       450, 573,
-       451, 574,
-       452, 575
+       5,
+       -1, 169,
+       460, 586,
+       461, 587,
+       462, 588,
+       463, 589
 };
 static int parser_goto_row65[] = {
        3,
-       -1, 165,
-       444, 567,
-       445, 568
+       -1, 170,
+       305, 440,
+       308, 443
 };
 static int parser_goto_row66[] = {
-       6,
-       -1, 166,
-       300, 433,
-       303, 436,
-       453, 576,
-       454, 577,
-       455, 578
-};
-static int parser_goto_row67[] = {
        1,
-       -1, 167
+       -1, 171
 };
-static int parser_goto_row68[] = {
-       46,
-       -1, 168,
+static int parser_goto_row67[] = {
+       47,
+       -1, 172,
        12, 71,
        22, 71,
        28, 71,
        32, 71,
-       91, 71,
-       95, 71,
-       142, 71,
-       157, 301,
-       203, 71,
-       331, 71,
-       361, 71,
-       420, 71,
-       457, 71,
-       460, 71,
-       548, 71,
-       552, 666,
-       553, 71,
-       651, 666,
-       654, 71,
-       656, 666,
-       670, 71,
-       722, 71,
-       750, 71,
-       777, 71,
-       798, 925,
-       848, 71,
-       884, 666,
-       1040, 666,
-       1042, 71,
+       92, 71,
+       96, 71,
+       145, 71,
+       160, 306,
+       207, 71,
+       337, 71,
+       367, 71,
+       427, 71,
+       465, 71,
+       468, 71,
+       558, 71,
+       562, 678,
+       563, 71,
+       663, 678,
+       666, 71,
+       668, 678,
+       682, 71,
+       735, 71,
+       763, 71,
+       790, 71,
+       812, 943,
+       862, 71,
+       898, 678,
+       1056, 678,
        1058, 71,
-       1181, 666,
-       1182, 666,
-       1204, 925,
-       1275, 925,
-       1364, 666,
-       1395, 71,
-       1422, 71,
-       1427, 925,
-       1433, 71,
-       1438, 71,
-       1443, 71,
-       1465, 666,
-       1481, 71,
-       1485, 71,
-       1568, 666
+       1074, 71,
+       1080, 943,
+       1195, 678,
+       1196, 678,
+       1219, 943,
+       1284, 943,
+       1370, 678,
+       1402, 71,
+       1425, 71,
+       1431, 943,
+       1436, 71,
+       1441, 71,
+       1446, 71,
+       1460, 678,
+       1473, 71,
+       1477, 71,
+       1531, 678
+};
+static int parser_goto_row68[] = {
+       1,
+       -1, 72
 };
 static int parser_goto_row69[] = {
-       72,
-       -1, 72,
-       26, 123,
-       77, 123,
-       115, 123,
-       217, 123,
-       221, 123,
-       223, 123,
-       241, 123,
-       243, 123,
-       252, 123,
-       382, 123,
-       400, 123,
-       402, 123,
-       403, 123,
-       404, 123,
-       405, 123,
-       407, 123,
-       408, 123,
-       409, 123,
-       410, 123,
-       411, 123,
-       412, 123,
-       413, 123,
-       414, 123,
-       415, 123,
-       416, 123,
-       417, 123,
-       418, 123,
-       498, 123,
-       501, 123,
-       525, 123,
-       631, 123,
-       632, 123,
-       650, 123,
-       668, 123,
-       709, 819,
-       740, 123,
-       769, 123,
-       773, 123,
-       778, 123,
-       811, 819,
-       899, 123,
-       937, 819,
-       939, 819,
-       948, 819,
-       1016, 123,
-       1045, 123,
-       1047, 123,
-       1089, 819,
-       1091, 819,
-       1092, 819,
-       1093, 819,
-       1094, 819,
-       1096, 819,
-       1097, 819,
-       1098, 819,
-       1099, 819,
-       1100, 819,
-       1101, 819,
-       1102, 819,
-       1103, 819,
-       1104, 819,
-       1105, 819,
-       1106, 819,
-       1107, 819,
-       1193, 123,
-       1194, 123,
-       1218, 819,
-       1293, 123,
-       1309, 123,
-       1329, 123,
-       1541, 819
+       75,
+       -1, 73,
+       26, 124,
+       78, 124,
+       116, 124,
+       221, 124,
+       225, 124,
+       227, 124,
+       245, 124,
+       247, 124,
+       256, 124,
+       388, 124,
+       406, 124,
+       408, 124,
+       409, 124,
+       410, 124,
+       411, 124,
+       413, 124,
+       414, 124,
+       415, 124,
+       416, 124,
+       417, 124,
+       418, 124,
+       419, 124,
+       420, 124,
+       421, 124,
+       422, 124,
+       423, 124,
+       424, 124,
+       425, 124,
+       507, 124,
+       510, 124,
+       534, 124,
+       643, 124,
+       644, 124,
+       662, 124,
+       680, 124,
+       722, 833,
+       753, 124,
+       782, 124,
+       786, 124,
+       791, 124,
+       808, 124,
+       825, 833,
+       913, 124,
+       955, 833,
+       957, 833,
+       966, 833,
+       1032, 124,
+       1061, 124,
+       1063, 124,
+       1106, 833,
+       1108, 833,
+       1109, 833,
+       1110, 833,
+       1111, 833,
+       1113, 833,
+       1114, 833,
+       1115, 833,
+       1116, 833,
+       1117, 833,
+       1118, 833,
+       1119, 833,
+       1120, 833,
+       1121, 833,
+       1122, 833,
+       1123, 833,
+       1124, 833,
+       1125, 833,
+       1207, 124,
+       1208, 124,
+       1233, 833,
+       1302, 124,
+       1318, 124,
+       1339, 124,
+       1515, 833
 };
 static int parser_goto_row70[] = {
        1,
-       -1, 73
+       -1, 74
 };
 static int parser_goto_row71[] = {
        1,
-       -1, 74
+       -1, 75
 };
 static int parser_goto_row72[] = {
        2,
-       -1, 211,
-       214, 370
+       -1, 215,
+       218, 376
 };
 static int parser_goto_row73[] = {
        1,
-       -1, 212
+       -1, 216
 };
 static int parser_goto_row74[] = {
        2,
-       -1, 213,
-       214, 371
+       -1, 217,
+       218, 377
 };
 static int parser_goto_row75[] = {
-       13,
-       -1, 181,
-       144, 289,
-       754, 877,
-       798, 926,
-       838, 984,
-       1004, 1127,
-       1016, 1154,
-       1204, 926,
-       1275, 926,
-       1329, 1384,
-       1407, 1460,
-       1427, 926,
-       1515, 1544
+       14,
+       -1, 185,
+       147, 294,
+       767, 891,
+       812, 944,
+       854, 1003,
+       1021, 1144,
+       1032, 1168,
+       1080, 944,
+       1219, 944,
+       1284, 944,
+       1339, 1391,
+       1410, 1455,
+       1431, 944,
+       1497, 1518
 };
 static int parser_goto_row76[] = {
-       43,
-       -1, 471,
-       41, 182,
-       42, 183,
-       43, 184,
-       44, 185,
-       50, 191,
-       51, 192,
-       52, 193,
-       53, 194,
-       55, 195,
-       75, 216,
-       111, 244,
-       112, 245,
-       113, 246,
-       114, 247,
-       118, 253,
-       119, 254,
-       120, 255,
-       121, 256,
-       122, 257,
-       213, 369,
-       371, 507,
-       469, 599,
-       597, 704,
-       602, 707,
-       807, 940,
-       808, 941,
-       809, 942,
-       810, 943,
-       814, 949,
-       815, 950,
-       816, 951,
-       817, 952,
-       818, 953,
-       838, 985,
-       933, 1074,
-       1073, 1206,
-       1087, 1215,
-       1088, 1216,
-       1203, 1315,
-       1224, 1324,
-       1321, 1379,
-       1323, 1380
+       45,
+       -1, 479,
+       41, 186,
+       42, 187,
+       43, 188,
+       44, 189,
+       50, 195,
+       51, 196,
+       52, 197,
+       53, 198,
+       55, 199,
+       76, 220,
+       112, 248,
+       113, 249,
+       114, 250,
+       115, 251,
+       119, 257,
+       120, 258,
+       121, 259,
+       122, 260,
+       123, 261,
+       217, 375,
+       377, 516,
+       477, 611,
+       609, 717,
+       614, 720,
+       808, 924,
+       821, 958,
+       822, 959,
+       823, 960,
+       824, 961,
+       828, 967,
+       829, 968,
+       830, 969,
+       831, 970,
+       832, 971,
+       854, 1004,
+       951, 1091,
+       1090, 1221,
+       1104, 1230,
+       1105, 1231,
+       1218, 1325,
+       1239, 1334,
+       1331, 1386,
+       1333, 1387,
+       1381, 1426
 };
 static int parser_goto_row77[] = {
-       3,
-       -1, 592,
-       180, 337,
-       795, 909
+       1,
+       -1, 343
 };
 static int parser_goto_row78[] = {
-       4,
-       -1, 1440,
-       712, 833,
-       721, 845,
-       1432, 845
+       3,
+       -1, 849,
+       734, 859,
+       1401, 1443
 };
 static int parser_goto_row79[] = {
        3,
-       -1, 834,
-       467, 593,
-       694, 791
+       -1, 850,
+       475, 604,
+       706, 804
 };
 static int parser_goto_row80[] = {
-       3,
-       -1, 979,
-       846, 999,
-       1441, 1486
+       2,
+       -1, 605,
+       810, 927
 };
 static int parser_goto_row81[] = {
-       2,
-       -1, 980,
-       982, 1111
+       1,
+       -1, 925
 };
 static int parser_goto_row82[] = {
        2,
-       -1, 856,
-       860, 1023
+       -1, 714,
+       715, 811
 };
 static int parser_goto_row83[] = {
-       2,
-       -1, 700,
-       701, 796
+       3,
+       -1, 998,
+       860, 1016,
+       1444, 1478
 };
 static int parser_goto_row84[] = {
-       3,
-       -1, 927,
-       1275, 1348,
-       1427, 1472
+       2,
+       -1, 999,
+       1001, 1129
 };
 static int parser_goto_row85[] = {
-       3,
-       -1, 1071,
-       1072, 1205,
-       1282, 1205
+       2,
+       -1, 870,
+       874, 1039
 };
 static int parser_goto_row86[] = {
-       2,
-       -1, 928,
-       1204, 1316
+       4,
+       -1, 945,
+       1080, 1215,
+       1284, 1354,
+       1431, 1467
 };
 static int parser_goto_row87[] = {
        3,
-       -1, 597,
-       695, 792,
-       1242, 1329
+       -1, 1088,
+       1089, 1220,
+       1291, 1220
 };
 static int parser_goto_row88[] = {
-       33,
-       -1, 124,
-       77, 219,
-       106, 239,
-       127, 260,
-       170, 326,
-       217, 373,
-       258, 399,
-       324, 373,
-       390, 519,
-       432, 558,
-       498, 625,
-       501, 629,
-       543, 642,
-       546, 645,
-       579, 625,
-       581, 690,
-       668, 771,
-       696, 793,
-       743, 870,
-       769, 373,
-       802, 935,
-       821, 956,
-       930, 219,
-       954, 1086,
-       1045, 625,
-       1047, 1191,
-       1079, 1211,
-       1156, 1278,
-       1238, 1325,
-       1241, 1328,
-       1314, 629,
-       1377, 1424,
-       1413, 1463
+       2,
+       -1, 946,
+       1219, 1326
 };
 static int parser_goto_row89[] = {
-       22,
-       -1, 125,
-       77, 220,
-       217, 374,
-       221, 380,
-       223, 381,
-       382, 514,
-       498, 626,
-       501, 630,
-       631, 738,
-       632, 739,
-       650, 748,
-       668, 772,
-       740, 868,
-       769, 889,
-       773, 894,
-       778, 898,
-       899, 1056,
-       1045, 1189,
-       1047, 1192,
-       1193, 1307,
-       1194, 1308,
-       1309, 1372
+       4,
+       -1, 609,
+       707, 805,
+       711, 808,
+       1258, 1339
 };
 static int parser_goto_row90[] = {
-       9,
-       -1, 75,
-       71, 208,
-       137, 281,
-       168, 323,
-       250, 281,
-       301, 323,
-       666, 768,
-       925, 208,
-       1160, 1280
+       33,
+       -1, 125,
+       78, 223,
+       107, 243,
+       128, 264,
+       174, 332,
+       221, 379,
+       262, 405,
+       330, 379,
+       396, 528,
+       439, 568,
+       507, 637,
+       510, 641,
+       553, 654,
+       556, 657,
+       590, 637,
+       592, 702,
+       680, 784,
+       708, 806,
+       756, 884,
+       782, 379,
+       816, 953,
+       835, 974,
+       948, 223,
+       972, 1103,
+       1061, 637,
+       1063, 1205,
+       1096, 1226,
+       1170, 1287,
+       1254, 1335,
+       1257, 1338,
+       1324, 641,
+       1384, 1428,
+       1416, 1458
 };
 static int parser_goto_row91[] = {
-       4,
-       -1, 343,
-       251, 397,
-       387, 516,
-       513, 636
+       22,
+       -1, 126,
+       78, 224,
+       221, 380,
+       225, 386,
+       227, 387,
+       388, 523,
+       507, 638,
+       510, 642,
+       643, 751,
+       644, 752,
+       662, 761,
+       680, 785,
+       753, 882,
+       782, 903,
+       786, 908,
+       791, 912,
+       913, 1072,
+       1061, 1203,
+       1063, 1206,
+       1207, 1316,
+       1208, 1317,
+       1318, 1378
 };
 static int parser_goto_row92[] = {
-       2,
-       -1, 605,
-       606, 710
+       9,
+       -1, 76,
+       71, 212,
+       139, 286,
+       172, 329,
+       254, 286,
+       306, 329,
+       678, 781,
+       943, 212,
+       1174, 1289
 };
 static int parser_goto_row93[] = {
        4,
-       -1, 295,
-       427, 554,
-       760, 882,
-       1038, 1183
+       -1, 349,
+       255, 403,
+       393, 525,
+       522, 648
 };
 static int parser_goto_row94[] = {
        2,
-       -1, 609,
-       477, 612
+       -1, 617,
+       618, 723
 };
 static int parser_goto_row95[] = {
-       127,
-       -1, 169,
-       12, 76,
-       22, 76,
-       26, 126,
-       28, 76,
-       32, 76,
-       77, 126,
-       91, 76,
-       95, 76,
-       115, 249,
-       142, 76,
-       157, 302,
-       203, 76,
-       217, 126,
-       221, 126,
-       223, 126,
-       241, 126,
-       243, 126,
-       252, 126,
-       331, 76,
-       361, 76,
-       363, 500,
-       382, 126,
-       400, 126,
-       402, 126,
-       403, 126,
-       404, 126,
-       405, 126,
-       407, 126,
-       408, 126,
-       409, 126,
-       410, 126,
-       411, 126,
-       412, 126,
-       413, 126,
-       414, 126,
-       415, 126,
-       416, 126,
-       417, 126,
-       418, 126,
-       419, 545,
-       420, 76,
-       456, 580,
-       457, 76,
-       460, 76,
-       498, 126,
-       501, 126,
-       521, 640,
-       525, 126,
-       548, 76,
-       552, 667,
-       553, 76,
-       559, 687,
-       631, 126,
-       632, 126,
-       650, 126,
-       651, 667,
-       654, 76,
-       656, 667,
-       668, 126,
-       670, 76,
-       709, 820,
-       722, 76,
-       740, 126,
-       750, 76,
-       769, 126,
-       773, 126,
-       777, 76,
-       778, 126,
-       798, 929,
-       811, 945,
-       848, 76,
-       884, 667,
-       886, 1046,
-       899, 126,
-       937, 820,
-       939, 820,
-       948, 820,
-       1016, 1155,
-       1040, 667,
-       1042, 76,
-       1045, 126,
-       1047, 126,
-       1058, 76,
-       1089, 820,
-       1091, 820,
-       1092, 820,
-       1093, 820,
-       1094, 820,
-       1096, 820,
-       1097, 820,
-       1098, 820,
-       1099, 820,
-       1100, 820,
-       1101, 820,
-       1102, 820,
-       1103, 820,
-       1104, 820,
-       1105, 820,
-       1106, 820,
-       1107, 820,
-       1108, 1240,
-       1181, 667,
-       1182, 667,
-       1193, 126,
-       1194, 126,
-       1202, 500,
-       1204, 929,
-       1213, 1320,
-       1218, 820,
-       1275, 929,
-       1293, 126,
-       1309, 126,
-       1329, 1155,
-       1353, 1412,
-       1364, 667,
-       1395, 76,
-       1422, 76,
-       1427, 929,
-       1433, 76,
-       1438, 76,
-       1443, 76,
-       1465, 667,
-       1481, 76,
-       1485, 76,
-       1541, 820,
-       1568, 667
+       4,
+       -1, 300,
+       434, 564,
+       773, 896,
+       1054, 1197
 };
 static int parser_goto_row96[] = {
-       129,
-       -1, 170,
+       2,
+       -1, 621,
+       485, 624
+};
+static int parser_goto_row97[] = {
+       130,
+       -1, 173,
        12, 77,
        22, 77,
        26, 127,
        28, 77,
        32, 77,
-       77, 127,
-       91, 77,
-       95, 77,
-       115, 127,
-       142, 77,
-       203, 77,
-       217, 127,
+       78, 127,
+       92, 77,
+       96, 77,
+       116, 253,
+       145, 77,
+       160, 307,
+       207, 77,
        221, 127,
-       223, 127,
-       241, 127,
-       243, 127,
-       252, 127,
-       331, 77,
-       361, 77,
-       363, 501,
-       382, 127,
-       400, 127,
-       402, 127,
-       403, 127,
-       404, 127,
-       405, 127,
-       407, 127,
+       225, 127,
+       227, 127,
+       245, 127,
+       247, 127,
+       256, 127,
+       337, 77,
+       367, 77,
+       369, 509,
+       388, 127,
+       406, 127,
        408, 127,
        409, 127,
        410, 127,
        411, 127,
-       412, 127,
        413, 127,
        414, 127,
        415, 127,
        416, 127,
        417, 127,
        418, 127,
-       419, 546,
-       420, 77,
-       456, 581,
-       457, 77,
-       460, 77,
-       498, 127,
-       501, 127,
-       521, 546,
-       525, 127,
-       548, 77,
-       552, 668,
-       553, 77,
-       559, 581,
-       591, 696,
-       631, 127,
-       632, 127,
-       639, 743,
-       650, 127,
-       651, 668,
-       654, 77,
-       656, 668,
-       668, 127,
-       670, 77,
-       709, 821,
-       722, 77,
-       740, 127,
-       750, 77,
-       769, 127,
-       773, 127,
-       777, 77,
-       778, 127,
-       798, 930,
-       811, 821,
-       848, 77,
-       884, 668,
-       886, 1047,
-       899, 127,
-       937, 821,
-       939, 821,
-       948, 821,
-       1016, 1156,
-       1040, 668,
-       1042, 77,
-       1045, 127,
-       1047, 127,
+       419, 127,
+       420, 127,
+       421, 127,
+       422, 127,
+       423, 127,
+       424, 127,
+       425, 127,
+       426, 555,
+       427, 77,
+       464, 591,
+       465, 77,
+       468, 77,
+       507, 127,
+       510, 127,
+       530, 652,
+       534, 127,
+       558, 77,
+       562, 679,
+       563, 77,
+       569, 699,
+       643, 127,
+       644, 127,
+       662, 127,
+       663, 679,
+       666, 77,
+       668, 679,
+       680, 127,
+       682, 77,
+       722, 834,
+       735, 77,
+       753, 127,
+       763, 77,
+       782, 127,
+       786, 127,
+       790, 77,
+       791, 127,
+       812, 947,
+       825, 963,
+       862, 77,
+       898, 679,
+       900, 1062,
+       913, 127,
+       955, 834,
+       957, 834,
+       966, 834,
+       1032, 1169,
+       1056, 679,
        1058, 77,
-       1089, 821,
-       1091, 821,
-       1092, 821,
-       1093, 821,
-       1094, 821,
-       1096, 821,
-       1097, 821,
-       1098, 821,
-       1099, 821,
-       1100, 821,
-       1101, 821,
-       1102, 821,
-       1103, 821,
-       1104, 821,
-       1105, 821,
-       1106, 821,
-       1107, 821,
-       1108, 1241,
-       1181, 668,
-       1182, 668,
-       1193, 127,
-       1194, 127,
-       1202, 1314,
-       1204, 930,
-       1213, 1241,
-       1218, 821,
-       1275, 930,
-       1293, 127,
-       1309, 127,
-       1319, 1377,
-       1329, 1156,
-       1353, 1413,
-       1364, 668,
-       1395, 77,
-       1422, 77,
-       1427, 930,
-       1433, 77,
-       1438, 77,
-       1443, 77,
-       1465, 668,
-       1481, 77,
-       1485, 77,
-       1541, 821,
-       1568, 668
-};
-static int parser_goto_row97[] = {
-       1,
-       -1, 622
+       1061, 127,
+       1063, 127,
+       1074, 77,
+       1080, 947,
+       1106, 834,
+       1108, 834,
+       1109, 834,
+       1110, 834,
+       1111, 834,
+       1113, 834,
+       1114, 834,
+       1115, 834,
+       1116, 834,
+       1117, 834,
+       1118, 834,
+       1119, 834,
+       1120, 834,
+       1121, 834,
+       1122, 834,
+       1123, 834,
+       1124, 834,
+       1125, 834,
+       1126, 1256,
+       1195, 679,
+       1196, 679,
+       1207, 127,
+       1208, 127,
+       1217, 509,
+       1219, 947,
+       1228, 1330,
+       1233, 834,
+       1284, 947,
+       1302, 127,
+       1318, 127,
+       1339, 1169,
+       1359, 1415,
+       1370, 679,
+       1402, 77,
+       1425, 77,
+       1431, 947,
+       1436, 77,
+       1441, 77,
+       1446, 77,
+       1460, 679,
+       1473, 77,
+       1477, 77,
+       1515, 834,
+       1531, 679
 };
 static int parser_goto_row98[] = {
-       10,
-       -1, 78,
-       80, 225,
-       138, 225,
-       503, 225,
-       610, 225,
-       624, 225,
-       680, 225,
-       698, 225,
-       832, 225,
-       1049, 225
+       132,
+       -1, 174,
+       12, 78,
+       22, 78,
+       26, 128,
+       28, 78,
+       32, 78,
+       78, 128,
+       92, 78,
+       96, 78,
+       116, 128,
+       145, 78,
+       207, 78,
+       221, 128,
+       225, 128,
+       227, 128,
+       245, 128,
+       247, 128,
+       256, 128,
+       337, 78,
+       367, 78,
+       369, 510,
+       388, 128,
+       406, 128,
+       408, 128,
+       409, 128,
+       410, 128,
+       411, 128,
+       413, 128,
+       414, 128,
+       415, 128,
+       416, 128,
+       417, 128,
+       418, 128,
+       419, 128,
+       420, 128,
+       421, 128,
+       422, 128,
+       423, 128,
+       424, 128,
+       425, 128,
+       426, 556,
+       427, 78,
+       464, 592,
+       465, 78,
+       468, 78,
+       507, 128,
+       510, 128,
+       530, 556,
+       534, 128,
+       558, 78,
+       562, 680,
+       563, 78,
+       569, 592,
+       602, 708,
+       643, 128,
+       644, 128,
+       651, 756,
+       662, 128,
+       663, 680,
+       666, 78,
+       668, 680,
+       680, 128,
+       682, 78,
+       722, 835,
+       735, 78,
+       753, 128,
+       763, 78,
+       782, 128,
+       786, 128,
+       790, 78,
+       791, 128,
+       812, 948,
+       825, 835,
+       862, 78,
+       898, 680,
+       900, 1063,
+       913, 128,
+       955, 835,
+       957, 835,
+       966, 835,
+       1032, 1170,
+       1056, 680,
+       1058, 78,
+       1061, 128,
+       1063, 128,
+       1074, 78,
+       1080, 948,
+       1106, 835,
+       1108, 835,
+       1109, 835,
+       1110, 835,
+       1111, 835,
+       1113, 835,
+       1114, 835,
+       1115, 835,
+       1116, 835,
+       1117, 835,
+       1118, 835,
+       1119, 835,
+       1120, 835,
+       1121, 835,
+       1122, 835,
+       1123, 835,
+       1124, 835,
+       1125, 835,
+       1126, 1257,
+       1195, 680,
+       1196, 680,
+       1207, 128,
+       1208, 128,
+       1217, 1324,
+       1219, 948,
+       1228, 1257,
+       1233, 835,
+       1284, 948,
+       1302, 128,
+       1318, 128,
+       1329, 1384,
+       1339, 1170,
+       1359, 1416,
+       1370, 680,
+       1402, 78,
+       1425, 78,
+       1431, 948,
+       1436, 78,
+       1441, 78,
+       1446, 78,
+       1460, 680,
+       1473, 78,
+       1477, 78,
+       1515, 835,
+       1531, 680
 };
 static int parser_goto_row99[] = {
-       54,
-       -1, 128,
-       12, 79,
-       22, 79,
-       28, 79,
-       32, 79,
-       80, 226,
-       91, 79,
-       95, 79,
-       138, 282,
-       142, 79,
-       203, 79,
-       331, 79,
-       361, 79,
-       363, 502,
-       420, 79,
-       457, 79,
-       460, 79,
-       497, 623,
-       503, 633,
-       548, 79,
-       552, 669,
-       553, 79,
-       591, 697,
-       624, 731,
-       639, 697,
-       651, 669,
-       654, 79,
-       656, 669,
-       670, 79,
-       680, 779,
-       698, 794,
-       722, 79,
-       750, 79,
-       777, 79,
-       848, 79,
-       884, 669,
-       886, 1048,
-       1040, 669,
-       1042, 79,
-       1049, 1195,
-       1058, 79,
-       1181, 669,
-       1182, 669,
-       1319, 697,
-       1364, 669,
-       1395, 79,
-       1422, 79,
-       1433, 79,
-       1438, 79,
-       1443, 79,
-       1465, 669,
-       1481, 79,
-       1485, 79,
-       1568, 669
+       1,
+       -1, 634
 };
 static int parser_goto_row100[] = {
-       8,
-       -1, 1001,
-       1002, 1125,
-       1442, 1487,
-       1480, 1520,
-       1484, 1523,
-       1488, 1525,
-       1521, 1550,
-       1524, 1551
+       10,
+       -1, 79,
+       81, 229,
+       141, 229,
+       512, 229,
+       622, 229,
+       636, 229,
+       692, 229,
+       710, 229,
+       848, 229,
+       1065, 229
 };
 static int parser_goto_row101[] = {
-       19,
-       -1, 1441,
-       15, 84,
-       611, 715,
-       712, 835,
-       713, 836,
-       716, 837,
-       721, 846,
-       854, 1006,
-       1016, 1157,
-       1154, 1276,
-       1161, 1281,
-       1329, 1385,
-       1384, 1428,
-       1386, 1429,
-       1407, 1461,
-       1432, 846,
-       1460, 1503,
-       1515, 1545,
-       1544, 1562
+       54,
+       -1, 129,
+       12, 80,
+       22, 80,
+       28, 80,
+       32, 80,
+       81, 230,
+       92, 80,
+       96, 80,
+       141, 287,
+       145, 80,
+       207, 80,
+       337, 80,
+       367, 80,
+       369, 511,
+       427, 80,
+       465, 80,
+       468, 80,
+       506, 635,
+       512, 645,
+       558, 80,
+       562, 681,
+       563, 80,
+       602, 709,
+       636, 744,
+       651, 709,
+       663, 681,
+       666, 80,
+       668, 681,
+       682, 80,
+       692, 792,
+       710, 807,
+       735, 80,
+       763, 80,
+       790, 80,
+       862, 80,
+       898, 681,
+       900, 1064,
+       1056, 681,
+       1058, 80,
+       1065, 1209,
+       1074, 80,
+       1195, 681,
+       1196, 681,
+       1329, 709,
+       1370, 681,
+       1402, 80,
+       1425, 80,
+       1436, 80,
+       1441, 80,
+       1446, 80,
+       1460, 681,
+       1473, 80,
+       1477, 80,
+       1531, 681
 };
 static int parser_goto_row102[] = {
+       8,
+       -1, 1018,
+       1019, 1142,
+       1445, 1479,
+       1472, 1501,
+       1476, 1504,
+       1480, 1506,
+       1502, 1523,
+       1505, 1524
+};
+static int parser_goto_row103[] = {
+       18,
+       -1, 85,
+       623, 728,
+       725, 851,
+       726, 852,
+       729, 853,
+       734, 860,
+       868, 1023,
+       1032, 1171,
+       1168, 1285,
+       1175, 1290,
+       1339, 1392,
+       1391, 1432,
+       1393, 1433,
+       1401, 1444,
+       1410, 1456,
+       1455, 1485,
+       1497, 1519,
+       1518, 1529
+};
+static int parser_goto_row104[] = {
        50,
-       -1, 145,
+       -1, 148,
        0, 11,
        4, 11,
        16, 11,
@@ -18179,539 +17832,536 @@ static int parser_goto_row102[] = {
        23, 11,
        24, 11,
        25, 11,
-       28, 142,
-       32, 142,
-       62, 203,
-       87, 11,
+       28, 145,
+       32, 145,
+       62, 207,
        88, 11,
-       92, 11,
-       101, 11,
+       89, 11,
+       93, 11,
        102, 11,
-       104, 11,
-       204, 361,
-       229, 11,
-       235, 11,
-       285, 420,
-       331, 460,
-       421, 548,
-       457, 460,
-       552, 670,
-       553, 142,
-       651, 750,
-       654, 460,
-       656, 750,
-       722, 460,
-       775, 203,
-       777, 460,
-       848, 460,
-       884, 1042,
-       896, 361,
-       1040, 1042,
-       1058, 142,
-       1181, 670,
-       1182, 750,
-       1364, 1042,
-       1395, 460,
-       1422, 142,
-       1433, 460,
-       1438, 460,
-       1443, 460,
-       1465, 750,
-       1481, 460,
-       1485, 460,
-       1568, 750
+       103, 11,
+       105, 11,
+       208, 367,
+       233, 11,
+       239, 11,
+       290, 427,
+       337, 468,
+       428, 558,
+       465, 468,
+       562, 682,
+       563, 145,
+       663, 763,
+       666, 468,
+       668, 763,
+       735, 468,
+       788, 207,
+       790, 468,
+       862, 468,
+       898, 1058,
+       910, 367,
+       1056, 1058,
+       1074, 145,
+       1195, 682,
+       1196, 763,
+       1370, 1058,
+       1402, 468,
+       1425, 145,
+       1436, 468,
+       1441, 468,
+       1446, 468,
+       1460, 763,
+       1473, 468,
+       1477, 468,
+       1531, 763
 };
-static int parser_goto_row103[] = {
+static int parser_goto_row105[] = {
        263,
-       -1, 95,
+       -1, 96,
        0, 12,
        4, 22,
        16, 22,
-       17, 91,
+       17, 92,
        23, 22,
-       24, 91,
-       30, 146,
-       31, 147,
-       33, 150,
-       34, 151,
-       40, 179,
-       46, 187,
-       47, 188,
-       74, 215,
-       87, 91,
-       101, 91,
-       107, 240,
-       108, 241,
-       109, 242,
-       110, 243,
-       116, 251,
-       117, 252,
-       153, 297,
-       154, 298,
-       155, 299,
-       156, 300,
-       158, 303,
-       189, 344,
-       190, 345,
-       196, 346,
-       197, 347,
-       198, 348,
-       199, 349,
-       205, 362,
-       207, 363,
-       212, 368,
-       238, 387,
-       248, 392,
-       261, 400,
-       262, 402,
-       263, 403,
-       264, 404,
-       265, 405,
-       266, 406,
-       267, 407,
-       268, 408,
-       269, 409,
-       270, 410,
-       271, 411,
-       272, 412,
-       273, 413,
-       274, 414,
-       275, 415,
-       276, 416,
-       277, 417,
-       278, 418,
-       280, 419,
-       287, 422,
-       290, 425,
-       291, 426,
-       293, 427,
-       295, 428,
-       296, 429,
-       304, 437,
-       305, 439,
-       306, 440,
-       307, 441,
-       308, 442,
-       309, 443,
-       310, 444,
-       311, 445,
-       312, 446,
-       313, 447,
-       314, 448,
-       315, 449,
-       316, 450,
-       317, 451,
-       318, 452,
-       319, 453,
-       320, 454,
-       321, 455,
-       322, 456,
-       335, 467,
-       341, 473,
-       342, 474,
-       350, 476,
-       351, 477,
-       358, 497,
-       372, 508,
-       379, 513,
-       388, 517,
-       394, 521,
-       396, 522,
-       401, 525,
-       423, 550,
-       430, 557,
-       434, 559,
-       438, 561,
-       462, 587,
-       466, 591,
-       470, 600,
-       495, 619,
-       499, 627,
-       506, 634,
-       518, 639,
-       544, 643,
-       551, 648,
-       554, 683,
-       555, 684,
-       556, 685,
-       585, 691,
-       588, 694,
-       593, 702,
-       598, 705,
-       603, 708,
-       604, 709,
-       607, 711,
-       615, 718,
-       616, 719,
-       618, 726,
-       638, 742,
-       653, 755,
-       655, 757,
-       657, 760,
-       686, 784,
-       693, 790,
-       699, 795,
-       703, 798,
-       706, 800,
-       720, 842,
-       727, 851,
-       728, 857,
-       732, 862,
-       733, 863,
-       745, 871,
-       746, 872,
-       767, 886,
-       781, 900,
-       782, 901,
-       786, 903,
-       787, 904,
-       791, 907,
-       799, 932,
-       801, 934,
-       803, 936,
-       804, 937,
-       805, 938,
-       806, 939,
-       812, 947,
-       813, 948,
-       822, 957,
-       835, 981,
-       840, 989,
-       846, 981,
-       855, 1007,
-       858, 1018,
-       859, 1021,
-       860, 1024,
-       869, 1030,
-       878, 1036,
-       879, 1037,
-       881, 1038,
-       882, 1039,
-       902, 1059,
-       927, 1069,
-       944, 1081,
-       958, 1089,
-       959, 1091,
-       960, 1092,
-       961, 1093,
-       962, 1094,
-       963, 1095,
-       964, 1096,
-       965, 1097,
-       966, 1098,
-       967, 1099,
-       968, 1100,
-       969, 1101,
-       970, 1102,
-       971, 1103,
-       972, 1104,
-       973, 1105,
-       974, 1106,
-       975, 1107,
+       24, 92,
+       30, 149,
+       31, 150,
+       33, 153,
+       34, 154,
+       40, 183,
+       46, 191,
+       47, 192,
+       75, 219,
+       88, 92,
+       102, 92,
+       108, 244,
+       109, 245,
+       110, 246,
+       111, 247,
+       117, 255,
+       118, 256,
+       156, 302,
+       157, 303,
+       158, 304,
+       159, 305,
+       161, 308,
+       193, 350,
+       194, 351,
+       200, 352,
+       201, 353,
+       202, 354,
+       203, 355,
+       209, 368,
+       211, 369,
+       216, 374,
+       242, 393,
+       252, 398,
+       265, 406,
+       266, 408,
+       267, 409,
+       268, 410,
+       269, 411,
+       270, 412,
+       271, 413,
+       272, 414,
+       273, 415,
+       274, 416,
+       275, 417,
+       276, 418,
+       277, 419,
+       278, 420,
+       279, 421,
+       280, 422,
+       281, 423,
+       282, 424,
+       283, 425,
+       285, 426,
+       292, 429,
+       295, 432,
+       296, 433,
+       298, 434,
+       300, 435,
+       301, 436,
+       309, 444,
+       310, 446,
+       311, 447,
+       312, 448,
+       313, 449,
+       314, 450,
+       315, 451,
+       316, 452,
+       317, 453,
+       318, 454,
+       319, 455,
+       320, 456,
+       321, 457,
+       322, 458,
+       323, 459,
+       324, 460,
+       325, 461,
+       326, 462,
+       327, 463,
+       328, 464,
+       341, 475,
+       347, 481,
+       348, 482,
+       356, 484,
+       357, 485,
+       364, 506,
+       378, 517,
+       385, 522,
+       394, 526,
+       400, 530,
+       402, 531,
+       407, 534,
+       430, 560,
+       437, 567,
+       441, 569,
+       445, 571,
+       470, 598,
+       474, 602,
+       478, 612,
+       504, 631,
+       508, 639,
+       515, 646,
+       527, 651,
+       554, 655,
+       561, 660,
+       564, 695,
+       565, 696,
+       566, 697,
+       596, 703,
+       599, 706,
+       604, 712,
+       610, 718,
+       615, 721,
+       616, 722,
+       619, 724,
+       627, 731,
+       628, 732,
+       630, 739,
+       650, 755,
+       665, 768,
+       667, 770,
+       669, 773,
+       698, 797,
+       705, 803,
+       713, 810,
+       716, 812,
+       719, 814,
+       733, 858,
+       740, 865,
+       741, 871,
+       745, 876,
+       746, 877,
+       758, 885,
+       759, 886,
+       780, 900,
+       794, 914,
+       795, 915,
+       799, 917,
+       800, 918,
+       804, 921,
+       813, 950,
+       815, 952,
+       817, 954,
+       818, 955,
+       819, 956,
+       820, 957,
+       826, 965,
+       827, 966,
+       836, 975,
+       851, 1000,
+       856, 1008,
+       860, 1000,
+       869, 1024,
+       872, 1034,
+       873, 1037,
+       874, 1040,
+       883, 1046,
+       892, 1052,
+       893, 1053,
+       895, 1054,
+       896, 1055,
+       916, 1075,
+       923, 1080,
+       945, 1086,
+       962, 1098,
+       976, 1106,
        977, 1108,
-       982, 981,
-       986, 1115,
-       987, 1116,
-       990, 1118,
-       1005, 1130,
-       1008, 1133,
-       1009, 1135,
-       1011, 1136,
-       1019, 1165,
-       1022, 1167,
-       1025, 1171,
-       1026, 1173,
-       1028, 1174,
-       1029, 1175,
-       1032, 1177,
-       1033, 1178,
-       1034, 1179,
-       1057, 1196,
-       1068, 1202,
-       1070, 1204,
-       1075, 1207,
-       1083, 1213,
-       1084, 1214,
-       1090, 1218,
-       1114, 1244,
-       1119, 1246,
-       1128, 1253,
-       1131, 1256,
-       1134, 1258,
-       1146, 1275,
-       1168, 1285,
-       1169, 1287,
-       1172, 1289,
-       1176, 1293,
-       1180, 1297,
-       1183, 1301,
-       1184, 1302,
-       1199, 1312,
-       1210, 1319,
-       1239, 1326,
-       1248, 1331,
-       1263, 619,
-       1267, 619,
-       1279, 1353,
-       1286, 1357,
-       1291, 1360,
-       1294, 1362,
-       1310, 1373,
-       1317, 1376,
-       1336, 619,
-       1338, 619,
-       1342, 619,
-       1366, 1420,
-       1367, 1421,
-       1381, 1425,
-       1382, 1426,
-       1383, 1427,
-       1387, 1430,
-       1389, 1431,
-       1423, 1468,
-       1441, 981,
-       1444, 1489,
-       1448, 1493,
-       1464, 1508,
-       1470, 1513,
-       1471, 1514,
-       1474, 1516,
-       1475, 1517,
-       1476, 1518,
-       1491, 1527,
-       1500, 1532,
-       1502, 1534,
-       1512, 1541,
-       1533, 1557,
-       1539, 1559,
-       1542, 1561,
-       1546, 1563
+       978, 1109,
+       979, 1110,
+       980, 1111,
+       981, 1112,
+       982, 1113,
+       983, 1114,
+       984, 1115,
+       985, 1116,
+       986, 1117,
+       987, 1118,
+       988, 1119,
+       989, 1120,
+       990, 1121,
+       991, 1122,
+       992, 1123,
+       993, 1124,
+       994, 1125,
+       996, 1126,
+       1001, 1000,
+       1005, 1133,
+       1006, 1134,
+       1009, 1136,
+       1022, 1147,
+       1025, 1150,
+       1026, 1152,
+       1029, 1153,
+       1035, 1179,
+       1038, 1181,
+       1041, 1185,
+       1042, 1187,
+       1044, 1188,
+       1045, 1189,
+       1048, 1191,
+       1049, 1192,
+       1050, 1193,
+       1073, 1210,
+       1085, 1217,
+       1087, 1219,
+       1092, 1222,
+       1100, 1228,
+       1101, 1229,
+       1107, 1233,
+       1132, 1260,
+       1137, 1262,
+       1145, 1267,
+       1148, 1270,
+       1151, 1272,
+       1160, 1284,
+       1182, 1294,
+       1183, 1296,
+       1186, 1298,
+       1190, 1302,
+       1194, 1306,
+       1197, 1310,
+       1198, 1311,
+       1213, 1321,
+       1215, 1322,
+       1225, 1329,
+       1255, 1336,
+       1264, 1341,
+       1277, 631,
+       1279, 631,
+       1288, 1359,
+       1295, 1363,
+       1300, 1366,
+       1303, 1368,
+       1319, 1379,
+       1327, 1383,
+       1346, 631,
+       1348, 631,
+       1351, 631,
+       1372, 1423,
+       1373, 1424,
+       1388, 1429,
+       1389, 1430,
+       1390, 1431,
+       1394, 1434,
+       1396, 1435,
+       1427, 1463,
+       1444, 1000,
+       1447, 1481,
+       1459, 1490,
+       1465, 1495,
+       1466, 1496,
+       1469, 1498,
+       1470, 1499,
+       1471, 1500,
+       1494, 1515,
+       1513, 1526,
+       1516, 1528,
+       1520, 1530
 };
-static int parser_goto_row104[] = {
+static int parser_goto_row106[] = {
        1,
        -1, 13
 };
-static int parser_goto_row105[] = {
+static int parser_goto_row107[] = {
        1,
        -1, 14
 };
-static int parser_goto_row106[] = {
-       1,
-       -1, 15
-};
-static int parser_goto_row107[] = {
-       2,
-       -1, 725,
-       1391, 1436
-};
 static int parser_goto_row108[] = {
        1,
-       -1, 1225
+       -1, 15
 };
 static int parser_goto_row109[] = {
-       1,
-       -1, -1
+       4,
+       -1, 738,
+       1352, 1408,
+       1398, 1439,
+       1405, 1451
 };
 static int parser_goto_row110[] = {
-       2,
-       -1, 822,
-       1541, 1560
+       1,
+       -1, 1240
 };
 static int parser_goto_row111[] = {
        1,
-       -1, 823
+       -1, -1
 };
 static int parser_goto_row112[] = {
-       6,
-       -1, 824,
-       937, 1076,
-       1089, 1217,
-       1091, 1219,
-       1092, 1220,
-       1218, 1322
+       2,
+       -1, 836,
+       1515, 1527
 };
 static int parser_goto_row113[] = {
        1,
-       -1, 825
+       -1, 837
 };
 static int parser_goto_row114[] = {
-       10,
-       -1, 826,
-       1093, 1221,
-       1094, 1222,
-       1098, 1228,
-       1099, 1229,
-       1100, 1230,
-       1101, 1231,
-       1102, 1232,
-       1103, 1233,
-       1104, 1234
+       6,
+       -1, 838,
+       955, 1093,
+       1106, 1232,
+       1108, 1234,
+       1109, 1235,
+       1233, 1332
 };
 static int parser_goto_row115[] = {
-       3,
-       -1, 827,
-       1096, 1226,
-       1097, 1227
+       1,
+       -1, 839
 };
 static int parser_goto_row116[] = {
-       6,
-       -1, 828,
-       939, 1080,
-       948, 1085,
-       1105, 1235,
-       1106, 1236,
-       1107, 1237
+       10,
+       -1, 840,
+       1110, 1236,
+       1111, 1237,
+       1115, 1243,
+       1116, 1244,
+       1117, 1245,
+       1118, 1246,
+       1119, 1247,
+       1120, 1248,
+       1121, 1249
 };
 static int parser_goto_row117[] = {
-       1,
-       -1, 829
+       3,
+       -1, 841,
+       1113, 1241,
+       1114, 1242
 };
 static int parser_goto_row118[] = {
-       2,
-       -1, 830,
-       811, 946
+       5,
+       -1, 842,
+       1122, 1250,
+       1123, 1251,
+       1124, 1252,
+       1125, 1253
 };
 static int parser_goto_row119[] = {
-       4,
-       -1, 334,
-       242, 390,
-       299, 432,
-       392, 520
+       3,
+       -1, 843,
+       957, 1097,
+       966, 1102
 };
 static int parser_goto_row120[] = {
        1,
-       -1, -1
+       -1, 844
 };
 static int parser_goto_row121[] = {
-       1,
-       -1, 1158
+       2,
+       -1, 845,
+       825, 964
 };
 static int parser_goto_row122[] = {
        1,
-       -1, -1
+       -1, 846
 };
 static int parser_goto_row123[] = {
        4,
-       -1, 129,
-       1016, 1159,
-       1293, 1361,
-       1329, 1159
+       -1, 340,
+       246, 396,
+       304, 439,
+       398, 529
 };
 static int parser_goto_row124[] = {
        1,
-       -1, 130
+       -1, -1
 };
 static int parser_goto_row125[] = {
-       6,
-       -1, 131,
-       241, 389,
-       400, 524,
-       402, 526,
-       403, 527,
-       525, 641
+       1,
+       -1, 1172
 };
 static int parser_goto_row126[] = {
        1,
-       -1, 132
+       -1, -1
 };
 static int parser_goto_row127[] = {
-       10,
-       -1, 133,
-       404, 528,
-       405, 529,
-       409, 533,
-       410, 534,
-       411, 535,
-       412, 536,
-       413, 537,
-       414, 538,
-       415, 539
+       4,
+       -1, 130,
+       1032, 1173,
+       1302, 1367,
+       1339, 1173
 };
 static int parser_goto_row128[] = {
-       3,
-       -1, 134,
-       407, 531,
-       408, 532
+       1,
+       -1, 131
 };
 static int parser_goto_row129[] = {
        6,
-       -1, 135,
-       243, 391,
-       252, 398,
-       416, 540,
-       417, 541,
-       418, 542
+       -1, 132,
+       245, 395,
+       406, 533,
+       408, 535,
+       409, 536,
+       534, 653
 };
 static int parser_goto_row130[] = {
        1,
-       -1, 136
+       -1, 133
 };
 static int parser_goto_row131[] = {
-       4,
-       -1, 137,
-       115, 250,
-       1016, 1160,
-       1329, 1160
+       10,
+       -1, 134,
+       410, 537,
+       411, 538,
+       415, 542,
+       416, 543,
+       417, 544,
+       418, 545,
+       419, 546,
+       420, 547,
+       421, 548
 };
 static int parser_goto_row132[] = {
-       1,
-       -1, 464
+       3,
+       -1, 135,
+       413, 540,
+       414, 541
 };
 static int parser_goto_row133[] = {
-       7,
-       -1, 465,
-       461, 586,
-       792, 908,
-       906, 1062,
-       1060, 1200,
-       1078, 1209,
-       1208, 1318
+       5,
+       -1, 136,
+       422, 549,
+       423, 550,
+       424, 551,
+       425, 552
 };
 static int parser_goto_row134[] = {
-       1,
-       -1, 590
+       3,
+       -1, 137,
+       247, 397,
+       256, 404
 };
 static int parser_goto_row135[] = {
-       2,
-       -1, 1161,
-       1329, 1386
+       1,
+       -1, 138
 };
 static int parser_goto_row136[] = {
-       1,
-       -1, 1162
+       4,
+       -1, 139,
+       116, 254,
+       1032, 1174,
+       1339, 1174
 };
 static int parser_goto_row137[] = {
        2,
-       -1, 1079,
-       1081, 1212
+       -1, 140,
+       808, 926
 };
 static int parser_goto_row138[] = {
        1,
-       -1, -1
+       -1, 472
 };
 static int parser_goto_row139[] = {
-       1,
-       -1, -1
+       7,
+       -1, 473,
+       469, 597,
+       805, 922,
+       920, 1078,
+       1076, 1214,
+       1095, 1224,
+       1223, 1328
 };
 static int parser_goto_row140[] = {
        1,
-       -1, -1
+       -1, 601
 };
 static int parser_goto_row141[] = {
        1,
        -1, -1
 };
 static int parser_goto_row142[] = {
-       1,
-       -1, -1
+       2,
+       -1, 1175,
+       1339, 1393
 };
 static int parser_goto_row143[] = {
        1,
-       -1, -1
+       -1, 1176
 };
 static int parser_goto_row144[] = {
-       1,
-       -1, -1
+       2,
+       -1, 1096,
+       1098, 1227
 };
 static int parser_goto_row145[] = {
        1,
@@ -18730,119 +18380,110 @@ static int parser_goto_row148[] = {
        -1, -1
 };
 static int parser_goto_row149[] = {
-       8,
-       -1, 751,
-       656, 758,
-       884, 1043,
-       1040, 1185,
-       1182, 1299,
-       1364, 1419,
-       1465, 1509,
-       1568, 1571
+       1,
+       -1, -1
 };
 static int parser_goto_row150[] = {
-       3,
-       -1, 752,
-       552, 671,
-       1181, 1298
+       1,
+       -1, -1
 };
 static int parser_goto_row151[] = {
        1,
-       -1, 672
+       -1, -1
 };
 static int parser_goto_row152[] = {
        1,
-       -1, 673
+       -1, -1
 };
 static int parser_goto_row153[] = {
        1,
-       -1, 674
+       -1, -1
 };
 static int parser_goto_row154[] = {
        1,
-       -1, 675
+       -1, -1
 };
 static int parser_goto_row155[] = {
        1,
-       -1, 676
+       -1, -1
 };
 static int parser_goto_row156[] = {
        1,
-       -1, 677
+       -1, -1
 };
 static int parser_goto_row157[] = {
        1,
-       -1, 678
+       -1, -1
 };
 static int parser_goto_row158[] = {
-       1,
-       -1, 679
+       8,
+       -1, 764,
+       668, 771,
+       898, 1059,
+       1056, 1199,
+       1196, 1308,
+       1370, 1422,
+       1460, 1491,
+       1531, 1534
 };
 static int parser_goto_row159[] = {
-       18,
-       -1, 178,
-       175, 330,
-       658, 761,
-       662, 765,
-       764, 883,
-       887, 1050,
-       888, 1051,
-       890, 1052,
-       891, 1053,
-       892, 1054,
-       893, 1055,
-       1044, 1188,
-       1179, 1296,
-       1297, 1363,
-       1303, 1368,
-       1304, 1369,
-       1305, 1370,
-       1306, 1371
+       3,
+       -1, 765,
+       562, 683,
+       1195, 1307
 };
 static int parser_goto_row160[] = {
        1,
-       -1, -1
+       -1, 684
 };
 static int parser_goto_row161[] = {
        1,
-       -1, -1
+       -1, 685
 };
 static int parser_goto_row162[] = {
        1,
-       -1, -1
+       -1, 686
 };
 static int parser_goto_row163[] = {
        1,
-       -1, -1
+       -1, 687
 };
 static int parser_goto_row164[] = {
        1,
-       -1, -1
+       -1, 688
 };
 static int parser_goto_row165[] = {
-       10,
-       -1, 143,
-       32, 149,
-       553, 682,
-       651, 753,
-       656, 759,
-       1058, 1198,
-       1182, 1300,
-       1422, 1467,
-       1465, 1510,
-       1568, 1572
+       1,
+       -1, 689
 };
 static int parser_goto_row166[] = {
        1,
-       -1, -1
+       -1, 690
 };
 static int parser_goto_row167[] = {
        1,
-       -1, 931
+       -1, 691
 };
 static int parser_goto_row168[] = {
-       1,
-       -1, 1163
+       18,
+       -1, 182,
+       179, 336,
+       670, 774,
+       674, 778,
+       777, 897,
+       901, 1066,
+       902, 1067,
+       904, 1068,
+       905, 1069,
+       906, 1070,
+       907, 1071,
+       1060, 1202,
+       1193, 1305,
+       1306, 1369,
+       1312, 1374,
+       1313, 1375,
+       1314, 1376,
+       1315, 1377
 };
 static int parser_goto_row169[] = {
        1,
@@ -18854,159 +18495,204 @@ static int parser_goto_row170[] = {
 };
 static int parser_goto_row171[] = {
        1,
-       -1, 1016
+       -1, -1
 };
 static int parser_goto_row172[] = {
-       2,
-       -1, 16,
-       4, 23
+       1,
+       -1, -1
 };
 static int parser_goto_row173[] = {
-       4,
-       -1, 17,
-       4, 24,
-       16, 87,
-       23, 101
+       1,
+       -1, -1
 };
 static int parser_goto_row174[] = {
-       8,
-       -1, 18,
-       4, 25,
-       16, 88,
-       17, 92,
-       23, 102,
-       24, 104,
-       87, 229,
-       101, 235
+       10,
+       -1, 146,
+       32, 152,
+       563, 694,
+       663, 766,
+       668, 772,
+       1074, 1212,
+       1196, 1309,
+       1425, 1462,
+       1460, 1492,
+       1531, 1535
 };
 static int parser_goto_row175[] = {
-       4,
-       -1, 858,
-       855, 1008,
-       860, 1025,
-       1022, 1168
+       1,
+       -1, -1
 };
 static int parser_goto_row176[] = {
-       8,
-       -1, 859,
-       855, 1009,
-       858, 1019,
-       860, 1026,
-       1008, 1134,
-       1022, 1169,
-       1025, 1172,
-       1168, 1286
+       1,
+       -1, 949
 };
 static int parser_goto_row177[] = {
        1,
-       -1, 1131
+       -1, 1177
 };
 static int parser_goto_row178[] = {
        1,
-       -1, 990
+       -1, -1
 };
 static int parser_goto_row179[] = {
        1,
-       -1, 1121
+       -1, -1
 };
 static int parser_goto_row180[] = {
        1,
-       -1, 789
+       -1, 1032
 };
 static int parser_goto_row181[] = {
-       3,
-       -1, 204,
-       285, 421,
-       775, 896
+       2,
+       -1, 16,
+       4, 23
 };
 static int parser_goto_row182[] = {
-       1,
-       -1, 214
+       4,
+       -1, 17,
+       4, 24,
+       16, 88,
+       23, 102
 };
 static int parser_goto_row183[] = {
-       1,
-       -1, 701
+       8,
+       -1, 18,
+       4, 25,
+       16, 89,
+       17, 93,
+       23, 103,
+       24, 105,
+       88, 233,
+       102, 239
 };
 static int parser_goto_row184[] = {
-       1,
-       -1, 982
+       4,
+       -1, 872,
+       869, 1025,
+       874, 1041,
+       1038, 1182
 };
 static int parser_goto_row185[] = {
-       1,
-       -1, 860
+       8,
+       -1, 873,
+       869, 1026,
+       872, 1035,
+       874, 1042,
+       1025, 1151,
+       1038, 1183,
+       1041, 1186,
+       1182, 1295
 };
 static int parser_goto_row186[] = {
-       2,
-       -1, 1072,
-       1162, 1282
+       1,
+       -1, 1148
 };
 static int parser_goto_row187[] = {
        1,
-       -1, 606
+       -1, 1009
 };
 static int parser_goto_row188[] = {
-       50,
-       -1, 138,
-       12, 80,
-       22, 80,
-       28, 80,
-       32, 80,
-       91, 80,
-       95, 80,
-       142, 80,
-       203, 80,
-       331, 80,
-       361, 80,
-       363, 503,
-       420, 80,
-       457, 80,
-       460, 80,
-       476, 610,
-       477, 610,
-       497, 624,
-       548, 80,
-       552, 680,
-       553, 80,
-       591, 698,
-       639, 698,
-       651, 680,
-       654, 80,
-       656, 680,
-       670, 80,
-       711, 832,
-       722, 80,
-       750, 80,
-       777, 80,
-       848, 80,
-       884, 680,
-       886, 1049,
-       1040, 680,
-       1042, 80,
-       1058, 80,
-       1181, 680,
-       1182, 680,
-       1319, 698,
-       1364, 680,
-       1395, 80,
-       1422, 80,
-       1433, 80,
-       1438, 80,
-       1443, 80,
-       1465, 680,
-       1481, 80,
-       1485, 80,
-       1568, 680
+       1,
+       -1, 1139
 };
 static int parser_goto_row189[] = {
+       1,
+       -1, 802
+};
+static int parser_goto_row190[] = {
+       3,
+       -1, 208,
+       290, 428,
+       788, 910
+};
+static int parser_goto_row191[] = {
+       1,
+       -1, 218
+};
+static int parser_goto_row192[] = {
+       1,
+       -1, 715
+};
+static int parser_goto_row193[] = {
+       1,
+       -1, 1001
+};
+static int parser_goto_row194[] = {
+       1,
+       -1, 874
+};
+static int parser_goto_row195[] = {
+       2,
+       -1, 1089,
+       1176, 1291
+};
+static int parser_goto_row196[] = {
+       1,
+       -1, 618
+};
+static int parser_goto_row197[] = {
+       50,
+       -1, 141,
+       12, 81,
+       22, 81,
+       28, 81,
+       32, 81,
+       92, 81,
+       96, 81,
+       145, 81,
+       207, 81,
+       337, 81,
+       367, 81,
+       369, 512,
+       427, 81,
+       465, 81,
+       468, 81,
+       484, 622,
+       485, 622,
+       506, 636,
+       558, 81,
+       562, 692,
+       563, 81,
+       602, 710,
+       651, 710,
+       663, 692,
+       666, 81,
+       668, 692,
+       682, 81,
+       724, 848,
+       735, 81,
+       763, 81,
+       790, 81,
+       862, 81,
+       898, 692,
+       900, 1065,
+       1056, 692,
+       1058, 81,
+       1074, 81,
+       1195, 692,
+       1196, 692,
+       1329, 710,
+       1370, 692,
+       1402, 81,
+       1425, 81,
+       1436, 81,
+       1441, 81,
+       1446, 81,
+       1460, 692,
+       1473, 81,
+       1477, 81,
+       1531, 692
+};
+static int parser_goto_row198[] = {
        2,
        -1, 19,
-       13, 81
+       13, 82
 };
-static int parser_goto_row190[] = {
+static int parser_goto_row199[] = {
        3,
        -1, 20,
-       19, 97,
-       81, 227
+       19, 98,
+       82, 231
 };
 
 const int* const parser_goto_table[] = {
@@ -19199,5 +18885,14 @@ const int* const parser_goto_table[] = {
        parser_goto_row187,
        parser_goto_row188,
        parser_goto_row189,
-       parser_goto_row190
+       parser_goto_row190,
+       parser_goto_row191,
+       parser_goto_row192,
+       parser_goto_row193,
+       parser_goto_row194,
+       parser_goto_row195,
+       parser_goto_row196,
+       parser_goto_row197,
+       parser_goto_row198,
+       parser_goto_row199
 };
index a5536fd..c1b37cb 100644 (file)
@@ -54,4 +54,12 @@ end
 
 $ end if
 $ end foreach
+
+redef class EOF
+    redef fun parser_index: Int
+    do
+       return ${tokens/eof/@parser_index}
+    end
+end
+
 $ end template
index 7cefaf0..d1cc1cb 100644 (file)
@@ -71,6 +71,9 @@ redef class ToolContext
                return phases
        end
 
+       # Set of already analyzed modules.
+       private var phased_modules = new HashSet[AModule]
+
        # Run all registered phases on a set of modules
        fun run_phases(nmodules: Collection[AModule])
        do
@@ -85,6 +88,9 @@ redef class ToolContext
                end
 
                for nmodule in nmodules do
+                       if phased_modules.has(nmodule) then continue
+                       phased_modules.add nmodule
+
                        self.info("Semantic analysis module {nmodule.location.file.filename}", 2)
 
                        var vannot = new AnnotationPhaseVisitor
@@ -106,7 +112,7 @@ redef class ToolContext
                                        phase.process_nclassdef(nclassdef)
                                        for npropdef in nclassdef.n_propdefs do
                                                assert phase.toolcontext == self
-                                               phase.process_npropdef(npropdef)
+                                               phase_process_npropdef(phase, npropdef)
                                        end
                                end
                                if errcount != self.error_count then
@@ -126,6 +132,13 @@ redef class ToolContext
 
                var time1 = get_time
                self.info("*** END SEMANTIC ANALYSIS: {time1-time0} ***", 2)
+
+               errors_info
+       end
+
+       fun phase_process_npropdef(phase: Phase, npropdef: APropdef)
+       do
+               phase.process_npropdef(npropdef)
        end
 end
 
index ea0dcaf..3d8fb9e 100644 (file)
@@ -204,6 +204,7 @@ class RapidTypeAnalysis
                force_alive("Int")
                force_alive("Float")
                force_alive("Char")
+               force_alive("Pointer")
 
                while not todo.is_empty do
                        var mmethoddef = todo.shift
index 83c5fe4..5048b33 100644 (file)
@@ -36,6 +36,12 @@ class Variable
 
        # Alias of `name`
        redef fun to_s do return self.name
+
+       # The declaration of the variable, if any
+       var location: nullable Location = null
+
+       # Is the local variable not read and need a warning?
+       var warn_unread = false is writable
 end
 
 # Mark where break and continue will branch.
@@ -77,6 +83,18 @@ private class ScopeVisitor
        # All stacked scope. `scopes.first` is the current scope
        private var scopes: List[Scope] = new List[Scope]
 
+       # Shift and check the last scope
+       fun shift_scope
+       do
+               assert not scopes.is_empty
+               var scope = scopes.shift
+               for v in scope.variables.values do
+                       if v.warn_unread then
+                               toolcontext.advice(v.location, "unread-variable", "Warning: local variable {v.name} is never read.")
+                       end
+               end
+       end
+
        # Regiter a local variable.
        # Display an error on toolcontext if a variable with the same name is masked.
        fun register_variable(node: ANode, variable: Variable): Bool
@@ -88,6 +106,7 @@ private class ScopeVisitor
                        return false
                end
                scopes.first.variables[name] = variable
+               variable.location = node.location
                return true
        end
 
@@ -118,7 +137,7 @@ private class ScopeVisitor
                scope.escapemark = escapemark
                scopes.unshift(scope)
                enter_visit(node)
-               scopes.shift
+               shift_scope
        end
 
        # Look for a label `name`.
@@ -232,6 +251,7 @@ redef class APropdef
        do
                var v = new ScopeVisitor(toolcontext)
                v.enter_visit(self)
+               v.shift_scope
        end
 end
 
@@ -257,6 +277,7 @@ redef class AVardeclExpr
                var nid = self.n_id
                var variable = new Variable(nid.text)
                v.register_variable(nid, variable)
+               variable.warn_unread = true # wait for some read mark.
                self.variable = variable
        end
 end
@@ -370,7 +391,7 @@ redef class AForExpr
                self.escapemark = escapemark
                v.enter_visit_block(n_block, escapemark)
 
-               v.scopes.shift
+               v.shift_scope
        end
 end
 
@@ -409,6 +430,7 @@ end
 redef class ACallExpr
        redef fun variable_create(variable)
        do
+               variable.warn_unread = false
                return new AVarExpr.init_avarexpr(n_id)
        end
 end
@@ -423,6 +445,7 @@ end
 redef class ACallReassignExpr
        redef fun variable_create(variable)
        do
+               variable.warn_unread = false
                return new AVarReassignExpr.init_avarreassignexpr(n_id, n_assign_op, n_value)
        end
 end
index 462fe04..8851413 100644 (file)
@@ -188,9 +188,9 @@ private class TypeVisitor
                if sup == null then return null # Forward error
 
                if sup == sub then
-                       self.modelbuilder.warning(node, "Warning: Expression is already a {sup}.")
+                       self.modelbuilder.warning(node, "useless-type-test", "Warning: Expression is already a {sup}.")
                else if self.is_subtype(sub, sup) then
-                       self.modelbuilder.warning(node, "Warning: Expression is already a {sup} since it is a {sub}.")
+                       self.modelbuilder.warning(node, "useless-type-test", "Warning: Expression is already a {sup} since it is a {sub}.")
                end
                return sup
        end
@@ -262,6 +262,16 @@ private class TypeVisitor
                        return null
                end
 
+               var info = mproperty.deprecation
+               if info != null and self.mpropdef.mproperty.deprecation == null then
+                       var mdoc = info.mdoc
+                       if mdoc != null then
+                               self.modelbuilder.warning(node, "deprecated-method", "Deprecation Warning: Method '{name}' is deprecated: {mdoc.content.first}")
+                       else
+                               self.modelbuilder.warning(node, "deprecated-method", "Deprecation Warning: Method '{name}' is deprecated.")
+                       end
+               end
+
                var propdefs = mproperty.lookup_definitions(self.mmodule, unsafe_type)
                var mpropdef
                if propdefs.length == 0 then
@@ -270,7 +280,7 @@ private class TypeVisitor
                else if propdefs.length == 1 then
                        mpropdef = propdefs.first
                else
-                       self.modelbuilder.warning(node, "Warning: confliting property definitions for property {name} in {unsafe_type}: {propdefs.join(" ")}")
+                       self.modelbuilder.warning(node, "property-conflict", "Warning: conflicting property definitions for property {name} in {unsafe_type}: {propdefs.join(" ")}")
                        mpropdef = mproperty.intro
                end
 
@@ -1202,13 +1212,13 @@ redef class AAsNotnullExpr
                self.mtype = mtype
 
                if mtype isa MClassType then
-                       v.modelbuilder.warning(self, "Warning: expression is already not null, since it is a `{mtype}`.")
+                       v.modelbuilder.warning(self, "useless-type-test", "Warning: expression is already not null, since it is a `{mtype}`.")
                        return
                end
                assert mtype.need_anchor
                var u = v.anchor_to(mtype)
                if not u isa MNullableType then
-                       v.modelbuilder.warning(self, "Warning: expression is already not null, since it is a `{mtype}: {u}`.")
+                       v.modelbuilder.warning(self, "useless-type-test", "Warning: expression is already not null, since it is a `{mtype}: {u}`.")
                        return
                end
        end
@@ -1355,6 +1365,9 @@ end
 redef class AStarExpr
        redef fun property_name do return "*"
 end
+redef class AStarstarExpr
+       redef fun property_name do return "**"
+end
 redef class ASlashExpr
        redef fun property_name do return "/"
 end
@@ -1728,7 +1741,7 @@ redef class ADebugTypeExpr
                var mtype = v.resolve_mtype(ntype)
                if mtype != null and mtype != expr then
                        var umtype = v.anchor_to(mtype)
-                       v.modelbuilder.warning(self, "Found type {expr} (-> {unsafe}), expected {mtype} (-> {umtype})")
+                       v.modelbuilder.warning(self, "debug", "Found type {expr} (-> {unsafe}), expected {mtype} (-> {umtype})")
                end
                self.is_typed = true
        end
similarity index 99%
rename from src/test_markdown.nit
rename to src/test_docdown.nit
index 9d73b67..c546c2e 100644 (file)
@@ -13,7 +13,7 @@
 # limitations under the License.
 
 # Program to test the `markdown` module on real source files.
-module test_markdown
+module test_docdown
 
 import modelize
 import highlight
index 37adf04..45015a7 100644 (file)
@@ -57,34 +57,49 @@ read_model.load(neo_model)
 # Compare model
 var sorter = new MEntityNameSorter
 
-print "mprojects:"
+print "# mprojects:"
 var org_mprojects = org_model.mprojects.to_a
 sorter.sort org_mprojects
 print org_mprojects.join(" ")
+print "------------------------------------"
 var neo_mprojects = neo_model.mprojects.to_a
 sorter.sort neo_mprojects
 print neo_mprojects.join(" ")
 
-print "mmodules:"
+print "\n# mmodules:"
 var org_mmodules = org_model.mmodules.to_a
 sorter.sort org_mmodules
 print org_mmodules.join(" ")
+print "------------------------------------"
 var neo_mmodules = neo_model.mmodules.to_a
 sorter.sort neo_mmodules
 print neo_mmodules.join(" ")
 
-print "mclasses:"
+print "\n# mclasses:"
 var org_mclasses = org_model.mclasses.to_a
 sorter.sort org_mclasses
 print org_mclasses.join(" ")
+print "------------------------------------"
 var neo_mclasses = neo_model.mclasses.to_a
 sorter.sort neo_mclasses
 print neo_mclasses.join(" ")
 
-print "mproperties:"
+print "\n# mproperties:"
 var org_mproperties = org_model.mproperties.to_a
 sorter.sort org_mproperties
 print org_mproperties.join(" ")
+print "------------------------------------"
 var neo_mproperties = neo_model.mproperties.to_a
 sorter.sort neo_mproperties
 print neo_mproperties.join(" ")
+
+print "\n# msignatures:"
+for org_mprop in org_mproperties do
+       if not org_mprop isa MMethod then continue
+       print "{org_mprop.name}{org_mprop.intro.msignature or else ""}"
+end
+print "------------------------------------"
+for neo_mprop in neo_mproperties do
+       if not neo_mprop isa MMethod then continue
+       print "{neo_mprop.name}{neo_mprop.intro.msignature or else ""}"
+end
index e370b8a..fe37ca9 100644 (file)
@@ -51,8 +51,8 @@ class NitUnitExecutor
                # We want executable code
                if not (ast isa AModule or ast isa ABlockExpr or ast isa AExpr) then
                        if ndoc != null and n.tag == "pre" and toolcontext.opt_warn.value > 1 then
-                               toolcontext.warning(ndoc.location, "Warning: There is a block of code that is not valid Nit, thus not considered a nitunit")
-                               if ast isa AError then toolcontext.warning(ast.location, ast.message)
+                               toolcontext.warning(ndoc.location, "invalid-block", "Warning: There is a block of code that is not valid Nit, thus not considered a nitunit")
+                               if ast isa AError then toolcontext.warning(ast.location, "syntax-error", ast.message)
                                ndoc = null # To avoid multiple warning in the same node
                        end
                        return
@@ -63,7 +63,7 @@ class NitUnitExecutor
                v.enter_visit(ast)
                if not v.foundit then
                        if ndoc != null and n.tag == "pre" and toolcontext.opt_warn.value > 1 then
-                               toolcontext.warning(ndoc.location, "Warning: There is a block of Nit code without `assert`, thus not considered a nitunit")
+                               toolcontext.warning(ndoc.location, "invalid-block", "Warning: There is a block of Nit code without `assert`, thus not considered a nitunit")
                                ndoc = null # To avoid multiple warning in the same node
                        end
                        return
@@ -156,13 +156,13 @@ class NitUnitExecutor
                        var ne = new HTMLTag("failure")
                        ne.attr("message", msg)
                        tc.add ne
-                       toolcontext.warning(ndoc.location, "FAILURE: {tc.attrs["classname"]}.{tc.attrs["name"]} (in {file}): {msg}")
+                       toolcontext.warning(ndoc.location, "failure", "FAILURE: {tc.attrs["classname"]}.{tc.attrs["name"]} (in {file}): {msg}")
                        toolcontext.modelbuilder.failed_entities += 1
                else if res2 != 0 then
                        var ne = new HTMLTag("error")
                        ne.attr("message", msg)
                        tc.add ne
-                       toolcontext.warning(ndoc.location, "ERROR: {tc.attrs["classname"]}.{tc.attrs["name"]} (in {file}): {msg}")
+                       toolcontext.warning(ndoc.location, "error", "ERROR: {tc.attrs["classname"]}.{tc.attrs["name"]} (in {file}): {msg}")
                        toolcontext.modelbuilder.failed_entities += 1
                end
                toolcontext.check_errors
index 30cbed5..28e6945 100644 (file)
@@ -231,7 +231,7 @@ class TestCase
                var loc = test_method.location
                if res != 0 then
                        failure = msg
-                       toolcontext.warning(loc, "FAILURE: {test_method.name} (in file {file}.nit): {msg}")
+                       toolcontext.warning(loc, "failure", "FAILURE: {test_method.name} (in file {file}.nit): {msg}")
                        toolcontext.modelbuilder.failed_tests += 1
                end
                toolcontext.check_errors
@@ -252,7 +252,7 @@ class TestCase
                var loc = test_method.location
                if res != 0 then
                        error = msg
-                       toolcontext.warning(loc, "ERROR: {test_method.name} (in file {file}.nit): {msg}")
+                       toolcontext.warning(loc, "failure", "ERROR: {test_method.name} (in file {file}.nit): {msg}")
                        toolcontext.modelbuilder.failed_tests += 1
                end
                toolcontext.check_errors
index 5bfd18d..1bdcea5 100644 (file)
@@ -17,7 +17,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# Common command-line tool infractructure than handle options and error messages
+# Common command-line tool infrastructure than handle options and error messages
 module toolcontext
 
 import opts
@@ -25,11 +25,24 @@ import location
 import version
 import template
 
+# A warning or an error
 class Message
        super Comparable
        redef type OTHER: Message
 
+       # The origin of the message in the source code, if any.
        var location: nullable Location
+
+       # The category of the message.
+       #
+       # Used by quality-control tool for statistics or to enable/disable things individually.
+       var tag: nullable String
+
+       # The human-readable description of the message.
+       #
+       # It should be short and fit on a single line.
+       # It should also have meaningful information first in case
+       # on truncation by an IDE for instance.
        var text: String
 
        # Comparisons are made on message locations.
@@ -59,13 +72,19 @@ class Message
                var yellow = "{esc}[0;33m"
                var def = "{esc}[0m"
 
+               var tag = tag
+               if tag != null then
+                       tag = " ({tag})"
+               else
+                       tag = ""
+               end
                var l = location
                if l == null then
-                       return text
+                       return "{text}{tag}"
                else if l.file == null then
-                       return "{yellow}{l}{def}: {text}"
+                       return "{yellow}{l}{def}: {text}{tag}"
                else
-                       return "{yellow}{l}{def}: {text}\n{l.colored_line("1;31")}"
+                       return "{yellow}{l}{def}: {text}{tag}\n{l.colored_line("1;31")}"
                end
        end
 end
@@ -101,13 +120,24 @@ class ToolContext
                        messages.clear
                end
 
-               if error_count > 0 then exit(1)
+               if error_count > 0 then
+                       errors_info
+                       exit(1)
+               end
+       end
+
+       # Display total error informations
+       fun errors_info
+       do
+               if error_count == 0 and warning_count == 0 then return
+               if opt_no_color.value then return
+               sys.stderr.write "Errors: {error_count}. Warnings: {warning_count}.\n"
        end
 
        # Display an error
        fun error(l: nullable Location, s: String)
        do
-               messages.add(new Message(l,s))
+               messages.add(new Message(l,null,s))
                error_count = error_count + 1
                if opt_stop_on_first_error.value then check_errors
        end
@@ -119,11 +149,41 @@ class ToolContext
                check_errors
        end
 
-       # Display a warning
-       fun warning(l: nullable Location, s: String)
+       # Display a first-level warning.
+       #
+       # First-level warnings are warnings that SHOULD be corrected,
+       # and COULD usually be immediately corrected.
+       #
+       # * There is a simple correction
+       # * There is no reason to let the code this way (no reasonable @supresswarning-like annotation)
+       # * They always are real issues (no false positive)
+       #
+       # First-level warnings are displayed by default (except if option `-q` is given).
+       fun warning(l: nullable Location, tag: String, text: String)
        do
                if opt_warn.value == 0 then return
-               messages.add(new Message(l,s))
+               messages.add(new Message(l, tag, text))
+               warning_count = warning_count + 1
+               if opt_stop_on_first_error.value then check_errors
+       end
+
+       # Display a second-level warning.
+       #
+       # Second-level warnings are warnings that should require investigation,
+       # but cannot always be immediately corrected.
+       #
+       # * The correction could be complex. e.g. require a refactorisation or an API change.
+       # * The correction cannot be done. e.g. Code that use a deprecated API for some compatibility reason.
+       # * There is not a real issue (false positive). Note that this should be unlikely.
+       # * Transitional: While a real warning, it fires a lot in current code, so a transition is needed
+       #   in order to fix them before promoting the advice to a warning.
+       #
+       # In order to prevent warning inflation à la Java, second-level warnings are not displayed by
+       # default and require an additional option `-W`.
+       fun advice(l: nullable Location, tag: String, text: String)
+       do
+               if opt_warn.value <= 1 then return
+               messages.add(new Message(l, tag, text))
                warning_count = warning_count + 1
                if opt_stop_on_first_error.value then check_errors
        end
@@ -213,14 +273,14 @@ class ToolContext
        # A multi-line string is recommmended.
        #
        # eg. `"Usage: tool [OPTION]... [FILE]...\nDo some things."`
-       var tooldescription: String writable = "Usage: [OPTION]... [ARG]..."
+       var tooldescription: String = "Usage: [OPTION]... [ARG]..." is writable
 
        # Does `process_options` should accept an empty sequence of arguments.
        # ie. nothing except options.
        # Is `false` by default.
        #
        # If required, if should be set by the client before calling `process_options`
-       var accept_no_arguments writable = false
+       var accept_no_arguments = false is writable
 
        # print the full usage of the tool.
        # Is called by `process_option` on `--help`.
diff --git a/src/uml/uml.nit b/src/uml/uml.nit
new file mode 100644 (file)
index 0000000..0403540
--- /dev/null
@@ -0,0 +1,20 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Group head module for UML generation services
+module uml
+
+import uml_base
+import uml_class
+import uml_module
diff --git a/src/uml/uml_base.nit b/src/uml/uml_base.nit
new file mode 100644 (file)
index 0000000..e54ccef
--- /dev/null
@@ -0,0 +1,38 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Exposes the base class for UML generation of a `Model`
+module uml_base
+
+import toolcontext
+import model_utils
+
+redef class ToolContext
+       # -p
+       var opt_privacy = new OptionBool("Generates private API", "-p", "--private")
+
+       # Shortcut for the value of `self.opt_privacy`
+       fun private_gen: Bool do return opt_privacy.value
+
+       redef init do
+               option_context.add_option opt_privacy
+               super
+       end
+end
+
+class UMLModel
+       var model: Model
+       var mainmodule: MModule
+       var ctx: ToolContext
+end
diff --git a/src/uml/uml_class.nit b/src/uml/uml_class.nit
new file mode 100644 (file)
index 0000000..7581f2a
--- /dev/null
@@ -0,0 +1,232 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Provides facilities of exporting a `Model` to a UML class diagram
+module uml_class
+
+import uml_base
+
+redef class UMLModel
+       # Generates a UML class diagram from a `Model`
+       fun generate_class_uml: Streamable do
+               var tpl = new Template
+               tpl.add "digraph G \{\n"
+               tpl.add """     fontname = "Bitstream Vera Sans"
+                               fontsize = 8
+                               node [
+                                       fontname = "Bitstream Vera Sans"
+                                       fontsize = 8
+                                       shape = "record"
+                               ]
+
+                               edge [
+                                       fontname = "Bitstream Vera Sans"
+                                       fontsize = 8
+                               ]\n"""
+               tpl.add model.tpl_class(ctx, mainmodule)
+               tpl.add "\}"
+               return tpl
+       end
+end
+
+redef class Model
+
+       # Generates a UML Class diagram from the entities of a `Model`
+       fun tpl_class(ctx: ToolContext, main: MModule): Streamable do
+               var t = new Template
+               for i in mclasses do
+                       if not ctx.private_gen and i.visibility != public_visibility then continue
+                       t.add i.tpl_class(ctx, main)
+                       t.add "\n"
+               end
+               return t
+       end
+
+end
+
+redef class MEntity
+       # Generates a dot-compatible `Streamable` UML Class diagram from `self`
+       fun tpl_class(ctx: ToolContext, main: MModule): Streamable is abstract
+end
+
+redef class MClass
+
+       redef fun tpl_class(ctx, main): Streamable do
+               var t = new Template
+               t.add "{name} [\n label = \"\{"
+               if kind == abstract_kind then
+                       t.add "abstract\\n{name}"
+               else if kind == interface_kind then
+                       t.add "interface\\n{name}"
+               else
+                       t.add "{name}"
+               end
+               if arity > 0 then
+                       t.add "["
+                       var formal = intro.parameter_names
+                       t.add formal.first
+                       for i in [1 .. formal.length[ do
+                               t.add ", "
+                               t.add formal[i]
+                       end
+                       t.add "]"
+               end
+               t.add "|"
+               var props: Collection[MProperty]
+               if ctx.private_gen then
+                       props = intro_mproperties(none_visibility)
+               else
+                       props = intro_mproperties(public_visibility)
+               end
+               for i in props do
+                       if i isa MAttribute then
+                               t.add i.tpl_class(ctx, main)
+                               t.add "\\l"
+                       end
+               end
+               t.add "|"
+               for i in intro_methods do
+                       if not ctx.private_gen and i.visibility != public_visibility then continue
+                       t.add i.tpl_class(ctx, main)
+                       t.add "\\l"
+               end
+               t.add "\}\"\n]\n"
+               var g = in_hierarchy(main).direct_greaters
+               for i in g do
+                       if not ctx.private_gen and i.visibility != public_visibility then continue
+                       t.add "{i.name} -> {name} [dir=back"
+                       if i.kind == interface_kind then
+                               t.add " arrowtail=open style=dashed"
+                       else
+                               t.add " arrowtail=empty"
+                       end
+                       t.add "];\n"
+               end
+               return t
+       end
+
+end
+
+redef class MMethod
+       redef fun tpl_class(ctx, main) do
+               var tpl = new Template
+               tpl.add visibility.tpl_class
+               tpl.add " "
+               tpl.add name.escape_to_dot
+               tpl.add intro.msignature.tpl_class(ctx, main)
+               return tpl
+       end
+end
+
+redef class MSignature
+
+       redef fun tpl_class(ctx, main) do
+               var t = new Template
+               t.add "("
+               var params = new Array[MParameter]
+               for i in mparameters do
+                       params.add i
+               end
+               if params.length > 0 then
+                       t.add params.first.name
+                       t.add ": "
+                       t.add params.first.mtype.tpl_class(ctx, main)
+                       for i in [1 .. params.length [ do
+                               t.add ", "
+                               t.add params[i].name
+                               t.add ": "
+                               t.add params[i].mtype.tpl_class(ctx, main)
+                       end
+               end
+               t.add ")"
+               if return_mtype != null then
+                       t.add ": "
+                       t.add return_mtype.tpl_class(ctx, main)
+               end
+               return t
+       end
+end
+
+redef class MAttribute
+       redef fun tpl_class(ctx, main) do
+               var tpl = new Template
+               tpl.add visibility.tpl_class
+               tpl.add " "
+               tpl.add name
+               tpl.add ": "
+               tpl.add intro.static_mtype.tpl_class(ctx, main)
+               return tpl
+       end
+end
+
+redef class MVisibility
+       # Returns the visibility as a UML token
+       #
+       #    assert public_visibility.tpl_class == "+"
+       #    assert private_visibility.tpl_class == "-"
+       fun tpl_class: Streamable do
+               if self == private_visibility then
+                       return "-"
+               else if self == protected_visibility then
+                       return "#"
+               else if self == public_visibility then
+                       return "+"
+               else
+                       return "+"
+               end
+       end
+end
+
+redef class MClassType
+       redef fun tpl_class(c, m) do
+               return name
+       end
+end
+
+redef class MGenericType
+       redef fun tpl_class(c, m) do
+               var t = new Template
+               t.add name.substring(0, name.index_of('['))
+               t.add "["
+               t.add arguments.first.tpl_class(c, m)
+               for i in [1 .. arguments.length[ do
+                       t.add ", "
+                       t.add arguments[i].tpl_class(c, m)
+               end
+               t.add "]"
+               return t
+       end
+end
+
+redef class MParameterType
+       redef fun tpl_class(c, m) do
+               var n = mclass.intro.parameter_names
+               return n[rank]
+       end
+end
+
+redef class MVirtualType
+       redef fun tpl_class(c, m) do
+               return name
+       end
+end
+
+redef class MNullableType
+       redef fun tpl_class(c, m) do
+               var t = new Template
+               t.add "nullable "
+               t.add mtype.tpl_class(c, m)
+               return t
+       end
+end
diff --git a/src/uml/uml_module.nit b/src/uml/uml_module.nit
new file mode 100644 (file)
index 0000000..55d16f3
--- /dev/null
@@ -0,0 +1,158 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Services for generation of a UML package diagram based on a `Model`
+module uml_module
+
+import uml_base
+import uml_class
+
+redef class UMLModel
+       # Generates a UML package diagram from a `Model`
+       fun generate_package_uml: Streamable do
+               var tpl = new Template
+               tpl.add "digraph G \{\n"
+               tpl.add """     fontname = "Bitstream Vera Sans"
+                       fontsize = 8
+                       node [
+                               fontname = "Bitstream Vera Sans"
+                               fontsize = 8
+                               shape = "record"
+                       ]
+                       edge [
+                               fontname = "Bitstream Vera Sans"
+                               fontsize = 8
+                       ]\n"""
+               tpl.add model.tpl_module(ctx, mainmodule)
+               tpl.add "\}"
+               return tpl
+       end
+end
+
+redef class Model
+       # Returns a UML package diagram of `main`
+       fun tpl_module(ctx: ToolContext, main: MModule): Streamable do
+               return main.tpl_module(ctx, main)
+       end
+end
+
+redef class MModule
+       redef fun tpl_module(ctx, main) do
+               var t = new Template
+               t.add "subgraph cluster{name} \{\n"
+               t.add "label = \"{name}\"\n"
+               for i in mclassdefs do
+                       if not ctx.private_gen and i.mclass.visibility != public_visibility then continue
+                       t.add i.tpl_module(ctx, main)
+               end
+               t.add "\}\n"
+               return t
+       end
+end
+
+redef class MEntity
+       # Builds a dot UML package diagram entity from `self`
+       fun tpl_module(ctx: ToolContext, main: MModule): Streamable is abstract
+end
+
+redef class MClassDef
+
+       # Colour for the border of a class when first introduced
+       #
+       # Defaults to a shade of green
+       var intro_colour = "#58B26A"
+
+       # Colour for the border of a class when refined
+       #
+       # Defaults to a shade of red
+       var redef_colour = "#B24758"
+
+       redef fun tpl_module(ctx, main) do
+               var t = new Template
+               t.add "{mmodule}{name} [\n\tlabel = \"\{"
+               if mclass.kind == abstract_kind then
+                       t.add "abstract\\n{name}"
+               else if mclass.kind == interface_kind then
+                       t.add "interface\\n{name}"
+               else
+                       t.add "{name}"
+               end
+               if mclass.arity > 0 then
+                       t.add "["
+                       var formal = mclass.intro.parameter_names
+                       t.add formal.first
+                       for i in [1 .. formal.length[ do
+                               t.add ", "
+                               t.add formal[i]
+                       end
+                       t.add "]"
+               end
+               t.add "|"
+               for i in mpropdefs do
+                       if not i isa MAttributeDef then continue
+                       if not ctx.private_gen and i.mproperty.visibility != public_visibility then continue
+                       t.add i.tpl_module(ctx, main)
+                       t.add "\\l"
+               end
+               t.add "|"
+               for i in mpropdefs do
+                       if not i isa MMethodDef then continue
+                       if not ctx.private_gen and i.mproperty.visibility != public_visibility then continue
+                       t.add i.tpl_module(ctx, main)
+                       t.add "\\l"
+               end
+               t.add "\}\""
+               if is_intro then
+                       t.add "color=\"{intro_colour}\""
+               else
+                       t.add "color=\"{redef_colour}\""
+               end
+               t.add "\n]\n"
+               var supers = in_hierarchy.direct_greaters
+               for i in supers do
+                       if i.mmodule != mmodule then continue
+                       t.add "{i.mmodule}{i.name} -> {mmodule}{name} [dir=back"
+                       if i.mclass.kind == interface_kind then
+                               t.add " arrowtail=open style=dashed"
+                       else
+                               t.add " arrowtail=empty"
+                       end
+                       t.add "]\n"
+               end
+               return t
+       end
+end
+
+redef class MMethodDef
+       redef fun tpl_module(ctx, main) do
+               var t = new Template
+               t.add mproperty.visibility.tpl_class
+               t.add " "
+               t.add name.escape_to_dot
+               t.add msignature.tpl_class(ctx, main)
+               return t
+       end
+end
+
+redef class MAttributeDef
+       redef fun tpl_module(ctx, main) do
+               var t = new Template
+               t.add mproperty.visibility.tpl_class
+               t.add " "
+               t.add name
+               t.add ": "
+               t.add static_mtype.tpl_class(ctx, main)
+               return t
+       end
+end
index 7e87f8c..a58a4a8 100644 (file)
@@ -44,6 +44,16 @@ class VirtualMachine super NaiveInterpreter
        # Handles memory and garbage collection
        var memory_manager: MemoryManager = new MemoryManager
 
+       # The unique instance of the `MInit` value
+       var initialization_value: Instance
+
+       init(modelbuilder: ModelBuilder, mainmodule: MModule, arguments: Array[String])
+       do
+               super
+               var init_type = new MInitType(mainmodule.model)
+               initialization_value = new MutableInstance(init_type)
+       end
+
        # Subtyping test for the virtual machine
        redef fun is_subtype(sub, sup: MType): Bool
        do
@@ -71,7 +81,7 @@ class VirtualMachine super NaiveInterpreter
                if sup isa MParameterType or sup isa MVirtualType then
                        return sub == sup
                end
-               
+
                if sub isa MParameterType or sub isa MVirtualType then
                        sub = sub.anchor_to(mainmodule, anchor)
                        # Manage the second layer of null/nullable
@@ -124,11 +134,11 @@ class VirtualMachine super NaiveInterpreter
 
                // Follow the pointer to somewhere in the vtable
                long unsigned int *offset = (long unsigned int*)(((long int *)vtable)[-hv]);
-               
+
                // If the pointed value is corresponding to the identifier, the test is true, otherwise false
                return *offset == id;
        `}
-       
+
        # Redef init_instance to simulate the loading of a class
        redef fun init_instance(recv: Instance)
        do
@@ -137,81 +147,87 @@ class VirtualMachine super NaiveInterpreter
                recv.vtable = recv.mtype.as(MClassType).mclass.vtable
 
                assert(recv isa MutableInstance)
-               recv.internal_attributes = init_internal_attributes(null_instance, recv.mtype.as(MClassType).mclass.cached_attributes.length)
 
+               recv.internal_attributes = init_internal_attributes(initialization_value, recv.mtype.as(MClassType).mclass.all_mattributes(mainmodule, none_visibility).length)
                super
        end
-               
+
        # Initialize the internal representation of an object (its attribute values)
-       private fun init_internal_attributes(null_instance: Instance, size: Int): Pointer
+       # `init_instance` is the initial value of attributes
+       private fun init_internal_attributes(init_instance: Instance, size: Int): Pointer
                import Array[Instance].length, Array[Instance].[] `{
-               
+
                Instance* attributes = malloc(sizeof(Instance) * size);
 
                int i;
                for(i=0; i<size; i++)
-                       attributes[i] = null_instance;
+                       attributes[i] = init_instance;
 
-               Instance_incr_ref(null_instance);
+               Instance_incr_ref(init_instance);
                return attributes;
        `}
 
        # Creates the runtime structures for this class
        fun create_class(mclass: MClass) do     mclass.make_vt(self)
 
-       # Return the value of the attribute `mproperty for the object `recv
+       # Return the value of the attribute `mproperty` for the object `recv`
        redef fun read_attribute(mproperty: MAttribute, recv: Instance): Instance
        do
                assert recv isa MutableInstance
 
                # Read the attribute value with perfect hashing
                var id = mproperty.intro_mclassdef.mclass.vtable.id
-               
+
                var i = read_attribute_ph(recv.internal_attributes, recv.vtable.internal_vtable,
                                        recv.vtable.mask, id, mproperty.offset)
-               
+
+               # If we get a `MInit` value, throw an error
+               if i == initialization_value then
+                       fatal("Uninitialized attribute {mproperty.name}")
+                       abort
+               end
+
                return i
        end
 
-       # Return the attribute value in `instance with a sequence of perfect_hashing
-       #     `instance is the attributes array of the receiver
-       #     `vtable is the pointer to the virtual table of the class (of the receiver)
-       #     `mask is the perfect hashing mask of the class
-       #     `id is the identifier of the class
-       #     `offset is the relative offset of this attribute
+       # Return the attribute value in `instance` with a sequence of perfect_hashing
+       #     `instance` is the attributes array of the receiver
+       #     `vtable` is the pointer to the virtual table of the class (of the receiver)
+       #     `mask` is the perfect hashing mask of the class
+       #     `id` is the identifier of the class
+       #     `offset` is the relative offset of this attribute
        private fun read_attribute_ph(instance: Pointer, vtable: Pointer, mask: Int, id: Int, offset: Int): Instance `{
                // Perfect hashing position
                int hv = mask & id;
                long unsigned int *pointer = (long unsigned int*)(((long int *)vtable)[-hv]);
-               
+
                // pointer+1 is the position where the delta of the class is
                int absolute_offset = *(pointer + 1);
 
                Instance res = ((Instance *)instance)[absolute_offset + offset];
-               
+
                return res;
        `}
 
-       # Replace in `recv the value of the attribute `mproperty by `value
+       # Replace in `recv` the value of the attribute `mproperty` by `value`
        redef fun write_attribute(mproperty: MAttribute, recv: Instance, value: Instance)
        do
                assert recv isa MutableInstance
 
                var id = mproperty.intro_mclassdef.mclass.vtable.id
-               
+
                # Replace the old value of mproperty in recv
                write_attribute_ph(recv.internal_attributes, recv.vtable.internal_vtable,
                                        recv.vtable.mask, id, mproperty.offset, value)
        end
 
        # Replace the value of an attribute in an instance
-       #     `instance is the attributes array of the receiver
-       #     `vtable is the pointer to the virtual table of the class (of the receiver)
-       #     `mask is the perfect hashing mask of the class
-       #     `id is the identifier of the class
-       #     `offset is the relative offset of this attribute
-       #         `value is the new value for this attribute
+       #     `instance` is the attributes array of the receiver
+       #     `vtable` is the pointer to the virtual table of the class (of the receiver)
+       #     `mask` is the perfect hashing mask of the class
+       #     `id` is the identifier of the class
+       #     `offset` is the relative offset of this attribute
+       #     `value` is the new value for this attribute
        private fun write_attribute_ph(instance: Pointer, vtable: Pointer, mask: Int, id: Int, offset: Int, value: Instance) `{
                // Perfect hashing position
                int hv = mask & id;
@@ -223,6 +239,21 @@ class VirtualMachine super NaiveInterpreter
                ((Instance *)instance)[absolute_offset + offset] = value;
                Instance_incr_ref(value);
        `}
+
+       # Is the attribute `mproperty` initialized in the instance `recv`?
+       redef fun isset_attribute(mproperty: MAttribute, recv: Instance): Bool
+       do
+               assert recv isa MutableInstance
+
+               # Read the attribute value with internal perfect hashing read
+               # because we do not want to throw an error if the value is `initialization_value`
+               var id = mproperty.intro_mclassdef.mclass.vtable.id
+
+               var i = read_attribute_ph(recv.internal_attributes, recv.vtable.internal_vtable,
+                                       recv.vtable.mask, id, mproperty.offset)
+
+               return i != initialization_value
+       end
 end
 
 redef class MClass
@@ -232,28 +263,36 @@ redef class MClass
        # True when the class is effectively loaded by the vm, false otherwise
        var loaded: Bool = false
 
-       # Cached attributes for faster instanciations of this class
-       var cached_attributes: Array[MAttribute] = new Array[MAttribute]
+       # For each loaded subclass, keep the position of the group of attributes
+       # introduced by self class in the object
+       var positions_attributes: HashMap[MClass, Int] = new HashMap[MClass, Int]
+
+       # For each loaded subclass, keep the position of the group of methods
+       # introduced by self class in the vtable
+       var positions_methods: HashMap[MClass, Int] = new HashMap[MClass, Int]
 
        # Allocates a VTable for this class and gives it an id
        private fun make_vt(v: VirtualMachine)
        do
                if loaded then return
 
-               # Superclasses contains all superclasses except self
-               var superclasses = new Array[MClass]
-               superclasses.add_all(ancestors)
+               # `superclasses` contains the order of superclasses for virtual tables
+               var superclasses = superclasses_ordering(v)
                superclasses.remove(self)
-               v.mainmodule.linearize_mclasses(superclasses)
 
                # Make_vt for super-classes
                var ids = new Array[Int]
                var nb_methods = new Array[Int]
                var nb_attributes = new Array[Int]
 
+               # Absolute offset of the beginning of the attributes table
+               var offset_attributes = 0
+               # Absolute offset of the beginning of the methods table
+               var offset_methods = 0
+
                for parent in superclasses do
-                       if parent.vtable == null then parent.make_vt(v)
-                       
+                       if not parent.loaded then parent.make_vt(v)
+
                        # Get the number of introduced methods and attributes for this class
                        var methods = 0
                        var attributes = 0
@@ -264,23 +303,32 @@ redef class MClass
                                        attributes += 1
                                end
                        end
-                       
+
                        ids.push(parent.vtable.id)
                        nb_methods.push(methods)
                        nb_attributes.push(attributes)
+
+                       # Update `positions_attributes` and `positions_methods` in `parent`
+                       update_positions(offset_attributes, offset_methods, parent)
+
+                       offset_attributes += attributes
+                       offset_methods += methods
                end
-               
+
                # When all super-classes have their identifiers and vtables, allocate current one
-               allocate_vtable(v, ids, nb_methods, nb_attributes)
+               allocate_vtable(v, ids, nb_methods, nb_attributes, offset_attributes, offset_methods)
                loaded = true
                # The virtual table now needs to be filled with pointer to methods
        end
 
        # Allocate a single vtable
-       #       ids : Array of superclasses identifiers
-       #       nb_methods : Array which contain the number of introducted methods for each class in ids
-       #       nb_attributes : Array which contain the number of introducted attributes for each class in ids
-       private fun allocate_vtable(v: VirtualMachine, ids: Array[Int], nb_methods: Array[Int], nb_attributes: Array[Int])
+       #     `ids : Array of superclasses identifiers
+       #     `nb_methods : Array which contain the number of introduced methods for each class in ids
+       #     `nb_attributes : Array which contain the number of introduced attributes for each class in ids
+       #     `offset_attributes : Offset from the beginning of the table of the group of attributes
+       #     `offset_methods : Offset from the beginning of the table of the group of methods
+       private fun allocate_vtable(v: VirtualMachine, ids: Array[Int], nb_methods: Array[Int], nb_attributes: Array[Int],
+                       offset_attributes: Int, offset_methods: Int)
        do
                vtable = new VTable
                var idc = new Array[Int]
@@ -298,17 +346,16 @@ redef class MClass
                var nb_attributes_total = new Array[Int]
 
                var self_methods = 0
-               var self_attributes = 0
-               
+               var nb_introduced_attributes = 0
+
                # For self attributes, fixing offsets
                var relative_offset = 0
                for p in intro_mproperties(none_visibility) do
                        if p isa MMethod then self_methods += 1
-                       if p isa MAttribute then 
-                               self_attributes += 1
+                       if p isa MAttribute then
+                               nb_introduced_attributes += 1
                                p.offset = relative_offset
                                relative_offset += 1
-                               cached_attributes.push(p)
                        end
                end
 
@@ -316,17 +363,22 @@ redef class MClass
                nb_methods_total.push(self_methods)
 
                nb_attributes_total.add_all(nb_attributes)
-               nb_attributes_total.push(self_attributes)
+               nb_attributes_total.push(nb_introduced_attributes)
+
+               # Save the offsets of self class
+               offset_attributes += nb_introduced_attributes
+               offset_methods += self_methods
+               update_positions(offset_attributes, offset_methods, self)
 
-               # Since we have the number of attributes for each class, calculate the delta 
+               # Since we have the number of attributes for each class, calculate the delta
                var d = calculate_delta(nb_attributes_total)
                vtable.internal_vtable = v.memory_manager.init_vtable(ids_total, nb_methods_total, d, vtable.mask)
        end
 
        # Computes delta for each class
        # A delta represents the offset for this group of attributes in the object
-       #    nb_attributes : number of attributes for each class (classes are linearized from Object to current)
-       #    return deltas for each class
+       #     `nb_attributes` : number of attributes for each class (classes are linearized from Object to current)
+       #     return deltas for each class
        private fun calculate_delta(nb_attributes: Array[Int]): Array[Int]
        do
                var deltas = new Array[Int]
@@ -339,6 +391,91 @@ redef class MClass
 
                return deltas
        end
+
+       # Order superclasses of self
+       # Return the order of superclasses in runtime structures of this class
+       private fun superclasses_ordering(v: VirtualMachine): Array[MClass]
+       do
+               var superclasses = new Array[MClass]
+               superclasses.add_all(ancestors)
+
+               var res = new Array[MClass]
+               if superclasses.length > 1 then
+                       # Starting at self
+                       var ordering = self.dfs(v, res)
+
+                       return ordering
+               else
+                       # There is no super-class, self is Object
+                       return superclasses
+               end
+       end
+
+       # A kind of Depth-First-Search for superclasses ordering
+       #     `v` : the current executed instance of VirtualMachine
+       #     `res` : Result Array, ie current superclasses ordering
+       private fun dfs(v: VirtualMachine, res: Array[MClass]): Array[MClass]
+       do
+               # Add this class at the beginning
+               res.insert(self, 0)
+
+               var direct_parents = self.in_hierarchy(v.mainmodule).direct_greaters.to_a
+
+               if direct_parents.length > 1 then
+                       # Prefix represents the class which has the most properties
+                       # we try to choose it in first to reduce the number of potential recompilations
+                       var prefix = null
+                       var max = -1
+                       for cl in direct_parents do
+                               # If we never have visited this class
+                               if not res.has(cl) then
+                                       var properties_length = cl.all_mproperties(v.mainmodule, none_visibility).length
+                                       if properties_length > max then
+                                               max = properties_length
+                                               prefix = cl
+                                       end
+                               end
+                       end
+
+                       if prefix != null then
+                               # Add the prefix class ordering at the beginning of our sequence
+                               var prefix_res = new Array[MClass]
+                               prefix_res = prefix.dfs(v, prefix_res)
+
+                               # Then we recurse on other classes
+                               for cl in direct_parents do
+                                       if cl != prefix then
+                                               res = new Array[MClass]
+                                               res = cl.dfs(v, res)
+
+                                               for cl_res in res do
+                                                       if not prefix_res.has(cl_res) then prefix_res.push(cl_res)
+                                               end
+                                       end
+                               end
+                               res = prefix_res
+                       end
+
+                       res.push(self)
+               else
+                       if direct_parents.length > 0 then
+                               res = direct_parents.first.dfs(v, res)
+                       end
+               end
+
+               if not res.has(self) then res.push(self)
+
+               return res
+       end
+
+       # Update positions of self class in `parent`
+       #     `attributes_offset`: absolute offset of introduced attributes
+       #     `methods_offset`: absolute offset of introduced methods
+       private fun update_positions(attributes_offsets: Int, methods_offset:Int, parent: MClass)
+       do
+               parent.positions_attributes[self] = attributes_offsets
+               parent.positions_methods[self] = methods_offset
+       end
 end
 
 redef class MAttribute
@@ -348,11 +485,34 @@ end
 
 # Redef MutableInstance to improve implementation of attributes in objects
 redef class MutableInstance
-       
+
        # C-array to store pointers to attributes of this Object
        var internal_attributes: Pointer
 end
 
+# Is the type of the initial value inside attributes
+class MInitType
+       super MType
+
+       redef var model: Model
+       protected init(model: Model)
+       do
+               self.model = model
+       end
+
+       redef fun to_s do return "InitType"
+       redef fun as_nullable do return self
+       redef fun need_anchor do return false
+       redef fun resolve_for(mtype, anchor, mmodule, cleanup_virtual) do return self
+       redef fun can_resolve_for(mtype, anchor, mmodule) do return true
+
+       redef fun collect_mclassdefs(mmodule) do return new HashSet[MClassDef]
+
+       redef fun collect_mclasses(mmodule) do return new HashSet[MClass]
+
+       redef fun collect_mtypes(mmodule) do return new HashSet[MClassType]
+end
+
 # A VTable contains the virtual method table for the dispatch
 # and informations to perform subtyping tests
 class VTable
@@ -377,7 +537,7 @@ end
 class MemoryManager
 
        # Allocate and fill a virtual table
-       fun init_vtable(ids: Array[Int], nb_methods: Array[Int], nb_attributes: Array[Int], mask: Int): Pointer 
+       fun init_vtable(ids: Array[Int], nb_methods: Array[Int], nb_attributes: Array[Int], mask: Int): Pointer
        do
                # Allocate in C current virtual table
                var res = intern_init_vtable(ids, nb_methods, nb_attributes, mask)
@@ -386,7 +546,7 @@ class MemoryManager
        end
 
        # Construct virtual tables with a bi-dimensional layout
-       private fun intern_init_vtable(ids: Array[Int], nb_methods: Array[Int], deltas: Array[Int], mask: Int): Pointer 
+       private fun intern_init_vtable(ids: Array[Int], nb_methods: Array[Int], deltas: Array[Int], mask: Int): Pointer
                import Array[Int].length, Array[Int].[] `{
 
                // Allocate and fill current virtual table
@@ -396,7 +556,7 @@ class MemoryManager
                for(i = 0; i<nb_classes; i++) {
                        /* - One for each method of this class
                        *  - One for the delta (offset of this group of attributes in objects)
-                       *  - One for the id 
+                       *  - One for the id
                        */
                        total_size += Array_of_Int__index(nb_methods, i);
                        total_size += 2;
@@ -406,20 +566,20 @@ class MemoryManager
                // Add one because we start to fill the vtable at position 1 (0 is the init position)
                total_size += mask+2;
                long unsigned int* vtable = malloc(sizeof(long unsigned int)*total_size);
-               
+
                // Initialisation to the first position of the virtual table (ie : Object)
                long unsigned int *init = vtable + mask + 2;
                for(i=0; i<total_size; i++)
                        vtable[i] = (long unsigned int)init;
 
-               // Set the virtual table to its position 0 
+               // Set the virtual table to its position 0
                // ie: after the hashtable
                vtable = vtable + mask + 1;
-               
+
                int current_size = 1;
                for(i = 0; i < nb_classes; i++) {
                        /*
-                               vtable[hv] contains a pointer to the group of introducted methods
+                               vtable[hv] contains a pointer to the group of introduced methods
                                For each superclasse we have in virtual table :
                                        (id | delta | introduced methods)
                        */
@@ -428,7 +588,7 @@ class MemoryManager
                        vtable[current_size] = Array_of_Int__index(ids, i);
                        vtable[current_size + 1] = Array_of_Int__index(deltas, i);
                        vtable[-hv] = (long unsigned int)&(vtable[current_size]);
-                       
+
                        current_size += 2;
                        current_size += Array_of_Int__index(nb_methods, i);
                }
diff --git a/tests/base_deprecated.nit b/tests/base_deprecated.nit
new file mode 100644 (file)
index 0000000..654d23a
--- /dev/null
@@ -0,0 +1,39 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import kernel
+
+class A
+       var foo: Int is
+               # Documentation
+               deprecated
+       end
+
+       fun bar is
+               deprecated
+       do
+               foo.output
+               bar
+               baz
+       end
+
+       fun baz
+       do
+               foo.output
+               bar
+               baz
+       end
+
+       #alt1#redef fun output is deprecated do end
+end
diff --git a/tests/nituml.args b/tests/nituml.args
new file mode 100644 (file)
index 0000000..2add9e5
--- /dev/null
@@ -0,0 +1,4 @@
+--diagram package --private ./base_prot_sig2.nit -I ../lib/standard
+--diagram package ./base_prot_sig2.nit -I ../lib/standard
+--diagram class --private ./base_prot_sig2.nit -I ../lib/standard
+--diagram class ./base_prot_sig2.nit -I ../lib/standard
index 7bb162d..3cb78e6 100644 (file)
@@ -1,4 +1,4 @@
-base_control_flow2.nit:21,1--25,3: Warning: use 'loop' instead of 'while true do'.
-base_control_flow2.nit:39,1--43,3: Warning: use 'loop' instead of 'while true do'.
-base_control_flow2.nit:47,2--51,4: Warning: use 'loop' instead of 'while true do'.
-base_control_flow2.nit:45,1--55,3: Warning: use 'loop' instead of 'while true do'.
+base_control_flow2.nit:21,1--25,3: Warning: use `loop` instead of `while true do`.
+base_control_flow2.nit:39,1--43,3: Warning: use `loop` instead of `while true do`.
+base_control_flow2.nit:47,2--51,4: Warning: use `loop` instead of `while true do`.
+base_control_flow2.nit:45,1--55,3: Warning: use `loop` instead of `while true do`.
index c24ab44..e569abe 100644 (file)
@@ -1,5 +1,5 @@
 alt/base_control_flow2_alt1.nit:24,2: Error: unreachable statement.
-alt/base_control_flow2_alt1.nit:21,1--25,3: Warning: use 'loop' instead of 'while true do'.
-alt/base_control_flow2_alt1.nit:39,1--43,3: Warning: use 'loop' instead of 'while true do'.
-alt/base_control_flow2_alt1.nit:47,2--51,4: Warning: use 'loop' instead of 'while true do'.
-alt/base_control_flow2_alt1.nit:45,1--55,3: Warning: use 'loop' instead of 'while true do'.
+alt/base_control_flow2_alt1.nit:21,1--25,3: Warning: use `loop` instead of `while true do`.
+alt/base_control_flow2_alt1.nit:39,1--43,3: Warning: use `loop` instead of `while true do`.
+alt/base_control_flow2_alt1.nit:47,2--51,4: Warning: use `loop` instead of `while true do`.
+alt/base_control_flow2_alt1.nit:45,1--55,3: Warning: use `loop` instead of `while true do`.
index 57fdfa6..72d2608 100644 (file)
@@ -1,5 +1,5 @@
-alt/base_control_flow2_alt2.nit:21,1--25,3: Warning: use 'loop' instead of 'while true do'.
+alt/base_control_flow2_alt2.nit:21,1--25,3: Warning: use `loop` instead of `while true do`.
 alt/base_control_flow2_alt2.nit:30,2: Error: unreachable statement.
-alt/base_control_flow2_alt2.nit:39,1--43,3: Warning: use 'loop' instead of 'while true do'.
-alt/base_control_flow2_alt2.nit:47,2--51,4: Warning: use 'loop' instead of 'while true do'.
-alt/base_control_flow2_alt2.nit:45,1--55,3: Warning: use 'loop' instead of 'while true do'.
+alt/base_control_flow2_alt2.nit:39,1--43,3: Warning: use `loop` instead of `while true do`.
+alt/base_control_flow2_alt2.nit:47,2--51,4: Warning: use `loop` instead of `while true do`.
+alt/base_control_flow2_alt2.nit:45,1--55,3: Warning: use `loop` instead of `while true do`.
index 7585a5f..4c19474 100644 (file)
@@ -1,5 +1,5 @@
-alt/base_control_flow2_alt3.nit:21,1--25,3: Warning: use 'loop' instead of 'while true do'.
+alt/base_control_flow2_alt3.nit:21,1--25,3: Warning: use `loop` instead of `while true do`.
 alt/base_control_flow2_alt3.nit:42,2: Error: unreachable statement.
-alt/base_control_flow2_alt3.nit:39,1--43,3: Warning: use 'loop' instead of 'while true do'.
-alt/base_control_flow2_alt3.nit:47,2--51,4: Warning: use 'loop' instead of 'while true do'.
-alt/base_control_flow2_alt3.nit:45,1--55,3: Warning: use 'loop' instead of 'while true do'.
+alt/base_control_flow2_alt3.nit:39,1--43,3: Warning: use `loop` instead of `while true do`.
+alt/base_control_flow2_alt3.nit:47,2--51,4: Warning: use `loop` instead of `while true do`.
+alt/base_control_flow2_alt3.nit:45,1--55,3: Warning: use `loop` instead of `while true do`.
index 5a3b21a..a5ac542 100644 (file)
@@ -1,5 +1,5 @@
-alt/base_control_flow2_alt4.nit:21,1--25,3: Warning: use 'loop' instead of 'while true do'.
-alt/base_control_flow2_alt4.nit:39,1--43,3: Warning: use 'loop' instead of 'while true do'.
+alt/base_control_flow2_alt4.nit:21,1--25,3: Warning: use `loop` instead of `while true do`.
+alt/base_control_flow2_alt4.nit:39,1--43,3: Warning: use `loop` instead of `while true do`.
 alt/base_control_flow2_alt4.nit:50,3: Error: unreachable statement.
-alt/base_control_flow2_alt4.nit:47,2--51,4: Warning: use 'loop' instead of 'while true do'.
-alt/base_control_flow2_alt4.nit:45,1--55,3: Warning: use 'loop' instead of 'while true do'.
+alt/base_control_flow2_alt4.nit:47,2--51,4: Warning: use `loop` instead of `while true do`.
+alt/base_control_flow2_alt4.nit:45,1--55,3: Warning: use `loop` instead of `while true do`.
index fb86643..593356c 100644 (file)
@@ -1,5 +1,5 @@
-alt/base_control_flow2_alt5.nit:21,1--25,3: Warning: use 'loop' instead of 'while true do'.
-alt/base_control_flow2_alt5.nit:39,1--43,3: Warning: use 'loop' instead of 'while true do'.
-alt/base_control_flow2_alt5.nit:47,2--51,4: Warning: use 'loop' instead of 'while true do'.
+alt/base_control_flow2_alt5.nit:21,1--25,3: Warning: use `loop` instead of `while true do`.
+alt/base_control_flow2_alt5.nit:39,1--43,3: Warning: use `loop` instead of `while true do`.
+alt/base_control_flow2_alt5.nit:47,2--51,4: Warning: use `loop` instead of `while true do`.
 alt/base_control_flow2_alt5.nit:54,2: Error: unreachable statement.
-alt/base_control_flow2_alt5.nit:45,1--55,3: Warning: use 'loop' instead of 'while true do'.
+alt/base_control_flow2_alt5.nit:45,1--55,3: Warning: use `loop` instead of `while true do`.
index a0ff1f6..e035bfc 100644 (file)
@@ -1,5 +1,5 @@
-alt/base_control_flow2_alt6.nit:21,1--25,3: Warning: use 'loop' instead of 'while true do'.
-alt/base_control_flow2_alt6.nit:39,1--43,3: Warning: use 'loop' instead of 'while true do'.
-alt/base_control_flow2_alt6.nit:47,2--51,4: Warning: use 'loop' instead of 'while true do'.
-alt/base_control_flow2_alt6.nit:45,1--55,3: Warning: use 'loop' instead of 'while true do'.
+alt/base_control_flow2_alt6.nit:21,1--25,3: Warning: use `loop` instead of `while true do`.
+alt/base_control_flow2_alt6.nit:39,1--43,3: Warning: use `loop` instead of `while true do`.
+alt/base_control_flow2_alt6.nit:47,2--51,4: Warning: use `loop` instead of `while true do`.
+alt/base_control_flow2_alt6.nit:45,1--55,3: Warning: use `loop` instead of `while true do`.
 alt/base_control_flow2_alt6.nit:60,2: Error: unreachable statement.
index b157466..a27882c 100644 (file)
@@ -1,5 +1,5 @@
-alt/base_control_flow2_alt7.nit:21,1--25,3: Warning: use 'loop' instead of 'while true do'.
-alt/base_control_flow2_alt7.nit:39,1--43,3: Warning: use 'loop' instead of 'while true do'.
-alt/base_control_flow2_alt7.nit:47,2--51,4: Warning: use 'loop' instead of 'while true do'.
-alt/base_control_flow2_alt7.nit:45,1--55,3: Warning: use 'loop' instead of 'while true do'.
+alt/base_control_flow2_alt7.nit:21,1--25,3: Warning: use `loop` instead of `while true do`.
+alt/base_control_flow2_alt7.nit:39,1--43,3: Warning: use `loop` instead of `while true do`.
+alt/base_control_flow2_alt7.nit:47,2--51,4: Warning: use `loop` instead of `while true do`.
+alt/base_control_flow2_alt7.nit:45,1--55,3: Warning: use `loop` instead of `while true do`.
 alt/base_control_flow2_alt7.nit:67,2: Error: unreachable statement.
diff --git a/tests/sav/base_deprecated.res b/tests/sav/base_deprecated.res
new file mode 100644 (file)
index 0000000..9c0980e
--- /dev/null
@@ -0,0 +1,2 @@
+base_deprecated.nit:33,3--5: Deprecation Warning: Method 'foo' is deprecated: Documentation
+base_deprecated.nit:34,3--5: Deprecation Warning: Method 'bar' is deprecated.
diff --git a/tests/sav/base_deprecated_alt1.res b/tests/sav/base_deprecated_alt1.res
new file mode 100644 (file)
index 0000000..2b2e2c0
--- /dev/null
@@ -0,0 +1 @@
+alt/base_deprecated_alt1.nit:38,12--17: Error: method redefinition cannot be deprecated.
index e0e3b61..0f97e5d 100644 (file)
@@ -28,7 +28,7 @@ error_expr_not_ok.nit:64,30--33: Error: Method or variable 'fail' unknown in Sys
 error_expr_not_ok.nit:66,7--10: Error: Method or variable 'fail' unknown in Sys.
 error_expr_not_ok.nit:66,21: Type error: expected A, got Int
 error_expr_not_ok.nit:67,15--18: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:67,1--18: Warning: use 'loop' instead of 'while true do'.
+error_expr_not_ok.nit:67,1--18: Warning: use `loop` instead of `while true do`.
 error_expr_not_ok.nit:69,10--13: Error: Method or variable 'fail' unknown in Sys.
 error_expr_not_ok.nit:70,20--23: Error: Method or variable 'fail' unknown in Sys.
 error_expr_not_ok.nit:71,8--11: Error: Method or variable 'fail' unknown in Sys.
index b798295..0c99ab8 100644 (file)
@@ -10,7 +10,7 @@ alt/error_expr_not_ok_alt2.nit:43,1--8: Error: Method 'fail' doesn't exists in I
 alt/error_expr_not_ok_alt2.nit:60,20: Type error: expected A, got Int
 alt/error_expr_not_ok_alt2.nit:62,7--27: Type error: expected A, got Int
 alt/error_expr_not_ok_alt2.nit:66,21: Type error: expected A, got Int
-alt/error_expr_not_ok_alt2.nit:67,1--18: Warning: use 'loop' instead of 'while true do'.
+alt/error_expr_not_ok_alt2.nit:67,1--18: Warning: use `loop` instead of `while true do`.
 alt/error_expr_not_ok_alt2.nit:73,7--18: Type error: expected A, got Bool
 alt/error_expr_not_ok_alt2.nit:74,7--18: Type error: expected A, got Bool
 alt/error_expr_not_ok_alt2.nit:75,7--18: Type error: expected A, got Bool
index 2da48e6..e1a8294 100644 (file)
@@ -10,7 +10,7 @@ alt/error_expr_not_ok_alt3.nit:43,1--8: Error: Method 'fail' doesn't exists in I
 alt/error_expr_not_ok_alt3.nit:60,20: Type error: expected A, got Int
 alt/error_expr_not_ok_alt3.nit:62,7--27: Type error: expected A, got Int
 alt/error_expr_not_ok_alt3.nit:66,21: Type error: expected A, got Int
-alt/error_expr_not_ok_alt3.nit:67,1--18: Warning: use 'loop' instead of 'while true do'.
+alt/error_expr_not_ok_alt3.nit:67,1--18: Warning: use `loop` instead of `while true do`.
 alt/error_expr_not_ok_alt3.nit:73,7--18: Type error: expected A, got Bool
 alt/error_expr_not_ok_alt3.nit:74,7--18: Type error: expected A, got Bool
 alt/error_expr_not_ok_alt3.nit:75,7--18: Type error: expected A, got Bool
index 0e3f1e5..01f96ed 100644 (file)
@@ -20,7 +20,7 @@ alt/error_expr_not_ok_alt4.nit:63,7--30: Type error: expected A, got Int
 alt/error_expr_not_ok_alt4.nit:64,7--33: Type error: expected A, got Int
 alt/error_expr_not_ok_alt4.nit:66,7--10: Type error: expected Bool, got Int
 alt/error_expr_not_ok_alt4.nit:66,21: Type error: expected A, got Int
-alt/error_expr_not_ok_alt4.nit:67,1--18: Warning: use 'loop' instead of 'while true do'.
+alt/error_expr_not_ok_alt4.nit:67,1--18: Warning: use `loop` instead of `while true do`.
 alt/error_expr_not_ok_alt4.nit:69,24: Type error: expected A, got Int
 alt/error_expr_not_ok_alt4.nit:69,1--25: Type Error: 'for' expects a type providing 'iterator' method, got 'Int'.
 alt/error_expr_not_ok_alt4.nit:69,1--25: Error: Method 'iterator' doesn't exists in Int.
index b85ac5b..98e1d46 100644 (file)
@@ -15,7 +15,7 @@ alt/error_expr_not_ok_alt5.nit:63,7--30: Type error: expected A, got Int
 alt/error_expr_not_ok_alt5.nit:64,7--33: Type error: expected A, got Int
 alt/error_expr_not_ok_alt5.nit:66,7--10: Type error: expected Bool, got Int
 alt/error_expr_not_ok_alt5.nit:66,21: Type error: expected A, got Int
-alt/error_expr_not_ok_alt5.nit:67,1--18: Warning: use 'loop' instead of 'while true do'.
+alt/error_expr_not_ok_alt5.nit:67,1--18: Warning: use `loop` instead of `while true do`.
 alt/error_expr_not_ok_alt5.nit:69,24: Type error: expected A, got Int
 alt/error_expr_not_ok_alt5.nit:69,1--25: Type Error: 'for' expects a type providing 'iterator' method, got 'Int'.
 alt/error_expr_not_ok_alt5.nit:69,1--25: Error: Method 'iterator' doesn't exists in Int.
index 039e32d..efeddc2 100644 (file)
@@ -19,7 +19,7 @@ alt/error_expr_not_ok_alt6.nit:63,7--30: Type error: expected A, got Int
 alt/error_expr_not_ok_alt6.nit:64,7--33: Type error: expected A, got Int
 alt/error_expr_not_ok_alt6.nit:66,7--10: Type error: expected Bool, got Int
 alt/error_expr_not_ok_alt6.nit:66,21: Type error: expected A, got Int
-alt/error_expr_not_ok_alt6.nit:67,1--18: Warning: use 'loop' instead of 'while true do'.
+alt/error_expr_not_ok_alt6.nit:67,1--18: Warning: use `loop` instead of `while true do`.
 alt/error_expr_not_ok_alt6.nit:69,24: Type error: expected A, got Int
 alt/error_expr_not_ok_alt6.nit:69,1--25: Type Error: 'for' expects a type providing 'iterator' method, got 'Int'.
 alt/error_expr_not_ok_alt6.nit:69,1--25: Error: Method 'iterator' doesn't exists in Int.
index b4df42d..1c9f8a5 100644 (file)
@@ -1,2 +1,2 @@
 error_fun_ret4.nit:17,5--8: Control error: Reached end of function (a 'return' with a value was expected).
-error_fun_ret4.nit:19,2--22,4: Warning: use 'loop' instead of 'while true do'.
+error_fun_ret4.nit:19,2--22,4: Warning: use `loop` instead of `while true do`.
diff --git a/tests/sav/fixme/nitpretty_args21.res b/tests/sav/fixme/nitpretty_args21.res
new file mode 100644 (file)
index 0000000..f4a3324
--- /dev/null
@@ -0,0 +1,87 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import end
+intrude import standard::kernel
+private import standard::string
+
+`{`}
+
+`{
+#ifdef truc
+       #undef truc
+#endif
+`}
+
+in "C headers" `{
+       #include <errno.h>
+`}
+
+fun err: Int is extern `{ return 1; `}
+
+fun errno: Int is extern `{
+       return errno;
+`}
+
+fun errnoooooooooooooooooooooooooooooooooooooooooooooooooooooooooo: Int is extern `{
+        return errno;
+`}
+
+private class A
+       var my_attr = 1234
+
+       fun baz(msg: String) import String.length, String.to_cstring, my_attr, my_attr= `{
+               char *c_msg;
+               int msg_len;
+
+               /* String_to_cstring isa a allback to msg.to_cstring */
+               c_msg = String_to_cstring( msg );
+
+               /* String_length is a callback to msg.length */
+               msg_len = String_length( msg );
+
+               printf( "received msg: %s, of length = %d\n", c_msg, msg_len );
+
+               /* A_my_attr is a callback to the getter of self.my_attr */
+               printf( "old attr %d\n", A_my_attr(recv) );
+
+               if(chose)
+                       truc;
+               else
+                       chose;
+
+               /* A_my_attr is a callback to the setter of self.my_attr= */
+               A_my_attr__assign( recv, msg_len );
+       `}
+end
+
+extern class TimeT `{time_t`}
+       new `{ return time(NULL); `}
+       new from_i(i: Int) `{ return i; `}
+       fun update `{ time(&recv); `}
+
+       fun ctime: String import NativeString.to_s_with_copy `{
+               return NativeString_to_s_with_copy( ctime(&recv) );
+       `}
+
+       # Difference in secondes from start (self if the end time)
+       fun difftime(start: TimeT): Float `{ return difftime(recv, start); `}
+
+       private fun intern_poll(in_fds: Array[Int], out_fds: Array[Int]): nullable Int is import
+               Array[Int].length, Array[Int].[], Int.as(nullable Int) `{`}
+end
+
+fun address_is_null: Bool is extern "address_is_null"
+
+fun free `{ free(recv); `}
diff --git a/tests/sav/fixme/nitpretty_args22.res b/tests/sav/fixme/nitpretty_args22.res
new file mode 100644 (file)
index 0000000..4ad3dc3
--- /dev/null
@@ -0,0 +1 @@
+UNDEFINED
index a61c3d8..6dae4e5 100644 (file)
@@ -1,3 +1,3 @@
 Usage: nit [OPTION]... <file.nit>...
-Interprets and debbugs Nit programs.
+Interprets and debugs Nit programs.
 Use --help for help
index 6a4d282..33325f6 100644 (file)
@@ -23,7 +23,7 @@
 </span><span class="line" id="L23"><span class="nc_k">end</span>
 </span></span><span class="line" id="L24">
 </span><span class="nc_cdef foldable" id="base_simple3#Int"><span class="line" id="L25"><span class="nc_k">enum</span> <span class="nc_def nc_t popupable" title="class Int" data-title="&lt;a href=&quot;base_simple3.html#base_simple3#Int&quot;&gt;class Int&lt;/a&gt;" data-content="&lt;div&gt;&lt;b&gt;class&lt;/b&gt; &lt;span&gt;Int&lt;/span&gt;&lt;br/&gt;&lt;div class=&quot;dropdown&quot;&gt; &lt;a data-toggle=&quot;dropdown&quot; href=&quot;#&quot;&gt;&lt;b&gt;hier&lt;/b&gt; super-classes&lt;span class=&quot;caret&quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;ul class=&quot;dropdown-menu&quot; role=&quot;menu&quot; aria-labelledby=&quot;dLabel&quot;&gt;&lt;li&gt;&lt;a href=&quot;base_simple3.html#base_simple3#Object&quot;&gt;Object&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;" data-toggle="popover">Int</span>
-</span><span class="nc_pdef foldable" id="base_simple3#Int#output"><span class="line" id="L26">        <span class="nc_k">fun</span> <span class="nc_def popupable" title="base_simple3#Int#output" data-title="&lt;a href=&quot;base_simple3.html#base_simple3#Int#output&quot;&gt;base_simple3#Int#output&lt;/a&gt;" data-content="&lt;div&gt;&lt;b&gt;fun&lt;/b&gt; &lt;span&gt;output&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;/div&gt;" data-toggle="popover"><span class="nc_i">output</span></span> <span class="nc_k">is</span> <span class="nc_k">intern</span>
+</span><span class="nc_pdef foldable" id="base_simple3#Int#output"><span class="line" id="L26">        <span class="nc_k">fun</span> <span class="nc_def popupable" title="base_simple3#Int#output" data-title="&lt;a href=&quot;base_simple3.html#base_simple3#Int#output&quot;&gt;base_simple3#Int#output&lt;/a&gt;" data-content="&lt;div&gt;&lt;b&gt;fun&lt;/b&gt; &lt;span&gt;output&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;/div&gt;" data-toggle="popover"><span class="nc_i">output</span></span> <span class="nc_k">is</span> <span class="nc_i">intern</span>
 </span></span><span class="line" id="L27"><span class="nc_k">end</span>
 </span></span><span class="line" id="L28">
 </span><span class="nc_cdef foldable" id="base_simple3#A"><span class="line" id="L29"><span class="nc_k">class</span> <span class="nc_def nc_t popupable" title="class A" data-title="&lt;a href=&quot;base_simple3.html#base_simple3#A&quot;&gt;class A&lt;/a&gt;" data-content="&lt;div&gt;&lt;b&gt;class&lt;/b&gt; &lt;span&gt;A&lt;/span&gt;&lt;br/&gt;&lt;div class=&quot;dropdown&quot;&gt; &lt;a data-toggle=&quot;dropdown&quot; href=&quot;#&quot;&gt;&lt;b&gt;hier&lt;/b&gt; super-classes&lt;span class=&quot;caret&quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;ul class=&quot;dropdown-menu&quot; role=&quot;menu&quot; aria-labelledby=&quot;dLabel&quot;&gt;&lt;li&gt;&lt;a href=&quot;base_simple3.html#base_simple3#Object&quot;&gt;Object&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;" data-toggle="popover">A</span>
diff --git a/tests/sav/nitmd.res b/tests/sav/nitmd.res
new file mode 100644 (file)
index 0000000..3d4be6f
--- /dev/null
@@ -0,0 +1 @@
+usage: nitmd <file.md>
index 979a95a..e706f2c 100644 (file)
@@ -372,73 +372,74 @@ Distribution of direct smallers
   <=8: sub-population=1 (14.28%); cumulated value=6 (100.00%)
 --- AST Metrics ---
 ## All nodes of the AST
- population: 47
+ population: 48
  minimum value: 1
- maximum value: 39
- total value: 256
- average value: 5.44
+ maximum value: 40
+ total value: 261
+ average value: 5.43
  distribution:
-  <=1: sub-population=13 (27.65%); cumulated value=13 (5.07%)
-  <=2: sub-population=6 (12.76%); cumulated value=12 (4.68%)
-  <=4: sub-population=10 (21.27%); cumulated value=32 (12.50%)
-  <=8: sub-population=10 (21.27%); cumulated value=61 (23.82%)
-  <=16: sub-population=4 (8.51%); cumulated value=44 (17.18%)
-  <=32: sub-population=3 (6.38%); cumulated value=55 (21.48%)
-  <=64: sub-population=1 (2.12%); cumulated value=39 (15.23%)
+  <=1: sub-population=15 (31.25%); cumulated value=15 (5.74%)
+  <=2: sub-population=5 (10.41%); cumulated value=10 (3.83%)
+  <=4: sub-population=10 (20.83%); cumulated value=32 (12.26%)
+  <=8: sub-population=10 (20.83%); cumulated value=64 (24.52%)
+  <=16: sub-population=4 (8.33%); cumulated value=44 (16.85%)
+  <=32: sub-population=3 (6.25%); cumulated value=56 (21.45%)
+  <=64: sub-population=1 (2.08%); cumulated value=40 (15.32%)
  list:
-  TId: 39 (15.23%)
-  AListExprs: 19 (7.42%)
-  APublicVisibility: 18 (7.03%)
-  ACallExpr: 18 (7.03%)
-  TClassid: 15 (5.85%)
-  TNumber: 10 (3.90%)
-  ADecIntExpr: 10 (3.90%)
-  AType: 9 (3.51%)
-  TKwend: 8 (3.12%)
-  ASignature: 8 (3.12%)
+  TId: 40 (15.32%)
+  APublicVisibility: 19 (7.27%)
+  AListExprs: 19 (7.27%)
+  ACallExpr: 18 (6.89%)
+  TClassid: 15 (5.74%)
+  TNumber: 10 (3.83%)
+  ADecIntExpr: 10 (3.83%)
+  AType: 9 (3.44%)
+  TKwend: 8 (3.06%)
+  ASignature: 8 (3.06%)
   ...
-  AModule: 1 (0.39%)
-  ACallAssignExpr: 1 (0.39%)
-  AMainClassdef: 1 (0.39%)
-  AReturnExpr: 1 (0.39%)
-  TKwreturn: 1 (0.39%)
-  TKwinterface: 1 (0.39%)
-  ANoImport: 1 (0.39%)
-  AInterfaceClasskind: 1 (0.39%)
-  AMainMethPropdef: 1 (0.39%)
-  TKwimport: 1 (0.39%)
+  ACallAssignExpr: 1 (0.38%)
+  AAnnotations: 1 (0.38%)
+  AReturnExpr: 1 (0.38%)
+  TKwreturn: 1 (0.38%)
+  AInterfaceClasskind: 1 (0.38%)
+  TKwinterface: 1 (0.38%)
+  ANoImport: 1 (0.38%)
+  AMainMethPropdef: 1 (0.38%)
+  AMainClassdef: 1 (0.38%)
+  TKwimport: 1 (0.38%)
 ## All identifiers of the AST
- population: 19
+ population: 20
  minimum value: 1
  maximum value: 11
- total value: 54
- average value: 2.84
+ total value: 55
+ average value: 2.75
  distribution:
-  <=1: sub-population=2 (10.52%); cumulated value=2 (3.70%)
-  <=2: sub-population=12 (63.15%); cumulated value=24 (44.44%)
-  <=4: sub-population=3 (15.78%); cumulated value=10 (18.51%)
-  <=8: sub-population=1 (5.26%); cumulated value=7 (12.96%)
-  <=16: sub-population=1 (5.26%); cumulated value=11 (20.37%)
+  <=1: sub-population=3 (15.00%); cumulated value=3 (5.45%)
+  <=2: sub-population=12 (60.00%); cumulated value=24 (43.63%)
+  <=4: sub-population=3 (15.00%); cumulated value=10 (18.18%)
+  <=8: sub-population=1 (5.00%); cumulated value=7 (12.72%)
+  <=16: sub-population=1 (5.00%); cumulated value=11 (20.00%)
  list:
-  output: 11 (20.37%)
-  Int: 7 (12.96%)
-  run: 4 (7.40%)
-  c: 3 (5.55%)
-  val: 3 (5.55%)
-  i: 2 (3.70%)
-  bar: 2 (3.70%)
-  foo: 2 (3.70%)
-  val2: 2 (3.70%)
-  val1: 2 (3.70%)
-  C: 2 (3.70%)
-  v: 2 (3.70%)
-  baz: 2 (3.70%)
-  a: 2 (3.70%)
-  A: 2 (3.70%)
-  B: 2 (3.70%)
-  b: 2 (3.70%)
-  Object: 1 (1.85%)
-  Bool: 1 (1.85%)
+  output: 11 (20.00%)
+  Int: 7 (12.72%)
+  run: 4 (7.27%)
+  c: 3 (5.45%)
+  val: 3 (5.45%)
+  i: 2 (3.63%)
+  bar: 2 (3.63%)
+  foo: 2 (3.63%)
+  val2: 2 (3.63%)
+  val1: 2 (3.63%)
+  C: 2 (3.63%)
+  v: 2 (3.63%)
+  baz: 2 (3.63%)
+  a: 2 (3.63%)
+  A: 2 (3.63%)
+  B: 2 (3.63%)
+  b: 2 (3.63%)
+  intern: 1 (1.81%)
+  Object: 1 (1.81%)
+  Bool: 1 (1.81%)
 --- Metrics of refinement usage ---
 Number of modules: 1
 
diff --git a/tests/sav/nitpick.res b/tests/sav/nitpick.res
new file mode 100644 (file)
index 0000000..8d05ccb
--- /dev/null
@@ -0,0 +1,3 @@
+Usage: nitpick [OPTION]... <file.nit>...
+Collect potential style and code issues.
+Use --help for help
index b04cd1d..e3183bb 100644 (file)
@@ -19,11 +19,11 @@ class A
        var d: Int = 10
 
        # Test test...
-       var e: Int writable
+       var e: Int is writable
 
-       var f: Int protected writable
+       var f: Int is protected writable
 
        # Adoc
-       var k: Int protected writable = 10
+       var k: Int = 10 is protected writable
        # more comments
 end # end
index 5b727f7..08a4d49 100644 (file)
 # limitations under the License.
 
 class Foo
-       var _a: Int
-       private var _b: nullable Int
-       protected var _c = 10
-       var _d: Int = 10
+       var a: Int
+       private var b: nullable Int
+       protected var c = 10
+       var d: Int = 10
 end
 
 var foo = new Foo(1, 2)
diff --git a/tests/sav/nituml.res b/tests/sav/nituml.res
new file mode 100644 (file)
index 0000000..e50ad70
--- /dev/null
@@ -0,0 +1,2 @@
+Usage: [OPTION]... [ARG]...
+Use --help for help
diff --git a/tests/sav/nituml_args1.res b/tests/sav/nituml_args1.res
new file mode 100644 (file)
index 0000000..ecae7b8
--- /dev/null
@@ -0,0 +1,22 @@
+digraph G {
+       fontname = "Bitstream Vera Sans"
+                       fontsize = 8
+                       node [
+                               fontname = "Bitstream Vera Sans"
+                               fontsize = 8
+                               shape = "record"
+                       ]
+                       edge [
+                               fontname = "Bitstream Vera Sans"
+                               fontsize = 8
+                       ]
+subgraph clusterbase_prot_sig2 {
+label = "base_prot_sig2"
+base_prot_sig2C [
+       label = "{C|- _vpriA: nullable A\l- _vpriA2: A\l|- priA(a: A)\l- vpriA(): nullable A\l- vpriA=(vpriA: nullable A)\l- vpriA2(): A\l- vpriA2=(vpriA2: A)\l+ init()\l}"color="#58B26A"
+]
+base_prot_sig2D [
+       label = "{D|- _vpubA: nullable A\l- _vpriA: nullable A\l- _vpubA2: A\l- _vpriA2: A\l|- pubA(a: A)\l- priA(a: A)\l- vpubA(): nullable A\l- vpubA=(vpubA: nullable A)\l- vpriA(): nullable A\l- vpriA=(vpriA: nullable A)\l- vpubA2(): A\l- vpubA2=(vpubA2: A)\l- vpriA2(): A\l- vpriA2=(vpriA2: A)\l+ init()\l}"color="#58B26A"
+]
+}
+}
diff --git a/tests/sav/nituml_args2.res b/tests/sav/nituml_args2.res
new file mode 100644 (file)
index 0000000..5a9488d
--- /dev/null
@@ -0,0 +1,19 @@
+digraph G {
+       fontname = "Bitstream Vera Sans"
+                       fontsize = 8
+                       node [
+                               fontname = "Bitstream Vera Sans"
+                               fontsize = 8
+                               shape = "record"
+                       ]
+                       edge [
+                               fontname = "Bitstream Vera Sans"
+                               fontsize = 8
+                       ]
+subgraph clusterbase_prot_sig2 {
+label = "base_prot_sig2"
+base_prot_sig2C [
+       label = "{C||+ init()\l}"color="#58B26A"
+]
+}
+}
diff --git a/tests/sav/nituml_args3.res b/tests/sav/nituml_args3.res
new file mode 100644 (file)
index 0000000..af28f14
--- /dev/null
@@ -0,0 +1,84 @@
+digraph G {
+       fontname = "Bitstream Vera Sans"
+                               fontsize = 8
+                               node [
+                                       fontname = "Bitstream Vera Sans"
+                                       fontsize = 8
+                                       shape = "record"
+                               ]
+
+                               edge [
+                                       fontname = "Bitstream Vera Sans"
+                                       fontsize = 8
+                               ]
+Object [
+ label = "{interface\nObject||+ object_id(): Int\l+ is_same_type(other: Object): Bool\l+ is_same_instance(other: nullable Object): Bool\l+ ==(other: nullable Object): Bool\l+ !=(other: nullable Object): Bool\l+ output()\l+ output_class_name()\l+ hash(): Int\l+ exit(exit_value: Int)\l+ sys(): Sys\l}"
+]
+
+Sys [
+ label = "{Sys||+ main()\l+ run()\l+ errno(): Int\l}"
+]
+Object -> Sys [dir=back arrowtail=open style=dashed];
+
+Comparable [
+ label = "{interface\nComparable||+ \<(other: OTHER): Bool\l+ \<=(other: OTHER): Bool\l+ \>=(other: OTHER): Bool\l+ \>(other: OTHER): Bool\l+ \<=\>(other: OTHER): Int\l+ is_between(c: OTHER, d: OTHER): Bool\l+ max(other: OTHER): OTHER\l+ min(c: OTHER): OTHER\l}"
+]
+Object -> Comparable [dir=back arrowtail=open style=dashed];
+
+Discrete [
+ label = "{interface\nDiscrete||+ successor(i: Int): OTHER\l+ predecessor(i: Int): OTHER\l+ distance(d: OTHER): Int\l}"
+]
+Comparable -> Discrete [dir=back arrowtail=open style=dashed];
+
+Numeric [
+ label = "{interface\nNumeric||+ +(i: OTHER): OTHER\l+ -(i: OTHER): OTHER\l+ unary -(): OTHER\l+ *(i: OTHER): OTHER\l+ /(i: OTHER): OTHER\l+ to_i(): Int\l+ to_f(): Float\l+ is_zero(): Bool\l+ zero(): OTHER\l+ value_of(val: Numeric): OTHER\l}"
+]
+Comparable -> Numeric [dir=back arrowtail=open style=dashed];
+
+Bool [
+ label = "{Bool||+ to_i(): Int\l}"
+]
+Object -> Bool [dir=back arrowtail=open style=dashed];
+
+Float [
+ label = "{Float||}"
+]
+Numeric -> Float [dir=back arrowtail=open style=dashed];
+
+Int [
+ label = "{Int||+ %(i: Int): Int\l+ lshift(i: Int): Int\l+ rshift(i: Int): Int\l+ ascii(): Char\l+ digit_count(b: Int): Int\l+ digit_count_base_10(): Int\l+ to_c(): Char\l+ abs(): Int\l}"
+]
+Discrete -> Int [dir=back arrowtail=open style=dashed];
+Numeric -> Int [dir=back arrowtail=open style=dashed];
+
+Char [
+ label = "{Char||+ to_i(): Int\l+ ascii(): Int\l+ to_lower(): Char\l+ to_upper(): Char\l+ is_digit(): Bool\l+ is_lower(): Bool\l+ is_upper(): Bool\l+ is_letter(): Bool\l}"
+]
+Discrete -> Char [dir=back arrowtail=open style=dashed];
+
+Pointer [
+ label = "{Pointer||+ address_is_null(): Bool\l+ free()\l}"
+]
+Object -> Pointer [dir=back arrowtail=open style=dashed];
+
+A [
+ label = "{A|- _vpubA: nullable A\l- _vproA: nullable A\l- _vpriA: nullable A\l- _vpubA2: A\l- _vproA2: A\l- _vpriA2: A\l- _vpriB: nullable B\l- _vpriB2: B\l|+ pubA(a: A)\l# proA(a: A)\l- priA(a: A)\l+ vpubA(): nullable A\l+ vpubA=(vpubA: nullable A)\l# vproA(): nullable A\l# vproA=(vproA: nullable A)\l- vpriA(): nullable A\l- vpriA=(vpriA: nullable A)\l+ vpubA2(): A\l+ vpubA2=(vpubA2: A)\l# vproA2(): A\l# vproA2=(vproA2: A)\l- vpriA2(): A\l- vpriA2=(vpriA2: A)\l- priB(a: B)\l- vpriB(): nullable B\l- vpriB=(vpriB: nullable B)\l- vpriB2(): B\l- vpriB2=(vpriB2: B)\l}"
+]
+Object -> A [dir=back arrowtail=open style=dashed];
+
+B [
+ label = "{B|- _vpubA: nullable A\l- _vpriA: nullable A\l- _vpubA2: A\l- _vpriA2: A\l- _vpubB: nullable B\l- _vpriB: nullable B\l- _vpubB2: B\l- _vpriB2: B\l|- pubA(a: A)\l- priA(a: A)\l- vpubA(): nullable A\l- vpubA=(vpubA: nullable A)\l- vpriA(): nullable A\l- vpriA=(vpriA: nullable A)\l- vpubA2(): A\l- vpubA2=(vpubA2: A)\l- vpriA2(): A\l- vpriA2=(vpriA2: A)\l- pubB(a: B)\l- priB(a: B)\l- vpubB(): nullable B\l- vpubB=(vpubB: nullable B)\l- vpriB(): nullable B\l- vpriB=(vpriB: nullable B)\l- vpubB2(): B\l- vpubB2=(vpubB2: B)\l- vpriB2(): B\l- vpriB2=(vpriB2: B)\l}"
+]
+Object -> B [dir=back arrowtail=open style=dashed];
+
+C [
+ label = "{C|- _vpriA: nullable A\l- _vpriA2: A\l|- priA(a: A)\l- vpriA(): nullable A\l- vpriA=(vpriA: nullable A)\l- vpriA2(): A\l- vpriA2=(vpriA2: A)\l}"
+]
+Object -> C [dir=back arrowtail=open style=dashed];
+
+D [
+ label = "{D|- _vpubA: nullable A\l- _vpriA: nullable A\l- _vpubA2: A\l- _vpriA2: A\l|- pubA(a: A)\l- priA(a: A)\l- vpubA(): nullable A\l- vpubA=(vpubA: nullable A)\l- vpriA(): nullable A\l- vpriA=(vpriA: nullable A)\l- vpubA2(): A\l- vpubA2=(vpubA2: A)\l- vpriA2(): A\l- vpriA2=(vpriA2: A)\l}"
+]
+Object -> D [dir=back arrowtail=open style=dashed];
+
+}
diff --git a/tests/sav/nituml_args4.res b/tests/sav/nituml_args4.res
new file mode 100644 (file)
index 0000000..6189897
--- /dev/null
@@ -0,0 +1,74 @@
+digraph G {
+       fontname = "Bitstream Vera Sans"
+                               fontsize = 8
+                               node [
+                                       fontname = "Bitstream Vera Sans"
+                                       fontsize = 8
+                                       shape = "record"
+                               ]
+
+                               edge [
+                                       fontname = "Bitstream Vera Sans"
+                                       fontsize = 8
+                               ]
+Object [
+ label = "{interface\nObject||+ object_id(): Int\l+ is_same_type(other: Object): Bool\l+ is_same_instance(other: nullable Object): Bool\l+ ==(other: nullable Object): Bool\l+ !=(other: nullable Object): Bool\l+ output()\l+ output_class_name()\l+ hash(): Int\l+ exit(exit_value: Int)\l+ sys(): Sys\l}"
+]
+
+Sys [
+ label = "{Sys||+ main()\l+ run()\l+ errno(): Int\l}"
+]
+Object -> Sys [dir=back arrowtail=open style=dashed];
+
+Comparable [
+ label = "{interface\nComparable||+ \<(other: OTHER): Bool\l+ \<=(other: OTHER): Bool\l+ \>=(other: OTHER): Bool\l+ \>(other: OTHER): Bool\l+ \<=\>(other: OTHER): Int\l+ is_between(c: OTHER, d: OTHER): Bool\l+ max(other: OTHER): OTHER\l+ min(c: OTHER): OTHER\l}"
+]
+Object -> Comparable [dir=back arrowtail=open style=dashed];
+
+Discrete [
+ label = "{interface\nDiscrete||+ successor(i: Int): OTHER\l+ predecessor(i: Int): OTHER\l+ distance(d: OTHER): Int\l}"
+]
+Comparable -> Discrete [dir=back arrowtail=open style=dashed];
+
+Numeric [
+ label = "{interface\nNumeric||+ +(i: OTHER): OTHER\l+ -(i: OTHER): OTHER\l+ unary -(): OTHER\l+ *(i: OTHER): OTHER\l+ /(i: OTHER): OTHER\l+ to_i(): Int\l+ to_f(): Float\l+ is_zero(): Bool\l+ zero(): OTHER\l+ value_of(val: Numeric): OTHER\l}"
+]
+Comparable -> Numeric [dir=back arrowtail=open style=dashed];
+
+Bool [
+ label = "{Bool||+ to_i(): Int\l}"
+]
+Object -> Bool [dir=back arrowtail=open style=dashed];
+
+Float [
+ label = "{Float||}"
+]
+Numeric -> Float [dir=back arrowtail=open style=dashed];
+
+Int [
+ label = "{Int||+ %(i: Int): Int\l+ lshift(i: Int): Int\l+ rshift(i: Int): Int\l+ ascii(): Char\l+ digit_count(b: Int): Int\l+ digit_count_base_10(): Int\l+ to_c(): Char\l+ abs(): Int\l}"
+]
+Discrete -> Int [dir=back arrowtail=open style=dashed];
+Numeric -> Int [dir=back arrowtail=open style=dashed];
+
+Char [
+ label = "{Char||+ to_i(): Int\l+ ascii(): Int\l+ to_lower(): Char\l+ to_upper(): Char\l+ is_digit(): Bool\l+ is_lower(): Bool\l+ is_upper(): Bool\l+ is_letter(): Bool\l}"
+]
+Discrete -> Char [dir=back arrowtail=open style=dashed];
+
+Pointer [
+ label = "{Pointer||+ address_is_null(): Bool\l+ free()\l}"
+]
+Object -> Pointer [dir=back arrowtail=open style=dashed];
+
+A [
+ label = "{A||+ pubA(a: A)\l+ vpubA(): nullable A\l+ vpubA=(vpubA: nullable A)\l+ vpubA2(): A\l+ vpubA2=(vpubA2: A)\l}"
+]
+Object -> A [dir=back arrowtail=open style=dashed];
+
+C [
+ label = "{C||}"
+]
+Object -> C [dir=back arrowtail=open style=dashed];
+
+}
diff --git a/tests/sav/test_ffi_c_polymorphism.res b/tests/sav/test_ffi_c_polymorphism.res
new file mode 100644 (file)
index 0000000..de98044
--- /dev/null
@@ -0,0 +1,3 @@
+a
+b
+c
diff --git a/tests/sav/test_ffi_c_polymorphism_alt1.res b/tests/sav/test_ffi_c_polymorphism_alt1.res
new file mode 100644 (file)
index 0000000..a2c2d95
--- /dev/null
@@ -0,0 +1 @@
+alt/test_ffi_c_polymorphism_alt1.nit:56,15--25: Type error: expected NativeB, got NativeA
diff --git a/tests/sav/test_ffi_c_polymorphism_alt2.res b/tests/sav/test_ffi_c_polymorphism_alt2.res
new file mode 100644 (file)
index 0000000..58254a5
--- /dev/null
@@ -0,0 +1 @@
+alt/test_ffi_c_polymorphism_alt2.nit:58,12--22: Type error: expected NativeB, got NativeA
index 5291a1e..6106689 100644 (file)
-mprojects:
+# mprojects:
 test_prog
+------------------------------------
 test_prog
-mmodules:
+
+# mmodules:
 careers character combat game platform races rpg test_prog
+------------------------------------
 careers character combat game platform races rpg test_prog
-mclasses:
+
+# mclasses:
 Alcoholic Bool Career Character Combatable Dwarf Elf Float Game Human Int List Magician Object Race Starter String Sys Warrior Weapon
+------------------------------------
 Alcoholic Bool Career Character Combatable Dwarf Elf Float Game Human Int List Magician Object Race Starter String Sys Warrior Weapon
-mproperties:
+
+# mproperties:
 != * * + + - - / / == > > OTHER _age _base_endurance _base_intelligence _base_strength _career _endurance_bonus _health _intelligence_bonus _name _race _sex _strength_bonus age age= attack base_endurance base_endurance= base_intelligence base_intelligence= base_strength base_strength= career career= computer_characters defend direct_attack dps endurance_bonus endurance_bonus= health health= hit_points init intelligence_bonus intelligence_bonus= is_dead main max_health name name= pause_game player_characters quit race race= sex sex= start start_game stop_game strength_bonus strength_bonus= to_f total_endurance total_intelligence total_strengh unary -
+------------------------------------
 != * * + + - - / / == > > OTHER _age _base_endurance _base_intelligence _base_strength _career _endurance_bonus _health _intelligence_bonus _name _race _sex _strength_bonus age age= attack base_endurance base_endurance= base_intelligence base_intelligence= base_strength base_strength= career career= computer_characters defend direct_attack dps endurance_bonus endurance_bonus= health health= hit_points init intelligence_bonus intelligence_bonus= is_dead main max_health name name= pause_game player_characters quit race race= sex sex= start start_game stop_game strength_bonus strength_bonus= to_f total_endurance total_intelligence total_strengh unary -
+
+# msignatures:
+!=(other: OTHER): Bool
+*(f: Float): Float
+*(i: Int): Int
++(f: Float): Float
++(i: Int): Int
+-(i: Int): Int
+-(f: Float): Float
+/(f: Float): Float
+/(i: Int): Int
+==(other: OTHER): Bool
+>(f: Float): Bool
+>(i: Int): Bool
+age: Int
+age=(age: Int)
+attack(target: Combatable, weapon: Weapon): Int
+base_endurance: Int
+base_endurance=(base_endurance: Int)
+base_intelligence: Int
+base_intelligence=(base_intelligence: Int)
+base_strength: Int
+base_strength=(base_strength: Int)
+career: nullable Career
+career=(career: nullable Career)
+computer_characters: List[Character]
+defend(hit: Int): Int
+direct_attack(target: Combatable, weapon: Weapon): Int
+dps: Float
+endurance_bonus: Int
+endurance_bonus=(endurance_bonus: Int)
+health: Int
+health=(health: Int)
+hit_points: Int
+init
+intelligence_bonus: Int
+intelligence_bonus=(intelligence_bonus: Int)
+is_dead: Bool
+main
+max_health: Int
+name: String
+name=(name: String)
+pause_game
+player_characters: List[Character]
+quit
+race: Race
+race=(race: Race)
+sex: Bool
+sex=(sex: Bool)
+start
+start_game
+stop_game
+strength_bonus: Int
+strength_bonus=(strength_bonus: Int)
+to_f: Float
+total_endurance: Int
+total_intelligence: Int
+total_strengh: Int
+unary -: Int
+------------------------------------
+!=(other: OTHER): Bool
+*(f: Float): Float
+*(i: Int): Int
++(f: Float): Float
++(i: Int): Int
+-(i: Int): Int
+-(f: Float): Float
+/(f: Float): Float
+/(i: Int): Int
+==(other: OTHER): Bool
+>(f: Float): Bool
+>(i: Int): Bool
+age: Int
+age=(age: Int)
+attack(target: Combatable, weapon: Weapon): Int
+base_endurance: Int
+base_endurance=(base_endurance: Int)
+base_intelligence: Int
+base_intelligence=(base_intelligence: Int)
+base_strength: Int
+base_strength=(base_strength: Int)
+career: nullable Career
+career=(career: nullable Career)
+computer_characters: List[Character]
+defend(hit: Int): Int
+direct_attack(target: Combatable, weapon: Weapon): Int
+dps: Float
+endurance_bonus: Int
+endurance_bonus=(endurance_bonus: Int)
+health: Int
+health=(health: Int)
+hit_points: Int
+init
+intelligence_bonus: Int
+intelligence_bonus=(intelligence_bonus: Int)
+is_dead: Bool
+main
+max_health: Int
+name: String
+name=(name: String)
+pause_game
+player_characters: List[Character]
+quit
+race: Race
+race=(race: Race)
+sex: Bool
+sex=(sex: Bool)
+start
+start_game
+stop_game
+strength_bonus: Int
+strength_bonus=(strength_bonus: Int)
+to_f: Float
+total_endurance: Int
+total_intelligence: Int
+total_strengh: Int
+unary -: Int
index 3134b52..d5ff252 100644 (file)
@@ -35,7 +35,7 @@ Start ../src/test_parser.nit:17,1--147,1
           TClassid "Int" ../src/test_parser.nit:25,20--22
         ADecIntExpr ../src/test_parser.nit:25,26
           TNumber "0" ../src/test_parser.nit:25,26
-      AConcreteMethPropdef ../src/test_parser.nit:26,2--36,4
+      AMethPropdef ../src/test_parser.nit:26,2--36,4
         TKwredef "redef" ../src/test_parser.nit:26,2--6
         APublicVisibility ../src/test_parser.nit:26,8
         TKwmeth "fun" ../src/test_parser.nit:26,8--10
index 10b0795..fdfc9f0 100644 (file)
@@ -26,7 +26,7 @@
       AListExprs 1,15
 --> AModule 1,1--12
   ATopClassdef 1,1--12
-    AConcreteMethPropdef 1,1--12
+    AMethPropdef 1,1--12
       APublicVisibility 1,1
       TKwmeth "fun" 1,1--3
       AIdMethid 1,5--7
@@ -53,7 +53,7 @@
       TKwend "end" 3,1--3
 --> ... ... ... ... AModule 1,1--5,3
   ATopClassdef 1,1--5,3
-    AConcreteMethPropdef 1,1--5,3
+    AMethPropdef 1,1--5,3
       APublicVisibility 1,1
       TKwmeth "fun" 1,1--3
       AIdMethid 1,5--7
index b3dd2f3..2101194 100644 (file)
@@ -1,4 +1,4 @@
-test_return.nit:45,2--47,4: Warning: use 'loop' instead of 'while true do'.
+test_return.nit:45,2--47,4: Warning: use `loop` instead of `while true do`.
 1
 1
 1
diff --git a/tests/sav/xymus_net.res b/tests/sav/xymus_net.res
new file mode 100644 (file)
index 0000000..a2c25d2
--- /dev/null
@@ -0,0 +1,2 @@
+../examples/nitcorn/src/xymus_net.nit:24,8--14: Error: cannot find module tnitter from nitcorn. tried alt, ../lib, ../examples/nitcorn
+../examples/nitcorn/src/xymus_net.nit:25,8--26: Error: cannot find module benitlux_controller from nitcorn. tried alt, ../lib, ../examples/nitcorn
diff --git a/tests/test_ffi_c_polymorphism.nit b/tests/test_ffi_c_polymorphism.nit
new file mode 100644 (file)
index 0000000..e66fdbc
--- /dev/null
@@ -0,0 +1,58 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2014 Alexis Laferrière <alexis.laf@xymus.net>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+extern class NativeA
+       new `{ return NULL; `}
+       fun foo do print "a"
+end
+
+extern class NativeB
+       super NativeA
+       new `{ return NULL; `}
+       redef fun foo do print "b"
+end
+
+extern class NativeC
+       super NativeA
+       new `{ return NULL; `}
+       redef fun foo do print "c"
+end
+
+class A
+       type NATIVE: NativeA
+       var native: NATIVE
+end
+
+class B
+       super A
+       redef type NATIVE: NativeB
+end
+
+class C
+       super A
+       redef type NATIVE: NativeC
+end
+
+for a in [new A(new NativeA), new B(new NativeB), new C(new NativeC)] do
+       a.native.foo
+end
+
+var a = new A(new NativeA)
+var b = new A(new NativeB)
+var c = new B(new NativeB)
+#alt1# var d = new B(new NativeA)
+a.native = new NativeB
+#alt2# c.native = new NativeA
index e14cef2..ec9f14d 100644 (file)
@@ -23,10 +23,10 @@ class A
 
 
        # Test test...
-       var e: Int writable
-       var f: Int protected writable
+       var e: Int is writable
+       var f: Int is protected writable
        # Adoc
-var k: Int protected writable = 10
+var k: Int = 10 is protected writable
 
 
 
index 5b727f7..08a4d49 100644 (file)
 # limitations under the License.
 
 class Foo
-       var _a: Int
-       private var _b: nullable Int
-       protected var _c = 10
-       var _d: Int = 10
+       var a: Int
+       private var b: nullable Int
+       protected var c = 10
+       var d: Int = 10
 end
 
 var foo = new Foo(1, 2)
index a494875..d97bf9a 100644 (file)
@@ -26,7 +26,7 @@ class Character
 
        # The current `Career` of the character.
        # Returns `null` if character is unemployed.
-       var career: nullable Career writable = null
+       var career: nullable Career = null is writable
 
        fun quit do
                career = null