ruby_parser-3.2.2/0000755000004100000410000000000012250152360014077 5ustar www-datawww-dataruby_parser-3.2.2/Rakefile0000444000004100000410000001151412250152360015544 0ustar www-datawww-data# -*- ruby -*- require 'rubygems' require 'hoe' Hoe.plugin :seattlerb Hoe.plugin :racc Hoe.plugin :isolate Hoe.add_include_dirs "../../sexp_processor/dev/lib" Hoe.add_include_dirs "../../minitest/dev/lib" Hoe.spec 'ruby_parser' do developer 'Ryan Davis', 'ryand-ruby@zenspider.com' self.rubyforge_name = 'parsetree' dependency 'sexp_processor', '~> 4.1' dependency 'rake', '< 10', :developer if plugin? :perforce then self.perforce_ignore << "lib/ruby18_parser.rb" self.perforce_ignore << "lib/ruby19_parser.rb" self.perforce_ignore << "lib/ruby20_parser.rb" end self.racc_flags << " -t" if plugin?(:racc) && ENV["DEBUG"] end file "lib/ruby18_parser.rb" => "lib/ruby18_parser.y" file "lib/ruby19_parser.rb" => "lib/ruby19_parser.y" file "lib/ruby20_parser.rb" => "lib/ruby20_parser.y" task :clean do rm_rf(Dir["**/*~"] + Dir["**/*.diff"] + Dir["coverage.info"] + Dir["coverage"] + Dir["lib/*.output"]) end def next_num(glob) num = Dir[glob].max[/\d+/].to_i + 1 end desc "Compares PT to RP and deletes all files that match" task :compare do files = Dir["unit/**/*.rb"] puts "Parsing #{files.size} files" files.each do |file| puts file system "./cmp.rb -q #{file} && rm #{file}" end system 'find -d unit -type d -empty -exec rmdir {} \;' end task :sort do sh 'grepsort "^ +def" lib/ruby_lexer.rb' sh 'grepsort "^ +def (test|util)" test/test_ruby_lexer.rb' end task :loc do loc1 = `wc -l ../1.0.0/lib/ruby_lexer.rb`[/\d+/] flog1 = `flog -s ../1.0.0/lib/ruby_lexer.rb`[/\d+\.\d+/] loc2 = `cat lib/ruby_lexer.rb lib/ruby_parser_extras.rb | wc -l`[/\d+/] flog2 = `flog -s lib/ruby_lexer.rb lib/ruby_parser_extras.rb`[/\d+\.\d+/] loc1, loc2, flog1, flog2 = loc1.to_i, loc2.to_i, flog1.to_f, flog2.to_f puts "1.0.0: loc = #{loc1} flog = #{flog1}" puts "dev : loc = #{loc2} flog = #{flog2}" puts "delta: loc = #{loc2-loc1} flog = #{flog2-flog1}" end desc "Validate against all normal files in unit dir" task :validate do sh "./cmp.rb unit/*.rb" end def run_and_log cmd, prefix files = ENV['FILES'] || 'unit/*.rb' p, x = prefix, "txt" n = Dir["#{p}.*.#{x}"].map { |s| s[/\d+/].to_i }.max + 1 rescue 1 f = "#{p}.#{n}.#{x}" sh "#{cmd} #{Hoe::RUBY_FLAGS} bin/ruby_parse -q -g #{files} &> #{f}" puts File.read(f) end desc "Benchmark against all normal files in unit dir" task :benchmark do run_and_log "ruby", "benchmark" end desc "Profile against all normal files in unit dir" task :profile do run_and_log "zenprofile", "profile" end desc "what was that command again?" task :huh? do puts "ruby #{Hoe::RUBY_FLAGS} bin/ruby_parse -q -g ..." end task :irb => [:isolate] do sh "GEM_HOME=#{Gem.path.first} irb -rubygems -Ilib -rruby_parser;" end def (task(:phony)).timestamp Time.at 0 end task :isolate => :phony file "lib/ruby18_parser.rb" => :isolate file "lib/ruby19_parser.rb" => :isolate file "lib/ruby20_parser.rb" => :isolate task :compare18 do sh "./yack.rb lib/ruby18_parser.output > racc18.txt" sh "./yack.rb parse18.output > yacc18.txt" sh "diff -du racc18.txt yacc18.txt || true" puts sh "diff -du racc18.txt yacc18.txt | wc -l" end task :compare19 do sh "./yack.rb lib/ruby19_parser.output > racc19.txt" sh "./yack.rb parse19.output > yacc19.txt" sh "diff -du racc19.txt yacc19.txt || true" puts sh "diff -du racc19.txt yacc19.txt | wc -l" end task :compare20 do sh "./yack.rb lib/ruby20_parser.output > racc20.txt" sh "./yack.rb parse20.output > yacc20.txt" sh "diff -du racc20.txt yacc20.txt || true" puts sh "diff -du racc20.txt yacc20.txt | wc -l" end task :debug => :isolate do ENV["V"] ||= "20" Rake.application[:parser].invoke # this way we can have DEBUG set $: << "lib" require 'ruby_parser' require 'pp' parser = case ENV["V"] when "18" then Ruby18Parser.new when "19" then Ruby19Parser.new else Ruby20Parser.new end time = (ENV["RP_TIMEOUT"] || 10).to_i file = ENV["F"] || ENV["FILE"] ruby = if file then File.read(file) else file = "env" ENV["R"] || ENV["RUBY"] end begin pp parser.process(ruby, file, time) rescue Racc::ParseError => e p e ss = parser.lexer.src src = ss.string lines = src[0..ss.pos].split(/\n/) abort "on #{file}:#{lines.size}" end end def ruby20 "/Users/ryan/.multiruby/install/2.0.0-p195/bin/ruby" end task :debug_ruby do file = ENV["F"] || ENV["FILE"] sh "#{ruby20} -cwy #{file} 2>&1 | ./yuck.rb" end task :extract => :isolate do ENV["V"] ||= "19" Rake.application[:parser].invoke # this way we can have DEBUG set file = ENV["F"] || ENV["FILE"] ruby "-Ilib", "bin/ruby_parse_extract_error", file end task :bugs do sh "for f in bug*.rb ; do #{Gem.ruby} -S rake debug F=$f && rm $f ; done" end # vim: syntax=Ruby ruby_parser-3.2.2/.gemtest0000644000004100000410000000000012250152360015536 0ustar www-datawww-dataruby_parser-3.2.2/bin/0000755000004100000410000000000012250152360014647 5ustar www-datawww-dataruby_parser-3.2.2/bin/ruby_parse0000555000004100000410000000332612250152360016752 0ustar www-datawww-data#!/usr/bin/ruby -s $q ||= false $g ||= false require 'rubygems' require 'ruby_parser' require 'pp' good = bad = 0 multi = ARGV.size != 1 total_time = 0 total_loc = 0 total_kbytes = 0 times = {} locs = {} kbytes = {} class File RUBY19 = "<3".respond_to? :encoding class << self alias :binread :read unless RUBY19 end end begin ARGV.each do |file| rp = RubyParser.new loc = `wc -l #{file}`.strip.to_i size = `wc -c #{file}`.strip.to_i / 1024.0 locs[file] = loc kbytes[file] = size total_loc += loc total_kbytes += size if $q then $stderr.print "." else warn "# file = #{file} loc = #{loc}" end GC.start if $g t = Time.now begin begin rp.reset r = rp.parse(File.binread(file), file) pp r unless $q good += 1 rescue SyntaxError => e warn "SyntaxError for #{file}: #{e.message}" bad += 1 end rescue => e warn "#{e.backtrace.first} #{e.inspect.gsub(/\n/, ' ')} for #{file}" warn " #{e.backtrace.join("\n ")}" bad += 1 end t = Time.now - t times[file] = t total_time += t end rescue Interrupt # do nothing end warn "done" total = 0 times.values.each do |t| total += t end puts puts "good = #{good} bad = #{bad}" if multi puts format = "%5.2fs:%9.2f l/s:%8.2f Kb/s:%5d Kb:%5d loc:%s" times.sort_by { |f, t| -t }.each do |f, t| next if t < 0.005 loc = locs[f] size = kbytes[f] puts format % [t, loc / t, size / t, size, loc, f] end puts puts format % [total_time, total_loc / total_time, total_kbytes / total_time, total_kbytes, total_loc, "TOTAL"] unless total_time == 0 ruby_parser-3.2.2/bin/ruby_parse_extract_error0000555000004100000410000000602112250152360021710 0ustar www-datawww-data#!/usr/bin/ruby -ws $d ||= false $d ||= ENV["DELETE"] $t ||= false $t ||= ENV["DELETE_TIMEOUT"] $m ||= false $m ||= ENV["MOVE_TIMEOUT"] $q ||= false $q ||= ENV["QUIET"] $v ||= ENV["V"] || "20" require 'rubygems' require 'ruby_parser' require 'fileutils' $parser_class = case $v when "18" then Ruby18Parser when "19" then Ruby19Parser when "20" then Ruby20Parser else abort "Unknown version #{$v.inspect}. Needs to be 18, 19, or 20" end class IO RUBY19 = "<3".respond_to? :encoding class << self alias :binread :read unless RUBY19 end end ARGV.push "-" if ARGV.empty? class Racc::Parser def extract_defs ss = lexer.src raise "can't access source. possible encoding issue" unless ss src = ss.string pre_error = src[0...ss.pos] defs = pre_error.grep(/^ *(?:def|it)/) raise "can't figure out where the bad code starts" unless defs.last last_def_indent = defs.last[/^ */] post_error = src[ss.pos..-1] idx = post_error =~ /^#{last_def_indent}end.*/ raise "can't figure out where the bad code ends" unless idx src = pre_error + post_error[0..idx+$&.length] src.scan(/^(( *)(?:def|it) .*?^\2end)/m) end def retest_for_errors defs parser = self.class.new parser.process(defs.join("\n\n")) rescue SyntaxError, StandardError nil end end def expand path if File.directory? path then require 'find' files = [] Find.find(*Dir[path]) do |f| files << f if File.file? f end files.sort else Dir.glob path end end def process_error parser defs = parser.extract_defs if parser.retest_for_errors defs then warn "Can't reproduce error with just methods, punting..." return end catch :extract_done do (1..defs.size).each do |perm_size| defs.combination(perm_size).each do |trial| unless parser.retest_for_errors trial then puts trial.join "\n" throw :extract_done end end end end rescue RuntimeError, Racc::ParseError => e warn "# process error: #{e.message.strip}" end def process file ruby = file == "-" ? $stdin.binread : File.binread(file) time = (ENV["RP_TIMEOUT"] || 10).to_i $stderr.print "# Validating #{file}: " parser = $parser_class.new parser.process(ruby, file, time) warn "good" File.unlink file if $d rescue Timeout::Error $exit = 1 warn "TIMEOUT parsing #{file}. Skipping." if $m then dir = File.join $m, File.dirname(file) FileUtils.mkdir_p dir FileUtils.move file, dir elsif $t then File.unlink file end rescue StandardError, SyntaxError, Racc::ParseError => e $exit = 1 warn "" warn "# error: #{e.message.strip}" unless $q warn "" return if $q process_error parser end $exit = 0 $stdout.sync = true ARGV.each do |path| expand(path).each do |file| next unless File.file? file # omg... why would you name a dir support.rb? process file end end exit $exit ruby_parser-3.2.2/Manifest.txt0000444000004100000410000000061112250152360016402 0ustar www-datawww-data.autotest History.txt Manifest.txt README.txt Rakefile bin/ruby_parse bin/ruby_parse_extract_error lib/gauntlet_rubyparser.rb lib/ruby18_parser.rb lib/ruby18_parser.y lib/ruby19_parser.rb lib/ruby19_parser.y lib/ruby20_parser.rb lib/ruby20_parser.y lib/ruby_lexer.rb lib/ruby_parser.rb lib/ruby_parser_extras.rb test/test_ruby_lexer.rb test/test_ruby_parser.rb test/test_ruby_parser_extras.rb ruby_parser-3.2.2/.autotest0000444000004100000410000000323312250152360015747 0ustar www-datawww-data# -*- ruby -*- require 'autotest/restart' require 'autotest/isolate' require 'autotest/rcov' if ENV['RCOV'] Autotest.add_hook :initialize do |at| at.extra_files << "../../sexp_processor/dev/lib/pt_testcase.rb" at.libs << ":../../sexp_processor/dev/lib" at.add_exception 'unit' at.add_exception 'coverage' at.add_exception 'coverage.info' at.add_exception '.diff' at.add_exception '.output' at.add_exception 'rubycorpus' at.add_exception "lib/ruby18_parser.rb" at.add_exception "lib/ruby19_parser.rb" at.add_exception "lib/ruby20_parser.rb" at.add_exception "lib/gauntlet_rubyparser.rb" dirs = Dir["corpus*"] + Dir["gauntlet*"] dirs.each do |f| at.add_exception f end at.libs << ':../../minitest/dev/lib' at.testlib = "minitest/autorun" at.add_mapping(/^lib\/.*\.y$/) do |f, _| re = %r%^test/test_#{File.basename(f, '.y').gsub(/(\d+)/, '')}.rb$% at.files_matching re at.files_matching %r%^test/.*#{File.basename(f, '.y').gsub '_', '_?'}.rb$% end at.add_mapping(/pt_testcase.rb/) do |f, _| at.files_matching(/test_.*rb$/) end %w(TestEnvironment TestStackState).each do |klass| at.extra_class_map[klass] = "test/test_ruby_parser_extras.rb" end %w(TestRuby18Parser TestRuby19Parser TestRuby20Parser TestParseTree).each do |klass| # HACK at.extra_class_map[klass] = "test/test_ruby_parser.rb" end end Autotest.add_hook :run_command do |at, _| system "rake parser DEBUG=1" end class Autotest def ruby File.expand_path "~/.multiruby/install/1.9.3-p194/bin/ruby" end end if ENV['R19'] class Autotest def ruby File.expand_path "~/.multiruby/install/2.0.0-p195/bin/ruby" end end if ENV['R20'] ruby_parser-3.2.2/README.txt0000444000004100000410000000602512250152360015576 0ustar www-datawww-data= ruby_parser home :: https://github.com/seattlerb/ruby_parser bugs :: https://github.com/seattlerb/ruby_parser/issues rdoc :: http://docs.seattlerb.org/ruby_parser == DESCRIPTION: ruby_parser (RP) is a ruby parser written in pure ruby (utilizing racc--which does by default use a C extension). RP's output is the same as ParseTree's output: s-expressions using ruby's arrays and base types. As an example: def conditional1 arg1 return 1 if arg1 == 0 return 0 end becomes: s(:defn, :conditional1, s(:args, :arg1), s(:if, s(:call, s(:lvar, :arg1), :==, s(:lit, 0)), s(:return, s(:lit, 1)), nil), s(:return, s(:lit, 0))) Tested against 801,039 files from the latest of all rubygems (as of 2013-05): * 1.8 parser is at 99.9739% accuracy, 3.651 sigma * 1.9 parser is at 99.9940% accuracy, 4.013 sigma * 2.0 parser is at 99.9939% accuracy, 4.008 sigma == FEATURES/PROBLEMS: * Pure ruby, no compiles. * Includes preceding comment data for defn/defs/class/module nodes! * Incredibly simple interface. * Output is 100% equivalent to ParseTree. * Can utilize PT's SexpProcessor and UnifiedRuby for language processing. * Known Issue: Speed is now pretty good, but can always improve: * RP parses a corpus of 3702 files in 125s (avg 108 Kb/s) * MRI+PT parsed the same in 67.38s (avg 200.89 Kb/s) * Known Issue: Code is much better, but still has a long way to go. * Known Issue: Totally awesome. * Known Issue: line number values can be slightly off. Parsing LR sucks. == SYNOPSIS: RubyParser.new.parse "1+1" # => s(:call, s(:lit, 1), :+, s(:lit, 1)) You can also use Ruby19Parser, Ruby18Parser, or RubyParser.for_current_ruby: RubyParser.for_current_ruby.parse "1+1" # => s(:call, s(:lit, 1), :+, s(:lit, 1)) == REQUIREMENTS: * ruby. woot. * sexp_processor for Sexp and SexpProcessor classes, and testing. * racc full package for parser development (compiling .y to .rb). == INSTALL: * sudo gem install ruby_parser == LICENSE: (The MIT License) Copyright (c) Ryan Davis, seattle.rb Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ruby_parser-3.2.2/data.tar.gz.sig0000644000004100000410000000040012250152360016712 0ustar www-datawww-data֦o<$&n|𨔵XLfam[?3W#-$j-HB0:^^+Lj2^y~ ֒3_BgA zW5GpF|p.vA?dX9uӔVL+*(?~?>ZEdoǐԨh壯gSh!c/Mϥ,IHmߌ0{%,⌁J|~@q6 ;¶L隦,ruby_parser-3.2.2/History.txt0000444000004100000410000006235612250152360016313 0ustar www-datawww-data=== 3.2.2 / 2013-07-11 * 5 bug fixes: * 1.9/2.0: fixed assocs in return args. (presidentbeef) * Fixed handling of parse error when class is nested in multiple defs. (whitequark) * Fixed lexing of %w[] w/ funny whitespace separators. (whitequark) * Fixed more call nodes that have trailing comma syntax. (presidentbeef) * Fixed more call_args slippage. === 3.2.1 / 2013-07-03 * 1 bug fix: * 1.9/2.0: Trailing assocs were being munged into arrays. (presidentbeef) === 3.2.0 / 2013-07-02 * 1 major enhancement: * Added (rough draft) 2.0 support. Still missing some small / rare things. * 12 minor enhancements: * Added %i(symbol-names...) support. (%I too) * Added 140 more tests, jumping test count from 1376 to 2143. Yay for test reuse! * Added RubyLexer#brace_nest. * Added compare20 rake task to diff the grammar architecture against MRI. * Added lpar_beg and paren_nest to lexer to track state of parens in stabbies * Added shadow nodes for scoped block args. * Compound RubyParser now defaults to 2.0. * Fixed rake to < 10, because 10's file dependency handling is so very broken. * Made it possible to specify version in bin/ruby_parse_extract_error w/ -v 18|19|20 * Refactored to RubyParserStuff::ENCODING_ORDER to allow custom tweaking of encoding guessing. (samlown) * Switched `rake debug` to default to 2.0. * Translated some fixes across 1.8 and 1.9 from 2.0. * 42 bug fixes: * 2.0: Fixed a number of block args scenarios w/ kwargs * 2.0: Fixed args_tail mismatching against lexer. * 2.0: Fixed assocs to return a hash node. * 2.0: Fixed f_block_kw production. * 2.0: Fixed f_block_kwarg production. * 2.0: Fixed handling of stabby proc args in parens. * 2.0: Fixed lexing of kwsplat nodes. * 2.0: Implemented kwsplat nodes. * Added tUBANG to lexer. * Apparently ruby doesn't warn for escaped octal that goes above 7. wtf. * Cleaned up a LOT of arg handling (block and defn, not calls) by using #args. * ESC_RE is set to unicode. This seems problematic. *shrug* * Either found a bug in MRI and/or fixed paren_nest count for []=? methods. * Extended IDENT_CHAR_RE on 1.9+ to top out at \u{10ffff}... because we NEED a million unicode chars. * Fixed % strings with interpolation. * Fixed BEGIN {} to return a sexp. * Fixed a[] += b. (stormbrew) * Fixed arg_blk_pass to allow for sub-args nodes. * Fixed assignable to allow for sexps to be passed to it. * Fixed assoc args in 1.9. * Fixed block_command and block_call (eg a.b c d) to #to_sym their args properly. * Fixed bug in compound RubyParser so it rescues RubyParser::SyntaxError. * Fixed env registration of cdecls. * Fixed lex value for { when expr_endfn. * Fixed lex_state for close paren/brace/bracket. * Fixed lex_state transition for 1.9 if we lexed a defn name. Only 1.8 is odd. * Fixed lexer problem with state mgmt of identifiers that also have registered var name. * Fixed lexing of "1 *\n" to have the correct lex_state. * Fixed lexing of heredocs vs chevron for some lex_states. * Fixed op_asgn nodes to #to_sym their args properly. * Fixed optional value block args. * Fixed parsing of __ENCODING__ on ruby 1.8 (vcall). * Fixed some oddity where 1.9 lexing was blowing up on "0o". Seems invalid now. * Fixed strings with escaped octals > 128. Also... wtf. * Fixed support for empty symbol (wtf?). * Lexer is now declared UTF-8 internally. Hopefully this will fix the encoding mess. * Made UTF_8 the default guess on encodings when it isn't explicit. * Parsing of __ENCODING__ on ruby 1.9+ (in ruby 1.9+) is now colon2 sexp. (whitequark) * Renamed RubyLexer#nest to string_nest * RubyLexer#unescape ignores bad octal/hex and returns unicode strings. * Switched a number of lexical constructs to use IDENT_CHAR_RE instead of \w. I wish there were something cleaner for regexps + unicode. * Switched ruby_parse_extract_error to use binread. === 3.1.3 / 2013-04-09 * 2 bug fixes: * Fixed begin w/ else but no rescue. (whitequark) * Removed literal stripping from block_append. Not its job. === 3.1.2 / 2013-03-18 * 1 minor enhancement: * OMG A SECURITY ISSUE FOR CODE NOBODY USES... EVER === 3.1.1 / 2012-12-19 * 1 minor enhancement: * Added MOVE_TIMEOUT env var for ruby_parse_extract_error to move slow files to a sibling directory * 4 bug fixes: * 1.9: Fixed lexing of "0o". (whitequark) * 1.9: Fixed parsing of unary plus on literals. (whitequark) * Added timeout arg to RubyParser#process to pass through to the real parser * Updated Synopsis to reflect new options for running RP. (louismullie) === 3.1.0 / 2012-12-06 * 2 minor enhancements: * Added RubyParser.for_current_ruby to provide a parser that matches your runtime. (neilconway) * Duck-typed IDENT_CHAR_RE instead of using RUBY_VERSION * 3 bug fixes: * Cleared out body comments in class/module/defn/defs * Flipped lexer tests to US-ASCII to avoid encoding hell * yyerror is now an alias for syntax_error === 3.0.4 / 2012-11-26 * 1 bug fix: * RPStringScanner#lineno was still using byte offset, not char offset. (brynary) === 3.0.3 / 2012-11-23 * 1 minor enhancement: * Improved error output on invalid char in expression. * 1 bug fix: * Fixed lexing of no-name ivars. (whitequark) === 3.0.2 / 2012-11-21 52 down makes 99.9767% or 3.7σ. 130 files failed to parse out of 558k. * 4 minor enhancements: * Added RP_TIMEOUT env var to override default timeout of 10 seconds. * Minor optimization to RubyLexer#parse_number * Only output parseerror output to stderr if $DEBUG. * ruby_parse_extract_error modified to include 'it' blocks in its search. * 7 bug fixes: * 1.9: Fixed args in dot-call forms (eg f.(...)). * 1.9: Fixed lexing stabby lambda w/ do/end * Deal better with DOS files. Ugh. * Fix line number of production after heredoc. * Fixed RubyParser#process to reuse parser instances across calls. * Fixed line numbers for several productions. * new_call sets line number to smallest line number of members. === 3.0.1 / 2012-11-02 * 2 bug fixes -- both based on MRI bugs... Yay?: * 1.9.2 doesn't have String#byteslice... so I have to do the *HORRIBLE*. * Lexing regexps w/ bad character encodings and no declared options will fall back to /.../n. === 3.0.0 / 2012-11-02 I've hit 99.967% success rate against 558k files! 3.6σ!! 182 files failed to parse and spot checking them shows that they're pretty much lost causes. I'm sure I missed some stuff, but it is more important at this point to release a version to get more people using it in more diverse ways than I can come up with. * 3 minor enhancements: * Added RBStringScanner#charpos using #string_to_pos. * Added RBStringScanner#string_to_pos using String#byteslice. * Optimized regexp used for escape chars in strings. (presidentbeef) * 3 bug fixes: * Fixed current_line and unread_many depending on StringScanner#pos * Fixed parsing of 'a[] = b' * Fixed the worst abuse of heredocs EVER. Just because it is valid doesn't mean you should. === 3.0.0.a10 / 2012-10-26 * 1 major enhancement: * iter nodes are now structurally the same as defs. Block args are COMPLETELY different. * 4 minor enhancements: * 1.8 and 1.9 now treat f { |(...)| } differently, per MRI. * 1.9: Added __ENCODING__ support. (witlessbird) * 1.9: Finished coverage for masgn variants in block args * 1.9: covered all forms of block args: optional, splat, block, and destructuring === 3.0.0.a9 / 2012-10-22 Holy crap! I've hit a 99.92% success rate against 558k files! 492 failed parses to go. NOW is the time to start testing ruby_parser against your code! * 16 minor enhancements: * 1.9 parser: Finished magic encoding and utf-8 bom support. * 1.9: Added leading dot support eg "a\n.b". * 1.9: Added partial handling for *arg and opt=val args in block args. * 1.9: OMFG Encoding is the worst thing ever. Overhauled encoding support once again. It is much better at doing last ditch guessing of the encoding of the source file. * 1.9: added String#grep for legacy support. * Added Sexp#block_pass? * Added ability to delete slow files when they timeout. * Added block_dup_check and refactored grammar code to use it for block arg handling. * Added in_lex_state?(*states) to clean up lexer code. * Added tentative support for optional block args. THIS IS SUBJECT TO CHANGE!! * Added toggleable debugging to StackState to make my life easier * All untested uses have not moved but have been laced with poison. * Finally got good tests for most forms of double-block arg errors. * Moved all _known_ uses of SyntaxError to RubyParser::SyntaxError * f_block_optarg now always returns a block node. * ruby_parse_extract_error uses Find.find instead of globbing so dot files aren't missed. * 12 bug fixes: * 1.9: Completely ignore IndexError in unread_many because... you know... it sucks. * 1.9: Fixed lex state after lexing ? in trinary. * 1.9: Fixed lex state in some ternarys. * 1.9: Fixed parsing of "1 ? b('') : 2\na d: 3"... ARE YOU NOT GLAD?!?! * Fix Timeout differences between 1.8 and 1.9 :( * Fixed emacs-style encodings to deal with no whitespace. * Fixed error message for bad % codes. (whitequark) * Fixed lexing of :a==>b vs :a===b vs :a==>b. P.S. Your space bar is broken. chump. * Fixed lexing of rare numeric formats. * Fixed magic comment encodings on DOS files ... :/ * Fixed ruby_parse_extract_error to exit non-zero on errors. * Removed Symbol#is_argument and switch usage to is_arg? === 3.0.0.a8 / 2012-09-26 * 1 bug fix: * Remove method #d from global namespace. (alexch) === 3.0.0.a7 / 2012-09-21 * 3 minor enhancements: * Reorganized ruby_parse_extract_error so it will start much faster with a bunch of glob directories * RubyParserStuff#process takes optional time arg and raises Timeout::Error if it goes too long. You should rescue that, ya know... * ruby_parse_extract_error now checks *.rake and Rakefile on dir scan. * 3 bug fixes: * 1.9: Fixed ternary state tracking so {a:f{f()},b:nil} won't trip up the lexer. * Fixed optional values in block args (no20/no21) * ruby_parse_extract_error skips non-files. Some asshats put .rb on their dirs. :( === 3.0.0.a6 / 2012-08-20 * 2 minor enhancements: * 1.8: Added basic encoding support to 1.8 parser. Assumes -Ku. * 1.9: Added encoding magic comment support to 1.9 parser. * 8 bug fixes: * 1.9: Fixed lexing of -1 w/in conditionals. yeah... I dunno. * 1.9: Fixed parsing of a do | | end. * 1.9: Fixed parsing of not(x). * 1.9: Fixed parsing of op_asgn + rescue: 'a ||= b rescue nil' * 1.9: added \r to the EOL backslash handler. dos files blow * 1.9: hacked in a workaround for 1.9 specific regexps running in 1.8. * Added #reset to RubyParser proxy class * Fixed lexing of conditional w/ %() tokens === 3.0.0.a5 / 2012-07-31 * 5 bug fixes: * 1.9: Fix construction of 'f(:x, y: nil,)' w/ trailing comma. * 1.9: cleaned up lexing exit lex_state handling. Fixes bug parsing 'if f :x; end' * 1.9: fixed building of right-leaning masgns: 'f { |a, (b, c)| }' * 1.9: fixed lexing 'when *splat' * 1.9: fixed lexing of regexps in whens === 3.0.0.a4 / 2012-07-26 * 10 minor enhancements: * 'rake debug' defaults to 1.9 parser since that's all I'm doing these days * 1.9: Fixed f { |(a, b, ...), ...| ... } handling. * Added 'rake extract F=path' task to quickly extract errors from large files * Added on_error handler to provide more readable error message. * Aliased #process to #parse. * Renamed #parse to #process (legacy name), added default path of '(string)' * cleaned ruby_parse_extract_error output and fixed to 1.9 parser * ruby_parse_extract_error expands shell globs from ARGV * ruby_parse_extract_error should also capture RuntimeError * yyerror(msg) now warns with the message instead of ignoring it. * 3 bug fixes: * 1.9: Fixed bug lexing/parsing [ in rhs. * 1.9: Fixed f { |((a, b), c)| ... } handling * 1.9: fixed newline handling during expr_value === 3.0.0.a3 / 2012-07-03 * 1 major enhancement: * OMG! Implemented all the 1.9 arg crap and I went from 500 lines of structural diff to 32! * 17 minor enhancements: * 1.9: !(...) is now a method call. ugh * 1.9: Added __ENCODING__ keyword (returns Unsupported atm). * 1.9: Added support for "a.()" thingy. whatever you call it. Have I ever mentioned that ruby has too much syntax? I mean really... * 1.9: Moved kRETURN/kBREAK/kNEXT from command_call to command * 1.9: Removed when_args and refactored into args production. * 1.9: Support for not/! being a call to #!. why matz? why?!? * 1.9: Support for trailing comma support in opt call args. * 1.9: Switched keyword support to deal with 1.8 vs 1.9 differences. * 1.9: refactored and created command_asgn * 1.9: removed case/else from primary * 1.9: reworked mlhs and family. Now horrible things like 'a, *, c = f' work * 1.9: reworked top level rules from program to expr. Lots of lame refactorings in mri. * Moved 'a[]' from primary down to method_call * Removed 'args trailer' production from assoc_list (eg {1, 2}). * Removed 1.9 support for : as a terminator in do/then * RubyParser no longer subclasses the 18 parser, so I had to change some consts around. * Undeprecated RubyParser - but now it is a compound parser that tries 1.9 first. * 3 bug fixes: * 1.9: fixed bang method name. * Fixed case/when/splat handling on both 1.8 and 1.9. * Removed lambda_body production from lambda === 3.0.0.a2 / 2012-06-19 * 1 minor enhancement: * Updated to sexp_processor ~> 4.0 * 1 bug fix: * Fixed new_module to remove scope/block. Not enough tests on module variance. * 1 known issue: * No parsing of "a.()" thingy. (reported by julian7) (patches welcome!) === 3.0.0.a1 / 2012-05-22 This is the first alpha release of the 3.0.0 series. It is probably woefully incomplete, bug ridden, and hasn't showered in several days. Please please please beat the crap out of it and send bugs/patches/complaints/suggestions. * 5 major enhancements: * 1.9 parsing! Thanks to EVERYONE for submitting patches for this! * Removed :arglist from everything but :op_asgn1 * Removed :block from resbody * Removed :block from when * Removed :block nodes inside of scope nodes (defn/defs/class/sclass). * Removed :scope nodes in defn/defs/class/sclass nodes. * (probably more sexp cleanup to come before 3.0.0 final) * 25 minor enhancements: * 1.9: Fix \!a. (wanabe) * 1.9: Method calling with postargs. (wanabe) * 1.9: Method definition with postargs. (wanabe) * 1.9: Support lambda args without parentheses. (wanabe) * Added R arg to `rake debug` to debug ruby straight up * Added RubyParser, subclassing Ruby18Parser but warning on instantiation. * Added backref_assign_error (needs tests) * Added bin/ruby_parse_extract_error to help with error submissions * Added debug task to help quickly get into a bug * Added more 18 vs 19 lexing tests for ?c. * Added ruby_parser.rb that pulls everything together in proper order. * Added tLABEL. (brynary) * Branched ruby_parser.y to ruby18_parser.y * Fix to pass test_lambda_args_block__19 test. (mrmargolis) * Got rid of one instance of unread_many. (Confusion) * Moved everything from RubyParser to RubyParserStuff and included module in both. * Refactored 1.9 args handling * Refactored and added new_resbody to ruby_parser_extras. * Refactored and added new_when * Refactored tests infrastructure and added both 1.8 and 1.9 test branches. * Removed unused methods: unread, begin_of_line? was_begin_of_line. (YAY!) (Confusion) * Renamed ruby_parser.y to ruby19_parser.y * RubyLexer now takes a version specifier. * Started doing comparative refactoring between MRI's 1.9 parser and RP's. Shouldn't differ functionally except where we missed stuff in RP. * `rake debug` prints the output if it succeeds. * 21 bug fixes: * Added missing gvar arg error. (1.8) * Attach parser files to isolate to ensure they can build * Conditionalize handling of tLABEL to ruby19+. Fixes issue #33. * DOH. I deactivated some tests and never reactivated them. (Confusion ftw) * Duplicate the input so that heredoc processing doesn't morph original. (banister) * Entirely reworked block arg handling. (1.8) * Fix ?x char literal. (nobu) * Fixed 4/5 of literal lambda tests (jamie) * Fixed deps for parser * Fixed lexing of ?c for ruby 1.8 and 1.9. * Fixed more Ruby 1.9 args tests (brynary) * Fixed reswords to match MRI (1.8, 1.9) * Fixed symbols with no spaces in method calls (e.g. foo:bar) (YAY! brynary) * Fixed ternary_nil_no_space and other ternary edge cases for 1.9. (lastobelus) * Fixed test_call_not_equal__19. First bug bounty! (albus522) * Made lambda w/o arg list zero out the arg slot. * Renamed awords to qwords to match stupid MRI naming. (1.8, 1.9) :( * Rolled out brynary's symbols-no-spaces (foo:bar) changes when parsing 1.8 code * Split 1.8 from 1.9 open paren lexer. Gawd that's ugly code. * Split block_var from for_var. (1.8, 1.9) * Use binread (and emulate in ruby 1.8) to avoid encoding issues === 2.3.1 / 2011-09-21 * 2 bug fixes: * Fixed line numbers at end of special var+whitespace (larsch) * Holy crap I was smokin' something good... Fixed 1.9.3 warning === 2.3.0 / 2011-09-06 * 2 minor enhancements: * Add -g flag to parser compile if DEBUG * Lexer now embeds line number in yacc_value for keywords, helping fix up line numbers * 3 bug fixes: * Fix method line numbers when no args and no parens (quix) * Fixed line numbers on return/break/next w/ result expr. (pjnz) * Fixed some lexing state in order to parse: 'f (1), 2' as 'f(1, 2)'. (invernizzi) === 2.2.0 / 2011-08-23 * 2 minor enhancements: * Moved Keyword, Environment, and StackState inside of RubyParser * Added proper dsym and dsym->sym support. * 3 bug fixes: * Added extra (failing) tests for call/iter line number checking (quix) * Fixed line numbers for certain call/iter edge cases * Fixed parsing of: alias :"<<" :">>". === 2.1.0 / 2011-08-15 * 2 minor enhancements: * Added new accessor canonicalize_conditions to toggle conditional canonicalization (on by default). (confused) * Awesome cleanup: Replaced call to append_block by block_append. (Confusion) * 2 bug fixes: * Fixed handling last line of =begin/=end. (raybaxter) * Fixed source line numbers after heredocs. (jbarreneche) === 2.0.6 / 2011-02-18 * 1 minor enhancement: * Switched to hoe's racc plugin to clean up rakefile and builds * 1 bug fix: * Fixed empty =begin/end. === 2.0.5 / 2010-09-01 * 1 minor enhancement: * Started merging like lexical cases to try to squeeze some optimization out === 2.0.4 / 2009-08-18 * 1 minor enhancement: * Changed requires around to be more accurate. * 4 bug fixes: * Fixed .autotest for minitest * Fixed emacs escape lexing bug: "\C-\\" (maglev/gemstone) * Fixed octal lexing edgecases. (maglev/gemstone) * Fixed regexp lexing edgecases. (maglev/gemstone) === 2.0.3 / 2009-06-23 * 4 minor enhancements: * Removed dead code handling d/regex match node cruft. * Switched to minitest * Updated .autotest and rakefile wrt rcov for new hoe capabilities * Updated hoe for new capabilities * 4 bug fixes: * Environment#all now deals with strange edge cases in RAD. * Fixed packaging/compilation issue. * Minor 1.9 fixes * hoe -> flay -> rubyparser rakefile circularity fixed === 2.0.2 / 2009-01-20 * 2 minor enhancements: * Added gauntlet_rubyparser plugin. YAY for easy massive bug-hunting. * Promoted Sexp's file/line/comments to sexp_processor. * 4 bug fixes: * Fixed and improved the readme * Fixed lexing heredoc newlines. * Fixed line numbers on defns. * Fixed rdoc generation bug pointed out by hugh sasse (who rocks) === 2.0.1 / 2008-11-04 * 2 minor enhancements: * Updated for changes to splat node in many contexts. * Made PT a developer dep === 2.0.0 / 2008-10-22 * 1 major enhancement * Brought on the AWESOME! 4x faster! no known lexing/parsing bugs! * 71 minor enhancements * 1.9: Added Fixnum#ord. * 1.9: Added missing Regexp constants and did it so it'd work on 1.9. * Added #store_comment and #comments * Added StringScanner #begin_of_line? * Added a bunch of tests for regexp escape chars, #parse_string, #read_escape, ? numbers, ? whitespace. * Added a hack for rubinius' r2l eval bug. * Added a new token type tSTRING that bypasses tSTRING_BEG/END entirely. Only does non-interpolated strings and then falls back to the old way. MUCH cleaner tho. * Added bin/ruby_parse * Added compare rule to Rakefile. * Added coverage files/dirs to clean rule. * Added file and line numbers to all sexp nodes. Column/ranges to come. * Added lex_state change for lvars at the end of yylex. * Added lexed comments to defn/defs/class/module nodes. * Added stats gathering for yylex. Reordered yylex for avg data * Added tSYMBOL token type and parser rule to speed up symbol lexing. * Added tally output for getch, unread, and unread_many. * Added tests for ambigous uminus/uplus, backtick in cmdarg, square and curly brackets, numeric gvars, eos edge cases, string quoting %<> and %%%. * All cases throughout yylex now return directly if they match, no passthroughs. * All lexer cases now slurp entire token in one swoop. * All zarrays are now just empty arrays. * Changed s(:block_arg, :blah) to :"&blah" in args sexp. * Cleaned up lexer error handling. Now just raises all over. * Cleaned up read_escape and regx_options * Cleaned up tokadd_string (for some definition of cleaned). * Converted single quoted strings to new tSTRING token type. * Coverage is currently 94.4% on lexer. * Done what I can to clean up heredoc lexing... still sucks. * Flattened resbodies in rescue node. Fixed .autotest file. * Folded lex_keywords back in now that it screams. * Found very last instanceof ILiteralNode in the code. haha! * Got the tests subclassing PTTC and cleaned up a lot. YAY * Handle yield(*ary) properly * MASSIVELY cleaned out =begin/=end comment processor. * Massive overhaul on Keyword class. All hail the mighty Hash! * Massively cleaned up ident= edge cases and fixed a stupid bug from jruby. * Merged @/@@ scanner together, going to try to do the same everywhere. * Refactored fix_arg_lex_state, common across the lexer. * Refactored new_fcall into new_call. * Refactored some code to get better profile numbers. * Refactored some more #fix_arg_lex_state. * Refactored tail of yylex into its own method. * Removed Module#kill * Removed Token, replaced with Sexp. * Removed all parse_number and parse_quote tests. * Removed argspush, argscat. YAY! * Removed as many token_buffer.split(//)'s as possible. 1 to go. * Removed begins from compstmts * Removed buffer arg for tokadd_string. * Removed crufty (?) solo '@' token... wtf was that anyhow? * Removed most jruby/stringio cruft from StringScanner. * Removed one unread_many... 2 to go. They're harder. * Removed store_comment, now done directly. * Removed token_buffer. Now I just use token ivar. * Removed use of s() from lexer. Changed the way line numbers are gathered. * Renamed *qwords to *awords. * Renamed StringScanner to RPStringScanner (a subclass) to fix namespace trashing. * Renamed parse to process and aliased to parse. * Renamed token_buffer to string_buffer since that arcane shit still needs it. * Resolved the rest of the lexing issues I brought up w/ ruby-core. * Revamped tokadd_escape. * Rewrote Keyword and KWtable. * Rewrote RubyLexer using StringScanner. * Rewrote tokadd_escape. 79 lines down to 21. * Split out lib/ruby_parser_extras.rb so lexer is standalone. * Started to clean up the parser and make it as skinny as possible * Stripped out as much code as possible. * Stripped yylex of some dead code. * Switched from StringIO to StringScanner. * Updated rakefile for new hoe. * Uses pure ruby racc if ENV['PURE_RUBY'], otherwise use c. * Wrote a ton of lexer tests. Coverage is as close to 100% as possible. * Wrote args to clean up the big nasty args processing grammar section. * lex_strterm is now a plain array, removed RubyLexer#s(...). * yield and super now flatten args. * 21 bug fixes: * I'm sure this list is missing a lot: * Fixed 2 bugs both involving attrasgn (and ilk) esp when lhs is an array. * Fixed a bug in the lexer for strings with single digit hex escapes. * Fixed a bug parsing: a (args) { expr }... the space caused a different route to be followed and all hell broke loose. * Fixed a bug with x\n=beginvar not putting begin back. * Fixed attrasgn to have arglists, not arrays. * Fixed bug in defn/defs with block fixing. * Fixed class/module's name slot if colon2/3. * Fixed dstr with empty interpolation body. * Fixed for 1.9 string/char changes. * Fixed lexer BS wrt determining token type of words. * Fixed lexer BS wrt pass through values and lexing words. SO STUPID. * Fixed lexing of floats. * Fixed lexing of identifiers followed by equals. I hope. * Fixed masgn with splat on lhs * Fixed new_super to deal with block_pass correctly. * Fixed parser's treatment of :colon2 and :colon3. * Fixed regexp scanning of escaped numbers, ANY number is valid, not just octs. * Fixed string scanning of escaped octs, allowing 1-3 chars. * Fixed unescape for \n * Fixed: omg this is stupid. '()' was returning bare nil * Fixed: remove_begin now goes to the end, not sure why it didn't before. === 1.0.0 / 2007-12-20 * 1 major enhancement * Birthday! ruby_parser-3.2.2/lib/0000755000004100000410000000000012250152360014645 5ustar www-datawww-dataruby_parser-3.2.2/lib/ruby_parser.rb0000444000004100000410000000014512250152360017525 0ustar www-datawww-datarequire 'ruby18_parser' require 'ruby19_parser' require 'ruby20_parser' require 'ruby_parser_extras' ruby_parser-3.2.2/lib/ruby19_parser.y0000444000004100000410000021155312250152360017553 0ustar www-datawww-data# -*- racc -*- class Ruby19Parser token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS kTHEN kELSIF kELSE kCASE kWHEN kWHILE kUNTIL kFOR kBREAK kNEXT kREDO kRETRY kIN kDO kDO_COND kDO_BLOCK kDO_LAMBDA kRETURN kYIELD kSUPER kSELF kNIL kTRUE kFALSE kAND kOR kNOT kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__ k__FILE__ k__ENCODING__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT tLABEL tCVAR tNTH_REF tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT tREGEXP_END tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ tGEQ tLEQ tANDOP tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF tASET tLSHFT tRSHFT tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN tLPAREN2 tRPAREN tLPAREN_ARG tLBRACK tLBRACK2 tRBRACK tLBRACE tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2 tTILDE tPERCENT tDIVIDE tPLUS tMINUS tLT tGT tPIPE tBANG tCARET tLCURLY tRCURLY tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG tWORDS_BEG tQWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END tSTRING tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAST_TOKEN tLAMBDA tLAMBEG prechigh right tBANG tTILDE tUPLUS right tPOW right tUMINUS_NUM tUMINUS left tSTAR2 tDIVIDE tPERCENT left tPLUS tMINUS left tLSHFT tRSHFT left tAMPER2 left tPIPE tCARET left tGT tGEQ tLT tLEQ nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH left tANDOP left tOROP nonassoc tDOT2 tDOT3 right tEH tCOLON left kRESCUE_MOD right tEQL tOP_ASGN nonassoc kDEFINED right kNOT left kOR kAND nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD nonassoc tLBRACE_ARG nonassoc tLOWEST preclow rule program: { self.lexer.lex_state = :expr_beg } top_compstmt { result = new_compstmt val } top_compstmt: top_stmts opt_terms { result = val[0] } top_stmts: none | top_stmt | top_stmts terms top_stmt { result = self.block_append val[0], val[2] } | error top_stmt top_stmt: stmt | klBEGIN { if (self.in_def || self.in_single > 0) then yyerror "BEGIN in method" end self.env.extend } tLCURLY top_compstmt tRCURLY { result = new_iter s(:preexe), nil, val[3] } bodystmt: compstmt opt_rescue opt_else opt_ensure { result = new_body val } compstmt: stmts opt_terms { result = new_compstmt val } stmts: none | stmt | stmts terms stmt { result = self.block_append val[0], val[2] } | error stmt { result = val[1] } stmt: kALIAS fitem { lexer.lex_state = :expr_fname result = self.lexer.lineno } fitem { result = s(:alias, val[1], val[3]).line(val[2]) } | kALIAS tGVAR tGVAR { result = s(:valias, val[1].to_sym, val[2].to_sym) } | kALIAS tGVAR tBACK_REF { result = s(:valias, val[1].to_sym, :"$#{val[2]}") } | kALIAS tGVAR tNTH_REF { yyerror "can't make alias for the number variables" } | kUNDEF undef_list { result = val[1] } | stmt kIF_MOD expr_value { result = new_if val[2], val[0], nil } | stmt kUNLESS_MOD expr_value { result = new_if val[2], nil, val[0] } | stmt kWHILE_MOD expr_value { result = new_while val[0], val[2], true } | stmt kUNTIL_MOD expr_value { result = new_until val[0], val[2], true } | stmt kRESCUE_MOD stmt { result = s(:rescue, val[0], new_resbody(s(:array), val[2])) } | klEND tLCURLY compstmt tRCURLY { if (self.in_def || self.in_single > 0) then yyerror "END in method; use at_exit" end result = new_iter s(:postexe), nil, val[2] } | command_asgn | mlhs tEQL command_call { result = new_masgn val[0], val[2], :wrap } | var_lhs tOP_ASGN command_call { result = new_op_asgn val } | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_call { result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5]) } | primary_value tDOT tIDENTIFIER tOP_ASGN command_call { result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym) } | primary_value tDOT tCONSTANT tOP_ASGN command_call { result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym) } | primary_value tCOLON2 tCONSTANT tOP_ASGN command_call { result = s(:op_asgn, val[0], val[4], val[2], val[3]) } | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call { result = s(:op_asgn, val[0], val[4], val[2], val[3]) } | backref tOP_ASGN command_call { self.backref_assign_error val[0] } | lhs tEQL mrhs { result = self.node_assign val[0], s(:svalue, val[2]) } | mlhs tEQL arg_value { result = new_masgn val[0], val[2], :wrap } | mlhs tEQL mrhs { result = new_masgn val[0], val[2] } | expr command_asgn: lhs tEQL command_call { result = self.node_assign val[0], val[2] } | lhs tEQL command_asgn { result = self.node_assign val[0], val[2] } expr: command_call | expr kAND expr { result = logop(:and, val[0], val[2]) } | expr kOR expr { result = logop(:or, val[0], val[2]) } | kNOT opt_nl expr { result = s(:call, val[2], :"!") } | tBANG command_call { result = s(:call, val[1], :"!") } | arg expr_value: expr { result = value_expr(val[0]) } command_call: command | block_command block_command: block_call | block_call tDOT operation2 command_args # TODO: dot_or_colon { result = new_call val[0], val[2].to_sym, val[3] } | block_call tCOLON2 operation2 command_args { result = new_call val[0], val[2].to_sym, val[3] } cmd_brace_block: tLBRACE_ARG { self.env.extend(:dynamic) result = self.lexer.lineno } opt_block_param { result = self.env.dynamic.keys } compstmt tRCURLY { result = new_iter nil, val[2], val[4] result.line = val[1] self.env.unextend } command: operation command_args =tLOWEST { result = new_call nil, val[0].to_sym, val[1] } | operation command_args cmd_brace_block { result = new_call nil, val[0].to_sym, val[1] if val[2] then block_dup_check result, val[2] result, operation = val[2], result result.insert 1, operation end } | primary_value tDOT operation2 command_args =tLOWEST { result = new_call val[0], val[2].to_sym, val[3] } | primary_value tDOT operation2 command_args cmd_brace_block { recv, _, msg, args, block = val call = new_call recv, msg.to_sym, args block_dup_check call, block block.insert 1, call result = block } | primary_value tCOLON2 operation2 command_args =tLOWEST { result = new_call val[0], val[2].to_sym, val[3] } | primary_value tCOLON2 operation2 command_args cmd_brace_block { recv, _, msg, args, block = val call = new_call recv, msg.to_sym, args block_dup_check call, block block.insert 1, call result = block } | kSUPER command_args { result = new_super val[1] } | kYIELD command_args { result = new_yield val[1] } | kRETURN call_args { line = val[0].last result = s(:return, ret_args(val[1])).line(line) } | kBREAK call_args { line = val[0].last result = s(:break, ret_args(val[1])).line(line) } | kNEXT call_args { line = val[0].last result = s(:next, ret_args(val[1])).line(line) } mlhs: mlhs_basic | tLPAREN mlhs_inner rparen { result = val[1] } mlhs_inner: mlhs_basic | tLPAREN mlhs_inner rparen { result = s(:masgn, s(:array, val[1])) } mlhs_basic: mlhs_head { result = s(:masgn, val[0]) } | mlhs_head mlhs_item { result = s(:masgn, val[0] << val[1].compact) } | mlhs_head tSTAR mlhs_node { result = s(:masgn, val[0] << s(:splat, val[2])) } | mlhs_head tSTAR mlhs_node tCOMMA mlhs_post { ary = list_append val[0], s(:splat, val[2]) ary.concat val[4][1..-1] result = s(:masgn, ary) } | mlhs_head tSTAR { result = s(:masgn, val[0] << s(:splat)) } | mlhs_head tSTAR tCOMMA mlhs_post { ary = list_append val[0], s(:splat) ary.concat val[3][1..-1] result = s(:masgn, ary) } | tSTAR mlhs_node { result = s(:masgn, s(:array, s(:splat, val[1]))) } | tSTAR mlhs_node tCOMMA mlhs_post { ary = s(:array, s(:splat, val[1])) ary.concat val[3][1..-1] result = s(:masgn, ary) } | tSTAR { result = s(:masgn, s(:array, s(:splat))) } | tSTAR tCOMMA mlhs_post { ary = s(:array, s(:splat)) ary.concat val[2][1..-1] result = s(:masgn, ary) } mlhs_item: mlhs_node | tLPAREN mlhs_inner rparen { result = val[1] } mlhs_head: mlhs_item tCOMMA { result = s(:array, val[0]) } | mlhs_head mlhs_item tCOMMA { result = val[0] << val[1].compact } mlhs_post: mlhs_item { result = s(:array, val[0]) } | mlhs_post tCOMMA mlhs_item { result = list_append val[0], val[2] } mlhs_node: user_variable { result = self.assignable val[0] } | keyword_variable { result = self.assignable val[0] } | primary_value tLBRACK2 opt_call_args rbracket { result = self.aryset val[0], val[2] } | primary_value tDOT tIDENTIFIER { result = s(:attrasgn, val[0], :"#{val[2]}=") } | primary_value tCOLON2 tIDENTIFIER { result = s(:attrasgn, val[0], :"#{val[2]}=") } | primary_value tDOT tCONSTANT { result = s(:attrasgn, val[0], :"#{val[2]}=") } | primary_value tCOLON2 tCONSTANT { if (self.in_def || self.in_single > 0) then yyerror "dynamic constant assignment" end result = s(:const, s(:colon2, val[0], val[2].to_sym), nil) } | tCOLON3 tCONSTANT { if (self.in_def || self.in_single > 0) then yyerror "dynamic constant assignment" end result = s(:const, nil, s(:colon3, val[1].to_sym)) } | backref { self.backref_assign_error val[0] } lhs: user_variable { result = self.assignable val[0] } | keyword_variable { result = self.assignable val[0] } | primary_value tLBRACK2 opt_call_args rbracket { result = self.aryset val[0], val[2] } | primary_value tDOT tIDENTIFIER { result = s(:attrasgn, val[0], :"#{val[2]}=") } | primary_value tCOLON2 tIDENTIFIER { result = s(:attrasgn, val[0], :"#{val[2]}=") } | primary_value tDOT tCONSTANT { result = s(:attrasgn, val[0], :"#{val[2]}=") } | primary_value tCOLON2 tCONSTANT { if (self.in_def || self.in_single > 0) then yyerror "dynamic constant assignment" end result = s(:const, s(:colon2, val[0], val[2].to_sym)) } | tCOLON3 tCONSTANT { if (self.in_def || self.in_single > 0) then yyerror "dynamic constant assignment" end result = s(:const, s(:colon3, val[1].to_sym)) } | backref { self.backref_assign_error val[0] } cname: tIDENTIFIER { yyerror "class/module name must be CONSTANT" } | tCONSTANT cpath: tCOLON3 cname { result = s(:colon3, val[1].to_sym) } | cname { result = val[0].to_sym } | primary_value tCOLON2 cname { result = s(:colon2, val[0], val[2].to_sym) } fname: tIDENTIFIER | tCONSTANT | tFID | op { lexer.lex_state = :expr_end result = val[0] } | reswords { lexer.lex_state = :expr_end result = val[0] } fsym: fname | symbol fitem: fsym { result = s(:lit, val[0].to_sym) } | dsym undef_list: fitem { result = new_undef val[0] } | undef_list tCOMMA { lexer.lex_state = :expr_fname } fitem { result = new_undef val[0], val[3] } op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ | tMATCH | tNMATCH | tGT | tGEQ | tLT | tLEQ | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2 | tSTAR | tDIVIDE | tPERCENT | tPOW | tBANG | tTILDE | tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2 reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND | kALIAS | kAND | kBEGIN | kBREAK | kCASE | kCLASS | kDEF | kDEFINED | kDO | kELSE | kELSIF | kEND | kENSURE | kFALSE | kFOR | kIN | kMODULE | kNEXT | kNIL | kNOT | kOR | kREDO | kRESCUE | kRETRY | kRETURN | kSELF | kSUPER | kTHEN | kTRUE | kUNDEF | kWHEN | kYIELD | kIF | kUNLESS | kWHILE | kUNTIL arg: lhs tEQL arg { result = self.node_assign val[0], val[2] } | lhs tEQL arg kRESCUE_MOD arg { result = self.node_assign val[0], s(:rescue, val[2], new_resbody(s(:array), val[4])) } | var_lhs tOP_ASGN arg { result = new_op_asgn val } | var_lhs tOP_ASGN arg kRESCUE_MOD arg { result = new_op_asgn val result = s(:rescue, result, new_resbody(s(:array), val[4])) } | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg { val[2][0] = :arglist if val[2] result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5]) } | primary_value tDOT tIDENTIFIER tOP_ASGN arg { result = s(:op_asgn2, val[0], :"#{val[2]}=", val[3].to_sym, val[4]) } | primary_value tDOT tCONSTANT tOP_ASGN arg { result = s(:op_asgn2, val[0], :"#{val[2]}=", val[3].to_sym, val[4]) } | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg { result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym) } | primary_value tCOLON2 tCONSTANT tOP_ASGN arg { yyerror "constant re-assignment" } | tCOLON3 tCONSTANT tOP_ASGN arg { yyerror "constant re-assignment" } | backref tOP_ASGN arg { self.backref_assign_error val[0] } | arg tDOT2 arg { v1, v2 = val[0], val[2] if v1.node_type == :lit and v2.node_type == :lit and Fixnum === v1.last and Fixnum === v2.last then result = s(:lit, (v1.last)..(v2.last)) else result = s(:dot2, v1, v2) end } | arg tDOT3 arg { v1, v2 = val[0], val[2] if v1.node_type == :lit and v2.node_type == :lit and Fixnum === v1.last and Fixnum === v2.last then result = s(:lit, (v1.last)...(v2.last)) else result = s(:dot3, v1, v2) end } | arg tPLUS arg { result = new_call val[0], :+, argl(val[2]) } | arg tMINUS arg { result = new_call val[0], :-, argl(val[2]) } | arg tSTAR2 arg { result = new_call val[0], :*, argl(val[2]) } | arg tDIVIDE arg { result = new_call val[0], :"/", argl(val[2]) } | arg tPERCENT arg { result = new_call val[0], :"%", argl(val[2]) } | arg tPOW arg { result = new_call val[0], :**, argl(val[2]) } | tUMINUS_NUM tINTEGER tPOW arg { result = new_call(new_call(s(:lit, val[1]), :"**", argl(val[3])), :"-@") } | tUMINUS_NUM tFLOAT tPOW arg { result = new_call(new_call(s(:lit, val[1]), :"**", argl(val[3])), :"-@") } | tUPLUS arg { result = new_call val[1], :"+@" } | tUMINUS arg { result = new_call val[1], :"-@" } | arg tPIPE arg { result = new_call val[0], :"|", argl(val[2]) } | arg tCARET arg { result = new_call val[0], :"^", argl(val[2]) } | arg tAMPER2 arg { result = new_call val[0], :"&", argl(val[2]) } | arg tCMP arg { result = new_call val[0], :"<=>", argl(val[2]) } | arg tGT arg { result = new_call val[0], :">", argl(val[2]) } | arg tGEQ arg { result = new_call val[0], :">=", argl(val[2]) } | arg tLT arg { result = new_call val[0], :"<", argl(val[2]) } | arg tLEQ arg { result = new_call val[0], :"<=", argl(val[2]) } | arg tEQ arg { result = new_call val[0], :"==", argl(val[2]) } | arg tEQQ arg { result = new_call val[0], :"===", argl(val[2]) } | arg tNEQ arg { result = new_call val[0], :"!=", argl(val[2]) } | arg tMATCH arg { result = self.get_match_node val[0], val[2] } | arg tNMATCH arg { result = s(:not, self.get_match_node(val[0], val[2])) } | tBANG arg { result = new_call val[1], :"!" } | tTILDE arg { val[2] = value_expr val[2] result = new_call val[1], :"~" } | arg tLSHFT arg { val[0] = value_expr val[0] val[2] = value_expr val[2] result = new_call val[0], :"\<\<", argl(val[2]) } | arg tRSHFT arg { val[0] = value_expr val[0] val[2] = value_expr val[2] result = new_call val[0], :">>", argl(val[2]) } | arg tANDOP arg { result = logop(:and, val[0], val[2]) } | arg tOROP arg { result = logop(:or, val[0], val[2]) } | kDEFINED opt_nl arg { result = s(:defined, val[2]) } | arg tEH arg opt_nl tCOLON arg { lexer.tern.pop result = s(:if, val[0], val[2], val[5]) } | primary arg_value: arg { result = value_expr(val[0]) } aref_args: none | args trailer { result = val[0] } | args tCOMMA assocs trailer { result = val[0] << s(:hash, *val[2].values) } | assocs trailer { result = s(:array, s(:hash, *val[0].values)) } paren_args: tLPAREN2 opt_call_args rparen { result = val[1] } opt_paren_args: none | paren_args opt_call_args: none { result = val[0] } | call_args { result = val[0] } | args tCOMMA { result = val[0] } | args tCOMMA assocs tCOMMA { result = val[0] << s(:hash, *val[2][1..-1]) # TODO: self.args } | assocs tCOMMA { result = s(:hash, *val[0].values) } call_args: command { warning "parenthesize argument(s) for future version" result = s(:array, val[0]) } | args opt_block_arg { result = self.arg_blk_pass val[0], val[1] } | assocs opt_block_arg { result = s(:array, s(:hash, *val[0].values)) result = self.arg_blk_pass result, val[1] } | args tCOMMA assocs opt_block_arg { result = val[0] << s(:hash, *val[2].values) result = self.arg_blk_pass result, val[3] } | block_arg command_args: { result = lexer.cmdarg.stack.dup # TODO: smell? lexer.cmdarg.push true } call_args { lexer.cmdarg.stack.replace val[0] result = val[1] } block_arg: tAMPER arg_value { result = s(:block_pass, val[1]) } opt_block_arg: tCOMMA block_arg { result = val[1] } | none args: arg_value { result = s(:array, val[0]) } | tSTAR arg_value { result = s(:array, s(:splat, val[1])) } | args tCOMMA arg_value { result = self.list_append val[0], val[2] } | args tCOMMA tSTAR arg_value { result = self.list_append val[0], s(:splat, val[3]) } mrhs: args tCOMMA arg_value { result = val[0] << val[2] } | args tCOMMA tSTAR arg_value { result = self.arg_concat val[0], val[3] } | tSTAR arg_value { result = s(:splat, val[1]) } primary: literal | strings | xstring | regexp | words | qwords | var_ref | backref | tFID { result = new_call nil, val[0].to_sym } | kBEGIN { result = self.lexer.lineno } bodystmt kEND { unless val[2] then result = s(:nil) else result = s(:begin, val[2]) end result.line = val[1] } | tLPAREN_ARG expr { lexer.lex_state = :expr_endarg } rparen { warning "(...) interpreted as grouped expression" result = val[1] } | tLPAREN compstmt tRPAREN { result = val[1] || s(:nil) result.paren = true } | primary_value tCOLON2 tCONSTANT { result = s(:colon2, val[0], val[2].to_sym) } | tCOLON3 tCONSTANT { result = s(:colon3, val[1].to_sym) } | tLBRACK aref_args tRBRACK { result = val[1] || s(:array) } | tLBRACE assoc_list tRCURLY { result = s(:hash, *val[1].values) } | kRETURN { result = s(:return) } | kYIELD tLPAREN2 call_args rparen { result = new_yield val[2] } | kYIELD tLPAREN2 rparen { result = new_yield } | kYIELD { result = new_yield } | kDEFINED opt_nl tLPAREN2 expr rparen { result = s(:defined, val[3]) } | kNOT tLPAREN2 expr rparen { result = s(:call, val[2], :"!") } | kNOT tLPAREN2 rparen { raise "no3\non#{val.inspect}" } | operation brace_block { oper, iter = val[0], val[1] call = new_call nil, oper.to_sym iter.insert 1, call result = iter call.line = iter.line } | method_call | method_call brace_block { call, iter = val[0], val[1] block_dup_check call, iter iter.insert 1, call # FIX result = iter } | tLAMBDA lambda { result = val[1] # TODO: fix lineno } | kIF expr_value then compstmt if_tail kEND { result = new_if val[1], val[3], val[4] } | kUNLESS expr_value then compstmt opt_else kEND { result = new_if val[1], val[4], val[3] } | kWHILE { lexer.cond.push true } expr_value do { lexer.cond.pop } compstmt kEND { result = new_while val[5], val[2], true } | kUNTIL { lexer.cond.push true } expr_value do { lexer.cond.pop } compstmt kEND { result = new_until val[5], val[2], true } | kCASE expr_value opt_terms case_body kEND { result = new_case val[1], val[3] } | kCASE opt_terms case_body kEND { result = new_case nil, val[2] } | kFOR for_var kIN { lexer.cond.push true } expr_value do { lexer.cond.pop } compstmt kEND { result = new_for val[4], val[1], val[7] } | kCLASS { result = self.lexer.lineno } cpath superclass { self.comments.push self.lexer.comments if (self.in_def || self.in_single > 0) then yyerror "class definition in method body" end self.env.extend } bodystmt kEND { result = new_class val self.env.unextend self.lexer.comments # we don't care about comments in the body } | kCLASS tLSHFT { result = self.lexer.lineno } expr { result = self.in_def self.in_def = false } term { result = self.in_single self.in_single = 0 self.env.extend } bodystmt kEND { result = new_sclass val self.env.unextend self.lexer.comments # we don't care about comments in the body } | kMODULE { result = self.lexer.lineno } cpath { self.comments.push self.lexer.comments yyerror "module definition in method body" if self.in_def or self.in_single > 0 self.env.extend } bodystmt kEND { result = new_module val self.env.unextend self.lexer.comments # we don't care about comments in the body } | kDEF fname { result = [lexer.lineno, self.in_def] self.comments.push self.lexer.comments self.in_def = true self.env.extend } f_arglist bodystmt kEND { line, in_def = val[2] result = new_defn val result[2].line line self.env.unextend self.in_def = in_def self.lexer.comments # we don't care about comments in the body } | kDEF singleton dot_or_colon { self.comments.push self.lexer.comments lexer.lex_state = :expr_fname } fname { self.in_single += 1 self.env.extend lexer.lex_state = :expr_end # force for args result = lexer.lineno } f_arglist bodystmt kEND { result = new_defs val result[3].line val[5] self.env.unextend self.in_single -= 1 self.lexer.comments # we don't care about comments in the body } | kBREAK { result = s(:break) } | kNEXT { result = s(:next) } | kREDO { result = s(:redo) } | kRETRY { result = s(:retry) } primary_value: primary { result = value_expr(val[0]) } # These are really stupid k_begin: kBEGIN k_if: kIF k_unless: kUNLESS k_while: kWHILE k_until: kUNTIL k_case: kCASE k_for: kFOR k_class: kCLASS k_module: kMODULE k_def: kDEF k_end: kEND then: term | kTHEN | term kTHEN do: term | kDO_COND if_tail: opt_else | kELSIF expr_value then compstmt if_tail { result = s(:if, val[1], val[3], val[4]) } opt_else: none | kELSE compstmt { result = val[1] } for_var: lhs | mlhs { val[0].delete_at 1 if val[0][1].nil? # HACK } f_marg: f_norm_arg | tLPAREN f_margs rparen { result = val[1] } f_marg_list: f_marg { result = s(:array, val[0]) } | f_marg_list tCOMMA f_marg { result = list_append val[0], val[2] } f_margs: f_marg_list { args, = val result = block_var args } | f_marg_list tCOMMA tSTAR f_norm_arg { args, _, _, splat = val result = block_var args, "*#{splat}".to_sym } | f_marg_list tCOMMA tSTAR f_norm_arg tCOMMA f_marg_list { args, _, _, splat, _, args2 = val result = block_var args, "*#{splat}".to_sym, args2 } | f_marg_list tCOMMA tSTAR { args, _, _ = val result = block_var args, :* } | f_marg_list tCOMMA tSTAR tCOMMA f_marg_list { args, _, _, _, args2 = val result = block_var args, :*, args2 } | tSTAR f_norm_arg { _, splat = val result = block_var :"*#{splat}" } | tSTAR f_norm_arg tCOMMA f_marg_list { _, splat, _, args = val result = block_var :"*#{splat}", args } | tSTAR { result = block_var :* } | tSTAR tCOMMA f_marg_list { _, _, args = val result = block_var :*, args } block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_f_block_arg { result = args val } | f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg { result = args val } | f_arg tCOMMA f_block_optarg opt_f_block_arg { result = args val } | f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_f_block_arg { result = args val } | f_arg tCOMMA f_rest_arg opt_f_block_arg { result = args val } | f_arg tCOMMA { result = args val } | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg { result = args val } | f_arg opt_f_block_arg { result = args val } | f_block_optarg tCOMMA f_rest_arg opt_f_block_arg { result = args val } | f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg { result = args val } | f_block_optarg opt_f_block_arg { result = args val } | f_block_optarg tCOMMA f_arg opt_f_block_arg { result = args val } | f_rest_arg opt_f_block_arg { result = args val } | f_rest_arg tCOMMA f_arg opt_f_block_arg { result = args val } | f_block_arg { result = args val } opt_block_param: none | block_param_def block_param_def: tPIPE opt_bv_decl tPIPE { result = args val result = 0 if result == s(:args) } | tOROP { result = 0 self.lexer.command_start = true } | tPIPE block_param opt_bv_decl tPIPE { result = args val } opt_bv_decl: none | tSEMI bv_decls { result = val[1] } bv_decls: bvar { result = args val } | bv_decls tCOMMA bvar { result = args val } bvar: tIDENTIFIER { result = s(:shadow, val[0].to_sym) } | f_bad_arg lambda: { # TODO: dyna_push ? hrm result = lexer.lpar_beg lexer.paren_nest += 1 lexer.lpar_beg = lexer.paren_nest } f_larglist lambda_body { lpar, args, body = val lexer.lpar_beg = lpar args = 0 if args == s(:args) call = new_call nil, :lambda result = new_iter call, args, body } f_larglist: tLPAREN2 f_args opt_bv_decl rparen { result = args val } | f_args { result = val[0] } lambda_body: tLAMBEG compstmt tRCURLY { result = val[1] } | kDO_LAMBDA compstmt kEND { result = val[1] } do_block: kDO_BLOCK { self.env.extend :dynamic result = self.lexer.lineno } opt_block_param { result = self.env.dynamic.keys } compstmt kEND { args = val[2] body = val[4] result = new_iter nil, args, body result.line = val[1] self.env.unextend } block_call: command do_block { # TODO: # if (nd_type($1) == NODE_YIELD) { # compile_error(PARSER_ARG "block given to yield"); syntax_error "Both block arg and actual block given." if val[0].block_pass? result = val[1] result.insert 1, val[0] } | block_call tDOT operation2 opt_paren_args { result = new_call val[0], val[2].to_sym, val[3] } | block_call tCOLON2 operation2 opt_paren_args { result = new_call val[0], val[2].to_sym, val[3] } method_call: operation { result = self.lexer.lineno } paren_args { result = new_call nil, val[0].to_sym, val[2] } | primary_value tDOT operation2 opt_paren_args { result = new_call val[0], val[2].to_sym, val[3] } | primary_value tCOLON2 operation2 paren_args { result = new_call val[0], val[2].to_sym, val[3] } | primary_value tCOLON2 operation3 { result = new_call val[0], val[2].to_sym } | primary_value tDOT paren_args { result = new_call val[0], :call, val[2] } | primary_value tCOLON2 paren_args { result = new_call val[0], :call, val[2] } | kSUPER paren_args { result = new_super val[1] } | kSUPER { result = s(:zsuper) } | primary_value tLBRACK2 opt_call_args rbracket { result = new_aref val } brace_block: tLCURLY { self.env.extend :dynamic result = self.lexer.lineno } opt_block_param { result = self.env.dynamic.keys } compstmt tRCURLY { _, line, args, _, body, _ = val result = new_iter nil, args, body result.line = line self.env.unextend } | kDO { self.env.extend :dynamic result = self.lexer.lineno } opt_block_param { result = self.env.dynamic.keys } compstmt kEND { _, line, args, _, body, _ = val result = new_iter nil, args, body result.line = line self.env.unextend } case_body: kWHEN { result = self.lexer.lineno } args then compstmt cases { result = new_when(val[2], val[4]) result.line = val[1] result << val[5] if val[5] } cases: opt_else | case_body opt_rescue: kRESCUE exc_list exc_var then compstmt opt_rescue { _, klasses, var, _, body, rest = val klasses ||= s(:array) klasses << node_assign(var, s(:gvar, :"$!")) if var result = new_resbody(klasses, body) result << rest if rest # UGH, rewritten above } | { result = nil } exc_list: arg_value { result = s(:array, val[0]) } | mrhs | none exc_var: tASSOC lhs { result = val[1] } | none opt_ensure: kENSURE compstmt { _, body = val result = body || s(:nil) } | none literal: numeric { result = s(:lit, val[0]) } | symbol { result = s(:lit, val[0]) } | dsym strings: string { val[0] = s(:dstr, val[0].value) if val[0][0] == :evstr result = val[0] } string: string1 | string string1 { result = self.literal_concat val[0], val[1] } string1: tSTRING_BEG string_contents tSTRING_END { result = val[1] } | tSTRING { result = s(:str, val[0]) } xstring: tXSTRING_BEG xstring_contents tSTRING_END { result = new_xstring val[1] } regexp: tREGEXP_BEG regexp_contents tREGEXP_END { result = new_regexp val } words: tWORDS_BEG tSPACE tSTRING_END { result = s(:array) } | tWORDS_BEG word_list tSTRING_END { result = val[1] } word_list: none { result = s(:array) } | word_list word tSPACE { word = val[1][0] == :evstr ? s(:dstr, "", val[1]) : val[1] result = val[0] << word } word: string_content | word string_content { result = self.literal_concat val[0], val[1] } qwords: tQWORDS_BEG tSPACE tSTRING_END { result = s(:array) } | tQWORDS_BEG qword_list tSTRING_END { result = val[1] } qword_list: none { result = s(:array) } | qword_list tSTRING_CONTENT tSPACE { result = val[0] << s(:str, val[1]) } string_contents: none { result = s(:str, "") } | string_contents string_content { result = literal_concat(val[0], val[1]) } xstring_contents: none { result = nil } | xstring_contents string_content { result = literal_concat(val[0], val[1]) } regexp_contents: none { result = nil } | regexp_contents string_content { result = literal_concat(val[0], val[1]) } string_content: tSTRING_CONTENT { result = s(:str, val[0]) } | tSTRING_DVAR { result = lexer.lex_strterm lexer.lex_strterm = nil lexer.lex_state = :expr_beg } string_dvar { lexer.lex_strterm = val[1] result = s(:evstr, val[2]) } | tSTRING_DBEG { result = [lexer.lex_strterm, lexer.brace_nest, lexer.string_nest] lexer.lex_strterm = nil lexer.brace_nest = 0 lexer.string_nest = 0 lexer.cond.push false lexer.cmdarg.push false lexer.lex_state = :expr_beg } compstmt tRCURLY { _, memo, stmt, _ = val lex_strterm, brace_nest, string_nest = memo lexer.lex_strterm = lex_strterm lexer.brace_nest = brace_nest lexer.string_nest = string_nest lexer.cond.lexpop lexer.cmdarg.lexpop case stmt when Sexp then case stmt[0] when :str, :dstr, :evstr then result = stmt else result = s(:evstr, stmt) end when nil then result = s(:evstr) else raise "unknown string body: #{stmt.inspect}" end } string_dvar: tGVAR { result = s(:gvar, val[0].to_sym) } | tIVAR { result = s(:ivar, val[0].to_sym) } | tCVAR { result = s(:cvar, val[0].to_sym) } | backref symbol: tSYMBEG sym { lexer.lex_state = :expr_end result = val[1].to_sym } | tSYMBOL { result = val[0].to_sym } sym: fname | tIVAR | tGVAR | tCVAR dsym: tSYMBEG xstring_contents tSTRING_END { lexer.lex_state = :expr_end result = val[1] result ||= s(:str, "") case result[0] when :dstr then result[0] = :dsym when :str then result = s(:lit, result.last.intern) else result = s(:dsym, "", result) end } numeric: tINTEGER | tFLOAT | tUMINUS_NUM tINTEGER =tLOWEST { result = -val[1] # TODO: pt_testcase } | tUMINUS_NUM tFLOAT =tLOWEST { result = -val[1] # TODO: pt_testcase } user_variable: tIDENTIFIER | tIVAR | tGVAR | tCONSTANT | tCVAR keyword_variable: kNIL { result = s(:nil) } | kSELF { result = s(:self) } | kTRUE { result = s(:true) } | kFALSE { result = s(:false) } | k__FILE__ { result = s(:str, self.file) } | k__LINE__ { result = s(:lit, lexer.src.current_line) } | k__ENCODING__ { result = if defined? Encoding then s(:colon2, s(:const, :Encoding), :UTF_8) else s(:str, "Unsupported!") end } var_ref: user_variable { var = val[0] result = Sexp === var ? var : self.gettable(var) } | keyword_variable { var = val[0] result = Sexp === var ? var : self.gettable(var) } var_lhs: user_variable { result = self.assignable val[0] } | keyword_variable { result = self.assignable val[0] } backref: tNTH_REF { result = s(:nth_ref, val[0]) } | tBACK_REF { result = s(:back_ref, val[0]) } superclass: term { result = nil } | tLT { lexer.lex_state = :expr_beg } expr_value term { result = val[2] } | error term { yyerrok result = nil } f_arglist: tLPAREN2 f_args rparen { result = val[1] lexer.lex_state = :expr_beg self.lexer.command_start = true } | f_args term { result = val[0] } f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_f_block_arg { result = args val } | f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg { result = args val } | f_arg tCOMMA f_optarg opt_f_block_arg { result = args val } | f_arg tCOMMA f_optarg tCOMMA f_arg opt_f_block_arg { result = args val } | f_arg tCOMMA f_rest_arg opt_f_block_arg { result = args val } | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg { result = args val } | f_arg opt_f_block_arg { result = args val } | f_optarg tCOMMA f_rest_arg opt_f_block_arg { result = args val } | f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg { result = args val } | f_optarg opt_f_block_arg { result = args val } | f_optarg tCOMMA f_arg opt_f_block_arg { result = args val } | f_rest_arg opt_f_block_arg { result = args val } | f_rest_arg tCOMMA f_arg opt_f_block_arg { result = args val } | f_block_arg { result = args val } | { result = args val } f_bad_arg: tCONSTANT { yyerror "formal argument cannot be a constant" } | tIVAR { yyerror "formal argument cannot be an instance variable" } | tGVAR { yyerror "formal argument cannot be a global variable" } | tCVAR { yyerror "formal argument cannot be a class variable" } f_norm_arg: f_bad_arg | tIDENTIFIER { identifier = val[0].to_sym self.env[identifier] = :lvar result = identifier } f_arg_item: f_norm_arg | tLPAREN f_margs rparen { result = val[1] } f_arg: f_arg_item { case val[0] when Symbol then result = s(:args) result << val[0] when Sexp then result = val[0] else raise "Unknown f_arg type: #{val.inspect}" end } | f_arg tCOMMA f_arg_item { list, _, item = val if list.sexp_type == :args then result = list else result = s(:args, list) end result << item } f_opt: tIDENTIFIER tEQL arg_value { result = self.assignable val[0], val[2] # TODO: detect duplicate names } f_block_opt: tIDENTIFIER tEQL primary_value { result = self.assignable val[0], val[2] } f_block_optarg: f_block_opt { result = s(:block, val[0]) } | f_block_optarg tCOMMA f_block_opt { result = val[0] result << val[2] } f_optarg: f_opt { result = s(:block, val[0]) } | f_optarg tCOMMA f_opt { result = self.block_append val[0], val[2] } restarg_mark: tSTAR2 | tSTAR f_rest_arg: restarg_mark tIDENTIFIER { # TODO: differs from parse.y - needs tests name = val[1].to_sym self.assignable name result = :"*#{name}" } | restarg_mark { name = :"*" self.env[name] = :lvar result = name } blkarg_mark: tAMPER2 | tAMPER f_block_arg: blkarg_mark tIDENTIFIER { identifier = val[1].to_sym self.env[identifier] = :lvar result = "&#{identifier}".to_sym } opt_f_block_arg: tCOMMA f_block_arg { result = val[1] } | { result = nil } singleton: var_ref | tLPAREN2 { lexer.lex_state = :expr_beg } expr rparen { result = val[2] yyerror "Can't define single method for literals." if result[0] == :lit } assoc_list: none # [!nil] { result = s(:array) } | assocs trailer # [!nil] { result = val[0] } assocs: assoc | assocs tCOMMA assoc { list = val[0].dup more = val[2][1..-1] list.push(*more) unless more.empty? result = list } assoc: arg_value tASSOC arg_value { result = s(:array, val[0], val[2]) } | tLABEL arg_value { label, _ = val[0] # TODO: fix lineno? result = s(:array, s(:lit, label.to_sym), val[1]) } operation: tIDENTIFIER | tCONSTANT | tFID operation2: tIDENTIFIER | tCONSTANT | tFID | op operation3: tIDENTIFIER | tFID | op dot_or_colon: tDOT | tCOLON2 opt_terms: | terms opt_nl: | tNL rparen: opt_nl tRPAREN rbracket: opt_nl tRBRACK trailer: | tNL | tCOMMA term: tSEMI { yyerrok } | tNL terms: term | terms tSEMI { yyerrok } none: { result = nil } end ---- inner require "ruby_lexer" require "ruby_parser_extras" # :stopdoc: # Local Variables: ** # racc-token-length-max:14 ** # End: ** ruby_parser-3.2.2/lib/ruby18_parser.rb0000644000004100000410000067101412250152360017711 0ustar www-datawww-data# # DO NOT MODIFY!!!! # This file is automatically generated by Racc 1.4.9 # from Racc grammer file "". # require 'racc/parser.rb' class Ruby18Parser < Racc::Parser require "ruby_lexer" require "ruby_parser_extras" # :stopdoc: # Local Variables: ** # racc-token-length-max:14 ** # End: ** ##### State transition tables begin ### clist = [ '-503,483,129,129,551,-89,-450,-503,-503,-503,714,-83,3,-503,-503,604', '-503,-85,-84,-87,-86,404,425,-64,-444,-503,522,-88,523,-79,-445,-444', '483,483,-90,-503,-503,-445,-503,-503,-503,-503,-503,483,263,264,-77', '384,-75,764,-85,654,-83,672,383,575,-87,483,653,263,264,-72,699,382', '-503,-503,-503,-503,-503,-503,-503,-503,-503,-503,-503,-503,-503,-503', '672,672,-503,-503,-503,-499,545,426,131,131,-503,576,-500,-503,743,-79', '523,129,-503,750,-503,269,-503,-503,-503,-503,-503,-503,-503,-81,-503', '-503,-503,-79,271,-75,485,758,683,272,605,-77,-76,-79,-78,-503,-503', '-281,-78,757,-503,-80,-86,-79,-281,-281,-281,-79,-82,271,-281,-281,-77', '-281,272,271,271,485,485,269,272,272,271,575,673,-496,271,272,485,-365', '-76,272,-281,-281,-84,-281,-281,-281,-281,-281,271,751,485,769,453,272', '713,271,271,673,673,131,272,272,357,602,743,576,773,603,453,-281,-281', '-281,-281,-281,-281,-281,-281,-281,-281,-281,-281,-281,-281,-438,-77', '-281,-281,-281,357,546,-438,-500,776,-281,-81,-496,-281,-503,-89,-438', '-85,-281,-77,-281,299,-281,-281,-281,-281,-281,-281,-281,654,-281,-89', '-281,357,-496,299,653,736,-450,-77,358,359,413,-77,403,-281,-281,-519', '-80,-503,-281,734,-88,732,-519,-519,-519,799,-500,-519,-519,-519,158', '-519,-503,-500,358,359,575,357,-500,-503,730,-519,-500,595,-499,269', '729,357,-503,552,-519,-519,-83,-519,-519,-519,-519,-519,-90,728,-500', '94,358,359,361,357,-503,-503,394,39,576,-84,-82,584,-503,404,-90,575', '-443,-499,-275,510,814,-503,512,-443,814,-275,-275,-275,-519,-79,-275', '-275,-275,-87,-275,-519,358,359,526,-503,323,-519,717,299,-275,-275', '358,359,536,576,786,-503,404,-275,-275,326,-275,-275,-275,-275,-275', '136,325,-519,358,359,618,621,624,627,618,621,624,627,510,297,-519,512', '-519,280,282,-519,-275,-275,-275,-275,-275,-275,-275,-275,-275,-275', '-275,-275,-275,-275,711,299,-275,-275,-275,-503,796,-275,-441,-497,-275', '-499,-503,-275,-275,-441,-275,-499,-275,797,-275,-503,-275,-275,-275', '-275,-275,-275,-275,-446,-275,701,-275,297,-448,436,-446,280,282,-503', '510,-448,435,534,-519,-275,-275,-275,-275,271,-275,-519,-519,-519,272', '697,-519,-519,-519,-441,-519,-499,-281,695,510,432,-441,515,-499,-281', '-519,-497,431,-499,-500,-441,323,-499,-281,-519,-519,395,-519,-519,-519', '-519,-519,-438,323,-447,584,299,271,-497,-438,-499,-447,272,624,627', '584,299,300,277,279,281,285,288,290,292,294,296,299,302,278,271,271', '284,287,-519,272,272,693,297,263,264,-519,280,282,286,289,323,-519,297', '390,301,804,280,282,286,289,291,293,295,297,298,754,743,280,282,286', '289,-282,615,-519,619,622,625,628,-282,271,283,-500,-500,-500,272,-500', '-519,-282,-519,-500,-500,-519,265,266,-500,390,-500,-500,-500,-500,-500', '-500,-500,263,264,263,264,-500,-500,-500,-500,-500,-500,-500,754,743', '-262,271,618,621,624,627,272,-500,377,378,-500,-500,-500,-500,-500,-500', '-500,-500,-500,-500,523,-500,-500,670,-500,-500,-500,299,-520,-520,-520', '-520,285,288,807,-283,-520,-520,-283,263,264,-282,-283,284,287,-283', '-500,546,-282,-500,-500,-283,-500,-500,-283,667,-500,-282,-500,297,-500', '301,-500,280,282,286,289,291,293,295,-500,298,269,655,269,-500,-500', '-500,-500,-500,-500,816,376,269,-500,-500,-499,-499,-499,375,-499,819', '441,-88,-499,-499,439,440,374,-499,305,-499,-499,-499,-499,-499,-499', '-499,822,-262,825,650,-499,-499,-499,-499,-499,-499,-499,680,681,649', '682,86,93,648,829,323,-499,323,305,-499,-499,-499,-499,-499,-499,-499', '-499,-499,-499,-72,-499,-499,831,-499,-499,-499,299,300,277,279,281', '285,288,290,292,294,296,600,-520,-520,103,647,284,287,599,-499,712,102', '-499,-499,644,-499,-499,598,299,-499,101,-499,297,-499,301,-499,280', '282,286,289,291,293,295,-499,298,-263,299,299,-499,-499,-499,-499,-499', '-499,836,299,639,-499,-499,19,23,27,32,36,638,609,-86,54,62,608,842', '844,82,584,90,96,6,11,18,24,28,847,450,743,323,51,57,60,63,68,73,78', '851,852,97,316,317,318,319,320,30,38,42,46,47,52,59,66,69,74,79,83,86', '93,853,9,16,542,26,31,35,299,-520,-520,-520,-520,285,288,857,-281,-520', '-520,-281,532,452,-327,-281,284,287,-281,41,-500,-327,55,-500,-281,72', '77,-281,269,91,-327,7,297,861,301,29,280,282,286,289,291,293,295,65', '298,862,736,730,87,94,4,10,17,21,736,-282,866,39,43,19,23,27,-282,36', '452,509,850,54,62,488,487,-282,82,849,90,96,6,11,18,24,28,-63,848,871', '454,51,57,60,63,68,73,78,873,446,97,445,876,877,442,666,584,38,584,299', '47,52,59,66,69,74,79,83,86,93,428,9,16,884,26,31,35,299,300,277,279', '281,285,288,290,292,294,296,-274,302,278,-449,424,284,287,-274,141,410', '-449,125,408,407,72,77,-274,406,91,-449,891,297,405,301,29,280,282,286', '289,291,293,295,65,298,404,399,323,87,94,4,10,17,21,390,385,323,39,43', '271,283,19,23,27,272,36,315,381,-449,54,62,269,905,379,82,-449,90,96', '6,106,107,24,28,354,-449,908,910,114,115,116,63,68,73,78,316,317,318', '319,320,346,336,305,303,112,275,912,47,52,59,66,69,74,79,83,86,93,913', '9,16,914,-274,615,109,619,622,625,628,-274,397,316,317,318,319,320,736', '396,-274,916,638,269,584,584,792,166,395,125,159,156,72,77,923,152,91', '98,584,,,,615,630,619,622,625,628,,,,618,621,624,627,87,94,4,10,17,21', ',,,39,43,19,23,27,892,36,,,,54,62,,,,82,630,90,96,6,106,107,24,28,618', '621,624,627,114,115,116,63,68,73,78,,,,,,,,,,112,,,47,52,59,66,69,74', '79,83,86,93,,9,16,,,,109,299,300,277,279,281,285,288,290,292,294,296', ',302,278,,,284,287,,792,,,125,,,72,77,,,91,,,297,,301,,280,282,286,289', '291,293,295,,298,,,,87,94,4,10,17,21,,,,39,43,,283,643,793,14,19,23', '27,32,36,,,,54,62,,,,82,,90,96,6,11,18,24,28,,,,,51,57,60,63,68,73,78', ',,97,,,,,,30,38,42,46,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35', ',,,,,,,,,,,,,,,,,,,41,,,313,,,72,77,,,91,,7,,,,29,615,,619,622,625,628', ',65,,,,,87,94,4,10,17,21,,,,39,43,14,19,23,27,32,36,,,,54,62,,,,82,', '90,96,6,11,18,24,28,618,621,624,627,51,57,60,63,68,73,78,,,97,,,,,,30', '38,42,46,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,299,,,,,,,,,', ',,,,,,284,287,,41,,,55,,,72,77,,,91,,7,297,,301,29,280,282,286,289,', ',295,65,298,,,,87,94,4,10,17,21,,,,39,43,14,19,23,27,32,36,,,,54,62', ',,,82,,90,96,6,11,18,24,28,,,,,51,57,60,63,68,73,78,,,97,,,,,,30,38', '42,46,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,299,300,277,279', '281,285,288,290,,294,296,,,,,,284,287,,41,,,55,,,72,77,,,91,,7,297,', '301,29,280,282,286,289,291,293,295,65,298,,,,87,94,4,10,17,21,,,,39', '43,14,19,23,27,32,36,,,,54,62,,,,82,,90,96,6,11,18,24,28,,,,,51,57,60', '63,68,73,78,,,97,,,,,,30,38,42,46,47,52,59,66,69,74,79,83,86,93,,9,16', ',26,31,35,299,,,,,,,,,,,,,,,,284,287,,41,,,55,,,72,77,,,91,,7,297,,301', '29,280,282,286,289,,,295,65,298,,,,87,94,4,10,17,21,,,,39,43,14,19,23', '27,32,36,,,,54,62,,,,82,,90,96,6,11,18,24,28,,,,,51,57,60,63,68,73,78', ',,97,,,,,,30,38,42,46,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35', '299,-520,-520,-520,-520,285,288,,,-520,-520,,,,,,284,287,,41,,,55,,', '72,77,,,91,,7,297,,301,29,280,282,286,289,291,293,295,65,298,,,,87,94', '4,10,17,21,,,,39,43,14,19,23,27,32,36,,,,54,62,,,,82,,90,96,6,11,18', '24,28,,,,,51,57,60,63,68,73,78,,,97,,,,,,30,38,42,46,47,52,59,66,69', '74,79,83,86,93,,9,16,,26,31,35,299,-520,-520,-520,-520,285,288,,,-520', '-520,,,,,,284,287,,41,,,55,,,72,77,,,91,,7,297,,301,29,280,282,286,289', '291,293,295,65,298,,,,87,94,4,10,17,21,,,,39,43,14,19,23,27,32,36,,', ',54,62,,,,82,,90,96,6,11,18,24,28,,,,,51,57,60,63,68,73,78,,,97,,,,', ',30,38,42,46,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,299,,,,,', ',,,,,,,,,,284,287,,41,,,55,,,72,77,,,91,,7,297,,301,29,280,282,286,289', ',,295,65,298,,,,87,94,4,10,17,21,,,,39,43,14,19,23,27,32,36,,,,54,62', ',,,82,,90,96,6,11,18,24,28,,,,,51,57,60,63,68,73,78,,,97,,,,,,30,38', '42,46,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,299,-520,-520,-520', '-520,285,288,,,-520,-520,,,,,,284,287,,41,,,55,,,72,77,,,91,,7,297,', '301,29,280,282,286,289,291,293,295,65,298,,,,87,94,4,10,17,21,,,,39', '43,14,19,23,27,32,36,,,,54,62,,,,82,,90,96,6,11,18,24,28,,,,,51,57,60', '63,68,73,78,,,97,,,,,,30,38,42,46,47,52,59,66,69,74,79,83,86,93,,9,16', ',26,31,35,299,300,277,279,281,285,288,290,292,294,296,,-520,-520,,,284', '287,,41,,,55,,,72,77,,,91,,7,297,,301,29,280,282,286,289,291,293,295', '65,298,,,,87,94,4,10,17,21,,,,39,43,14,19,23,27,32,36,,,,54,62,,,,82', ',90,96,6,11,18,24,28,,,,,51,57,60,63,68,73,78,,,97,,,,,,30,38,42,46', '47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,299,,,,,,,,,,,,,,,,284', '287,,41,,,55,,,72,77,,,91,,7,297,,301,29,280,282,286,289,,,295,65,298', ',,,87,94,4,10,17,21,,,,39,43,14,19,23,27,32,36,,,,54,62,,,,82,,90,96', '6,11,18,24,28,,,,,51,57,60,63,68,73,78,,,97,,,,,,30,38,42,46,47,52,59', '66,69,74,79,83,86,93,,9,16,,26,31,35,299,-520,-520,-520,-520,285,288', ',,-520,-520,,,,,,284,287,,41,,,55,,,72,77,,,91,,7,297,,301,29,280,282', '286,289,291,293,295,65,298,,,,87,94,4,10,17,21,,,,39,43,14,19,23,27', '32,36,,,,54,62,,,,82,,90,96,6,11,18,24,28,,,,,51,57,60,63,68,73,78,', ',97,,,,,,30,38,42,46,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,299', '300,277,279,281,285,288,,,294,296,,,,,,284,287,,41,,,55,,,72,77,,,91', ',7,297,,301,29,280,282,286,289,291,293,295,65,298,,,,87,94,4,10,17,21', ',,,39,43,14,19,23,27,32,36,,,,54,62,,,,82,,90,96,6,11,18,24,28,,,,,51', '57,60,63,68,73,78,,,97,,,,,,30,38,42,46,47,52,59,66,69,74,79,83,86,93', ',9,16,,26,31,35,299,,,,,,,,,,,,,,,,284,287,,41,,,55,,,72,77,,,91,,7', '297,,,29,280,282,286,289,,,,65,,,,,87,94,4,10,17,21,,,,39,43,14,19,23', '27,32,36,,,,54,62,,,,82,,90,96,6,11,18,24,28,,,,,51,57,60,63,68,73,78', ',,97,,,,,,30,38,42,46,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35', '299,,,,,,,,,,,,,,,,284,287,,41,,,55,,,72,77,,,91,,7,297,,301,29,280', '282,286,289,,,,65,,,,,87,94,4,10,17,21,,,,39,43,14,19,23,27,32,36,,', ',54,62,,,,82,,90,96,6,11,18,24,28,,,,,51,57,60,63,68,73,78,,,97,,,,', ',30,38,42,46,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,299,,,,,', ',,,,,,,,,,284,287,,41,,,55,,,72,77,,,91,,7,297,,301,29,280,282,286,289', ',,,65,,,,,87,94,4,10,17,21,,,,39,43,14,19,23,27,32,36,,,,54,62,,,,82', ',90,96,6,11,18,24,28,,,,,51,57,60,63,68,73,78,,,97,,,,,,30,38,42,46', '47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,41', ',,55,,,72,77,,,91,,7,,,,29,,,,,,,,65,,,,,87,94,4,10,17,21,,,,39,43,14', '19,23,27,32,36,,,,54,62,,,,82,,90,96,6,11,18,24,28,,,,,51,57,60,63,68', '73,78,,,97,,,,,,30,38,42,46,47,52,59,66,69,74,79,83,86,93,,9,16,,26', '31,35,,,,,,,,,,,,,,,,,,,,41,,,55,,,72,77,,,91,,7,,,,29,,,,,,,,65,,,', ',87,94,4,10,17,21,,,,39,43,14,19,23,27,32,36,,,,54,62,,,,82,,90,96,6', '11,18,24,28,,,,,51,57,60,63,68,73,78,,,97,,,,,,30,38,42,46,47,52,59', '66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,41,,,55,,,72', '77,,,91,,7,,,,29,,,,,,,,65,,,,,87,94,4,10,17,21,,,,39,43,14,19,23,27', '32,36,,,,54,62,,,,82,,90,96,6,11,18,24,28,,,,,51,57,60,63,68,73,78,', ',97,,,,,,30,38,42,46,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,', ',,,,,,,,,,,,,,,,,,41,,,55,,,72,77,,,91,,7,,,,29,,,,,,,,65,,,,,87,94', '4,10,17,21,,,,39,43,14,19,23,27,32,36,,,,54,62,,,,82,,90,96,6,11,18', '24,28,,,,,51,57,60,63,68,73,78,,,97,,,,,,30,38,42,46,47,52,59,66,69', '74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,41,,,313,,,72,77,', ',91,,7,,,,29,,,,,,,,65,,,,,87,94,4,10,17,21,,,,39,43,14,19,23,27,32', '36,,,,54,62,,,,82,,90,96,6,11,18,24,28,,,,,51,57,60,63,68,73,78,,,97', ',,,,,30,38,42,46,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,', ',,,,,,,,,,,,,,41,,,55,,,72,77,,,91,,7,,,,29,,,,,,,,65,,,,,87,94,4,10', '17,21,,,,39,43,14,19,23,27,32,36,,,,54,62,,,,82,,90,96,6,11,18,24,28', ',,,,51,57,60,63,68,73,78,,,97,,,,,,30,38,42,46,47,52,59,66,69,74,79', '83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,41,,,55,,,72,77,,,91,,7', ',,,29,,,,,,,,65,,,,,87,94,4,10,17,21,,,,39,43,14,19,23,27,32,36,,,,54', '62,,,,82,,90,96,6,11,18,24,28,,,,,51,57,60,63,68,73,78,,,97,,,,,,30', '38,42,46,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,', ',,,,,,41,,,55,,,72,77,,,91,,7,,,,29,,,,,,,,65,,,,,87,94,4,10,17,21,', ',,39,43,14,19,23,27,32,36,,,,54,62,,,,82,,90,96,6,11,18,24,28,,,,,51', '57,60,63,68,73,78,,,97,,,,,,30,38,42,46,47,52,59,66,69,74,79,83,86,93', ',9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,41,,,313,,,72,77,,,91,,7,,,,29,,', ',,,,,65,,,,,87,94,4,10,17,21,,,,39,43,14,19,23,27,32,36,,,,54,62,,,', '82,,90,96,6,11,18,24,28,,,,,51,57,60,63,68,73,78,,,97,,,,,,30,38,42', '46,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,', '41,,,55,,,72,77,,,91,,7,,,,29,,,,,,,,65,,,,,87,94,4,10,17,21,,,,39,43', '14,19,23,27,32,36,,,,54,62,,,,82,,90,96,6,11,18,24,28,,,,,51,57,60,63', '68,73,78,,,97,,,,,,30,38,42,46,47,52,59,66,69,74,79,83,86,93,,9,16,', '26,31,35,,,,,,,,,,,,,,,,,,,,41,,,55,,,72,77,,,91,,7,,,,29,,,,,,,,65', ',,,,87,94,4,10,17,21,,,,39,43,14,19,23,27,32,36,,,,54,62,,,,82,,90,96', '6,11,18,24,28,,,,,51,57,60,63,68,73,78,,,97,,,,,,30,38,42,46,47,52,59', '66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,41,,,55,,,72', '77,,,91,,7,,,,29,,,,,,,,65,,,,,87,94,4,10,17,21,,,,39,43,14,19,23,27', '32,36,,,,54,62,,,,82,,90,96,6,11,18,24,28,,,,,51,57,60,63,68,73,78,', ',97,,,,,,30,38,42,46,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,', ',,,,,,,,,,,,,,,,,,41,,,55,,,72,77,,,91,,7,,,,29,,,,,,,,65,,,,,87,94', '4,10,17,21,,,,39,43,14,19,23,27,32,36,,,,54,62,,,,82,,90,96,6,11,18', '24,28,,,,,51,57,60,63,68,73,78,,,97,,,,,,30,38,42,46,47,52,59,66,69', '74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,41,,,55,,,72,77,,', '91,,7,,,,29,,,,,,,,65,,,,,87,94,4,10,17,21,,,,39,43,174,177,181,187', '192,197,201,205,211,218,226,230,231,234,237,241,243,169,171,173,179', '183,189,193,,,206,212,219,250,253,256,259,238,242,244,,,,,,185,195,199', '203,247,248,249,224,,,258,,,,,,,,180,186,,196,200,209,216,,225,229,', ',236,,,,,175,178,182,188,,,,,,,,,,,,,,170,172,,176,184,190,194,198,202', '207,213,220,,228,,,239,87,,,19,23,27,,36,,,43,54,62,,,,82,,90,96,6,11', '18,24,28,,,,,51,57,60,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79', '83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,', ',,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62', ',,,82,,90,96,6,11,18,24,28,,,,,51,57,60,63,68,73,78,,,97,,,,,,,38,,', '47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141', ',,125,,,72,77,,,91,,,,,,29,,,,,,,,65,,,,,87,94,4,10,17,21,,,,39,43,19', '23,27,,36,,,,54,62,,,,82,,90,96,6,11,18,24,28,,,,,51,57,60,63,68,73', '78,,,97,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,', ',,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,,,,,,,65,,,,,87,94,4', '10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28', ',,,,114,57,60,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93', ',9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,330,,,,29', ',,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,-497,-497,-497,,-497,,,,-497', '-497,,,,-497,,-497,-497,-497,-497,-497,-497,-497,,-497,,,-497,-497,-497', '-497,-497,-497,-497,,,,,,,,,,-497,,,-497,-497,-497,-497,-497,-497,-497', '-497,-497,-497,,-497,-497,,-497,-497,-497,,,,,,,,,,,,,,,,,,,,-497,,', '-497,-497,,-497,-497,,,-497,,-497,,-497,,-497,,,,,,,,-497,,-497,,,-497', '-497,-497,-497,-497,-497,,,,-497,-497,19,23,27,,36,,,,54,62,,,,82,,90', '96,6,106,107,24,28,,,,,114,57,60,63,68,73,78,,,,,,,,,,38,,,47,52,59', '66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,', '72,77,,,91,,592,,136,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,-252', '-252,-252,,-252,,,,-252,-252,,,,-252,,-252,-252,-252,-252,-252,-252', '-252,,,,,-252,-252,-252,-252,-252,-252,-252,,,,,,,,,,-252,,,-252,-252', '-252,-252,-252,-252,-252,-252,-252,-252,,-252,-252,,-252,-252,-252,', ',,,,,,,,,,,,,,,,,,-252,,,-252,323,,-252,-252,,,-252,,-252,,-252,,-252', ',,,,,,,-252,,,,,-252,-252,-252,-252,-252,-252,,,,-252,-252,19,23,27', ',36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78', ',,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,', ',,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4,10', '17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,', ',,114,115,116,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93', ',9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,', ',,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,', '90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38,,,47,52', '59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125', ',,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23', '27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73', '78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,', ',,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4', '10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28', ',,,,114,115,116,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86', '93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29', ',,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82', ',90,96,6,11,18,24,28,,,,,51,57,60,63,68,73,78,,,97,,,,,,,38,,,47,52', '59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125', ',,72,77,,,91,,,,,,29,,,,,,,,65,,,,,87,94,4,10,17,21,,,,39,43,19,23,27', ',36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78', ',,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,', ',,,,,,,,,,,141,,,125,,,72,77,,,91,,767,,,,29,,,,,,,,145,,,,,87,94,4', '10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28', ',,,,114,57,60,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93', ',9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,330,,,,29', ',,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82', ',90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38,,,47', '52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,', '125,,,72,77,,,91,,516,,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43', '19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63', '68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35', ',,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,770,,,,29,,,,,,,,145,,,,', '87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,11,18', '24,28,,,,,51,57,60,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83', '86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,', ',29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,174,177,181,187,192,197', '201,205,211,218,226,230,231,234,237,241,243,169,171,173,179,183,189', '193,,,206,212,219,250,253,256,259,238,242,244,,,,,,185,195,199,203,247', '248,249,224,,,258,,,,,,,,180,186,,196,200,209,216,,225,229,,,236,,,', ',175,178,182,188,,,,,,,,,,,,,,170,172,,176,184,190,194,198,202,207,213', '220,,228,,,239,87,,,19,23,27,,36,,,43,54,62,,,,82,,90,96,6,106,107,24', '28,,,,,114,57,60,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86', '93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,330,,', ',29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,', ',,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,112', ',,47,52,59,66,69,74,79,83,86,93,,9,16,,,,109,,,,,,,,,,,,,,,,,,,,792', ',,125,,,72,77,,,91,,,,,,,,,,,,,,,,,,,87,94,4,10,17,21,,,,39,43,19,23', '27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73', '78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,', ',,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4', '10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28', ',,,,114,57,60,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93', ',9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,330,,,,29', ',,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82', ',90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38,,,47', '52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,', '125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19', '23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68', '73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,', ',,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,781,,136,,29,,,,,,,,145,,,', ',87,94,4,10,17,21,,,,39,43,-496,-496,-496,,-496,,,,-496,-496,,,,-496', ',-496,-496,-496,-496,-496,-496,-496,,-496,,,-496,-496,-496,-496,-496', '-496,-496,,,,,,,,,,-496,,,-496,-496,-496,-496,-496,-496,-496,-496,-496', '-496,,-496,-496,,-496,-496,-496,,,,,,,,,,,,,,,,,,,,-496,,,-496,-496', ',-496,-496,,,-496,,-496,,-496,,-496,,,,,,,,-496,,-496,,,-496,-496,-496', '-496,-496,-496,,,,-496,-496,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106', '107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74', '79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91', ',782,,136,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36', ',,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,', ',,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,', ',,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4,10,17', '21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114', '115,116,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16', ',26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,,,,,,,145', ',,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106', '107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,112,,,47,52,59,66,69', '74,79,83,86,93,,9,16,,,,109,,,,,,,,,,,,,,,,,,,,113,,,55,,,72,77,,,91', ',7,,,,,,,,,,,,,,,,,87,94,4,10,17,21,,,,39,43,-252,-252,-252,,-252,,', ',-252,-252,,,,-252,,-252,-252,-252,-252,-252,-252,-252,,,,,-252,-252', '-252,-252,-252,-252,-252,,,,,,,,,,-252,,,-252,-252,-252,-252,-252,-252', '-252,-252,-252,-252,,-252,-252,,-252,-252,-252,,,,,,,,,,,,,,,,,,,,-252', ',,-252,315,,-252,-252,,,-252,,-252,,-252,,-252,,,,,,,,-252,,,,,-252', '-252,-252,-252,-252,-252,,,,-252,-252,19,23,27,,36,,,,54,62,,,,82,,90', '96,6,11,18,24,28,,,,,51,57,60,63,68,73,78,,,97,,,,,,,38,,,47,52,59,66', '69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72', '77,,,91,,,,,,29,,,,,,,,65,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36', ',,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,57,60,63,68,73,78,,,,', ',,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,', ',,,,,,,141,,,125,,,388,77,,,91,,134,,136,,29,,,,,,,,145,,,,,87,94,4', '10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28', ',,,,114,115,116,63,68,73,78,,,,,,,,,,112,,,47,52,59,66,69,74,79,83,86', '93,,9,16,,,,109,,,,,,,,,,,,,,,,,,,,124,,,125,,,72,77,,,91,,,,,,,,,,', ',,,,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96', '6,106,107,24,28,,,,,114,57,60,63,68,73,78,,,,,,,,,,38,,,47,52,59,66', '69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72', '77,,,91,,134,,136,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23', '27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73', '78,,,,,,,,,,112,,,47,52,59,66,69,74,79,83,86,93,,9,16,,,,109,,,,,,,', ',,,,,,,,,,,,792,,,125,,,72,77,,,91,,,,,,,,,,,,,,,,,,,87,94,4,10,17,21', ',,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114', '115,116,63,68,73,78,,,,,,,,,,112,,,47,52,59,66,69,74,79,83,86,93,,9', '16,,,,109,,,,,,,,,,,,,,,,,,,,124,,,164,,,72,77,,,91,,704,,705,,,,,,', ',,708,,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90', '96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38,,,47,52,59', '66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,', '72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27', ',36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,57,60,63,68,73,78', ',,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,', ',,,,,,,,,,,141,,,125,,,72,77,,,91,,134,,136,,29,,,,,,,,145,,,,,87,94', '4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24', '28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83', '86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,', ',29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,', ',,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38', ',,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141', ',,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43', '-501,-501,-501,,-501,,,,-501,-501,,,,-501,,-501,-501,-501,-501,-501', '-501,-501,,,,,-501,-501,-501,-501,-501,-501,-501,,,,,,,,,,-501,,,-501', '-501,-501,-501,-501,-501,-501,-501,-501,-501,,-501,-501,,-501,-501,-501', ',,,,,,,,,,,,,,,,,,,-501,,,-501,-501,,-501,-501,,,-501,,-501,,-501,,-501', ',,,,,,,-501,,,,,-501,-501,-501,-501,-501,-501,,,,-501,-501,19,23,27', ',36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78', ',,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,', ',,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4,10', '17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,11,18,24,28,,,,', '51,57,60,63,68,73,78,,,97,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,', '9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,,', ',,,,65,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90', '96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38,,,47,52,59', '66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,', '72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27', ',36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78', ',,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,', ',,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4,10', '17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,', ',,114,115,116,63,68,73,78,,,,,,,,,,112,,,47,52,59,66,69,74,79,83,86', '93,,9,16,,,,109,,,,,,,,,,,,,,,,,,,,792,,,125,,,72,77,,,91,,,,,,,,,,', ',,,,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96', '6,106,107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38,,,47,52,59,66', '69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72', '77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36', ',,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,', ',,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,', ',,,,,,,,,141,,,125,,,72,77,,,91,,802,,136,,29,,,,,,,,145,,,,,87,94,4', '10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,11,18,24,28,', ',,,51,57,60,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93', ',9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,', ',,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,', '90,96,6,11,18,24,28,,,,,51,57,60,63,68,73,78,,,,,,,,,,38,,,47,52,59', '66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,', '72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27', ',36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78', ',,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,', ',,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4,10', '17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,', ',,114,115,116,63,68,73,78,,,,,,,,,,112,,,47,52,420,66,69,74,421,83,86', '93,,9,16,,,,109,,,,,,,,,,,,,,,,,,,,417,,,125,,,72,77,,,91,,,,,,,,,,', ',,,,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96', '6,11,18,24,28,,,,,51,57,60,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69', '74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77', ',,91,,,,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,', ',,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,57,60,63,68,73,78,,,,,', ',,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,', ',,,,,,141,,,125,,,72,77,,,91,,330,,,,29,,,,,,,,145,,,,,87,94,4,10,17', '21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,11,18,24,28,,,,,51', '57,60,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16', ',26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,,,,,,,145', ',,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106', '107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,112,,,47,52,59,66,69', '74,79,83,86,93,,9,16,,,,109,,,,,,,,,,,,,,,,,,,,124,,,125,,,72,77,,,91', ',,,,,,,,,,,,,,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,', ',82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38,', ',47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141', ',,125,,,72,77,,,91,,882,,136,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,', '39,43,19,23,27,32,36,,,,54,62,,,,82,,90,96,6,11,18,24,28,,,,,51,57,60', '63,68,73,78,,,97,,,,,,30,38,42,46,47,52,59,66,69,74,79,83,86,93,,9,16', ',26,31,35,,,,,,,,,,,,,,,,,,,,41,,,55,,,72,77,,,91,,7,,,,29,,,,,,,,65', ',,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106', '107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,112,,,47,52,420,66,69', '74,421,83,86,93,,9,16,,,,109,,,,,,,,,,,,,,,,,,,,417,,,125,,,72,77,,', '91,,,,,,,,,,,,,,,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62', ',,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38', ',,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141', ',,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43', '19,23,27,,36,,,,54,62,,,,82,,90,96,6,11,18,24,28,,,,,51,57,60,63,68', '73,78,,,97,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35', ',,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,,,,,,,65,,,,,87,94', '4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24', '28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83', '86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,', ',29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,', ',,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38', ',,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141', ',,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43', '19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63', '68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35', ',,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87', '94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107', '24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79', '83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,', '663,,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54', '62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,', ',38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,', ',,,141,,,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,', ',39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,57', '60,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26', '31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,134,,136,,29,,,,,,', ',145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96', '6,106,107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,112,,,47,52,59', '66,69,74,79,83,86,93,,9,16,,,,109,,,,,,,,,,,,,,,,,,,,792,,,125,,,72', '77,,,91,,,,,,,,,,,,,,,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,', '54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,,,,', ',,,,112,,,47,52,59,66,69,74,79,83,86,93,,9,16,,,,109,,,,,,,,,,,,,,,', ',,,,124,,,164,,,72,77,,,91,,162,,,,,,,,,,,,,,,,,87,94,4,10,17,21,,,', '39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,11,18,24,28,,,,,51,57,60', '63,68,73,78,,,97,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26', '31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,,,,,,,65,,', ',,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106', '107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74', '79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91', ',881,,136,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36', ',,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,', ',,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,', ',,,,,,,,,141,,,125,,,72,77,,,91,,921,,136,,29,,,,,,,,145,,,,,87,94,4', '10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,11,18,24,28,', ',,,51,57,60,63,68,73,78,,,97,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93', ',9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,', ',,,,,65,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90', '96,6,11,18,24,28,,,,,51,57,60,63,68,73,78,,,97,,,,,,,38,,,47,52,59,66', '69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72', '77,,,91,,,,,,29,,,,,,,,65,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36', ',,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,', ',,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,', ',,,,,,,,,141,,,125,,,72,77,,,91,,875,,,,29,,,,,,,,145,,,,,87,94,4,10', '17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,', ',,114,115,116,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93', ',9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,', ',,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,', '90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,112,,,47', '52,59,66,69,74,79,83,86,93,,9,16,,,,109,,,,,,,,,,,,,,,,,,,,792,,,125', ',,72,77,,,91,,,,,,,,,,,,,,,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36', ',,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,', ',,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,', ',,,,,,,,,141,,,125,450,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4,10', '17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,', ',,114,115,116,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93', ',9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,', ',,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,', '90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38,,,47,52', '59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125', ',,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23', '27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73', '78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,', ',,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4', '10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28', ',,,,114,115,116,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86', '93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29', ',,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82', ',90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38,,,47', '52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,', '125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19', '23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68', '73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,', ',,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94', '4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24', '28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83', '86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,', ',29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,', ',,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38', ',,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141', ',,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43', '19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63', '68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35', ',,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87', '94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107', '24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79', '83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,', ',,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62', ',,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38', ',,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141', ',,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43', '19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63', '68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35', ',,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87', '94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107', '24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79', '83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,', ',,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62', ',,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38', ',,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141', ',,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43', '19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63', '68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35', ',,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87', '94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107', '24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79', '83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,', ',,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62', ',,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38', ',,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141', ',,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43', '19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63', '68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35', ',,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87', '94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107', '24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79', '83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,', ',,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62', ',,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38', ',,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141', ',,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43', '19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63', '68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35', ',,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87', '94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107', '24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79', '83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,', ',,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62', ',,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38', ',,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141', ',,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43', '19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63', '68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35', ',,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87', '94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107', '24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79', '83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,', ',,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62', ',,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38', ',,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141', ',,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43', '19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63', '68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35', ',,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87', '94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107', '24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79', '83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,', ',,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62', ',,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38', ',,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141', ',,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43', '19,23,27,,36,,,,54,62,,,,82,,90,96,6,11,18,24,28,,,,,51,57,60,63,68', '73,78,,,97,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35', ',,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,,,,,,,65,,,,,87,94', '4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24', '28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83', '86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,', ',29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,', ',,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38', ',,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141', ',,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43', '19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63', '68,73,78,,,,,,,,,,112,,,47,52,59,66,69,74,79,83,86,93,,9,16,,,,109,', ',,,,,,,,,,,,,,,,,,792,,,125,,,72,77,,,91,,,,,,,,,,,,,,,,,,,87,94,4,10', '17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,', ',,114,115,116,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93', ',9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,', ',,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,', '90,96,6,11,18,24,28,,,,,51,57,60,63,68,73,78,,,97,,,,,,,38,,,47,52,59', '66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,', '72,77,,,91,,,,,,29,,,,,,,,65,,,,,87,94,4,10,17,21,,,,39,43,19,23,27', ',36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78', ',,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,', ',,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4,10', '17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,', ',,114,57,60,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93', ',9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,491,72,77,,,91,,134,,136', ',29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,', ',,82,,90,96,6,11,18,24,28,,,,,51,57,60,63,68,73,78,,,97,,,,,,,38,,,47', '52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,', '125,,,72,77,,,91,,,,,,29,,,,,,,,65,,,,,87,94,4,10,17,21,,,,39,43,19', '23,27,,36,,,,54,62,,,,82,,90,96,6,11,18,24,28,,,,,51,57,60,63,68,73', '78,,,97,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,', ',,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,,,,,,,65,,,,,87,94,4', '10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,11,18,24,28,', ',,,51,57,60,63,68,73,78,,,97,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93', ',9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,', ',,,,,65,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90', '96,6,11,18,24,28,,,,,51,57,60,63,68,73,78,,,97,,,,,,,38,,,47,52,59,66', '69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72', '77,,,91,,,,,,29,,,,,,,,65,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,32', '36,,,,54,62,,,,82,,90,96,6,11,18,24,28,,,,,51,57,60,63,68,73,78,,,97', ',,,,,30,38,42,46,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,', ',,,,,,,,,,,,,,41,,,55,,,72,77,,,91,,7,,,,29,,,,,,,,65,,,,,87,94,4,10', '17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,', ',,114,57,60,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93', ',9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,134,,136', ',29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,', ',,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38', ',,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141', ',,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43', '174,177,181,187,192,197,201,205,211,218,226,230,231,234,237,241,243', '169,171,173,179,183,189,193,,,206,212,219,250,253,256,259,238,242,244', ',,,,,185,195,199,203,247,248,249,224,255,,258,,,,,,,,180,186,,196,200', '209,216,,225,229,,,236,,,,,175,178,182,188,,,,,,,,,,,,,,170,172,,176', '184,190,194,198,202,207,213,220,,228,,,239,87,,,19,23,27,,36,,,43,54', '62,,,,82,,90,96,6,11,18,24,28,,,,,51,57,60,63,68,73,78,,,97,,,,,,,38', ',,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141', ',,125,,,72,77,,,91,,,,,,29,,,,,,,,65,,,,,87,94,4,10,17,21,,,,39,43,19', '23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68', '73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,', ',,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,592,,136,,29,,,,,,,,145,,,', ',87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106', '107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74', '79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91', ',,,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54', '62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,', ',38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,', ',,,141,,,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,', ',39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,115', '116,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26', '31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,,,,,,,145,', ',,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106', '107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74', '79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91', ',,,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54', '62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,', ',38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,', ',,,141,,,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,', ',39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,11,18,24,28,,,,,51,57,60', '63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31', '35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,516,,,,29,,,,,,,,145,', ',,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106', '107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74', '79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91', ',586,,136,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36', ',,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,', ',,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,', ',,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4,10,17', '21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114', '115,116,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16', ',26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,,,,,,,145', ',,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106', '107,24,28,,,,,114,57,60,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74', '79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91', ',330,,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,', '54,62,,,,82,,90,96,6,11,18,24,28,,,,,51,57,60,63,68,73,78,,,,,,,,,,38', ',,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141', ',,125,,,72,77,,,91,,516,,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,,,39', '43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,11,18,24,28,,,,,51,57,60,63', '68,73,78,,,97,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31', '35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,,,,,,,65,,,,,87', '94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,11,18,24', '28,,,,,51,57,60,63,68,73,78,,,97,,,,,,,38,,,47,52,59,66,69,74,79,83', '86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,566', ',136,,29,,,,,,,,65,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54', '62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,,,,,,,', ',38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,', ',,,141,,,125,,,72,77,,,91,,,,,,29,,,,,,,,145,,,,,87,94,4,10,17,21,,', ',39,43,19,23,27,,36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,57', '60,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93,,9,16,,26', '31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,330,,,,29,,,,,,,,145', ',,,,87,94,4,10,17,21,,,,39,43,-252,-252,-252,,-252,,,,-252,-252,,,,-252', ',-252,-252,-252,-252,-252,-252,-252,,,,,-252,-252,-252,-252,-252,-252', '-252,,,,,,,,,,-252,,,-252,-252,-252,-252,-252,-252,-252,-252,-252,-252', ',-252,-252,,-252,-252,-252,,,,,,,,,,,,,,,,,,,,-252,,,-252,323,,-252', '-252,,,-252,,-252,,-252,,-252,,,,,,,,-252,,,,,-252,-252,-252,-252,-252', '-252,,,,-252,-252,19,23,27,,36,,,,54,62,,,,82,,90,96,6,11,18,24,28,', ',,,51,57,60,63,68,73,78,,,,,,,,,,38,,,47,52,59,66,69,74,79,83,86,93', ',9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,,72,77,,,91,,,,,,29,,', ',,,,,145,,,,,87,94,4,10,17,21,,,,39,43,19,23,27,,36,,,,54,62,,,,82,', '90,96,6,11,18,24,28,,,,,51,57,60,63,68,73,78,,,97,,,,,,,38,,,47,52,59', '66,69,74,79,83,86,93,,9,16,,26,31,35,,,,,,,,,,,,,,,,,,,,141,,,125,,', '72,77,,,91,,,,,,29,,,,,,,,65,,,,,87,94,4,10,17,21,,,,39,43,19,23,27', ',36,,,,54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78', ',,,,,,,,,112,,,47,52,59,66,69,74,79,83,86,93,,9,16,,,,109,,,,,,,,,,', ',,,,,,,,,124,,,164,,,72,77,,,91,,854,,855,,,,,,,,,,,,,,,87,94,4,10,17', '21,,,,39,43,174,177,181,187,192,197,201,205,211,218,226,230,231,234', '237,241,243,169,171,173,179,183,189,193,,,206,212,219,250,253,256,259', '238,242,244,,,,,,185,195,199,203,247,248,249,224,,,258,,,,,,,,180,186', ',196,200,209,216,,225,229,,,236,,,,,175,178,182,188,,,,,,,,,,,,,,170', '172,,176,184,190,194,198,202,207,213,220,,228,,,239,87,,,-502,-502,-502', ',-502,,,43,-502,-502,,,,-502,,-502,-502,-502,-502,-502,-502,-502,,,', ',-502,-502,-502,-502,-502,-502,-502,,,,,,,,,,-502,,,-502,-502,-502,-502', '-502,-502,-502,-502,-502,-502,,-502,-502,,-502,-502,-502,,,,,,,,,,,', ',,,,,,,,-502,,,-502,-502,,-502,-502,,,-502,,-502,,-502,,-502,,,,,,,', '-502,,,,,-502,-502,-502,-502,-502,-502,,,,-502,-502,19,23,27,,36,,,', '54,62,,,,82,,90,96,6,106,107,24,28,,,,,114,115,116,63,68,73,78,,,,,', ',,,,112,,,47,52,59,66,69,74,79,83,86,93,,9,16,,,,109,,,,,,,,,,,,,,,', ',,,,792,,,125,,,72,77,,,91,,,,,,,,,,,,,,,,,,,87,94,4,10,17,21,,,,39', '43,174,177,181,187,192,197,201,205,211,218,226,230,231,234,237,241,243', '169,171,173,179,183,189,193,,,206,212,219,250,253,256,259,238,242,244', ',,,,,185,195,199,203,247,248,249,224,343,344,258,345,,,,,,,180,186,', '196,200,209,216,,225,229,,,236,,,,,175,178,182,188,,,,,,,,,,,,,,170', '172,,176,184,190,194,198,202,207,213,220,,228,,,239,174,177,181,187', '192,197,201,205,211,218,226,230,231,234,237,241,243,169,171,173,179', '183,189,193,,,206,212,219,223,227,232,235,238,242,244,,,,,,185,195,199', '203,208,215,222,224,69,74,233,83,,,,,,,180,186,,196,200,209,216,,225', '229,,,236,,,,,175,178,182,188,,,,,,217,,,,,,,,170,172,,176,184,190,194', '198,202,207,213,220,,228,,,239,174,177,181,187,192,197,201,205,211,218', '226,230,231,234,237,241,243,169,171,173,179,183,189,193,,,206,212,219', '250,253,256,259,238,242,244,,,,,,185,195,199,203,247,248,249,224,,,258', ',,,,,,,180,186,,196,200,209,216,,225,229,,,236,,,,,175,178,182,188,', ',,,,,,,666,,,,,170,172,,176,184,190,194,198,202,207,213,220,,228,,,239', '299,300,277,279,281,285,288,290,292,294,296,,302,278,,,284,287,,,,,', ',,,,,,,,,297,,301,,280,282,286,289,291,293,295,,298,,,,,,,504,372,,', '505,,,,,283,,-218,180,186,,196,200,209,216,,225,229,,,236,,,,,175,178', '182,188,,,,,,,,,,,,,,170,172,,176,184,190,194,198,202,207,213,220,,228', ',,239,299,300,277,279,281,285,288,290,292,294,296,,302,278,,,284,287', ',,,-218,,,,,,,,,,,297,,301,,280,282,286,289,291,293,295,,298,,,,,,,371', '372,,,373,,,,,283,,-218,180,186,,196,200,209,216,,225,229,,,236,,,,', '175,178,182,188,,,,,,,,,,,,,,170,172,,176,184,190,194,198,202,207,213', '220,,228,504,372,239,,505,,,,,,,,180,186,,196,200,209,216,,225,229,', ',236,,,,,175,178,182,188,,,,,,,,,,,,,,170,172,,176,184,190,194,198,202', '207,213,220,,228,582,372,239,,583,,,,,,,,180,186,,196,200,209,216,,225', '229,,,236,,,,,175,178,182,188,,,,,,,,,,,,,,170,172,,176,184,190,194', '198,202,207,213,220,,228,580,367,239,,581,,,,,,,,180,186,,196,200,209', '216,,225,229,,,236,,,,,175,178,182,188,,,,,,,,,,,,,,170,172,,176,184', '190,194,198,202,207,213,220,,228,,,239,299,300,277,279,281,285,288,290', '292,294,296,,302,278,,,284,287,,,,,,,,,,,,,,,297,,301,,280,282,286,289', '291,293,295,,298,,,,,,,580,367,,,581,,,,,283,,584,180,186,,196,200,209', '216,,225,229,,,236,,,,,175,178,182,188,,,,,,,,,,,,,,170,172,,176,184', '190,194,198,202,207,213,220,,228,504,372,239,,505,,,,,,,,180,186,,196', '200,209,216,,225,229,,,236,,,,,175,178,182,188,,,,,,,,,,,,,,170,172', ',176,184,190,194,198,202,207,213,220,,228,564,372,239,,565,,,,,,,,180', '186,,196,200,209,216,,225,229,,,236,,,,,175,178,182,188,,,,,,,,,,,,', ',170,172,,176,184,190,194,198,202,207,213,220,,228,562,367,239,,563', ',,,,,,,180,186,,196,200,209,216,,225,229,,,236,,,,,175,178,182,188,', ',,,,,,,,,,,,170,172,,176,184,190,194,198,202,207,213,220,,228,366,367', '239,,368,,,,,,,,180,186,,196,200,209,216,,225,229,,,236,,,,,175,178', '182,188,,,,,,,,,,,,,,170,172,,176,184,190,194,198,202,207,213,220,,228', '888,372,239,,889,,,,,,,,180,186,,196,200,209,216,,225,229,,,236,,,,', '175,178,182,188,,,,,,,,,,,,,,170,172,,176,184,190,194,198,202,207,213', '220,,228,504,372,239,,505,,,,,,,,180,186,,196,200,209,216,,225,229,', ',236,,,,,175,178,182,188,,,,,,,,,,,,,,170,172,,176,184,190,194,198,202', '207,213,220,,228,886,367,239,,887,,,,,,,,180,186,,196,200,209,216,,225', '229,,,236,,,,,175,178,182,188,,,,,,,,,,,,,,170,172,,176,184,190,194', '198,202,207,213,220,,228,582,372,239,,583,,,,,,,,180,186,,196,200,209', '216,,225,229,,,236,,,,,175,178,182,188,,,,,,,,,,,,,,170,172,,176,184', '190,194,198,202,207,213,220,,228,504,372,239,,505,,,,,,,,180,186,,196', '200,209,216,,225,229,,,236,,,,,175,178,182,188,,,,,,,,,,,,,,170,172', ',176,184,190,194,198,202,207,213,220,,228,722,367,239,,723,,,,,,,,180', '186,,196,200,209,216,,225,229,,,236,,,,,175,178,182,188,,,,,,,,,,,,', ',170,172,,176,184,190,194,198,202,207,213,220,,228,555,367,239,,556', ',,,,,,,180,186,,196,200,209,216,,225,229,,,236,,,,,175,178,182,188,', ',,,,,,,,,,,,170,172,,176,184,190,194,198,202,207,213,220,,228,558,372', '239,,559,,,,,,,,180,186,,196,200,209,216,,225,229,,,236,,,,,175,178', '182,188,,,,,,,,,,,,,,170,172,,176,184,190,194,198,202,207,213,220,,228', ',,239,299,300,277,279,281,285,288,290,292,294,296,,302,278,,,284,287', ',,,,,,,,,,,,,,297,,301,,280,282,286,289,291,293,295,,298,299,300,277', '279,281,285,288,290,292,294,296,,302,278,,283,284,287,,,,,,,,,,,,,,', '297,,301,,280,282,286,289,291,293,295,,298,299,300,277,279,281,285,288', '290,292,294,296,,302,278,269,283,284,287,,,,,,,,,,,,,,,297,,301,,280', '282,286,289,291,293,295,,298,299,300,277,279,281,285,288,290,292,294', '296,,302,278,,283,284,287,,,,,,,,,,,,,,,297,,301,,280,282,286,289,291', '293,295,,298,299,300,277,279,281,285,288,290,292,294,296,,302,278,,283', '284,287,,,,,,,,,,,,,,,297,,301,,280,282,286,289,291,293,295,,298,299', '300,277,279,281,285,288,290,292,294,296,,302,278,,283,284,287,,,,,,', ',,,,,,,,297,,301,,280,282,286,289,291,293,295,,298,299,300,277,279,281', '285,288,290,292,294,296,,302,278,,283,284,287,,,,,,,,,,,,,,,297,,301', ',280,282,286,289,291,293,295,,298,299,300,277,279,281,285,288,290,292', '294,296,,302,278,,283,284,287,,,,,,,,,,,,,,,297,,301,,280,282,286,289', '291,293,295,,298,299,300,277,279,281,285,288,290,292,294,296,,302,278', ',283,284,287,,,,,,,,,,,,,,,297,,301,,280,282,286,289,291,293,295,,298', '299,300,277,279,281,285,288,290,292,294,296,,302,278,269,283,284,287', ',,,,,,,,,,,,,,297,,301,,280,282,286,289,291,293,295,,298,299,300,277', '279,281,285,288,290,292,294,296,,302,278,,283,284,287,,,,,,,,,,,,,,', '297,,301,,280,282,286,289,291,293,295,,298,299,300,277,279,281,285,288', '290,292,294,296,,302,278,,283,284,287,,,,,,,,,,,,,,,297,,301,,280,282', '286,289,291,293,295,,298,299,300,277,279,281,285,288,290,292,294,296', ',302,278,,283,284,287,,,,,,,,,,,,,,,297,,301,,280,282,286,289,291,293', '295,,298,299,300,277,279,281,285,288,290,292,294,296,,302,278,,283,284', '287,,,,,,,,,,,,,,,297,,301,,280,282,286,289,291,293,295,,298,,,,,,,', ',,,,,,,,283' ] racc_action_table = arr = ::Array.new(25040, nil) idx = 0 clist.each do |str| str.split(',', -1).each do |i| arr[idx] = i.to_i unless i.empty? idx += 1 end end clist = [ '366,828,15,105,371,381,37,366,366,366,583,111,1,366,366,419,366,558', '693,559,555,568,161,648,223,366,337,556,337,565,232,223,309,771,108', '366,366,232,366,366,366,366,366,824,640,640,371,120,37,661,371,762,37', '530,120,482,583,324,762,632,632,648,568,120,366,366,366,366,366,366', '366,366,366,366,366,366,366,366,539,694,366,366,366,555,366,161,15,105', '366,482,556,366,874,565,874,8,366,640,366,762,366,366,366,366,366,366', '366,381,366,366,366,565,828,111,828,652,542,828,419,558,693,559,555', '366,366,368,366,651,366,556,366,565,368,368,368,565,108,419,368,368', '564,368,419,309,771,309,771,632,309,771,530,573,530,420,824,530,824', '8,542,824,368,368,542,368,368,368,368,368,324,642,324,668,275,324,582', '539,694,539,694,8,539,694,153,417,637,573,671,417,405,368,368,368,368', '368,368,368,368,368,368,368,368,368,368,420,564,368,368,368,411,368', '420,889,677,368,275,420,368,886,275,420,582,368,564,368,636,368,368', '368,368,368,368,368,500,368,405,368,99,420,635,500,623,140,564,153,153', '153,564,137,368,368,506,368,722,368,620,368,617,506,506,506,711,889', '506,506,506,20,506,886,889,411,411,391,342,889,886,615,506,889,411,886', '500,614,352,886,373,506,506,140,506,506,506,506,506,137,613,889,48,99', '99,99,132,886,722,132,48,391,711,20,696,722,594,20,393,227,722,66,332', '734,722,332,227,862,66,66,66,506,373,66,66,66,373,66,506,342,342,342', '722,506,506,593,464,66,66,352,352,352,393,700,562,587,66,66,64,66,66', '66,66,66,584,64,506,132,132,734,734,734,734,862,862,862,862,348,464', '506,348,506,464,464,506,66,66,66,66,66,66,66,66,66,66,66,66,66,66,579', '467,66,66,66,562,707,66,233,421,66,888,562,66,66,233,66,562,66,709,66', '562,66,66,66,66,66,66,66,235,66,572,66,467,208,210,235,467,467,562,351', '208,210,351,503,66,66,66,66,604,66,503,503,503,604,567,503,503,503,421', '503,888,887,561,335,167,421,335,888,887,503,421,167,888,887,421,557', '888,887,503,503,167,503,503,503,503,503,222,554,215,715,465,40,421,222', '888,215,40,736,736,716,752,752,752,752,752,752,752,752,752,752,752,462', '752,752,616,805,752,752,503,616,805,553,465,329,329,503,465,465,465', '465,503,503,752,547,752,720,752,752,752,752,752,752,752,462,752,646', '646,462,462,462,462,603,630,503,630,630,630,630,603,339,752,581,581', '581,339,581,503,603,503,581,581,503,35,35,581,543,581,581,581,581,581', '581,581,597,597,308,308,581,581,581,581,581,581,581,900,900,528,719', '630,630,630,630,719,581,109,109,581,581,581,581,581,581,581,581,581', '581,525,581,581,524,581,581,581,455,455,455,455,455,455,455,727,695', '455,455,910,33,33,851,695,455,455,910,581,581,851,581,581,695,581,581', '910,521,581,851,581,455,581,455,581,455,455,455,455,455,455,455,581', '455,507,501,499,581,581,581,581,581,581,738,104,739,581,581,580,580', '580,104,580,741,255,581,580,580,255,255,104,580,498,580,580,580,580', '580,580,580,744,747,748,497,580,580,580,580,580,580,580,541,541,490', '541,541,541,489,755,759,580,760,761,580,580,580,580,580,580,580,580', '580,580,488,580,580,763,580,580,580,456,456,456,456,456,456,456,456', '456,456,456,415,456,456,5,486,456,456,415,580,580,5,580,580,481,580', '580,415,477,580,5,580,456,580,456,580,456,456,456,456,456,456,456,580', '456,768,475,460,580,580,580,580,580,580,772,458,448,580,580,270,270', '270,270,270,447,429,580,270,270,425,783,785,270,398,270,270,270,270', '270,270,270,788,380,656,363,270,270,270,270,270,270,270,792,793,270', '150,150,150,150,150,270,270,270,270,270,270,270,270,270,270,270,270', '270,270,794,270,270,362,270,270,270,472,472,472,472,472,472,472,798', '563,472,472,723,350,338,92,563,472,472,723,270,563,92,270,723,563,270', '270,723,334,270,92,270,472,806,472,270,472,472,472,472,472,472,472,270', '472,810,811,814,270,270,270,270,270,270,815,385,817,270,270,82,82,82', '385,82,270,331,789,82,82,312,311,385,82,789,82,82,82,82,82,82,82,310', '789,827,276,82,82,82,82,82,82,82,830,266,82,265,837,838,262,591,840', '82,841,260,82,82,82,82,82,82,82,82,82,82,163,82,82,846,82,82,82,591', '591,591,591,591,591,591,591,591,591,591,790,591,591,791,159,591,591', '790,82,152,791,82,149,148,82,82,790,147,82,791,853,591,141,591,82,591', '591,591,591,591,591,591,82,591,138,135,130,82,82,82,82,82,82,128,124', '116,82,82,82,591,854,854,854,82,854,115,113,123,854,854,112,878,110', '854,123,854,854,854,854,854,854,854,95,123,883,885,854,854,854,854,854', '854,854,58,58,58,58,58,89,81,50,46,854,41,892,854,854,854,854,854,854', '854,854,854,854,893,854,854,896,121,818,854,818,818,818,818,121,133', '451,451,451,451,451,897,133,121,898,899,38,906,907,854,25,133,854,21', '19,854,854,913,17,854,3,924,,,,433,818,433,433,433,433,,,,818,818,818', '818,854,854,854,854,854,854,,,,854,854,704,704,704,854,704,,,,704,704', ',,,704,433,704,704,704,704,704,704,704,433,433,433,433,704,704,704,704', '704,704,704,,,,,,,,,,704,,,704,704,704,704,704,704,704,704,704,704,', '704,704,,,,704,461,461,461,461,461,461,461,461,461,461,461,,461,461', ',,461,461,,704,,,704,,,704,704,,,704,,,461,,461,,461,461,461,461,461', '461,461,,461,,,,704,704,704,704,704,704,,,,704,704,,461,461,704,313', '313,313,313,313,313,,,,313,313,,,,313,,313,313,313,313,313,313,313,', ',,,313,313,313,313,313,313,313,,,313,,,,,,313,313,313,313,313,313,313', '313,313,313,313,313,313,313,,313,313,,313,313,313,,,,,,,,,,,,,,,,,,', ',313,,,313,,,313,313,,,313,,313,,,,313,732,,732,732,732,732,,313,,,', ',313,313,313,313,313,313,,,,313,313,502,502,502,502,502,502,,,,502,502', ',,,502,,502,502,502,502,502,502,502,732,732,732,732,502,502,502,502', '502,502,502,,,502,,,,,,502,502,502,502,502,502,502,502,502,502,502,502', '502,502,,502,502,,502,502,502,471,,,,,,,,,,,,,,,,471,471,,502,,,502', ',,502,502,,,502,,502,471,,471,502,471,471,471,471,,,471,502,471,,,,502', '502,502,502,502,502,,,,502,502,743,743,743,743,743,743,,,,743,743,,', ',743,,743,743,743,743,743,743,743,,,,,743,743,743,743,743,743,743,,', '743,,,,,,743,743,743,743,743,743,743,743,743,743,743,743,743,743,,743', '743,,743,743,743,470,470,470,470,470,470,470,470,,470,470,,,,,,470,470', ',743,,,743,,,743,743,,,743,,743,470,,470,743,470,470,470,470,470,470', '470,743,470,,,,743,743,743,743,743,743,,,,743,743,753,753,753,753,753', '753,,,,753,753,,,,753,,753,753,753,753,753,753,753,,,,,753,753,753,753', '753,753,753,,,753,,,,,,753,753,753,753,753,753,753,753,753,753,753,753', '753,753,,753,753,,753,753,753,469,,,,,,,,,,,,,,,,469,469,,753,,,753', ',,753,753,,,753,,753,469,,469,753,469,469,469,469,,,469,753,469,,,,753', '753,753,753,753,753,,,,753,753,484,484,484,484,484,484,,,,484,484,,', ',484,,484,484,484,484,484,484,484,,,,,484,484,484,484,484,484,484,,', '484,,,,,,484,484,484,484,484,484,484,484,484,484,484,484,484,484,,484', '484,,484,484,484,474,474,474,474,474,474,474,,,474,474,,,,,,474,474', ',484,,,484,,,484,484,,,484,,484,474,,474,484,474,474,474,474,474,474', '474,484,474,,,,484,484,484,484,484,484,,,,484,484,774,774,774,774,774', '774,,,,774,774,,,,774,,774,774,774,774,774,774,774,,,,,774,774,774,774', '774,774,774,,,774,,,,,,774,774,774,774,774,774,774,774,774,774,774,774', '774,774,,774,774,,774,774,774,457,457,457,457,457,457,457,,,457,457', ',,,,,457,457,,774,,,774,,,774,774,,,774,,774,457,,457,774,457,457,457', '457,457,457,457,774,457,,,,774,774,774,774,774,774,,,,774,774,454,454', '454,454,454,454,,,,454,454,,,,454,,454,454,454,454,454,454,454,,,,,454', '454,454,454,454,454,454,,,454,,,,,,454,454,454,454,454,454,454,454,454', '454,454,454,454,454,,454,454,,454,454,454,466,,,,,,,,,,,,,,,,466,466', ',454,,,454,,,454,454,,,454,,454,466,,466,454,466,466,466,466,,,466,454', '466,,,,454,454,454,454,454,454,,,,454,454,775,775,775,775,775,775,,', ',775,775,,,,775,,775,775,775,775,775,775,775,,,,,775,775,775,775,775', '775,775,,,775,,,,,,775,775,775,775,775,775,775,775,775,775,775,775,775', '775,,775,775,,775,775,775,478,478,478,478,478,478,478,,,478,478,,,,', ',478,478,,775,,,775,,,775,775,,,775,,775,478,,478,775,478,478,478,478', '478,478,478,775,478,,,,775,775,775,775,775,775,,,,775,775,703,703,703', '703,703,703,,,,703,703,,,,703,,703,703,703,703,703,703,703,,,,,703,703', '703,703,703,703,703,,,703,,,,,,703,703,703,703,703,703,703,703,703,703', '703,703,703,703,,703,703,,703,703,703,480,480,480,480,480,480,480,480', '480,480,480,,480,480,,,480,480,,703,,,703,,,703,703,,,703,,703,480,', '480,703,480,480,480,480,480,480,480,703,480,,,,703,703,703,703,703,703', ',,,703,703,787,787,787,787,787,787,,,,787,787,,,,787,,787,787,787,787', '787,787,787,,,,,787,787,787,787,787,787,787,,,787,,,,,,787,787,787,787', '787,787,787,787,787,787,787,787,787,787,,787,787,,787,787,787,463,,', ',,,,,,,,,,,,,463,463,,787,,,787,,,787,787,,,787,,787,463,,463,787,463', '463,463,463,,,463,787,463,,,,787,787,787,787,787,787,,,,787,787,610', '610,610,610,610,610,,,,610,610,,,,610,,610,610,610,610,610,610,610,', ',,,610,610,610,610,610,610,610,,,610,,,,,,610,610,610,610,610,610,610', '610,610,610,610,610,610,610,,610,610,,610,610,610,459,459,459,459,459', '459,459,,,459,459,,,,,,459,459,,610,,,610,,,610,610,,,610,,610,459,', '459,610,459,459,459,459,459,459,459,610,459,,,,610,610,610,610,610,610', ',,,610,610,626,626,626,626,626,626,,,,626,626,,,,626,,626,626,626,626', '626,626,626,,,,,626,626,626,626,626,626,626,,,626,,,,,,626,626,626,626', '626,626,626,626,626,626,626,626,626,626,,626,626,,626,626,626,468,468', '468,468,468,468,468,,,468,468,,,,,,468,468,,626,,,626,,,626,626,,,626', ',626,468,,468,626,468,468,468,468,468,468,468,626,468,,,,626,626,626', '626,626,626,,,,626,626,540,540,540,540,540,540,,,,540,540,,,,540,,540', '540,540,540,540,540,540,,,,,540,540,540,540,540,540,540,,,540,,,,,,540', '540,540,540,540,540,540,540,540,540,540,540,540,540,,540,540,,540,540', '540,479,,,,,,,,,,,,,,,,479,479,,540,,,540,,,540,540,,,540,,540,479,', ',540,479,479,479,479,,,,540,,,,,540,540,540,540,540,540,,,,540,540,822', '822,822,822,822,822,,,,822,822,,,,822,,822,822,822,822,822,822,822,', ',,,822,822,822,822,822,822,822,,,822,,,,,,822,822,822,822,822,822,822', '822,822,822,822,822,822,822,,822,822,,822,822,822,476,,,,,,,,,,,,,,', ',476,476,,822,,,822,,,822,822,,,822,,822,476,,476,822,476,476,476,476', ',,,822,,,,,822,822,822,822,822,822,,,,822,822,303,303,303,303,303,303', ',,,303,303,,,,303,,303,303,303,303,303,303,303,,,,,303,303,303,303,303', '303,303,,,303,,,,,,303,303,303,303,303,303,303,303,303,303,303,303,303', '303,,303,303,,303,303,303,473,,,,,,,,,,,,,,,,473,473,,303,,,303,,,303', '303,,,303,,303,473,,473,303,473,473,473,473,,,,303,,,,,303,303,303,303', '303,303,,,,303,303,710,710,710,710,710,710,,,,710,710,,,,710,,710,710', '710,710,710,710,710,,,,,710,710,710,710,710,710,710,,,710,,,,,,710,710', '710,710,710,710,710,710,710,710,710,710,710,710,,710,710,,710,710,710', ',,,,,,,,,,,,,,,,,,,710,,,710,,,710,710,,,710,,710,,,,710,,,,,,,,710', ',,,,710,710,710,710,710,710,,,,710,710,267,267,267,267,267,267,,,,267', '267,,,,267,,267,267,267,267,267,267,267,,,,,267,267,267,267,267,267', '267,,,267,,,,,,267,267,267,267,267,267,267,267,267,267,267,267,267,267', ',267,267,,267,267,267,,,,,,,,,,,,,,,,,,,,267,,,267,,,267,267,,,267,', '267,,,,267,,,,,,,,267,,,,,267,267,267,267,267,267,,,,267,267,835,835', '835,835,835,835,,,,835,835,,,,835,,835,835,835,835,835,835,835,,,,,835', '835,835,835,835,835,835,,,835,,,,,,835,835,835,835,835,835,835,835,835', '835,835,835,835,835,,835,835,,835,835,835,,,,,,,,,,,,,,,,,,,,835,,,835', ',,835,835,,,835,,835,,,,835,,,,,,,,835,,,,,835,835,835,835,835,835,', ',,835,835,839,839,839,839,839,839,,,,839,839,,,,839,,839,839,839,839', '839,839,839,,,,,839,839,839,839,839,839,839,,,839,,,,,,839,839,839,839', '839,839,839,839,839,839,839,839,839,839,,839,839,,839,839,839,,,,,,', ',,,,,,,,,,,,,839,,,839,,,839,839,,,839,,839,,,,839,,,,,,,,839,,,,,839', '839,839,839,839,839,,,,839,839,164,164,164,164,164,164,,,,164,164,,', ',164,,164,164,164,164,164,164,164,,,,,164,164,164,164,164,164,164,,', '164,,,,,,164,164,164,164,164,164,164,164,164,164,164,164,164,164,,164', '164,,164,164,164,,,,,,,,,,,,,,,,,,,,164,,,164,,,164,164,,,164,,164,', ',,164,,,,,,,,164,,,,,164,164,164,164,164,164,,,,164,164,522,522,522', '522,522,522,,,,522,522,,,,522,,522,522,522,522,522,522,522,,,,,522,522', '522,522,522,522,522,,,522,,,,,,522,522,522,522,522,522,522,522,522,522', '522,522,522,522,,522,522,,522,522,522,,,,,,,,,,,,,,,,,,,,522,,,522,', ',522,522,,,522,,522,,,,522,,,,,,,,522,,,,,522,522,522,522,522,522,,', ',522,522,859,859,859,859,859,859,,,,859,859,,,,859,,859,859,859,859', '859,859,859,,,,,859,859,859,859,859,859,859,,,859,,,,,,859,859,859,859', '859,859,859,859,859,859,859,859,859,859,,859,859,,859,859,859,,,,,,', ',,,,,,,,,,,,,859,,,859,,,859,859,,,859,,859,,,,859,,,,,,,,859,,,,,859', '859,859,859,859,859,,,,859,859,125,125,125,125,125,125,,,,125,125,,', ',125,,125,125,125,125,125,125,125,,,,,125,125,125,125,125,125,125,,', '125,,,,,,125,125,125,125,125,125,125,125,125,125,125,125,125,125,,125', '125,,125,125,125,,,,,,,,,,,,,,,,,,,,125,,,125,,,125,125,,,125,,125,', ',,125,,,,,,,,125,,,,,125,125,125,125,125,125,,,,125,125,55,55,55,55', '55,55,,,,55,55,,,,55,,55,55,55,55,55,55,55,,,,,55,55,55,55,55,55,55', ',,55,,,,,,55,55,55,55,55,55,55,55,55,55,55,55,55,55,,55,55,,55,55,55', ',,,,,,,,,,,,,,,,,,,55,,,55,,,55,55,,,55,,55,,,,55,,,,,,,,55,,,,,55,55', '55,55,55,55,,,,55,55,867,867,867,867,867,867,,,,867,867,,,,867,,867', '867,867,867,867,867,867,,,,,867,867,867,867,867,867,867,,,867,,,,,,867', '867,867,867,867,867,867,867,867,867,867,867,867,867,,867,867,,867,867', '867,,,,,,,,,,,,,,,,,,,,867,,,867,,,867,867,,,867,,867,,,,867,,,,,,,', '867,,,,,867,867,867,867,867,867,,,,867,867,869,869,869,869,869,869,', ',,869,869,,,,869,,869,869,869,869,869,869,869,,,,,869,869,869,869,869', '869,869,,,869,,,,,,869,869,869,869,869,869,869,869,869,869,869,869,869', '869,,869,869,,869,869,869,,,,,,,,,,,,,,,,,,,,869,,,869,,,869,869,,,869', ',869,,,,869,,,,,,,,869,,,,,869,869,869,869,869,869,,,,869,869,872,872', '872,872,872,872,,,,872,872,,,,872,,872,872,872,872,872,872,872,,,,,872', '872,872,872,872,872,872,,,872,,,,,,872,872,872,872,872,872,872,872,872', '872,872,872,872,872,,872,872,,872,872,872,,,,,,,,,,,,,,,,,,,,872,,,872', ',,872,872,,,872,,872,,,,872,,,,,,,,872,,,,,872,872,872,872,872,872,', ',,872,872,726,726,726,726,726,726,,,,726,726,,,,726,,726,726,726,726', '726,726,726,,,,,726,726,726,726,726,726,726,,,726,,,,,,726,726,726,726', '726,726,726,726,726,726,726,726,726,726,,726,726,,726,726,726,,,,,,', ',,,,,,,,,,,,,726,,,726,,,726,726,,,726,,726,,,,726,,,,,,,,726,,,,,726', '726,726,726,726,726,,,,726,726,2,2,2,2,2,2,,,,2,2,,,,2,,2,2,2,2,2,2', '2,,,,,2,2,2,2,2,2,2,,,2,,,,,,2,2,2,2,2,2,2,2,2,2,2,2,2,2,,2,2,,2,2,2', ',,,,,,,,,,,,,,,,,,,2,,,2,,,2,2,,,2,,2,,,,2,,,,,,,,2,,,,,2,2,2,2,2,2', ',,,2,2,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438', '438,438,438,438,438,438,438,438,,,438,438,438,438,438,438,438,438,438', '438,,,,,,438,438,438,438,438,438,438,438,,,438,,,,,,,,438,438,,438,438', '438,438,,438,438,,,438,,,,,438,438,438,438,,,,,,,,,,,,,,438,438,,438', '438,438,438,438,438,438,438,438,,438,,,438,438,,,65,65,65,,65,,,438', '65,65,,,,65,,65,65,65,65,65,65,65,,,,,65,65,65,65,65,65,65,,,,,,,,,', '65,,,65,65,65,65,65,65,65,65,65,65,,65,65,,65,65,65,,,,,,,,,,,,,,,,', ',,,65,,,65,,,65,65,,,65,,,,,,65,,,,,,,,65,,,,,65,65,65,65,65,65,,,,65', '65,62,62,62,,62,,,,62,62,,,,62,,62,62,62,62,62,62,62,,,,,62,62,62,62', '62,62,62,,,62,,,,,,,62,,,62,62,62,62,62,62,62,62,62,62,,62,62,,62,62', '62,,,,,,,,,,,,,,,,,,,,62,,,62,,,62,62,,,62,,,,,,62,,,,,,,,62,,,,,62', '62,62,62,62,62,,,,62,62,72,72,72,,72,,,,72,72,,,,72,,72,72,72,72,72', '72,72,,,,,72,72,72,72,72,72,72,,,72,,,,,,,72,,,72,72,72,72,72,72,72', '72,72,72,,72,72,,72,72,72,,,,,,,,,,,,,,,,,,,,72,,,72,,,72,72,,,72,,', ',,,72,,,,,,,,72,,,,,72,72,72,72,72,72,,,,72,72,77,77,77,,77,,,,77,77', ',,,77,,77,77,77,77,77,77,77,,,,,77,77,77,77,77,77,77,,,,,,,,,,77,,,77', '77,77,77,77,77,77,77,77,77,,77,77,,77,77,77,,,,,,,,,,,,,,,,,,,,77,,', '77,,,77,77,,,77,,77,,,,77,,,,,,,,77,,,,,77,77,77,77,77,77,,,,77,77,79', '79,79,,79,,,,79,79,,,,79,,79,79,79,79,79,79,79,,79,,,79,79,79,79,79', '79,79,,,,,,,,,,79,,,79,79,79,79,79,79,79,79,79,79,,79,79,,79,79,79,', ',,,,,,,,,,,,,,,,,,79,,,79,79,,79,79,,,79,,79,,79,,79,,,,,,,,79,,79,', ',79,79,79,79,79,79,,,,79,79,655,655,655,,655,,,,655,655,,,,655,,655', '655,655,655,655,655,655,,,,,655,655,655,655,655,655,655,,,,,,,,,,655', ',,655,655,655,655,655,655,655,655,655,655,,655,655,,655,655,655,,,,', ',,,,,,,,,,,,,,,655,,,655,,,655,655,,,655,,655,,655,,655,,,,,,,,655,', ',,,655,655,655,655,655,655,,,,655,655,60,60,60,,60,,,,60,60,,,,60,,60', '60,60,60,60,60,60,,,,,60,60,60,60,60,60,60,,,,,,,,,,60,,,60,60,60,60', '60,60,60,60,60,60,,60,60,,60,60,60,,,,,,,,,,,,,,,,,,,,60,,,60,60,,60', '60,,,60,,60,,60,,60,,,,,,,,60,,,,,60,60,60,60,60,60,,,,60,60,663,663', '663,,663,,,,663,663,,,,663,,663,663,663,663,663,663,663,,,,,663,663', '663,663,663,663,663,,,,,,,,,,663,,,663,663,663,663,663,663,663,663,663', '663,,663,663,,663,663,663,,,,,,,,,,,,,,,,,,,,663,,,663,,,663,663,,,663', ',,,,,663,,,,,,,,663,,,,,663,663,663,663,663,663,,,,663,663,666,666,666', ',666,,,,666,666,,,,666,,666,666,666,666,666,666,666,,,,,666,666,666', '666,666,666,666,,,,,,,,,,666,,,666,666,666,666,666,666,666,666,666,666', ',666,666,,666,666,666,,,,,,,,,,,,,,,,,,,,666,,,666,,,666,666,,,666,', ',,,,666,,,,,,,,666,,,,,666,666,666,666,666,666,,,,666,666,91,91,91,', '91,,,,91,91,,,,91,,91,91,91,91,91,91,91,,,,,91,91,91,91,91,91,91,,,', ',,,,,,91,,,91,91,91,91,91,91,91,91,91,91,,91,91,,91,91,91,,,,,,,,,,', ',,,,,,,,,91,,,91,,,91,91,,,91,,,,,,91,,,,,,,,91,,,,,91,91,91,91,91,91', ',,,91,91,643,643,643,,643,,,,643,643,,,,643,,643,643,643,643,643,643', '643,,,,,643,643,643,643,643,643,643,,,,,,,,,,643,,,643,643,643,643,643', '643,643,643,643,643,,643,643,,643,643,643,,,,,,,,,,,,,,,,,,,,643,,,643', ',,643,643,,,643,,,,,,643,,,,,,,,643,,,,,643,643,643,643,643,643,,,,643', '643,882,882,882,,882,,,,882,882,,,,882,,882,882,882,882,882,882,882', ',,,,882,882,882,882,882,882,882,,,,,,,,,,882,,,882,882,882,882,882,882', '882,882,882,882,,882,882,,882,882,882,,,,,,,,,,,,,,,,,,,,882,,,882,', ',882,882,,,882,,,,,,882,,,,,,,,882,,,,,882,882,882,882,882,882,,,,882', '882,97,97,97,,97,,,,97,97,,,,97,,97,97,97,97,97,97,97,,,,,97,97,97,97', '97,97,97,,,97,,,,,,,97,,,97,97,97,97,97,97,97,97,97,97,,97,97,,97,97', '97,,,,,,,,,,,,,,,,,,,,97,,,97,,,97,97,,,97,,,,,,97,,,,,,,,97,,,,,97', '97,97,97,97,97,,,,97,97,667,667,667,,667,,,,667,667,,,,667,,667,667', '667,667,667,667,667,,,,,667,667,667,667,667,667,667,,,,,,,,,,667,,,667', '667,667,667,667,667,667,667,667,667,,667,667,,667,667,667,,,,,,,,,,', ',,,,,,,,,667,,,667,,,667,667,,,667,,667,,,,667,,,,,,,,667,,,,,667,667', '667,667,667,667,,,,667,667,101,101,101,,101,,,,101,101,,,,101,,101,101', '101,101,101,101,101,,,,,101,101,101,101,101,101,101,,,,,,,,,,101,,,101', '101,101,101,101,101,101,101,101,101,,101,101,,101,101,101,,,,,,,,,,', ',,,,,,,,,101,,,101,,,101,101,,,101,,101,,,,101,,,,,,,,101,,,,,101,101', '101,101,101,101,,,,101,101,638,638,638,,638,,,,638,638,,,,638,,638,638', '638,638,638,638,638,,,,,638,638,638,638,638,638,638,,,,,,,,,,638,,,638', '638,638,638,638,638,638,638,638,638,,638,638,,638,638,638,,,,,,,,,,', ',,,,,,,,,638,,,638,,,638,638,,,638,,638,,,,638,,,,,,,,638,,,,,638,638', '638,638,638,638,,,,638,638,669,669,669,,669,,,,669,669,,,,669,,669,669', '669,669,669,669,669,,,,,669,669,669,669,669,669,669,,,,,,,,,,669,,,669', '669,669,669,669,669,669,669,669,669,,669,669,,669,669,669,,,,,,,,,,', ',,,,,,,,,669,,,669,,,669,669,,,669,,669,,,,669,,,,,,,,669,,,,,669,669', '669,669,669,669,,,,669,669,683,683,683,,683,,,,683,683,,,,683,,683,683', '683,683,683,683,683,,,,,683,683,683,683,683,683,683,,,,,,,,,,683,,,683', '683,683,683,683,683,683,683,683,683,,683,683,,683,683,683,,,,,,,,,,', ',,,,,,,,,683,,,683,,,683,683,,,683,,,,,,683,,,,,,,,683,,,,,683,683,683', '683,683,683,,,,683,683,634,634,634,634,634,634,634,634,634,634,634,634', '634,634,634,634,634,634,634,634,634,634,634,634,,,634,634,634,634,634', '634,634,634,634,634,,,,,,634,634,634,634,634,634,634,634,,,634,,,,,', ',,634,634,,634,634,634,634,,634,634,,,634,,,,,634,634,634,634,,,,,,', ',,,,,,,634,634,,634,634,634,634,634,634,634,634,634,,634,,,634,634,', ',374,374,374,,374,,,634,374,374,,,,374,,374,374,374,374,374,374,374', ',,,,374,374,374,374,374,374,374,,,,,,,,,,374,,,374,374,374,374,374,374', '374,374,374,374,,374,374,,374,374,374,,,,,,,,,,,,,,,,,,,,374,,,374,', ',374,374,,,374,,374,,,,374,,,,,,,,374,,,,,374,374,374,374,374,374,,', ',374,374,923,923,923,,923,,,,923,923,,,,923,,923,923,923,923,923,923', '923,,,,,923,923,923,923,923,923,923,,,,,,,,,,923,,,923,923,923,923,923', '923,923,923,923,923,,923,923,,,,923,,,,,,,,,,,,,,,,,,,,923,,,923,,,923', '923,,,923,,,,,,,,,,,,,,,,,,,923,923,923,923,923,923,,,,923,923,881,881', '881,,881,,,,881,881,,,,881,,881,881,881,881,881,881,881,,,,,881,881', '881,881,881,881,881,,,,,,,,,,881,,,881,881,881,881,881,881,881,881,881', '881,,881,881,,881,881,881,,,,,,,,,,,,,,,,,,,,881,,,881,,,881,881,,,881', ',,,,,881,,,,,,,,881,,,,,881,881,881,881,881,881,,,,881,881,598,598,598', ',598,,,,598,598,,,,598,,598,598,598,598,598,598,598,,,,,598,598,598', '598,598,598,598,,,,,,,,,,598,,,598,598,598,598,598,598,598,598,598,598', ',598,598,,598,598,598,,,,,,,,,,,,,,,,,,,,598,,,598,,,598,598,,,598,', '598,,,,598,,,,,,,,598,,,,,598,598,598,598,598,598,,,,598,598,875,875', '875,,875,,,,875,875,,,,875,,875,875,875,875,875,875,875,,,,,875,875', '875,875,875,875,875,,,,,,,,,,875,,,875,875,875,875,875,875,875,875,875', '875,,875,875,,875,875,875,,,,,,,,,,,,,,,,,,,,875,,,875,,,875,875,,,875', ',,,,,875,,,,,,,,875,,,,,875,875,875,875,875,875,,,,875,875,697,697,697', ',697,,,,697,697,,,,697,,697,697,697,697,697,697,697,,,,,697,697,697', '697,697,697,697,,,,,,,,,,697,,,697,697,697,697,697,697,697,697,697,697', ',697,697,,697,697,697,,,,,,,,,,,,,,,,,,,,697,,,697,,,697,697,,,697,', '697,,697,,697,,,,,,,,697,,,,,697,697,697,697,697,697,,,,697,697,59,59', '59,,59,,,,59,59,,,,59,,59,59,59,59,59,59,59,,59,,,59,59,59,59,59,59', '59,,,,,,,,,,59,,,59,59,59,59,59,59,59,59,59,59,,59,59,,59,59,59,,,,', ',,,,,,,,,,,,,,,59,,,59,59,,59,59,,,59,,59,,59,,59,,,,,,,,59,,59,,,59', '59,59,59,59,59,,,,59,59,699,699,699,,699,,,,699,699,,,,699,,699,699', '699,699,699,699,699,,,,,699,699,699,699,699,699,699,,,,,,,,,,699,,,699', '699,699,699,699,699,699,699,699,699,,699,699,,699,699,699,,,,,,,,,,', ',,,,,,,,,699,,,699,,,699,699,,,699,,699,,699,,699,,,,,,,,699,,,,,699', '699,699,699,699,699,,,,699,699,592,592,592,,592,,,,592,592,,,,592,,592', '592,592,592,592,592,592,,,,,592,592,592,592,592,592,592,,,,,,,,,,592', ',,592,592,592,592,592,592,592,592,592,592,,592,592,,592,592,592,,,,', ',,,,,,,,,,,,,,,592,,,592,,,592,592,,,592,,,,,,592,,,,,,,,592,,,,,592', '592,592,592,592,592,,,,592,592,586,586,586,,586,,,,586,586,,,,586,,586', '586,586,586,586,586,586,,,,,586,586,586,586,586,586,586,,,,,,,,,,586', ',,586,586,586,586,586,586,586,586,586,586,,586,586,,586,586,586,,,,', ',,,,,,,,,,,,,,,586,,,586,,,586,586,,,586,,,,,,586,,,,,,,,586,,,,,586', '586,586,586,586,586,,,,586,586,6,6,6,,6,,,,6,6,,,,6,,6,6,6,6,6,6,6,', ',,,6,6,6,6,6,6,6,,,,,,,,,,6,,,6,6,6,6,6,6,6,6,6,6,,6,6,,,,6,,,,,,,,', ',,,,,,,,,,,6,,,6,,,6,6,,,6,,6,,,,,,,,,,,,,,,,,6,6,6,6,6,6,,,,6,6,57', '57,57,,57,,,,57,57,,,,57,,57,57,57,57,57,57,57,,,,,57,57,57,57,57,57', '57,,,,,,,,,,57,,,57,57,57,57,57,57,57,57,57,57,,57,57,,57,57,57,,,,', ',,,,,,,,,,,,,,,57,,,57,57,,57,57,,,57,,57,,57,,57,,,,,,,,57,,,,,57,57', '57,57,57,57,,,,57,57,54,54,54,,54,,,,54,54,,,,54,,54,54,54,54,54,54', '54,,,,,54,54,54,54,54,54,54,,,54,,,,,,,54,,,54,54,54,54,54,54,54,54', '54,54,,54,54,,54,54,54,,,,,,,,,,,,,,,,,,,,54,,,54,,,54,54,,,54,,,,,', '54,,,,,,,,54,,,,,54,54,54,54,54,54,,,,54,54,127,127,127,,127,,,,127', '127,,,,127,,127,127,127,127,127,127,127,,,,,127,127,127,127,127,127', '127,,,,,,,,,,127,,,127,127,127,127,127,127,127,127,127,127,,127,127', ',127,127,127,,,,,,,,,,,,,,,,,,,,127,,,127,,,127,127,,,127,,127,,127', ',127,,,,,,,,127,,,,,127,127,127,127,127,127,,,,127,127,7,7,7,,7,,,,7', '7,,,,7,,7,7,7,7,7,7,7,,,,,7,7,7,7,7,7,7,,,,,,,,,,7,,,7,7,7,7,7,7,7,7', '7,7,,7,7,,,,7,,,,,,,,,,,,,,,,,,,,7,,,7,,,7,7,,,7,,,,,,,,,,,,,,,,,,,7', '7,7,7,7,7,,,,7,7,51,51,51,,51,,,,51,51,,,,51,,51,51,51,51,51,51,51,', ',,,51,51,51,51,51,51,51,,,,,,,,,,51,,,51,51,51,51,51,51,51,51,51,51', ',51,51,,51,51,51,,,,,,,,,,,,,,,,,,,,51,,,51,,,51,51,,,51,,51,,51,,51', ',,,,,,,51,,,,,51,51,51,51,51,51,,,,51,51,705,705,705,,705,,,,705,705', ',,,705,,705,705,705,705,705,705,705,,,,,705,705,705,705,705,705,705', ',,,,,,,,,705,,,705,705,705,705,705,705,705,705,705,705,,705,705,,,,705', ',,,,,,,,,,,,,,,,,,,705,,,705,,,705,705,,,705,,,,,,,,,,,,,,,,,,,705,705', '705,705,705,705,,,,705,705,576,576,576,,576,,,,576,576,,,,576,,576,576', '576,576,576,576,576,,,,,576,576,576,576,576,576,576,,,,,,,,,,576,,,576', '576,576,576,576,576,576,576,576,576,,576,576,,,,576,,,,,,,,,,,,,,,,', ',,,576,,,576,,,576,576,,,576,,576,,576,,,,,,,,,576,,,,,,576,576,576', '576,576,576,,,,576,576,134,134,134,,134,,,,134,134,,,,134,,134,134,134', '134,134,134,134,,,,,134,134,134,134,134,134,134,,,,,,,,,,134,,,134,134', '134,134,134,134,134,134,134,134,,134,134,,134,134,134,,,,,,,,,,,,,,', ',,,,,134,,,134,,,134,134,,,134,,,,,,134,,,,,,,,134,,,,,134,134,134,134', '134,134,,,,134,134,11,11,11,,11,,,,11,11,,,,11,,11,11,11,11,11,11,11', ',,,,11,11,11,11,11,11,11,,,,,,,,,,11,,,11,11,11,11,11,11,11,11,11,11', ',11,11,,11,11,11,,,,,,,,,,,,,,,,,,,,11,,,11,,,11,11,,,11,,11,,11,,11', ',,,,,,,11,,,,,11,11,11,11,11,11,,,,11,11,136,136,136,,136,,,,136,136', ',,,136,,136,136,136,136,136,136,136,,,,,136,136,136,136,136,136,136', ',,,,,,,,,136,,,136,136,136,136,136,136,136,136,136,136,,136,136,,136', '136,136,,,,,,,,,,,,,,,,,,,,136,,,136,,,136,136,,,136,,,,,,136,,,,,,', ',136,,,,,136,136,136,136,136,136,,,,136,136,566,566,566,,566,,,,566', '566,,,,566,,566,566,566,566,566,566,566,,,,,566,566,566,566,566,566', '566,,,,,,,,,,566,,,566,566,566,566,566,566,566,566,566,566,,566,566', ',566,566,566,,,,,,,,,,,,,,,,,,,,566,,,566,,,566,566,,,566,,,,,,566,', ',,,,,,566,,,,,566,566,566,566,566,566,,,,566,566,367,367,367,,367,,', ',367,367,,,,367,,367,367,367,367,367,367,367,,,,,367,367,367,367,367', '367,367,,,,,,,,,,367,,,367,367,367,367,367,367,367,367,367,367,,367', '367,,367,367,367,,,,,,,,,,,,,,,,,,,,367,,,367,367,,367,367,,,367,,367', ',367,,367,,,,,,,,367,,,,,367,367,367,367,367,367,,,,367,367,712,712', '712,,712,,,,712,712,,,,712,,712,712,712,712,712,712,712,,,,,712,712', '712,712,712,712,712,,,,,,,,,,712,,,712,712,712,712,712,712,712,712,712', '712,,712,712,,712,712,712,,,,,,,,,,,,,,,,,,,,712,,,712,,,712,712,,,712', ',,,,,712,,,,,,,,712,,,,,712,712,712,712,712,712,,,,712,712,560,560,560', ',560,,,,560,560,,,,560,,560,560,560,560,560,560,560,,,,,560,560,560', '560,560,560,560,,,560,,,,,,,560,,,560,560,560,560,560,560,560,560,560', '560,,560,560,,560,560,560,,,,,,,,,,,,,,,,,,,,560,,,560,,,560,560,,,560', ',,,,,560,,,,,,,,560,,,,,560,560,560,560,560,560,,,,560,560,713,713,713', ',713,,,,713,713,,,,713,,713,713,713,713,713,713,713,,,,,713,713,713', '713,713,713,713,,,,,,,,,,713,,,713,713,713,713,713,713,713,713,713,713', ',713,713,,713,713,713,,,,,,,,,,,,,,,,,,,,713,,,713,,,713,713,,,713,', ',,,,713,,,,,,,,713,,,,,713,713,713,713,713,713,,,,713,713,145,145,145', ',145,,,,145,145,,,,145,,145,145,145,145,145,145,145,,,,,145,145,145', '145,145,145,145,,,,,,,,,,145,,,145,145,145,145,145,145,145,145,145,145', ',145,145,,145,145,145,,,,,,,,,,,,,,,,,,,,145,,,145,,,145,145,,,145,', ',,,,145,,,,,,,,145,,,,,145,145,145,145,145,145,,,,145,145,852,852,852', ',852,,,,852,852,,,,852,,852,852,852,852,852,852,852,,,,,852,852,852', '852,852,852,852,,,,,,,,,,852,,,852,852,852,852,852,852,852,852,852,852', ',852,852,,,,852,,,,,,,,,,,,,,,,,,,,852,,,852,,,852,852,,,852,,,,,,,', ',,,,,,,,,,,852,852,852,852,852,852,,,,852,852,714,714,714,,714,,,,714', '714,,,,714,,714,714,714,714,714,714,714,,,,,714,714,714,714,714,714', '714,,,,,,,,,,714,,,714,714,714,714,714,714,714,714,714,714,,714,714', ',714,714,714,,,,,,,,,,,,,,,,,,,,714,,,714,,,714,714,,,714,,,,,,714,', ',,,,,,714,,,,,714,714,714,714,714,714,,,,714,714,717,717,717,,717,,', ',717,717,,,,717,,717,717,717,717,717,717,717,,,,,717,717,717,717,717', '717,717,,,,,,,,,,717,,,717,717,717,717,717,717,717,717,717,717,,717', '717,,717,717,717,,,,,,,,,,,,,,,,,,,,717,,,717,,,717,717,,,717,,717,', '717,,717,,,,,,,,717,,,,,717,717,717,717,717,717,,,,717,717,552,552,552', ',552,,,,552,552,,,,552,,552,552,552,552,552,552,552,,,,,552,552,552', '552,552,552,552,,,,,,,,,,552,,,552,552,552,552,552,552,552,552,552,552', ',552,552,,552,552,552,,,,,,,,,,,,,,,,,,,,552,,,552,,,552,552,,,552,', ',,,,552,,,,,,,,552,,,,,552,552,552,552,552,552,,,,552,552,551,551,551', ',551,,,,551,551,,,,551,,551,551,551,551,551,551,551,,,,,551,551,551', '551,551,551,551,,,,,,,,,,551,,,551,551,551,551,551,551,551,551,551,551', ',551,551,,551,551,551,,,,,,,,,,,,,,,,,,,,551,,,551,,,551,551,,,551,', ',,,,551,,,,,,,,551,,,,,551,551,551,551,551,551,,,,551,551,546,546,546', ',546,,,,546,546,,,,546,,546,546,546,546,546,546,546,,,,,546,546,546', '546,546,546,546,,,,,,,,,,546,,,546,546,546,546,546,546,546,546,546,546', ',546,546,,546,546,546,,,,,,,,,,,,,,,,,,,,546,,,546,,,546,546,,,546,', ',,,,546,,,,,,,,546,,,,,546,546,546,546,546,546,,,,546,546,157,157,157', ',157,,,,157,157,,,,157,,157,157,157,157,157,157,157,,,,,157,157,157', '157,157,157,157,,,,,,,,,,157,,,157,157,157,157,157,157,157,157,157,157', ',157,157,,,,157,,,,,,,,,,,,,,,,,,,,157,,,157,,,157,157,,,157,,,,,,,', ',,,,,,,,,,,157,157,157,157,157,157,,,,157,157,158,158,158,,158,,,,158', '158,,,,158,,158,158,158,158,158,158,158,,,,,158,158,158,158,158,158', '158,,,,,,,,,,158,,,158,158,158,158,158,158,158,158,158,158,,158,158', ',158,158,158,,,,,,,,,,,,,,,,,,,,158,,,158,,,158,158,,,158,,,,,,158,', ',,,,,,158,,,,,158,158,158,158,158,158,,,,158,158,848,848,848,,848,,', ',848,848,,,,848,,848,848,848,848,848,848,848,,,,,848,848,848,848,848', '848,848,,,,,,,,,,848,,,848,848,848,848,848,848,848,848,848,848,,848', '848,,848,848,848,,,,,,,,,,,,,,,,,,,,848,,,848,,,848,848,,,848,,848,', ',,848,,,,,,,,848,,,,,848,848,848,848,848,848,,,,848,848,545,545,545', ',545,,,,545,545,,,,545,,545,545,545,545,545,545,545,,,,,545,545,545', '545,545,545,545,,,,,,,,,,545,,,545,545,545,545,545,545,545,545,545,545', ',545,545,,545,545,545,,,,,,,,,,,,,,,,,,,,545,,,545,,,545,545,,,545,', ',,,,545,,,,,,,,545,,,,,545,545,545,545,545,545,,,,545,545,162,162,162', ',162,,,,162,162,,,,162,,162,162,162,162,162,162,162,,,,,162,162,162', '162,162,162,162,,,,,,,,,,162,,,162,162,162,162,162,162,162,162,162,162', ',162,162,,,,162,,,,,,,,,,,,,,,,,,,,162,,,162,,,162,162,,,162,,,,,,,', ',,,,,,,,,,,162,162,162,162,162,162,,,,162,162,844,844,844,,844,,,,844', '844,,,,844,,844,844,844,844,844,844,844,,,,,844,844,844,844,844,844', '844,,,,,,,,,,844,,,844,844,844,844,844,844,844,844,844,844,,844,844', ',844,844,844,,,,,,,,,,,,,,,,,,,,844,,,844,,,844,844,,,844,,844,,844', ',844,,,,,,,,844,,,,,844,844,844,844,844,844,,,,844,844,14,14,14,14,14', ',,,14,14,,,,14,,14,14,14,14,14,14,14,,,,,14,14,14,14,14,14,14,,,14,', ',,,,14,14,14,14,14,14,14,14,14,14,14,14,14,14,,14,14,,14,14,14,,,,,', ',,,,,,,,,,,,,,14,,,14,,,14,14,,,14,,14,,,,14,,,,,,,,14,,,,,14,14,14', '14,14,14,,,,14,14,165,165,165,,165,,,,165,165,,,,165,,165,165,165,165', '165,165,165,,,,,165,165,165,165,165,165,165,,,,,,,,,,165,,,165,165,165', '165,165,165,165,165,165,165,,165,165,,,,165,,,,,,,,,,,,,,,,,,,,165,', ',165,,,165,165,,,165,,,,,,,,,,,,,,,,,,,165,165,165,165,165,165,,,,165', '165,534,534,534,,534,,,,534,534,,,,534,,534,534,534,534,534,534,534', ',,,,534,534,534,534,534,534,534,,,,,,,,,,534,,,534,534,534,534,534,534', '534,534,534,534,,534,534,,534,534,534,,,,,,,,,,,,,,,,,,,,534,,,534,', ',534,534,,,534,,,,,,534,,,,,,,,534,,,,,534,534,534,534,534,534,,,,534', '534,725,725,725,,725,,,,725,725,,,,725,,725,725,725,725,725,725,725', ',,,,725,725,725,725,725,725,725,,,725,,,,,,,725,,,725,725,725,725,725', '725,725,725,725,725,,725,725,,725,725,725,,,,,,,,,,,,,,,,,,,,725,,,725', ',,725,725,,,725,,,,,,725,,,,,,,,725,,,,,725,725,725,725,725,725,,,,725', '725,921,921,921,,921,,,,921,921,,,,921,,921,921,921,921,921,921,921', ',,,,921,921,921,921,921,921,921,,,,,,,,,,921,,,921,921,921,921,921,921', '921,921,921,921,,921,921,,921,921,921,,,,,,,,,,,,,,,,,,,,921,,,921,', ',921,921,,,921,,,,,,921,,,,,,,,921,,,,,921,921,921,921,921,921,,,,921', '921,730,730,730,,730,,,,730,730,,,,730,,730,730,730,730,730,730,730', ',,,,730,730,730,730,730,730,730,,,,,,,,,,730,,,730,730,730,730,730,730', '730,730,730,730,,730,730,,730,730,730,,,,,,,,,,,,,,,,,,,,730,,,730,', ',730,730,,,730,,,,,,730,,,,,,,,730,,,,,730,730,730,730,730,730,,,,730', '730,516,516,516,,516,,,,516,516,,,,516,,516,516,516,516,516,516,516', ',,,,516,516,516,516,516,516,516,,,,,,,,,,516,,,516,516,516,516,516,516', '516,516,516,516,,516,516,,516,516,516,,,,,,,,,,,,,,,,,,,,516,,,516,', ',516,516,,,516,,,,,,516,,,,,,,,516,,,,,516,516,516,516,516,516,,,,516', '516,515,515,515,,515,,,,515,515,,,,515,,515,515,515,515,515,515,515', ',,,,515,515,515,515,515,515,515,,,,,,,,,,515,,,515,515,515,515,515,515', '515,515,515,515,,515,515,,515,515,515,,,,,,,,,,,,,,,,,,,,515,,,515,', ',515,515,,,515,,515,,,,515,,,,,,,,515,,,,,515,515,515,515,515,515,,', ',515,515,512,512,512,,512,,,,512,512,,,,512,,512,512,512,512,512,512', '512,,,,,512,512,512,512,512,512,512,,,,,,,,,,512,,,512,512,512,512,512', '512,512,512,512,512,,512,512,,512,512,512,,,,,,,,,,,,,,,,,,,,512,,,512', ',,512,512,,,512,,,,,,512,,,,,,,,512,,,,,512,512,512,512,512,512,,,,512', '512,18,18,18,,18,,,,18,18,,,,18,,18,18,18,18,18,18,18,,,,,18,18,18,18', '18,18,18,,,,,,,,,,18,,,18,18,18,18,18,18,18,18,18,18,,18,18,,18,18,18', ',,,,,,,,,,,,,,,,,,,18,,,18,,,18,18,,,18,,18,,18,,18,,,,,,,,18,,,,,18', '18,18,18,18,18,,,,18,18,912,912,912,,912,,,,912,912,,,,912,,912,912', '912,912,912,912,912,,,,,912,912,912,912,912,912,912,,,,,,,,,,912,,,912', '912,912,912,912,912,912,912,912,912,,912,912,,,,912,,,,,,,,,,,,,,,,', ',,,912,,,912,,,912,912,,,912,,,,,,,,,,,,,,,,,,,912,912,912,912,912,912', ',,,912,912,22,22,22,,22,,,,22,22,,,,22,,22,22,22,22,22,22,22,,,,,22', '22,22,22,22,22,22,,,,,,,,,,22,,,22,22,22,22,22,22,22,22,22,22,,22,22', ',,,22,,,,,,,,,,,,,,,,,,,,22,,,22,,,22,22,,,22,,22,,,,,,,,,,,,,,,,,22', '22,22,22,22,22,,,,22,22,754,754,754,,754,,,,754,754,,,,754,,754,754', '754,754,754,754,754,,,,,754,754,754,754,754,754,754,,,754,,,,,,,754', ',,754,754,754,754,754,754,754,754,754,754,,754,754,,754,754,754,,,,', ',,,,,,,,,,,,,,,754,,,754,,,754,754,,,754,,,,,,754,,,,,,,,754,,,,,754', '754,754,754,754,754,,,,754,754,842,842,842,,842,,,,842,842,,,,842,,842', '842,842,842,842,842,842,,,,,842,842,842,842,842,842,842,,,,,,,,,,842', ',,842,842,842,842,842,842,842,842,842,842,,842,842,,842,842,842,,,,', ',,,,,,,,,,,,,,,842,,,842,,,842,842,,,842,,842,,842,,842,,,,,,,,842,', ',,,842,842,842,842,842,842,,,,842,842,908,908,908,,908,,,,908,908,,', ',908,,908,908,908,908,908,908,908,,,,,908,908,908,908,908,908,908,,', ',,,,,,,908,,,908,908,908,908,908,908,908,908,908,908,,908,908,,908,908', '908,,,,,,,,,,,,,,,,,,,,908,,,908,,,908,908,,,908,,908,,908,,908,,,,', ',,,908,,,,,908,908,908,908,908,908,,,,908,908,263,263,263,,263,,,,263', '263,,,,263,,263,263,263,263,263,263,263,,,,,263,263,263,263,263,263', '263,,,263,,,,,,,263,,,263,263,263,263,263,263,263,263,263,263,,263,263', ',263,263,263,,,,,,,,,,,,,,,,,,,,263,,,263,,,263,263,,,263,,,,,,263,', ',,,,,,263,,,,,263,263,263,263,263,263,,,,263,263,264,264,264,,264,,', ',264,264,,,,264,,264,264,264,264,264,264,264,,,,,264,264,264,264,264', '264,264,,,264,,,,,,,264,,,264,264,264,264,264,264,264,264,264,264,,264', '264,,264,264,264,,,,,,,,,,,,,,,,,,,,264,,,264,,,264,264,,,264,,,,,,264', ',,,,,,,264,,,,,264,264,264,264,264,264,,,,264,264,836,836,836,,836,', ',,836,836,,,,836,,836,836,836,836,836,836,836,,,,,836,836,836,836,836', '836,836,,,,,,,,,,836,,,836,836,836,836,836,836,836,836,836,836,,836', '836,,836,836,836,,,,,,,,,,,,,,,,,,,,836,,,836,,,836,836,,,836,,836,', ',,836,,,,,,,,836,,,,,836,836,836,836,836,836,,,,836,836,767,767,767', ',767,,,,767,767,,,,767,,767,767,767,767,767,767,767,,,,,767,767,767', '767,767,767,767,,,,,,,,,,767,,,767,767,767,767,767,767,767,767,767,767', ',767,767,,767,767,767,,,,,,,,,,,,,,,,,,,,767,,,767,,,767,767,,,767,', ',,,,767,,,,,,,,767,,,,,767,767,767,767,767,767,,,,767,767,891,891,891', ',891,,,,891,891,,,,891,,891,891,891,891,891,891,891,,,,,891,891,891', '891,891,891,891,,,,,,,,,,891,,,891,891,891,891,891,891,891,891,891,891', ',891,891,,,,891,,,,,,,,,,,,,,,,,,,,891,,,891,,,891,891,,,891,,,,,,,', ',,,,,,,,,,,891,891,891,891,891,891,,,,891,891,268,268,268,,268,,,,268', '268,,,,268,,268,268,268,268,268,268,268,,,,,268,268,268,268,268,268', '268,,,,,,,,,,268,,,268,268,268,268,268,268,268,268,268,268,,268,268', ',268,268,268,,,,,,,,,,,,,,,,,,,,268,,,268,268,,268,268,,,268,,,,,,268', ',,,,,,,268,,,,,268,268,268,268,268,268,,,,268,268,770,770,770,,770,', ',,770,770,,,,770,,770,770,770,770,770,770,770,,,,,770,770,770,770,770', '770,770,,,,,,,,,,770,,,770,770,770,770,770,770,770,770,770,770,,770', '770,,770,770,770,,,,,,,,,,,,,,,,,,,,770,,,770,,,770,770,,,770,,,,,,770', ',,,,,,,770,,,,,770,770,770,770,770,770,,,,770,770,26,26,26,,26,,,,26', '26,,,,26,,26,26,26,26,26,26,26,,,,,26,26,26,26,26,26,26,,,,,,,,,,26', ',,26,26,26,26,26,26,26,26,26,26,,26,26,,26,26,26,,,,,,,,,,,,,,,,,,,', '26,,,26,,,26,26,,,26,,,,,,26,,,,,,,,26,,,,,26,26,26,26,26,26,,,,26,26', '453,453,453,,453,,,,453,453,,,,453,,453,453,453,453,453,453,453,,,,', '453,453,453,453,453,453,453,,,,,,,,,,453,,,453,453,453,453,453,453,453', '453,453,453,,453,453,,453,453,453,,,,,,,,,,,,,,,,,,,,453,,,453,,,453', '453,,,453,,,,,,453,,,,,,,,453,,,,,453,453,453,453,453,453,,,,453,453', '277,277,277,,277,,,,277,277,,,,277,,277,277,277,277,277,277,277,,,,', '277,277,277,277,277,277,277,,,,,,,,,,277,,,277,277,277,277,277,277,277', '277,277,277,,277,277,,277,277,277,,,,,,,,,,,,,,,,,,,,277,,,277,,,277', '277,,,277,,,,,,277,,,,,,,,277,,,,,277,277,277,277,277,277,,,,277,277', '278,278,278,,278,,,,278,278,,,,278,,278,278,278,278,278,278,278,,,,', '278,278,278,278,278,278,278,,,,,,,,,,278,,,278,278,278,278,278,278,278', '278,278,278,,278,278,,278,278,278,,,,,,,,,,,,,,,,,,,,278,,,278,,,278', '278,,,278,,,,,,278,,,,,,,,278,,,,,278,278,278,278,278,278,,,,278,278', '279,279,279,,279,,,,279,279,,,,279,,279,279,279,279,279,279,279,,,,', '279,279,279,279,279,279,279,,,,,,,,,,279,,,279,279,279,279,279,279,279', '279,279,279,,279,279,,279,279,279,,,,,,,,,,,,,,,,,,,,279,,,279,,,279', '279,,,279,,,,,,279,,,,,,,,279,,,,,279,279,279,279,279,279,,,,279,279', '280,280,280,,280,,,,280,280,,,,280,,280,280,280,280,280,280,280,,,,', '280,280,280,280,280,280,280,,,,,,,,,,280,,,280,280,280,280,280,280,280', '280,280,280,,280,280,,280,280,280,,,,,,,,,,,,,,,,,,,,280,,,280,,,280', '280,,,280,,,,,,280,,,,,,,,280,,,,,280,280,280,280,280,280,,,,280,280', '281,281,281,,281,,,,281,281,,,,281,,281,281,281,281,281,281,281,,,,', '281,281,281,281,281,281,281,,,,,,,,,,281,,,281,281,281,281,281,281,281', '281,281,281,,281,281,,281,281,281,,,,,,,,,,,,,,,,,,,,281,,,281,,,281', '281,,,281,,,,,,281,,,,,,,,281,,,,,281,281,281,281,281,281,,,,281,281', '282,282,282,,282,,,,282,282,,,,282,,282,282,282,282,282,282,282,,,,', '282,282,282,282,282,282,282,,,,,,,,,,282,,,282,282,282,282,282,282,282', '282,282,282,,282,282,,282,282,282,,,,,,,,,,,,,,,,,,,,282,,,282,,,282', '282,,,282,,,,,,282,,,,,,,,282,,,,,282,282,282,282,282,282,,,,282,282', '283,283,283,,283,,,,283,283,,,,283,,283,283,283,283,283,283,283,,,,', '283,283,283,283,283,283,283,,,,,,,,,,283,,,283,283,283,283,283,283,283', '283,283,283,,283,283,,283,283,283,,,,,,,,,,,,,,,,,,,,283,,,283,,,283', '283,,,283,,,,,,283,,,,,,,,283,,,,,283,283,283,283,283,283,,,,283,283', '284,284,284,,284,,,,284,284,,,,284,,284,284,284,284,284,284,284,,,,', '284,284,284,284,284,284,284,,,,,,,,,,284,,,284,284,284,284,284,284,284', '284,284,284,,284,284,,284,284,284,,,,,,,,,,,,,,,,,,,,284,,,284,,,284', '284,,,284,,,,,,284,,,,,,,,284,,,,,284,284,284,284,284,284,,,,284,284', '285,285,285,,285,,,,285,285,,,,285,,285,285,285,285,285,285,285,,,,', '285,285,285,285,285,285,285,,,,,,,,,,285,,,285,285,285,285,285,285,285', '285,285,285,,285,285,,285,285,285,,,,,,,,,,,,,,,,,,,,285,,,285,,,285', '285,,,285,,,,,,285,,,,,,,,285,,,,,285,285,285,285,285,285,,,,285,285', '286,286,286,,286,,,,286,286,,,,286,,286,286,286,286,286,286,286,,,,', '286,286,286,286,286,286,286,,,,,,,,,,286,,,286,286,286,286,286,286,286', '286,286,286,,286,286,,286,286,286,,,,,,,,,,,,,,,,,,,,286,,,286,,,286', '286,,,286,,,,,,286,,,,,,,,286,,,,,286,286,286,286,286,286,,,,286,286', '287,287,287,,287,,,,287,287,,,,287,,287,287,287,287,287,287,287,,,,', '287,287,287,287,287,287,287,,,,,,,,,,287,,,287,287,287,287,287,287,287', '287,287,287,,287,287,,287,287,287,,,,,,,,,,,,,,,,,,,,287,,,287,,,287', '287,,,287,,,,,,287,,,,,,,,287,,,,,287,287,287,287,287,287,,,,287,287', '288,288,288,,288,,,,288,288,,,,288,,288,288,288,288,288,288,288,,,,', '288,288,288,288,288,288,288,,,,,,,,,,288,,,288,288,288,288,288,288,288', '288,288,288,,288,288,,288,288,288,,,,,,,,,,,,,,,,,,,,288,,,288,,,288', '288,,,288,,,,,,288,,,,,,,,288,,,,,288,288,288,288,288,288,,,,288,288', '289,289,289,,289,,,,289,289,,,,289,,289,289,289,289,289,289,289,,,,', '289,289,289,289,289,289,289,,,,,,,,,,289,,,289,289,289,289,289,289,289', '289,289,289,,289,289,,289,289,289,,,,,,,,,,,,,,,,,,,,289,,,289,,,289', '289,,,289,,,,,,289,,,,,,,,289,,,,,289,289,289,289,289,289,,,,289,289', '290,290,290,,290,,,,290,290,,,,290,,290,290,290,290,290,290,290,,,,', '290,290,290,290,290,290,290,,,,,,,,,,290,,,290,290,290,290,290,290,290', '290,290,290,,290,290,,290,290,290,,,,,,,,,,,,,,,,,,,,290,,,290,,,290', '290,,,290,,,,,,290,,,,,,,,290,,,,,290,290,290,290,290,290,,,,290,290', '291,291,291,,291,,,,291,291,,,,291,,291,291,291,291,291,291,291,,,,', '291,291,291,291,291,291,291,,,,,,,,,,291,,,291,291,291,291,291,291,291', '291,291,291,,291,291,,291,291,291,,,,,,,,,,,,,,,,,,,,291,,,291,,,291', '291,,,291,,,,,,291,,,,,,,,291,,,,,291,291,291,291,291,291,,,,291,291', '292,292,292,,292,,,,292,292,,,,292,,292,292,292,292,292,292,292,,,,', '292,292,292,292,292,292,292,,,,,,,,,,292,,,292,292,292,292,292,292,292', '292,292,292,,292,292,,292,292,292,,,,,,,,,,,,,,,,,,,,292,,,292,,,292', '292,,,292,,,,,,292,,,,,,,,292,,,,,292,292,292,292,292,292,,,,292,292', '293,293,293,,293,,,,293,293,,,,293,,293,293,293,293,293,293,293,,,,', '293,293,293,293,293,293,293,,,,,,,,,,293,,,293,293,293,293,293,293,293', '293,293,293,,293,293,,293,293,293,,,,,,,,,,,,,,,,,,,,293,,,293,,,293', '293,,,293,,,,,,293,,,,,,,,293,,,,,293,293,293,293,293,293,,,,293,293', '294,294,294,,294,,,,294,294,,,,294,,294,294,294,294,294,294,294,,,,', '294,294,294,294,294,294,294,,,,,,,,,,294,,,294,294,294,294,294,294,294', '294,294,294,,294,294,,294,294,294,,,,,,,,,,,,,,,,,,,,294,,,294,,,294', '294,,,294,,,,,,294,,,,,,,,294,,,,,294,294,294,294,294,294,,,,294,294', '295,295,295,,295,,,,295,295,,,,295,,295,295,295,295,295,295,295,,,,', '295,295,295,295,295,295,295,,,,,,,,,,295,,,295,295,295,295,295,295,295', '295,295,295,,295,295,,295,295,295,,,,,,,,,,,,,,,,,,,,295,,,295,,,295', '295,,,295,,,,,,295,,,,,,,,295,,,,,295,295,295,295,295,295,,,,295,295', '296,296,296,,296,,,,296,296,,,,296,,296,296,296,296,296,296,296,,,,', '296,296,296,296,296,296,296,,,,,,,,,,296,,,296,296,296,296,296,296,296', '296,296,296,,296,296,,296,296,296,,,,,,,,,,,,,,,,,,,,296,,,296,,,296', '296,,,296,,,,,,296,,,,,,,,296,,,,,296,296,296,296,296,296,,,,296,296', '297,297,297,,297,,,,297,297,,,,297,,297,297,297,297,297,297,297,,,,', '297,297,297,297,297,297,297,,,,,,,,,,297,,,297,297,297,297,297,297,297', '297,297,297,,297,297,,297,297,297,,,,,,,,,,,,,,,,,,,,297,,,297,,,297', '297,,,297,,,,,,297,,,,,,,,297,,,,,297,297,297,297,297,297,,,,297,297', '298,298,298,,298,,,,298,298,,,,298,,298,298,298,298,298,298,298,,,,', '298,298,298,298,298,298,298,,,,,,,,,,298,,,298,298,298,298,298,298,298', '298,298,298,,298,298,,298,298,298,,,,,,,,,,,,,,,,,,,,298,,,298,,,298', '298,,,298,,,,,,298,,,,,,,,298,,,,,298,298,298,298,298,298,,,,298,298', '299,299,299,,299,,,,299,299,,,,299,,299,299,299,299,299,299,299,,,,', '299,299,299,299,299,299,299,,,,,,,,,,299,,,299,299,299,299,299,299,299', '299,299,299,,299,299,,299,299,299,,,,,,,,,,,,,,,,,,,,299,,,299,,,299', '299,,,299,,,,,,299,,,,,,,,299,,,,,299,299,299,299,299,299,,,,299,299', '300,300,300,,300,,,,300,300,,,,300,,300,300,300,300,300,300,300,,,,', '300,300,300,300,300,300,300,,,,,,,,,,300,,,300,300,300,300,300,300,300', '300,300,300,,300,300,,300,300,300,,,,,,,,,,,,,,,,,,,,300,,,300,,,300', '300,,,300,,,,,,300,,,,,,,,300,,,,,300,300,300,300,300,300,,,,300,300', '301,301,301,,301,,,,301,301,,,,301,,301,301,301,301,301,301,301,,,,', '301,301,301,301,301,301,301,,,,,,,,,,301,,,301,301,301,301,301,301,301', '301,301,301,,301,301,,301,301,301,,,,,,,,,,,,,,,,,,,,301,,,301,,,301', '301,,,301,,,,,,301,,,,,,,,301,,,,,301,301,301,301,301,301,,,,301,301', '302,302,302,,302,,,,302,302,,,,302,,302,302,302,302,302,302,302,,,,', '302,302,302,302,302,302,302,,,,,,,,,,302,,,302,302,302,302,302,302,302', '302,302,302,,302,302,,302,302,302,,,,,,,,,,,,,,,,,,,,302,,,302,,,302', '302,,,302,,,,,,302,,,,,,,,302,,,,,302,302,302,302,302,302,,,,302,302', '450,450,450,,450,,,,450,450,,,,450,,450,450,450,450,450,450,450,,,,', '450,450,450,450,450,450,450,,,450,,,,,,,450,,,450,450,450,450,450,450', '450,450,450,450,,450,450,,450,450,450,,,,,,,,,,,,,,,,,,,,450,,,450,', ',450,450,,,450,,,,,,450,,,,,,,,450,,,,,450,450,450,450,450,450,,,,450', '450,29,29,29,,29,,,,29,29,,,,29,,29,29,29,29,29,29,29,,,,,29,29,29,29', '29,29,29,,,,,,,,,,29,,,29,29,29,29,29,29,29,29,29,29,,29,29,,29,29,29', ',,,,,,,,,,,,,,,,,,,29,,,29,,,29,29,,,29,,,,,,29,,,,,,,,29,,,,,29,29', '29,29,29,29,,,,29,29,446,446,446,,446,,,,446,446,,,,446,,446,446,446', '446,446,446,446,,,,,446,446,446,446,446,446,446,,,,,,,,,,446,,,446,446', '446,446,446,446,446,446,446,446,,446,446,,446,446,446,,,,,,,,,,,,,,', ',,,,,446,,,446,,,446,446,,,446,,,,,,446,,,,,,,,446,,,,,446,446,446,446', '446,446,,,,446,446,825,825,825,,825,,,,825,825,,,,825,,825,825,825,825', '825,825,825,,,,,825,825,825,825,825,825,825,,,,,,,,,,825,,,825,825,825', '825,825,825,825,825,825,825,,825,825,,,,825,,,,,,,,,,,,,,,,,,,,825,', ',825,,,825,825,,,825,,,,,,,,,,,,,,,,,,,825,825,825,825,825,825,,,,825', '825,445,445,445,,445,,,,445,445,,,,445,,445,445,445,445,445,445,445', ',,,,445,445,445,445,445,445,445,,,,,,,,,,445,,,445,445,445,445,445,445', '445,445,445,445,,445,445,,445,445,445,,,,,,,,,,,,,,,,,,,,445,,,445,', ',445,445,,,445,,,,,,445,,,,,,,,445,,,,,445,445,445,445,445,445,,,,445', '445,437,437,437,,437,,,,437,437,,,,437,,437,437,437,437,437,437,437', ',,,,437,437,437,437,437,437,437,,,437,,,,,,,437,,,437,437,437,437,437', '437,437,437,437,437,,437,437,,437,437,437,,,,,,,,,,,,,,,,,,,,437,,,437', ',,437,437,,,437,,,,,,437,,,,,,,,437,,,,,437,437,437,437,437,437,,,,437', '437,781,781,781,,781,,,,781,781,,,,781,,781,781,781,781,781,781,781', ',,,,781,781,781,781,781,781,781,,,,,,,,,,781,,,781,781,781,781,781,781', '781,781,781,781,,781,781,,781,781,781,,,,,,,,,,,,,,,,,,,,781,,,781,', ',781,781,,,781,,,,,,781,,,,,,,,781,,,,,781,781,781,781,781,781,,,,781', '781,315,315,315,,315,,,,315,315,,,,315,,315,315,315,315,315,315,315', ',,,,315,315,315,315,315,315,315,,,,,,,,,,315,,,315,315,315,315,315,315', '315,315,315,315,,315,315,,315,315,315,,,,,,,,,,,,,,,,,,,,315,,,315,', '315,315,315,,,315,,315,,315,,315,,,,,,,,315,,,,,315,315,315,315,315', '315,,,,315,315,316,316,316,,316,,,,316,316,,,,316,,316,316,316,316,316', '316,316,,,,,316,316,316,316,316,316,316,,,316,,,,,,,316,,,316,316,316', '316,316,316,316,316,316,316,,316,316,,316,316,316,,,,,,,,,,,,,,,,,,', ',316,,,316,,,316,316,,,316,,,,,,316,,,,,,,,316,,,,,316,316,316,316,316', '316,,,,316,316,317,317,317,,317,,,,317,317,,,,317,,317,317,317,317,317', '317,317,,,,,317,317,317,317,317,317,317,,,317,,,,,,,317,,,317,317,317', '317,317,317,317,317,317,317,,317,317,,317,317,317,,,,,,,,,,,,,,,,,,', ',317,,,317,,,317,317,,,317,,,,,,317,,,,,,,,317,,,,,317,317,317,317,317', '317,,,,317,317,318,318,318,,318,,,,318,318,,,,318,,318,318,318,318,318', '318,318,,,,,318,318,318,318,318,318,318,,,318,,,,,,,318,,,318,318,318', '318,318,318,318,318,318,318,,318,318,,318,318,318,,,,,,,,,,,,,,,,,,', ',318,,,318,,,318,318,,,318,,,,,,318,,,,,,,,318,,,,,318,318,318,318,318', '318,,,,318,318,319,319,319,,319,,,,319,319,,,,319,,319,319,319,319,319', '319,319,,,,,319,319,319,319,319,319,319,,,319,,,,,,,319,,,319,319,319', '319,319,319,319,319,319,319,,319,319,,319,319,319,,,,,,,,,,,,,,,,,,', ',319,,,319,,,319,319,,,319,,,,,,319,,,,,,,,319,,,,,319,319,319,319,319', '319,,,,319,319,320,320,320,320,320,,,,320,320,,,,320,,320,320,320,320', '320,320,320,,,,,320,320,320,320,320,320,320,,,320,,,,,,320,320,320,320', '320,320,320,320,320,320,320,320,320,320,,320,320,,320,320,320,,,,,,', ',,,,,,,,,,,,,320,,,320,,,320,320,,,320,,320,,,,320,,,,,,,,320,,,,,320', '320,320,320,320,320,,,,320,320,323,323,323,,323,,,,323,323,,,,323,,323', '323,323,323,323,323,323,,,,,323,323,323,323,323,323,323,,,,,,,,,,323', ',,323,323,323,323,323,323,323,323,323,323,,323,323,,323,323,323,,,,', ',,,,,,,,,,,,,,,323,,,323,,,323,323,,,323,,323,,323,,323,,,,,,,,323,', ',,,323,323,323,323,323,323,,,,323,323,782,782,782,,782,,,,782,782,,', ',782,,782,782,782,782,782,782,782,,,,,782,782,782,782,782,782,782,,', ',,,,,,,782,,,782,782,782,782,782,782,782,782,782,782,,782,782,,782,782', '782,,,,,,,,,,,,,,,,,,,,782,,,782,,,782,782,,,782,,,,,,782,,,,,,,,782', ',,,,782,782,782,782,782,782,,,,782,782,30,30,30,30,30,30,30,30,30,30', '30,30,30,30,30,30,30,30,30,30,30,30,30,30,,,30,30,30,30,30,30,30,30', '30,30,,,,,,30,30,30,30,30,30,30,30,30,,30,,,,,,,,30,30,,30,30,30,30', ',30,30,,,30,,,,,30,30,30,30,,,,,,,,,,,,,,30,30,,30,30,30,30,30,30,30', '30,30,,30,,,30,30,,,414,414,414,,414,,,30,414,414,,,,414,,414,414,414', '414,414,414,414,,,,,414,414,414,414,414,414,414,,,414,,,,,,,414,,,414', '414,414,414,414,414,414,414,414,414,,414,414,,414,414,414,,,,,,,,,,', ',,,,,,,,,414,,,414,,,414,414,,,414,,,,,,414,,,,,,,,414,,,,,414,414,414', '414,414,414,,,,414,414,408,408,408,,408,,,,408,408,,,,408,,408,408,408', '408,408,408,408,,,,,408,408,408,408,408,408,408,,,,,,,,,,408,,,408,408', '408,408,408,408,408,408,408,408,,408,408,,408,408,408,,,,,,,,,,,,,,', ',,,,,408,,,408,,,408,408,,,408,,408,,408,,408,,,,,,,,408,,,,,408,408', '408,408,408,408,,,,408,408,330,330,330,,330,,,,330,330,,,,330,,330,330', '330,330,330,330,330,,,,,330,330,330,330,330,330,330,,,,,,,,,,330,,,330', '330,330,330,330,330,330,330,330,330,,330,330,,330,330,330,,,,,,,,,,', ',,,,,,,,,330,,,330,,,330,330,,,330,,,,,,330,,,,,,,,330,,,,,330,330,330', '330,330,330,,,,330,330,407,407,407,,407,,,,407,407,,,,407,,407,407,407', '407,407,407,407,,,,,407,407,407,407,407,407,407,,,,,,,,,,407,,,407,407', '407,407,407,407,407,407,407,407,,407,407,,407,407,407,,,,,,,,,,,,,,', ',,,,,407,,,407,,,407,407,,,407,,,,,,407,,,,,,,,407,,,,,407,407,407,407', '407,407,,,,407,407,406,406,406,,406,,,,406,406,,,,406,,406,406,406,406', '406,406,406,,,,,406,406,406,406,406,406,406,,,,,,,,,,406,,,406,406,406', '406,406,406,406,406,406,406,,406,406,,406,406,406,,,,,,,,,,,,,,,,,,', ',406,,,406,,,406,406,,,406,,,,,,406,,,,,,,,406,,,,,406,406,406,406,406', '406,,,,406,406,404,404,404,,404,,,,404,404,,,,404,,404,404,404,404,404', '404,404,,,,,404,404,404,404,404,404,404,,,,,,,,,,404,,,404,404,404,404', '404,404,404,404,404,404,,404,404,,404,404,404,,,,,,,,,,,,,,,,,,,,404', ',,404,,,404,404,,,404,,,,,,404,,,,,,,,404,,,,,404,404,404,404,404,404', ',,,404,404,403,403,403,,403,,,,403,403,,,,403,,403,403,403,403,403,403', '403,,,,,403,403,403,403,403,403,403,,,,,,,,,,403,,,403,403,403,403,403', '403,403,403,403,403,,403,403,,403,403,403,,,,,,,,,,,,,,,,,,,,403,,,403', ',,403,403,,,403,,,,,,403,,,,,,,,403,,,,,403,403,403,403,403,403,,,,403', '403,336,336,336,,336,,,,336,336,,,,336,,336,336,336,336,336,336,336', ',,,,336,336,336,336,336,336,336,,,,,,,,,,336,,,336,336,336,336,336,336', '336,336,336,336,,336,336,,336,336,336,,,,,,,,,,,,,,,,,,,,336,,,336,', ',336,336,,,336,,336,,,,336,,,,,,,,336,,,,,336,336,336,336,336,336,,', ',336,336,399,399,399,,399,,,,399,399,,,,399,,399,399,399,399,399,399', '399,,,,,399,399,399,399,399,399,399,,,,,,,,,,399,,,399,399,399,399,399', '399,399,399,399,399,,399,399,,399,399,399,,,,,,,,,,,,,,,,,,,,399,,,399', ',,399,399,,,399,,399,,399,,399,,,,,,,,399,,,,,399,399,399,399,399,399', ',,,399,399,802,802,802,,802,,,,802,802,,,,802,,802,802,802,802,802,802', '802,,,,,802,802,802,802,802,802,802,,,,,,,,,,802,,,802,802,802,802,802', '802,802,802,802,802,,802,802,,802,802,802,,,,,,,,,,,,,,,,,,,,802,,,802', ',,802,802,,,802,,,,,,802,,,,,,,,802,,,,,802,802,802,802,802,802,,,,802', '802,31,31,31,,31,,,,31,31,,,,31,,31,31,31,31,31,31,31,,,,,31,31,31,31', '31,31,31,,,,,,,,,,31,,,31,31,31,31,31,31,31,31,31,31,,31,31,,31,31,31', ',,,,,,,,,,,,,,,,,,,31,,,31,,,31,31,,,31,,,,,,31,,,,,,,,31,,,,,31,31', '31,31,31,31,,,,31,31,395,395,395,,395,,,,395,395,,,,395,,395,395,395', '395,395,395,395,,,,,395,395,395,395,395,395,395,,,,,,,,,,395,,,395,395', '395,395,395,395,395,395,395,395,,395,395,,395,395,395,,,,,,,,,,,,,,', ',,,,,395,,,395,,,395,395,,,395,,395,,,,395,,,,,,,,395,,,,,395,395,395', '395,395,395,,,,395,395,346,346,346,,346,,,,346,346,,,,346,,346,346,346', '346,346,346,346,,,,,346,346,346,346,346,346,346,,,,,,,,,,346,,,346,346', '346,346,346,346,346,346,346,346,,346,346,,346,346,346,,,,,,,,,,,,,,', ',,,,,346,,,346,,,346,346,,,346,,346,,,,346,,,,,,,,346,,,,,346,346,346', '346,346,346,,,,346,346,347,347,347,,347,,,,347,347,,,,347,,347,347,347', '347,347,347,347,,,,,347,347,347,347,347,347,347,,,347,,,,,,,347,,,347', '347,347,347,347,347,347,347,347,347,,347,347,,347,347,347,,,,,,,,,,', ',,,,,,,,,347,,,347,,,347,347,,,347,,,,,,347,,,,,,,,347,,,,,347,347,347', '347,347,347,,,,347,347,388,388,388,,388,,,,388,388,,,,388,,388,388,388', '388,388,388,388,,,,,388,388,388,388,388,388,388,,,388,,,,,,,388,,,388', '388,388,388,388,388,388,388,388,388,,388,388,,388,388,388,,,,,,,,,,', ',,,,,,,,,388,,,388,,,388,388,,,388,,388,,388,,388,,,,,,,,388,,,,,388', '388,388,388,388,388,,,,388,388,799,799,799,,799,,,,799,799,,,,799,,799', '799,799,799,799,799,799,,,,,799,799,799,799,799,799,799,,,,,,,,,,799', ',,799,799,799,799,799,799,799,799,799,799,,799,799,,799,799,799,,,,', ',,,,,,,,,,,,,,,799,,,799,,,799,799,,,799,,,,,,799,,,,,,,,799,,,,,799', '799,799,799,799,799,,,,799,799,382,382,382,,382,,,,382,382,,,,382,,382', '382,382,382,382,382,382,,,,,382,382,382,382,382,382,382,,,,,,,,,,382', ',,382,382,382,382,382,382,382,382,382,382,,382,382,,382,382,382,,,,', ',,,,,,,,,,,,,,,382,,,382,,,382,382,,,382,,382,,,,382,,,,,,,,382,,,,', '382,382,382,382,382,382,,,,382,382,369,369,369,,369,,,,369,369,,,,369', ',369,369,369,369,369,369,369,,,,,369,369,369,369,369,369,369,,,,,,,', ',,369,,,369,369,369,369,369,369,369,369,369,369,,369,369,,369,369,369', ',,,,,,,,,,,,,,,,,,,369,,,369,369,,369,369,,,369,,369,,369,,369,,,,,', ',,369,,,,,369,369,369,369,369,369,,,,369,369,354,354,354,,354,,,,354', '354,,,,354,,354,354,354,354,354,354,354,,,,,354,354,354,354,354,354', '354,,,,,,,,,,354,,,354,354,354,354,354,354,354,354,354,354,,354,354', ',354,354,354,,,,,,,,,,,,,,,,,,,,354,,,354,,,354,354,,,354,,,,,,354,', ',,,,,,354,,,,,354,354,354,354,354,354,,,,354,354,355,355,355,,355,,', ',355,355,,,,355,,355,355,355,355,355,355,355,,,,,355,355,355,355,355', '355,355,,,355,,,,,,,355,,,355,355,355,355,355,355,355,355,355,355,,355', '355,,355,355,355,,,,,,,,,,,,,,,,,,,,355,,,355,,,355,355,,,355,,,,,,355', ',,,,,,,355,,,,,355,355,355,355,355,355,,,,355,355,796,796,796,,796,', ',,796,796,,,,796,,796,796,796,796,796,796,796,,,,,796,796,796,796,796', '796,796,,,,,,,,,,796,,,796,796,796,796,796,796,796,796,796,796,,796', '796,,,,796,,,,,,,,,,,,,,,,,,,,796,,,796,,,796,796,,,796,,796,,796,,', ',,,,,,,,,,,,796,796,796,796,796,796,,,,796,796,32,32,32,32,32,32,32', '32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,,,32,32,32,32,32', '32,32,32,32,32,,,,,,32,32,32,32,32,32,32,32,,,32,,,,,,,,32,32,,32,32', '32,32,,32,32,,,32,,,,,32,32,32,32,,,,,,,,,,,,,,32,32,,32,32,32,32,32', '32,32,32,32,,32,,,32,32,,,365,365,365,,365,,,32,365,365,,,,365,,365', '365,365,365,365,365,365,,,,,365,365,365,365,365,365,365,,,,,,,,,,365', ',,365,365,365,365,365,365,365,365,365,365,,365,365,,365,365,365,,,,', ',,,,,,,,,,,,,,,365,,,365,365,,365,365,,,365,,365,,365,,365,,,,,,,,365', ',,,,365,365,365,365,365,365,,,,365,365,855,855,855,,855,,,,855,855,', ',,855,,855,855,855,855,855,855,855,,,,,855,855,855,855,855,855,855,', ',,,,,,,,855,,,855,855,855,855,855,855,855,855,855,855,,855,855,,,,855', ',,,,,,,,,,,,,,,,,,,855,,,855,,,855,855,,,855,,,,,,,,,,,,,,,,,,,855,855', '855,855,855,855,,,,855,855,87,87,87,87,87,87,87,87,87,87,87,87,87,87', '87,87,87,87,87,87,87,87,87,87,,,87,87,87,87,87,87,87,87,87,87,,,,,,87', '87,87,87,87,87,87,87,87,87,87,87,,,,,,,87,87,,87,87,87,87,,87,87,,,87', ',,,,87,87,87,87,,,,,,,,,,,,,,87,87,,87,87,87,87,87,87,87,87,87,,87,', ',87,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27', '27,27,,,27,27,27,27,27,27,27,27,27,27,,,,,,27,27,27,27,27,27,27,27,27', '27,27,27,,,,,,,27,27,,27,27,27,27,,27,27,,,27,,,,,27,27,27,27,,,,,,27', ',,,,,,,27,27,,27,27,27,27,27,27,27,27,27,,27,,,27,631,631,631,631,631', '631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631', '631,631,,,631,631,631,631,631,631,631,631,631,631,,,,,,631,631,631,631', '631,631,631,631,,,631,,,,,,,,631,631,,631,631,631,631,,631,631,,,631', ',,,,631,631,631,631,,,,,,,,,519,,,,,631,631,,631,631,631,631,631,631', '631,631,631,,631,,,631,519,519,519,519,519,519,519,519,519,519,519,', '519,519,,,519,519,,,,,,,,,,,,,,,519,,519,,519,519,519,519,519,519,519', ',519,,,,,,,653,653,,,653,,,,,519,,519,653,653,,653,653,653,653,,653', '653,,,653,,,,,653,653,653,653,,,,,,,,,,,,,,653,653,,653,653,653,653', '653,653,653,653,653,,653,,,653,571,571,571,571,571,571,571,571,571,571', '571,,571,571,,,571,571,,,,571,,,,,,,,,,,571,,571,,571,571,571,571,571', '571,571,,571,,,,,,,103,103,,,103,,,,,571,,571,103,103,,103,103,103,103', ',103,103,,,103,,,,,103,103,103,103,,,,,,,,,,,,,,103,103,,103,103,103', '103,103,103,103,103,103,,103,326,326,103,,326,,,,,,,,326,326,,326,326', '326,326,,326,326,,,326,,,,,326,326,326,326,,,,,,,,,,,,,,326,326,,326', '326,326,326,326,326,326,326,326,,326,432,432,326,,432,,,,,,,,432,432', ',432,432,432,432,,432,432,,,432,,,,,432,432,432,432,,,,,,,,,,,,,,432', '432,,432,432,432,432,432,432,432,432,432,,432,431,431,432,,431,,,,,', ',,431,431,,431,431,431,431,,431,431,,,431,,,,,431,431,431,431,,,,,,', ',,,,,,,431,431,,431,431,431,431,431,431,431,431,431,,431,,,431,858,858', '858,858,858,858,858,858,858,858,858,,858,858,,,858,858,,,,,,,,,,,,,', ',858,,858,,858,858,858,858,858,858,858,,858,,,,,,,396,396,,,396,,,,', '858,,858,396,396,,396,396,396,396,,396,396,,,396,,,,,396,396,396,396', ',,,,,,,,,,,,,396,396,,396,396,396,396,396,396,396,396,396,,396,600,600', '396,,600,,,,,,,,600,600,,600,600,600,600,,600,600,,,600,,,,,600,600', '600,600,,,,,,,,,,,,,,600,600,,600,600,600,600,600,600,600,600,600,,600', '384,384,600,,384,,,,,,,,384,384,,384,384,384,384,,384,384,,,384,,,,', '384,384,384,384,,,,,,,,,,,,,,384,384,,384,384,384,384,384,384,384,384', '384,,384,383,383,384,,383,,,,,,,,383,383,,383,383,383,383,,383,383,', ',383,,,,,383,383,383,383,,,,,,,,,,,,,,383,383,,383,383,383,383,383,383', '383,383,383,,383,102,102,383,,102,,,,,,,,102,102,,102,102,102,102,,102', '102,,,102,,,,,102,102,102,102,,,,,,,,,,,,,,102,102,,102,102,102,102', '102,102,102,102,102,,102,850,850,102,,850,,,,,,,,850,850,,850,850,850', '850,,850,850,,,850,,,,,850,850,850,850,,,,,,,,,,,,,,850,850,,850,850', '850,850,850,850,850,850,850,,850,325,325,850,,325,,,,,,,,325,325,,325', '325,325,325,,325,325,,,325,,,,,325,325,325,325,,,,,,,,,,,,,,325,325', ',325,325,325,325,325,325,325,325,325,,325,849,849,325,,849,,,,,,,,849', '849,,849,849,849,849,,849,849,,,849,,,,,849,849,849,849,,,,,,,,,,,,', ',849,849,,849,849,849,849,849,849,849,849,849,,849,397,397,849,,397', ',,,,,,,397,397,,397,397,397,397,,397,397,,,397,,,,,397,397,397,397,', ',,,,,,,,,,,,397,397,,397,397,397,397,397,397,397,397,397,,397,654,654', '397,,654,,,,,,,,654,654,,654,654,654,654,,654,654,,,654,,,,,654,654', '654,654,,,,,,,,,,,,,,654,654,,654,654,654,654,654,654,654,654,654,,654', '599,599,654,,599,,,,,,,,599,599,,599,599,599,599,,599,599,,,599,,,,', '599,599,599,599,,,,,,,,,,,,,,599,599,,599,599,599,599,599,599,599,599', '599,,599,375,375,599,,375,,,,,,,,375,375,,375,375,375,375,,375,375,', ',375,,,,,375,375,375,375,,,,,,,,,,,,,,375,375,,375,375,375,375,375,375', '375,375,375,,375,376,376,375,,376,,,,,,,,376,376,,376,376,376,376,,376', '376,,,376,,,,,376,376,376,376,,,,,,,,,,,,,,376,376,,376,376,376,376', '376,376,376,376,376,,376,,,376,537,537,537,537,537,537,537,537,537,537', '537,,537,537,,,537,537,,,,,,,,,,,,,,,537,,537,,537,537,537,537,537,537', '537,,537,765,765,765,765,765,765,765,765,765,765,765,,765,765,,537,765', '765,,,,,,,,,,,,,,,765,,765,,765,765,765,765,765,765,765,,765,422,422', '422,422,422,422,422,422,422,422,422,,422,422,765,765,422,422,,,,,,,', ',,,,,,,422,,422,,422,422,422,422,422,422,422,,422,641,641,641,641,641', '641,641,641,641,641,641,,641,641,,422,641,641,,,,,,,,,,,,,,,641,,641', ',641,641,641,641,641,641,641,,641,685,685,685,685,685,685,685,685,685', '685,685,,685,685,,641,685,685,,,,,,,,,,,,,,,685,,685,,685,685,685,685', '685,685,685,,685,449,449,449,449,449,449,449,449,449,449,449,,449,449', ',685,449,449,,,,,,,,,,,,,,,449,,449,,449,449,449,449,449,449,449,,449', '777,777,777,777,777,777,777,777,777,777,777,,777,777,,449,777,777,,', ',,,,,,,,,,,,777,,777,,777,777,777,777,777,777,777,,777,691,691,691,691', '691,691,691,691,691,691,691,,691,691,,777,691,691,,,,,,,,,,,,,,,691', ',691,,691,691,691,691,691,691,691,,691,508,508,508,508,508,508,508,508', '508,508,508,,508,508,,691,508,508,,,,,,,,,,,,,,,508,,508,,508,508,508', '508,508,508,508,,508,687,687,687,687,687,687,687,687,687,687,687,,687', '687,508,508,687,687,,,,,,,,,,,,,,,687,,687,,687,687,687,687,687,687', '687,,687,766,766,766,766,766,766,766,766,766,766,766,,766,766,,687,766', '766,,,,,,,,,,,,,,,766,,766,,766,766,766,766,766,766,766,,766,45,45,45', '45,45,45,45,45,45,45,45,,45,45,,766,45,45,,,,,,,,,,,,,,,45,,45,,45,45', '45,45,45,45,45,,45,689,689,689,689,689,689,689,689,689,689,689,,689', '689,,45,689,689,,,,,,,,,,,,,,,689,,689,,689,689,689,689,689,689,689', ',689,142,142,142,142,142,142,142,142,142,142,142,,142,142,,689,142,142', ',,,,,,,,,,,,,,142,,142,,142,142,142,142,142,142,142,,142,,,,,,,,,,,', ',,,,142' ] racc_action_check = arr = ::Array.new(25040, nil) idx = 0 clist.each do |str| str.split(',', -1).each do |i| arr[idx] = i.to_i unless i.empty? idx += 1 end end racc_action_pointer = [ nil, 12, 4702, 1133, nil, 677, 8437, 8921, 70, nil, nil, 9526, nil, nil, 11946, -23, nil, 1004, 13035, 1047, 181, 999, 13277, nil, nil, 997, 14608, 22930, nil, 18117, 19811, 21134, 22465, 594, nil, 508, nil, -78, 996, nil, 362, 1031, nil, nil, nil, 24825, 973, nil, 183, nil, 1054, 9042, nil, nil, 8679, 4092, nil, 8558, 1036, 7953, 5662, nil, 5057, nil, 277, 4936, 315, nil, nil, nil, nil, nil, 5178, nil, nil, nil, nil, 5299, nil, 5420, nil, 950, 916, nil, nil, nil, nil, 22820, nil, 949, nil, 6025, 798, nil, nil, 979, nil, 6388, nil, 179, nil, 6630, 23802, 23268, 597, -22, nil, nil, 10, 540, 1029, -13, 928, 994, nil, 959, 949, nil, nil, nil, -28, 1025, nil, 973, 982, 3970, nil, 8800, 940, nil, 940, nil, 243, 1033, 9405, 900, 9647, 163, 940, nil, 157, 960, 24915, nil, nil, 10373, nil, 878, 920, 877, 795, nil, 880, 125, nil, nil, nil, 11220, 11341, 875, nil, -35, 11704, 847, 3604, 12067, nil, 383, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 352, nil, 353, nil, nil, nil, nil, 407, nil, nil, nil, nil, nil, nil, 405, -51, nil, nil, nil, 238, nil, nil, nil, nil, -45, 326, nil, 347, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 631, nil, nil, nil, nil, 898, nil, 831, 13761, 13882, 890, 888, 3238, 14366, nil, 795, nil, nil, nil, nil, 88, 834, 14850, 14971, 15092, 15213, 15334, 15455, 15576, 15697, 15818, 15939, 16060, 16181, 16302, 16423, 16544, 16665, 16786, 16907, 17028, 17149, 17270, 17391, 17512, 17633, 17754, 17875, 2994, nil, nil, nil, nil, 544, 20, 852, 841, 840, 1286, nil, 18843, 18964, 19085, 19206, 19327, 19448, nil, nil, 19569, 45, 23922, 23328, nil, nil, 482, 20166, 832, 193, nil, 764, 334, 20771, 12, 744, 430, nil, nil, 215, nil, nil, nil, 21376, 21497, 248, nil, 761, 310, 225, nil, 22102, 22223, nil, nil, nil, nil, nil, nil, 763, 735, nil, 22578, 0, 9889, 125, 21981, nil, -80, nil, 200, 7227, 24222, 24282, nil, nil, nil, 733, -19, 21860, 23742, 23682, 839, nil, nil, 21618, nil, nil, 199, nil, 240, nil, 21255, 23562, 24042, 685, 20892, nil, nil, nil, 20650, 20529, 104, 20408, 20287, 20045, nil, nil, 151, nil, nil, 19924, 674, nil, 134, nil, 14, 128, 377, 24420, nil, nil, 680, nil, nil, nil, 715, nil, 23448, 23388, 1089, nil, nil, nil, 18601, 4823, nil, nil, nil, nil, nil, nil, 18480, 18238, 795, 785, 24555, 17996, 1071, nil, 14729, 2018, 553, 674, 1896, 729, 2506, 721, 1160, 441, 2384, 276, 420, 2018, 330, 2628, 1652, 1530, 1408, 795, 2994, 1774, 720, 2872, 702, 2140, 2750, 2262, 652, -17, nil, 1774, nil, 741, nil, 605, 627, 623, nil, nil, nil, nil, nil, nil, 613, 663, 541, 157, 537, 1408, 437, nil, nil, 250, 539, 24690, nil, nil, nil, 12914, nil, nil, 12793, 12672, nil, nil, 23088, nil, 519, 3726, nil, 604, 594, nil, nil, 464, nil, 27, nil, nil, nil, 12188, nil, nil, 24330, nil, 52, 2750, 658, 32, 475, nil, 11583, 11099, 433, nil, nil, nil, 10978, 10857, 423, 394, -4, 3, 382, -7, -5, 10131, 364, 323, 792, 116, 5, 9768, 322, -64, nil, nil, 23202, 336, 79, nil, nil, 9284, nil, nil, 301, 674, 553, 90, -74, 261, nil, 8316, 264, nil, nil, nil, 916, 8195, 213, 225, nil, nil, 542, 7590, 24162, 23622, nil, nil, 470, 319, nil, nil, nil, nil, nil, 2506, nil, nil, 245, 232, 145, 385, 130, nil, nil, 128, nil, nil, 114, nil, nil, 2628, nil, nil, nil, 497, 23040, 24, nil, 7114, 174, 160, 170, 6751, nil, 9, 24465, 59, 6146, nil, nil, 526, nil, -65, nil, nil, 39, 27, 23154, 24102, 5541, 807, nil, nil, nil, nil, -39, nil, 5783, nil, nil, 5904, 6509, 162, 6872, nil, 177, nil, nil, nil, nil, nil, 102, nil, nil, nil, nil, nil, 6993, nil, 24510, nil, 24735, nil, 24870, nil, 24645, nil, -6, 53, 550, 182, 7832, nil, 8074, 259, nil, nil, 2262, 1160, 9163, nil, 273, nil, 306, 3116, 176, 10010, 10252, 10615, 357, 367, 10736, nil, 468, 437, nil, 227, 795, nil, 12309, 4580, 615, nil, nil, 12551, nil, 1337, nil, 268, nil, 394, nil, 662, 550, nil, 593, nil, 1530, 690, nil, nil, 573, 615, nil, nil, nil, 430, 1652, 13398, 707, nil, nil, nil, 630, 632, 693, -24, 725, nil, 24375, 24780, 14124, 657, nil, 14487, 21, 666, nil, 1896, 2140, nil, 24600, nil, nil, nil, 18722, 19690, 682, nil, 683, nil, 2384, 810, 850, 916, 919, 777, 734, 726, nil, 22344, nil, 756, 21739, nil, nil, 21013, nil, nil, 386, 883, nil, nil, nil, 778, 779, nil, nil, 776, 787, nil, 827, 1052, nil, nil, nil, 2872, nil, 31, 18359, nil, 933, -11, nil, 863, nil, nil, nil, nil, 3360, 14003, 946, 947, 3482, 833, 835, 13519, nil, 11825, nil, 866, nil, 11462, 23982, 23862, 556, 10494, 914, 1039, 22699, nil, nil, 23496, 3848, nil, nil, 272, nil, nil, nil, nil, 4214, nil, 4336, nil, nil, 4458, nil, 78, 7711, nil, nil, 1043, nil, nil, 7469, 6267, 939, nil, 974, 192, 380, 379, 186, nil, 14245, 988, 970, nil, nil, 1090, 988, 1108, 1111, 575, nil, nil, nil, nil, nil, 994, 995, 13640, nil, 553, nil, 13156, 1033, nil, nil, nil, nil, nil, nil, nil, 12430, nil, 7348, 1008, nil, nil ] racc_action_default = [ -1, -520, -519, -520, -519, -520, -520, -70, -252, -434, -519, -323, -61, -2, -520, -292, -435, -519, -324, -308, -274, -519, -65, -315, -325, -520, -520, -520, -326, -520, -520, -520, -520, -34, -71, -520, -276, -449, -510, -401, -508, -520, -20, -428, -394, -40, -520, -448, -397, -5, -42, -286, -447, -398, -520, -519, -43, -289, -6, -438, -371, -267, -520, -444, -47, -520, -498, -268, -443, -440, -395, -269, -520, -445, -439, -396, -270, -519, -446, -441, -271, -520, -508, -442, -272, -35, -451, -519, -273, -520, -296, -519, -217, -452, -519, -520, -299, -520, 927, -520, -416, -519, -520, -520, -520, -365, -323, -324, -274, -520, -520, -449, -510, -520, -286, -289, -371, -339, -340, -327, -520, -82, -69, -75, -520, -519, -291, -520, -53, -375, -520, -372, -520, -520, -520, -519, -520, -274, -262, -239, -449, -520, -218, -231, -45, -520, -493, -520, -520, -519, -8, -293, -520, -520, -406, -46, -311, -520, -520, -520, -412, -520, -68, -66, -519, -520, -73, -520, -194, -152, -124, -141, -123, -155, -143, -131, -110, -154, -132, -159, -129, -144, -119, -161, -128, -138, -130, -167, -120, -153, -126, -449, -140, -146, -125, -145, -127, -160, -121, -136, -111, -150, -122, -137, -318, -149, -162, -117, -134, -112, -520, -170, -169, -115, -99, -135, -113, -488, -171, -164, -108, -100, -96, -163, -98, -116, -165, -156, -109, -118, -148, -147, -166, -97, -142, -151, -114, -168, -139, -133, -487, -172, -158, -173, -157, -210, -101, -134, -135, -96, -163, -103, -9, -156, -102, -520, -166, -104, -97, -151, -195, -105, -14, -520, -520, -436, -437, -519, -520, -511, -509, -516, -515, -517, -4, -282, -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, -519, -399, -359, -362, -44, -41, -520, -61, -520, -520, -519, -60, -520, -520, -520, -520, -520, -520, -59, -370, -519, -520, -520, -520, -209, -39, -278, -520, -520, -512, -219, -510, -512, -520, -520, -509, -508, -427, -429, -520, -431, -430, -432, -520, -520, -512, -490, -520, -512, -520, -414, -520, -520, -38, -418, -421, -419, -417, -402, -520, -252, -369, -505, -499, -504, -500, -519, -502, -499, -501, -500, -519, -520, -520, -436, -437, -305, -520, -282, -519, -520, -520, -81, -253, -254, -255, -54, -50, -519, -366, -519, -403, -519, -520, -520, -519, -520, -234, -261, -259, -520, -520, -282, -520, -520, -520, -232, -404, -520, -408, -405, -520, -520, -274, -520, -94, -520, -91, -92, -183, -30, -410, -520, -411, -67, -74, -520, -316, -520, -520, -467, -320, -507, -506, -520, -520, -13, -12, -11, -106, -36, -37, -520, -520, -386, -520, -215, -520, -7, -518, -520, -519, -204, -185, -205, -190, -206, -189, -520, -211, -201, -186, -212, -203, -187, -213, -202, -214, -200, -207, -196, -208, -188, -197, -191, -199, -198, -184, -520, -519, -330, -519, -329, -328, -280, -62, -520, -520, -288, -15, -16, -17, -18, -19, -520, -231, -510, -510, -519, -519, -252, -499, -500, -252, -510, -510, -284, -513, -223, -514, -220, -221, -514, -520, -31, -262, -174, -23, -520, -519, -378, -520, -520, -433, -33, -32, -24, -520, -491, -285, -492, -514, -415, -400, -176, -25, -520, -519, -520, -283, -57, -368, -520, -520, -55, -230, -367, -229, -520, -520, -520, -520, -503, -281, -519, -499, -500, -520, -520, -78, -80, -499, -500, -520, -519, -520, -251, -257, -40, -520, -519, -376, -357, -520, -355, -373, -520, -503, -281, -499, -500, -520, -238, -520, -520, -260, -494, -495, -174, -520, -519, -263, -407, -409, -312, -519, -520, -520, -93, -91, -92, -520, -454, -309, -453, -413, -72, -519, -473, -476, -481, -520, -472, -520, -486, -479, -470, -486, -478, -469, -486, -483, -468, -519, -482, -471, -466, -467, -520, -510, -10, -520, -192, -193, -519, -519, -277, -520, -182, -520, -520, -22, -360, -519, -331, -62, -287, -225, -520, -520, -520, -520, -520, -519, -49, -364, -48, -363, -520, -224, -520, -263, -266, -520, -520, -520, -520, -303, -520, -334, -333, -297, -332, -300, -520, -426, -420, -423, -424, -425, -520, -58, -180, -29, -181, -56, -178, -27, -179, -28, -283, -520, -76, -519, -520, -244, -520, -520, -256, -51, -519, -353, -520, -341, -343, -356, -520, -519, -283, -520, -520, -520, -519, -519, -520, -236, -520, -520, -95, -91, -92, -456, -520, -519, -520, -480, -484, -520, -458, -520, -462, -520, -464, -520, -465, -520, -510, -321, -520, -107, -519, -519, -337, -388, -387, -519, -389, -290, -21, -216, -519, -520, -520, -335, -226, -227, -519, -519, -520, -510, -520, -279, -510, -175, -520, -264, -304, -520, -520, -380, -302, -519, -519, -422, -177, -26, -306, -250, -520, -520, -519, -241, -519, -258, -519, -520, -520, -90, -83, -520, -520, -352, -354, -344, -358, -520, -520, -235, -233, -520, -313, -283, -520, -520, -317, -475, -474, -486, -486, -485, -477, -520, -486, -319, -520, -467, -489, -338, -3, -519, -393, -520, -520, -391, -520, -520, -294, -520, -295, -222, -265, -382, -519, -520, -520, -520, -519, -519, -519, -520, -246, -520, -240, -520, -377, -519, -520, -520, -89, -520, -520, -349, -520, -342, -374, -519, -519, -455, -310, -520, -460, -461, -463, -457, -519, -392, -519, -390, -361, -519, -228, -519, -520, -298, -301, -520, -245, -242, -520, -520, -519, -52, -520, -86, -88, -85, -87, -351, -520, -520, -348, -345, -237, -520, -486, -520, -386, -519, -384, -383, -379, -381, -307, -519, -519, -520, -247, -84, -350, -520, -520, -314, -459, -322, -385, -336, -248, -243, -520, -347, -520, -519, -346, -249 ] clist = [ '81,163,524,214,117,204,214,331,214,20,637,389,81,108,121,400,589,143', '135,139,626,20,755,629,143,135,139,150,268,121,484,362,254,744,254,448', '257,273,257,500,149,252,601,261,517,502,274,149,128,412,122,310,763', '81,527,813,709,143,135,139,322,419,20,214,144,341,674,363,369,430,312', '155,574,700,578,676,99,328,365,273,149,658,132,334,660,240,350,733,337', '151,735,309,811,737,815,386,570,314,348,324,321,634,380,787,307,511', '110,334,514,606,573,276,210,434,267,507,322,347,774,339,351,531,355', '81,533,775,560,839,157,589,392,726,20,143,135,139,414,719,859,165,610', '433,631,818,707,572,482,753,393,119,119,710,391,703,771,903,149,669', '748,342,310,824,81,645,416,119,304,352,438,121,423,20,416,308,153,411', '118,161,679,429,387,308,541,813,540,340,725,739,810,262,671,329,270', '821,809,2,437,1,,,,308,,,,427,,,,,,,,,,,356,,,,629,,897,,721,,,,,,779', ',,,,,,,,,,,,,,,,,535,,,,,,702,,,,,,,,,,,81,,,81,,902,,,,20,,918,20,585', '13,863,864,,451,,865,,,,,503,506,,,,,,,,,119,81,,,553,119,,596,119,310', '20,81,561,,589,,,,81,,20,143,135,139,513,579,,20,489,498,135,139,311', '496,589,,273,658,660,,,557,,,149,525,746,,520,557,,365,501,492,493,494', '495,,529,365,,363,369,544,,521,538,915,490,,,762,365,,,521,499,,727', ',334,,443,444,530,,,,334,,,,539,,738,567,569,557,,,,334,311,543,,867', ',365,629,547,,,,,214,593,607,,,,,,,,,,684,,,,688,,,,,308,308,308,308', ',254,311,,,257,,,698,,633,,,81,,,,,,,589,,20,917,,,,308,,,,,,,718,308', ',,,,,,,81,,,,,,,651,652,20,835,,806,,,661,662,,81,,,,,,,329,,20,,,,', ',,,,,,81,,,,,589,,675,720,20,,,,597,,,675,,81,901,,,,657,,869,659,20', '678,872,,,,,544,706,632,686,,,,,,690,692,557,,,,640,,,,,,365,780,,,', '481,,,121,,,,,,,311,,,,,800,801,694,,100,,724,,,334,100,,214,81,740', '214,,154,731,,,160,20,759,760,,,741,,81,,,896,,,,,,20,,898,254,,,,257', ',,,,742,,,,,,,,,,,,,,,,761,593,843,,845,,521,,,,,333,,,,,,,308,,,100', ',,,349,,,353,,675,,,,778,333,,772,,,81,794,795,,,783,784,81,,20,790', '790,,,,803,20,,119,879,880,,,81,,,,785,817,401,642,,20,,,,,895,,,81', ',,401,,,,,,20,81,830,,,832,,,,,20,646,805,909,,,,,,,,,81,81,,856,,,885', '656,,20,20,,,81,919,920,,,,828,,,20,,,,,668,,,860,121,926,,,,,,,,,,', '557,,677,,,81,,,870,,365,,,,20,,,790,81,,,,81,,,,,20,,308,,20,119,119', ',890,883,893,894,334,,,81,,790,,790,790,,,81,20,81,,,81,,,308,20,,20', ',,20,,,,5,,,,104,120,911,,,133,,,5,,,790,133,,,,120,,,,,37,,922,,111', '123,,,,,497,790,37,925,,,,,,,123,,790,,133,191,,133,5,,,119,,,,133,', ',133,,,,,,,133,,,,,133,,,37,,133,550,,,,119,333,,,,,,,,333,133,,788', ',133,,,,577,798,577,,333,,,401,,119,,119,119,,,,,,,,5,,133,,,,,,,,,', ',,820,,,,,,,,,,827,37,,,119,,,,415,133,,,,120,,5,415,,,,,837,838,,,119', ',,,,,,,191,846,,119,,123,,37,191,,,,,,577,,,,,,,,,,,,,,,,,,,401,,550', '868,,550,,,,,,,,,,,874,,,,878,,,,,,,,,,,,,,,,,,,,,,,,,,,,133,133,899', ',5,900,,5,550,,,,,,,,,,401,,,,,,577,,,,,37,,,37,,,,,,,,5,,,,401,,,,', '333,5,,133,133,133,133,133,5,,,133,,,,,37,,,,,,,,133,,37,,,,,,,37,133', '133,,,,745,749,,133,133,,,,,745,,,,,,,,,,745,,,,133,,,,,,,,133,,,,,', '133,,,,,,,133,,,,,,,,,,,95,,,,401,,,,133,,,,95,,,,,,,,,,,401,401,,,', ',,,133,,,,,,,,,,,,,133,,,,5,,,,823,95,,,826,,,,,,,,,,,550,550,,,,,37', ',,,,5,,,,,,,,,,,,,401,,401,,,5,,,,,,,37,,,,,,,,,,,,,5,,,,,37,,95,,,', ',,,,,,,5,,,,,133,,37,,,,133,133,,401,401,,,,,133,,333,,,37,,,95,,,,401', ',,,120,,,,,,,,,,,,745,,,,,,,,,401,133,,,123,,,,,,,,,5,,,,745,,,,,,401', '401,,,,,5,,,,,,,,,37,,,401,,,,,,,,,,,,,37,,,,133,,,,,,,,,,,,,,,,95,', ',95,,,,,,,,,133,,,,,,,,,,142,,,,,,,142,,,5,789,789,,95,168,,5,245,,260', ',,,95,,,,,,,95,133,5,,37,791,791,,,142,,37,,,,,,,,5,,,,327,,,,37,,5', '133,,,,,142,,,,,,,,,37,,,,,142,5,5,,,37,,,,,142,,,,5,,,,,,,,,120,,,37', '37,,,,,,,,,142,,,37,,,,142,,142,,,123,5,,,789,,327,,,,,,,,5,,,,5,422', ',,,,,,37,133,,791,,789,,789,789,,,95,5,37,,,,37,,,5,,5,,,5,,,,,791,', '791,791,,,,37,,,,95,,,789,37,,37,,,37,,,,,,,,,95,,,,,,789,,,,791,,,', ',,,789,,,95,,,,,,,,,,,791,,,,,,,95,,,,791,,449,,,,,,,,,455,456,457,458', '459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475', '476,477,478,479,480,,,,398,,402,,,,,,,142,,,,,,,,142,,,,,,,508,,95,', ',,519,,,,,,,,,,142,,95,,,,,,537,,,,,,,,,,,,,,,,,,,,142,,,,,,,,142,,', ',,,571,,,,,,,142,,,,142,,,,422,142,,591,537,142,,,,,,,,,,,,,,,,,95,', ',,,,,95,,,,,,,,,,,,,635,636,,95,,,,,641,,,,,,,,,,,,95,,,,,,,,,,95,,', ',8,,,,,,,,,8,,,8,,,,8,95,95,,,,,,,,,,,518,95,,,142,,,142,142,,528,,', ',,,,,,,8,,,8,8,,142,,,,,8,,,8,,95,685,687,,,8,,689,691,,8,,,95,,8,568', '95,,,,,142,,,,,587,,,8,,590,,8,,594,95,,,,,142,,,95,,95,142,,95,,,,142', ',,,8,,8,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8,,,142,,,8,,752,,,,,,,,,,,,142', ',,,,,,,765,,,766,142,,142,,,,,,,,,,,,,,777,587,,,664,665,,,,,,,,,142', ',142,,,,,,,664,,,,,,685,689,691,,,142,,,,,,,,,,,,,142,,,,,,,,696,,8', '8,,,8,,,8,,,,,,,,,,,715,,,,,,716,,,142,,,142,,,,,,,,,,8,142,142,,,,', ',,,8,,8,8,8,8,8,8,,777,8,,858,,,,,,,,747,,,8,,,,,,,,,,8,8,,,594,,,,8', '8,,,,142,,,768,,518,142,,142,,,,142,,,8,,,,,,,,8,,,,,,8,,,,587,,,8,', ',142,,,,,,142,142,,,,,,,587,,8,,,,,,,,,,,808,,,,,,142,,,,,,8,,,,,,,142', ',,,,,8,,,,8,,,,,,,,833,,,834,,,,,,,,,,,840,841,,,,,,,8,,,,,,,,,,,,,', ',,,,8,,,,,,,,,,,,,,,,,,,,8,,,,,,,,,664,,,,,,587,,594,8,,,,,8,,,,,,8', '8,,,,,,,,8,,,,,,,,,,904,,,,,,906,907,,,,,,,,,,,,,,,,,,,,,8,,,,,587,', ',,,,,8,,,,,,924,,,,,,,,,,8,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8,,,,,,,,,,,', ',,,,,,,,,,,,,,,,8,,,,,,,,,,,,,,,,,,,,8,,,,,,,8,,,,,,,,,,,,,,,8,8,,,', ',,,,,,,,,,,,,8,,,,,,,,,,8,8,,,,,,,,,,,,,,,,,,,,8,8,,,,,,,,,,,,8,,,,', ',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8,,,,,,,,,,,,,8,,,,8,,,,,,,,,8,,,,,,,', ',,,8,,,,,,,,8,,8,,,8' ] racc_goto_table = arr = ::Array.new(2913, nil) idx = 0 clist.each do |str| str.split(',', -1).each do |i| arr[idx] = i.to_i unless i.empty? idx += 1 end end clist = [ '16,43,82,49,16,48,49,21,49,22,5,35,16,22,22,62,148,29,59,63,86,22,80', '142,29,59,63,11,55,22,79,21,52,6,52,3,53,85,53,32,57,13,46,13,23,79', '9,57,34,130,44,40,6,16,23,144,108,29,59,63,60,47,22,49,31,48,81,33,33', '47,41,31,36,68,36,81,127,17,49,85,57,61,127,29,61,75,76,141,9,77,141', '15,140,141,140,65,64,34,59,15,34,54,55,38,31,58,83,29,58,84,37,27,87', '88,89,90,60,91,92,15,57,58,93,16,58,94,95,96,97,148,60,98,22,29,59,63', '99,100,101,102,103,104,105,106,107,67,110,111,114,56,56,115,116,117', '118,119,57,120,121,127,40,122,16,36,22,56,125,126,26,22,17,22,22,25', '128,129,18,131,132,41,31,25,133,144,134,135,136,137,139,14,82,25,12', '7,143,4,147,1,,,,25,,,,44,,,,,,,,,,,25,,,,142,,140,,46,,,,,,81,,,,,', ',,,,,,,,,,,,130,,,,,,36,,,,,,,,,,,16,,,16,,6,,,,22,,80,22,62,2,141,141', ',11,,141,,,,,33,33,,,,,,,,,56,16,,,21,56,,130,56,40,22,16,21,,148,,', ',16,,22,29,59,63,55,21,,22,41,29,59,63,2,11,148,,85,61,61,,,33,,,57', '9,23,,17,33,,49,57,15,15,15,15,,17,49,,33,33,60,,57,17,141,31,,,32,49', ',,57,31,,3,,29,,25,25,15,,,,29,,,,15,,3,59,63,33,,,,29,2,34,,86,,49', '142,34,,,,,49,59,85,,,,,,,,,,35,,,,35,,,,,25,25,25,25,,52,2,,,53,,,62', ',13,,,16,,,,,,,148,,22,5,,,,25,,,,,,,62,25,,,,,,,,16,,,,,,,55,55,22', '79,,3,,,55,55,,16,,,,,,,25,,22,,,,,,,,,,,16,,,,,148,,85,21,22,,,,25', ',,85,,16,82,,,,34,,79,34,22,22,79,,,,,60,43,25,17,,,,,,17,17,33,,,,25', ',,,,,49,62,,,,2,,,22,,,,,,,2,,,,,62,62,15,,10,,85,,,29,10,,49,16,48', '49,,10,85,,,10,22,33,33,,,55,,16,,,3,,,,,,22,,3,52,,,,53,,,,,13,,,,', ',,,,,,,,,,,29,59,62,,62,,57,,,,,10,,,,,,,25,,,10,,,,10,,,10,,85,,,,17', '10,,57,,,16,16,16,,,59,63,16,,22,22,22,,,,85,22,,56,62,62,,,16,,,,57', '55,10,2,,22,,,,,62,,,16,,,10,,,,,,22,16,55,,,55,,,,,22,2,15,62,,,,,', ',,,16,16,,43,,,21,2,,22,22,,,16,62,62,,,,15,,,22,,,,,2,,,85,22,62,,', ',,,,,,,,33,,2,,,16,,,16,,49,,,,22,,,22,16,,,,16,,,,,22,,25,,22,56,56', ',16,59,16,16,29,,,16,,22,,22,22,,,16,22,16,,,16,,,25,22,,22,,,22,,,', '20,,,,20,20,16,,,20,,,20,,,22,20,,,,20,,,,,45,,16,,45,45,,,,,10,22,45', '16,,,,,,,45,,22,,20,45,,20,20,,,56,,,,20,,,20,,,,,,,20,,,,,20,,,45,', '20,10,,,,56,10,,,,,,,,10,20,,2,,20,,,,10,2,10,,10,,,10,,56,,56,56,,', ',,,,,20,,20,,,,,,,,,,,,2,,,,,,,,,,2,45,,,56,,,,20,20,,,,20,,20,20,,', ',,2,2,,,56,,,,,,,,45,2,,56,,45,,45,45,,,,,,10,,,,,,,,,,,,,,,,,,,10,', '10,2,,10,,,,,,,,,,,2,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,20,20,2,,20,2,', '20,10,,,,,,,,,,10,,,,,,10,,,,,45,,,45,,,,,,,,20,,,,10,,,,,10,20,,20', '20,20,20,20,20,,,20,,,,,45,,,,,,,,20,,45,,,,,,,45,20,20,,,,10,10,,20', '20,,,,,10,,,,,,,,,,10,,,,20,,,,,,,,20,,,,,,20,,,,,,,20,,,,,,,,,,,19', ',,,10,,,,20,,,,19,,,,,,,,,,,10,10,,,,,,,20,,,,,,,,,,,,,20,,,,20,,,,10', '19,,,10,,,,,,,,,,,10,10,,,,,45,,,,,20,,,,,,,,,,,,,10,,10,,,20,,,,,,', '45,,,,,,,,,,,,,20,,,,,45,,19,,,,,,,,,,,20,,,,,20,,45,,,,20,20,,10,10', ',,,,20,,10,,,45,,,19,,,,10,,,,20,,,,,,,,,,,,10,,,,,,,,,10,20,,,45,,', ',,,,,,20,,,,10,,,,,,10,10,,,,,20,,,,,,,,,45,,,10,,,,,,,,,,,,,45,,,,20', ',,,,,,,,,,,,,,,19,,,19,,,,,,,,,20,,,,,,,,,,28,,,,,,,28,,,20,20,20,,19', '28,,20,28,,28,,,,19,,,,,,,19,20,20,,45,45,45,,,28,,45,,,,,,,,20,,,,28', ',,,45,,20,20,,,,,28,,,,,,,,,45,,,,,28,20,20,,,45,,,,,28,,,,20,,,,,,', ',,20,,,45,45,,,,,,,,,28,,,45,,,,28,,28,,,45,20,,,20,,28,,,,,,,,20,,', ',20,28,,,,,,,45,20,,45,,20,,20,20,,,19,20,45,,,,45,,,20,,20,,,20,,,', ',45,,45,45,,,,45,,,,19,,,20,45,,45,,,45,,,,,,,,,19,,,,,,20,,,,45,,,', ',,,20,,,19,,,,,,,,,,,45,,,,,,,19,,,,45,,28,,,,,,,,,28,28,28,28,28,28', '28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,,,,24,,24', ',,,,,,28,,,,,,,,28,,,,,,,28,,19,,,,28,,,,,,,,,,28,,19,,,,,,28,,,,,,', ',,,,,,,,,,,,,28,,,,,,,,28,,,,,,28,,,,,,,28,,,,28,,,,28,28,,28,28,28', ',,,,,,,,,,,,,,,,19,,,,,,,19,,,,,,,,,,,,,28,28,,19,,,,,28,,,,,,,,,,,', '19,,,,,,,,,,19,,,,39,,,,,,,,,39,,,39,,,,39,19,19,,,,,,,,,,,24,19,,,28', ',,28,28,,24,,,,,,,,,,39,,,39,39,,28,,,,,39,,,39,,19,28,28,,,39,,28,28', ',39,,,19,,39,24,19,,,,,28,,,,,24,,,39,,24,,39,,24,19,,,,,28,,,19,,19', '28,,19,,,,28,,,,39,,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,39,,,28,,,39,,28', ',,,,,,,,,,,28,,,,,,,,28,,,28,28,,28,,,,,,,,,,,,,,28,24,,,24,24,,,,,', ',,,28,,28,,,,,,,24,,,,,,28,28,28,,,28,,,,,,,,,,,,,28,,,,,,,,24,,39,39', ',,39,,,39,,,,,,,,,,,24,,,,,,24,,,28,,,28,,,,,,,,,,39,28,28,,,,,,,,39', ',39,39,39,39,39,39,,28,39,,28,,,,,,,,24,,,39,,,,,,,,,,39,39,,,24,,,', '39,39,,,,28,,,24,,24,28,,28,,,,28,,,39,,,,,,,,39,,,,,,39,,,,24,,,39', ',,28,,,,,,28,28,,,,,,,24,,39,,,,,,,,,,,24,,,,,,28,,,,,,39,,,,,,,28,', ',,,,39,,,,39,,,,,,,,24,,,24,,,,,,,,,,,24,24,,,,,,,39,,,,,,,,,,,,,,,', ',,39,,,,,,,,,,,,,,,,,,,,39,,,,,,,,,24,,,,,,24,,24,39,,,,,39,,,,,,39', '39,,,,,,,,39,,,,,,,,,,24,,,,,,24,24,,,,,,,,,,,,,,,,,,,,,39,,,,,24,,', ',,,,39,,,,,,24,,,,,,,,,,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,39,,,,,,,,,,', ',,,,,,,,,,,,,,,,,39,,,,,,,,,,,,,,,,,,,,39,,,,,,,39,,,,,,,,,,,,,,,39', '39,,,,,,,,,,,,,,,,,39,,,,,,,,,,39,39,,,,,,,,,,,,,,,,,,,,39,39,,,,,,', ',,,,,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,39,,,,,,,,,,,,,39,,,,39,,', ',,,,,,39,,,,,,,,,,,39,,,,,,,,39,,39,,,39' ] racc_goto_check = arr = ::Array.new(2913, nil) idx = 0 clist.each do |str| str.split(',', -1).each do |i| arr[idx] = i.to_i unless i.empty? idx += 1 end end racc_goto_pointer = [ nil, 197, 277, -232, 195, -437, -604, -551, nil, 6, 595, 13, 152, 11, 157, 37, -2, 12, 170, 1285, 881, -70, 7, -292, 1735, 119, -84, 69, 1563, 6, nil, 53, -284, -35, 40, -117, -319, -280, -599, 2040, -4, 15, nil, -21, 43, 906, -375, -96, -22, -24, nil, nil, 2, 6, -341, -10, 143, 29, -227, 7, 0, -422, -120, 8, -292, -32, nil, -243, -497, nil, nil, nil, nil, nil, nil, 58, -5, 74, nil, -279, -624, -464, -335, 100, -310, -3, -413, 85, -97, 78, -214, 27, -556, 26, -551, -253, -652, 109, -475, -20, -460, -665, 116, -290, -63, -292, -597, -432, -520, nil, -159, -498, nil, nil, 17, -427, 23, -421, -515, -719, -366, -480, -587, nil, nil, 118, 73, 72, 157, 22, -104, 156, -363, -177, -174, 98, -419, -443, nil, -544, -640, -530, -410, -538, -679, nil, nil, -21, -383 ] racc_goto_default = [ nil, nil, 447, nil, nil, nil, 756, nil, 40, nil, 49, 58, 338, nil, nil, nil, 147, 85, 89, 148, 167, nil, 137, nil, 138, 33, nil, nil, 45, 50, 56, nil, 64, 554, nil, nil, nil, nil, nil, 105, 12, nil, 22, 25, 34, 140, 418, nil, 246, 370, 221, 251, 70, 75, nil, nil, 92, 335, nil, 332, 548, 549, 409, 588, nil, nil, 127, nil, nil, 61, 67, 71, 76, 80, 84, 88, nil, 126, 15, nil, nil, nil, nil, nil, nil, 486, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 306, nil, nil, 364, 130, nil, nil, nil, nil, nil, nil, nil, nil, nil, 44, 48, 53, nil, nil, nil, nil, 360, nil, nil, nil, nil, nil, nil, 616, 617, 620, 623, nil, 812, 611, 612, 613, 614, nil, 146 ] racc_reduce_table = [ 0, 0, :racc_error, 0, 136, :_reduce_1, 2, 133, :_reduce_2, 4, 135, :_reduce_3, 2, 134, :_reduce_4, 1, 140, :_reduce_none, 1, 140, :_reduce_none, 3, 140, :_reduce_7, 2, 140, :_reduce_8, 0, 158, :_reduce_9, 4, 143, :_reduce_10, 3, 143, :_reduce_11, 3, 143, :_reduce_12, 3, 143, :_reduce_13, 2, 143, :_reduce_14, 3, 143, :_reduce_15, 3, 143, :_reduce_16, 3, 143, :_reduce_17, 3, 143, :_reduce_18, 3, 143, :_reduce_19, 0, 159, :_reduce_20, 5, 143, :_reduce_21, 4, 143, :_reduce_22, 3, 143, :_reduce_23, 3, 143, :_reduce_24, 3, 143, :_reduce_25, 6, 143, :_reduce_26, 5, 143, :_reduce_27, 5, 143, :_reduce_28, 5, 143, :_reduce_29, 3, 143, :_reduce_30, 3, 143, :_reduce_31, 3, 143, :_reduce_32, 3, 143, :_reduce_33, 1, 143, :_reduce_none, 1, 157, :_reduce_none, 3, 157, :_reduce_36, 3, 157, :_reduce_37, 2, 157, :_reduce_38, 2, 157, :_reduce_39, 1, 157, :_reduce_none, 1, 147, :_reduce_41, 1, 149, :_reduce_none, 1, 149, :_reduce_none, 2, 149, :_reduce_44, 2, 149, :_reduce_45, 2, 149, :_reduce_46, 1, 162, :_reduce_none, 4, 162, :_reduce_48, 4, 162, :_reduce_49, 0, 169, :_reduce_50, 0, 170, :_reduce_51, 6, 167, :_reduce_52, 2, 161, :_reduce_53, 3, 161, :_reduce_54, 4, 161, :_reduce_55, 5, 161, :_reduce_56, 4, 161, :_reduce_57, 5, 161, :_reduce_58, 2, 161, :_reduce_59, 2, 161, :_reduce_60, 1, 150, :_reduce_none, 3, 150, :_reduce_62, 1, 173, :_reduce_none, 3, 173, :_reduce_64, 1, 172, :_reduce_65, 2, 172, :_reduce_66, 3, 172, :_reduce_67, 2, 172, :_reduce_68, 2, 172, :_reduce_69, 1, 172, :_reduce_70, 1, 175, :_reduce_none, 3, 175, :_reduce_72, 2, 174, :_reduce_73, 3, 174, :_reduce_74, 1, 176, :_reduce_75, 4, 176, :_reduce_76, 3, 176, :_reduce_77, 3, 176, :_reduce_78, 3, 176, :_reduce_79, 3, 176, :_reduce_80, 2, 176, :_reduce_81, 1, 176, :_reduce_82, 1, 148, :_reduce_83, 4, 148, :_reduce_84, 3, 148, :_reduce_85, 3, 148, :_reduce_86, 3, 148, :_reduce_87, 3, 148, :_reduce_88, 2, 148, :_reduce_89, 1, 148, :_reduce_90, 1, 178, :_reduce_91, 1, 178, :_reduce_none, 2, 179, :_reduce_93, 1, 179, :_reduce_94, 3, 179, :_reduce_95, 1, 180, :_reduce_none, 1, 180, :_reduce_none, 1, 180, :_reduce_none, 1, 180, :_reduce_99, 1, 180, :_reduce_100, 1, 183, :_reduce_none, 1, 183, :_reduce_none, 1, 145, :_reduce_103, 1, 145, :_reduce_none, 1, 146, :_reduce_105, 0, 186, :_reduce_106, 4, 146, :_reduce_107, 1, 181, :_reduce_none, 1, 181, :_reduce_none, 1, 181, :_reduce_none, 1, 181, :_reduce_none, 1, 181, :_reduce_none, 1, 181, :_reduce_none, 1, 181, :_reduce_none, 1, 181, :_reduce_none, 1, 181, :_reduce_none, 1, 181, :_reduce_none, 1, 181, :_reduce_none, 1, 181, :_reduce_none, 1, 181, :_reduce_none, 1, 181, :_reduce_none, 1, 181, :_reduce_none, 1, 181, :_reduce_none, 1, 181, :_reduce_none, 1, 181, :_reduce_none, 1, 181, :_reduce_none, 1, 181, :_reduce_none, 1, 181, :_reduce_none, 1, 181, :_reduce_none, 1, 181, :_reduce_none, 1, 181, :_reduce_none, 1, 181, :_reduce_none, 1, 181, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 1, 182, :_reduce_none, 3, 160, :_reduce_174, 5, 160, :_reduce_175, 3, 160, :_reduce_176, 6, 160, :_reduce_177, 5, 160, :_reduce_178, 5, 160, :_reduce_179, 5, 160, :_reduce_180, 5, 160, :_reduce_181, 4, 160, :_reduce_182, 3, 160, :_reduce_183, 3, 160, :_reduce_184, 3, 160, :_reduce_185, 3, 160, :_reduce_186, 3, 160, :_reduce_187, 3, 160, :_reduce_188, 3, 160, :_reduce_189, 3, 160, :_reduce_190, 3, 160, :_reduce_191, 4, 160, :_reduce_192, 4, 160, :_reduce_193, 2, 160, :_reduce_194, 2, 160, :_reduce_195, 3, 160, :_reduce_196, 3, 160, :_reduce_197, 3, 160, :_reduce_198, 3, 160, :_reduce_199, 3, 160, :_reduce_200, 3, 160, :_reduce_201, 3, 160, :_reduce_202, 3, 160, :_reduce_203, 3, 160, :_reduce_204, 3, 160, :_reduce_205, 3, 160, :_reduce_206, 3, 160, :_reduce_207, 3, 160, :_reduce_208, 2, 160, :_reduce_209, 2, 160, :_reduce_210, 3, 160, :_reduce_211, 3, 160, :_reduce_212, 3, 160, :_reduce_213, 3, 160, :_reduce_214, 3, 160, :_reduce_215, 5, 160, :_reduce_216, 1, 160, :_reduce_none, 1, 156, :_reduce_218, 1, 153, :_reduce_none, 2, 153, :_reduce_220, 2, 153, :_reduce_221, 5, 153, :_reduce_222, 2, 153, :_reduce_223, 3, 153, :_reduce_224, 3, 192, :_reduce_225, 4, 192, :_reduce_226, 4, 192, :_reduce_227, 6, 192, :_reduce_228, 1, 193, :_reduce_none, 1, 193, :_reduce_none, 1, 163, :_reduce_231, 2, 163, :_reduce_232, 5, 163, :_reduce_233, 2, 163, :_reduce_234, 5, 163, :_reduce_235, 4, 163, :_reduce_236, 7, 163, :_reduce_237, 3, 163, :_reduce_238, 1, 163, :_reduce_none, 4, 196, :_reduce_240, 3, 196, :_reduce_241, 5, 196, :_reduce_242, 7, 196, :_reduce_243, 2, 196, :_reduce_244, 5, 196, :_reduce_245, 4, 196, :_reduce_246, 6, 196, :_reduce_247, 7, 196, :_reduce_248, 9, 196, :_reduce_249, 3, 196, :_reduce_250, 1, 196, :_reduce_none, 0, 198, :_reduce_252, 2, 166, :_reduce_253, 1, 197, :_reduce_none, 0, 199, :_reduce_255, 3, 197, :_reduce_256, 0, 200, :_reduce_257, 4, 197, :_reduce_258, 2, 195, :_reduce_259, 2, 194, :_reduce_260, 1, 194, :_reduce_none, 1, 189, :_reduce_262, 3, 189, :_reduce_263, 3, 155, :_reduce_264, 4, 155, :_reduce_265, 2, 155, :_reduce_266, 1, 188, :_reduce_none, 1, 188, :_reduce_none, 1, 188, :_reduce_none, 1, 188, :_reduce_none, 1, 188, :_reduce_none, 1, 188, :_reduce_none, 1, 188, :_reduce_none, 1, 188, :_reduce_none, 1, 188, :_reduce_275, 0, 221, :_reduce_276, 4, 188, :_reduce_277, 0, 222, :_reduce_278, 5, 188, :_reduce_279, 3, 188, :_reduce_280, 3, 188, :_reduce_281, 2, 188, :_reduce_282, 4, 188, :_reduce_283, 3, 188, :_reduce_284, 3, 188, :_reduce_285, 1, 188, :_reduce_286, 4, 188, :_reduce_287, 3, 188, :_reduce_288, 1, 188, :_reduce_289, 5, 188, :_reduce_290, 2, 188, :_reduce_291, 1, 188, :_reduce_none, 2, 188, :_reduce_293, 6, 188, :_reduce_294, 6, 188, :_reduce_295, 0, 223, :_reduce_296, 0, 224, :_reduce_297, 7, 188, :_reduce_298, 0, 225, :_reduce_299, 0, 226, :_reduce_300, 7, 188, :_reduce_301, 5, 188, :_reduce_302, 4, 188, :_reduce_303, 5, 188, :_reduce_304, 0, 227, :_reduce_305, 0, 228, :_reduce_306, 9, 188, :_reduce_307, 0, 229, :_reduce_308, 0, 230, :_reduce_309, 7, 188, :_reduce_310, 0, 231, :_reduce_311, 0, 232, :_reduce_312, 0, 233, :_reduce_313, 9, 188, :_reduce_314, 0, 234, :_reduce_315, 0, 235, :_reduce_316, 6, 188, :_reduce_317, 0, 236, :_reduce_318, 6, 188, :_reduce_319, 0, 237, :_reduce_320, 0, 238, :_reduce_321, 9, 188, :_reduce_322, 1, 188, :_reduce_323, 1, 188, :_reduce_324, 1, 188, :_reduce_325, 1, 188, :_reduce_326, 1, 152, :_reduce_327, 1, 211, :_reduce_none, 1, 211, :_reduce_none, 1, 211, :_reduce_none, 2, 211, :_reduce_none, 1, 213, :_reduce_none, 1, 213, :_reduce_none, 1, 213, :_reduce_none, 1, 212, :_reduce_none, 5, 212, :_reduce_336, 1, 138, :_reduce_none, 2, 138, :_reduce_338, 1, 215, :_reduce_none, 1, 215, :_reduce_340, 1, 239, :_reduce_341, 3, 239, :_reduce_342, 1, 240, :_reduce_343, 2, 240, :_reduce_344, 4, 240, :_reduce_345, 7, 240, :_reduce_346, 6, 240, :_reduce_347, 4, 240, :_reduce_348, 3, 240, :_reduce_349, 5, 240, :_reduce_350, 4, 240, :_reduce_351, 2, 240, :_reduce_352, 1, 240, :_reduce_353, 2, 240, :_reduce_354, 1, 168, :_reduce_none, 2, 168, :_reduce_356, 1, 168, :_reduce_357, 3, 168, :_reduce_358, 0, 242, :_reduce_359, 0, 243, :_reduce_360, 6, 241, :_reduce_361, 2, 164, :_reduce_362, 4, 164, :_reduce_363, 4, 164, :_reduce_364, 0, 245, :_reduce_365, 3, 210, :_reduce_366, 4, 210, :_reduce_367, 4, 210, :_reduce_368, 3, 210, :_reduce_369, 2, 210, :_reduce_370, 1, 210, :_reduce_371, 0, 246, :_reduce_372, 0, 247, :_reduce_373, 6, 209, :_reduce_374, 0, 248, :_reduce_375, 0, 249, :_reduce_376, 6, 209, :_reduce_377, 0, 252, :_reduce_378, 6, 214, :_reduce_379, 1, 250, :_reduce_none, 4, 250, :_reduce_381, 2, 250, :_reduce_382, 1, 251, :_reduce_none, 1, 251, :_reduce_none, 6, 137, :_reduce_385, 0, 137, :_reduce_386, 1, 253, :_reduce_387, 1, 253, :_reduce_none, 1, 253, :_reduce_none, 2, 254, :_reduce_390, 1, 254, :_reduce_none, 2, 139, :_reduce_392, 1, 139, :_reduce_none, 1, 201, :_reduce_394, 1, 201, :_reduce_395, 1, 201, :_reduce_none, 1, 202, :_reduce_397, 1, 256, :_reduce_none, 2, 256, :_reduce_399, 3, 257, :_reduce_400, 1, 257, :_reduce_401, 3, 203, :_reduce_402, 3, 204, :_reduce_403, 3, 205, :_reduce_404, 3, 205, :_reduce_405, 1, 260, :_reduce_406, 3, 260, :_reduce_407, 1, 261, :_reduce_none, 2, 261, :_reduce_409, 3, 206, :_reduce_410, 3, 206, :_reduce_411, 1, 263, :_reduce_412, 3, 263, :_reduce_413, 1, 258, :_reduce_414, 2, 258, :_reduce_415, 1, 259, :_reduce_416, 2, 259, :_reduce_417, 1, 262, :_reduce_418, 0, 265, :_reduce_419, 3, 262, :_reduce_420, 0, 266, :_reduce_421, 4, 262, :_reduce_422, 1, 264, :_reduce_423, 1, 264, :_reduce_424, 1, 264, :_reduce_425, 1, 264, :_reduce_none, 2, 184, :_reduce_427, 1, 184, :_reduce_428, 1, 267, :_reduce_none, 1, 267, :_reduce_none, 1, 267, :_reduce_none, 1, 267, :_reduce_none, 3, 185, :_reduce_433, 1, 255, :_reduce_none, 1, 255, :_reduce_none, 2, 255, :_reduce_436, 2, 255, :_reduce_437, 1, 177, :_reduce_none, 1, 177, :_reduce_none, 1, 177, :_reduce_none, 1, 177, :_reduce_none, 1, 177, :_reduce_none, 1, 177, :_reduce_443, 1, 177, :_reduce_444, 1, 177, :_reduce_445, 1, 177, :_reduce_446, 1, 177, :_reduce_447, 1, 177, :_reduce_448, 1, 207, :_reduce_449, 1, 151, :_reduce_450, 1, 154, :_reduce_451, 1, 154, :_reduce_452, 1, 216, :_reduce_453, 0, 268, :_reduce_454, 4, 216, :_reduce_455, 2, 216, :_reduce_456, 4, 218, :_reduce_457, 2, 218, :_reduce_458, 6, 269, :_reduce_459, 4, 269, :_reduce_460, 4, 269, :_reduce_461, 2, 269, :_reduce_462, 4, 269, :_reduce_463, 2, 269, :_reduce_464, 2, 269, :_reduce_465, 1, 269, :_reduce_466, 0, 269, :_reduce_467, 1, 275, :_reduce_468, 1, 275, :_reduce_469, 1, 275, :_reduce_470, 1, 275, :_reduce_471, 1, 275, :_reduce_472, 1, 270, :_reduce_473, 3, 270, :_reduce_474, 3, 276, :_reduce_475, 1, 271, :_reduce_476, 3, 271, :_reduce_477, 1, 277, :_reduce_none, 1, 277, :_reduce_none, 2, 272, :_reduce_480, 1, 272, :_reduce_481, 1, 278, :_reduce_none, 1, 278, :_reduce_none, 2, 274, :_reduce_484, 2, 273, :_reduce_485, 0, 273, :_reduce_486, 1, 219, :_reduce_none, 0, 279, :_reduce_488, 5, 219, :_reduce_489, 1, 208, :_reduce_490, 2, 208, :_reduce_491, 2, 208, :_reduce_492, 1, 191, :_reduce_none, 3, 191, :_reduce_494, 3, 280, :_reduce_495, 1, 171, :_reduce_none, 1, 171, :_reduce_none, 1, 171, :_reduce_none, 1, 165, :_reduce_none, 1, 165, :_reduce_none, 1, 165, :_reduce_none, 1, 165, :_reduce_none, 1, 244, :_reduce_none, 1, 244, :_reduce_none, 1, 244, :_reduce_none, 1, 220, :_reduce_none, 1, 220, :_reduce_none, 0, 141, :_reduce_none, 1, 141, :_reduce_none, 0, 187, :_reduce_none, 1, 187, :_reduce_none, 0, 190, :_reduce_none, 1, 190, :_reduce_none, 1, 190, :_reduce_none, 1, 217, :_reduce_515, 1, 217, :_reduce_none, 1, 144, :_reduce_none, 2, 144, :_reduce_518, 0, 142, :_reduce_519 ] racc_reduce_n = 520 racc_shift_n = 927 racc_token_table = { false => 0, :error => 1, :kCLASS => 2, :kMODULE => 3, :kDEF => 4, :kUNDEF => 5, :kBEGIN => 6, :kRESCUE => 7, :kENSURE => 8, :kEND => 9, :kIF => 10, :kUNLESS => 11, :kTHEN => 12, :kELSIF => 13, :kELSE => 14, :kCASE => 15, :kWHEN => 16, :kWHILE => 17, :kUNTIL => 18, :kFOR => 19, :kBREAK => 20, :kNEXT => 21, :kREDO => 22, :kRETRY => 23, :kIN => 24, :kDO => 25, :kDO_COND => 26, :kDO_BLOCK => 27, :kRETURN => 28, :kYIELD => 29, :kSUPER => 30, :kSELF => 31, :kNIL => 32, :kTRUE => 33, :kFALSE => 34, :kAND => 35, :kOR => 36, :kNOT => 37, :kIF_MOD => 38, :kUNLESS_MOD => 39, :kWHILE_MOD => 40, :kUNTIL_MOD => 41, :kRESCUE_MOD => 42, :kALIAS => 43, :kDEFINED => 44, :klBEGIN => 45, :klEND => 46, :k__LINE__ => 47, :k__FILE__ => 48, :tIDENTIFIER => 49, :tFID => 50, :tGVAR => 51, :tIVAR => 52, :tCONSTANT => 53, :tCVAR => 54, :tNTH_REF => 55, :tBACK_REF => 56, :tSTRING_CONTENT => 57, :tINTEGER => 58, :tFLOAT => 59, :tREGEXP_END => 60, :tUPLUS => 61, :tUMINUS => 62, :tUMINUS_NUM => 63, :tPOW => 64, :tCMP => 65, :tEQ => 66, :tEQQ => 67, :tNEQ => 68, :tGEQ => 69, :tLEQ => 70, :tANDOP => 71, :tOROP => 72, :tMATCH => 73, :tNMATCH => 74, :tDOT => 75, :tDOT2 => 76, :tDOT3 => 77, :tAREF => 78, :tASET => 79, :tLSHFT => 80, :tRSHFT => 81, :tCOLON2 => 82, :tCOLON3 => 83, :tOP_ASGN => 84, :tASSOC => 85, :tLPAREN => 86, :tLPAREN2 => 87, :tRPAREN => 88, :tLPAREN_ARG => 89, :tLBRACK => 90, :tLBRACK2 => 91, :tRBRACK => 92, :tLBRACE => 93, :tLBRACE_ARG => 94, :tSTAR => 95, :tSTAR2 => 96, :tAMPER => 97, :tAMPER2 => 98, :tTILDE => 99, :tPERCENT => 100, :tDIVIDE => 101, :tPLUS => 102, :tMINUS => 103, :tLT => 104, :tGT => 105, :tPIPE => 106, :tBANG => 107, :tCARET => 108, :tLCURLY => 109, :tRCURLY => 110, :tBACK_REF2 => 111, :tSYMBEG => 112, :tSTRING_BEG => 113, :tXSTRING_BEG => 114, :tREGEXP_BEG => 115, :tWORDS_BEG => 116, :tQWORDS_BEG => 117, :tSTRING_DBEG => 118, :tSTRING_DVAR => 119, :tSTRING_END => 120, :tSTRING => 121, :tSYMBOL => 122, :tNL => 123, :tEH => 124, :tCOLON => 125, :tCOMMA => 126, :tSPACE => 127, :tSEMI => 128, :tLAST_TOKEN => 129, :tEQL => 130, :tLOWEST => 131 } racc_nt_base = 132 racc_use_result_var = true Racc_arg = [ racc_action_table, racc_action_check, racc_action_default, racc_action_pointer, racc_goto_table, racc_goto_check, racc_goto_default, racc_goto_pointer, racc_nt_base, racc_reduce_table, racc_token_table, racc_shift_n, racc_reduce_n, racc_use_result_var ] Racc_token_to_s_table = [ "$end", "error", "kCLASS", "kMODULE", "kDEF", "kUNDEF", "kBEGIN", "kRESCUE", "kENSURE", "kEND", "kIF", "kUNLESS", "kTHEN", "kELSIF", "kELSE", "kCASE", "kWHEN", "kWHILE", "kUNTIL", "kFOR", "kBREAK", "kNEXT", "kREDO", "kRETRY", "kIN", "kDO", "kDO_COND", "kDO_BLOCK", "kRETURN", "kYIELD", "kSUPER", "kSELF", "kNIL", "kTRUE", "kFALSE", "kAND", "kOR", "kNOT", "kIF_MOD", "kUNLESS_MOD", "kWHILE_MOD", "kUNTIL_MOD", "kRESCUE_MOD", "kALIAS", "kDEFINED", "klBEGIN", "klEND", "k__LINE__", "k__FILE__", "tIDENTIFIER", "tFID", "tGVAR", "tIVAR", "tCONSTANT", "tCVAR", "tNTH_REF", "tBACK_REF", "tSTRING_CONTENT", "tINTEGER", "tFLOAT", "tREGEXP_END", "tUPLUS", "tUMINUS", "tUMINUS_NUM", "tPOW", "tCMP", "tEQ", "tEQQ", "tNEQ", "tGEQ", "tLEQ", "tANDOP", "tOROP", "tMATCH", "tNMATCH", "tDOT", "tDOT2", "tDOT3", "tAREF", "tASET", "tLSHFT", "tRSHFT", "tCOLON2", "tCOLON3", "tOP_ASGN", "tASSOC", "tLPAREN", "tLPAREN2", "tRPAREN", "tLPAREN_ARG", "tLBRACK", "tLBRACK2", "tRBRACK", "tLBRACE", "tLBRACE_ARG", "tSTAR", "tSTAR2", "tAMPER", "tAMPER2", "tTILDE", "tPERCENT", "tDIVIDE", "tPLUS", "tMINUS", "tLT", "tGT", "tPIPE", "tBANG", "tCARET", "tLCURLY", "tRCURLY", "tBACK_REF2", "tSYMBEG", "tSTRING_BEG", "tXSTRING_BEG", "tREGEXP_BEG", "tWORDS_BEG", "tQWORDS_BEG", "tSTRING_DBEG", "tSTRING_DVAR", "tSTRING_END", "tSTRING", "tSYMBOL", "tNL", "tEH", "tCOLON", "tCOMMA", "tSPACE", "tSEMI", "tLAST_TOKEN", "tEQL", "tLOWEST", "$start", "program", "compstmt", "bodystmt", "@1", "opt_rescue", "opt_else", "opt_ensure", "stmts", "opt_terms", "none", "stmt", "terms", "fitem", "undef_list", "expr_value", "lhs", "command_call", "mlhs", "var_lhs", "primary_value", "aref_args", "backref", "mrhs", "arg_value", "expr", "@2", "@3", "arg", "command", "block_command", "call_args", "block_call", "operation2", "command_args", "cmd_brace_block", "opt_block_var", "@4", "@5", "operation", "mlhs_basic", "mlhs_entry", "mlhs_head", "mlhs_item", "mlhs_node", "variable", "cname", "cpath", "fname", "op", "reswords", "fsym", "symbol", "dsym", "@6", "opt_nl", "primary", "args", "trailer", "assocs", "paren_args", "opt_paren_args", "opt_block_arg", "block_arg", "call_args2", "open_args", "@7", "@8", "@9", "literal", "strings", "xstring", "regexp", "words", "qwords", "var_ref", "assoc_list", "brace_block", "method_call", "then", "if_tail", "do", "case_body", "for_var", "superclass", "term", "f_arglist", "singleton", "dot_or_colon", "@10", "@11", "@12", "@13", "@14", "@15", "@16", "@17", "@18", "@19", "@20", "@21", "@22", "@23", "@24", "@25", "@26", "@27", "block_par", "block_var", "do_block", "@28", "@29", "operation3", "@30", "@31", "@32", "@33", "@34", "when_args", "cases", "@35", "exc_list", "exc_var", "numeric", "string", "string1", "string_contents", "xstring_contents", "word_list", "word", "string_content", "qword_list", "string_dvar", "@36", "@37", "sym", "@38", "f_args", "f_arg", "f_optarg", "f_rest_arg", "opt_f_block_arg", "f_block_arg", "f_norm_arg", "f_opt", "restarg_mark", "blkarg_mark", "@39", "assoc" ] Racc_debug_parser = false ##### State transition tables end ##### # reduce 0 omitted def _reduce_1(val, _values, result) self.lexer.lex_state = :expr_beg result end def _reduce_2(val, _values, result) result = val[1] result end def _reduce_3(val, _values, result) result = new_body val result end def _reduce_4(val, _values, result) result = new_compstmt val result end # reduce 5 omitted # reduce 6 omitted def _reduce_7(val, _values, result) result = block_append val[0], val[2] result end def _reduce_8(val, _values, result) result = val[1] result end def _reduce_9(val, _values, result) lexer.lex_state = :expr_fname result = self.lexer.lineno result end def _reduce_10(val, _values, result) result = s(:alias, val[1], val[3]).line(val[2]) result end def _reduce_11(val, _values, result) result = s(:valias, val[1].to_sym, val[2].to_sym) result end def _reduce_12(val, _values, result) result = s(:valias, val[1].to_sym, :"$#{val[2]}") result end def _reduce_13(val, _values, result) yyerror "can't make alias for the number variables" result end def _reduce_14(val, _values, result) result = val[1] result end def _reduce_15(val, _values, result) result = new_if val[2], val[0], nil result end def _reduce_16(val, _values, result) result = new_if val[2], nil, val[0] result end def _reduce_17(val, _values, result) result = new_while val[0], val[2], true result end def _reduce_18(val, _values, result) result = new_until val[0], val[2], true result end def _reduce_19(val, _values, result) result = s(:rescue, val[0], new_resbody(s(:array), val[2])) result end def _reduce_20(val, _values, result) if (in_def || in_single > 0) then yyerror "BEGIN in method" end self.env.extend result end def _reduce_21(val, _values, result) result = new_iter s(:preexe), nil, val[3] result end def _reduce_22(val, _values, result) if (in_def || in_single > 0) then yyerror "END in method; use at_exit" end result = new_iter s(:postexe), nil, val[2] result end def _reduce_23(val, _values, result) result = node_assign val[0], val[2] result end def _reduce_24(val, _values, result) result = new_masgn val[0], val[2], :wrap result end def _reduce_25(val, _values, result) result = new_op_asgn val result end def _reduce_26(val, _values, result) result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5]) result end def _reduce_27(val, _values, result) result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym) result end def _reduce_28(val, _values, result) result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym) result end def _reduce_29(val, _values, result) result = s(:op_asgn, val[0], val[4], val[2], val[3]) result end def _reduce_30(val, _values, result) backref_assign_error val[0] result end def _reduce_31(val, _values, result) result = node_assign val[0], s(:svalue, val[2]) result end def _reduce_32(val, _values, result) result = new_masgn val[0], val[2], :wrap result end def _reduce_33(val, _values, result) result = new_masgn val[0], val[2] result end # reduce 34 omitted # reduce 35 omitted def _reduce_36(val, _values, result) result = logop(:and, val[0], val[2]) result end def _reduce_37(val, _values, result) result = logop(:or, val[0], val[2]) result end def _reduce_38(val, _values, result) result = s(:not, val[1]) result end def _reduce_39(val, _values, result) result = s(:not, val[1]) result end # reduce 40 omitted def _reduce_41(val, _values, result) result = value_expr(val[0]) result end # reduce 42 omitted # reduce 43 omitted def _reduce_44(val, _values, result) line = val[0].last result = s(:return, ret_args(val[1])).line(line) result end def _reduce_45(val, _values, result) line = val[0].last result = s(:break, ret_args(val[1])).line(line) result end def _reduce_46(val, _values, result) line = val[0].last result = s(:next, ret_args(val[1])).line(line) result end # reduce 47 omitted def _reduce_48(val, _values, result) result = new_call val[0], val[2], val[3] result end def _reduce_49(val, _values, result) result = new_call val[0], val[2], val[3] result end def _reduce_50(val, _values, result) self.env.extend(:dynamic) result = self.lexer.lineno result end def _reduce_51(val, _values, result) result = self.env.dynamic.keys result end def _reduce_52(val, _values, result) result = new_iter nil, val[2], val[4] self.env.unextend result end def _reduce_53(val, _values, result) result = new_call nil, val[0].to_sym, val[1] result end def _reduce_54(val, _values, result) result = new_call nil, val[0].to_sym, val[1] if val[2] then block_dup_check result, val[2] result, operation = val[2], result result.insert 1, operation end result end def _reduce_55(val, _values, result) result = new_call val[0], val[2].to_sym, val[3] result end def _reduce_56(val, _values, result) result = new_call val[0], val[2].to_sym, val[3] raise "no2" if val[4] then block_dup_check result, val[4] val[2] << result result = val[2] end result end def _reduce_57(val, _values, result) result = new_call val[0], val[2].to_sym, val[3] result end def _reduce_58(val, _values, result) result = new_call val[0], val[2].to_sym, val[3] raise "no3" if val[4] then block_dup_check result, val[4] val[2] << result result = val[2] end result end def _reduce_59(val, _values, result) result = new_super val[1] result end def _reduce_60(val, _values, result) result = new_yield val[1] result end # reduce 61 omitted def _reduce_62(val, _values, result) result = val[1] result end # reduce 63 omitted def _reduce_64(val, _values, result) result = s(:masgn, s(:array, val[1])) result end def _reduce_65(val, _values, result) result = s(:masgn, val[0]) result end def _reduce_66(val, _values, result) result = s(:masgn, val[0] << val[1].compact) result end def _reduce_67(val, _values, result) result = s(:masgn, val[0] << s(:splat, val[2])) result end def _reduce_68(val, _values, result) result = s(:masgn, val[0] << s(:splat)) result end def _reduce_69(val, _values, result) result = s(:masgn, s(:array, s(:splat, val[1]))) result end def _reduce_70(val, _values, result) result = s(:masgn, s(:array, s(:splat))) result end # reduce 71 omitted def _reduce_72(val, _values, result) result = val[1] result end def _reduce_73(val, _values, result) result = s(:array, val[0]) result end def _reduce_74(val, _values, result) result = val[0] << val[1].compact result end def _reduce_75(val, _values, result) result = assignable val[0] result end def _reduce_76(val, _values, result) result = aryset val[0], val[2] result end def _reduce_77(val, _values, result) result = s(:attrasgn, val[0], :"#{val[2]}=") result end def _reduce_78(val, _values, result) result = s(:attrasgn, val[0], :"#{val[2]}=") result end def _reduce_79(val, _values, result) result = s(:attrasgn, val[0], :"#{val[2]}=") result end def _reduce_80(val, _values, result) if (in_def || in_single > 0) then yyerror "dynamic constant assignment" end result = s(:const, s(:colon2, val[0], val[2].to_sym), nil) result end def _reduce_81(val, _values, result) if (in_def || in_single > 0) then yyerror "dynamic constant assignment" end result = s(:const, nil, s(:colon3, val[1].to_sym)) result end def _reduce_82(val, _values, result) backref_assign_error val[0] result end def _reduce_83(val, _values, result) result = assignable val[0] result end def _reduce_84(val, _values, result) result = aryset val[0], val[2] result end def _reduce_85(val, _values, result) result = s(:attrasgn, val[0], :"#{val[2]}=") result end def _reduce_86(val, _values, result) result = s(:attrasgn, val[0], :"#{val[2]}=") result end def _reduce_87(val, _values, result) result = s(:attrasgn, val[0], :"#{val[2]}=") result end def _reduce_88(val, _values, result) if (in_def || in_single > 0) then yyerror "dynamic constant assignment" end result = s(:const, s(:colon2, val[0], val[2].to_sym)) result end def _reduce_89(val, _values, result) if (in_def || in_single > 0) then yyerror "dynamic constant assignment" end result = s(:const, s(:colon3, val[1].to_sym)) result end def _reduce_90(val, _values, result) backref_assign_error val[0] result end def _reduce_91(val, _values, result) yyerror "class/module name must be CONSTANT" result end # reduce 92 omitted def _reduce_93(val, _values, result) result = s(:colon3, val[1].to_sym) result end def _reduce_94(val, _values, result) result = val[0].to_sym result end def _reduce_95(val, _values, result) result = s(:colon2, val[0], val[2].to_sym) result end # reduce 96 omitted # reduce 97 omitted # reduce 98 omitted def _reduce_99(val, _values, result) lexer.lex_state = :expr_end result = val[0] result end def _reduce_100(val, _values, result) lexer.lex_state = :expr_end result = val[0] result end # reduce 101 omitted # reduce 102 omitted def _reduce_103(val, _values, result) result = s(:lit, val[0].to_sym) result end # reduce 104 omitted def _reduce_105(val, _values, result) result = new_undef val[0] result end def _reduce_106(val, _values, result) lexer.lex_state = :expr_fname result end def _reduce_107(val, _values, result) result = new_undef val[0], val[3] result end # reduce 108 omitted # reduce 109 omitted # reduce 110 omitted # reduce 111 omitted # reduce 112 omitted # reduce 113 omitted # reduce 114 omitted # reduce 115 omitted # reduce 116 omitted # reduce 117 omitted # reduce 118 omitted # reduce 119 omitted # reduce 120 omitted # reduce 121 omitted # reduce 122 omitted # reduce 123 omitted # reduce 124 omitted # reduce 125 omitted # reduce 126 omitted # reduce 127 omitted # reduce 128 omitted # reduce 129 omitted # reduce 130 omitted # reduce 131 omitted # reduce 132 omitted # reduce 133 omitted # reduce 134 omitted # reduce 135 omitted # reduce 136 omitted # reduce 137 omitted # reduce 138 omitted # reduce 139 omitted # reduce 140 omitted # reduce 141 omitted # reduce 142 omitted # reduce 143 omitted # reduce 144 omitted # reduce 145 omitted # reduce 146 omitted # reduce 147 omitted # reduce 148 omitted # reduce 149 omitted # reduce 150 omitted # reduce 151 omitted # reduce 152 omitted # reduce 153 omitted # reduce 154 omitted # reduce 155 omitted # reduce 156 omitted # reduce 157 omitted # reduce 158 omitted # reduce 159 omitted # reduce 160 omitted # reduce 161 omitted # reduce 162 omitted # reduce 163 omitted # reduce 164 omitted # reduce 165 omitted # reduce 166 omitted # reduce 167 omitted # reduce 168 omitted # reduce 169 omitted # reduce 170 omitted # reduce 171 omitted # reduce 172 omitted # reduce 173 omitted def _reduce_174(val, _values, result) result = node_assign val[0], val[2] result end def _reduce_175(val, _values, result) result = node_assign val[0], s(:rescue, val[2], new_resbody(s(:array), val[4])) # result.line = val[0].line result end def _reduce_176(val, _values, result) result = new_op_asgn val result end def _reduce_177(val, _values, result) result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5]) val[2][0] = :arglist if val[2] result end def _reduce_178(val, _values, result) result = s(:op_asgn2, val[0], :"#{val[2]}=", val[3].to_sym, val[4]) result end def _reduce_179(val, _values, result) result = s(:op_asgn2, val[0], :"#{val[2]}=", val[3].to_sym, val[4]) result end def _reduce_180(val, _values, result) result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym) result end def _reduce_181(val, _values, result) yyerror "constant re-assignment" result end def _reduce_182(val, _values, result) yyerror "constant re-assignment" result end def _reduce_183(val, _values, result) backref_assign_error val[0] result end def _reduce_184(val, _values, result) v1, v2 = val[0], val[2] if v1.node_type == :lit and v2.node_type == :lit and Fixnum === v1.last and Fixnum === v2.last then result = s(:lit, (v1.last)..(v2.last)) else result = s(:dot2, v1, v2) end result end def _reduce_185(val, _values, result) v1, v2 = val[0], val[2] if v1.node_type == :lit and v2.node_type == :lit and Fixnum === v1.last and Fixnum === v2.last then result = s(:lit, (v1.last)...(v2.last)) else result = s(:dot3, v1, v2) end result end def _reduce_186(val, _values, result) result = new_call val[0], :+, argl(val[2]) result end def _reduce_187(val, _values, result) result = new_call val[0], :-, argl(val[2]) result end def _reduce_188(val, _values, result) result = new_call val[0], :*, argl(val[2]) result end def _reduce_189(val, _values, result) result = new_call val[0], :"/", argl(val[2]) result end def _reduce_190(val, _values, result) result = new_call val[0], :"%", argl(val[2]) result end def _reduce_191(val, _values, result) result = new_call val[0], :**, argl(val[2]) result end def _reduce_192(val, _values, result) result = new_call(new_call(s(:lit, val[1]), :"**", argl(val[3])), :"-@") result end def _reduce_193(val, _values, result) result = new_call(new_call(s(:lit, val[1]), :"**", argl(val[3])), :"-@") result end def _reduce_194(val, _values, result) if val[1][0] == :lit then result = val[1] else result = new_call val[1], :"+@" end result end def _reduce_195(val, _values, result) result = new_call val[1], :"-@" result end def _reduce_196(val, _values, result) result = new_call val[0], :"|", argl(val[2]) result end def _reduce_197(val, _values, result) result = new_call val[0], :"^", argl(val[2]) result end def _reduce_198(val, _values, result) result = new_call val[0], :"&", argl(val[2]) result end def _reduce_199(val, _values, result) result = new_call val[0], :"<=>", argl(val[2]) result end def _reduce_200(val, _values, result) result = new_call val[0], :">", argl(val[2]) result end def _reduce_201(val, _values, result) result = new_call val[0], :">=", argl(val[2]) result end def _reduce_202(val, _values, result) result = new_call val[0], :"<", argl(val[2]) result end def _reduce_203(val, _values, result) result = new_call val[0], :"<=", argl(val[2]) result end def _reduce_204(val, _values, result) result = new_call val[0], :"==", argl(val[2]) result end def _reduce_205(val, _values, result) result = new_call val[0], :"===", argl(val[2]) result end def _reduce_206(val, _values, result) val[0] = value_expr val[0] # TODO: port call_op and clean these val[2] = value_expr val[2] result = s(:not, new_call(val[0], :"==", argl(val[2]))) result end def _reduce_207(val, _values, result) result = get_match_node val[0], val[2] result end def _reduce_208(val, _values, result) result = s(:not, get_match_node(val[0], val[2])) result end def _reduce_209(val, _values, result) result = s(:not, val[1]) result end def _reduce_210(val, _values, result) val[2] = value_expr val[2] result = new_call val[1], :"~" result end def _reduce_211(val, _values, result) val[0] = value_expr val[0] val[2] = value_expr val[2] result = new_call val[0], :"\<\<", argl(val[2]) result end def _reduce_212(val, _values, result) val[0] = value_expr val[0] val[2] = value_expr val[2] result = new_call val[0], :">>", argl(val[2]) result end def _reduce_213(val, _values, result) result = logop(:and, val[0], val[2]) result end def _reduce_214(val, _values, result) result = logop(:or, val[0], val[2]) result end def _reduce_215(val, _values, result) result = s(:defined, val[2]) result end def _reduce_216(val, _values, result) lexer.tern.pop result = s(:if, val[0], val[2], val[4]) result end # reduce 217 omitted def _reduce_218(val, _values, result) result = value_expr(val[0]) result end # reduce 219 omitted def _reduce_220(val, _values, result) warning 'parenthesize argument(s) for future version' result = s(:array, val[0]) result end def _reduce_221(val, _values, result) result = val[0] result end def _reduce_222(val, _values, result) result = arg_concat val[0], val[3] result end def _reduce_223(val, _values, result) result = s(:array, s(:hash, *val[0].values)) result end def _reduce_224(val, _values, result) result = s(:array, s(:splat, val[1])) result end def _reduce_225(val, _values, result) result = val[1] result end def _reduce_226(val, _values, result) result = val[1] result end def _reduce_227(val, _values, result) warning "parenthesize argument(s) for future version" result = s(:array, val[1]) result end def _reduce_228(val, _values, result) warning "parenthesize argument(s) for future version" result = val[1].add val[3] result end # reduce 229 omitted # reduce 230 omitted def _reduce_231(val, _values, result) warning "parenthesize argument(s) for future version" result = s(:array, val[0]) result end def _reduce_232(val, _values, result) result = arg_blk_pass val[0], val[1] result end def _reduce_233(val, _values, result) result = arg_concat val[0], val[3] result = arg_blk_pass result, val[4] result end def _reduce_234(val, _values, result) result = s(:array, s(:hash, *val[0].values)) result = arg_blk_pass result, val[1] result end def _reduce_235(val, _values, result) result = arg_concat s(:array, s(:hash, *val[0].values)), val[3] result = arg_blk_pass result, val[4] result end def _reduce_236(val, _values, result) result = val[0] << s(:hash, *val[2].values) result = arg_blk_pass result, val[3] result end def _reduce_237(val, _values, result) val[0] << s(:hash, *val[2].values) result = arg_concat val[0], val[5] result = arg_blk_pass result, val[6] result end def _reduce_238(val, _values, result) result = arg_blk_pass s(:splat, val[1]), val[2] result end # reduce 239 omitted def _reduce_240(val, _values, result) args = list_prepend val[0], val[2] result = arg_blk_pass args, val[3] result end def _reduce_241(val, _values, result) result = arg_blk_pass val[0], val[2] result end def _reduce_242(val, _values, result) result = arg_concat s(:array, val[0]), val[3] result = arg_blk_pass result, val[4] result end def _reduce_243(val, _values, result) result = arg_concat s(:array, val[0], s(:hash, *val[2].values)), val[5] result = arg_blk_pass result, val[6] result end def _reduce_244(val, _values, result) result = s(:array, s(:hash, *val[0].values)) result = arg_blk_pass result, val[1] result end def _reduce_245(val, _values, result) result = s(:array, s(:hash, *val[0].values), val[3]) result = arg_blk_pass result, val[4] result end def _reduce_246(val, _values, result) result = s(:array, val[0], s(:hash, *val[2].values)) result = arg_blk_pass result, val[3] result end def _reduce_247(val, _values, result) result = s(:array, val[0]).add_all(val[2]).add(s(:hash, *val[4].values)) result = arg_blk_pass result, val[5] result end def _reduce_248(val, _values, result) result = arg_concat s(:array, val[0]).add(s(:hash, *val[2].values)), val[5] result = arg_blk_pass result, val[6] result end def _reduce_249(val, _values, result) result = arg_concat s(:array, val[0]).add_all(val[2]).add(s(:hash, *val[4].values)), val[7] result = arg_blk_pass result, val[8] result end def _reduce_250(val, _values, result) result = arg_blk_pass s(:splat, val[1]), val[2] result end # reduce 251 omitted def _reduce_252(val, _values, result) result = lexer.cmdarg.stack.dup lexer.cmdarg.push true result end def _reduce_253(val, _values, result) lexer.cmdarg.stack.replace val[0] result = val[1] result end # reduce 254 omitted def _reduce_255(val, _values, result) lexer.lex_state = :expr_endarg result end def _reduce_256(val, _values, result) warning "don't put space before argument parentheses" result = nil result end def _reduce_257(val, _values, result) lexer.lex_state = :expr_endarg result end def _reduce_258(val, _values, result) warning "don't put space before argument parentheses" result = val[1] result end def _reduce_259(val, _values, result) result = s(:block_pass, val[1]) result end def _reduce_260(val, _values, result) result = val[1] result end # reduce 261 omitted def _reduce_262(val, _values, result) result = s(:array, val[0]) result end def _reduce_263(val, _values, result) result = list_append val[0], val[2] result end def _reduce_264(val, _values, result) result = val[0] << val[2] result end def _reduce_265(val, _values, result) result = arg_concat val[0], val[3] result end def _reduce_266(val, _values, result) result = s(:splat, val[1]) result end # reduce 267 omitted # reduce 268 omitted # reduce 269 omitted # reduce 270 omitted # reduce 271 omitted # reduce 272 omitted # reduce 273 omitted # reduce 274 omitted def _reduce_275(val, _values, result) result = new_call nil, val[0].to_sym result end def _reduce_276(val, _values, result) result = self.lexer.lineno result end def _reduce_277(val, _values, result) unless val[2] then result = s(:nil) else result = s(:begin, val[2]) end result.line = val[1] result end def _reduce_278(val, _values, result) lexer.lex_state = :expr_endarg result end def _reduce_279(val, _values, result) warning "(...) interpreted as grouped expression" result = val[1] result end def _reduce_280(val, _values, result) result = val[1] || s(:nil) result.paren = true result end def _reduce_281(val, _values, result) result = s(:colon2, val[0], val[2].to_sym) result end def _reduce_282(val, _values, result) result = s(:colon3, val[1].to_sym) result end def _reduce_283(val, _values, result) result = new_aref val result end def _reduce_284(val, _values, result) result = val[1] || s(:array) result end def _reduce_285(val, _values, result) result = s(:hash, *val[1].values) result end def _reduce_286(val, _values, result) result = s(:return) result end def _reduce_287(val, _values, result) result = new_yield val[2] result end def _reduce_288(val, _values, result) result = new_yield result end def _reduce_289(val, _values, result) result = new_yield result end def _reduce_290(val, _values, result) result = s(:defined, val[3]) result end def _reduce_291(val, _values, result) oper, iter = val[0], val[1] call = new_call(nil, oper.to_sym) iter.insert 1, call result = iter call.line = iter.line result end # reduce 292 omitted def _reduce_293(val, _values, result) call, iter = val[0], val[1] block_dup_check call, iter iter.insert 1, call result = iter result end def _reduce_294(val, _values, result) result = new_if val[1], val[3], val[4] result end def _reduce_295(val, _values, result) result = new_if val[1], val[4], val[3] result end def _reduce_296(val, _values, result) lexer.cond.push true result end def _reduce_297(val, _values, result) lexer.cond.pop result end def _reduce_298(val, _values, result) result = new_while val[5], val[2], true result end def _reduce_299(val, _values, result) lexer.cond.push true result end def _reduce_300(val, _values, result) lexer.cond.pop result end def _reduce_301(val, _values, result) result = new_until val[5], val[2], true result end def _reduce_302(val, _values, result) result = new_case val[1], val[3] result end def _reduce_303(val, _values, result) result = new_case nil, val[2] result end def _reduce_304(val, _values, result) result = new_case nil, val[3] result end def _reduce_305(val, _values, result) lexer.cond.push true result end def _reduce_306(val, _values, result) lexer.cond.pop result end def _reduce_307(val, _values, result) result = new_for val[4], val[1], val[7] result end def _reduce_308(val, _values, result) result = self.lexer.lineno result end def _reduce_309(val, _values, result) self.comments.push self.lexer.comments if (in_def || in_single > 0) then yyerror "class definition in method body" end self.env.extend result end def _reduce_310(val, _values, result) result = new_class val self.env.unextend self.lexer.comments # we don't care about comments in the body result end def _reduce_311(val, _values, result) result = self.lexer.lineno result end def _reduce_312(val, _values, result) result = in_def self.in_def = false result end def _reduce_313(val, _values, result) result = in_single self.in_single = 0 self.env.extend result end def _reduce_314(val, _values, result) result = new_sclass val self.env.unextend self.lexer.comments # we don't care about comments in the body result end def _reduce_315(val, _values, result) result = self.lexer.lineno result end def _reduce_316(val, _values, result) self.comments.push self.lexer.comments yyerror "module definition in method body" if in_def or in_single > 0 self.env.extend result end def _reduce_317(val, _values, result) result = new_module val self.env.unextend self.lexer.comments # we don't care about comments in the body result end def _reduce_318(val, _values, result) result = lexer.lineno, self.in_def self.comments.push self.lexer.comments self.in_def = true self.env.extend result end def _reduce_319(val, _values, result) line, in_def = val[2] result = new_defn val result[2].line line self.env.unextend self.in_def = in_def self.lexer.comments # we don't care about comments in the body result end def _reduce_320(val, _values, result) self.comments.push self.lexer.comments lexer.lex_state = :expr_fname result end def _reduce_321(val, _values, result) self.in_single += 1 self.env.extend lexer.lex_state = :expr_end # force for args result end def _reduce_322(val, _values, result) result = new_defs val self.env.unextend self.in_single -= 1 self.lexer.comments # we don't care about comments in the body result end def _reduce_323(val, _values, result) result = s(:break) result end def _reduce_324(val, _values, result) result = s(:next) result end def _reduce_325(val, _values, result) result = s(:redo) result end def _reduce_326(val, _values, result) result = s(:retry) result end def _reduce_327(val, _values, result) result = value_expr(val[0]) result end # reduce 328 omitted # reduce 329 omitted # reduce 330 omitted # reduce 331 omitted # reduce 332 omitted # reduce 333 omitted # reduce 334 omitted # reduce 335 omitted def _reduce_336(val, _values, result) result = s(:if, val[1], val[3], val[4]) result end # reduce 337 omitted def _reduce_338(val, _values, result) result = val[1] result end # reduce 339 omitted def _reduce_340(val, _values, result) val[0].delete_at 1 if val[0][1].nil? # HACK result end def _reduce_341(val, _values, result) result = s(:array, clean_mlhs(val[0])) result end def _reduce_342(val, _values, result) result = list_append val[0], clean_mlhs(val[2]) result end def _reduce_343(val, _values, result) result = block_var18 val[0], nil, nil result end def _reduce_344(val, _values, result) result = block_var18 val[0], nil, nil result end def _reduce_345(val, _values, result) result = block_var18 val[0], nil, val[3] result end def _reduce_346(val, _values, result) result = block_var18 val[0], val[3], val[6] result end def _reduce_347(val, _values, result) result = block_var18 val[0], s(:splat), val[5] result end def _reduce_348(val, _values, result) result = block_var18 val[0], val[3], nil result end def _reduce_349(val, _values, result) result = block_var18 val[0], s(:splat), nil result end def _reduce_350(val, _values, result) result = block_var18 nil, val[1], val[4] result end def _reduce_351(val, _values, result) result = block_var18 nil, s(:splat), val[3] result end def _reduce_352(val, _values, result) result = block_var18 nil, val[1], nil result end def _reduce_353(val, _values, result) result = block_var18 nil, s(:splat), nil result end def _reduce_354(val, _values, result) result = block_var18 nil, nil, val[1] result end # reduce 355 omitted def _reduce_356(val, _values, result) result = 0 self.lexer.command_start = true result end def _reduce_357(val, _values, result) result = 0 self.lexer.command_start = true result end def _reduce_358(val, _values, result) result = val[1] self.lexer.command_start = true result end def _reduce_359(val, _values, result) self.env.extend :dynamic result = self.lexer.lineno result end def _reduce_360(val, _values, result) result = self.env.dynamic.keys result end def _reduce_361(val, _values, result) vars = val[2] body = val[4] result = new_iter nil, vars, body result.line = val[1] self.env.unextend result end def _reduce_362(val, _values, result) block_dup_check val[0], val[1] result = val[1] result.insert 1, val[0] result end def _reduce_363(val, _values, result) result = new_call val[0], val[2], val[3] result end def _reduce_364(val, _values, result) result = new_call val[0], val[2], val[3] result end def _reduce_365(val, _values, result) result = self.lexer.lineno result end def _reduce_366(val, _values, result) result = new_call nil, val[0].to_sym, val[2] result end def _reduce_367(val, _values, result) result = new_call val[0], val[2].to_sym, val[3] result end def _reduce_368(val, _values, result) result = new_call val[0], val[2].to_sym, val[3] result end def _reduce_369(val, _values, result) result = new_call val[0], val[2].to_sym result end def _reduce_370(val, _values, result) result = new_super val[1] result end def _reduce_371(val, _values, result) result = s(:zsuper) result end def _reduce_372(val, _values, result) self.env.extend :dynamic result = self.lexer.lineno result end def _reduce_373(val, _values, result) result = self.env.dynamic.keys result end def _reduce_374(val, _values, result) # REFACTOR args = val[2] body = val[4] result = new_iter nil, args, body self.env.unextend result.line = val[1] result end def _reduce_375(val, _values, result) self.env.extend :dynamic result = self.lexer.lineno result end def _reduce_376(val, _values, result) result = self.env.dynamic.keys result end def _reduce_377(val, _values, result) args = val[2] body = val[4] result = new_iter nil, args, body self.env.unextend result.line = val[1] result end def _reduce_378(val, _values, result) result = self.lexer.lineno result end def _reduce_379(val, _values, result) result = new_when(val[2], val[4]) result.line = val[1] result << val[5] if val[5] result end # reduce 380 omitted def _reduce_381(val, _values, result) result = list_append val[0], s(:splat, val[3]) result end def _reduce_382(val, _values, result) result = s(:array, s(:splat, val[1])) result end # reduce 383 omitted # reduce 384 omitted def _reduce_385(val, _values, result) klasses, var, body, rest = val[1], val[2], val[4], val[5] klasses ||= s(:array) klasses << node_assign(var, s(:gvar, :"$!")) if var result = new_resbody(klasses, body) result << rest if rest # UGH, rewritten above result end def _reduce_386(val, _values, result) result = nil result end def _reduce_387(val, _values, result) result = s(:array, val[0]) result end # reduce 388 omitted # reduce 389 omitted def _reduce_390(val, _values, result) result = val[1] result end # reduce 391 omitted def _reduce_392(val, _values, result) if (val[1] != nil) then result = val[1] else result = s(:nil) end result end # reduce 393 omitted def _reduce_394(val, _values, result) result = s(:lit, val[0]) result end def _reduce_395(val, _values, result) result = s(:lit, val[0]) result end # reduce 396 omitted def _reduce_397(val, _values, result) val[0] = s(:dstr, val[0].value) if val[0][0] == :evstr result = val[0] result end # reduce 398 omitted def _reduce_399(val, _values, result) result = literal_concat val[0], val[1] result end def _reduce_400(val, _values, result) result = val[1] result end def _reduce_401(val, _values, result) result = s(:str, val[0]) result end def _reduce_402(val, _values, result) result = new_xstring val[1] result end def _reduce_403(val, _values, result) result = new_regexp val result end def _reduce_404(val, _values, result) result = s(:array) result end def _reduce_405(val, _values, result) result = val[1] result end def _reduce_406(val, _values, result) result = s(:array) result end def _reduce_407(val, _values, result) word = val[1][0] == :evstr ? s(:dstr, "", val[1]) : val[1] result = val[0] << word result end # reduce 408 omitted def _reduce_409(val, _values, result) result = literal_concat val[0], val[1] result end def _reduce_410(val, _values, result) result = s(:array) result end def _reduce_411(val, _values, result) result = val[1] result end def _reduce_412(val, _values, result) result = s(:array) result end def _reduce_413(val, _values, result) result = val[0] << s(:str, val[1]) result end def _reduce_414(val, _values, result) result = s(:str, "") result end def _reduce_415(val, _values, result) result = literal_concat(val[0], val[1]) result end def _reduce_416(val, _values, result) result = nil result end def _reduce_417(val, _values, result) result = literal_concat(val[0], val[1]) result end def _reduce_418(val, _values, result) result = s(:str, val[0]) result end def _reduce_419(val, _values, result) result = lexer.lex_strterm lexer.lex_strterm = nil lexer.lex_state = :expr_beg result end def _reduce_420(val, _values, result) lexer.lex_strterm = val[1] result = s(:evstr, val[2]) result end def _reduce_421(val, _values, result) result = [lexer.lex_strterm, lexer.brace_nest, lexer.string_nest] lexer.lex_strterm = nil lexer.brace_nest = 0 lexer.string_nest = 0 lexer.cond.push false lexer.cmdarg.push false lexer.lex_state = :expr_beg result end def _reduce_422(val, _values, result) _, memo, stmt, _ = val lex_strterm, brace_nest, string_nest = memo lexer.lex_strterm = lex_strterm lexer.brace_nest = brace_nest lexer.string_nest = string_nest lexer.cond.lexpop lexer.cmdarg.lexpop case stmt when Sexp then case stmt[0] when :str, :dstr, :evstr then result = stmt else result = s(:evstr, stmt) end when nil then result = s(:evstr) else raise "unknown string body: #{stmt.inspect}" end result end def _reduce_423(val, _values, result) result = s(:gvar, val[0].to_sym) result end def _reduce_424(val, _values, result) result = s(:ivar, val[0].to_sym) result end def _reduce_425(val, _values, result) result = s(:cvar, val[0].to_sym) result end # reduce 426 omitted def _reduce_427(val, _values, result) lexer.lex_state = :expr_end result = val[1].to_sym result end def _reduce_428(val, _values, result) result = val[0].to_sym result end # reduce 429 omitted # reduce 430 omitted # reduce 431 omitted # reduce 432 omitted def _reduce_433(val, _values, result) lexer.lex_state = :expr_end result = val[1] yyerror "empty symbol literal" if result.nil? or result.empty? case result[0] when :dstr then result[0] = :dsym when :str then result = s(:lit, result.last.to_sym) else result = s(:dsym, "", result) end result end # reduce 434 omitted # reduce 435 omitted def _reduce_436(val, _values, result) result = -val[1] # TODO: pt_testcase result end def _reduce_437(val, _values, result) result = -val[1] # TODO: pt_testcase result end # reduce 438 omitted # reduce 439 omitted # reduce 440 omitted # reduce 441 omitted # reduce 442 omitted def _reduce_443(val, _values, result) result = s(:nil) result end def _reduce_444(val, _values, result) result = s(:self) result end def _reduce_445(val, _values, result) result = s(:true) result end def _reduce_446(val, _values, result) result = s(:false) result end def _reduce_447(val, _values, result) result = s(:str, self.file) result end def _reduce_448(val, _values, result) result = s(:lit, lexer.src.current_line) result end def _reduce_449(val, _values, result) var = val[0] result = Sexp === var ? var : self.gettable(var) result end def _reduce_450(val, _values, result) result = assignable val[0] result end def _reduce_451(val, _values, result) result = s(:nth_ref, val[0]) result end def _reduce_452(val, _values, result) result = s(:back_ref, val[0]) result end def _reduce_453(val, _values, result) result = nil result end def _reduce_454(val, _values, result) lexer.lex_state = :expr_beg result end def _reduce_455(val, _values, result) result = val[2] result end def _reduce_456(val, _values, result) yyerrok result = nil result end def _reduce_457(val, _values, result) result = val[1] lexer.lex_state = :expr_beg self.lexer.command_start = true result end def _reduce_458(val, _values, result) result = val[0] result end def _reduce_459(val, _values, result) result = args val result end def _reduce_460(val, _values, result) result = args val result end def _reduce_461(val, _values, result) result = args val result end def _reduce_462(val, _values, result) result = args val result end def _reduce_463(val, _values, result) result = args val result end def _reduce_464(val, _values, result) result = args val result end def _reduce_465(val, _values, result) result = args val result end def _reduce_466(val, _values, result) result = args val result end def _reduce_467(val, _values, result) result = args val result end def _reduce_468(val, _values, result) yyerror "formal argument cannot be a constant" result end def _reduce_469(val, _values, result) yyerror "formal argument cannot be an instance variable" result end def _reduce_470(val, _values, result) yyerror "formal argument cannot be a global variable" result end def _reduce_471(val, _values, result) yyerror "formal argument cannot be a class variable" result end def _reduce_472(val, _values, result) identifier = val[0].to_sym self.env[identifier] = :lvar result = val[0] result end def _reduce_473(val, _values, result) result = s(:args) result << val[0].to_sym result end def _reduce_474(val, _values, result) val[0] << val[2].to_sym result = val[0] result end def _reduce_475(val, _values, result) result = assignable val[0], val[2] # TODO: detect duplicate names result end def _reduce_476(val, _values, result) result = s(:block, val[0]) result end def _reduce_477(val, _values, result) result = block_append val[0], val[2] result end # reduce 478 omitted # reduce 479 omitted def _reduce_480(val, _values, result) # TODO: differs from parse.y - needs tests name = val[1].to_sym assignable name result = :"*#{name}" result end def _reduce_481(val, _values, result) name = :"*" self.env[name] = :lvar result = name result end # reduce 482 omitted # reduce 483 omitted def _reduce_484(val, _values, result) identifier = val[1].to_sym self.env[identifier] = :lvar result = s(:block_arg, identifier.to_sym) result end def _reduce_485(val, _values, result) result = val[1] result end def _reduce_486(val, _values, result) result = nil result end # reduce 487 omitted def _reduce_488(val, _values, result) lexer.lex_state = :expr_beg result end def _reduce_489(val, _values, result) result = val[2] yyerror "Can't define single method for literals." if result[0] == :lit result end def _reduce_490(val, _values, result) result = s(:array) result end def _reduce_491(val, _values, result) result = val[0] result end def _reduce_492(val, _values, result) size = val[0].size if (size % 2 != 1) then # != 1 because of leading :array yyerror "Odd number (#{size}) list for Hash. #{val[0].inspect}" end result = val[0] result end # reduce 493 omitted def _reduce_494(val, _values, result) list = val[0].dup more = val[2][1..-1] list.push(*more) unless more.empty? result = list result end def _reduce_495(val, _values, result) result = s(:array, val[0], val[2]) result end # reduce 496 omitted # reduce 497 omitted # reduce 498 omitted # reduce 499 omitted # reduce 500 omitted # reduce 501 omitted # reduce 502 omitted # reduce 503 omitted # reduce 504 omitted # reduce 505 omitted # reduce 506 omitted # reduce 507 omitted # reduce 508 omitted # reduce 509 omitted # reduce 510 omitted # reduce 511 omitted # reduce 512 omitted # reduce 513 omitted # reduce 514 omitted def _reduce_515(val, _values, result) yyerrok result end # reduce 516 omitted # reduce 517 omitted def _reduce_518(val, _values, result) yyerrok result end def _reduce_519(val, _values, result) result = nil result end def _reduce_none(val, _values, result) val[0] end end # class Ruby18Parser ruby_parser-3.2.2/lib/ruby18_parser.y0000444000004100000410000017653612250152360017565 0ustar www-datawww-data# -*- racc -*- class Ruby18Parser token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS kTHEN kELSIF kELSE kCASE kWHEN kWHILE kUNTIL kFOR kBREAK kNEXT kREDO kRETRY kIN kDO kDO_COND kDO_BLOCK kRETURN kYIELD kSUPER kSELF kNIL kTRUE kFALSE kAND kOR kNOT kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__ k__FILE__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT tCVAR tNTH_REF tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT tREGEXP_END tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ tGEQ tLEQ tANDOP tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF tASET tLSHFT tRSHFT tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN tLPAREN2 tRPAREN tLPAREN_ARG tLBRACK tLBRACK2 tRBRACK tLBRACE tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2 tTILDE tPERCENT tDIVIDE tPLUS tMINUS tLT tGT tPIPE tBANG tCARET tLCURLY tRCURLY tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG tWORDS_BEG tQWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END tSTRING tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAST_TOKEN prechigh right tBANG tTILDE tUPLUS right tPOW right tUMINUS_NUM tUMINUS left tSTAR2 tDIVIDE tPERCENT left tPLUS tMINUS left tLSHFT tRSHFT left tAMPER2 left tPIPE tCARET left tGT tGEQ tLT tLEQ nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH left tANDOP left tOROP nonassoc tDOT2 tDOT3 right tEH tCOLON left kRESCUE_MOD right tEQL tOP_ASGN nonassoc kDEFINED right kNOT left kOR kAND nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD nonassoc tLBRACE_ARG nonassoc tLOWEST preclow rule program: { self.lexer.lex_state = :expr_beg } compstmt { result = val[1] } bodystmt: compstmt opt_rescue opt_else opt_ensure { result = new_body val } compstmt: stmts opt_terms { result = new_compstmt val } stmts: none | stmt | stmts terms stmt { result = block_append val[0], val[2] } | error stmt { result = val[1] } stmt: kALIAS fitem { lexer.lex_state = :expr_fname result = self.lexer.lineno } fitem { result = s(:alias, val[1], val[3]).line(val[2]) } | kALIAS tGVAR tGVAR { result = s(:valias, val[1].to_sym, val[2].to_sym) } | kALIAS tGVAR tBACK_REF { result = s(:valias, val[1].to_sym, :"$#{val[2]}") } | kALIAS tGVAR tNTH_REF { yyerror "can't make alias for the number variables" } | kUNDEF undef_list { result = val[1] } | stmt kIF_MOD expr_value { result = new_if val[2], val[0], nil } | stmt kUNLESS_MOD expr_value { result = new_if val[2], nil, val[0] } | stmt kWHILE_MOD expr_value { result = new_while val[0], val[2], true } | stmt kUNTIL_MOD expr_value { result = new_until val[0], val[2], true } | stmt kRESCUE_MOD stmt { result = s(:rescue, val[0], new_resbody(s(:array), val[2])) } | klBEGIN { if (in_def || in_single > 0) then yyerror "BEGIN in method" end self.env.extend } tLCURLY compstmt tRCURLY { result = new_iter s(:preexe), nil, val[3] } | klEND tLCURLY compstmt tRCURLY { if (in_def || in_single > 0) then yyerror "END in method; use at_exit" end result = new_iter s(:postexe), nil, val[2] } | lhs tEQL command_call { result = node_assign val[0], val[2] } | mlhs tEQL command_call { result = new_masgn val[0], val[2], :wrap } | var_lhs tOP_ASGN command_call { result = new_op_asgn val } | primary_value tLBRACK2 aref_args tRBRACK tOP_ASGN command_call { result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5]) } | primary_value tDOT tIDENTIFIER tOP_ASGN command_call { result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym) } | primary_value tDOT tCONSTANT tOP_ASGN command_call { result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym) } | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call { result = s(:op_asgn, val[0], val[4], val[2], val[3]) } | backref tOP_ASGN command_call { backref_assign_error val[0] } | lhs tEQL mrhs { result = node_assign val[0], s(:svalue, val[2]) } | mlhs tEQL arg_value { result = new_masgn val[0], val[2], :wrap } | mlhs tEQL mrhs { result = new_masgn val[0], val[2] } | expr expr: command_call | expr kAND expr { result = logop(:and, val[0], val[2]) } | expr kOR expr { result = logop(:or, val[0], val[2]) } | kNOT expr { result = s(:not, val[1]) } | tBANG command_call { result = s(:not, val[1]) } | arg expr_value: expr { result = value_expr(val[0]) } command_call: command | block_command | kRETURN call_args { line = val[0].last result = s(:return, ret_args(val[1])).line(line) } | kBREAK call_args { line = val[0].last result = s(:break, ret_args(val[1])).line(line) } | kNEXT call_args { line = val[0].last result = s(:next, ret_args(val[1])).line(line) } block_command: block_call | block_call tDOT operation2 command_args { result = new_call val[0], val[2], val[3] } | block_call tCOLON2 operation2 command_args { result = new_call val[0], val[2], val[3] } cmd_brace_block: tLBRACE_ARG { self.env.extend(:dynamic) result = self.lexer.lineno } opt_block_var { result = self.env.dynamic.keys } compstmt tRCURLY { result = new_iter nil, val[2], val[4] self.env.unextend } command: operation command_args =tLOWEST { result = new_call nil, val[0].to_sym, val[1] } | operation command_args cmd_brace_block { result = new_call nil, val[0].to_sym, val[1] if val[2] then block_dup_check result, val[2] result, operation = val[2], result result.insert 1, operation end } | primary_value tDOT operation2 command_args =tLOWEST { result = new_call val[0], val[2].to_sym, val[3] } | primary_value tDOT operation2 command_args cmd_brace_block { result = new_call val[0], val[2].to_sym, val[3] raise "no2" if val[4] then block_dup_check result, val[4] val[2] << result result = val[2] end } | primary_value tCOLON2 operation2 command_args =tLOWEST { result = new_call val[0], val[2].to_sym, val[3] } | primary_value tCOLON2 operation2 command_args cmd_brace_block { result = new_call val[0], val[2].to_sym, val[3] raise "no3" if val[4] then block_dup_check result, val[4] val[2] << result result = val[2] end } | kSUPER command_args { result = new_super val[1] } | kYIELD command_args { result = new_yield val[1] } mlhs: mlhs_basic | tLPAREN mlhs_entry tRPAREN { result = val[1] } mlhs_entry: mlhs_basic | tLPAREN mlhs_entry tRPAREN { result = s(:masgn, s(:array, val[1])) } mlhs_basic: mlhs_head { result = s(:masgn, val[0]) } | mlhs_head mlhs_item { result = s(:masgn, val[0] << val[1].compact) } | mlhs_head tSTAR mlhs_node { result = s(:masgn, val[0] << s(:splat, val[2])) } | mlhs_head tSTAR { result = s(:masgn, val[0] << s(:splat)) } | tSTAR mlhs_node { result = s(:masgn, s(:array, s(:splat, val[1]))) } | tSTAR { result = s(:masgn, s(:array, s(:splat))) } mlhs_item: mlhs_node | tLPAREN mlhs_entry tRPAREN { result = val[1] } mlhs_head: mlhs_item tCOMMA { result = s(:array, val[0]) } | mlhs_head mlhs_item tCOMMA { result = val[0] << val[1].compact } mlhs_node: variable { result = assignable val[0] } | primary_value tLBRACK2 aref_args tRBRACK { result = aryset val[0], val[2] } | primary_value tDOT tIDENTIFIER { result = s(:attrasgn, val[0], :"#{val[2]}=") } | primary_value tCOLON2 tIDENTIFIER { result = s(:attrasgn, val[0], :"#{val[2]}=") } | primary_value tDOT tCONSTANT { result = s(:attrasgn, val[0], :"#{val[2]}=") } | primary_value tCOLON2 tCONSTANT { if (in_def || in_single > 0) then yyerror "dynamic constant assignment" end result = s(:const, s(:colon2, val[0], val[2].to_sym), nil) } | tCOLON3 tCONSTANT { if (in_def || in_single > 0) then yyerror "dynamic constant assignment" end result = s(:const, nil, s(:colon3, val[1].to_sym)) } | backref { backref_assign_error val[0] } lhs: variable { result = assignable val[0] } | primary_value tLBRACK2 aref_args tRBRACK { result = aryset val[0], val[2] } | primary_value tDOT tIDENTIFIER { result = s(:attrasgn, val[0], :"#{val[2]}=") } | primary_value tCOLON2 tIDENTIFIER { result = s(:attrasgn, val[0], :"#{val[2]}=") } | primary_value tDOT tCONSTANT { result = s(:attrasgn, val[0], :"#{val[2]}=") } | primary_value tCOLON2 tCONSTANT { if (in_def || in_single > 0) then yyerror "dynamic constant assignment" end result = s(:const, s(:colon2, val[0], val[2].to_sym)) } | tCOLON3 tCONSTANT { if (in_def || in_single > 0) then yyerror "dynamic constant assignment" end result = s(:const, s(:colon3, val[1].to_sym)) } | backref { backref_assign_error val[0] } cname: tIDENTIFIER { yyerror "class/module name must be CONSTANT" } | tCONSTANT cpath: tCOLON3 cname { result = s(:colon3, val[1].to_sym) } | cname { result = val[0].to_sym } | primary_value tCOLON2 cname { result = s(:colon2, val[0], val[2].to_sym) } fname: tIDENTIFIER | tCONSTANT | tFID | op { lexer.lex_state = :expr_end result = val[0] } | reswords { lexer.lex_state = :expr_end result = val[0] } fsym: fname | symbol fitem: fsym { result = s(:lit, val[0].to_sym) } | dsym undef_list: fitem { result = new_undef val[0] } | undef_list tCOMMA { lexer.lex_state = :expr_fname } fitem { result = new_undef val[0], val[3] } op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ | tMATCH | tGT | tGEQ | tLT | tLEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2 | tSTAR | tDIVIDE | tPERCENT | tPOW | tTILDE | tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2 reswords: k__LINE__ | k__FILE__ | klBEGIN | klEND | kALIAS | kAND | kBEGIN | kBREAK | kCASE | kCLASS | kDEF | kDEFINED | kDO | kELSE | kELSIF | kEND | kENSURE | kFALSE | kFOR | kIN | kMODULE | kNEXT | kNIL | kNOT | kOR | kREDO | kRESCUE | kRETRY | kRETURN | kSELF | kSUPER | kTHEN | kTRUE | kUNDEF | kWHEN | kYIELD | kIF | kUNLESS | kWHILE | kUNTIL arg: lhs tEQL arg { result = node_assign val[0], val[2] } | lhs tEQL arg kRESCUE_MOD arg { result = node_assign val[0], s(:rescue, val[2], new_resbody(s(:array), val[4])) # result.line = val[0].line } | var_lhs tOP_ASGN arg { result = new_op_asgn val } | primary_value tLBRACK2 aref_args tRBRACK tOP_ASGN arg { result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5]) val[2][0] = :arglist if val[2] } | primary_value tDOT tIDENTIFIER tOP_ASGN arg { result = s(:op_asgn2, val[0], :"#{val[2]}=", val[3].to_sym, val[4]) } | primary_value tDOT tCONSTANT tOP_ASGN arg { result = s(:op_asgn2, val[0], :"#{val[2]}=", val[3].to_sym, val[4]) } | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg { result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym) } | primary_value tCOLON2 tCONSTANT tOP_ASGN arg { yyerror "constant re-assignment" } | tCOLON3 tCONSTANT tOP_ASGN arg { yyerror "constant re-assignment" } | backref tOP_ASGN arg { backref_assign_error val[0] } | arg tDOT2 arg { v1, v2 = val[0], val[2] if v1.node_type == :lit and v2.node_type == :lit and Fixnum === v1.last and Fixnum === v2.last then result = s(:lit, (v1.last)..(v2.last)) else result = s(:dot2, v1, v2) end } | arg tDOT3 arg { v1, v2 = val[0], val[2] if v1.node_type == :lit and v2.node_type == :lit and Fixnum === v1.last and Fixnum === v2.last then result = s(:lit, (v1.last)...(v2.last)) else result = s(:dot3, v1, v2) end } | arg tPLUS arg { result = new_call val[0], :+, argl(val[2]) } | arg tMINUS arg { result = new_call val[0], :-, argl(val[2]) } | arg tSTAR2 arg { result = new_call val[0], :*, argl(val[2]) } | arg tDIVIDE arg { result = new_call val[0], :"/", argl(val[2]) } | arg tPERCENT arg { result = new_call val[0], :"%", argl(val[2]) } | arg tPOW arg { result = new_call val[0], :**, argl(val[2]) } | tUMINUS_NUM tINTEGER tPOW arg { result = new_call(new_call(s(:lit, val[1]), :"**", argl(val[3])), :"-@") } | tUMINUS_NUM tFLOAT tPOW arg { result = new_call(new_call(s(:lit, val[1]), :"**", argl(val[3])), :"-@") } | tUPLUS arg { if val[1][0] == :lit then result = val[1] else result = new_call val[1], :"+@" end } | tUMINUS arg { result = new_call val[1], :"-@" } | arg tPIPE arg { result = new_call val[0], :"|", argl(val[2]) } | arg tCARET arg { result = new_call val[0], :"^", argl(val[2]) } | arg tAMPER2 arg { result = new_call val[0], :"&", argl(val[2]) } | arg tCMP arg { result = new_call val[0], :"<=>", argl(val[2]) } | arg tGT arg { result = new_call val[0], :">", argl(val[2]) } | arg tGEQ arg { result = new_call val[0], :">=", argl(val[2]) } | arg tLT arg { result = new_call val[0], :"<", argl(val[2]) } | arg tLEQ arg { result = new_call val[0], :"<=", argl(val[2]) } | arg tEQ arg { result = new_call val[0], :"==", argl(val[2]) } | arg tEQQ arg { result = new_call val[0], :"===", argl(val[2]) } | arg tNEQ arg { val[0] = value_expr val[0] # TODO: port call_op and clean these val[2] = value_expr val[2] result = s(:not, new_call(val[0], :"==", argl(val[2]))) } | arg tMATCH arg { result = get_match_node val[0], val[2] } | arg tNMATCH arg { result = s(:not, get_match_node(val[0], val[2])) } | tBANG arg { result = s(:not, val[1]) } | tTILDE arg { val[2] = value_expr val[2] result = new_call val[1], :"~" } | arg tLSHFT arg { val[0] = value_expr val[0] val[2] = value_expr val[2] result = new_call val[0], :"\<\<", argl(val[2]) } | arg tRSHFT arg { val[0] = value_expr val[0] val[2] = value_expr val[2] result = new_call val[0], :">>", argl(val[2]) } | arg tANDOP arg { result = logop(:and, val[0], val[2]) } | arg tOROP arg { result = logop(:or, val[0], val[2]) } | kDEFINED opt_nl arg { result = s(:defined, val[2]) } | arg tEH arg tCOLON arg { lexer.tern.pop result = s(:if, val[0], val[2], val[4]) } | primary arg_value: arg { result = value_expr(val[0]) } aref_args: none | command opt_nl { warning 'parenthesize argument(s) for future version' result = s(:array, val[0]) } | args trailer { result = val[0] } | args tCOMMA tSTAR arg opt_nl { result = arg_concat val[0], val[3] } | assocs trailer { result = s(:array, s(:hash, *val[0].values)) } | tSTAR arg opt_nl { result = s(:array, s(:splat, val[1])) } paren_args: tLPAREN2 none tRPAREN { result = val[1] } | tLPAREN2 call_args opt_nl tRPAREN { result = val[1] } | tLPAREN2 block_call opt_nl tRPAREN { warning "parenthesize argument(s) for future version" result = s(:array, val[1]) } | tLPAREN2 args tCOMMA block_call opt_nl tRPAREN { warning "parenthesize argument(s) for future version" result = val[1].add val[3] } opt_paren_args: none | paren_args call_args: command { warning "parenthesize argument(s) for future version" result = s(:array, val[0]) } | args opt_block_arg { result = arg_blk_pass val[0], val[1] } | args tCOMMA tSTAR arg_value opt_block_arg { result = arg_concat val[0], val[3] result = arg_blk_pass result, val[4] } | assocs opt_block_arg { result = s(:array, s(:hash, *val[0].values)) result = arg_blk_pass result, val[1] } | assocs tCOMMA tSTAR arg_value opt_block_arg { result = arg_concat s(:array, s(:hash, *val[0].values)), val[3] result = arg_blk_pass result, val[4] } | args tCOMMA assocs opt_block_arg { result = val[0] << s(:hash, *val[2].values) result = arg_blk_pass result, val[3] } | args tCOMMA assocs tCOMMA tSTAR arg opt_block_arg { val[0] << s(:hash, *val[2].values) result = arg_concat val[0], val[5] result = arg_blk_pass result, val[6] } | tSTAR arg_value opt_block_arg { result = arg_blk_pass s(:splat, val[1]), val[2] } | block_arg call_args2: arg_value tCOMMA args opt_block_arg { args = list_prepend val[0], val[2] result = arg_blk_pass args, val[3] } | arg_value tCOMMA block_arg { result = arg_blk_pass val[0], val[2] } | arg_value tCOMMA tSTAR arg_value opt_block_arg { result = arg_concat s(:array, val[0]), val[3] result = arg_blk_pass result, val[4] } | arg_value tCOMMA args tCOMMA tSTAR arg_value opt_block_arg { result = arg_concat s(:array, val[0], s(:hash, *val[2].values)), val[5] result = arg_blk_pass result, val[6] } | assocs opt_block_arg { result = s(:array, s(:hash, *val[0].values)) result = arg_blk_pass result, val[1] } | assocs tCOMMA tSTAR arg_value opt_block_arg { result = s(:array, s(:hash, *val[0].values), val[3]) result = arg_blk_pass result, val[4] } | arg_value tCOMMA assocs opt_block_arg { result = s(:array, val[0], s(:hash, *val[2].values)) result = arg_blk_pass result, val[3] } | arg_value tCOMMA args tCOMMA assocs opt_block_arg { result = s(:array, val[0]).add_all(val[2]).add(s(:hash, *val[4].values)) result = arg_blk_pass result, val[5] } | arg_value tCOMMA assocs tCOMMA tSTAR arg_value opt_block_arg { result = arg_concat s(:array, val[0]).add(s(:hash, *val[2].values)), val[5] result = arg_blk_pass result, val[6] } | arg_value tCOMMA args tCOMMA assocs tCOMMA tSTAR arg_value opt_block_arg { result = arg_concat s(:array, val[0]).add_all(val[2]).add(s(:hash, *val[4].values)), val[7] result = arg_blk_pass result, val[8] } | tSTAR arg_value opt_block_arg { result = arg_blk_pass s(:splat, val[1]), val[2] } | block_arg command_args: { result = lexer.cmdarg.stack.dup lexer.cmdarg.push true } open_args { lexer.cmdarg.stack.replace val[0] result = val[1] } open_args: call_args | tLPAREN_ARG { lexer.lex_state = :expr_endarg } tRPAREN { warning "don't put space before argument parentheses" result = nil } | tLPAREN_ARG call_args2 { lexer.lex_state = :expr_endarg } tRPAREN { warning "don't put space before argument parentheses" result = val[1] } block_arg: tAMPER arg_value { result = s(:block_pass, val[1]) } opt_block_arg: tCOMMA block_arg { result = val[1] } | none args: arg_value { result = s(:array, val[0]) } | args tCOMMA arg_value { result = list_append val[0], val[2] } mrhs: args tCOMMA arg_value { result = val[0] << val[2] } | args tCOMMA tSTAR arg_value { result = arg_concat val[0], val[3] } | tSTAR arg_value { result = s(:splat, val[1]) } primary: literal | strings | xstring | regexp | words | qwords | var_ref | backref | tFID { result = new_call nil, val[0].to_sym } | kBEGIN { result = self.lexer.lineno } bodystmt kEND { unless val[2] then result = s(:nil) else result = s(:begin, val[2]) end result.line = val[1] } | tLPAREN_ARG expr { lexer.lex_state = :expr_endarg } opt_nl tRPAREN { warning "(...) interpreted as grouped expression" result = val[1] } | tLPAREN compstmt tRPAREN { result = val[1] || s(:nil) result.paren = true } | primary_value tCOLON2 tCONSTANT { result = s(:colon2, val[0], val[2].to_sym) } | tCOLON3 tCONSTANT { result = s(:colon3, val[1].to_sym) } | primary_value tLBRACK2 aref_args tRBRACK { result = new_aref val } | tLBRACK aref_args tRBRACK { result = val[1] || s(:array) } | tLBRACE assoc_list tRCURLY { result = s(:hash, *val[1].values) } | kRETURN { result = s(:return) } | kYIELD tLPAREN2 call_args tRPAREN { result = new_yield val[2] } | kYIELD tLPAREN2 tRPAREN { result = new_yield } | kYIELD { result = new_yield } | kDEFINED opt_nl tLPAREN2 expr tRPAREN { result = s(:defined, val[3]) } | operation brace_block { oper, iter = val[0], val[1] call = new_call(nil, oper.to_sym) iter.insert 1, call result = iter call.line = iter.line } | method_call | method_call brace_block { call, iter = val[0], val[1] block_dup_check call, iter iter.insert 1, call result = iter } | kIF expr_value then compstmt if_tail kEND { result = new_if val[1], val[3], val[4] } | kUNLESS expr_value then compstmt opt_else kEND { result = new_if val[1], val[4], val[3] } | kWHILE { lexer.cond.push true } expr_value do { lexer.cond.pop } compstmt kEND { result = new_while val[5], val[2], true } | kUNTIL { lexer.cond.push true } expr_value do { lexer.cond.pop } compstmt kEND { result = new_until val[5], val[2], true } | kCASE expr_value opt_terms case_body kEND { result = new_case val[1], val[3] } | kCASE opt_terms case_body kEND { result = new_case nil, val[2] } | kCASE opt_terms kELSE compstmt kEND # TODO: need a test { result = new_case nil, val[3] } | kFOR for_var kIN { lexer.cond.push true } expr_value do { lexer.cond.pop } compstmt kEND { result = new_for val[4], val[1], val[7] } | kCLASS { result = self.lexer.lineno } cpath superclass { self.comments.push self.lexer.comments if (in_def || in_single > 0) then yyerror "class definition in method body" end self.env.extend } bodystmt kEND { result = new_class val self.env.unextend self.lexer.comments # we don't care about comments in the body } | kCLASS tLSHFT { result = self.lexer.lineno } expr { result = in_def self.in_def = false } term { result = in_single self.in_single = 0 self.env.extend } bodystmt kEND { result = new_sclass val self.env.unextend self.lexer.comments # we don't care about comments in the body } | kMODULE { result = self.lexer.lineno } cpath { self.comments.push self.lexer.comments yyerror "module definition in method body" if in_def or in_single > 0 self.env.extend } bodystmt kEND { result = new_module val self.env.unextend self.lexer.comments # we don't care about comments in the body } | kDEF fname { result = lexer.lineno, self.in_def self.comments.push self.lexer.comments self.in_def = true self.env.extend } f_arglist bodystmt kEND { line, in_def = val[2] result = new_defn val result[2].line line self.env.unextend self.in_def = in_def self.lexer.comments # we don't care about comments in the body } | kDEF singleton dot_or_colon { self.comments.push self.lexer.comments lexer.lex_state = :expr_fname } fname { self.in_single += 1 self.env.extend lexer.lex_state = :expr_end # force for args } f_arglist bodystmt kEND { result = new_defs val self.env.unextend self.in_single -= 1 self.lexer.comments # we don't care about comments in the body } | kBREAK { result = s(:break) } | kNEXT { result = s(:next) } | kREDO { result = s(:redo) } | kRETRY { result = s(:retry) } primary_value: primary { result = value_expr(val[0]) } then: term | tCOLON | kTHEN | term kTHEN do: term | tCOLON | kDO_COND if_tail: opt_else | kELSIF expr_value then compstmt if_tail { result = s(:if, val[1], val[3], val[4]) } opt_else: none | kELSE compstmt { result = val[1] } for_var: lhs | mlhs { val[0].delete_at 1 if val[0][1].nil? # HACK } block_par: mlhs_item { result = s(:array, clean_mlhs(val[0])) } | block_par tCOMMA mlhs_item { result = list_append val[0], clean_mlhs(val[2]) } block_var: block_par { result = block_var18 val[0], nil, nil } | block_par tCOMMA { result = block_var18 val[0], nil, nil } | block_par tCOMMA tAMPER lhs { result = block_var18 val[0], nil, val[3] } | block_par tCOMMA tSTAR lhs tCOMMA tAMPER lhs { result = block_var18 val[0], val[3], val[6] } | block_par tCOMMA tSTAR tCOMMA tAMPER lhs { result = block_var18 val[0], s(:splat), val[5] } | block_par tCOMMA tSTAR lhs { result = block_var18 val[0], val[3], nil } | block_par tCOMMA tSTAR { result = block_var18 val[0], s(:splat), nil } | tSTAR lhs tCOMMA tAMPER lhs { result = block_var18 nil, val[1], val[4] } | tSTAR tCOMMA tAMPER lhs { result = block_var18 nil, s(:splat), val[3] } | tSTAR lhs { result = block_var18 nil, val[1], nil } | tSTAR { result = block_var18 nil, s(:splat), nil } | tAMPER lhs { result = block_var18 nil, nil, val[1] } ; opt_block_var: none | tPIPE tPIPE { result = 0 self.lexer.command_start = true } | tOROP { result = 0 self.lexer.command_start = true } | tPIPE block_var tPIPE { result = val[1] self.lexer.command_start = true } do_block: kDO_BLOCK { self.env.extend :dynamic result = self.lexer.lineno } opt_block_var { result = self.env.dynamic.keys } compstmt kEND { vars = val[2] body = val[4] result = new_iter nil, vars, body result.line = val[1] self.env.unextend } block_call: command do_block { block_dup_check val[0], val[1] result = val[1] result.insert 1, val[0] } | block_call tDOT operation2 opt_paren_args { result = new_call val[0], val[2], val[3] } | block_call tCOLON2 operation2 opt_paren_args { result = new_call val[0], val[2], val[3] } method_call: operation { result = self.lexer.lineno } paren_args { result = new_call nil, val[0].to_sym, val[2] } | primary_value tDOT operation2 opt_paren_args { result = new_call val[0], val[2].to_sym, val[3] } | primary_value tCOLON2 operation2 paren_args { result = new_call val[0], val[2].to_sym, val[3] } | primary_value tCOLON2 operation3 { result = new_call val[0], val[2].to_sym } | kSUPER paren_args { result = new_super val[1] } | kSUPER { result = s(:zsuper) } brace_block: tLCURLY { self.env.extend :dynamic result = self.lexer.lineno } opt_block_var { result = self.env.dynamic.keys } compstmt tRCURLY { # REFACTOR args = val[2] body = val[4] result = new_iter nil, args, body self.env.unextend result.line = val[1] } | kDO { self.env.extend :dynamic result = self.lexer.lineno } opt_block_var { result = self.env.dynamic.keys } compstmt kEND { args = val[2] body = val[4] result = new_iter nil, args, body self.env.unextend result.line = val[1] } case_body: kWHEN { result = self.lexer.lineno } when_args then compstmt cases { result = new_when(val[2], val[4]) result.line = val[1] result << val[5] if val[5] } when_args: args | args tCOMMA tSTAR arg_value { result = list_append val[0], s(:splat, val[3]) } | tSTAR arg_value { result = s(:array, s(:splat, val[1])) } cases: opt_else | case_body opt_rescue: kRESCUE exc_list exc_var then compstmt opt_rescue { klasses, var, body, rest = val[1], val[2], val[4], val[5] klasses ||= s(:array) klasses << node_assign(var, s(:gvar, :"$!")) if var result = new_resbody(klasses, body) result << rest if rest # UGH, rewritten above } | { result = nil } exc_list: arg_value { result = s(:array, val[0]) } | mrhs | none exc_var: tASSOC lhs { result = val[1] } | none opt_ensure: kENSURE compstmt { if (val[1] != nil) then result = val[1] else result = s(:nil) end } | none literal: numeric { result = s(:lit, val[0]) } | symbol { result = s(:lit, val[0]) } | dsym strings: string { val[0] = s(:dstr, val[0].value) if val[0][0] == :evstr result = val[0] } string: string1 | string string1 { result = literal_concat val[0], val[1] } string1: tSTRING_BEG string_contents tSTRING_END { result = val[1] } | tSTRING { result = s(:str, val[0]) } xstring: tXSTRING_BEG xstring_contents tSTRING_END { result = new_xstring val[1] } regexp: tREGEXP_BEG xstring_contents tREGEXP_END { result = new_regexp val } words: tWORDS_BEG tSPACE tSTRING_END { result = s(:array) } | tWORDS_BEG word_list tSTRING_END { result = val[1] } word_list: none { result = s(:array) } | word_list word tSPACE { word = val[1][0] == :evstr ? s(:dstr, "", val[1]) : val[1] result = val[0] << word } word: string_content | word string_content { result = literal_concat val[0], val[1] } qwords: tQWORDS_BEG tSPACE tSTRING_END { result = s(:array) } | tQWORDS_BEG qword_list tSTRING_END { result = val[1] } qword_list: none { result = s(:array) } | qword_list tSTRING_CONTENT tSPACE { result = val[0] << s(:str, val[1]) } string_contents: none { result = s(:str, "") } | string_contents string_content { result = literal_concat(val[0], val[1]) } xstring_contents: none { result = nil } | xstring_contents string_content { result = literal_concat(val[0], val[1]) } string_content: tSTRING_CONTENT { result = s(:str, val[0]) } | tSTRING_DVAR { result = lexer.lex_strterm lexer.lex_strterm = nil lexer.lex_state = :expr_beg } string_dvar { lexer.lex_strterm = val[1] result = s(:evstr, val[2]) } | tSTRING_DBEG { result = [lexer.lex_strterm, lexer.brace_nest, lexer.string_nest] lexer.lex_strterm = nil lexer.brace_nest = 0 lexer.string_nest = 0 lexer.cond.push false lexer.cmdarg.push false lexer.lex_state = :expr_beg } compstmt tRCURLY { _, memo, stmt, _ = val lex_strterm, brace_nest, string_nest = memo lexer.lex_strterm = lex_strterm lexer.brace_nest = brace_nest lexer.string_nest = string_nest lexer.cond.lexpop lexer.cmdarg.lexpop case stmt when Sexp then case stmt[0] when :str, :dstr, :evstr then result = stmt else result = s(:evstr, stmt) end when nil then result = s(:evstr) else raise "unknown string body: #{stmt.inspect}" end } string_dvar: tGVAR { result = s(:gvar, val[0].to_sym) } | tIVAR { result = s(:ivar, val[0].to_sym) } | tCVAR { result = s(:cvar, val[0].to_sym) } | backref symbol: tSYMBEG sym { lexer.lex_state = :expr_end result = val[1].to_sym } | tSYMBOL { result = val[0].to_sym } sym: fname | tIVAR | tGVAR | tCVAR dsym: tSYMBEG xstring_contents tSTRING_END { lexer.lex_state = :expr_end result = val[1] yyerror "empty symbol literal" if result.nil? or result.empty? case result[0] when :dstr then result[0] = :dsym when :str then result = s(:lit, result.last.to_sym) else result = s(:dsym, "", result) end } numeric: tINTEGER | tFLOAT | tUMINUS_NUM tINTEGER =tLOWEST { result = -val[1] # TODO: pt_testcase } | tUMINUS_NUM tFLOAT =tLOWEST { result = -val[1] # TODO: pt_testcase } variable: tIDENTIFIER | tIVAR | tGVAR | tCONSTANT | tCVAR | kNIL { result = s(:nil) } | kSELF { result = s(:self) } | kTRUE { result = s(:true) } | kFALSE { result = s(:false) } | k__FILE__ { result = s(:str, self.file) } | k__LINE__ { result = s(:lit, lexer.src.current_line) } var_ref: variable { var = val[0] result = Sexp === var ? var : self.gettable(var) } var_lhs: variable { result = assignable val[0] } backref: tNTH_REF { result = s(:nth_ref, val[0]) } | tBACK_REF { result = s(:back_ref, val[0]) } superclass: term { result = nil } | tLT { lexer.lex_state = :expr_beg } expr_value term { result = val[2] } | error term { yyerrok result = nil } f_arglist: tLPAREN2 f_args opt_nl tRPAREN { result = val[1] lexer.lex_state = :expr_beg self.lexer.command_start = true } | f_args term { result = val[0] } f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_f_block_arg { result = args val } | f_arg tCOMMA f_optarg opt_f_block_arg { result = args val } | f_arg tCOMMA f_rest_arg opt_f_block_arg { result = args val } | f_arg opt_f_block_arg { result = args val } | f_optarg tCOMMA f_rest_arg opt_f_block_arg { result = args val } | f_optarg opt_f_block_arg { result = args val } | f_rest_arg opt_f_block_arg { result = args val } | f_block_arg { result = args val } | { result = args val } f_norm_arg: tCONSTANT { yyerror "formal argument cannot be a constant" } | tIVAR { yyerror "formal argument cannot be an instance variable" } | tGVAR { yyerror "formal argument cannot be a global variable" } | tCVAR { yyerror "formal argument cannot be a class variable" } | tIDENTIFIER { identifier = val[0].to_sym self.env[identifier] = :lvar result = val[0] } f_arg: f_norm_arg { result = s(:args) result << val[0].to_sym } | f_arg tCOMMA f_norm_arg { val[0] << val[2].to_sym result = val[0] } f_opt: tIDENTIFIER tEQL arg_value { result = assignable val[0], val[2] # TODO: detect duplicate names } f_optarg: f_opt { result = s(:block, val[0]) } | f_optarg tCOMMA f_opt { result = block_append val[0], val[2] } restarg_mark: tSTAR2 | tSTAR f_rest_arg: restarg_mark tIDENTIFIER { # TODO: differs from parse.y - needs tests name = val[1].to_sym assignable name result = :"*#{name}" } | restarg_mark { name = :"*" self.env[name] = :lvar result = name } blkarg_mark: tAMPER2 | tAMPER f_block_arg: blkarg_mark tIDENTIFIER { identifier = val[1].to_sym self.env[identifier] = :lvar result = s(:block_arg, identifier.to_sym) } opt_f_block_arg: tCOMMA f_block_arg { result = val[1] } | { result = nil } singleton: var_ref | tLPAREN2 { lexer.lex_state = :expr_beg } expr opt_nl tRPAREN { result = val[2] yyerror "Can't define single method for literals." if result[0] == :lit } assoc_list: none # [!nil] { result = s(:array) } | assocs trailer # [!nil] { result = val[0] } | args trailer { size = val[0].size if (size % 2 != 1) then # != 1 because of leading :array yyerror "Odd number (#{size}) list for Hash. #{val[0].inspect}" end result = val[0] } assocs: assoc | assocs tCOMMA assoc { list = val[0].dup more = val[2][1..-1] list.push(*more) unless more.empty? result = list } assoc: arg_value tASSOC arg_value { result = s(:array, val[0], val[2]) } operation: tIDENTIFIER | tCONSTANT | tFID operation2: tIDENTIFIER | tCONSTANT | tFID | op operation3: tIDENTIFIER | tFID | op dot_or_colon: tDOT | tCOLON2 opt_terms: | terms opt_nl: | tNL trailer: | tNL | tCOMMA term: tSEMI { yyerrok } | tNL terms: term | terms tSEMI { yyerrok } none: { result = nil } end ---- inner require "ruby_lexer" require "ruby_parser_extras" # :stopdoc: # Local Variables: ** # racc-token-length-max:14 ** # End: ** ruby_parser-3.2.2/lib/ruby19_parser.rb0000644000004100000410000070515212250152360017713 0ustar www-datawww-data# # DO NOT MODIFY!!!! # This file is automatically generated by Racc 1.4.9 # from Racc grammer file "". # require 'racc/parser.rb' class Ruby19Parser < Racc::Parser require "ruby_lexer" require "ruby_parser_extras" # :stopdoc: # Local Variables: ** # racc-token-length-max:14 ** # End: ** ##### State transition tables begin ### clist = [ '-480,354,22,25,32,36,42,-480,-480,-480,65,76,-480,-480,-480,91,-480', '99,102,5,12,19,24,31,-480,337,-480,-480,-480,67,72,79,81,86,88,93,-480', '-480,7,-480,-480,-480,-480,-480,44,49,546,60,62,70,77,82,87,89,94,98', '646,4,10,17,546,29,34,-103,45,52,61,-480,-480,-480,-480,-480,-480,-480', '-480,-480,-480,-480,-480,-480,-480,337,3,-480,-480,-480,66,-480,-480', '84,617,-480,95,100,-480,-480,13,-480,26,-480,507,-480,48,-480,-480,-480', '-480,-480,-480,-480,92,-480,336,-480,-99,11,18,23,30,35,39,-93,-101', '-100,63,71,-480,-480,-480,-480,-560,-480,546,9,-480,-480,-495,-560,-560', '-560,-107,-556,-494,-560,-560,-103,-560,723,723,-104,371,372,794,-102', '584,-560,546,337,-101,546,317,-106,648,506,756,319,-560,-560,336,-560', '-560,-560,-560,-560,317,465,125,-103,467,319,723,317,-103,-105,-100', '-104,319,-102,-93,148,-99,371,372,551,371,372,615,-560,-560,-560,-560', '-560,-560,-560,-560,-560,-560,-560,-560,-560,-560,-556,-104,-560,-560', '-560,655,697,806,-90,653,-560,-405,-93,-560,149,-93,-92,-91,-560,551', '-560,-93,-560,-560,-560,-560,-560,-560,-560,149,-560,-560,-560,336,-98', '317,317,317,-557,-94,319,319,319,-95,-483,-560,-560,-93,-94,453,-560', '-483,-483,-483,-103,-97,-483,-483,-483,317,-483,-101,317,794,319,889', '-101,319,-483,317,-483,-483,-483,149,319,371,372,-96,757,465,-483,-483', '592,-483,-483,-483,-483,-483,-104,549,-102,643,-95,-104,688,-102,852', '-107,610,643,438,440,420,-483,428,800,643,-264,-414,794,-483,-483,-483', '-483,-483,-483,-483,-483,-483,-483,-483,-483,-483,-483,-483,644,-102', '-483,-483,-483,445,-483,-483,644,662,-483,-95,-106,-483,-483,644,-483', '-104,-483,-101,-483,643,-483,-483,-483,-483,-483,-483,-483,662,-483', '689,-483,445,-95,-491,-414,445,465,807,149,467,-491,-414,-560,-483,-483', '-483,-483,-560,-483,738,-414,-483,-483,644,-560,-560,-560,-495,344,-560', '-560,-560,549,-560,441,442,501,-95,-414,149,-95,-93,-560,-560,-560,-560', '-95,-102,465,-92,-554,467,823,-560,-560,-101,-560,-560,-560,-560,-560', '460,441,442,458,-560,441,442,479,-91,-98,676,-560,519,-97,-100,-107', '-556,517,518,-106,-560,371,372,-560,-560,-560,-560,-560,-560,-560,-560', '-560,-560,-560,-560,-560,-560,18,-560,-560,-560,-560,-483,760,-560,63', '-85,-560,149,-483,-560,-560,-71,-560,-554,-560,747,-560,-483,-560,-560', '-560,-560,-560,-560,-560,149,-560,-560,-560,831,770,833,438,440,420', '-554,428,735,125,-553,-560,-560,-560,-560,-560,-284,-560,-494,497,-560', '-103,317,-284,-284,-284,498,319,-284,-284,-284,610,-284,438,440,420', '149,428,730,424,277,123,-284,-284,-284,132,134,278,439,418,422,426,-284', '-284,838,-284,-284,-284,-284,-284,-90,-285,839,-480,-560,840,-99,-486', '-285,445,-480,-560,445,317,-486,-553,-556,-285,319,-480,-560,747,842', '-284,-284,-284,-284,-284,-284,-284,-284,-284,-284,-284,-284,-284,-284', '-553,-560,-284,-284,-284,445,759,-284,495,844,-284,149,894,-284,-284', '346,-284,831,-284,851,-284,149,-284,-284,-284,-284,-284,-284,-284,346', '-284,149,-284,441,442,443,441,442,469,371,372,814,794,125,-488,-284', '-284,-284,-284,-284,-284,-488,721,-284,-105,584,-284,-284,-284,136,139', '149,-284,-284,747,-284,441,442,610,-480,438,440,420,125,428,123,-480', '127,317,132,134,138,141,319,856,-284,-284,-485,-284,-284,-284,-284,-284', '317,-485,-487,858,610,319,438,440,420,-487,428,860,123,609,-489,317', '132,134,138,141,319,-489,614,-284,-284,-284,-284,-284,-284,-284,-284', '-284,-284,-284,-284,-284,-284,-490,861,-284,-284,-284,424,696,-490,862', '317,-284,328,329,-284,319,717,422,426,-284,715,-284,149,-284,-284,-284', '-284,-284,-284,-284,317,-284,149,-284,381,319,610,-85,438,440,420,383', '428,125,149,-562,-284,-284,867,-96,382,-284,-562,-562,-562,-105,149', '-562,-562,-562,610,-562,438,440,420,149,428,384,385,870,-562,-562,-562', '-562,609,123,371,372,872,132,134,-562,-562,835,-562,-562,-562,-562,-562', '610,-263,438,440,420,704,428,814,794,424,876,610,700,438,440,420,-265', '428,346,695,422,426,694,-562,-562,-562,-562,-562,-562,-562,-562,-562', '-562,-562,-562,-562,-562,149,609,-562,-562,-562,881,-263,-562,683,680', '-562,883,609,-562,-562,679,-562,678,-562,887,-562,614,-562,-562,-562', '-562,-562,-562,-562,662,-562,-562,-562,436,662,438,440,420,625,428,624', '623,621,619,-285,-562,-562,-562,-562,-278,-562,-285,607,-562,605,896', '-278,-278,-278,125,-285,-278,-278,-278,770,-278,438,440,420,125,428', '424,671,125,125,-278,-278,-278,901,125,439,418,422,426,902,-278,-278', '449,-278,-278,-278,-278,-278,610,451,438,440,420,903,428,125,123,424', '450,521,132,134,138,141,590,523,439,418,422,426,913,-278,-278,-278,-278', '-278,-278,-278,-278,-278,-278,-278,-278,-278,-278,584,609,-278,-278', '-278,-284,582,-278,572,149,-278,-70,-284,-278,-278,-266,-278,-557,-278', '346,-278,-284,-278,-278,-278,-278,-278,-278,-278,551,-278,610,-278,438', '440,420,-277,428,348,349,350,351,352,-277,-493,-278,-278,-278,-278,-561', '-278,-493,-277,-278,545,544,-561,-561,-561,926,-493,-561,-561,-561,610', '-561,438,440,420,424,428,-492,927,526,-561,-561,-561,-561,-492,125,422', '426,930,931,508,-561,-561,-492,-561,-561,-561,-561,-561,610,831,438', '440,420,505,428,935,610,424,438,440,420,847,428,438,440,420,504,428', '422,426,896,-561,-561,-561,-561,-561,-561,-561,-561,-561,-561,-561,-561', '-561,-561,831,609,-561,-561,-561,-284,938,-561,831,609,-561,487,-284', '-561,-561,942,-561,-557,-561,944,-561,-284,-561,-561,-561,-561,-561', '-561,-561,831,-561,-561,-561,463,947,-331,650,831,484,950,464,460,-331', '652,462,-561,-561,-561,-561,450,-561,-331,651,-561,354,22,25,32,36,42', '460,458,-492,65,76,457,956,455,91,-492,99,102,5,12,19,24,31,452,-492', '448,959,387,67,72,79,81,86,88,93,753,755,7,963,751,10,17,896,44,49,346', '60,62,70,77,82,87,89,94,98,-284,4,10,17,341,29,34,-284,45,52,61,-493', '-557,386,149,-285,-284,610,-493,438,440,420,-285,428,148,481,373,-493', '650,972,66,-285,483,84,973,949,95,100,361,332,13,482,26,327,651,321', '48,770,680,438,440,420,149,428,92,424,896,831,831,11,18,23,30,35,39', '984,422,426,63,71,354,22,25,32,36,42,831,9,831,65,76,-557,-556,309,91', '424,99,102,5,12,19,24,31,307,439,418,422,426,67,72,79,81,86,88,93,149', '847,7,438,440,420,298,428,44,49,266,60,62,70,77,82,87,89,94,98,-277', '4,10,17,261,29,34,-277,45,52,61,324,103,831,,953,-277,610,326,438,440', '420,955,428,,,,325,,,66,954,,84,,,95,100,,,13,,26,,,,48,770,,438,440', '420,,428,92,424,,,,11,18,23,30,35,39,,422,426,63,71,354,22,25,32,36', '42,,9,,65,76,,,,91,424,99,102,5,12,19,24,31,,439,418,422,426,67,72,79', '81,86,88,93,,,7,348,349,350,351,352,44,49,,60,62,70,77,82,87,89,94,98', ',4,10,17,,29,34,,45,52,61,348,349,350,351,352,,610,,438,440,420,,428', '348,349,350,351,352,,66,,,84,,,95,100,,,13,,26,,,,48,436,,438,440,420', ',428,92,424,,,,11,18,23,30,35,39,,422,426,63,71,354,22,25,32,36,42,', '9,,65,76,,,,91,424,99,102,5,12,19,24,31,,439,418,422,426,67,72,79,81', '86,88,93,,,7,,,,,,44,49,,60,62,70,77,82,87,89,94,98,,4,10,17,,29,34', ',45,52,61,,,,,,,610,,438,440,420,,428,,,,,,,66,,,359,,,95,100,,,13,', '26,,,,48,436,,438,440,420,,428,92,424,,,,11,18,23,30,35,39,,422,426', '63,71,354,22,25,32,36,42,,9,,65,76,,,,91,424,99,102,5,12,19,24,31,,439', '418,422,426,67,72,79,81,86,88,93,,,7,,,,,,44,49,,60,62,70,77,82,87,89', '94,98,,4,10,17,,29,34,,45,52,61,,,,,,,610,,438,440,420,,428,,,,,,,66', ',,84,,,95,100,,,13,,26,,,,48,436,,438,440,420,,428,92,424,,,,11,18,23', '30,35,39,,422,426,63,71,354,22,25,32,36,42,,9,,65,76,,,,91,424,99,102', '5,12,19,24,31,,439,418,422,426,67,72,79,81,86,88,93,,610,7,438,440,420', ',428,44,49,,60,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,,,', ',,,,,609,,,,,,,,,,,66,,,359,,,95,100,,,13,,26,,,,48,436,,438,440,420', ',428,92,,,,,11,18,23,30,35,39,,,,63,71,354,22,25,32,36,42,,9,,65,76', ',,,91,424,99,102,5,12,19,24,31,,439,418,422,426,67,72,79,81,86,88,93', ',,7,,,,,,44,49,,60,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61', ',,,,,,,,,,,,,,,,,,,66,,,84,,,95,100,,,13,,26,,,,48,436,,438,440,420', ',428,92,,,,,11,18,23,30,35,39,,,,63,71,16,22,25,32,36,42,,9,,65,76,', ',,91,424,99,102,5,12,19,24,31,,439,418,422,426,67,72,79,81,86,88,93', ',,7,,,,,,44,49,56,60,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52', '61,125,-579,-579,-579,-579,137,140,,,-579,-579,,,,,,136,139,,66,,,84', ',,95,100,,,13,,26,123,,127,48,132,134,138,141,143,145,147,92,124,,,', '11,18,23,30,35,39,,,,63,71,354,22,25,32,36,42,,9,,65,76,,,,91,,99,102', '5,12,19,24,31,,,,,,67,72,79,81,86,88,93,,,7,,,,,,44,49,,60,62,70,77', '82,87,89,94,98,,4,10,17,,29,34,,45,52,61,125,,,,,,,,,,,,,,,,136,139', ',66,,,84,,,95,100,,,13,,26,123,,127,48,132,134,138,141,,,147,92,124', ',,,11,18,23,30,35,39,,,,63,71,354,22,25,32,36,42,,9,,65,76,,,,91,,99', '102,5,12,19,24,31,,,,,,67,72,79,81,86,88,93,,,7,,,,,,44,49,,60,62,70', '77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,125,-579,-579,-579,-579', '137,140,,,-579,-579,,,,,,136,139,,66,,,84,,,95,100,,,13,,26,123,,127', '48,132,134,138,141,143,145,147,92,124,,,,11,18,23,30,35,39,,,,63,71', '354,22,25,32,36,42,,9,,65,76,,,,91,,99,102,5,12,19,24,31,,,,,,67,72', '79,81,86,88,93,,,7,,,,,,44,49,,60,62,70,77,82,87,89,94,98,,4,10,17,', '29,34,,45,52,61,125,-579,-579,-579,-579,137,140,,,-579,-579,,,,,,136', '139,,66,,,84,,,95,100,,,13,,26,123,,127,48,132,134,138,141,143,145,147', '92,124,,,,11,18,23,30,35,39,,,,63,71,354,22,25,32,36,42,,9,,65,76,,', ',91,,99,102,5,12,19,24,31,,,,,,67,72,79,81,86,88,93,,,7,,,,,,44,49,', '60,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,125,,,,,,,,,,,', ',,,,136,139,,66,,,84,,,95,100,,,13,,26,123,,127,48,132,134,138,141,', ',147,92,124,,,,11,18,23,30,35,39,,,,63,71,354,22,25,32,36,42,,9,,65', '76,,,,91,,99,102,5,12,19,24,31,,,,,,67,72,79,81,86,88,93,,,7,,,,,,44', '49,,60,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,125,126,129', '131,133,137,140,142,144,146,122,,-579,-579,,,136,139,,66,,,84,,,95,100', ',,13,,26,123,,127,48,132,134,138,141,143,145,147,92,124,,,,11,18,23', '30,35,39,,,,63,71,354,22,25,32,36,42,,9,,65,76,,,,91,,99,102,5,12,19', '24,31,,,,,,67,72,79,81,86,88,93,,,7,,,,,,44,49,,60,62,70,77,82,87,89', '94,98,,4,10,17,,29,34,,45,52,61,125,-579,-579,-579,-579,137,140,,,-579', '-579,,,,,,136,139,,66,,,84,,,95,100,,,13,,26,123,,127,48,132,134,138', '141,143,145,147,92,124,,,,11,18,23,30,35,39,,,,63,71,354,22,25,32,36', '42,,9,,65,76,,,,91,,99,102,5,12,19,24,31,,,,,,67,72,79,81,86,88,93,', ',7,,,,,,44,49,,60,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61', '125,-579,-579,-579,-579,137,140,,,-579,-579,,,,,,136,139,,66,,,84,,', '95,100,,,13,,26,123,,127,48,132,134,138,141,143,145,147,92,124,,,,11', '18,23,30,35,39,,,,63,71,354,22,25,32,36,42,,9,,65,76,,,,91,,99,102,5', '12,19,24,31,,,,,,67,72,79,81,86,88,93,,,7,,,,,,44,49,,60,62,70,77,82', '87,89,94,98,,4,10,17,,29,34,,45,52,61,125,,,,,,,,,,,,,,,,136,139,,66', ',,84,,,95,100,,,13,,26,123,,127,48,132,134,138,141,,,147,92,124,,,,11', '18,23,30,35,39,,,,63,71,354,22,25,32,36,42,,9,,65,76,,,,91,,99,102,5', '12,19,24,31,,,,,,67,72,79,81,86,88,93,,,7,,,,,,44,49,,60,62,70,77,82', '87,89,94,98,,4,10,17,,29,34,,45,52,61,125,126,129,131,133,137,140,142', ',146,122,,,,,,136,139,,66,,,84,,,95,100,,,13,,26,123,,127,48,132,134', '138,141,143,145,147,92,124,,,,11,18,23,30,35,39,,,,63,71,354,22,25,32', '36,42,,9,,65,76,,,,91,,99,102,5,12,19,24,31,,,,,,67,72,79,81,86,88,93', ',,7,,,,,,44,49,,60,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61', '125,126,129,131,133,137,140,,,146,122,,,,,,136,139,,66,,,84,,,95,100', ',,13,,26,123,,127,48,132,134,138,141,143,145,147,92,124,,,,11,18,23', '30,35,39,,,,63,71,354,22,25,32,36,42,,9,,65,76,,,,91,,99,102,5,12,19', '24,31,,,,,,67,72,79,81,86,88,93,,,7,,,,,,44,49,,60,62,70,77,82,87,89', '94,98,,4,10,17,,29,34,,45,52,61,125,-579,-579,-579,-579,137,140,,,-579', '-579,,,,,,136,139,,66,,,84,,,95,100,,,13,,26,123,,127,48,132,134,138', '141,143,145,147,92,124,,,,11,18,23,30,35,39,,,,63,71,354,22,25,32,36', '42,,9,,65,76,,,,91,,99,102,5,12,19,24,31,,,,,,67,72,79,81,86,88,93,', ',7,,,,,,44,49,,60,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61', '125,126,129,131,133,137,140,142,144,146,122,,-579,-579,,,136,139,,66', ',,84,,,95,100,,,13,,26,123,,127,48,132,134,138,141,143,145,147,92,124', ',,,11,18,23,30,35,39,,,,63,71,354,22,25,32,36,42,,9,,65,76,,,,91,,99', '102,5,12,19,24,31,,,,,,67,72,79,81,86,88,93,,,7,,,,,,44,49,,60,62,70', '77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,125,,,,,,,,,,,,,,,,136,139', ',66,,,84,,,95,100,,,13,,26,123,,127,48,132,134,138,141,,,147,92,124', ',,,11,18,23,30,35,39,,,,63,71,354,22,25,32,36,42,,9,,65,76,,,,91,,99', '102,5,12,19,24,31,,,,,,67,72,79,81,86,88,93,,,7,,,,,,44,49,,60,62,70', '77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,125,,,,,,,,,,,,,,,,136,139', ',66,,,84,,,95,100,,,13,,26,123,,,48,132,134,138,141,,,,92,,,,,11,18', '23,30,35,39,,,,63,71,354,22,25,32,36,42,,9,,65,76,,,,91,,99,102,5,12', '19,24,31,,,,,,67,72,79,81,86,88,93,,,7,,,,,,44,49,,60,62,70,77,82,87', '89,94,98,,4,10,17,,29,34,,45,52,61,125,,,,,,,,,,,,,,,,136,139,,66,,', '84,,,95,100,,,13,,26,123,,127,48,132,134,138,141,,,,92,,,,,11,18,23', '30,35,39,,,,63,71,354,22,25,32,36,42,,9,,65,76,,,,91,,99,102,5,12,19', '24,31,,,,,,67,72,79,81,86,88,93,,,7,,,,,,44,49,,60,62,70,77,82,87,89', '94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,66,,,84,,,95,100', ',,13,,26,,,,48,,,,,,,,92,,,,,11,18,23,30,35,39,,,,63,71,354,22,25,32', '36,42,,9,,65,76,,,,91,,99,102,5,12,19,24,31,,,,,,67,72,79,81,86,88,93', ',,7,,,,,,44,49,,60,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61', ',,,,,,,,,,,,,,,,,,,66,,,84,,,95,100,,,13,,26,,,,48,,,,,,,,92,,,,,11', '18,23,30,35,39,,,,63,71,354,22,25,32,36,42,,9,,65,76,,,,91,,99,102,5', '12,19,24,31,,,,,,67,72,79,81,86,88,93,,,7,,,,,,44,49,,60,62,70,77,82', '87,89,94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,66,,,84,,,95', '100,,,13,,26,,,,48,,,,,,,,92,,,,,11,18,23,30,35,39,,,,63,71,354,22,25', '32,36,42,,9,,65,76,,,,91,,99,102,5,12,19,24,31,,,,,,67,72,79,81,86,88', '93,,,7,,,,,,44,49,,60,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52', '61,,,,,,,,,,,,,,,,,,,,66,,,84,,,95,100,,,13,,26,,,,48,,,,,,,,92,,,,', '11,18,23,30,35,39,,,,63,71,354,22,25,32,36,42,,9,,65,76,,,,91,,99,102', '5,12,19,24,31,,,,,,67,72,79,81,86,88,93,,,7,,,,,,44,49,,60,62,70,77', '82,87,89,94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,66,,,359', ',,95,100,,,13,,26,,,,48,,,,,,,,92,,,,,11,18,23,30,35,39,,,,63,71,16', '22,25,32,36,42,,9,,65,76,,,,91,,99,102,5,12,19,24,31,,,,,,67,72,79,81', '86,88,93,,,7,,,,,,44,49,56,60,62,70,77,82,87,89,94,98,,4,10,17,,29,34', ',45,52,61,,,,,,,,,,,,,,,,,,,,66,,,84,,,95,100,,,13,,26,,,,48,,,,,,,', '92,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102', '5,106,108,24,31,,,,,,114,116,119,81,86,88,93,,,104,,,,,,,110,,,62,70', '77,82,87,89,94,98,,4,10,17,,29,34,,,,112,,,,,,,,,,,,,,,,,,,,273,,,363', ',,95,100,,,13,,,,,,,,,,,,,,,,,,,11,18,23,30,35,39,,,,63,71,22,25,32', ',42,,,9,65,76,,,,91,,99,102,5,12,19,24,31,,,,,,67,72,79,81,86,88,93', ',,7,,,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,,,', ',,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,92,,,,,11,18', '23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,12,19,24', '31,,,,,,67,72,79,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89,94,98', '254,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,', ',13,,240,,241,,48,,,,,,,,253,,,,-413,11,18,23,30,35,39,-413,-413,-413', '63,71,-413,-413,-413,,-413,,,9,,,,,,-413,-413,-413,,,,,,,,,-413,-413', ',-413,-413,-413,-413,-413,,,,,,,,,,,,,,,,,,,,,,,,-413,-413,-413,-413', '-413,-413,-413,-413,-413,-413,-413,-413,-413,-413,,,-413,-413,-413,', ',-413,,346,-413,,,-413,-413,,-413,,-413,,-413,,-413,-413,-413,-413,-413', '-413,-413,,-413,-413,-413,,,,,,,,,,,,,-413,-413,,-413,,-413,22,25,32', ',42,,,,65,76,,,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88', '93,,,104,,,,,,,110,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,,,112', ',,,,,,,,,,,,,,,,,,,273,,,363,,,95,100,,,13,,,,,,,,,,,,,,,,,,,11,18,23', '30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108,24', '31,,,,,,114,116,119,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89,94', '98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,', ',13,436,796,438,440,420,48,428,,,,,,,253,,,,-291,11,18,23,30,35,39,-291', '-291,-291,63,71,-291,-291,-291,,-291,,,9,,424,671,,,,-291,-291,,,439', '418,422,426,,,-291,-291,,-291,-291,-291,-291,-291,,,,,,,,,,,,,,,,,,', ',,,,,-291,-291,-291,-291,-291,-291,-291,-291,-291,-291,-291,-291,-291', '-291,,,-291,-291,-291,,,-291,,341,-291,,,-291,-291,,-291,,-291,,-291', ',-291,-291,-291,-291,-291,-291,-291,,-291,,-291,,,,,,,,,,,,-578,-291', '-291,,-291,,-291,-578,-578,-578,,,-578,-578,-578,,-578,,,,,,,,,,-578', ',,,,,,,,,-578,-578,,-578,-578,-578,-578,-578,,,,,,600,539,,,599,,,,', ',,,,180,185,,198,203,209,213,217,222,227,,,154,159,,,-578,172,176,182', '187,,,-578,,,346,,346,-578,,,,,163,169,,178,183,188,191,196,201,207', '211,215,224,229,,,157,-578,,,,,,22,25,32,,42,,,-578,65,76,,,-578,91', ',99,102,5,12,19,24,31,,,,,,67,72,79,81,86,88,93,,,104,,,,,,,49,,,62', '70,77,82,87,89,94,98,254,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,', ',244,,,249,,,95,100,,,13,,240,,241,,48,,,,,,,,253,,,,,11,18,23,30,35', '39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108,24,31,,,', ',,114,116,119,81,86,88,93,,,104,,,,,,,110,,,62,70,77,82,87,89,94,98', ',4,10,17,,29,34,,,,112,,,,,,,,,,,,,,,,,,,,273,,,363,,,95,100,,,13,,362', ',,,,,,,,,,,,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,', ',91,,99,102,5,12,19,24,31,,,,,,67,72,79,81,86,88,93,,,7,,,,,686,,49', ',,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,125,126,129,131', '133,137,140,142,144,146,122,,128,130,,,136,139,,244,,,249,,,95,100,', ',13,,,123,,127,48,132,134,138,141,143,145,147,92,124,,,,11,18,23,30', '35,39,,,,63,71,317,135,22,25,32,319,42,9,,,65,76,,,,91,,99,102,5,12', '19,24,31,,,,,,67,72,79,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89', '94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100', ',,13,,,,,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42', ',,9,65,76,,,,91,,99,102,5,12,19,24,31,,,,,,67,72,79,81,86,88,93,,,7', ',,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,,,,,,,', ',,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,92,,,,,11,18,23,30', '35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108,24,31', ',,,,,114,116,119,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89,94,98', ',4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13', ',,,,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65', '76,,,,91,,99,102,5,12,19,24,31,,,,,,67,72,79,81,86,88,93,,,104,,,,,', ',49,,,62,70,77,82,87,89,94,98,254,4,10,17,,29,34,,45,52,61,,,,,,,,,', ',,,,,,,,,,244,,,249,,,95,100,,,13,,240,,241,,48,,,,,,,,253,,,,,11,18', '23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,12,19,24', '31,,,,,,67,72,79,81,86,88,93,,,7,,,,,,,49,,,62,70,77,82,87,89,94,98', ',4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13', ',,,,,48,,,,,,,,92,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65', '76,,,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88,93,,,104', ',,,,,,49,,,62,70,77,82,87,89,94,98,254,4,10,17,,29,34,,45,52,61,,,,', ',,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,240,,,,48,,,,,,,,253,,,,,11', '18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,12,19', '24,31,,,,,,67,72,79,81,86,88,93,,,7,,,,,,,49,,,62,70,77,82,87,89,94', '98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,', ',13,,,,,,48,,,,,,,,92,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42,,', '9,65,76,,,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88,93,', ',104,,,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,,', ',,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11,18', '23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108', '24,31,,,,,,114,116,119,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89', '94,98,254,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95', '100,,,13,,,,,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32', ',42,,,9,65,76,,,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88', '93,,,104,,,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61', ',,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11', '18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108', '24,31,,,,,,114,116,119,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89', '94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100', ',,13,,511,,,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,', '42,,,9,65,76,,,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88', '93,,,104,,,,,,,49,,,62,70,77,82,87,89,94,98,254,4,10,17,,29,34,,45,52', '61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,241,,48,,,,,,,,253', ',,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102', '5,106,108,24,31,,,,,,114,116,119,81,86,88,93,,,104,,,,,,,49,,,62,70', '77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,', ',249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71', '22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108,24,31,,,,,,114,116,119', '81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89,94,98,254,4,10,17,,29', '34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,634,,241,,48', ',,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,', '91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88,93,,,104,,,,,,', '49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,', ',,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11,18,23,30,35', '39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,12,19,24,31,,,,,', '67,72,79,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89,94,98,254,4', '10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,240', ',241,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42,,,9', '65,76,,,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88,93,,,104', ',,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,,,,,,,', ',,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11,18,23', '30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108,24', '31,,,,,,114,116,119,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89,94', '98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,', ',13,,,,,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42,', ',9,65,76,,,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88,93', ',,104,,,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,', ',,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11', '18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108', '24,31,,,,,,114,116,119,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89', '94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100', ',,13,,,,,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42', ',,9,65,76,,,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88,93', ',,104,,,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,', ',,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11', '18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108', '24,31,,,,,,114,116,119,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89', '94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100', ',,13,,,,,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42', ',,9,65,76,,,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88,93', ',,104,,,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,', ',,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11', '18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108', '24,31,,,,,,114,116,119,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89', '94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100', ',,13,,,,,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42', ',,9,65,76,,,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88,93', ',,104,,,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,', ',,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11', '18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108', '24,31,,,,,,114,116,119,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89', '94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100', ',,13,,,,,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42', ',,9,65,76,,,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88,93', ',,104,,,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,', ',,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11', '18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108', '24,31,,,,,,114,116,119,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89', '94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100', ',,13,,,,,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42', ',,9,65,76,,,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88,93', ',,104,,,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,', ',,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11', '18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108', '24,31,,,,,,114,116,119,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89', '94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100', ',,13,,,,,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42', ',,9,65,76,,,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88,93', ',,104,,,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,', ',,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11', '18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108', '24,31,,,,,,114,116,119,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89', '94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100', ',,13,,,,,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42', ',,9,65,76,,,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88,93', ',,104,,,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,', ',,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11', '18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108', '24,31,,,,,,114,116,119,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89', '94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100', ',,13,,,,,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42', ',,9,65,76,,,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88,93', ',,104,,,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,', ',,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11', '18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108', '24,31,,,,,,114,116,119,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89', '94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100', ',,13,,,,,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42', ',,9,65,76,,,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88,93', ',,104,,,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,', ',,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11', '18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108', '24,31,,,,,,114,116,119,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89', '94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100', ',,13,,,,,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42', ',,9,65,76,,,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88,93', ',,104,,,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,', ',,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11', '18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108', '24,31,,,,,,114,116,119,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89', '94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100', ',,13,,,,,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42', ',,9,65,76,,,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88,93', ',,104,,,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,', ',,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11', '18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108', '24,31,,,,,,114,116,119,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89', '94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100', ',,13,,,,,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42', ',,9,65,76,,,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88,93', ',,104,,,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,', ',,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11', '18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108', '24,31,,,,,,114,116,119,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89', '94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100', ',,13,,,,,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42', ',,9,65,76,,,,91,,99,102,5,12,19,24,31,,,,,,67,72,79,81,86,88,93,,,7', ',,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,,,,,,,', ',,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,92,,,,,11,18,23,30', '35,39,,,,63,71,149,22,25,32,,42,,9,,65,76,,,,91,,99,102,5,12,19,24,31', ',,,,,67,72,79,81,86,88,93,,,7,,,,,,,49,,,62,70,77,82,87,89,94,98,,4', '10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,436', ',438,440,420,48,428,,,,,,,92,,,,-578,11,18,23,30,35,39,-578,-578,-578', '63,71,-578,-578,-578,,-578,,,9,,424,430,,,,-578,,,,439,418,422,426,', ',-578,-578,,-578,-578,-578,-578,-578,,,,,,489,491,,,488,,,,,,,,,180', '185,,198,203,209,213,217,222,227,,,154,159,,,-578,172,176,182,187,,', '-578,,,,,346,-578,,,,,163,169,,178,183,188,191,196,201,207,211,215,224', '229,,,157,-578,,,,,,22,25,32,,42,,,-578,65,76,,,-578,91,,99,102,5,12', '19,24,31,,,,,,67,72,79,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89', '94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100', ',,13,,,,,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42', ',,9,65,76,,,,91,,99,102,5,12,19,24,31,,,,,,67,72,79,81,86,88,93,,,104', ',,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,,,,,,,', ',,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11,18,23', '30,35,39,,,,63,71,22,25,32,36,42,,,9,65,76,,,,91,,99,102,5,12,19,24', '31,,,,,,67,72,79,81,86,88,93,,,7,,,,,,44,49,,60,62,70,77,82,87,89,94', '98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,66,,,84,,,95,100,,,13', ',26,,,,48,,,,,,,,92,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42,523', ',9,65,76,,,,91,,99,102,5,12,19,24,31,,,,,,67,72,79,81,86,88,93,,,7,', ',,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,', ',,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,92,,,,,11,18,23,30', '35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108,24,31', ',,,,,114,116,119,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89,94,98', ',4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13', ',,,,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65', '76,,,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88,93,,,104', ',,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,,,,,,,', ',,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11,18,23', '30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,12,19,24,31', ',,,,,67,72,79,81,86,88,93,,,7,,,,,,,49,,,62,70,77,82,87,89,94,98,,4', '10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,', ',,,48,,,,,,,,92,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76', ',,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88,93,,,104,,,', ',,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,', ',,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11,18,23,30', '35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108,24,31', ',,,,,114,116,119,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89,94,98', '254,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,', ',13,,634,,241,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32', ',42,,,9,65,76,,,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88', '93,,,104,,,,,,,110,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,,,112', ',,,,,,,,,,,,,,,,,,,273,,,363,,,95,100,,,13,,,,,,,,,,,,,,,,,,,11,18,23', '30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108,24', '31,,,,,,114,116,119,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89,94', '98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,', ',13,,,,,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42,', ',9,65,76,,,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88,93', ',,104,,,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,', ',,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11', '18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,12,19', '24,31,,,,,,67,72,79,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89,94', '98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,', ',13,,,,,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42,', ',9,65,76,,,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88,93', ',,104,,,,,,,110,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,,,112,,,', ',,,,,,,,,,,,,,,,273,,,363,,,95,100,,,13,,,,,,,,,,,,,,,,,,,11,18,23,30', '35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108,24,31', ',,,,,114,116,119,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89,94,98', ',4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13', ',,,,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65', '76,,,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88,93,,,104', ',,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,,,,,,,', ',,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11,18,23', '30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108,24', '31,,,,,,114,116,119,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89,94', '98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,', ',13,,,,,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42,', ',9,65,76,,,,91,,99,102,5,12,19,24,31,,,,,,67,72,79,81,86,88,93,,,7,', ',,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,', ',,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,92,,,,,11,18,23,30', '35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108,24,31', ',,,,,114,116,119,81,86,88,93,,,104,,,,,,,110,,,62,70,77,82,87,89,94', '98,,4,10,17,,29,34,,,,112,,,,,,,,,,,,,,,,,,,,273,,,363,,,95,100,,,13', ',,,,,,,,,,,,,,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76', ',,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88,93,,,104,,,', ',,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,', ',,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11,18,23,30', '35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108,24,31', ',,,,,114,116,119,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89,94,98', ',4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13', ',,,,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65', '76,,,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88,93,,,104', ',,,,,,49,,,62,70,77,82,87,89,94,98,254,4,10,17,,29,34,,45,52,61,,,,', ',,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,634,,,,48,,,,,,,,253,,,,,11', '18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108', '24,31,,,,,,114,116,119,81,86,88,93,,,104,,,,,,,110,,,62,70,77,477,87', '89,94,478,,4,10,17,,29,34,,,,112,,,,,,,,,,,,,,,,,,,,475,,,249,,,95,100', ',,13,,,,,,,,,,,,,,,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65', '76,,,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88,93,,,104', ',,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,,,,,,,', ',,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11,18,23', '30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108,24', '31,,,,,,114,116,119,81,86,88,93,,,104,,,,,,,110,,,62,70,77,477,87,89', '94,478,,4,10,17,,29,34,,,,112,,,,,,,,,,,,,,,,,,,,475,,,249,,,95,100', ',,13,,,,,,,,,,,,,,,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65', '76,,,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88,93,,,104', ',,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,,,,,,,', ',,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11,18,23', '30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,12,19,24,31', ',,,,,67,72,79,81,86,88,93,,,7,,,,,,,49,,,62,70,77,82,87,89,94,98,,4', '10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,', ',,,48,,,,,,,,92,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76', ',,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88,93,,,104,,,', ',,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,', ',,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11,18,23,30', '35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,12,19,24,31,,', ',,,67,72,79,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89,94,98,254', '4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13', ',240,,241,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42', ',,9,65,76,,,,91,,99,102,5,12,19,24,31,,,,,,67,72,79,81,86,88,93,,,104', ',,,,,,49,,,62,70,77,82,87,89,94,98,254,4,10,17,,29,34,,45,52,61,,,,', ',,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,240,,241,,48,,,,,,,,253,,,,', '11,18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106', '108,24,31,,,,,,114,116,119,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82', '87,89,94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,', ',95,100,,,13,,,,,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25', '32,,42,,,9,65,76,,,,91,,99,102,5,12,19,24,31,,,,,,67,72,79,81,86,88', '93,,,7,,,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61', ',,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,92,,,,,11', '18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,12,19', '24,31,,,,,,67,72,79,81,86,88,93,,,7,,,,,,,49,,,62,70,77,82,87,89,94', '98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,', ',13,,,,,,48,,,,,,,,92,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42,,', '9,65,76,,,,91,,99,102,5,12,19,24,31,,,,,,67,72,79,81,86,88,93,,,7,,', ',,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,,', ',,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,92,,,,,11,18,23,30', '35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,12,19,24,31,,', ',,,67,72,79,81,86,88,93,,,7,,,,,,,49,,,62,70,77,82,87,89,94,98,,4,10', '17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,', '48,,,,,,,,92,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,', ',,91,,99,102,5,12,19,24,31,,,,,,67,72,79,81,86,88,93,,,7,,,,,,,49,,', '62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,', ',244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,92,,,,,11,18,23,30,35,39,,,', '63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108,24,31,,,,,,114', '116,119,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17', ',29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,240,,,', '48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76', ',,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88,93,,,104,,,', ',,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,', ',,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11,18,23,30', '35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108,24,31', ',,,,,114,116,119,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89,94,98', '254,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,', ',13,,,,241,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42', ',,9,65,76,,,,91,,99,102,5,12,19,24,31,,,,,,67,72,79,81,86,88,93,,,104', ',,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,,,,,,,', ',,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11,18,23', '30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108,24', '31,,,,,,114,116,119,81,86,88,93,,,104,,,,,,,110,,,62,70,77,82,87,89', '94,98,,4,10,17,,29,34,,,,112,,,,,,,,,,,,,,,,,,,,911,,,249,,,95,100,', ',13,,,,,,,,,,,,,,,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65', '76,,,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88,93,,,104', ',,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,,,,,,,', ',,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11,18,23', '30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108,24', '31,,,,,,114,116,119,81,86,88,93,,,104,,,,,,,110,,,62,70,77,82,87,89', '94,98,,4,10,17,,29,34,,,,112,,,,,,,,,,,,,,,,,,,,273,,,249,,,95,100,', ',13,,,,,,,,,,,,,,,,,,-578,11,18,23,30,35,39,-578,-578,-578,63,71,-578', '-578,-578,275,-578,,,9,,,,,,-578,-578,-578,,,,,,,,,-578,-578,,-578,-578', '-578,-578,-578,,,,,,,,,,,,,,,,,,,,,,,,-578,-578,-578,-578,-578,-578', '-578,-578,-578,-578,-578,-578,-578,-578,,,-578,-578,-578,,,-578,,346', '-578,,,-578,-578,,-578,,-578,,-578,,-578,-578,-578,-578,-578,-578,-578', ',-578,-578,-578,,,,,,,,,,,,,-578,-578,,-578,,-578,22,25,32,,42,,,,65', '76,,,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88,93,,,104', ',,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,,,,,,,', ',,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11,18,23', '30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108,24', '31,,,,,,114,116,119,81,86,88,93,,,104,,,,,,,110,,,62,70,77,82,87,89', '94,98,,4,10,17,,29,34,,,,112,,,,,,,,,,,,,,,,,,,,273,,,249,,,95,100,', ',13,,,,,,,,,,,,,,,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,579,42,,,9', '65,76,,,,91,,99,102,5,12,19,24,31,,,,,,67,72,79,81,86,88,93,,,104,,', ',,,,49,,,62,70,77,82,87,89,94,98,254,4,10,17,,29,34,,45,52,61,,,,,,', ',,,,,,,,,,,,,244,,,249,,,95,100,,,13,,240,,241,,48,,,,,,,,253,,,,,11', '18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108', '24,31,,,,,,114,116,119,81,86,88,93,,,104,,,,,,,110,,,62,70,77,82,87', '89,94,98,,4,10,17,,29,34,,,,112,,,,,,,,,,,,,,,,,,,,919,,,249,,,95,100', ',,13,,,,,,,,,,,,,,,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65', '76,,,,91,,99,102,5,12,19,24,31,,,,,,67,72,79,81,86,88,93,,,104,,,,,', ',49,,,62,70,77,82,87,89,94,98,254,4,10,17,,29,34,,45,52,61,,,,,,,,,', ',,,,,,,,,,244,,,249,,,95,100,,,13,,240,,241,,48,,,,,,,,253,,,,,11,18', '23,30,35,39,,,,63,71,22,25,32,36,42,,,9,65,76,,,,91,,99,102,5,12,19', '24,31,,,,,,67,72,79,81,86,88,93,,,7,,,,,,44,49,56,60,62,70,77,82,87', '89,94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,66,,,84,,,95,100', ',,13,,26,,,,48,,,,,,,,92,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42', ',,9,65,76,,,,91,,99,102,5,12,19,24,31,,,,,,67,72,79,81,86,88,93,,,104', ',,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,,,,,,,', ',,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11,18,23', '30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,12,19,24,31', ',,,,,67,72,79,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89,94,98,', '4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13', ',511,,,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42,,', '9,65,76,,,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88,93,', ',104,,,,,,,49,,,62,70,77,82,87,89,94,98,254,4,10,17,,29,34,,45,52,61', ',,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11', '18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108', '24,31,,,,,,114,116,119,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89', '94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,521,,95', '100,,,13,,,,,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32', ',42,,,9,65,76,,,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88', '93,,,104,,,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61', ',,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,634,,,,48,,,,,,,,253,,,', ',11,18,23,30,35,39,,,,63,71,22,25,32,36,42,,,9,65,76,,,,91,,99,102,5', '12,19,24,31,,,,,,67,72,79,81,86,88,93,,,7,,,,,,44,49,56,60,62,70,77', '82,87,89,94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,66,,,84', ',,95,100,,,13,,26,,,,48,,,,,,,,92,,,,,11,18,23,30,35,39,,,,63,71,22', '25,32,,42,523,,9,65,76,,,,91,,99,102,5,12,19,24,31,,,,,,67,72,79,81', '86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45', '52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253', ',,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102', '5,12,19,24,31,,,,,,67,72,79,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82', '87,89,94,98,254,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249', ',,95,100,,,13,,240,,241,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71', '22,25,32,36,42,,,9,65,76,,,,91,,99,102,5,12,19,24,31,,,,,,67,72,79,81', '86,88,93,,,7,,,,,,44,49,,60,62,70,77,82,87,89,94,98,,4,10,17,,29,34', ',45,52,61,,,,,,,,,,,,,,,,,,,,66,,,84,,,95,100,,,13,,26,,,,48,,,,,,,', '92,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102', '5,12,19,24,31,,,,,,67,72,79,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82', '87,89,94,98,254,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249', ',,95,100,,,13,,240,,241,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71', '22,25,32,,42,,,9,65,76,,,,91,,99,102,5,12,19,24,31,,,,,,67,72,79,81', '86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45', '52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253', ',,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102', '5,106,108,24,31,,,,,,114,116,119,81,86,88,93,,,104,,,,,,,110,,,62,70', '77,82,87,89,94,98,,4,10,17,,29,34,,,,112,,,,,,,,,,,,,,,,,,,,113,,,84', ',,95,100,,,13,,26,,,,,,,,,,,,,,,,,11,18,23,30,35,39,,,,63,71,22,25,32', ',42,,,9,65,76,,,,91,,99,102,5,106,108,24,31,,,,,,114,116,119,81,86,88', '93,,,104,,,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61', ',,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11', '18,23,30,35,39,,,,63,71,22,25,32,36,42,,,9,65,76,,,,91,,99,102,5,12', '19,24,31,,,,,,67,72,79,81,86,88,93,,,7,,,,,,44,49,,60,62,70,77,82,87', '89,94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,66,,,84,,,95,100', ',,13,,26,,,,48,,,,,,,,92,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42', ',,9,65,76,,,,91,,99,102,5,12,19,24,31,,,,,,67,72,79,81,86,88,93,,,7', ',,,,,,49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,,,,,,,', ',,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,92,,,,,11,18,23,30', '35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108,24,31', ',,,,,114,116,119,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89,94,98', ',4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13', ',,,,,48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65', '76,,,,91,,99,102,5,12,19,24,31,,,,,,67,72,79,81,86,88,93,,,7,,,,,,,49', ',,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,', ',,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,92,,,,,11,18,23,30,35,39,', ',,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,106,108,24,31,,,,,,114', '116,119,81,86,88,93,,,104,,,,,,,49,,,62,70,77,82,87,89,94,98,254,4,10', '17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,,,241', ',48,,,,,,,,253,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76', ',,,91,,99,102,5,12,19,24,31,,,,,,67,72,79,81,86,88,93,,,104,,,,,,,49', ',,62,70,77,82,87,89,94,98,254,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,', ',,,,,,244,,,249,,,95,100,,,13,,240,,241,,48,,,,,,,,253,,,,,11,18,23', '30,35,39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,12,19,24,31', ',,,,,67,72,79,81,86,88,93,,,7,,,,,,,49,,,62,70,77,82,87,89,94,98,,4', '10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13,,', ',,,48,,,,,,,,92,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65,76', ',,,91,,99,102,5,12,19,24,31,,,,,,67,72,79,81,86,88,93,,,104,,,,,,,49', ',,62,70,77,82,87,89,94,98,254,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,', ',,,,,,244,,,249,,,95,100,,,13,,240,,241,,48,,,,,,,,253,,,,,11,18,23', '30,35,39,,,,63,71,149,22,25,32,,42,,9,,65,76,,,,91,,99,102,5,12,19,24', '31,,,,,,67,72,79,81,86,88,93,,,7,,,,,,,49,,,62,70,77,82,87,89,94,98', ',4,10,17,,29,34,,45,52,61,,,,,,,,,,,,,,,,,,,,244,,,249,,,95,100,,,13', ',,,,,48,,,,,,,,92,,,,,11,18,23,30,35,39,,,,63,71,22,25,32,,42,,,9,65', '76,,,,91,,99,102,5,12,19,24,31,,,,,,67,72,79,81,86,88,93,,,104,,,,,', ',49,,,62,70,77,82,87,89,94,98,,4,10,17,,29,34,,45,52,61,,,,,,,,,,,,', ',,,,,,,244,,,249,,,95,100,,,13,,,,,,48,,,,,,,,253,,,,,11,18,23,30,35', '39,,,,63,71,22,25,32,,42,,,9,65,76,,,,91,,99,102,5,12,19,24,31,,,,,', '67,72,79,81,86,88,93,,,104,,,,,714,,49,,,62,70,77,82,87,89,94,98,,4', '10,17,,29,34,,45,52,61,125,126,129,131,133,137,140,142,144,146,122,', '128,130,,,136,139,,244,,,249,,,95,100,,,13,,511,123,,127,48,132,134', '138,141,143,145,147,253,124,,,,11,18,23,30,35,39,,,,63,71,,135,,-240', ',,,9,162,164,167,170,175,181,186,190,194,199,205,214,218,223,226,230', '233,155,158,161,165,168,173,177,,,,195,200,206,210,219,221,228,231,234', '156,,,,,,179,184,189,192,197,202,208,212,216,311,,232,,,,,,,,,180,185', ',198,203,209,213,217,222,227,,,154,159,,,,172,176,182,187,,,,,,,,,,', ',,,163,169,,178,183,188,191,196,201,207,211,215,224,229,,,157,11,,,', ',,,,,,71,162,164,167,170,175,181,186,190,194,199,205,214,218,223,226', '230,233,155,158,161,165,168,173,177,,,,195,200,206,210,219,221,228,231', '234,156,,,,,,179,184,189,192,197,202,208,212,216,,,232,,,,,,,,,180,185', ',198,203,209,213,217,222,227,,,154,159,,,,172,176,182,187,,,,,,,,,,', ',,,163,169,,178,183,188,191,196,201,207,211,215,224,229,,,157,11,,,', ',,,,,,71,162,164,167,170,175,181,186,190,194,199,205,214,218,223,226', '230,233,155,158,161,165,168,173,177,,,,195,200,206,210,219,221,228,231', '234,156,,,,,,179,184,189,192,197,202,208,212,216,,,232,,,,,,,,,180,185', ',198,203,209,213,217,222,227,,,154,159,,,,172,176,182,187,,,,,,,,,,', ',,,163,169,,178,183,188,191,196,201,207,211,215,224,229,,,157,11,,,', ',,,,,,71,162,164,167,170,175,181,186,190,194,199,205,214,218,223,226', '230,233,155,158,161,165,168,173,177,,,,195,200,206,210,219,221,228,231', '234,156,,,,,,179,184,189,192,197,202,208,212,216,,,232,,,,,,,,,180,185', ',198,203,209,213,217,222,227,,,154,159,,,,172,176,182,187,,,,,,,,,,', ',,,163,169,,178,183,188,191,196,201,207,211,215,224,229,,,157,11,,,', ',,,,,,71,162,164,167,170,175,181,186,190,194,199,205,214,218,223,226', '230,233,155,158,161,165,168,173,177,,,,195,200,206,210,219,221,228,231', '234,156,,,,,,179,184,189,192,197,202,208,212,216,220,225,232,,153,,', ',,,,180,185,,198,203,209,213,217,222,227,,,154,159,,,,172,176,182,187', ',,,,,,,,,,,,,163,169,,178,183,188,191,196,201,207,211,215,224,229,,', '157,162,164,167,170,175,181,186,190,194,199,205,214,218,223,226,230', '233,155,158,161,165,168,173,177,,,,195,200,206,210,219,221,228,231,234', '156,,,,,,179,184,189,192,197,202,208,212,216,,,232,,,,,,,,,180,185,', '198,203,209,213,217,222,227,,,154,159,,,,172,176,182,187,,,,,,,,,,,', ',,163,169,,178,183,188,191,196,201,207,211,215,224,229,,,157,162,164', '167,170,175,181,186,190,194,199,205,214,218,223,226,230,233,155,158', '161,165,168,173,177,,,,195,200,206,289,292,293,294,231,234,156,,,,,', '179,184,189,192,286,287,288,290,216,89,94,295,,4,,,,,,,180,185,,198', '203,209,213,217,222,227,,,154,159,,,,172,176,182,187,,,,,,291,714,,', ',,,,163,169,,178,183,188,191,196,201,207,211,215,224,229,,,157,125,126', '129,131,133,137,140,142,144,146,122,,128,130,,,136,139,,,,,,,,,,,,,', ',123,,127,,132,134,138,141,143,145,147,,124,971,539,,,970,,,,,,,,,180', '185,135,198,203,209,213,217,222,227,,,154,159,,,,172,176,182,187,,,', ',,346,,,,,,,,163,169,,178,183,188,191,196,201,207,211,215,224,229,537', '539,157,,536,,,,,,,,,180,185,,198,203,209,213,217,222,227,,,154,159', ',,,172,176,182,187,,,,,,346,,,,,,,,163,169,,178,183,188,191,196,201', '207,211,215,224,229,779,539,157,,777,,,,,,,,,180,185,,198,203,209,213', '217,222,227,,,154,159,,,,172,176,182,187,,,,,,346,,,,,,,,163,169,,178', '183,188,191,196,201,207,211,215,224,229,975,491,157,,974,,,,,,,,,180', '185,,198,203,209,213,217,222,227,,,154,159,,,,172,176,182,187,,,,,,346', ',,,,,,,163,169,,178,183,188,191,196,201,207,211,215,224,229,658,491', '157,,657,,,,,,,,,180,185,,198,203,209,213,217,222,227,,,154,159,,,,172', '176,182,187,,,,,,346,,,,,,,,163,169,,178,183,188,191,196,201,207,211', '215,224,229,661,539,157,,660,,,,,,,,,180,185,,198,203,209,213,217,222', '227,,,154,159,,,,172,176,182,187,,,,,,346,,,,,,,,163,169,,178,183,188', '191,196,201,207,211,215,224,229,489,491,157,,488,,,,,,,,,180,185,,198', '203,209,213,217,222,227,,,154,159,,,,172,176,182,187,,,,,,,,,,,,,,163', '169,,178,183,188,191,196,201,207,211,215,224,229,528,491,157,,527,,', ',,,,,,180,185,,198,203,209,213,217,222,227,,,154,159,,,,172,176,182', '187,,,,,,346,,,,,,,,163,169,,178,183,188,191,196,201,207,211,215,224', '229,632,539,157,,631,,,,,,,,,180,185,,198,203,209,213,217,222,227,,', '154,159,,,,172,176,182,187,,,,,,346,,,,,,,,163,169,,178,183,188,191', '196,201,207,211,215,224,229,629,491,157,,628,,,,,,,,,180,185,,198,203', '209,213,217,222,227,,,154,159,,,,172,176,182,187,,,,,,346,,,,,,,,163', '169,,178,183,188,191,196,201,207,211,215,224,229,489,491,157,,488,,', ',,,,,,180,185,,198,203,209,213,217,222,227,,,154,159,,,,172,176,182', '187,,,,,,346,,,,,,,,163,169,,178,183,188,191,196,201,207,211,215,224', '229,596,491,157,,595,,,,,,,,,180,185,,198,203,209,213,217,222,227,,', '154,159,,,,172,176,182,187,,,,,,346,,,,,,,,163,169,,178,183,188,191', '196,201,207,211,215,224,229,632,539,157,,631,,,,,,,,,180,185,,198,203', '209,213,217,222,227,,,154,159,,,,172,176,182,187,,,,,,346,,,,,,,,163', '169,,178,183,188,191,196,201,207,211,215,224,229,978,539,157,,977,,', ',,,,,,180,185,,198,203,209,213,217,222,227,,,154,159,,,,172,176,182', '187,,,,,,346,,,,,,,,163,169,,178,183,188,191,196,201,207,211,215,224', '229,629,491,157,,628,,,,,,,,,180,185,,198,203,209,213,217,222,227,,', '154,159,,,,172,176,182,187,,,,,,346,,,,,,,,163,169,,178,183,188,191', '196,201,207,211,215,224,229,,,157,125,126,129,131,133,137,140,142,144', '146,122,,128,130,,,136,139,,,,,,,,,,,,,,,123,,127,,132,134,138,141,143', '145,147,,124,125,126,129,131,133,137,140,142,144,146,122,,128,130,,135', '136,139,,,,,,,,,,,,,,,123,,127,,132,134,138,141,143,145,147,,124,125', '126,129,131,133,137,140,142,144,146,122,,128,130,,135,136,139,,,,,,', ',,,,,,,,123,,127,,132,134,138,141,143,145,147,,124,125,126,129,131,133', '137,140,142,144,146,122,,128,130,,135,136,139,,,,,,,,,,,,,,,123,,127', ',132,134,138,141,143,145,147,,124,125,126,129,131,133,137,140,142,144', '146,122,,128,130,,135,136,139,,,,,,,,,,,,,,,123,,127,,132,134,138,141', '143,145,147,,124,125,126,129,131,133,137,140,142,144,146,122,,128,130', ',135,136,139,,,,,,,,,,,,,,,123,,127,,132,134,138,141,143,145,147,,124', '125,126,129,131,133,137,140,142,144,146,122,,128,130,,135,136,139,,', ',,,,,,,,,,,,123,,127,,132,134,138,141,143,145,147,,124,125,126,129,131', '133,137,140,142,144,146,122,,128,130,,135,136,139,,,,,,,,,,,,,,,123', ',127,,132,134,138,141,143,145,147,,124,125,126,129,131,133,137,140,142', '144,146,122,,128,130,,135,136,139,,,,,,,,,,,,,,,123,,127,,132,134,138', '141,143,145,147,,124,125,126,129,131,133,137,140,142,144,146,122,,128', '130,,135,136,139,,,,,,,,,,,,,,,123,,127,,132,134,138,141,143,145,147', ',124,125,126,129,131,133,137,140,142,144,146,122,,128,130,,135,136,139', ',,,,,,,,,,,,,,123,,127,,132,134,138,141,143,145,147,,124,125,126,129', '131,133,137,140,142,144,146,122,,128,130,149,135,136,139,,,,,,,,,,,', ',,,123,,127,,132,134,138,141,143,145,147,,124,125,126,129,131,133,137', '140,142,144,146,122,,128,130,,135,136,139,,,,,,,,,,,,,,,123,,127,,132', '134,138,141,143,145,147,,124,125,126,129,131,133,137,140,142,144,146', '122,,128,130,,135,136,139,,,,,,,,,,,,,,,123,,127,,132,134,138,141,143', '145,147,,124,,,,,,,,,,,,,,,,135' ] racc_action_table = arr = ::Array.new(23573, nil) idx = 0 clist.each do |str| str.split(',', -1).each do |i| arr[idx] = i.to_i unless i.empty? idx += 1 end end clist = [ '82,656,656,656,656,656,656,82,82,82,656,656,82,82,82,656,82,656,656', '656,656,656,656,656,82,115,82,82,82,656,656,656,656,656,656,656,82,82', '656,82,82,82,82,82,656,656,343,656,656,656,656,656,656,656,656,656,473', '656,656,656,882,656,656,978,656,656,656,82,82,82,82,82,82,82,82,82,82', '82,82,82,82,75,1,82,82,82,656,82,82,656,425,82,656,656,82,82,656,82', '656,82,306,82,656,82,82,82,82,82,82,82,656,82,115,82,105,656,656,656', '656,656,656,658,728,107,656,656,82,82,82,82,537,82,873,656,82,82,239', '537,537,537,118,978,236,537,537,600,537,589,594,595,685,685,928,596', '928,537,330,68,987,824,343,386,473,306,628,343,537,537,75,537,537,537', '537,537,882,259,702,978,259,882,729,473,978,599,239,974,473,975,658', '7,236,331,331,698,415,415,425,537,537,537,537,537,537,537,537,537,537', '537,537,537,537,600,628,537,537,537,475,537,692,105,475,537,68,658,537', '7,658,728,107,537,690,537,658,537,537,537,537,537,537,537,685,537,537', '537,68,118,873,589,594,599,600,873,589,594,595,98,537,537,596,537,247', '537,98,98,98,537,386,98,98,98,330,98,987,824,710,330,824,987,824,98', '729,98,98,98,415,729,674,674,599,629,377,98,98,377,98,98,98,98,98,974', '452,975,553,657,974,527,975,758,247,614,468,614,614,614,295,614,687', '554,682,781,681,295,98,98,98,98,98,98,98,98,98,98,98,98,98,98,553,629', '98,98,98,297,98,98,468,663,98,527,452,98,98,554,98,527,98,758,98,706', '98,98,98,98,98,98,98,716,98,528,98,502,657,288,781,268,378,693,674,378', '288,781,661,98,98,98,98,632,98,614,781,98,98,706,632,632,632,15,78,632', '632,632,332,632,297,297,297,657,781,659,657,528,632,632,632,632,657', '528,726,693,478,726,719,632,632,693,632,632,632,632,632,636,502,502', '635,661,268,268,268,15,78,502,661,311,332,15,78,661,311,311,332,661', '645,645,632,632,632,632,632,632,632,632,632,632,632,632,632,632,57,661', '632,632,632,478,632,632,57,713,632,630,478,632,632,713,632,478,632,620', '632,478,632,632,632,632,632,632,632,613,632,632,632,732,644,733,644', '644,644,478,644,608,404,477,779,632,632,632,632,631,632,8,283,632,632', '365,631,631,631,283,365,631,631,631,835,631,835,835,835,736,835,603', '644,27,404,631,631,631,404,404,27,644,644,644,644,631,631,739,631,631', '631,631,631,8,956,740,477,779,741,8,289,956,204,477,779,264,353,289', '477,779,956,353,477,779,644,742,631,631,631,631,631,631,631,631,631', '631,631,631,631,631,477,779,631,631,631,280,631,631,280,744,631,746', '835,631,631,601,631,748,631,750,631,598,631,631,631,631,631,631,631', '597,631,586,631,204,204,204,264,264,264,370,370,958,958,413,294,631', '631,631,631,536,631,294,585,631,631,583,536,536,536,413,413,581,536', '536,764,536,280,280,609,290,609,609,609,402,609,413,290,413,865,413', '413,413,413,865,765,536,536,292,536,536,536,536,536,53,292,293,767,860', '53,860,860,860,293,860,768,402,609,287,672,402,402,402,402,672,287,609', '536,536,536,536,536,536,536,536,536,536,536,536,536,536,286,770,536', '536,536,860,536,286,771,772,536,61,61,536,772,580,860,860,536,576,536', '571,536,536,536,536,536,536,536,646,536,776,536,111,646,735,570,735', '735,735,111,735,407,561,538,536,536,780,536,111,536,538,538,538,536', '556,538,538,538,947,538,947,947,947,784,947,112,112,786,538,538,538', '538,735,407,96,96,789,407,407,538,538,735,538,538,538,538,538,935,792', '935,935,935,548,935,703,703,947,795,424,543,424,424,424,797,424,542', '535,947,947,534,538,538,538,538,538,538,538,538,538,538,538,538,538', '538,531,935,538,538,538,808,515,538,513,510,538,815,424,538,538,509', '538,507,538,820,538,424,538,538,538,538,538,538,538,486,538,538,538', '868,822,868,868,868,436,868,434,432,431,429,484,538,538,538,538,87,538', '484,421,538,416,837,87,87,87,400,484,87,87,87,856,87,856,856,856,405', '856,868,868,398,701,87,87,87,848,391,868,868,868,868,853,87,87,243,87', '87,87,87,87,738,243,738,738,738,854,738,389,405,856,243,380,405,405', '405,405,376,367,856,856,856,856,864,87,87,87,87,87,87,87,87,87,87,87', '87,87,87,366,738,87,87,87,977,364,87,360,357,87,356,977,87,87,878,87', '977,87,338,87,977,87,87,87,87,87,87,87,334,87,844,87,844,844,844,920', '844,358,358,358,358,358,920,917,87,87,87,87,539,87,917,920,87,329,328', '539,539,539,885,917,539,539,539,944,539,944,944,944,844,944,916,886', '322,539,539,539,539,916,315,844,844,890,891,307,539,539,916,539,539', '539,539,539,838,893,838,838,838,300,838,895,894,944,894,894,894,901', '894,901,901,901,298,901,944,944,897,539,539,539,539,539,539,539,539', '539,539,539,539,539,539,898,838,539,539,539,660,899,539,900,894,539', '276,660,539,539,904,539,660,539,905,539,660,539,539,539,539,539,539', '539,906,539,539,539,256,908,73,474,909,273,911,256,258,73,474,255,539', '539,539,539,256,539,73,474,539,888,888,888,888,888,888,252,251,270,888', '888,250,919,248,888,270,888,888,888,888,888,888,888,244,270,242,925', '121,888,888,888,888,888,888,888,627,627,888,932,627,627,627,934,888', '888,119,888,888,888,888,888,888,888,888,888,777,888,888,888,116,888', '888,777,888,888,888,271,777,113,110,653,777,938,271,938,938,938,653', '938,104,272,97,271,910,951,888,653,272,888,952,910,888,888,85,66,888', '272,888,60,910,55,888,858,957,858,858,858,49,858,888,938,964,965,966', '888,888,888,888,888,888,967,938,938,888,888,308,308,308,308,308,308', '968,888,969,308,308,970,971,43,308,858,308,308,308,308,308,308,308,39', '858,858,858,858,308,308,308,308,308,308,308,976,747,308,747,747,747', '35,747,308,308,22,308,308,308,308,308,308,308,308,308,274,308,308,308', '14,308,308,274,308,308,308,59,3,988,,918,274,984,59,984,984,984,918', '984,,,,59,,,308,918,,308,,,308,308,,,308,,308,,,,308,942,,942,942,942', ',942,308,984,,,,308,308,308,308,308,308,,984,984,308,308,892,892,892', '892,892,892,,308,,892,892,,,,892,942,892,892,892,892,892,892,892,,942', '942,942,942,892,892,892,892,892,892,892,,,892,569,569,569,569,569,892', '892,,892,892,892,892,892,892,892,892,892,,892,892,892,,892,892,,892', '892,892,712,712,712,712,712,,623,,623,623,623,,623,83,83,83,83,83,,892', ',,892,,,892,892,,,892,,892,,,,892,842,,842,842,842,,842,892,623,,,,892', '892,892,892,892,892,,623,623,892,892,359,359,359,359,359,359,,892,,359', '359,,,,359,842,359,359,359,359,359,359,359,,842,842,842,842,359,359', '359,359,359,359,359,,,359,,,,,,359,359,,359,359,359,359,359,359,359', '359,359,,359,359,359,,359,359,,359,359,359,,,,,,,831,,831,831,831,,831', ',,,,,,359,,,359,,,359,359,,,359,,359,,,,359,607,,607,607,607,,607,359', '831,,,,359,359,359,359,359,359,,831,831,359,359,626,626,626,626,626', '626,,359,,626,626,,,,626,607,626,626,626,626,626,626,626,,607,607,607', '607,626,626,626,626,626,626,626,,,626,,,,,,626,626,,626,626,626,626', '626,626,626,626,626,,626,626,626,,626,626,,626,626,626,,,,,,,833,,833', '833,833,,833,,,,,,,626,,,626,,,626,626,,,626,,626,,,,626,430,,430,430', '430,,430,626,833,,,,626,626,626,626,626,626,,833,833,626,626,363,363', '363,363,363,363,,626,,363,363,,,,363,430,363,363,363,363,363,363,363', ',430,430,430,430,363,363,363,363,363,363,363,,896,363,896,896,896,,896', '363,363,,363,363,363,363,363,363,363,363,363,,363,363,363,,363,363,', '363,363,363,,,,,,,,,896,,,,,,,,,,,363,,,363,,,363,363,,,363,,363,,,', '363,671,,671,671,671,,671,363,,,,,363,363,363,363,363,363,,,,363,363', '615,615,615,615,615,615,,363,,615,615,,,,615,671,615,615,615,615,615', '615,615,,671,671,671,671,615,615,615,615,615,615,615,,,615,,,,,,615', '615,,615,615,615,615,615,615,615,615,615,,615,615,615,,615,615,,615', '615,615,,,,,,,,,,,,,,,,,,,,615,,,615,,,615,615,,,615,,615,,,,615,619', ',619,619,619,,619,615,,,,,615,615,615,615,615,615,,,,615,615,526,526', '526,526,526,526,,615,,526,526,,,,526,619,526,526,526,526,526,526,526', ',619,619,619,619,526,526,526,526,526,526,526,,,526,,,,,,526,526,526', '526,526,526,526,526,526,526,526,526,,526,526,526,,526,526,,526,526,526', '392,392,392,392,392,392,392,,,392,392,,,,,,392,392,,526,,,526,,,526', '526,,,526,,526,392,,392,526,392,392,392,392,392,392,392,526,392,,,,526', '526,526,526,526,526,,,,526,526,327,327,327,327,327,327,,526,,327,327', ',,,327,,327,327,327,327,327,327,327,,,,,,327,327,327,327,327,327,327', ',,327,,,,,,327,327,,327,327,327,327,327,327,327,327,327,,327,327,327', ',327,327,,327,327,327,403,,,,,,,,,,,,,,,,403,403,,327,,,327,,,327,327', ',,327,,327,403,,403,327,403,403,403,403,,,403,327,403,,,,327,327,327', '327,327,327,,,,327,327,876,876,876,876,876,876,,327,,876,876,,,,876', ',876,876,876,876,876,876,876,,,,,,876,876,876,876,876,876,876,,,876', ',,,,,876,876,,876,876,876,876,876,876,876,876,876,,876,876,876,,876', '876,,876,876,876,388,388,388,388,388,388,388,,,388,388,,,,,,388,388', ',876,,,876,,,876,876,,,876,,876,388,,388,876,388,388,388,388,388,388', '388,876,388,,,,876,876,876,876,876,876,,,,876,876,912,912,912,912,912', '912,,876,,912,912,,,,912,,912,912,912,912,912,912,912,,,,,,912,912,912', '912,912,912,912,,,912,,,,,,912,912,,912,912,912,912,912,912,912,912', '912,,912,912,912,,912,912,,912,912,912,399,399,399,399,399,399,399,', ',399,399,,,,,,399,399,,912,,,912,,,912,912,,,912,,912,399,,399,912,399', '399,399,399,399,399,399,912,399,,,,912,912,912,912,912,912,,,,912,912', '915,915,915,915,915,915,,912,,915,915,,,,915,,915,915,915,915,915,915', '915,,,,,,915,915,915,915,915,915,915,,,915,,,,,,915,915,,915,915,915', '915,915,915,915,915,915,,915,915,915,,915,915,,915,915,915,406,,,,,', ',,,,,,,,,,406,406,,915,,,915,,,915,915,,,915,,915,406,,406,915,406,406', '406,406,,,406,915,406,,,,915,915,915,915,915,915,,,,915,915,818,818', '818,818,818,818,,915,,818,818,,,,818,,818,818,818,818,818,818,818,,', ',,,818,818,818,818,818,818,818,,,818,,,,,,818,818,,818,818,818,818,818', '818,818,818,818,,818,818,818,,818,818,,818,818,818,394,394,394,394,394', '394,394,394,394,394,394,,394,394,,,394,394,,818,,,818,,,818,818,,,818', ',818,394,,394,818,394,394,394,394,394,394,394,818,394,,,,818,818,818', '818,818,818,,,,818,818,249,249,249,249,249,249,,818,,249,249,,,,249', ',249,249,249,249,249,249,249,,,,,,249,249,249,249,249,249,249,,,249', ',,,,,249,249,,249,249,249,249,249,249,249,249,249,,249,249,249,,249', '249,,249,249,249,397,397,397,397,397,397,397,,,397,397,,,,,,397,397', ',249,,,249,,,249,249,,,249,,249,397,,397,249,397,397,397,397,397,397', '397,249,397,,,,249,249,249,249,249,249,,,,249,249,763,763,763,763,763', '763,,249,,763,763,,,,763,,763,763,763,763,763,763,763,,,,,,763,763,763', '763,763,763,763,,,763,,,,,,763,763,,763,763,763,763,763,763,763,763', '763,,763,763,763,,763,763,,763,763,763,412,412,412,412,412,412,412,', ',412,412,,,,,,412,412,,763,,,763,,,763,763,,,763,,763,412,,412,763,412', '412,412,412,412,412,412,763,412,,,,763,763,763,763,763,763,,,,763,763', '922,922,922,922,922,922,,763,,922,922,,,,922,,922,922,922,922,922,922', '922,,,,,,922,922,922,922,922,922,922,,,922,,,,,,922,922,,922,922,922', '922,922,922,922,922,922,,922,922,922,,922,922,,922,922,922,411,,,,,', ',,,,,,,,,,411,411,,922,,,922,,,922,922,,,922,,922,411,,411,922,411,411', '411,411,,,411,922,411,,,,922,922,922,922,922,922,,,,922,922,774,774', '774,774,774,774,,922,,774,774,,,,774,,774,774,774,774,774,774,774,,', ',,,774,774,774,774,774,774,774,,,774,,,,,,774,774,,774,774,774,774,774', '774,774,774,774,,774,774,774,,774,774,,774,774,774,410,410,410,410,410', '410,410,410,,410,410,,,,,,410,410,,774,,,774,,,774,774,,,774,,774,410', ',410,774,410,410,410,410,410,410,410,774,410,,,,774,774,774,774,774', '774,,,,774,774,819,819,819,819,819,819,,774,,819,819,,,,819,,819,819', '819,819,819,819,819,,,,,,819,819,819,819,819,819,819,,,819,,,,,,819', '819,,819,819,819,819,819,819,819,819,819,,819,819,819,,819,819,,819', '819,819,408,408,408,408,408,408,408,,,408,408,,,,,,408,408,,819,,,819', ',,819,819,,,819,,819,408,,408,819,408,408,408,408,408,408,408,819,408', ',,,819,819,819,819,819,819,,,,819,819,924,924,924,924,924,924,,819,', '924,924,,,,924,,924,924,924,924,924,924,924,,,,,,924,924,924,924,924', '924,924,,,924,,,,,,924,924,,924,924,924,924,924,924,924,924,924,,924', '924,924,,924,924,,924,924,924,395,395,395,395,395,395,395,,,395,395', ',,,,,395,395,,924,,,924,,,924,924,,,924,,924,395,,395,924,395,395,395', '395,395,395,395,924,395,,,,924,924,924,924,924,924,,,,924,924,558,558', '558,558,558,558,,924,,558,558,,,,558,,558,558,558,558,558,558,558,,', ',,,558,558,558,558,558,558,558,,,558,,,,,,558,558,,558,558,558,558,558', '558,558,558,558,,558,558,558,,558,558,,558,558,558,396,396,396,396,396', '396,396,396,396,396,396,,396,396,,,396,396,,558,,,558,,,558,558,,,558', ',558,396,,396,558,396,396,396,396,396,396,396,558,396,,,,558,558,558', '558,558,558,,,,558,558,827,827,827,827,827,827,,558,,827,827,,,,827', ',827,827,827,827,827,827,827,,,,,,827,827,827,827,827,827,827,,,827', ',,,,,827,827,,827,827,827,827,827,827,827,827,827,,827,827,827,,827', '827,,827,827,827,409,,,,,,,,,,,,,,,,409,409,,827,,,827,,,827,827,,,827', ',827,409,,409,827,409,409,409,409,,,409,827,409,,,,827,827,827,827,827', '827,,,,827,827,825,825,825,825,825,825,,827,,825,825,,,,825,,825,825', '825,825,825,825,825,,,,,,825,825,825,825,825,825,825,,,825,,,,,,825', '825,,825,825,825,825,825,825,825,825,825,,825,825,825,,825,825,,825', '825,825,393,,,,,,,,,,,,,,,,393,393,,825,,,825,,,825,825,,,825,,825,393', ',,825,393,393,393,393,,,,825,,,,,825,825,825,825,825,825,,,,825,825', '673,673,673,673,673,673,,825,,673,673,,,,673,,673,673,673,673,673,673', '673,,,,,,673,673,673,673,673,673,673,,,673,,,,,,673,673,,673,673,673', '673,673,673,673,673,673,,673,673,673,,673,673,,673,673,673,390,,,,,', ',,,,,,,,,,390,390,,673,,,673,,,673,673,,,673,,673,390,,390,673,390,390', '390,390,,,,673,,,,,673,673,673,673,673,673,,,,673,673,884,884,884,884', '884,884,,673,,884,884,,,,884,,884,884,884,884,884,884,884,,,,,,884,884', '884,884,884,884,884,,,884,,,,,,884,884,,884,884,884,884,884,884,884', '884,884,,884,884,884,,884,884,,884,884,884,,,,,,,,,,,,,,,,,,,,884,,', '884,,,884,884,,,884,,884,,,,884,,,,,,,,884,,,,,884,884,884,884,884,884', ',,,884,884,794,794,794,794,794,794,,884,,794,794,,,,794,,794,794,794', '794,794,794,794,,,,,,794,794,794,794,794,794,794,,,794,,,,,,794,794', ',794,794,794,794,794,794,794,794,794,,794,794,794,,794,794,,794,794', '794,,,,,,,,,,,,,,,,,,,,794,,,794,,,794,794,,,794,,794,,,,794,,,,,,,', '794,,,,,794,794,794,794,794,794,,,,794,794,617,617,617,617,617,617,', '794,,617,617,,,,617,,617,617,617,617,617,617,617,,,,,,617,617,617,617', '617,617,617,,,617,,,,,,617,617,,617,617,617,617,617,617,617,617,617', ',617,617,617,,617,617,,617,617,617,,,,,,,,,,,,,,,,,,,,617,,,617,,,617', '617,,,617,,617,,,,617,,,,,,,,617,,,,,617,617,617,617,617,617,,,,617', '617,547,547,547,547,547,547,,617,,547,547,,,,547,,547,547,547,547,547', '547,547,,,,,,547,547,547,547,547,547,547,,,547,,,,,,547,547,,547,547', '547,547,547,547,547,547,547,,547,547,547,,547,547,,547,547,547,,,,,', ',,,,,,,,,,,,,,547,,,547,,,547,547,,,547,,547,,,,547,,,,,,,,547,,,,,547', '547,547,547,547,547,,,,547,547,84,84,84,84,84,84,,547,,84,84,,,,84,', '84,84,84,84,84,84,84,,,,,,84,84,84,84,84,84,84,,,84,,,,,,84,84,,84,84', '84,84,84,84,84,84,84,,84,84,84,,84,84,,84,84,84,,,,,,,,,,,,,,,,,,,,84', ',,84,,,84,84,,,84,,84,,,,84,,,,,,,,84,,,,,84,84,84,84,84,84,,,,84,84', '2,2,2,2,2,2,,84,,2,2,,,,2,,2,2,2,2,2,2,2,,,,,,2,2,2,2,2,2,2,,,2,,,,', ',2,2,2,2,2,2,2,2,2,2,2,2,,2,2,2,,2,2,,2,2,2,,,,,,,,,,,,,,,,,,,,2,,,2', ',,2,2,,,2,,2,,,,2,,,,,,,,2,,,,,2,2,2,2,2,2,,,,2,2,275,275,275,,275,', ',2,275,275,,,,275,,275,275,275,275,275,275,275,,,,,,275,275,275,275', '275,275,275,,,275,,,,,,,275,,,275,275,275,275,275,275,275,275,,275,275', '275,,275,275,,,,275,,,,,,,,,,,,,,,,,,,,275,,,275,,,275,275,,,275,,,', ',,,,,,,,,,,,,,,275,275,275,275,275,275,,,,275,275,76,76,76,,76,,,275', '76,76,,,,76,,76,76,76,76,76,76,76,,,,,,76,76,76,76,76,76,76,,,76,,,', ',,,76,,,76,76,76,76,76,76,76,76,,76,76,76,,76,76,,76,76,76,,,,,,,,,', ',,,,,,,,,,76,,,76,,,76,76,,,76,,,,,,76,,,,,,,,76,,,,,76,76,76,76,76', '76,,,,76,76,482,482,482,,482,,,76,482,482,,,,482,,482,482,482,482,482', '482,482,,,,,,482,482,482,482,482,482,482,,,482,,,,,,,482,,,482,482,482', '482,482,482,482,482,482,482,482,482,,482,482,,482,482,482,,,,,,,,,,', ',,,,,,,,,482,,,482,,,482,482,,,482,,482,,482,,482,,,,,,,,482,,,,79,482', '482,482,482,482,482,79,79,79,482,482,79,79,79,,79,,,482,,,,,,79,79,79', ',,,,,,,,79,79,,79,79,79,79,79,,,,,,,,,,,,,,,,,,,,,,,,79,79,79,79,79', '79,79,79,79,79,79,79,79,79,,,79,79,79,,,79,,79,79,,,79,79,,79,,79,,79', ',79,79,79,79,79,79,79,,79,79,79,,,,,,,,,,,,,79,79,,79,,79,487,487,487', ',487,,,,487,487,,,,487,,487,487,487,487,487,487,487,,,,,,487,487,487', '487,487,487,487,,,487,,,,,,,487,,,487,487,487,487,487,487,487,487,,487', '487,487,,487,487,,,,487,,,,,,,,,,,,,,,,,,,,487,,,487,,,487,487,,,487', ',,,,,,,,,,,,,,,,,,487,487,487,487,487,487,,,,487,487,683,683,683,,683', ',,487,683,683,,,,683,,683,683,683,683,683,683,683,,,,,,683,683,683,683', '683,683,683,,,683,,,,,,,683,,,683,683,683,683,683,683,683,683,,683,683', '683,,683,683,,683,683,683,,,,,,,,,,,,,,,,,,,,683,,,683,,,683,683,,,683', '499,683,499,499,499,683,499,,,,,,,683,,,,72,683,683,683,683,683,683', '72,72,72,683,683,72,72,72,,72,,,683,,499,499,,,,72,72,,,499,499,499', '499,,,72,72,,72,72,72,72,72,,,,,,,,,,,,,,,,,,,,,,,,72,72,72,72,72,72', '72,72,72,72,72,72,72,72,,,72,72,72,,,72,,72,72,,,72,72,,72,,72,,72,', '72,72,72,72,72,72,72,,72,,72,,,,,,,,,,,,492,72,72,,72,,72,492,492,492', ',,492,492,492,,492,,,,,,,,,,492,,,,,,,,,,492,492,,492,492,492,492,492', ',,,,,383,383,,,383,,,,,,,,,383,383,,383,383,383,383,383,383,383,,,383', '383,,,492,383,383,383,383,,,492,,,383,,492,492,,,,,383,383,,383,383', '383,383,383,383,383,383,383,383,383,,,383,492,,,,,,67,67,67,,67,,,492', '67,67,,,492,67,,67,67,67,67,67,67,67,,,,,,67,67,67,67,67,67,67,,,67', ',,,,,,67,,,67,67,67,67,67,67,67,67,67,67,67,67,,67,67,,67,67,67,,,,', ',,,,,,,,,,,,,,,67,,,67,,,67,67,,,67,,67,,67,,67,,,,,,,,67,,,,,67,67', '67,67,67,67,,,,67,67,90,90,90,,90,,,67,90,90,,,,90,,90,90,90,90,90,90', '90,,,,,,90,90,90,90,90,90,90,,,90,,,,,,,90,,,90,90,90,90,90,90,90,90', ',90,90,90,,90,90,,,,90,,,,,,,,,,,,,,,,,,,,90,,,90,,,90,90,,,90,,90,', ',,,,,,,,,,,,,,,90,90,90,90,90,90,,,,90,90,91,91,91,,91,,,90,91,91,,', ',91,,91,91,91,91,91,91,91,,,,,,91,91,91,91,91,91,91,,,91,,,,,524,,91', ',,91,91,91,91,91,91,91,91,,91,91,91,,91,91,,91,91,91,524,524,524,524', '524,524,524,524,524,524,524,,524,524,,,524,524,,91,,,91,,,91,91,,,91', ',,524,,524,91,524,524,524,524,524,524,524,91,524,,,,91,91,91,91,91,91', ',,,91,91,91,524,92,92,92,91,92,91,,,92,92,,,,92,,92,92,92,92,92,92,92', ',,,,,92,92,92,92,92,92,92,,,92,,,,,,,92,,,92,92,92,92,92,92,92,92,,92', '92,92,,92,92,,92,92,92,,,,,,,,,,,,,,,,,,,,92,,,92,,,92,92,,,92,,,,,', '92,,,,,,,,92,,,,,92,92,92,92,92,92,,,,92,92,95,95,95,,95,,,92,95,95', ',,,95,,95,95,95,95,95,95,95,,,,,,95,95,95,95,95,95,95,,,95,,,,,,,95', ',,95,95,95,95,95,95,95,95,,95,95,95,,95,95,,95,95,95,,,,,,,,,,,,,,,', ',,,,95,,,95,,,95,95,,,95,,,,,,95,,,,,,,,95,,,,,95,95,95,95,95,95,,,', '95,95,714,714,714,,714,,,95,714,714,,,,714,,714,714,714,714,714,714', '714,,,,,,714,714,714,714,714,714,714,,,714,,,,,,,714,,,714,714,714,714', '714,714,714,714,,714,714,714,,714,714,,714,714,714,,,,,,,,,,,,,,,,,', ',,714,,,714,,,714,714,,,714,,,,,,714,,,,,,,,714,,,,,714,714,714,714', '714,714,,,,714,714,954,954,954,,954,,,714,954,954,,,,954,,954,954,954', '954,954,954,954,,,,,,954,954,954,954,954,954,954,,,954,,,,,,,954,,,954', '954,954,954,954,954,954,954,954,954,954,954,,954,954,,954,954,954,,', ',,,,,,,,,,,,,,,,,954,,,954,,,954,954,,,954,,954,,954,,954,,,,,,,,954', ',,,,954,954,954,954,954,954,,,,954,954,65,65,65,,65,,,954,65,65,,,,65', ',65,65,65,65,65,65,65,,,,,,65,65,65,65,65,65,65,,,65,,,,,,,65,,,65,65', '65,65,65,65,65,65,,65,65,65,,65,65,,65,65,65,,,,,,,,,,,,,,,,,,,,65,', ',65,,,65,65,,,65,,,,,,65,,,,,,,,65,,,,,65,65,65,65,65,65,,,,65,65,100', '100,100,,100,,,65,100,100,,,,100,,100,100,100,100,100,100,100,,,,,,100', '100,100,100,100,100,100,,,100,,,,,,,100,,,100,100,100,100,100,100,100', '100,100,100,100,100,,100,100,,100,100,100,,,,,,,,,,,,,,,,,,,,100,,,100', ',,100,100,,,100,,100,,,,100,,,,,,,,100,,,,,100,100,100,100,100,100,', ',,100,100,471,471,471,,471,,,100,471,471,,,,471,,471,471,471,471,471', '471,471,,,,,,471,471,471,471,471,471,471,,,471,,,,,,,471,,,471,471,471', '471,471,471,471,471,,471,471,471,,471,471,,471,471,471,,,,,,,,,,,,,', ',,,,,,471,,,471,,,471,471,,,471,,,,,,471,,,,,,,,471,,,,,471,471,471', '471,471,471,,,,471,471,549,549,549,,549,,,471,549,549,,,,549,,549,549', '549,549,549,549,549,,,,,,549,549,549,549,549,549,549,,,549,,,,,,,549', ',,549,549,549,549,549,549,549,549,,549,549,549,,549,549,,549,549,549', ',,,,,,,,,,,,,,,,,,,549,,,549,,,549,549,,,549,,,,,,549,,,,,,,,549,,,', ',549,549,549,549,549,549,,,,549,549,467,467,467,,467,,,549,467,467,', ',,467,,467,467,467,467,467,467,467,,,,,,467,467,467,467,467,467,467', ',,467,,,,,,,467,,,467,467,467,467,467,467,467,467,467,467,467,467,,467', '467,,467,467,467,,,,,,,,,,,,,,,,,,,,467,,,467,,,467,467,,,467,,,,,,467', ',,,,,,,467,,,,,467,467,467,467,467,467,,,,467,467,460,460,460,,460,', ',467,460,460,,,,460,,460,460,460,460,460,460,460,,,,,,460,460,460,460', '460,460,460,,,460,,,,,,,460,,,460,460,460,460,460,460,460,460,,460,460', '460,,460,460,,460,460,460,,,,,,,,,,,,,,,,,,,,460,,,460,,,460,460,,,460', ',,,,,460,,,,,,,,460,,,,,460,460,460,460,460,460,,,,460,460,680,680,680', ',680,,,460,680,680,,,,680,,680,680,680,680,680,680,680,,,,,,680,680', '680,680,680,680,680,,,680,,,,,,,680,,,680,680,680,680,680,680,680,680', ',680,680,680,,680,680,,680,680,680,,,,,,,,,,,,,,,,,,,,680,,,680,,,680', '680,,,680,,680,,,,680,,,,,,,,680,,,,,680,680,680,680,680,680,,,,680', '680,458,458,458,,458,,,680,458,458,,,,458,,458,458,458,458,458,458,458', ',,,,,458,458,458,458,458,458,458,,,458,,,,,,,458,,,458,458,458,458,458', '458,458,458,458,458,458,458,,458,458,,458,458,458,,,,,,,,,,,,,,,,,,', ',458,,,458,,,458,458,,,458,,,,458,,458,,,,,,,,458,,,,,458,458,458,458', '458,458,,,,458,458,457,457,457,,457,,,458,457,457,,,,457,,457,457,457', '457,457,457,457,,,,,,457,457,457,457,457,457,457,,,457,,,,,,,457,,,457', '457,457,457,457,457,457,457,,457,457,457,,457,457,,457,457,457,,,,,', ',,,,,,,,,,,,,,457,,,457,,,457,457,,,457,,,,,,457,,,,,,,,457,,,,,457', '457,457,457,457,457,,,,457,457,455,455,455,,455,,,457,455,455,,,,455', ',455,455,455,455,455,455,455,,,,,,455,455,455,455,455,455,455,,,455', ',,,,,,455,,,455,455,455,455,455,455,455,455,455,455,455,455,,455,455', ',455,455,455,,,,,,,,,,,,,,,,,,,,455,,,455,,,455,455,,,455,,455,,455', ',455,,,,,,,,455,,,,,455,455,455,455,455,455,,,,455,455,453,453,453,', '453,,,455,453,453,,,,453,,453,453,453,453,453,453,453,,,,,,453,453,453', '453,453,453,453,,,453,,,,,,,453,,,453,453,453,453,453,453,453,453,,453', '453,453,,453,453,,453,453,453,,,,,,,,,,,,,,,,,,,,453,,,453,,,453,453', ',,453,,,,,,453,,,,,,,,453,,,,,453,453,453,453,453,453,,,,453,453,450', '450,450,,450,,,453,450,450,,,,450,,450,450,450,450,450,450,450,,,,,', '450,450,450,450,450,450,450,,,450,,,,,,,450,,,450,450,450,450,450,450', '450,450,450,450,450,450,,450,450,,450,450,450,,,,,,,,,,,,,,,,,,,,450', ',,450,,,450,450,,,450,,450,,450,,450,,,,,,,,450,,,,,450,450,450,450', '450,450,,,,450,450,448,448,448,,448,,,450,448,448,,,,448,,448,448,448', '448,448,448,448,,,,,,448,448,448,448,448,448,448,,,448,,,,,,,448,,,448', '448,448,448,448,448,448,448,,448,448,448,,448,448,,448,448,448,,,,,', ',,,,,,,,,,,,,,448,,,448,,,448,448,,,448,,,,,,448,,,,,,,,448,,,,,448', '448,448,448,448,448,,,,448,448,686,686,686,,686,,,448,686,686,,,,686', ',686,686,686,686,686,686,686,,,,,,686,686,686,686,686,686,686,,,686', ',,,,,,686,,,686,686,686,686,686,686,686,686,,686,686,686,,686,686,,686', '686,686,,,,,,,,,,,,,,,,,,,,686,,,686,,,686,686,,,686,,,,,,686,,,,,,', ',686,,,,,686,686,686,686,686,686,,,,686,686,122,122,122,,122,,,686,122', '122,,,,122,,122,122,122,122,122,122,122,,,,,,122,122,122,122,122,122', '122,,,122,,,,,,,122,,,122,122,122,122,122,122,122,122,,122,122,122,', '122,122,,122,122,122,,,,,,,,,,,,,,,,,,,,122,,,122,,,122,122,,,122,,', ',,,122,,,,,,,,122,,,,,122,122,122,122,122,122,,,,122,122,123,123,123', ',123,,,122,123,123,,,,123,,123,123,123,123,123,123,123,,,,,,123,123', '123,123,123,123,123,,,123,,,,,,,123,,,123,123,123,123,123,123,123,123', ',123,123,123,,123,123,,123,123,123,,,,,,,,,,,,,,,,,,,,123,,,123,,,123', '123,,,123,,,,,,123,,,,,,,,123,,,,,123,123,123,123,123,123,,,,123,123', '124,124,124,,124,,,123,124,124,,,,124,,124,124,124,124,124,124,124,', ',,,,124,124,124,124,124,124,124,,,124,,,,,,,124,,,124,124,124,124,124', '124,124,124,,124,124,124,,124,124,,124,124,124,,,,,,,,,,,,,,,,,,,,124', ',,124,,,124,124,,,124,,,,,,124,,,,,,,,124,,,,,124,124,124,124,124,124', ',,,124,124,125,125,125,,125,,,124,125,125,,,,125,,125,125,125,125,125', '125,125,,,,,,125,125,125,125,125,125,125,,,125,,,,,,,125,,,125,125,125', '125,125,125,125,125,,125,125,125,,125,125,,125,125,125,,,,,,,,,,,,,', ',,,,,,125,,,125,,,125,125,,,125,,,,,,125,,,,,,,,125,,,,,125,125,125', '125,125,125,,,,125,125,126,126,126,,126,,,125,126,126,,,,126,,126,126', '126,126,126,126,126,,,,,,126,126,126,126,126,126,126,,,126,,,,,,,126', ',,126,126,126,126,126,126,126,126,,126,126,126,,126,126,,126,126,126', ',,,,,,,,,,,,,,,,,,,126,,,126,,,126,126,,,126,,,,,,126,,,,,,,,126,,,', ',126,126,126,126,126,126,,,,126,126,127,127,127,,127,,,126,127,127,', ',,127,,127,127,127,127,127,127,127,,,,,,127,127,127,127,127,127,127', ',,127,,,,,,,127,,,127,127,127,127,127,127,127,127,,127,127,127,,127', '127,,127,127,127,,,,,,,,,,,,,,,,,,,,127,,,127,,,127,127,,,127,,,,,,127', ',,,,,,,127,,,,,127,127,127,127,127,127,,,,127,127,128,128,128,,128,', ',127,128,128,,,,128,,128,128,128,128,128,128,128,,,,,,128,128,128,128', '128,128,128,,,128,,,,,,,128,,,128,128,128,128,128,128,128,128,,128,128', '128,,128,128,,128,128,128,,,,,,,,,,,,,,,,,,,,128,,,128,,,128,128,,,128', ',,,,,128,,,,,,,,128,,,,,128,128,128,128,128,128,,,,128,128,129,129,129', ',129,,,128,129,129,,,,129,,129,129,129,129,129,129,129,,,,,,129,129', '129,129,129,129,129,,,129,,,,,,,129,,,129,129,129,129,129,129,129,129', ',129,129,129,,129,129,,129,129,129,,,,,,,,,,,,,,,,,,,,129,,,129,,,129', '129,,,129,,,,,,129,,,,,,,,129,,,,,129,129,129,129,129,129,,,,129,129', '130,130,130,,130,,,129,130,130,,,,130,,130,130,130,130,130,130,130,', ',,,,130,130,130,130,130,130,130,,,130,,,,,,,130,,,130,130,130,130,130', '130,130,130,,130,130,130,,130,130,,130,130,130,,,,,,,,,,,,,,,,,,,,130', ',,130,,,130,130,,,130,,,,,,130,,,,,,,,130,,,,,130,130,130,130,130,130', ',,,130,130,131,131,131,,131,,,130,131,131,,,,131,,131,131,131,131,131', '131,131,,,,,,131,131,131,131,131,131,131,,,131,,,,,,,131,,,131,131,131', '131,131,131,131,131,,131,131,131,,131,131,,131,131,131,,,,,,,,,,,,,', ',,,,,,131,,,131,,,131,131,,,131,,,,,,131,,,,,,,,131,,,,,131,131,131', '131,131,131,,,,131,131,132,132,132,,132,,,131,132,132,,,,132,,132,132', '132,132,132,132,132,,,,,,132,132,132,132,132,132,132,,,132,,,,,,,132', ',,132,132,132,132,132,132,132,132,,132,132,132,,132,132,,132,132,132', ',,,,,,,,,,,,,,,,,,,132,,,132,,,132,132,,,132,,,,,,132,,,,,,,,132,,,', ',132,132,132,132,132,132,,,,132,132,133,133,133,,133,,,132,133,133,', ',,133,,133,133,133,133,133,133,133,,,,,,133,133,133,133,133,133,133', ',,133,,,,,,,133,,,133,133,133,133,133,133,133,133,,133,133,133,,133', '133,,133,133,133,,,,,,,,,,,,,,,,,,,,133,,,133,,,133,133,,,133,,,,,,133', ',,,,,,,133,,,,,133,133,133,133,133,133,,,,133,133,134,134,134,,134,', ',133,134,134,,,,134,,134,134,134,134,134,134,134,,,,,,134,134,134,134', '134,134,134,,,134,,,,,,,134,,,134,134,134,134,134,134,134,134,,134,134', '134,,134,134,,134,134,134,,,,,,,,,,,,,,,,,,,,134,,,134,,,134,134,,,134', ',,,,,134,,,,,,,,134,,,,,134,134,134,134,134,134,,,,134,134,135,135,135', ',135,,,134,135,135,,,,135,,135,135,135,135,135,135,135,,,,,,135,135', '135,135,135,135,135,,,135,,,,,,,135,,,135,135,135,135,135,135,135,135', ',135,135,135,,135,135,,135,135,135,,,,,,,,,,,,,,,,,,,,135,,,135,,,135', '135,,,135,,,,,,135,,,,,,,,135,,,,,135,135,135,135,135,135,,,,135,135', '136,136,136,,136,,,135,136,136,,,,136,,136,136,136,136,136,136,136,', ',,,,136,136,136,136,136,136,136,,,136,,,,,,,136,,,136,136,136,136,136', '136,136,136,,136,136,136,,136,136,,136,136,136,,,,,,,,,,,,,,,,,,,,136', ',,136,,,136,136,,,136,,,,,,136,,,,,,,,136,,,,,136,136,136,136,136,136', ',,,136,136,137,137,137,,137,,,136,137,137,,,,137,,137,137,137,137,137', '137,137,,,,,,137,137,137,137,137,137,137,,,137,,,,,,,137,,,137,137,137', '137,137,137,137,137,,137,137,137,,137,137,,137,137,137,,,,,,,,,,,,,', ',,,,,,137,,,137,,,137,137,,,137,,,,,,137,,,,,,,,137,,,,,137,137,137', '137,137,137,,,,137,137,138,138,138,,138,,,137,138,138,,,,138,,138,138', '138,138,138,138,138,,,,,,138,138,138,138,138,138,138,,,138,,,,,,,138', ',,138,138,138,138,138,138,138,138,,138,138,138,,138,138,,138,138,138', ',,,,,,,,,,,,,,,,,,,138,,,138,,,138,138,,,138,,,,,,138,,,,,,,,138,,,', ',138,138,138,138,138,138,,,,138,138,139,139,139,,139,,,138,139,139,', ',,139,,139,139,139,139,139,139,139,,,,,,139,139,139,139,139,139,139', ',,139,,,,,,,139,,,139,139,139,139,139,139,139,139,,139,139,139,,139', '139,,139,139,139,,,,,,,,,,,,,,,,,,,,139,,,139,,,139,139,,,139,,,,,,139', ',,,,,,,139,,,,,139,139,139,139,139,139,,,,139,139,140,140,140,,140,', ',139,140,140,,,,140,,140,140,140,140,140,140,140,,,,,,140,140,140,140', '140,140,140,,,140,,,,,,,140,,,140,140,140,140,140,140,140,140,,140,140', '140,,140,140,,140,140,140,,,,,,,,,,,,,,,,,,,,140,,,140,,,140,140,,,140', ',,,,,140,,,,,,,,140,,,,,140,140,140,140,140,140,,,,140,140,141,141,141', ',141,,,140,141,141,,,,141,,141,141,141,141,141,141,141,,,,,,141,141', '141,141,141,141,141,,,141,,,,,,,141,,,141,141,141,141,141,141,141,141', ',141,141,141,,141,141,,141,141,141,,,,,,,,,,,,,,,,,,,,141,,,141,,,141', '141,,,141,,,,,,141,,,,,,,,141,,,,,141,141,141,141,141,141,,,,141,141', '142,142,142,,142,,,141,142,142,,,,142,,142,142,142,142,142,142,142,', ',,,,142,142,142,142,142,142,142,,,142,,,,,,,142,,,142,142,142,142,142', '142,142,142,,142,142,142,,142,142,,142,142,142,,,,,,,,,,,,,,,,,,,,142', ',,142,,,142,142,,,142,,,,,,142,,,,,,,,142,,,,,142,142,142,142,142,142', ',,,142,142,143,143,143,,143,,,142,143,143,,,,143,,143,143,143,143,143', '143,143,,,,,,143,143,143,143,143,143,143,,,143,,,,,,,143,,,143,143,143', '143,143,143,143,143,,143,143,143,,143,143,,143,143,143,,,,,,,,,,,,,', ',,,,,,143,,,143,,,143,143,,,143,,,,,,143,,,,,,,,143,,,,,143,143,143', '143,143,143,,,,143,143,144,144,144,,144,,,143,144,144,,,,144,,144,144', '144,144,144,144,144,,,,,,144,144,144,144,144,144,144,,,144,,,,,,,144', ',,144,144,144,144,144,144,144,144,,144,144,144,,144,144,,144,144,144', ',,,,,,,,,,,,,,,,,,,144,,,144,,,144,144,,,144,,,,,,144,,,,,,,,144,,,', ',144,144,144,144,144,144,,,,144,144,145,145,145,,145,,,144,145,145,', ',,145,,145,145,145,145,145,145,145,,,,,,145,145,145,145,145,145,145', ',,145,,,,,,,145,,,145,145,145,145,145,145,145,145,,145,145,145,,145', '145,,145,145,145,,,,,,,,,,,,,,,,,,,,145,,,145,,,145,145,,,145,,,,,,145', ',,,,,,,145,,,,,145,145,145,145,145,145,,,,145,145,146,146,146,,146,', ',145,146,146,,,,146,,146,146,146,146,146,146,146,,,,,,146,146,146,146', '146,146,146,,,146,,,,,,,146,,,146,146,146,146,146,146,146,146,,146,146', '146,,146,146,,146,146,146,,,,,,,,,,,,,,,,,,,,146,,,146,,,146,146,,,146', ',,,,,146,,,,,,,,146,,,,,146,146,146,146,146,146,,,,146,146,147,147,147', ',147,,,146,147,147,,,,147,,147,147,147,147,147,147,147,,,,,,147,147', '147,147,147,147,147,,,147,,,,,,,147,,,147,147,147,147,147,147,147,147', ',147,147,147,,147,147,,147,147,147,,,,,,,,,,,,,,,,,,,,147,,,147,,,147', '147,,,147,,,,,,147,,,,,,,,147,,,,,147,147,147,147,147,147,,,,147,147', '148,148,148,,148,,,147,148,148,,,,148,,148,148,148,148,148,148,148,', ',,,,148,148,148,148,148,148,148,,,148,,,,,,,148,,,148,148,148,148,148', '148,148,148,,148,148,148,,148,148,,148,148,148,,,,,,,,,,,,,,,,,,,,148', ',,148,,,148,148,,,148,,,,,,148,,,,,,,,148,,,,,148,148,148,148,148,148', ',,,148,148,148,150,150,150,,150,,148,,150,150,,,,150,,150,150,150,150', '150,150,150,,,,,,150,150,150,150,150,150,150,,,150,,,,,,,150,,,150,150', '150,150,150,150,150,150,,150,150,150,,150,150,,150,150,150,,,,,,,,,', ',,,,,,,,,,150,,,150,,,150,150,,,150,152,,152,152,152,150,152,,,,,,,150', ',,,493,150,150,150,150,150,150,493,493,493,150,150,493,493,493,,493', ',,150,,152,152,,,,493,,,,152,152,152,152,,,493,493,,493,493,493,493', '493,,,,,,278,278,,,278,,,,,,,,,278,278,,278,278,278,278,278,278,278', ',,278,278,,,493,278,278,278,278,,,493,,,,,493,493,,,,,278,278,,278,278', '278,278,278,278,278,278,278,278,278,,,278,493,,,,,,688,688,688,,688', ',,493,688,688,,,493,688,,688,688,688,688,688,688,688,,,,,,688,688,688', '688,688,688,688,,,688,,,,,,,688,,,688,688,688,688,688,688,688,688,,688', '688,688,,688,688,,688,688,688,,,,,,,,,,,,,,,,,,,,688,,,688,,,688,688', ',,688,,,,,,688,,,,,,,,688,,,,,688,688,688,688,688,688,,,,688,688,689', '689,689,,689,,,688,689,689,,,,689,,689,689,689,689,689,689,689,,,,,', '689,689,689,689,689,689,689,,,689,,,,,,,689,,,689,689,689,689,689,689', '689,689,,689,689,689,,689,689,,689,689,689,,,,,,,,,,,,,,,,,,,,689,,', '689,,,689,689,,,689,,,,,,689,,,,,,,,689,,,,,689,689,689,689,689,689', ',,,689,689,567,567,567,567,567,,,689,567,567,,,,567,,567,567,567,567', '567,567,567,,,,,,567,567,567,567,567,567,567,,,567,,,,,,567,567,,567', '567,567,567,567,567,567,567,567,,567,567,567,,567,567,,567,567,567,', ',,,,,,,,,,,,,,,,,,567,,,567,,,567,567,,,567,,567,,,,567,,,,,,,,567,', ',,,567,567,567,567,567,567,,,,567,567,775,775,775,,775,567,,567,775', '775,,,,775,,775,775,775,775,775,775,775,,,,,,775,775,775,775,775,775', '775,,,775,,,,,,,775,,,775,775,775,775,775,775,775,775,,775,775,775,', '775,775,,775,775,775,,,,,,,,,,,,,,,,,,,,775,,,775,,,775,775,,,775,,', ',,,775,,,,,,,,775,,,,,775,775,775,775,775,775,,,,775,775,240,240,240', ',240,,,775,240,240,,,,240,,240,240,240,240,240,240,240,,,,,,240,240', '240,240,240,240,240,,,240,,,,,,,240,,,240,240,240,240,240,240,240,240', ',240,240,240,,240,240,,240,240,240,,,,,,,,,,,,,,,,,,,,240,,,240,,,240', '240,,,240,,,,,,240,,,,,,,,240,,,,,240,240,240,240,240,240,,,,240,240', '241,241,241,,241,,,240,241,241,,,,241,,241,241,241,241,241,241,241,', ',,,,241,241,241,241,241,241,241,,,241,,,,,,,241,,,241,241,241,241,241', '241,241,241,,241,241,241,,241,241,,241,241,241,,,,,,,,,,,,,,,,,,,,241', ',,241,,,241,241,,,241,,,,,,241,,,,,,,,241,,,,,241,241,241,241,241,241', ',,,241,241,500,500,500,,500,,,241,500,500,,,,500,,500,500,500,500,500', '500,500,,,,,,500,500,500,500,500,500,500,,,500,,,,,,,500,,,500,500,500', '500,500,500,500,500,,500,500,500,,500,500,,500,500,500,,,,,,,,,,,,,', ',,,,,,500,,,500,,,500,500,,,500,,,,,,500,,,,,,,,500,,,,,500,500,500', '500,500,500,,,,500,500,52,52,52,,52,,,500,52,52,,,,52,,52,52,52,52,52', '52,52,,,,,,52,52,52,52,52,52,52,,,52,,,,,,,52,,,52,52,52,52,52,52,52', '52,,52,52,52,,52,52,,52,52,52,,,,,,,,,,,,,,,,,,,,52,,,52,,,52,52,,,52', ',,,,,52,,,,,,,,52,,,,,52,52,52,52,52,52,,,,52,52,694,694,694,,694,,', '52,694,694,,,,694,,694,694,694,694,694,694,694,,,,,,694,694,694,694', '694,694,694,,,694,,,,,,,694,,,694,694,694,694,694,694,694,694,694,694', '694,694,,694,694,,694,694,694,,,,,,,,,,,,,,,,,,,,694,,,694,,,694,694', ',,694,,694,,694,,694,,,,,,,,694,,,,,694,694,694,694,694,694,,,,694,694', '579,579,579,,579,,,694,579,579,,,,579,,579,579,579,579,579,579,579,', ',,,,579,579,579,579,579,579,579,,,579,,,,,,,579,,,579,579,579,579,579', '579,579,579,,579,579,579,,579,579,,,,579,,,,,,,,,,,,,,,,,,,,579,,,579', ',,579,579,,,579,,,,,,,,,,,,,,,,,,,579,579,579,579,579,579,,,,579,579', '48,48,48,,48,,,579,48,48,,,,48,,48,48,48,48,48,48,48,,,,,,48,48,48,48', '48,48,48,,,48,,,,,,,48,,,48,48,48,48,48,48,48,48,,48,48,48,,48,48,,48', '48,48,,,,,,,,,,,,,,,,,,,,48,,,48,,,48,48,,,48,,,,,,48,,,,,,,,48,,,,', '48,48,48,48,48,48,,,,48,48,45,45,45,,45,,,48,45,45,,,,45,,45,45,45,45', '45,45,45,,,,,,45,45,45,45,45,45,45,,,45,,,,,,,45,,,45,45,45,45,45,45', '45,45,,45,45,45,,45,45,,45,45,45,,,,,,,,,,,,,,,,,,,,45,,,45,,,45,45', ',,45,,,,,,45,,,,,,,,45,,,,,45,45,45,45,45,45,,,,45,45,715,715,715,,715', ',,45,715,715,,,,715,,715,715,715,715,715,715,715,,,,,,715,715,715,715', '715,715,715,,,715,,,,,,,715,,,715,715,715,715,715,715,715,715,,715,715', '715,,715,715,,715,715,715,,,,,,,,,,,,,,,,,,,,715,,,715,,,715,715,,,715', ',,,,,715,,,,,,,,715,,,,,715,715,715,715,715,715,,,,715,715,662,662,662', ',662,,,715,662,662,,,,662,,662,662,662,662,662,662,662,,,,,,662,662', '662,662,662,662,662,,,662,,,,,,,662,,,662,662,662,662,662,662,662,662', ',662,662,662,,662,662,,,,662,,,,,,,,,,,,,,,,,,,,662,,,662,,,662,662', ',,662,,,,,,,,,,,,,,,,,,,662,662,662,662,662,662,,,,662,662,760,760,760', ',760,,,662,760,760,,,,760,,760,760,760,760,760,760,760,,,,,,760,760', '760,760,760,760,760,,,760,,,,,,,760,,,760,760,760,760,760,760,760,760', ',760,760,760,,760,760,,760,760,760,,,,,,,,,,,,,,,,,,,,760,,,760,,,760', '760,,,760,,,,,,760,,,,,,,,760,,,,,760,760,760,760,760,760,,,,760,760', '253,253,253,,253,,,760,253,253,,,,253,,253,253,253,253,253,253,253,', ',,,,253,253,253,253,253,253,253,,,253,,,,,,,253,,,253,253,253,253,253', '253,253,253,,253,253,253,,253,253,,253,253,253,,,,,,,,,,,,,,,,,,,,253', ',,253,,,253,253,,,253,,,,,,253,,,,,,,,253,,,,,253,253,253,253,253,253', ',,,253,253,254,254,254,,254,,,253,254,254,,,,254,,254,254,254,254,254', '254,254,,,,,,254,254,254,254,254,254,254,,,254,,,,,,,254,,,254,254,254', '254,254,254,254,254,,254,254,254,,254,254,,254,254,254,,,,,,,,,,,,,', ',,,,,,254,,,254,,,254,254,,,254,,,,,,254,,,,,,,,254,,,,,254,254,254', '254,254,254,,,,254,254,814,814,814,,814,,,254,814,814,,,,814,,814,814', '814,814,814,814,814,,,,,,814,814,814,814,814,814,814,,,814,,,,,,,814', ',,814,814,814,814,814,814,814,814,,814,814,814,,814,814,,814,814,814', ',,,,,,,,,,,,,,,,,,,814,,,814,,,814,814,,,814,,,,,,814,,,,,,,,814,,,', ',814,814,814,814,814,814,,,,814,814,717,717,717,,717,,,814,717,717,', ',,717,,717,717,717,717,717,717,717,,,,,,717,717,717,717,717,717,717', ',,717,,,,,,,717,,,717,717,717,717,717,717,717,717,,717,717,717,,717', '717,,,,717,,,,,,,,,,,,,,,,,,,,717,,,717,,,717,717,,,717,,,,,,,,,,,,', ',,,,,,717,717,717,717,717,717,,,,717,717,511,511,511,,511,,,717,511', '511,,,,511,,511,511,511,511,511,511,511,,,,,,511,511,511,511,511,511', '511,,,511,,,,,,,511,,,511,511,511,511,511,511,511,511,,511,511,511,', '511,511,,511,511,511,,,,,,,,,,,,,,,,,,,,511,,,511,,,511,511,,,511,,', ',,,511,,,,,,,,511,,,,,511,511,511,511,511,511,,,,511,511,759,759,759', ',759,,,511,759,759,,,,759,,759,759,759,759,759,759,759,,,,,,759,759', '759,759,759,759,759,,,759,,,,,,,759,,,759,759,759,759,759,759,759,759', ',759,759,759,,759,759,,759,759,759,,,,,,,,,,,,,,,,,,,,759,,,759,,,759', '759,,,759,,,,,,759,,,,,,,,759,,,,,759,759,759,759,759,759,,,,759,759', '592,592,592,,592,,,759,592,592,,,,592,,592,592,592,592,592,592,592,', ',,,,592,592,592,592,592,592,592,,,592,,,,,,,592,,,592,592,592,592,592', '592,592,592,592,592,592,592,,592,592,,592,592,592,,,,,,,,,,,,,,,,,,', ',592,,,592,,,592,592,,,592,,592,,,,592,,,,,,,,592,,,,,592,592,592,592', '592,592,,,,592,592,267,267,267,,267,,,592,267,267,,,,267,,267,267,267', '267,267,267,267,,,,,,267,267,267,267,267,267,267,,,267,,,,,,,267,,,267', '267,267,267,267,267,267,267,,267,267,267,,267,267,,,,267,,,,,,,,,,,', ',,,,,,,,267,,,267,,,267,267,,,267,,,,,,,,,,,,,,,,,,,267,267,267,267', '267,267,,,,267,267,757,757,757,,757,,,267,757,757,,,,757,,757,757,757', '757,757,757,757,,,,,,757,757,757,757,757,757,757,,,757,,,,,,,757,,,757', '757,757,757,757,757,757,757,,757,757,757,,757,757,,757,757,757,,,,,', ',,,,,,,,,,,,,,757,,,757,,,757,757,,,757,,,,,,757,,,,,,,,757,,,,,757', '757,757,757,757,757,,,,757,757,269,269,269,,269,,,757,269,269,,,,269', ',269,269,269,269,269,269,269,,,,,,269,269,269,269,269,269,269,,,269', ',,,,,,269,,,269,269,269,269,269,269,269,269,,269,269,269,,269,269,,', ',269,,,,,,,,,,,,,,,,,,,,269,,,269,,,269,269,,,269,,,,,,,,,,,,,,,,,,', '269,269,269,269,269,269,,,,269,269,852,852,852,,852,,,269,852,852,,', ',852,,852,852,852,852,852,852,852,,,,,,852,852,852,852,852,852,852,', ',852,,,,,,,852,,,852,852,852,852,852,852,852,852,,852,852,852,,852,852', ',852,852,852,,,,,,,,,,,,,,,,,,,,852,,,852,,,852,852,,,852,,,,,,852,', ',,,,,,852,,,,,852,852,852,852,852,852,,,,852,852,521,521,521,,521,,', '852,521,521,,,,521,,521,521,521,521,521,521,521,,,,,,521,521,521,521', '521,521,521,,,521,,,,,,,521,,,521,521,521,521,521,521,521,521,,521,521', '521,,521,521,,521,521,521,,,,,,,,,,,,,,,,,,,,521,,,521,,,521,521,,,521', ',,,,,521,,,,,,,,521,,,,,521,521,521,521,521,521,,,,521,521,756,756,756', ',756,,,521,756,756,,,,756,,756,756,756,756,756,756,756,,,,,,756,756', '756,756,756,756,756,,,756,,,,,,,756,,,756,756,756,756,756,756,756,756', ',756,756,756,,756,756,,756,756,756,,,,,,,,,,,,,,,,,,,,756,,,756,,,756', '756,,,756,,,,,,756,,,,,,,,756,,,,,756,756,756,756,756,756,,,,756,756', '651,651,651,,651,,,756,651,651,,,,651,,651,651,651,651,651,651,651,', ',,,,651,651,651,651,651,651,651,,,651,,,,,,,651,,,651,651,651,651,651', '651,651,651,651,651,651,651,,651,651,,651,651,651,,,,,,,,,,,,,,,,,,', ',651,,,651,,,651,651,,,651,,651,,651,,651,,,,,,,,651,,,,,651,651,651', '651,651,651,,,,651,651,382,382,382,,382,,,651,382,382,,,,382,,382,382', '382,382,382,382,382,,,,,,382,382,382,382,382,382,382,,,382,,,,,,,382', ',,382,382,382,382,382,382,382,382,382,382,382,382,,382,382,,382,382', '382,,,,,,,,,,,,,,,,,,,,382,,,382,,,382,382,,,382,,382,,382,,382,,,,', ',,,382,,,,,382,382,382,382,382,382,,,,382,382,545,545,545,,545,,,382', '545,545,,,,545,,545,545,545,545,545,545,545,,,,,,545,545,545,545,545', '545,545,,,545,,,,,,,545,,,545,545,545,545,545,545,545,545,,545,545,545', ',545,545,,545,545,545,,,,,,,,,,,,,,,,,,,,545,,,545,,,545,545,,,545,', ',,,,545,,,,,,,,545,,,,,545,545,545,545,545,545,,,,545,545,379,379,379', ',379,,,545,379,379,,,,379,,379,379,379,379,379,379,379,,,,,,379,379', '379,379,379,379,379,,,379,,,,,,,379,,,379,379,379,379,379,379,379,379', ',379,379,379,,379,379,,379,379,379,,,,,,,,,,,,,,,,,,,,379,,,379,,,379', '379,,,379,,,,,,379,,,,,,,,379,,,,,379,379,379,379,379,379,,,,379,379', '602,602,602,,602,,,379,602,602,,,,602,,602,602,602,602,602,602,602,', ',,,,602,602,602,602,602,602,602,,,602,,,,,,,602,,,602,602,602,602,602', '602,602,602,,602,602,602,,602,602,,602,602,602,,,,,,,,,,,,,,,,,,,,602', ',,602,,,602,602,,,602,,,,,,602,,,,,,,,602,,,,,602,602,602,602,602,602', ',,,602,602,374,374,374,,374,,,602,374,374,,,,374,,374,374,374,374,374', '374,374,,,,,,374,374,374,374,374,374,374,,,374,,,,,,,374,,,374,374,374', '374,374,374,374,374,,374,374,374,,374,374,,374,374,374,,,,,,,,,,,,,', ',,,,,,374,,,374,,,374,374,,,374,,,,,,374,,,,,,,,374,,,,,374,374,374', '374,374,374,,,,374,374,372,372,372,,372,,,374,372,372,,,,372,,372,372', '372,372,372,372,372,,,,,,372,372,372,372,372,372,372,,,372,,,,,,,372', ',,372,372,372,372,372,372,372,372,,372,372,372,,372,372,,372,372,372', ',,,,,,,,,,,,,,,,,,,372,,,372,,,372,372,,,372,,,,,,372,,,,,,,,372,,,', ',372,372,372,372,372,372,,,,372,372,371,371,371,,371,,,372,371,371,', ',,371,,371,371,371,371,371,371,371,,,,,,371,371,371,371,371,371,371', ',,371,,,,,,,371,,,371,371,371,371,371,371,371,371,,371,371,371,,371', '371,,371,371,371,,,,,,,,,,,,,,,,,,,,371,,,371,,,371,371,,,371,,,,,,371', ',,,,,,,371,,,,,371,371,371,371,371,371,,,,371,371,720,720,720,,720,', ',371,720,720,,,,720,,720,720,720,720,720,720,720,,,,,,720,720,720,720', '720,720,720,,,720,,,,,,,720,,,720,720,720,720,720,720,720,720,,720,720', '720,,720,720,,720,720,720,,,,,,,,,,,,,,,,,,,,720,,,720,,,720,720,,,720', ',720,,,,720,,,,,,,,720,,,,,720,720,720,720,720,720,,,,720,720,634,634', '634,,634,,,720,634,634,,,,634,,634,634,634,634,634,634,634,,,,,,634', '634,634,634,634,634,634,,,634,,,,,,,634,,,634,634,634,634,634,634,634', '634,,634,634,634,,634,634,,634,634,634,,,,,,,,,,,,,,,,,,,,634,,,634', ',,634,634,,,634,,,,,,634,,,,,,,,634,,,,,634,634,634,634,634,634,,,,634', '634,695,695,695,,695,,,634,695,695,,,,695,,695,695,695,695,695,695,695', ',,,,,695,695,695,695,695,695,695,,,695,,,,,,,695,,,695,695,695,695,695', '695,695,695,695,695,695,695,,695,695,,695,695,695,,,,,,,,,,,,,,,,,,', ',695,,,695,,,695,695,,,695,,,,695,,695,,,,,,,,695,,,,,695,695,695,695', '695,695,,,,695,695,696,696,696,,696,,,695,696,696,,,,696,,696,696,696', '696,696,696,696,,,,,,696,696,696,696,696,696,696,,,696,,,,,,,696,,,696', '696,696,696,696,696,696,696,,696,696,696,,696,696,,696,696,696,,,,,', ',,,,,,,,,,,,,,696,,,696,,,696,696,,,696,,,,,,696,,,,,,,,696,,,,,696', '696,696,696,696,696,,,,696,696,861,861,861,,861,,,696,861,861,,,,861', ',861,861,861,861,861,861,861,,,,,,861,861,861,861,861,861,861,,,861', ',,,,,,861,,,861,861,861,861,861,861,861,861,,861,861,861,,861,861,,', ',861,,,,,,,,,,,,,,,,,,,,861,,,861,,,861,861,,,861,,,,,,,,,,,,,,,,,,', '861,861,861,861,861,861,,,,861,861,730,730,730,,730,,,861,730,730,,', ',730,,730,730,730,730,730,730,730,,,,,,730,730,730,730,730,730,730,', ',730,,,,,,,730,,,730,730,730,730,730,730,730,730,,730,730,730,,730,730', ',730,730,730,,,,,,,,,,,,,,,,,,,,730,,,730,,,730,730,,,730,,,,,,730,', ',,,,,,730,,,,,730,730,730,730,730,730,,,,730,730,26,26,26,,26,,,730', '26,26,,,,26,,26,26,26,26,26,26,26,,,,,,26,26,26,26,26,26,26,,,26,,,', ',,,26,,,26,26,26,26,26,26,26,26,,26,26,26,,26,26,,,,26,,,,,,,,,,,,,', ',,,,,,26,,,26,,,26,26,,,26,,,,,,,,,,,,,,,,,,530,26,26,26,26,26,26,530', '530,530,26,26,530,530,530,26,530,,,26,,,,,,530,530,530,,,,,,,,,530,530', ',530,530,530,530,530,,,,,,,,,,,,,,,,,,,,,,,,530,530,530,530,530,530', '530,530,530,530,530,530,530,530,,,530,530,530,,,530,,530,530,,,530,530', ',530,,530,,530,,530,530,530,530,530,530,530,,530,530,530,,,,,,,,,,,', ',530,530,,530,,530,625,625,625,,625,,,,625,625,,,,625,,625,625,625,625', '625,625,625,,,,,,625,625,625,625,625,625,625,,,625,,,,,,,625,,,625,625', '625,625,625,625,625,625,,625,625,625,,625,625,,625,625,625,,,,,,,,,', ',,,,,,,,,,625,,,625,,,625,625,,,625,,,,,,625,,,,,,,,625,,,,,625,625', '625,625,625,625,,,,625,625,362,362,362,,362,,,625,362,362,,,,362,,362', '362,362,362,362,362,362,,,,,,362,362,362,362,362,362,362,,,362,,,,,', ',362,,,362,362,362,362,362,362,362,362,,362,362,362,,362,362,,,,362', ',,,,,,,,,,,,,,,,,,,362,,,362,,,362,362,,,362,,,,,,,,,,,,,,,,,,,362,362', '362,362,362,362,,,,362,362,346,346,346,362,346,,,362,346,346,,,,346', ',346,346,346,346,346,346,346,,,,,,346,346,346,346,346,346,346,,,346', ',,,,,,346,,,346,346,346,346,346,346,346,346,346,346,346,346,,346,346', ',346,346,346,,,,,,,,,,,,,,,,,,,,346,,,346,,,346,346,,,346,,346,,346', ',346,,,,,,,,346,,,,,346,346,346,346,346,346,,,,346,346,872,872,872,', '872,,,346,872,872,,,,872,,872,872,872,872,872,872,872,,,,,,872,872,872', '872,872,872,872,,,872,,,,,,,872,,,872,872,872,872,872,872,872,872,,872', '872,872,,872,872,,,,872,,,,,,,,,,,,,,,,,,,,872,,,872,,,872,872,,,872', ',,,,,,,,,,,,,,,,,,872,872,872,872,872,872,,,,872,872,19,19,19,,19,,', '872,19,19,,,,19,,19,19,19,19,19,19,19,,,,,,19,19,19,19,19,19,19,,,19', ',,,,,,19,,,19,19,19,19,19,19,19,19,19,19,19,19,,19,19,,19,19,19,,,,', ',,,,,,,,,,,,,,,19,,,19,,,19,19,,,19,,19,,19,,19,,,,,,,,19,,,,,19,19', '19,19,19,19,,,,19,19,16,16,16,16,16,,,19,16,16,,,,16,,16,16,16,16,16', '16,16,,,,,,16,16,16,16,16,16,16,,,16,,,,,,16,16,16,16,16,16,16,16,16', '16,16,16,,16,16,16,,16,16,,16,16,16,,,,,,,,,,,,,,,,,,,,16,,,16,,,16', '16,,,16,,16,,,,16,,,,,,,,16,,,,,16,16,16,16,16,16,,,,16,16,807,807,807', ',807,,,16,807,807,,,,807,,807,807,807,807,807,807,807,,,,,,807,807,807', '807,807,807,807,,,807,,,,,,,807,,,807,807,807,807,807,807,807,807,,807', '807,807,,807,807,,807,807,807,,,,,,,,,,,,,,,,,,,,807,,,807,,,807,807', ',,807,,,,,,807,,,,,,,,807,,,,,807,807,807,807,807,807,,,,807,807,309', '309,309,,309,,,807,309,309,,,,309,,309,309,309,309,309,309,309,,,,,', '309,309,309,309,309,309,309,,,309,,,,,,,309,,,309,309,309,309,309,309', '309,309,,309,309,309,,309,309,,309,309,309,,,,,,,,,,,,,,,,,,,,309,,', '309,,,309,309,,,309,,309,,,,309,,,,,,,,309,,,,,309,309,309,309,309,309', ',,,309,309,13,13,13,,13,,,309,13,13,,,,13,,13,13,13,13,13,13,13,,,,', ',13,13,13,13,13,13,13,,,13,,,,,,,13,,,13,13,13,13,13,13,13,13,13,13', '13,13,,13,13,,13,13,13,,,,,,,,,,,,,,,,,,,,13,,,13,,,13,13,,,13,,,,,', '13,,,,,,,,13,,,,,13,13,13,13,13,13,,,,13,13,314,314,314,,314,,,13,314', '314,,,,314,,314,314,314,314,314,314,314,,,,,,314,314,314,314,314,314', '314,,,314,,,,,,,314,,,314,314,314,314,314,314,314,314,,314,314,314,', '314,314,,314,314,314,,,,,,,,,,,,,,,,,,,,314,,,314,314,,314,314,,,314', ',,,,,314,,,,,,,,314,,,,,314,314,314,314,314,314,,,,314,314,889,889,889', ',889,,,314,889,889,,,,889,,889,889,889,889,889,889,889,,,,,,889,889', '889,889,889,889,889,,,889,,,,,,,889,,,889,889,889,889,889,889,889,889', ',889,889,889,,889,889,,889,889,889,,,,,,,,,,,,,,,,,,,,889,,,889,,,889', '889,,,889,,889,,,,889,,,,,,,,889,,,,,889,889,889,889,889,889,,,,889', '889,316,316,316,316,316,,,889,316,316,,,,316,,316,316,316,316,316,316', '316,,,,,,316,316,316,316,316,316,316,,,316,,,,,,316,316,316,316,316', '316,316,316,316,316,316,316,,316,316,316,,316,316,,316,316,316,,,,,', ',,,,,,,,,,,,,,316,,,316,,,316,316,,,316,,316,,,,316,,,,,,,,316,,,,,316', '316,316,316,316,316,,,,316,316,321,321,321,,321,316,,316,321,321,,,', '321,,321,321,321,321,321,321,321,,,,,,321,321,321,321,321,321,321,,', '321,,,,,,,321,,,321,321,321,321,321,321,321,321,,321,321,321,,321,321', ',321,321,321,,,,,,,,,,,,,,,,,,,,321,,,321,,,321,321,,,321,,,,,,321,', ',,,,,,321,,,,,321,321,321,321,321,321,,,,321,321,12,12,12,,12,,,321', '12,12,,,,12,,12,12,12,12,12,12,12,,,,,,12,12,12,12,12,12,12,,,12,,,', ',,,12,,,12,12,12,12,12,12,12,12,12,12,12,12,,12,12,,12,12,12,,,,,,,', ',,,,,,,,,,,,12,,,12,,,12,12,,,12,,12,,12,,12,,,,,,,,12,,,,,12,12,12', '12,12,12,,,,12,12,354,354,354,354,354,,,12,354,354,,,,354,,354,354,354', '354,354,354,354,,,,,,354,354,354,354,354,354,354,,,354,,,,,,354,354', ',354,354,354,354,354,354,354,354,354,,354,354,354,,354,354,,354,354', '354,,,,,,,,,,,,,,,,,,,,354,,,354,,,354,354,,,354,,354,,,,354,,,,,,,', '354,,,,,354,354,354,354,354,354,,,,354,354,325,325,325,,325,,,354,325', '325,,,,325,,325,325,325,325,325,325,325,,,,,,325,325,325,325,325,325', '325,,,325,,,,,,,325,,,325,325,325,325,325,325,325,325,325,325,325,325', ',325,325,,325,325,325,,,,,,,,,,,,,,,,,,,,325,,,325,,,325,325,,,325,', '325,,325,,325,,,,,,,,325,,,,,325,325,325,325,325,325,,,,325,325,697', '697,697,,697,,,325,697,697,,,,697,,697,697,697,697,697,697,697,,,,,', '697,697,697,697,697,697,697,,,697,,,,,,,697,,,697,697,697,697,697,697', '697,697,,697,697,697,,697,697,,697,697,697,,,,,,,,,,,,,,,,,,,,697,,', '697,,,697,697,,,697,,,,,,697,,,,,,,,697,,,,,697,697,697,697,697,697', ',,,697,697,5,5,5,,5,,,697,5,5,,,,5,,5,5,5,5,5,5,5,,,,,,5,5,5,5,5,5,5', ',,5,,,,,,,5,,,5,5,5,5,5,5,5,5,,5,5,5,,5,5,,,,5,,,,,,,,,,,,,,,,,,,,5', ',,5,,,5,5,,,5,,5,,,,,,,,,,,,,,,,,5,5,5,5,5,5,,,,5,5,796,796,796,,796', ',,5,796,796,,,,796,,796,796,796,796,796,796,796,,,,,,796,796,796,796', '796,796,796,,,796,,,,,,,796,,,796,796,796,796,796,796,796,796,,796,796', '796,,796,796,,796,796,796,,,,,,,,,,,,,,,,,,,,796,,,796,,,796,796,,,796', ',,,,,796,,,,,,,,796,,,,,796,796,796,796,796,796,,,,796,796,352,352,352', '352,352,,,796,352,352,,,,352,,352,352,352,352,352,352,352,,,,,,352,352', '352,352,352,352,352,,,352,,,,,,352,352,,352,352,352,352,352,352,352', '352,352,,352,352,352,,352,352,,352,352,352,,,,,,,,,,,,,,,,,,,,352,,', '352,,,352,352,,,352,,352,,,,352,,,,,,,,352,,,,,352,352,352,352,352,352', ',,,352,352,351,351,351,,351,,,352,351,351,,,,351,,351,351,351,351,351', '351,351,,,,,,351,351,351,351,351,351,351,,,351,,,,,,,351,,,351,351,351', '351,351,351,351,351,,351,351,351,,351,351,,351,351,351,,,,,,,,,,,,,', ',,,,,,351,,,351,,,351,351,,,351,,,,,,351,,,,,,,,351,,,,,351,351,351', '351,351,351,,,,351,351,544,544,544,,544,,,351,544,544,,,,544,,544,544', '544,544,544,544,544,,,,,,544,544,544,544,544,544,544,,,544,,,,,,,544', ',,544,544,544,544,544,544,544,544,,544,544,544,,544,544,,544,544,544', ',,,,,,,,,,,,,,,,,,,544,,,544,,,544,544,,,544,,,,,,544,,,,,,,,544,,,', ',544,544,544,544,544,544,,,,544,544,350,350,350,,350,,,544,350,350,', ',,350,,350,350,350,350,350,350,350,,,,,,350,350,350,350,350,350,350', ',,350,,,,,,,350,,,350,350,350,350,350,350,350,350,,350,350,350,,350', '350,,350,350,350,,,,,,,,,,,,,,,,,,,,350,,,350,,,350,350,,,350,,,,,,350', ',,,,,,,350,,,,,350,350,350,350,350,350,,,,350,350,881,881,881,,881,', ',350,881,881,,,,881,,881,881,881,881,881,881,881,,,,,,881,881,881,881', '881,881,881,,,881,,,,,,,881,,,881,881,881,881,881,881,881,881,881,881', '881,881,,881,881,,881,881,881,,,,,,,,,,,,,,,,,,,,881,,,881,,,881,881', ',,881,,,,881,,881,,,,,,,,881,,,,,881,881,881,881,881,881,,,,881,881', '335,335,335,,335,,,881,335,335,,,,335,,335,335,335,335,335,335,335,', ',,,,335,335,335,335,335,335,335,,,335,,,,,,,335,,,335,335,335,335,335', '335,335,335,335,335,335,335,,335,335,,335,335,335,,,,,,,,,,,,,,,,,,', ',335,,,335,,,335,335,,,335,,335,,335,,335,,,,,,,,335,,,,,335,335,335', '335,335,335,,,,335,335,349,349,349,,349,,,335,349,349,,,,349,,349,349', '349,349,349,349,349,,,,,,349,349,349,349,349,349,349,,,349,,,,,,,349', ',,349,349,349,349,349,349,349,349,,349,349,349,,349,349,,349,349,349', ',,,,,,,,,,,,,,,,,,,349,,,349,,,349,349,,,349,,,,,,349,,,,,,,,349,,,', ',349,349,349,349,349,349,,,,349,349,341,341,341,,341,,,349,341,341,', ',,341,,341,341,341,341,341,341,341,,,,,,341,341,341,341,341,341,341', ',,341,,,,,,,341,,,341,341,341,341,341,341,341,341,341,341,341,341,,341', '341,,341,341,341,,,,,,,,,,,,,,,,,,,,341,,,341,,,341,341,,,341,,341,', '341,,341,,,,,,,,341,,,,,341,341,341,341,341,341,,,,341,341,341,348,348', '348,,348,,341,,348,348,,,,348,,348,348,348,348,348,348,348,,,,,,348', '348,348,348,348,348,348,,,348,,,,,,,348,,,348,348,348,348,348,348,348', '348,,348,348,348,,348,348,,348,348,348,,,,,,,,,,,,,,,,,,,,348,,,348', ',,348,348,,,348,,,,,,348,,,,,,,,348,,,,,348,348,348,348,348,348,,,,348', '348,344,344,344,,344,,,348,344,344,,,,344,,344,344,344,344,344,344,344', ',,,,,344,344,344,344,344,344,344,,,344,,,,,,,344,,,344,344,344,344,344', '344,344,344,,344,344,344,,344,344,,344,344,344,,,,,,,,,,,,,,,,,,,,344', ',,344,,,344,344,,,344,,,,,,344,,,,,,,,344,,,,,344,344,344,344,344,344', ',,,344,344,361,361,361,,361,,,344,361,361,,,,361,,361,361,361,361,361', '361,361,,,,,,361,361,361,361,361,361,361,,,361,,,,,573,,361,,,361,361', '361,361,361,361,361,361,,361,361,361,,361,361,,361,361,361,573,573,573', '573,573,573,573,573,573,573,573,,573,573,,,573,573,,361,,,361,,,361', '361,,,361,,361,573,,573,361,573,573,573,573,573,573,573,361,573,,,,361', '361,361,361,361,361,,,,361,361,,573,,573,,,,361,44,44,44,44,44,44,44', '44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,,,,44,44,44,44,44', '44,44,44,44,44,,,,,,44,44,44,44,44,44,44,44,44,44,,44,,,,,,,,,44,44', ',44,44,44,44,44,44,44,,,44,44,,,,44,44,44,44,,,,,,,,,,,,,,44,44,,44', '44,44,44,44,44,44,44,44,44,44,,,44,44,,,,,,,,,,44,677,677,677,677,677', '677,677,677,677,677,677,677,677,677,677,677,677,677,677,677,677,677', '677,677,,,,677,677,677,677,677,677,677,677,677,677,,,,,,677,677,677', '677,677,677,677,677,677,,,677,,,,,,,,,677,677,,677,677,677,677,677,677', '677,,,677,677,,,,677,677,677,677,,,,,,,,,,,,,,677,677,,677,677,677,677', '677,677,677,677,677,677,677,,,677,677,,,,,,,,,,677,516,516,516,516,516', '516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516', '516,516,,,,516,516,516,516,516,516,516,516,516,516,,,,,,516,516,516', '516,516,516,516,516,516,,,516,,,,,,,,,516,516,,516,516,516,516,516,516', '516,,,516,516,,,,516,516,516,516,,,,,,,,,,,,,,516,516,,516,516,516,516', '516,516,516,516,516,516,516,,,516,516,,,,,,,,,,516,36,36,36,36,36,36', '36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,,,,36,36,36,36', '36,36,36,36,36,36,,,,,,36,36,36,36,36,36,36,36,36,,,36,,,,,,,,,36,36', ',36,36,36,36,36,36,36,,,36,36,,,,36,36,36,36,,,,,,,,,,,,,,36,36,,36', '36,36,36,36,36,36,36,36,36,36,,,36,36,,,,,,,,,,36,11,11,11,11,11,11', '11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,,,,11,11,11,11', '11,11,11,11,11,11,,,,,,11,11,11,11,11,11,11,11,11,11,11,11,,11,,,,,', ',11,11,,11,11,11,11,11,11,11,,,11,11,,,,11,11,11,11,,,,,,,,,,,,,,11', '11,,11,11,11,11,11,11,11,11,11,11,11,,,11,670,670,670,670,670,670,670', '670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670', ',,,670,670,670,670,670,670,670,670,670,670,,,,,,670,670,670,670,670', '670,670,670,670,,,670,,,,,,,,,670,670,,670,670,670,670,670,670,670,', ',670,670,,,,670,670,670,670,,,,,,,,,,,,,,670,670,,670,670,670,670,670', '670,670,670,670,670,670,,,670,32,32,32,32,32,32,32,32,32,32,32,32,32', '32,32,32,32,32,32,32,32,32,32,32,,,,32,32,32,32,32,32,32,32,32,32,,', ',,,32,32,32,32,32,32,32,32,32,32,32,32,,32,,,,,,,32,32,,32,32,32,32', '32,32,32,,,32,32,,,,32,32,32,32,,,,,,32,637,,,,,,,32,32,,32,32,32,32', '32,32,32,32,32,32,32,,,32,637,637,637,637,637,637,637,637,637,637,637', ',637,637,,,637,637,,,,,,,,,,,,,,,637,,637,,637,637,637,637,637,637,637', ',637,949,949,,,949,,,,,,,,,949,949,637,949,949,949,949,949,949,949,', ',949,949,,,,949,949,949,949,,,,,,949,,,,,,,,949,949,,949,949,949,949', '949,949,949,949,949,949,949,326,326,949,,326,,,,,,,,,326,326,,326,326', '326,326,326,326,326,,,326,326,,,,326,326,326,326,,,,,,326,,,,,,,,326', '326,,326,326,326,326,326,326,326,326,326,326,326,652,652,326,,652,,', ',,,,,,652,652,,652,652,652,652,652,652,652,,,652,652,,,,652,652,652', '652,,,,,,652,,,,,,,,652,652,,652,652,652,652,652,652,652,652,652,652', '652,953,953,652,,953,,,,,,,,,953,953,,953,953,953,953,953,953,953,,', '953,953,,,,953,953,953,953,,,,,,953,,,,,,,,953,953,,953,953,953,953', '953,953,953,953,953,953,953,481,481,953,,481,,,,,,,,,481,481,,481,481', '481,481,481,481,481,,,481,481,,,,481,481,481,481,,,,,,481,,,,,,,,481', '481,,481,481,481,481,481,481,481,481,481,481,481,483,483,481,,483,,', ',,,,,,483,483,,483,483,483,483,483,483,483,,,483,483,,,,483,483,483', '483,,,,,,483,,,,,,,,483,483,,483,483,483,483,483,483,483,483,483,483', '483,277,277,483,,277,,,,,,,,,277,277,,277,277,277,277,277,277,277,,', '277,277,,,,277,277,277,277,,,,,,,,,,,,,,277,277,,277,277,277,277,277', '277,277,277,277,277,277,324,324,277,,324,,,,,,,,,324,324,,324,324,324', '324,324,324,324,,,324,324,,,,324,324,324,324,,,,,,324,,,,,,,,324,324', ',324,324,324,324,324,324,324,324,324,324,324,464,464,324,,464,,,,,,', ',,464,464,,464,464,464,464,464,464,464,,,464,464,,,,464,464,464,464', ',,,,,464,,,,,,,,464,464,,464,464,464,464,464,464,464,464,464,464,464', '463,463,464,,463,,,,,,,,,463,463,,463,463,463,463,463,463,463,,,463', '463,,,,463,463,463,463,,,,,,463,,,,,,,,463,463,,463,463,463,463,463', '463,463,463,463,463,463,650,650,463,,650,,,,,,,,,650,650,,650,650,650', '650,650,650,650,,,650,650,,,,650,650,650,650,,,,,,650,,,,,,,,650,650', ',650,650,650,650,650,650,650,650,650,650,650,381,381,650,,381,,,,,,', ',,381,381,,381,381,381,381,381,381,381,,,381,381,,,,381,381,381,381', ',,,,,381,,,,,,,,381,381,,381,381,381,381,381,381,381,381,381,381,381', '451,451,381,,451,,,,,,,,,451,451,,451,451,451,451,451,451,451,,,451', '451,,,,451,451,451,451,,,,,,451,,,,,,,,451,451,,451,451,451,451,451', '451,451,451,451,451,451,955,955,451,,955,,,,,,,,,955,955,,955,955,955', '955,955,955,955,,,955,955,,,,955,955,955,955,,,,,,955,,,,,,,,955,955', ',955,955,955,955,955,955,955,955,955,955,955,449,449,955,,449,,,,,,', ',,449,449,,449,449,449,449,449,449,449,,,449,449,,,,449,449,449,449', ',,,,,449,,,,,,,,449,449,,449,449,449,449,449,449,449,449,449,449,449', ',,449,811,811,811,811,811,811,811,811,811,811,811,,811,811,,,811,811', ',,,,,,,,,,,,,,811,,811,,811,811,811,811,811,811,811,,811,801,801,801', '801,801,801,801,801,801,801,801,,801,801,,811,801,801,,,,,,,,,,,,,,', '801,,801,,801,801,801,801,801,801,801,,801,829,829,829,829,829,829,829', '829,829,829,829,,829,829,,801,829,829,,,,,,,,,,,,,,,829,,829,,829,829', '829,829,829,829,829,,829,799,799,799,799,799,799,799,799,799,799,799', ',799,799,,829,799,799,,,,,,,,,,,,,,,799,,799,,799,799,799,799,799,799', '799,,799,821,821,821,821,821,821,821,821,821,821,821,,821,821,,799,821', '821,,,,,,,,,,,,,,,821,,821,,821,821,821,821,821,821,821,,821,705,705', '705,705,705,705,705,705,705,705,705,,705,705,,821,705,705,,,,,,,,,,', ',,,,705,,705,,705,705,705,705,705,705,705,,705,6,6,6,6,6,6,6,6,6,6,6', ',6,6,,705,6,6,,,,,,,,,,,,,,,6,,6,,6,6,6,6,6,6,6,,6,809,809,809,809,809', '809,809,809,809,809,809,,809,809,,6,809,809,,,,,,,,,,,,,,,809,,809,', '809,809,809,809,809,809,809,,809,803,803,803,803,803,803,803,803,803', '803,803,,803,803,,809,803,803,,,,,,,,,,,,,,,803,,803,,803,803,803,803', '803,803,803,,803,235,235,235,235,235,235,235,235,235,235,235,,235,235', ',803,235,235,,,,,,,,,,,,,,,235,,235,,235,235,235,235,235,235,235,,235', '401,401,401,401,401,401,401,401,401,401,401,,401,401,,235,401,401,,', ',,,,,,,,,,,,401,,401,,401,401,401,401,401,401,401,,401,879,879,879,879', '879,879,879,879,879,879,879,,879,879,401,401,879,879,,,,,,,,,,,,,,,879', ',879,,879,879,879,879,879,879,879,,879,520,520,520,520,520,520,520,520', '520,520,520,,520,520,,879,520,520,,,,,,,,,,,,,,,520,,520,,520,520,520', '520,520,520,520,,520,559,559,559,559,559,559,559,559,559,559,559,,559', '559,,520,559,559,,,,,,,,,,,,,,,559,,559,,559,559,559,559,559,559,559', ',559,,,,,,,,,,,,,,,,559' ] racc_action_check = arr = ::Array.new(23573, nil) idx = 0 clist.each do |str| str.split(',', -1).each do |i| arr[idx] = i.to_i unless i.empty? idx += 1 end end racc_action_pointer = [ nil, 82, 4664, 1357, nil, 19506, 23130, 99, 430, nil, nil, 21623, 19010, 18390, 1322, 308, 18018, nil, nil, 17894, nil, nil, 1252, nil, nil, nil, 17154, 461, nil, nil, nil, nil, 21849, nil, nil, 1201, 21499, nil, nil, 1183, nil, nil, nil, 1168, 21127, 13310, nil, nil, 13186, 1146, nil, nil, 12814, 563, nil, 1178, nil, 350, nil, 1278, 1151, 676, nil, nil, nil, 6630, 1204, 5760, 132, nil, nil, nil, 5518, 1068, nil, 56, 4912, nil, 309, 5150, nil, nil, 0, 1455, 4539, 1123, nil, 900, nil, nil, 5884, 6008, 6134, nil, nil, 6258, 765, 1117, 255, nil, 6754, nil, nil, nil, 1154, 90, nil, 99, nil, nil, 1108, 681, 731, 1178, nil, 0, 1134, nil, 116, 1120, nil, 1168, 8366, 8490, 8614, 8738, 8862, 8986, 9110, 9234, 9358, 9482, 9606, 9730, 9854, 9978, 10102, 10226, 10350, 10474, 10598, 10722, 10846, 10970, 11094, 11218, 11342, 11466, 11590, nil, 11715, nil, 11761, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 508, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 23265, 55, nil, nil, 49, 12442, 12566, 1103, 860, 1133, nil, nil, 173, 1049, 2789, 1041, 1043, 1083, 13806, 13930, 1042, 1066, nil, 1064, 49, nil, nil, nil, nil, 511, nil, nil, 14674, 313, 14922, 1095, 1153, 1167, 1094, 1267, 4788, 993, 22324, 11827, nil, 541, nil, nil, 440, nil, nil, 648, 625, 293, 488, 587, nil, 605, 613, 562, 236, nil, 281, 969, nil, 950, nil, nil, nil, nil, nil, 40, 942, 1289, 18266, nil, 388, nil, nil, 18514, 993, 18762, nil, nil, nil, nil, 18886, 942, nil, 22385, 19258, 22019, 2164, 969, 968, 144, 155, 313, nil, 913, 20374, nil, nil, 910, nil, nil, 20622, nil, 34, 20871, nil, 17646, nil, 20747, 20498, 20126, 19878, 19754, 446, 19134, nil, 857, 864, 980, 1539, 898, 20995, 17522, 1789, 858, 395, 965, 830, nil, nil, 599, 16286, 16162, nil, 16038, nil, 865, 164, 248, 15790, 865, 22629, 15542, 5641, nil, nil, 137, nil, 2289, 884, 3914, 863, 2039, 3789, 2664, 3414, 3539, 2789, 857, 2414, 843, 23310, 602, 2164, 441, 853, 2539, 701, 3289, 3664, 3164, 3039, 2914, 572, nil, 158, 814, nil, nil, nil, nil, 774, nil, nil, 774, 62, nil, nil, nil, 765, 1716, 842, 763, nil, 840, nil, 754, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 8118, 22812, 7994, 22690, 213, 7870, nil, 7746, nil, 7622, 7498, nil, 7250, nil, nil, 22507, 22446, nil, nil, 7126, 235, nil, nil, 6878, nil, 55, 1069, 165, nil, 484, 393, nil, nil, 22202, 5036, 22263, 817, nil, 751, 5280, nil, nil, nil, nil, 5643, 11829, nil, nil, nil, nil, nil, 5450, 12690, nil, 309, nil, nil, nil, nil, 738, nil, 857, 853, 14302, nil, 730, nil, 728, 21375, nil, nil, nil, 23400, 15170, nil, nil, 6008, nil, 2039, 218, 280, nil, 17268, 725, nil, nil, 707, 704, 645, 130, 770, 1030, nil, nil, 742, 713, 20002, 15666, nil, 4414, 807, 7002, nil, nil, nil, 227, 242, nil, 655, nil, 3539, 23445, nil, 643, nil, nil, nil, nil, nil, 12194, nil, 1414, 633, 621, nil, 20995, nil, nil, 610, nil, nil, 13062, 612, 531, nil, 635, nil, 639, 501, nil, nil, 121, nil, nil, 14550, nil, 122, 125, 129, 535, 491, 159, 121, 521, 15914, 409, nil, nil, nil, 1591, 378, 613, nil, nil, nil, 369, 258, 1914, nil, 4289, nil, 1966, 354, nil, nil, 1436, nil, 17398, 1664, 1147, 77, 202, 351, 515, 385, nil, 16534, 303, 341, 21897, nil, nil, nil, nil, nil, nil, 449, 414, 629, nil, nil, nil, 22568, 15418, 22080, 1157, nil, nil, 0, 279, 97, 281, 1038, 355, 13558, 216, nil, nil, nil, nil, nil, nil, 21736, 1841, 578, 3914, 250, nil, nil, 21251, nil, nil, 7374, 306, 189, 5404, nil, 114, 8242, 203, 11946, 12070, 133, nil, 123, 288, 12938, 16658, 16782, 19382, 96, nil, nil, 858, 109, 808, nil, 23085, 282, nil, nil, nil, 260, nil, 1442, 346, 6382, 13434, 236, 14178, nil, 411, 16410, nil, nil, nil, nil, nil, 290, nil, 98, 154, 17030, nil, 370, 372, nil, 710, 409, nil, 893, 424, 448, 555, 452, nil, 476, nil, 481, 1275, 484, nil, 502, nil, nil, nil, nil, nil, 15294, 14798, 220, 14426, 13682, nil, nil, 2914, 529, 551, nil, 563, 571, nil, 592, 625, 609, nil, 3164, 12318, 631, 1142, nil, 485, 764, 294, nil, nil, 664, nil, 785, nil, nil, 715, nil, nil, 686, nil, 4164, 816, 19630, 701, nil, 22995, nil, 22905, nil, 23220, nil, nil, nil, 18142, 727, 23175, nil, 22860, nil, nil, 14054, 853, nil, nil, 2664, 3289, 861, 23040, 756, nil, 147, 3789, nil, 3664, nil, 22950, nil, 1561, nil, 1686, nil, 479, nil, 777, 1023, nil, nil, nil, 1466, nil, 961, nil, nil, nil, 800, nil, nil, nil, 15046, 926, 840, nil, 864, nil, 1216, nil, 642, 16906, nil, nil, 957, 548, nil, nil, 833, nil, nil, nil, 17770, 120, nil, nil, 2289, nil, 867, 23355, nil, 20250, 48, nil, 4039, 927, 1044, nil, 1164, 18638, 1054, 1055, 1414, 946, 1031, 952, 1775, 967, 982, 988, 990, 1036, nil, nil, 997, 1001, 1011, nil, 1016, 1019, 1170, 1095, 2414, nil, nil, 2539, 974, 947, 1282, 1122, 939, nil, 3039, nil, 3414, 1078, nil, nil, 138, nil, nil, nil, 1194, nil, 1078, 763, nil, nil, 1186, nil, nil, nil, 1341, nil, 994, nil, nil, 734, nil, 21958, nil, 1240, 1245, 22141, 6506, 22751, 482, 1261, 624, nil, nil, nil, nil, nil, 1147, 1148, 1149, 1156, 1167, 1169, 1211, 1212, nil, nil, 173, 175, 1199, 908, 51, nil, nil, nil, nil, nil, 1311, nil, nil, 146, 1229, nil ] racc_action_default = [ -1, -579, -578, -579, -484, -579, -49, -567, -492, -393, -496, -578, -327, -578, -51, -493, -579, -497, -578, -328, -52, -270, -312, -578, -329, -319, -82, -53, -271, -476, -578, -330, -579, -272, -477, -578, -579, -273, -29, -578, -2, -274, -279, -579, -579, -579, -275, -44, -579, -567, -435, -434, -579, -565, -276, -579, -9, -437, -436, -579, -579, -579, -490, -441, -438, -579, -579, -288, -258, -4, -489, -470, -258, -239, -5, -296, -579, -491, -277, -258, -70, -486, -553, -8, -578, -579, -485, -555, -487, -482, -74, -565, -579, -488, -481, -579, -41, -579, -554, -301, -578, -84, -304, 990, -579, -492, -327, -493, -328, -353, -567, -579, -579, -579, -288, -405, -291, -331, -277, -413, -352, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, -567, -568, -579, -298, -518, -474, -131, -173, -178, -153, -162, -132, -469, -176, -164, -143, -175, -180, -471, -165, -182, -142, -188, -116, -151, -174, -117, -161, -152, -167, -127, -159, -149, -181, -138, -148, -166, -150, -171, -139, -145, -157, -170, -144, -158, -456, -191, -183, -140, -154, -146, -192, -190, -141, -155, -128, -579, -186, -185, -135, -156, -129, -184, -133, -113, -130, -169, -125, -115, -137, -168, -177, -473, -187, -134, -163, -147, -472, -189, -136, -172, -126, -193, -160, -114, -194, -179, -240, -492, -257, -253, -493, -579, -579, -579, -579, -579, -549, -68, -277, -578, -578, -579, -578, -263, -579, -579, -579, -579, -547, -579, -571, -402, -399, -7, -454, -579, -69, -315, -579, -579, -579, -90, -91, -579, -579, -98, -579, -80, -579, -579, -458, -579, -492, -493, -579, -322, -544, -154, -155, -156, -184, -113, -545, -177, -187, -172, -114, -446, -579, -579, -122, -22, -118, -120, -119, -121, -452, -579, -579, -578, -579, -17, -579, -216, -232, -579, -217, -566, -575, -576, -574, -3, -579, -579, -439, -579, -578, -579, -578, -478, -479, -579, -50, -285, -67, -59, -579, -415, -418, -579, -295, -66, -567, -297, -579, -579, -65, -578, -412, -579, -579, -579, -579, -579, -565, -579, -13, -72, -567, -14, -578, -579, -579, -78, -578, -75, -565, -579, -566, -231, -48, -281, -579, -579, -86, -579, -241, -579, -571, -571, -579, -579, -579, -578, -579, -478, -479, -285, -309, -230, -210, -219, -213, -221, -220, -206, -226, -207, -227, -212, -228, -211, -567, -233, -223, -208, -234, -225, -209, -235, -224, -236, -222, -229, -218, -294, -567, -579, -47, -535, -523, -519, -543, -540, -527, -579, -579, -539, -533, -522, -543, -518, -538, -543, -396, -579, -517, -524, -525, -521, -536, -520, -463, -461, -475, -457, -460, -264, -260, -579, -579, -578, -579, -285, -579, -262, -579, -254, -579, -579, -255, -579, -552, -287, -579, -579, -572, -548, -573, -578, -440, -455, -579, -111, -579, -579, -579, -277, -108, -109, -442, -320, -579, -578, -579, -97, -88, -83, -579, -557, -556, -559, -558, -258, -258, -459, -443, -324, -563, -564, -518, -579, -445, -579, -448, -444, -123, -451, -579, -450, -579, -426, -579, -30, -579, -40, -39, -579, -21, -20, -19, -237, -579, -6, -577, -197, -31, -578, -557, -556, -410, -258, -567, -248, -249, -578, -578, -557, -556, -559, -558, -411, -409, -258, -579, -579, -579, -344, -578, -343, -579, -60, -56, -259, -578, -578, -406, -567, -290, -578, -205, -37, -567, -23, -24, -25, -26, -27, -566, -12, -16, -71, -567, -283, -195, -43, -42, -579, -38, -263, -579, -76, -567, -87, -579, -421, -579, -567, -45, -46, -579, -286, -242, -573, -244, -579, -557, -556, -578, -567, -284, -560, -579, -579, -579, -293, -569, -513, -579, -358, -579, -524, -356, -354, -567, -365, -578, -394, -578, -510, -579, -578, -537, -515, -579, -541, -579, -578, -579, -557, -556, -567, -557, -556, -261, -579, -578, -265, -195, -550, -551, -382, -400, -383, -385, -578, -316, -579, -313, -499, -498, -579, -578, -579, -109, -110, -108, -578, -557, -556, -567, -96, -94, -579, -81, -246, -54, -247, -403, -55, -404, -579, -518, -579, -578, -567, -449, -447, -579, -453, -280, -578, -578, -269, -579, -18, -567, -579, -579, -579, -579, -61, -407, -579, -414, -250, -252, -579, -579, -63, -408, -28, -214, -215, -578, -345, -204, -578, -416, -419, -289, -578, -245, -15, -73, -579, -579, -79, -579, -85, -579, -579, -308, -282, -347, -302, -346, -571, -305, -414, -579, -579, -534, -543, -543, -542, -579, -567, -526, -579, -363, -579, -579, -543, -528, -543, -387, -567, -579, -543, -529, -579, -467, -462, -465, -468, -466, -579, -579, -414, -579, -579, -266, -256, -578, -578, -543, -531, -543, -543, -381, -524, -579, -579, -501, -578, -579, -567, -109, -112, -108, -579, -92, -89, -325, -567, -503, -579, -546, -124, -578, -429, -428, -427, -350, -578, -578, -579, -267, -292, -198, -10, -201, -34, -200, -33, -62, -570, -579, -578, -203, -35, -202, -36, -64, -579, -579, -348, -57, -578, -578, -579, -196, -77, -307, -579, -578, -243, -578, -310, -238, -514, -579, -511, -579, -357, -361, -355, -366, -579, -397, -398, -506, -579, -508, -579, -395, -392, -391, -388, -389, -516, -464, -579, -579, -579, -374, -372, -377, -579, -379, -579, -579, -384, -317, -579, -579, -414, -321, -518, -502, -323, -431, -579, -579, -351, -433, -578, -11, -268, -199, -32, -251, -579, -299, -578, -579, -579, -300, -578, -579, -579, -579, -578, -543, -579, -359, -579, -364, -543, -543, -543, -579, -401, -386, -543, -543, -543, -532, -543, -543, -530, -579, -578, -314, -500, -578, -99, -100, -579, -579, -107, -430, -578, -432, -578, -579, -417, -420, -578, -265, -303, -306, -579, -512, -362, -579, -507, -504, -579, -509, -390, -369, -579, -371, -579, -378, -375, -579, -380, -579, -285, -579, -579, -579, -578, -579, -106, -426, -578, -58, -422, -424, -423, -311, -360, -543, -543, -543, -543, -543, -284, -560, -318, -326, -557, -556, -567, -105, -560, -425, -349, -505, -370, -367, -579, -373, -376, -414, -543, -368 ] clist = [ '150,69,166,117,585,547,40,171,238,435,193,364,257,318,681,238,433,263', '558,466,531,276,193,284,117,693,248,320,171,279,486,369,171,248,296', '299,303,509,305,83,171,561,314,310,303,743,514,304,492,493,673,318,638', '83,459,304,550,68,334,574,347,638,340,238,731,366,767,68,360,345,316', '68,262,612,68,356,633,598,815,633,470,248,795,330,837,654,357,613,117', '849,641,846,728,834,343,530,494,542,577,375,347,724,746,380,907,204', '727,789,473,365,480,820,246,503,377,667,669,268,586,265,68,374,68,825', '758,379,771,827,251,259,602,68,892,267,774,251,471,591,593,68,772,912', '269,656,499,630,68,68,670,868,68,496,597,781,706,283,884,764,516,647', '109,300,877,121,848,677,376,333,425,616,152,322,260,468,763,707,708', '659,553,818,554,819,960,251,897,720,308,873,907,323,264,151,280,297', '502,2,485,306,752,627,626,733,160,68,775,68,742,342,255,285,500,1,,744', ',,378,,,,530,719,542,,,,,,,,,,,360,597,,,,768,,934,828,663,940,,846', '854,454,512,,454,,597,,834,,,743,612,,525,,778,739,,117,,117,,,866,', '736,117,,,,,904,,,964,743,560,,,,435,,638,,,,,620,,,,,731,575,,,,68', '529,,,,,,543,,318,,633,633,,675,555,,238,538,513,532,318,,568,817,962', ',238,,980,716,,,238,459,583,,,238,360,,532,776,360,,248,356,,,83,356', '248,435,580,,,117,571,529,68,68,581,562,563,564,565,567,68,522,,,513', '68,,238,538,68,532,68,,612,780,,612,,566,68,569,589,,603,,68,594,,68', '414,68,786,68,68,68,68,68,485,68,,,805,574,68,,68,791,68,915,813,597', ',,,,68,68,,68,529,,,649,68,552,899,68,762,85,,556,120,,529,,238,538', ',532,905,251,908,85,,,,251,,,538,979,529,,,,,640,,,987,,822,666,666', '638,,,238,538,,532,665,668,895,117,826,612,,,,664,664,,,,,,,888,485', '769,633,864,,68,,,,,,666,171,,,684,303,,,,690,85,,699,692,69,68,304', '435,664,687,703,698,454,454,784,967,68,,,,,710,612,,612,,,922,725,,', '640,640,725,68,,924,,,,,,83,,,961,,,,,635,,,,,68,117,666,,,68,699,782', '612,,,,,,,692,,557,,,664,,,740,,741,68,,712,,773,,,570,750,762,,68,', ',,,,745,729,,68,692,,,,802,804,,,529,785,,454,810,812,,485,,,951,,745', '952,,,238,538,976,532,,692,,575,,,68,,,117,783,,,,,171,604,59,,68,111', '68,171,,258,788,303,243,790,793,68,59,,,243,85,,304,725,,,272,,513,', ',,,,,,793,,,640,68,,726,793,,68,,,,117,,,,,,,,,597,435,,,68,,,243,863', '243,824,,,,,,,,243,68,68,85,880,853,,,59,68,68,85,,732,272,243,243,', ',243,,745,85,,,,,692,68,748,,,,,,,874,,,,,,,,,,871,85,,85,765,865,875', ',85,,576,,85,,885,886,,,,454,709,890,808,891,,711,243,,243,,68,,,,,713', ',914,,,,68,68,,882,718,,,,,722,,,,,,,,,,,68,,,,,,,,,,117,923,,68,,,737', ',,925,68,117,,928,68,68,,932,,,,68,,68,,,,,,,,,,,,,,,,,,,,446,447,,', '957,,958,,,,,,,59,461,,,,,,,,,,787,793,,,,68,,474,529,474,,798,,68,', '272,,68,,538,,68,,,238,538,,532,,,,793,,,,,,85,,,,68,,692,68,515,,,59', '243,,68,,68,,893,59,,85,,,243,836,,898,243,900,59,,85,,,845,,,243,,', '85,,906,243,909,68,243,,243,,243,243,243,243,59,,59,,,578,,59,,243,272', '59,,,,,,,869,243,243,,243,,,,,243,,,243,,,,85,,85,,,,,,,,,85,,,,,,,', ',,,,,,,,,,,,,,,965,,,,966,,968,85,,969,,,,,,,,,,,,,,,85,,,,,,243,636', ',,258,,639,,,,,,,258,,,988,,,,,243,,,,,,,,,,,243,,,,576,272,,,,,,,,', ',,,,243,,,,,,,682,,,,,,,,,,,,,,243,,,606,,59,,,,,,618,,85,622,,,,,,', ',,,85,,59,,,15,,,107,,,,,59,,,,,,15,85,,59,,,,,,,271,,,,,272,282,,,', ',,,,636,85,85,,,,,,85,,85,,,,243,,,,,,,,,,235,235,,59,,59,,235,,749', '55,,,,59,,,,761,,15,,,,55,,271,,,,,921,,312,,85,313,,,243,315,,,85,59', ',,85,,,272,85,,,,235,,,,,,59,,,792,,,797,,,,85,,,85,,243,243,636,258', '368,85,,85,243,243,,,235,,,,55,,,,,,,,,,,243,578,272,,,,,388,389,390', '391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407', '408,409,410,411,412,413,,,,,,,,,,,,,,,,59,,,,,,,,,,,59,243,,,,,331,', ',,,,,,,,,331,878,,59,,,15,,,,,,,,,331,243,,,370,,,,243,282,,282,59,59', ',,,271,,59,,59,,,,,,,,830,832,,,,235,235,,,,841,,843,,,,850,,368,235', ',15,,,,,910,,415,15,417,,,855,55,857,859,918,,,15,59,258,,,,,,,59,929', ',,59,,,,59,,,,,,,,15,,15,78,,,118,15,,235,271,15,59,,520,59,,78,,,,524', '59,,59,235,,274,55,,,,,,,235,55,,,,,235,,,559,,235,55,,,,,,,243,,,,', ',,573,,,,,,,,,,,55,,55,,,,,55,,,235,55,,78,,,,,,274,,,,,933,,,,,936', '937,939,,,,941,943,945,,946,948,,,,,,,,,,,,,,,,,,,,,,,271,,,,,,,,,,', ',,524,,235,,,559,,235,,637,235,,235,,,331,331,331,331,235,981,982,983', '985,986,,15,,,,,,,,235,,,,587,588,,331,,989,,,331,15,,,,,,,,,,,15,,', ',,235,,,,15,,,,,,,,,,,,271,,,,,,,,,,,,,,,,,701,702,55,,,705,78,,,,,', ',,,,,,,15,,15,,55,476,,476,,,,15,,274,,55,,,,,,,,645,55,,,,,235,,,,', ',,,,,,,15,,,,,78,271,,,,,674,,78,,,,15,,,,235,,,78,,,,,,235,55,685,55', ',,,,,,,,55,,,,,235,,78,,78,,,,,78,,,274,78,271,,,,,,,,,,,55,,,,235,', ',235,,,799,,801,803,,,,55,235,235,809,811,,,,,8,,,105,,,,,,15,,,821', '637,8,331,,,235,,15,,,,270,,,,829,,281,,,,,,,,,,15,,,,,,,,,,,,,,801', '803,,809,811,,,,,,15,15,,,,,,15,,15,,,,,,,,55,8,,,,274,,270,,,,55,,235', ',,,,,,,,,,879,,282,,,,,55,,,,,,917,,,,15,,,78,,,,,15,,,,15,,55,55,15', ',,,,55,,55,78,,,,879,,,,,,,78,15,,,15,,,,,78,,15,,15,,,,,,,,274,235', ',,,,,,,235,331,,,,,,55,,,,,,,,55,,,,55,,,,55,,,,78,,78,,,,,,,,,78,754', '331,,,55,,,55,,,,,,,55,,55,,,,,8,,,,,235,,,78,,,,,,274,,,,281,,281,', ',,,78,270,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8,,,,,,,,8,,274,,,,,,,,,8', ',,,,,,,,,,,,,,,,,,,,,,,,8,,8,,,,,8,,,270,8,78,,,,,,,,,,,78,,,,,,,,,', ',,,,,,,,,,78,,,,,,,,,,,,,,,,,,,,,,,,78,78,,,,,,78,,78,,,,,,,,,,,,,,', ',,,,,,,,,,,,,,,,,,,476,,,,,,,,,,,920,,,,78,,,,,,,,78,,270,,78,,,,78', ',,,,,,,,,,,,,,,,,,,78,,,78,,,,,,,78,,78,8,,,,,,,,,,,,,,,,,,,,,8,,,,', ',,,,,,8,,,,,,,,,8,,,,,,,,,,,,270,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', '8,,8,,,,,,,,,8,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8,,,,,,270,,,,,,,,,,,8,', ',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,270,,,,,,,,,,,,,,,,,,,,,,', ',,,,,,,,,,,,,,,,,,,,,,,8,,,,,,,,,,,8,,,,,,,,,,,,,,,,,,,,8,,,,,,,,,,', ',,,,,,,,,,,,,8,8,,,,,,8,,8,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,281,,,,', ',,,,,,916,,,,8,,,,,,,,8,,,,8,,,,8,,,,,,,,,,,,,,,,,,,,8,,,8,,,,,,,8,', '8' ] racc_goto_table = arr = ::Array.new(2891, nil) idx = 0 clist.each do |str| str.split(',', -1).each do |i| arr[idx] = i.to_i unless i.empty? idx += 1 end end clist = [ '33,6,57,64,88,85,2,58,35,133,6,50,6,91,13,35,142,6,85,67,25,51,6,57', '64,26,66,5,58,6,52,22,58,66,6,17,61,10,6,9,58,25,33,17,61,172,29,62', '38,38,92,91,178,9,71,62,40,44,39,20,69,178,39,35,173,5,130,44,12,39', '8,44,7,125,44,46,72,25,86,72,164,66,14,19,127,55,47,126,64,137,41,138', '26,124,19,38,164,38,29,6,69,87,135,33,174,160,87,154,56,19,56,14,45', '164,66,70,70,160,96,45,44,97,44,98,26,99,135,100,68,68,101,44,102,103', '104,68,105,67,67,44,106,107,108,109,110,25,44,44,111,112,44,94,38,26', '42,93,43,128,32,90,21,18,15,89,136,63,65,45,139,140,141,11,143,144,145', '41,41,25,148,149,150,151,152,68,127,153,95,155,174,158,159,84,161,162', '163,3,50,165,166,167,168,131,169,44,170,44,171,82,81,80,177,1,,131,', ',68,,,,38,88,38,,,,,,,,,,,12,38,,,,131,,127,87,52,137,,138,135,6,22', ',6,,38,,124,,,172,125,,22,,55,125,,64,,64,,,26,,126,64,,,,,130,,,127', '172,22,,,,133,,178,,,,,142,,,,,173,22,,,,44,69,,,,,,12,,91,,72,72,,164', '69,,35,58,66,6,91,,5,41,14,,35,,86,52,,,35,71,5,,,35,12,,6,25,12,,66', '46,,,9,46,66,133,51,,,64,47,69,44,44,47,19,19,19,19,8,44,7,,,66,44,', '35,58,44,6,44,,125,10,,125,,9,44,9,19,,33,,44,19,,44,48,44,10,44,44', '44,44,44,50,44,,,40,20,44,,44,29,44,92,40,38,,,,,44,44,,44,69,,,91,44', '45,131,44,71,28,,45,28,,69,,35,58,,6,131,68,131,28,,,,68,,,58,13,69', ',,,,6,,,26,,52,69,69,178,,,35,58,,6,39,39,125,64,67,125,,,,6,6,,,,,', ',85,50,133,72,10,,44,,,,,,69,58,,,17,61,,,,39,28,,69,33,6,44,62,133', '6,2,12,39,6,6,142,131,44,,,,,12,125,,125,,,85,91,,,6,6,91,44,,85,,,', ',,9,,,88,,,,,68,,,,,44,64,69,,,44,69,50,125,,,,,,,33,,48,,,6,,,12,,12', '44,,9,,91,,,48,12,71,,44,,,,,,6,19,,44,33,,,,22,22,,,69,91,,6,22,22', ',50,,,10,,6,10,,,35,58,25,6,,33,,22,,,44,,,64,57,,,,,58,48,24,,44,24', '44,58,,30,17,61,24,6,6,44,24,,,24,28,,62,91,,,24,,66,,,,,,,,6,,,6,44', ',68,6,,44,,,,64,,,,,,,,,38,133,,,44,,,24,91,24,66,,,,,,,,24,44,44,28', '22,12,,,24,44,44,28,,129,24,24,24,,,24,,6,28,,,,,33,44,129,,,,,,,12', ',,,,,,,,,6,28,,28,129,19,6,,28,,28,,28,,12,12,,,,6,48,12,68,12,,48,24', ',24,,44,,,,,48,,91,,,,44,44,,19,48,,,,,48,,,,,,,,,,,44,,,,,,,,,,64,12', ',44,,,48,,,12,44,64,,12,44,44,,12,,,,44,,44,,,,,,,,,,,,,,,,,,,,30,30', ',,12,,12,,,,,,,24,30,,,,,,,,,,48,6,,,,44,,24,69,24,,48,,44,,24,,44,', '58,,44,,,35,58,,6,,,,6,,,,,,28,,,,44,,33,44,30,,,24,24,,44,,44,,129', '24,,28,,,24,48,,129,24,129,24,,28,,,48,,,24,,,28,,129,24,129,44,24,', '24,,24,24,24,24,24,,24,,,30,,24,,24,24,24,,,,,,,48,24,24,,24,,,,,24', ',,24,,,,28,,28,,,,,,,,,28,,,,,,,,,,,,,,,,,,,,,,,129,,,,129,,129,28,', '129,,,,,,,,,,,,,,,28,,,,,,24,30,,,30,,30,,,,,,,30,,,129,,,,,24,,,,,', ',,,,,24,,,,28,24,,,,,,,,,,,,,24,,,,,,,30,,,,,,,,,,,,,,24,,,132,,24,', ',,,,132,,28,132,,,,,,,,,,28,,24,,,54,,,54,,,,,24,,,,,,54,28,,24,,,,', ',,54,,,,,24,54,,,,,,,,30,28,28,,,,,,28,,28,,,,24,,,,,,,,,,34,34,,24', ',24,,34,,30,23,,,,24,,,,30,,54,,,,23,,54,,,,,28,,34,,28,34,,,24,34,', ',28,24,,,28,,,24,28,,,,34,,,,,,24,,,30,,,30,,,,28,,,28,,24,24,30,30', '34,28,,28,24,24,,,34,,,,23,,,,,,,,,,,24,30,24,,,,,34,34,34,34,34,34', '34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,,,,,,,,', ',,,,,,,24,,,,,,,,,,,24,24,,,,,31,,,,,,,,,,,31,30,,24,,,54,,,,,,,,,31', '24,,,31,,,,24,54,,54,24,24,,,,54,,24,,24,,,,,,,,132,132,,,,34,34,,,', '132,,132,,,,132,,34,34,,54,,,,,24,,31,54,31,,,132,23,132,132,24,,,54', '24,30,,,,,,,24,30,,,24,,,,24,,,,,,,,54,,54,27,,,27,54,,34,54,54,24,', '34,24,,27,,,,34,24,,24,34,,27,23,,,,,,,34,23,,,,,34,,,34,,34,23,,,,', ',,24,,,,,,,34,,,,,,,,,,,23,,23,,,,,23,,,34,23,,27,,,,,,27,,,,,132,,', ',,132,132,132,,,,132,132,132,,132,132,,,,,,,,,,,,,,,,,,,,,,,54,,,,,', ',,,,,,,34,,34,,,34,,34,,34,34,,34,,,31,31,31,31,34,132,132,132,132,132', ',54,,,,,,,,34,,,,31,31,,31,,132,,,31,54,,,,,,,,,,,54,,,,,34,,,,54,,', ',,,,,,,,,54,,,,,,,,,,,,,,,,,34,34,23,,,34,27,,,,,,,,,,,,,54,,54,,23', '27,,27,,,,54,,27,,23,,,,,,,,31,23,,,,,34,,,,,,,,,,,,54,,,,,27,54,,,', ',31,,27,,,,54,,,,34,,,27,,,,,,34,23,31,23,,,,,,,,,23,,,,,34,,27,,27', ',,,,27,,,27,27,54,,,,,,,,,,,23,,,,34,,,34,,,34,,34,34,,,,23,34,34,34', '34,,,,,53,,,53,,,,,,54,,,34,34,53,31,,,34,,54,,,,53,,,,34,,53,,,,,,', ',,,54,,,,,,,,,,,,,,34,34,,34,34,,,,,,54,54,,,,,,54,,54,,,,,,,,23,53', ',,,27,,53,,,,23,,34,,,,,,,,,,,34,,54,,,,,23,,,,,,54,,,,54,,,27,,,,,54', ',,,54,,23,23,54,,,,,23,,23,27,,,,34,,,,,,,27,54,,,54,,,,,27,,54,,54', ',,,,,,,27,34,,,,,,,,34,31,,,,,,23,,,,,,,,23,,,,23,,,,23,,,,27,,27,,', ',,,,,,27,27,31,,,23,,,23,,,,,,,23,,23,,,,,53,,,,,34,,,27,,,,,,27,,,', '53,,53,,,,,27,53,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,53,,,,,,,,53,,27,,', ',,,,,,53,,,,,,,,,,,,,,,,,,,,,,,,,53,,53,,,,,53,,,53,53,27,,,,,,,,,,', '27,,,,,,,,,,,,,,,,,,,,27,,,,,,,,,,,,,,,,,,,,,,,,27,27,,,,,,27,,27,,', ',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,27,,,,,,,,,,,27,,,,27,,,,,,,,27,,53,', '27,,,,27,,,,,,,,,,,,,,,,,,,,27,,,27,,,,,,,27,,27,53,,,,,,,,,,,,,,,,', ',,,,53,,,,,,,,,,,53,,,,,,,,,53,,,,,,,,,,,,53,,,,,,,,,,,,,,,,,,,,,,,', ',,,,,,,,,,,,53,,53,,,,,,,,,53,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,53,,,,,,53', ',,,,,,,,,,53,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,53,,,,,,,,,', ',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,53,,,,,,,,,,,53,,,,,,,,,,,,,,,,', ',,,53,,,,,,,,,,,,,,,,,,,,,,,,53,53,,,,,,53,,53,,,,,,,,,,,,,,,,,,,,,', ',,,,,,,,,,,,53,,,,,,,,,,,53,,,,53,,,,,,,,53,,,,53,,,,53,,,,,,,,,,,,', ',,,,,,,53,,,53,,,,,,,53,,53' ] racc_goto_check = arr = ::Array.new(2891, nil) idx = 0 clist.each do |str| str.split(',', -1).each do |i| arr[idx] = i.to_i unless i.empty? idx += 1 end end racc_goto_pointer = [ nil, 211, 4, 195, nil, -26, -1, 56, 17, 37, -271, 115, -16, -496, -599, -633, nil, -1, 125, 18, -302, 155, -61, 1286, 666, -305, -506, 1567, 437, -263, 662, 1381, -152, -7, 1266, -4, nil, nil, -229, -10, -278, -378, -397, -661, 55, 100, -9, 2, 252, nil, -79, -5, -245, 1966, 1214, -390, -159, -9, -4, nil, nil, 0, 11, -340, -2, 66, 14, -240, 116, -19, -377, -197, -379, nil, nil, nil, nil, nil, nil, nil, 177, 195, 132, nil, 182, -325, -625, -488, -362, 158, -314, -40, -449, 123, -132, 144, -252, 22, -601, 23, -600, -257, -696, 111, -513, -130, -505, -722, 117, -337, -140, -348, -634, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, -642, -351, -337, -654, -487, 148, -578, -406, 769, -143, nil, -518, -583, -658, -656, 16, -256, 161, -136, 158, -88, -467, nil, nil, -158, -528, -157, -527, -746, -399, -573, -602, nil, nil, 132, 172, 94, 162, 158, -103, -184, 158, -429, -243, -241, 191, -444, -413, -574, -543, -754, nil, nil, -81, -406 ] racc_goto_default = [ nil, nil, nil, nil, 53, nil, 355, 74, 367, 358, nil, nil, 510, nil, 816, nil, 353, nil, nil, nil, 38, 43, 47, 242, 256, nil, nil, 247, 250, nil, 252, 96, nil, 416, 6, 14, 20, 27, 601, nil, nil, nil, nil, nil, 115, 533, 80, nil, nil, 90, 97, 101, nil, 236, 239, 472, nil, 301, 490, 174, 302, 50, 58, nil, 73, nil, 534, nil, 535, 540, 691, 456, 237, 335, 21, 28, 33, 37, 41, 46, 54, nil, 339, 75, nil, nil, nil, nil, nil, nil, nil, 548, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 611, 437, nil, 608, nil, 429, nil, 432, nil, 734, 642, nil, nil, nil, 419, nil, nil, nil, 672, nil, nil, nil, 541, 338, nil, nil, nil, nil, nil, nil, nil, nil, 51, 57, 64, nil, nil, nil, nil, nil, 444, nil, nil, nil, nil, nil, nil, 421, 423, 427, 766, 431, 434, nil, 245 ] racc_reduce_table = [ 0, 0, :racc_error, 0, 140, :_reduce_1, 2, 138, :_reduce_2, 2, 139, :_reduce_3, 1, 141, :_reduce_none, 1, 141, :_reduce_none, 3, 141, :_reduce_6, 2, 141, :_reduce_none, 1, 144, :_reduce_none, 0, 148, :_reduce_9, 5, 144, :_reduce_10, 4, 147, :_reduce_11, 2, 149, :_reduce_12, 1, 153, :_reduce_none, 1, 153, :_reduce_none, 3, 153, :_reduce_15, 2, 153, :_reduce_16, 0, 169, :_reduce_17, 4, 146, :_reduce_18, 3, 146, :_reduce_19, 3, 146, :_reduce_20, 3, 146, :_reduce_21, 2, 146, :_reduce_22, 3, 146, :_reduce_23, 3, 146, :_reduce_24, 3, 146, :_reduce_25, 3, 146, :_reduce_26, 3, 146, :_reduce_27, 4, 146, :_reduce_28, 1, 146, :_reduce_none, 3, 146, :_reduce_30, 3, 146, :_reduce_31, 6, 146, :_reduce_32, 5, 146, :_reduce_33, 5, 146, :_reduce_34, 5, 146, :_reduce_35, 5, 146, :_reduce_36, 3, 146, :_reduce_37, 3, 146, :_reduce_38, 3, 146, :_reduce_39, 3, 146, :_reduce_40, 1, 146, :_reduce_none, 3, 157, :_reduce_42, 3, 157, :_reduce_43, 1, 168, :_reduce_none, 3, 168, :_reduce_45, 3, 168, :_reduce_46, 3, 168, :_reduce_47, 2, 168, :_reduce_48, 1, 168, :_reduce_none, 1, 156, :_reduce_50, 1, 159, :_reduce_none, 1, 159, :_reduce_none, 1, 173, :_reduce_none, 4, 173, :_reduce_54, 4, 173, :_reduce_55, 0, 179, :_reduce_56, 0, 180, :_reduce_57, 6, 177, :_reduce_58, 2, 172, :_reduce_59, 3, 172, :_reduce_60, 4, 172, :_reduce_61, 5, 172, :_reduce_62, 4, 172, :_reduce_63, 5, 172, :_reduce_64, 2, 172, :_reduce_65, 2, 172, :_reduce_66, 2, 172, :_reduce_67, 2, 172, :_reduce_68, 2, 172, :_reduce_69, 1, 158, :_reduce_none, 3, 158, :_reduce_71, 1, 184, :_reduce_none, 3, 184, :_reduce_73, 1, 183, :_reduce_74, 2, 183, :_reduce_75, 3, 183, :_reduce_76, 5, 183, :_reduce_77, 2, 183, :_reduce_78, 4, 183, :_reduce_79, 2, 183, :_reduce_80, 4, 183, :_reduce_81, 1, 183, :_reduce_82, 3, 183, :_reduce_83, 1, 187, :_reduce_none, 3, 187, :_reduce_85, 2, 186, :_reduce_86, 3, 186, :_reduce_87, 1, 189, :_reduce_88, 3, 189, :_reduce_89, 1, 188, :_reduce_90, 1, 188, :_reduce_91, 4, 188, :_reduce_92, 3, 188, :_reduce_93, 3, 188, :_reduce_94, 3, 188, :_reduce_95, 3, 188, :_reduce_96, 2, 188, :_reduce_97, 1, 188, :_reduce_98, 1, 165, :_reduce_99, 1, 165, :_reduce_100, 4, 165, :_reduce_101, 3, 165, :_reduce_102, 3, 165, :_reduce_103, 3, 165, :_reduce_104, 3, 165, :_reduce_105, 2, 165, :_reduce_106, 1, 165, :_reduce_107, 1, 192, :_reduce_108, 1, 192, :_reduce_none, 2, 193, :_reduce_110, 1, 193, :_reduce_111, 3, 193, :_reduce_112, 1, 194, :_reduce_none, 1, 194, :_reduce_none, 1, 194, :_reduce_none, 1, 194, :_reduce_116, 1, 194, :_reduce_117, 1, 197, :_reduce_none, 1, 197, :_reduce_none, 1, 154, :_reduce_120, 1, 154, :_reduce_none, 1, 155, :_reduce_122, 0, 200, :_reduce_123, 4, 155, :_reduce_124, 1, 195, :_reduce_none, 1, 195, :_reduce_none, 1, 195, :_reduce_none, 1, 195, :_reduce_none, 1, 195, :_reduce_none, 1, 195, :_reduce_none, 1, 195, :_reduce_none, 1, 195, :_reduce_none, 1, 195, :_reduce_none, 1, 195, :_reduce_none, 1, 195, :_reduce_none, 1, 195, :_reduce_none, 1, 195, :_reduce_none, 1, 195, :_reduce_none, 1, 195, :_reduce_none, 1, 195, :_reduce_none, 1, 195, :_reduce_none, 1, 195, :_reduce_none, 1, 195, :_reduce_none, 1, 195, :_reduce_none, 1, 195, :_reduce_none, 1, 195, :_reduce_none, 1, 195, :_reduce_none, 1, 195, :_reduce_none, 1, 195, :_reduce_none, 1, 195, :_reduce_none, 1, 195, :_reduce_none, 1, 195, :_reduce_none, 1, 195, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 1, 196, :_reduce_none, 3, 171, :_reduce_195, 5, 171, :_reduce_196, 3, 171, :_reduce_197, 5, 171, :_reduce_198, 6, 171, :_reduce_199, 5, 171, :_reduce_200, 5, 171, :_reduce_201, 5, 171, :_reduce_202, 5, 171, :_reduce_203, 4, 171, :_reduce_204, 3, 171, :_reduce_205, 3, 171, :_reduce_206, 3, 171, :_reduce_207, 3, 171, :_reduce_208, 3, 171, :_reduce_209, 3, 171, :_reduce_210, 3, 171, :_reduce_211, 3, 171, :_reduce_212, 3, 171, :_reduce_213, 4, 171, :_reduce_214, 4, 171, :_reduce_215, 2, 171, :_reduce_216, 2, 171, :_reduce_217, 3, 171, :_reduce_218, 3, 171, :_reduce_219, 3, 171, :_reduce_220, 3, 171, :_reduce_221, 3, 171, :_reduce_222, 3, 171, :_reduce_223, 3, 171, :_reduce_224, 3, 171, :_reduce_225, 3, 171, :_reduce_226, 3, 171, :_reduce_227, 3, 171, :_reduce_228, 3, 171, :_reduce_229, 3, 171, :_reduce_230, 2, 171, :_reduce_231, 2, 171, :_reduce_232, 3, 171, :_reduce_233, 3, 171, :_reduce_234, 3, 171, :_reduce_235, 3, 171, :_reduce_236, 3, 171, :_reduce_237, 6, 171, :_reduce_238, 1, 171, :_reduce_none, 1, 167, :_reduce_240, 1, 202, :_reduce_none, 2, 202, :_reduce_242, 4, 202, :_reduce_243, 2, 202, :_reduce_244, 3, 206, :_reduce_245, 1, 207, :_reduce_none, 1, 207, :_reduce_none, 1, 162, :_reduce_248, 1, 162, :_reduce_249, 2, 162, :_reduce_250, 4, 162, :_reduce_251, 2, 162, :_reduce_252, 1, 182, :_reduce_253, 2, 182, :_reduce_254, 2, 182, :_reduce_255, 4, 182, :_reduce_256, 1, 182, :_reduce_none, 0, 210, :_reduce_258, 2, 176, :_reduce_259, 2, 209, :_reduce_260, 2, 208, :_reduce_261, 1, 208, :_reduce_none, 1, 203, :_reduce_263, 2, 203, :_reduce_264, 3, 203, :_reduce_265, 4, 203, :_reduce_266, 3, 166, :_reduce_267, 4, 166, :_reduce_268, 2, 166, :_reduce_269, 1, 201, :_reduce_none, 1, 201, :_reduce_none, 1, 201, :_reduce_none, 1, 201, :_reduce_none, 1, 201, :_reduce_none, 1, 201, :_reduce_none, 1, 201, :_reduce_none, 1, 201, :_reduce_none, 1, 201, :_reduce_278, 0, 232, :_reduce_279, 4, 201, :_reduce_280, 0, 233, :_reduce_281, 4, 201, :_reduce_282, 3, 201, :_reduce_283, 3, 201, :_reduce_284, 2, 201, :_reduce_285, 3, 201, :_reduce_286, 3, 201, :_reduce_287, 1, 201, :_reduce_288, 4, 201, :_reduce_289, 3, 201, :_reduce_290, 1, 201, :_reduce_291, 5, 201, :_reduce_292, 4, 201, :_reduce_293, 3, 201, :_reduce_294, 2, 201, :_reduce_295, 1, 201, :_reduce_none, 2, 201, :_reduce_297, 2, 201, :_reduce_298, 6, 201, :_reduce_299, 6, 201, :_reduce_300, 0, 234, :_reduce_301, 0, 235, :_reduce_302, 7, 201, :_reduce_303, 0, 236, :_reduce_304, 0, 237, :_reduce_305, 7, 201, :_reduce_306, 5, 201, :_reduce_307, 4, 201, :_reduce_308, 0, 238, :_reduce_309, 0, 239, :_reduce_310, 9, 201, :_reduce_311, 0, 240, :_reduce_312, 0, 241, :_reduce_313, 7, 201, :_reduce_314, 0, 242, :_reduce_315, 0, 243, :_reduce_316, 0, 244, :_reduce_317, 9, 201, :_reduce_318, 0, 245, :_reduce_319, 0, 246, :_reduce_320, 6, 201, :_reduce_321, 0, 247, :_reduce_322, 6, 201, :_reduce_323, 0, 248, :_reduce_324, 0, 249, :_reduce_325, 9, 201, :_reduce_326, 1, 201, :_reduce_327, 1, 201, :_reduce_328, 1, 201, :_reduce_329, 1, 201, :_reduce_330, 1, 161, :_reduce_331, 1, 250, :_reduce_none, 1, 251, :_reduce_none, 1, 252, :_reduce_none, 1, 253, :_reduce_none, 1, 254, :_reduce_none, 1, 255, :_reduce_none, 1, 256, :_reduce_none, 1, 257, :_reduce_none, 1, 258, :_reduce_none, 1, 259, :_reduce_none, 1, 260, :_reduce_none, 1, 222, :_reduce_none, 1, 222, :_reduce_none, 2, 222, :_reduce_none, 1, 224, :_reduce_none, 1, 224, :_reduce_none, 1, 223, :_reduce_none, 5, 223, :_reduce_349, 1, 151, :_reduce_none, 2, 151, :_reduce_351, 1, 226, :_reduce_none, 1, 226, :_reduce_353, 1, 261, :_reduce_none, 3, 261, :_reduce_355, 1, 264, :_reduce_356, 3, 264, :_reduce_357, 1, 263, :_reduce_358, 4, 263, :_reduce_359, 6, 263, :_reduce_360, 3, 263, :_reduce_361, 5, 263, :_reduce_362, 2, 263, :_reduce_363, 4, 263, :_reduce_364, 1, 263, :_reduce_365, 3, 263, :_reduce_366, 6, 265, :_reduce_367, 8, 265, :_reduce_368, 4, 265, :_reduce_369, 6, 265, :_reduce_370, 4, 265, :_reduce_371, 2, 265, :_reduce_372, 6, 265, :_reduce_373, 2, 265, :_reduce_374, 4, 265, :_reduce_375, 6, 265, :_reduce_376, 2, 265, :_reduce_377, 4, 265, :_reduce_378, 2, 265, :_reduce_379, 4, 265, :_reduce_380, 1, 265, :_reduce_381, 1, 178, :_reduce_none, 1, 178, :_reduce_none, 3, 271, :_reduce_384, 1, 271, :_reduce_385, 4, 271, :_reduce_386, 1, 272, :_reduce_none, 2, 272, :_reduce_388, 1, 273, :_reduce_389, 3, 273, :_reduce_390, 1, 274, :_reduce_391, 1, 274, :_reduce_none, 0, 278, :_reduce_393, 3, 221, :_reduce_394, 4, 276, :_reduce_395, 1, 276, :_reduce_396, 3, 277, :_reduce_397, 3, 277, :_reduce_398, 0, 281, :_reduce_399, 0, 282, :_reduce_400, 6, 280, :_reduce_401, 2, 174, :_reduce_402, 4, 174, :_reduce_403, 4, 174, :_reduce_404, 0, 284, :_reduce_405, 3, 220, :_reduce_406, 4, 220, :_reduce_407, 4, 220, :_reduce_408, 3, 220, :_reduce_409, 3, 220, :_reduce_410, 3, 220, :_reduce_411, 2, 220, :_reduce_412, 1, 220, :_reduce_413, 4, 220, :_reduce_414, 0, 285, :_reduce_415, 0, 286, :_reduce_416, 6, 219, :_reduce_417, 0, 287, :_reduce_418, 0, 288, :_reduce_419, 6, 219, :_reduce_420, 0, 290, :_reduce_421, 6, 225, :_reduce_422, 1, 289, :_reduce_none, 1, 289, :_reduce_none, 6, 150, :_reduce_425, 0, 150, :_reduce_426, 1, 291, :_reduce_427, 1, 291, :_reduce_none, 1, 291, :_reduce_none, 2, 292, :_reduce_430, 1, 292, :_reduce_none, 2, 152, :_reduce_432, 1, 152, :_reduce_none, 1, 211, :_reduce_434, 1, 211, :_reduce_435, 1, 211, :_reduce_none, 1, 212, :_reduce_437, 1, 294, :_reduce_none, 2, 294, :_reduce_439, 3, 295, :_reduce_440, 1, 295, :_reduce_441, 3, 213, :_reduce_442, 3, 214, :_reduce_443, 3, 215, :_reduce_444, 3, 215, :_reduce_445, 1, 299, :_reduce_446, 3, 299, :_reduce_447, 1, 300, :_reduce_none, 2, 300, :_reduce_449, 3, 216, :_reduce_450, 3, 216, :_reduce_451, 1, 302, :_reduce_452, 3, 302, :_reduce_453, 1, 296, :_reduce_454, 2, 296, :_reduce_455, 1, 297, :_reduce_456, 2, 297, :_reduce_457, 1, 298, :_reduce_458, 2, 298, :_reduce_459, 1, 301, :_reduce_460, 0, 304, :_reduce_461, 3, 301, :_reduce_462, 0, 305, :_reduce_463, 4, 301, :_reduce_464, 1, 303, :_reduce_465, 1, 303, :_reduce_466, 1, 303, :_reduce_467, 1, 303, :_reduce_none, 2, 198, :_reduce_469, 1, 198, :_reduce_470, 1, 306, :_reduce_none, 1, 306, :_reduce_none, 1, 306, :_reduce_none, 1, 306, :_reduce_none, 3, 199, :_reduce_475, 1, 293, :_reduce_none, 1, 293, :_reduce_none, 2, 293, :_reduce_478, 2, 293, :_reduce_479, 1, 190, :_reduce_none, 1, 190, :_reduce_none, 1, 190, :_reduce_none, 1, 190, :_reduce_none, 1, 190, :_reduce_none, 1, 191, :_reduce_485, 1, 191, :_reduce_486, 1, 191, :_reduce_487, 1, 191, :_reduce_488, 1, 191, :_reduce_489, 1, 191, :_reduce_490, 1, 191, :_reduce_491, 1, 217, :_reduce_492, 1, 217, :_reduce_493, 1, 160, :_reduce_494, 1, 160, :_reduce_495, 1, 164, :_reduce_496, 1, 164, :_reduce_497, 1, 227, :_reduce_498, 0, 307, :_reduce_499, 4, 227, :_reduce_500, 2, 227, :_reduce_501, 3, 229, :_reduce_502, 2, 229, :_reduce_503, 6, 279, :_reduce_504, 8, 279, :_reduce_505, 4, 279, :_reduce_506, 6, 279, :_reduce_507, 4, 279, :_reduce_508, 6, 279, :_reduce_509, 2, 279, :_reduce_510, 4, 279, :_reduce_511, 6, 279, :_reduce_512, 2, 279, :_reduce_513, 4, 279, :_reduce_514, 2, 279, :_reduce_515, 4, 279, :_reduce_516, 1, 279, :_reduce_517, 0, 279, :_reduce_518, 1, 275, :_reduce_519, 1, 275, :_reduce_520, 1, 275, :_reduce_521, 1, 275, :_reduce_522, 1, 262, :_reduce_none, 1, 262, :_reduce_524, 1, 309, :_reduce_none, 3, 309, :_reduce_526, 1, 266, :_reduce_527, 3, 266, :_reduce_528, 3, 310, :_reduce_529, 3, 311, :_reduce_530, 1, 267, :_reduce_531, 3, 267, :_reduce_532, 1, 308, :_reduce_533, 3, 308, :_reduce_534, 1, 312, :_reduce_none, 1, 312, :_reduce_none, 2, 268, :_reduce_537, 1, 268, :_reduce_538, 1, 313, :_reduce_none, 1, 313, :_reduce_none, 2, 270, :_reduce_541, 2, 269, :_reduce_542, 0, 269, :_reduce_543, 1, 230, :_reduce_none, 0, 314, :_reduce_545, 4, 230, :_reduce_546, 1, 218, :_reduce_547, 2, 218, :_reduce_548, 1, 205, :_reduce_none, 3, 205, :_reduce_550, 3, 315, :_reduce_551, 2, 315, :_reduce_552, 1, 181, :_reduce_none, 1, 181, :_reduce_none, 1, 181, :_reduce_none, 1, 175, :_reduce_none, 1, 175, :_reduce_none, 1, 175, :_reduce_none, 1, 175, :_reduce_none, 1, 283, :_reduce_none, 1, 283, :_reduce_none, 1, 283, :_reduce_none, 1, 231, :_reduce_none, 1, 231, :_reduce_none, 0, 142, :_reduce_none, 1, 142, :_reduce_none, 0, 170, :_reduce_none, 1, 170, :_reduce_none, 2, 185, :_reduce_none, 2, 163, :_reduce_none, 0, 204, :_reduce_none, 1, 204, :_reduce_none, 1, 204, :_reduce_none, 1, 228, :_reduce_574, 1, 228, :_reduce_none, 1, 145, :_reduce_none, 2, 145, :_reduce_577, 0, 143, :_reduce_578 ] racc_reduce_n = 579 racc_shift_n = 990 racc_token_table = { false => 0, :error => 1, :kCLASS => 2, :kMODULE => 3, :kDEF => 4, :kUNDEF => 5, :kBEGIN => 6, :kRESCUE => 7, :kENSURE => 8, :kEND => 9, :kIF => 10, :kUNLESS => 11, :kTHEN => 12, :kELSIF => 13, :kELSE => 14, :kCASE => 15, :kWHEN => 16, :kWHILE => 17, :kUNTIL => 18, :kFOR => 19, :kBREAK => 20, :kNEXT => 21, :kREDO => 22, :kRETRY => 23, :kIN => 24, :kDO => 25, :kDO_COND => 26, :kDO_BLOCK => 27, :kDO_LAMBDA => 28, :kRETURN => 29, :kYIELD => 30, :kSUPER => 31, :kSELF => 32, :kNIL => 33, :kTRUE => 34, :kFALSE => 35, :kAND => 36, :kOR => 37, :kNOT => 38, :kIF_MOD => 39, :kUNLESS_MOD => 40, :kWHILE_MOD => 41, :kUNTIL_MOD => 42, :kRESCUE_MOD => 43, :kALIAS => 44, :kDEFINED => 45, :klBEGIN => 46, :klEND => 47, :k__LINE__ => 48, :k__FILE__ => 49, :k__ENCODING__ => 50, :tIDENTIFIER => 51, :tFID => 52, :tGVAR => 53, :tIVAR => 54, :tCONSTANT => 55, :tLABEL => 56, :tCVAR => 57, :tNTH_REF => 58, :tBACK_REF => 59, :tSTRING_CONTENT => 60, :tINTEGER => 61, :tFLOAT => 62, :tREGEXP_END => 63, :tUPLUS => 64, :tUMINUS => 65, :tUMINUS_NUM => 66, :tPOW => 67, :tCMP => 68, :tEQ => 69, :tEQQ => 70, :tNEQ => 71, :tGEQ => 72, :tLEQ => 73, :tANDOP => 74, :tOROP => 75, :tMATCH => 76, :tNMATCH => 77, :tDOT => 78, :tDOT2 => 79, :tDOT3 => 80, :tAREF => 81, :tASET => 82, :tLSHFT => 83, :tRSHFT => 84, :tCOLON2 => 85, :tCOLON3 => 86, :tOP_ASGN => 87, :tASSOC => 88, :tLPAREN => 89, :tLPAREN2 => 90, :tRPAREN => 91, :tLPAREN_ARG => 92, :tLBRACK => 93, :tLBRACK2 => 94, :tRBRACK => 95, :tLBRACE => 96, :tLBRACE_ARG => 97, :tSTAR => 98, :tSTAR2 => 99, :tAMPER => 100, :tAMPER2 => 101, :tTILDE => 102, :tPERCENT => 103, :tDIVIDE => 104, :tPLUS => 105, :tMINUS => 106, :tLT => 107, :tGT => 108, :tPIPE => 109, :tBANG => 110, :tCARET => 111, :tLCURLY => 112, :tRCURLY => 113, :tBACK_REF2 => 114, :tSYMBEG => 115, :tSTRING_BEG => 116, :tXSTRING_BEG => 117, :tREGEXP_BEG => 118, :tWORDS_BEG => 119, :tQWORDS_BEG => 120, :tSTRING_DBEG => 121, :tSTRING_DVAR => 122, :tSTRING_END => 123, :tSTRING => 124, :tSYMBOL => 125, :tNL => 126, :tEH => 127, :tCOLON => 128, :tCOMMA => 129, :tSPACE => 130, :tSEMI => 131, :tLAST_TOKEN => 132, :tLAMBDA => 133, :tLAMBEG => 134, :tEQL => 135, :tLOWEST => 136 } racc_nt_base = 137 racc_use_result_var = true Racc_arg = [ racc_action_table, racc_action_check, racc_action_default, racc_action_pointer, racc_goto_table, racc_goto_check, racc_goto_default, racc_goto_pointer, racc_nt_base, racc_reduce_table, racc_token_table, racc_shift_n, racc_reduce_n, racc_use_result_var ] Racc_token_to_s_table = [ "$end", "error", "kCLASS", "kMODULE", "kDEF", "kUNDEF", "kBEGIN", "kRESCUE", "kENSURE", "kEND", "kIF", "kUNLESS", "kTHEN", "kELSIF", "kELSE", "kCASE", "kWHEN", "kWHILE", "kUNTIL", "kFOR", "kBREAK", "kNEXT", "kREDO", "kRETRY", "kIN", "kDO", "kDO_COND", "kDO_BLOCK", "kDO_LAMBDA", "kRETURN", "kYIELD", "kSUPER", "kSELF", "kNIL", "kTRUE", "kFALSE", "kAND", "kOR", "kNOT", "kIF_MOD", "kUNLESS_MOD", "kWHILE_MOD", "kUNTIL_MOD", "kRESCUE_MOD", "kALIAS", "kDEFINED", "klBEGIN", "klEND", "k__LINE__", "k__FILE__", "k__ENCODING__", "tIDENTIFIER", "tFID", "tGVAR", "tIVAR", "tCONSTANT", "tLABEL", "tCVAR", "tNTH_REF", "tBACK_REF", "tSTRING_CONTENT", "tINTEGER", "tFLOAT", "tREGEXP_END", "tUPLUS", "tUMINUS", "tUMINUS_NUM", "tPOW", "tCMP", "tEQ", "tEQQ", "tNEQ", "tGEQ", "tLEQ", "tANDOP", "tOROP", "tMATCH", "tNMATCH", "tDOT", "tDOT2", "tDOT3", "tAREF", "tASET", "tLSHFT", "tRSHFT", "tCOLON2", "tCOLON3", "tOP_ASGN", "tASSOC", "tLPAREN", "tLPAREN2", "tRPAREN", "tLPAREN_ARG", "tLBRACK", "tLBRACK2", "tRBRACK", "tLBRACE", "tLBRACE_ARG", "tSTAR", "tSTAR2", "tAMPER", "tAMPER2", "tTILDE", "tPERCENT", "tDIVIDE", "tPLUS", "tMINUS", "tLT", "tGT", "tPIPE", "tBANG", "tCARET", "tLCURLY", "tRCURLY", "tBACK_REF2", "tSYMBEG", "tSTRING_BEG", "tXSTRING_BEG", "tREGEXP_BEG", "tWORDS_BEG", "tQWORDS_BEG", "tSTRING_DBEG", "tSTRING_DVAR", "tSTRING_END", "tSTRING", "tSYMBOL", "tNL", "tEH", "tCOLON", "tCOMMA", "tSPACE", "tSEMI", "tLAST_TOKEN", "tLAMBDA", "tLAMBEG", "tEQL", "tLOWEST", "$start", "program", "top_compstmt", "@1", "top_stmts", "opt_terms", "none", "top_stmt", "terms", "stmt", "bodystmt", "@2", "compstmt", "opt_rescue", "opt_else", "opt_ensure", "stmts", "fitem", "undef_list", "expr_value", "command_asgn", "mlhs", "command_call", "var_lhs", "primary_value", "opt_call_args", "rbracket", "backref", "lhs", "mrhs", "arg_value", "expr", "@3", "opt_nl", "arg", "command", "block_command", "block_call", "operation2", "command_args", "cmd_brace_block", "opt_block_param", "@4", "@5", "operation", "call_args", "mlhs_basic", "mlhs_inner", "rparen", "mlhs_head", "mlhs_item", "mlhs_node", "mlhs_post", "user_variable", "keyword_variable", "cname", "cpath", "fname", "op", "reswords", "fsym", "symbol", "dsym", "@6", "primary", "aref_args", "args", "trailer", "assocs", "paren_args", "opt_paren_args", "opt_block_arg", "block_arg", "@7", "literal", "strings", "xstring", "regexp", "words", "qwords", "var_ref", "assoc_list", "brace_block", "method_call", "lambda", "then", "if_tail", "do", "case_body", "for_var", "superclass", "term", "f_arglist", "singleton", "dot_or_colon", "@8", "@9", "@10", "@11", "@12", "@13", "@14", "@15", "@16", "@17", "@18", "@19", "@20", "@21", "@22", "@23", "@24", "@25", "k_begin", "k_if", "k_unless", "k_while", "k_until", "k_case", "k_for", "k_class", "k_module", "k_def", "k_end", "f_marg", "f_norm_arg", "f_margs", "f_marg_list", "block_param", "f_arg", "f_block_optarg", "f_rest_arg", "opt_f_block_arg", "f_block_arg", "block_param_def", "opt_bv_decl", "bv_decls", "bvar", "f_bad_arg", "f_larglist", "lambda_body", "@26", "f_args", "do_block", "@27", "@28", "operation3", "@29", "@30", "@31", "@32", "@33", "cases", "@34", "exc_list", "exc_var", "numeric", "string", "string1", "string_contents", "xstring_contents", "regexp_contents", "word_list", "word", "string_content", "qword_list", "string_dvar", "@35", "@36", "sym", "@37", "f_optarg", "f_arg_item", "f_opt", "f_block_opt", "restarg_mark", "blkarg_mark", "@38", "assoc" ] Racc_debug_parser = false ##### State transition tables end ##### # reduce 0 omitted def _reduce_1(val, _values, result) self.lexer.lex_state = :expr_beg result end def _reduce_2(val, _values, result) result = new_compstmt val result end def _reduce_3(val, _values, result) result = val[0] result end # reduce 4 omitted # reduce 5 omitted def _reduce_6(val, _values, result) result = self.block_append val[0], val[2] result end # reduce 7 omitted # reduce 8 omitted def _reduce_9(val, _values, result) if (self.in_def || self.in_single > 0) then yyerror "BEGIN in method" end self.env.extend result end def _reduce_10(val, _values, result) result = new_iter s(:preexe), nil, val[3] result end def _reduce_11(val, _values, result) result = new_body val result end def _reduce_12(val, _values, result) result = new_compstmt val result end # reduce 13 omitted # reduce 14 omitted def _reduce_15(val, _values, result) result = self.block_append val[0], val[2] result end def _reduce_16(val, _values, result) result = val[1] result end def _reduce_17(val, _values, result) lexer.lex_state = :expr_fname result = self.lexer.lineno result end def _reduce_18(val, _values, result) result = s(:alias, val[1], val[3]).line(val[2]) result end def _reduce_19(val, _values, result) result = s(:valias, val[1].to_sym, val[2].to_sym) result end def _reduce_20(val, _values, result) result = s(:valias, val[1].to_sym, :"$#{val[2]}") result end def _reduce_21(val, _values, result) yyerror "can't make alias for the number variables" result end def _reduce_22(val, _values, result) result = val[1] result end def _reduce_23(val, _values, result) result = new_if val[2], val[0], nil result end def _reduce_24(val, _values, result) result = new_if val[2], nil, val[0] result end def _reduce_25(val, _values, result) result = new_while val[0], val[2], true result end def _reduce_26(val, _values, result) result = new_until val[0], val[2], true result end def _reduce_27(val, _values, result) result = s(:rescue, val[0], new_resbody(s(:array), val[2])) result end def _reduce_28(val, _values, result) if (self.in_def || self.in_single > 0) then yyerror "END in method; use at_exit" end result = new_iter s(:postexe), nil, val[2] result end # reduce 29 omitted def _reduce_30(val, _values, result) result = new_masgn val[0], val[2], :wrap result end def _reduce_31(val, _values, result) result = new_op_asgn val result end def _reduce_32(val, _values, result) result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5]) result end def _reduce_33(val, _values, result) result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym) result end def _reduce_34(val, _values, result) result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym) result end def _reduce_35(val, _values, result) result = s(:op_asgn, val[0], val[4], val[2], val[3]) result end def _reduce_36(val, _values, result) result = s(:op_asgn, val[0], val[4], val[2], val[3]) result end def _reduce_37(val, _values, result) self.backref_assign_error val[0] result end def _reduce_38(val, _values, result) result = self.node_assign val[0], s(:svalue, val[2]) result end def _reduce_39(val, _values, result) result = new_masgn val[0], val[2], :wrap result end def _reduce_40(val, _values, result) result = new_masgn val[0], val[2] result end # reduce 41 omitted def _reduce_42(val, _values, result) result = self.node_assign val[0], val[2] result end def _reduce_43(val, _values, result) result = self.node_assign val[0], val[2] result end # reduce 44 omitted def _reduce_45(val, _values, result) result = logop(:and, val[0], val[2]) result end def _reduce_46(val, _values, result) result = logop(:or, val[0], val[2]) result end def _reduce_47(val, _values, result) result = s(:call, val[2], :"!") result end def _reduce_48(val, _values, result) result = s(:call, val[1], :"!") result end # reduce 49 omitted def _reduce_50(val, _values, result) result = value_expr(val[0]) result end # reduce 51 omitted # reduce 52 omitted # reduce 53 omitted def _reduce_54(val, _values, result) result = new_call val[0], val[2].to_sym, val[3] result end def _reduce_55(val, _values, result) result = new_call val[0], val[2].to_sym, val[3] result end def _reduce_56(val, _values, result) self.env.extend(:dynamic) result = self.lexer.lineno result end def _reduce_57(val, _values, result) result = self.env.dynamic.keys result end def _reduce_58(val, _values, result) result = new_iter nil, val[2], val[4] result.line = val[1] self.env.unextend result end def _reduce_59(val, _values, result) result = new_call nil, val[0].to_sym, val[1] result end def _reduce_60(val, _values, result) result = new_call nil, val[0].to_sym, val[1] if val[2] then block_dup_check result, val[2] result, operation = val[2], result result.insert 1, operation end result end def _reduce_61(val, _values, result) result = new_call val[0], val[2].to_sym, val[3] result end def _reduce_62(val, _values, result) recv, _, msg, args, block = val call = new_call recv, msg.to_sym, args block_dup_check call, block block.insert 1, call result = block result end def _reduce_63(val, _values, result) result = new_call val[0], val[2].to_sym, val[3] result end def _reduce_64(val, _values, result) recv, _, msg, args, block = val call = new_call recv, msg.to_sym, args block_dup_check call, block block.insert 1, call result = block result end def _reduce_65(val, _values, result) result = new_super val[1] result end def _reduce_66(val, _values, result) result = new_yield val[1] result end def _reduce_67(val, _values, result) line = val[0].last result = s(:return, ret_args(val[1])).line(line) result end def _reduce_68(val, _values, result) line = val[0].last result = s(:break, ret_args(val[1])).line(line) result end def _reduce_69(val, _values, result) line = val[0].last result = s(:next, ret_args(val[1])).line(line) result end # reduce 70 omitted def _reduce_71(val, _values, result) result = val[1] result end # reduce 72 omitted def _reduce_73(val, _values, result) result = s(:masgn, s(:array, val[1])) result end def _reduce_74(val, _values, result) result = s(:masgn, val[0]) result end def _reduce_75(val, _values, result) result = s(:masgn, val[0] << val[1].compact) result end def _reduce_76(val, _values, result) result = s(:masgn, val[0] << s(:splat, val[2])) result end def _reduce_77(val, _values, result) ary = list_append val[0], s(:splat, val[2]) ary.concat val[4][1..-1] result = s(:masgn, ary) result end def _reduce_78(val, _values, result) result = s(:masgn, val[0] << s(:splat)) result end def _reduce_79(val, _values, result) ary = list_append val[0], s(:splat) ary.concat val[3][1..-1] result = s(:masgn, ary) result end def _reduce_80(val, _values, result) result = s(:masgn, s(:array, s(:splat, val[1]))) result end def _reduce_81(val, _values, result) ary = s(:array, s(:splat, val[1])) ary.concat val[3][1..-1] result = s(:masgn, ary) result end def _reduce_82(val, _values, result) result = s(:masgn, s(:array, s(:splat))) result end def _reduce_83(val, _values, result) ary = s(:array, s(:splat)) ary.concat val[2][1..-1] result = s(:masgn, ary) result end # reduce 84 omitted def _reduce_85(val, _values, result) result = val[1] result end def _reduce_86(val, _values, result) result = s(:array, val[0]) result end def _reduce_87(val, _values, result) result = val[0] << val[1].compact result end def _reduce_88(val, _values, result) result = s(:array, val[0]) result end def _reduce_89(val, _values, result) result = list_append val[0], val[2] result end def _reduce_90(val, _values, result) result = self.assignable val[0] result end def _reduce_91(val, _values, result) result = self.assignable val[0] result end def _reduce_92(val, _values, result) result = self.aryset val[0], val[2] result end def _reduce_93(val, _values, result) result = s(:attrasgn, val[0], :"#{val[2]}=") result end def _reduce_94(val, _values, result) result = s(:attrasgn, val[0], :"#{val[2]}=") result end def _reduce_95(val, _values, result) result = s(:attrasgn, val[0], :"#{val[2]}=") result end def _reduce_96(val, _values, result) if (self.in_def || self.in_single > 0) then yyerror "dynamic constant assignment" end result = s(:const, s(:colon2, val[0], val[2].to_sym), nil) result end def _reduce_97(val, _values, result) if (self.in_def || self.in_single > 0) then yyerror "dynamic constant assignment" end result = s(:const, nil, s(:colon3, val[1].to_sym)) result end def _reduce_98(val, _values, result) self.backref_assign_error val[0] result end def _reduce_99(val, _values, result) result = self.assignable val[0] result end def _reduce_100(val, _values, result) result = self.assignable val[0] result end def _reduce_101(val, _values, result) result = self.aryset val[0], val[2] result end def _reduce_102(val, _values, result) result = s(:attrasgn, val[0], :"#{val[2]}=") result end def _reduce_103(val, _values, result) result = s(:attrasgn, val[0], :"#{val[2]}=") result end def _reduce_104(val, _values, result) result = s(:attrasgn, val[0], :"#{val[2]}=") result end def _reduce_105(val, _values, result) if (self.in_def || self.in_single > 0) then yyerror "dynamic constant assignment" end result = s(:const, s(:colon2, val[0], val[2].to_sym)) result end def _reduce_106(val, _values, result) if (self.in_def || self.in_single > 0) then yyerror "dynamic constant assignment" end result = s(:const, s(:colon3, val[1].to_sym)) result end def _reduce_107(val, _values, result) self.backref_assign_error val[0] result end def _reduce_108(val, _values, result) yyerror "class/module name must be CONSTANT" result end # reduce 109 omitted def _reduce_110(val, _values, result) result = s(:colon3, val[1].to_sym) result end def _reduce_111(val, _values, result) result = val[0].to_sym result end def _reduce_112(val, _values, result) result = s(:colon2, val[0], val[2].to_sym) result end # reduce 113 omitted # reduce 114 omitted # reduce 115 omitted def _reduce_116(val, _values, result) lexer.lex_state = :expr_end result = val[0] result end def _reduce_117(val, _values, result) lexer.lex_state = :expr_end result = val[0] result end # reduce 118 omitted # reduce 119 omitted def _reduce_120(val, _values, result) result = s(:lit, val[0].to_sym) result end # reduce 121 omitted def _reduce_122(val, _values, result) result = new_undef val[0] result end def _reduce_123(val, _values, result) lexer.lex_state = :expr_fname result end def _reduce_124(val, _values, result) result = new_undef val[0], val[3] result end # reduce 125 omitted # reduce 126 omitted # reduce 127 omitted # reduce 128 omitted # reduce 129 omitted # reduce 130 omitted # reduce 131 omitted # reduce 132 omitted # reduce 133 omitted # reduce 134 omitted # reduce 135 omitted # reduce 136 omitted # reduce 137 omitted # reduce 138 omitted # reduce 139 omitted # reduce 140 omitted # reduce 141 omitted # reduce 142 omitted # reduce 143 omitted # reduce 144 omitted # reduce 145 omitted # reduce 146 omitted # reduce 147 omitted # reduce 148 omitted # reduce 149 omitted # reduce 150 omitted # reduce 151 omitted # reduce 152 omitted # reduce 153 omitted # reduce 154 omitted # reduce 155 omitted # reduce 156 omitted # reduce 157 omitted # reduce 158 omitted # reduce 159 omitted # reduce 160 omitted # reduce 161 omitted # reduce 162 omitted # reduce 163 omitted # reduce 164 omitted # reduce 165 omitted # reduce 166 omitted # reduce 167 omitted # reduce 168 omitted # reduce 169 omitted # reduce 170 omitted # reduce 171 omitted # reduce 172 omitted # reduce 173 omitted # reduce 174 omitted # reduce 175 omitted # reduce 176 omitted # reduce 177 omitted # reduce 178 omitted # reduce 179 omitted # reduce 180 omitted # reduce 181 omitted # reduce 182 omitted # reduce 183 omitted # reduce 184 omitted # reduce 185 omitted # reduce 186 omitted # reduce 187 omitted # reduce 188 omitted # reduce 189 omitted # reduce 190 omitted # reduce 191 omitted # reduce 192 omitted # reduce 193 omitted # reduce 194 omitted def _reduce_195(val, _values, result) result = self.node_assign val[0], val[2] result end def _reduce_196(val, _values, result) result = self.node_assign val[0], s(:rescue, val[2], new_resbody(s(:array), val[4])) result end def _reduce_197(val, _values, result) result = new_op_asgn val result end def _reduce_198(val, _values, result) result = new_op_asgn val result = s(:rescue, result, new_resbody(s(:array), val[4])) result end def _reduce_199(val, _values, result) val[2][0] = :arglist if val[2] result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5]) result end def _reduce_200(val, _values, result) result = s(:op_asgn2, val[0], :"#{val[2]}=", val[3].to_sym, val[4]) result end def _reduce_201(val, _values, result) result = s(:op_asgn2, val[0], :"#{val[2]}=", val[3].to_sym, val[4]) result end def _reduce_202(val, _values, result) result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym) result end def _reduce_203(val, _values, result) yyerror "constant re-assignment" result end def _reduce_204(val, _values, result) yyerror "constant re-assignment" result end def _reduce_205(val, _values, result) self.backref_assign_error val[0] result end def _reduce_206(val, _values, result) v1, v2 = val[0], val[2] if v1.node_type == :lit and v2.node_type == :lit and Fixnum === v1.last and Fixnum === v2.last then result = s(:lit, (v1.last)..(v2.last)) else result = s(:dot2, v1, v2) end result end def _reduce_207(val, _values, result) v1, v2 = val[0], val[2] if v1.node_type == :lit and v2.node_type == :lit and Fixnum === v1.last and Fixnum === v2.last then result = s(:lit, (v1.last)...(v2.last)) else result = s(:dot3, v1, v2) end result end def _reduce_208(val, _values, result) result = new_call val[0], :+, argl(val[2]) result end def _reduce_209(val, _values, result) result = new_call val[0], :-, argl(val[2]) result end def _reduce_210(val, _values, result) result = new_call val[0], :*, argl(val[2]) result end def _reduce_211(val, _values, result) result = new_call val[0], :"/", argl(val[2]) result end def _reduce_212(val, _values, result) result = new_call val[0], :"%", argl(val[2]) result end def _reduce_213(val, _values, result) result = new_call val[0], :**, argl(val[2]) result end def _reduce_214(val, _values, result) result = new_call(new_call(s(:lit, val[1]), :"**", argl(val[3])), :"-@") result end def _reduce_215(val, _values, result) result = new_call(new_call(s(:lit, val[1]), :"**", argl(val[3])), :"-@") result end def _reduce_216(val, _values, result) result = new_call val[1], :"+@" result end def _reduce_217(val, _values, result) result = new_call val[1], :"-@" result end def _reduce_218(val, _values, result) result = new_call val[0], :"|", argl(val[2]) result end def _reduce_219(val, _values, result) result = new_call val[0], :"^", argl(val[2]) result end def _reduce_220(val, _values, result) result = new_call val[0], :"&", argl(val[2]) result end def _reduce_221(val, _values, result) result = new_call val[0], :"<=>", argl(val[2]) result end def _reduce_222(val, _values, result) result = new_call val[0], :">", argl(val[2]) result end def _reduce_223(val, _values, result) result = new_call val[0], :">=", argl(val[2]) result end def _reduce_224(val, _values, result) result = new_call val[0], :"<", argl(val[2]) result end def _reduce_225(val, _values, result) result = new_call val[0], :"<=", argl(val[2]) result end def _reduce_226(val, _values, result) result = new_call val[0], :"==", argl(val[2]) result end def _reduce_227(val, _values, result) result = new_call val[0], :"===", argl(val[2]) result end def _reduce_228(val, _values, result) result = new_call val[0], :"!=", argl(val[2]) result end def _reduce_229(val, _values, result) result = self.get_match_node val[0], val[2] result end def _reduce_230(val, _values, result) result = s(:not, self.get_match_node(val[0], val[2])) result end def _reduce_231(val, _values, result) result = new_call val[1], :"!" result end def _reduce_232(val, _values, result) val[2] = value_expr val[2] result = new_call val[1], :"~" result end def _reduce_233(val, _values, result) val[0] = value_expr val[0] val[2] = value_expr val[2] result = new_call val[0], :"\<\<", argl(val[2]) result end def _reduce_234(val, _values, result) val[0] = value_expr val[0] val[2] = value_expr val[2] result = new_call val[0], :">>", argl(val[2]) result end def _reduce_235(val, _values, result) result = logop(:and, val[0], val[2]) result end def _reduce_236(val, _values, result) result = logop(:or, val[0], val[2]) result end def _reduce_237(val, _values, result) result = s(:defined, val[2]) result end def _reduce_238(val, _values, result) lexer.tern.pop result = s(:if, val[0], val[2], val[5]) result end # reduce 239 omitted def _reduce_240(val, _values, result) result = value_expr(val[0]) result end # reduce 241 omitted def _reduce_242(val, _values, result) result = val[0] result end def _reduce_243(val, _values, result) result = val[0] << s(:hash, *val[2].values) result end def _reduce_244(val, _values, result) result = s(:array, s(:hash, *val[0].values)) result end def _reduce_245(val, _values, result) result = val[1] result end # reduce 246 omitted # reduce 247 omitted def _reduce_248(val, _values, result) result = val[0] result end def _reduce_249(val, _values, result) result = val[0] result end def _reduce_250(val, _values, result) result = val[0] result end def _reduce_251(val, _values, result) result = val[0] << s(:hash, *val[2][1..-1]) # TODO: self.args result end def _reduce_252(val, _values, result) result = s(:hash, *val[0].values) result end def _reduce_253(val, _values, result) warning "parenthesize argument(s) for future version" result = s(:array, val[0]) result end def _reduce_254(val, _values, result) result = self.arg_blk_pass val[0], val[1] result end def _reduce_255(val, _values, result) result = s(:array, s(:hash, *val[0].values)) result = self.arg_blk_pass result, val[1] result end def _reduce_256(val, _values, result) result = val[0] << s(:hash, *val[2].values) result = self.arg_blk_pass result, val[3] result end # reduce 257 omitted def _reduce_258(val, _values, result) result = lexer.cmdarg.stack.dup # TODO: smell? lexer.cmdarg.push true result end def _reduce_259(val, _values, result) lexer.cmdarg.stack.replace val[0] result = val[1] result end def _reduce_260(val, _values, result) result = s(:block_pass, val[1]) result end def _reduce_261(val, _values, result) result = val[1] result end # reduce 262 omitted def _reduce_263(val, _values, result) result = s(:array, val[0]) result end def _reduce_264(val, _values, result) result = s(:array, s(:splat, val[1])) result end def _reduce_265(val, _values, result) result = self.list_append val[0], val[2] result end def _reduce_266(val, _values, result) result = self.list_append val[0], s(:splat, val[3]) result end def _reduce_267(val, _values, result) result = val[0] << val[2] result end def _reduce_268(val, _values, result) result = self.arg_concat val[0], val[3] result end def _reduce_269(val, _values, result) result = s(:splat, val[1]) result end # reduce 270 omitted # reduce 271 omitted # reduce 272 omitted # reduce 273 omitted # reduce 274 omitted # reduce 275 omitted # reduce 276 omitted # reduce 277 omitted def _reduce_278(val, _values, result) result = new_call nil, val[0].to_sym result end def _reduce_279(val, _values, result) result = self.lexer.lineno result end def _reduce_280(val, _values, result) unless val[2] then result = s(:nil) else result = s(:begin, val[2]) end result.line = val[1] result end def _reduce_281(val, _values, result) lexer.lex_state = :expr_endarg result end def _reduce_282(val, _values, result) warning "(...) interpreted as grouped expression" result = val[1] result end def _reduce_283(val, _values, result) result = val[1] || s(:nil) result.paren = true result end def _reduce_284(val, _values, result) result = s(:colon2, val[0], val[2].to_sym) result end def _reduce_285(val, _values, result) result = s(:colon3, val[1].to_sym) result end def _reduce_286(val, _values, result) result = val[1] || s(:array) result end def _reduce_287(val, _values, result) result = s(:hash, *val[1].values) result end def _reduce_288(val, _values, result) result = s(:return) result end def _reduce_289(val, _values, result) result = new_yield val[2] result end def _reduce_290(val, _values, result) result = new_yield result end def _reduce_291(val, _values, result) result = new_yield result end def _reduce_292(val, _values, result) result = s(:defined, val[3]) result end def _reduce_293(val, _values, result) result = s(:call, val[2], :"!") result end def _reduce_294(val, _values, result) raise "no3\non#{val.inspect}" result end def _reduce_295(val, _values, result) oper, iter = val[0], val[1] call = new_call nil, oper.to_sym iter.insert 1, call result = iter call.line = iter.line result end # reduce 296 omitted def _reduce_297(val, _values, result) call, iter = val[0], val[1] block_dup_check call, iter iter.insert 1, call # FIX result = iter result end def _reduce_298(val, _values, result) result = val[1] # TODO: fix lineno result end def _reduce_299(val, _values, result) result = new_if val[1], val[3], val[4] result end def _reduce_300(val, _values, result) result = new_if val[1], val[4], val[3] result end def _reduce_301(val, _values, result) lexer.cond.push true result end def _reduce_302(val, _values, result) lexer.cond.pop result end def _reduce_303(val, _values, result) result = new_while val[5], val[2], true result end def _reduce_304(val, _values, result) lexer.cond.push true result end def _reduce_305(val, _values, result) lexer.cond.pop result end def _reduce_306(val, _values, result) result = new_until val[5], val[2], true result end def _reduce_307(val, _values, result) result = new_case val[1], val[3] result end def _reduce_308(val, _values, result) result = new_case nil, val[2] result end def _reduce_309(val, _values, result) lexer.cond.push true result end def _reduce_310(val, _values, result) lexer.cond.pop result end def _reduce_311(val, _values, result) result = new_for val[4], val[1], val[7] result end def _reduce_312(val, _values, result) result = self.lexer.lineno result end def _reduce_313(val, _values, result) self.comments.push self.lexer.comments if (self.in_def || self.in_single > 0) then yyerror "class definition in method body" end self.env.extend result end def _reduce_314(val, _values, result) result = new_class val self.env.unextend self.lexer.comments # we don't care about comments in the body result end def _reduce_315(val, _values, result) result = self.lexer.lineno result end def _reduce_316(val, _values, result) result = self.in_def self.in_def = false result end def _reduce_317(val, _values, result) result = self.in_single self.in_single = 0 self.env.extend result end def _reduce_318(val, _values, result) result = new_sclass val self.env.unextend self.lexer.comments # we don't care about comments in the body result end def _reduce_319(val, _values, result) result = self.lexer.lineno result end def _reduce_320(val, _values, result) self.comments.push self.lexer.comments yyerror "module definition in method body" if self.in_def or self.in_single > 0 self.env.extend result end def _reduce_321(val, _values, result) result = new_module val self.env.unextend self.lexer.comments # we don't care about comments in the body result end def _reduce_322(val, _values, result) result = [lexer.lineno, self.in_def] self.comments.push self.lexer.comments self.in_def = true self.env.extend result end def _reduce_323(val, _values, result) line, in_def = val[2] result = new_defn val result[2].line line self.env.unextend self.in_def = in_def self.lexer.comments # we don't care about comments in the body result end def _reduce_324(val, _values, result) self.comments.push self.lexer.comments lexer.lex_state = :expr_fname result end def _reduce_325(val, _values, result) self.in_single += 1 self.env.extend lexer.lex_state = :expr_end # force for args result = lexer.lineno result end def _reduce_326(val, _values, result) result = new_defs val result[3].line val[5] self.env.unextend self.in_single -= 1 self.lexer.comments # we don't care about comments in the body result end def _reduce_327(val, _values, result) result = s(:break) result end def _reduce_328(val, _values, result) result = s(:next) result end def _reduce_329(val, _values, result) result = s(:redo) result end def _reduce_330(val, _values, result) result = s(:retry) result end def _reduce_331(val, _values, result) result = value_expr(val[0]) result end # reduce 332 omitted # reduce 333 omitted # reduce 334 omitted # reduce 335 omitted # reduce 336 omitted # reduce 337 omitted # reduce 338 omitted # reduce 339 omitted # reduce 340 omitted # reduce 341 omitted # reduce 342 omitted # reduce 343 omitted # reduce 344 omitted # reduce 345 omitted # reduce 346 omitted # reduce 347 omitted # reduce 348 omitted def _reduce_349(val, _values, result) result = s(:if, val[1], val[3], val[4]) result end # reduce 350 omitted def _reduce_351(val, _values, result) result = val[1] result end # reduce 352 omitted def _reduce_353(val, _values, result) val[0].delete_at 1 if val[0][1].nil? # HACK result end # reduce 354 omitted def _reduce_355(val, _values, result) result = val[1] result end def _reduce_356(val, _values, result) result = s(:array, val[0]) result end def _reduce_357(val, _values, result) result = list_append val[0], val[2] result end def _reduce_358(val, _values, result) args, = val result = block_var args result end def _reduce_359(val, _values, result) args, _, _, splat = val result = block_var args, "*#{splat}".to_sym result end def _reduce_360(val, _values, result) args, _, _, splat, _, args2 = val result = block_var args, "*#{splat}".to_sym, args2 result end def _reduce_361(val, _values, result) args, _, _ = val result = block_var args, :* result end def _reduce_362(val, _values, result) args, _, _, _, args2 = val result = block_var args, :*, args2 result end def _reduce_363(val, _values, result) _, splat = val result = block_var :"*#{splat}" result end def _reduce_364(val, _values, result) _, splat, _, args = val result = block_var :"*#{splat}", args result end def _reduce_365(val, _values, result) result = block_var :* result end def _reduce_366(val, _values, result) _, _, args = val result = block_var :*, args result end def _reduce_367(val, _values, result) result = args val result end def _reduce_368(val, _values, result) result = args val result end def _reduce_369(val, _values, result) result = args val result end def _reduce_370(val, _values, result) result = args val result end def _reduce_371(val, _values, result) result = args val result end def _reduce_372(val, _values, result) result = args val result end def _reduce_373(val, _values, result) result = args val result end def _reduce_374(val, _values, result) result = args val result end def _reduce_375(val, _values, result) result = args val result end def _reduce_376(val, _values, result) result = args val result end def _reduce_377(val, _values, result) result = args val result end def _reduce_378(val, _values, result) result = args val result end def _reduce_379(val, _values, result) result = args val result end def _reduce_380(val, _values, result) result = args val result end def _reduce_381(val, _values, result) result = args val result end # reduce 382 omitted # reduce 383 omitted def _reduce_384(val, _values, result) result = args val result = 0 if result == s(:args) result end def _reduce_385(val, _values, result) result = 0 self.lexer.command_start = true result end def _reduce_386(val, _values, result) result = args val result end # reduce 387 omitted def _reduce_388(val, _values, result) result = val[1] result end def _reduce_389(val, _values, result) result = args val result end def _reduce_390(val, _values, result) result = args val result end def _reduce_391(val, _values, result) result = s(:shadow, val[0].to_sym) result end # reduce 392 omitted def _reduce_393(val, _values, result) # TODO: dyna_push ? hrm result = lexer.lpar_beg lexer.paren_nest += 1 lexer.lpar_beg = lexer.paren_nest result end def _reduce_394(val, _values, result) lpar, args, body = val lexer.lpar_beg = lpar args = 0 if args == s(:args) call = new_call nil, :lambda result = new_iter call, args, body result end def _reduce_395(val, _values, result) result = args val result end def _reduce_396(val, _values, result) result = val[0] result end def _reduce_397(val, _values, result) result = val[1] result end def _reduce_398(val, _values, result) result = val[1] result end def _reduce_399(val, _values, result) self.env.extend :dynamic result = self.lexer.lineno result end def _reduce_400(val, _values, result) result = self.env.dynamic.keys result end def _reduce_401(val, _values, result) args = val[2] body = val[4] result = new_iter nil, args, body result.line = val[1] self.env.unextend result end def _reduce_402(val, _values, result) # TODO: # if (nd_type($1) == NODE_YIELD) { # compile_error(PARSER_ARG "block given to yield"); syntax_error "Both block arg and actual block given." if val[0].block_pass? result = val[1] result.insert 1, val[0] result end def _reduce_403(val, _values, result) result = new_call val[0], val[2].to_sym, val[3] result end def _reduce_404(val, _values, result) result = new_call val[0], val[2].to_sym, val[3] result end def _reduce_405(val, _values, result) result = self.lexer.lineno result end def _reduce_406(val, _values, result) result = new_call nil, val[0].to_sym, val[2] result end def _reduce_407(val, _values, result) result = new_call val[0], val[2].to_sym, val[3] result end def _reduce_408(val, _values, result) result = new_call val[0], val[2].to_sym, val[3] result end def _reduce_409(val, _values, result) result = new_call val[0], val[2].to_sym result end def _reduce_410(val, _values, result) result = new_call val[0], :call, val[2] result end def _reduce_411(val, _values, result) result = new_call val[0], :call, val[2] result end def _reduce_412(val, _values, result) result = new_super val[1] result end def _reduce_413(val, _values, result) result = s(:zsuper) result end def _reduce_414(val, _values, result) result = new_aref val result end def _reduce_415(val, _values, result) self.env.extend :dynamic result = self.lexer.lineno result end def _reduce_416(val, _values, result) result = self.env.dynamic.keys result end def _reduce_417(val, _values, result) _, line, args, _, body, _ = val result = new_iter nil, args, body result.line = line self.env.unextend result end def _reduce_418(val, _values, result) self.env.extend :dynamic result = self.lexer.lineno result end def _reduce_419(val, _values, result) result = self.env.dynamic.keys result end def _reduce_420(val, _values, result) _, line, args, _, body, _ = val result = new_iter nil, args, body result.line = line self.env.unextend result end def _reduce_421(val, _values, result) result = self.lexer.lineno result end def _reduce_422(val, _values, result) result = new_when(val[2], val[4]) result.line = val[1] result << val[5] if val[5] result end # reduce 423 omitted # reduce 424 omitted def _reduce_425(val, _values, result) _, klasses, var, _, body, rest = val klasses ||= s(:array) klasses << node_assign(var, s(:gvar, :"$!")) if var result = new_resbody(klasses, body) result << rest if rest # UGH, rewritten above result end def _reduce_426(val, _values, result) result = nil result end def _reduce_427(val, _values, result) result = s(:array, val[0]) result end # reduce 428 omitted # reduce 429 omitted def _reduce_430(val, _values, result) result = val[1] result end # reduce 431 omitted def _reduce_432(val, _values, result) _, body = val result = body || s(:nil) result end # reduce 433 omitted def _reduce_434(val, _values, result) result = s(:lit, val[0]) result end def _reduce_435(val, _values, result) result = s(:lit, val[0]) result end # reduce 436 omitted def _reduce_437(val, _values, result) val[0] = s(:dstr, val[0].value) if val[0][0] == :evstr result = val[0] result end # reduce 438 omitted def _reduce_439(val, _values, result) result = self.literal_concat val[0], val[1] result end def _reduce_440(val, _values, result) result = val[1] result end def _reduce_441(val, _values, result) result = s(:str, val[0]) result end def _reduce_442(val, _values, result) result = new_xstring val[1] result end def _reduce_443(val, _values, result) result = new_regexp val result end def _reduce_444(val, _values, result) result = s(:array) result end def _reduce_445(val, _values, result) result = val[1] result end def _reduce_446(val, _values, result) result = s(:array) result end def _reduce_447(val, _values, result) word = val[1][0] == :evstr ? s(:dstr, "", val[1]) : val[1] result = val[0] << word result end # reduce 448 omitted def _reduce_449(val, _values, result) result = self.literal_concat val[0], val[1] result end def _reduce_450(val, _values, result) result = s(:array) result end def _reduce_451(val, _values, result) result = val[1] result end def _reduce_452(val, _values, result) result = s(:array) result end def _reduce_453(val, _values, result) result = val[0] << s(:str, val[1]) result end def _reduce_454(val, _values, result) result = s(:str, "") result end def _reduce_455(val, _values, result) result = literal_concat(val[0], val[1]) result end def _reduce_456(val, _values, result) result = nil result end def _reduce_457(val, _values, result) result = literal_concat(val[0], val[1]) result end def _reduce_458(val, _values, result) result = nil result end def _reduce_459(val, _values, result) result = literal_concat(val[0], val[1]) result end def _reduce_460(val, _values, result) result = s(:str, val[0]) result end def _reduce_461(val, _values, result) result = lexer.lex_strterm lexer.lex_strterm = nil lexer.lex_state = :expr_beg result end def _reduce_462(val, _values, result) lexer.lex_strterm = val[1] result = s(:evstr, val[2]) result end def _reduce_463(val, _values, result) result = [lexer.lex_strterm, lexer.brace_nest, lexer.string_nest] lexer.lex_strterm = nil lexer.brace_nest = 0 lexer.string_nest = 0 lexer.cond.push false lexer.cmdarg.push false lexer.lex_state = :expr_beg result end def _reduce_464(val, _values, result) _, memo, stmt, _ = val lex_strterm, brace_nest, string_nest = memo lexer.lex_strterm = lex_strterm lexer.brace_nest = brace_nest lexer.string_nest = string_nest lexer.cond.lexpop lexer.cmdarg.lexpop case stmt when Sexp then case stmt[0] when :str, :dstr, :evstr then result = stmt else result = s(:evstr, stmt) end when nil then result = s(:evstr) else raise "unknown string body: #{stmt.inspect}" end result end def _reduce_465(val, _values, result) result = s(:gvar, val[0].to_sym) result end def _reduce_466(val, _values, result) result = s(:ivar, val[0].to_sym) result end def _reduce_467(val, _values, result) result = s(:cvar, val[0].to_sym) result end # reduce 468 omitted def _reduce_469(val, _values, result) lexer.lex_state = :expr_end result = val[1].to_sym result end def _reduce_470(val, _values, result) result = val[0].to_sym result end # reduce 471 omitted # reduce 472 omitted # reduce 473 omitted # reduce 474 omitted def _reduce_475(val, _values, result) lexer.lex_state = :expr_end result = val[1] result ||= s(:str, "") case result[0] when :dstr then result[0] = :dsym when :str then result = s(:lit, result.last.intern) else result = s(:dsym, "", result) end result end # reduce 476 omitted # reduce 477 omitted def _reduce_478(val, _values, result) result = -val[1] # TODO: pt_testcase result end def _reduce_479(val, _values, result) result = -val[1] # TODO: pt_testcase result end # reduce 480 omitted # reduce 481 omitted # reduce 482 omitted # reduce 483 omitted # reduce 484 omitted def _reduce_485(val, _values, result) result = s(:nil) result end def _reduce_486(val, _values, result) result = s(:self) result end def _reduce_487(val, _values, result) result = s(:true) result end def _reduce_488(val, _values, result) result = s(:false) result end def _reduce_489(val, _values, result) result = s(:str, self.file) result end def _reduce_490(val, _values, result) result = s(:lit, lexer.src.current_line) result end def _reduce_491(val, _values, result) result = if defined? Encoding then s(:colon2, s(:const, :Encoding), :UTF_8) else s(:str, "Unsupported!") end result end def _reduce_492(val, _values, result) var = val[0] result = Sexp === var ? var : self.gettable(var) result end def _reduce_493(val, _values, result) var = val[0] result = Sexp === var ? var : self.gettable(var) result end def _reduce_494(val, _values, result) result = self.assignable val[0] result end def _reduce_495(val, _values, result) result = self.assignable val[0] result end def _reduce_496(val, _values, result) result = s(:nth_ref, val[0]) result end def _reduce_497(val, _values, result) result = s(:back_ref, val[0]) result end def _reduce_498(val, _values, result) result = nil result end def _reduce_499(val, _values, result) lexer.lex_state = :expr_beg result end def _reduce_500(val, _values, result) result = val[2] result end def _reduce_501(val, _values, result) yyerrok result = nil result end def _reduce_502(val, _values, result) result = val[1] lexer.lex_state = :expr_beg self.lexer.command_start = true result end def _reduce_503(val, _values, result) result = val[0] result end def _reduce_504(val, _values, result) result = args val result end def _reduce_505(val, _values, result) result = args val result end def _reduce_506(val, _values, result) result = args val result end def _reduce_507(val, _values, result) result = args val result end def _reduce_508(val, _values, result) result = args val result end def _reduce_509(val, _values, result) result = args val result end def _reduce_510(val, _values, result) result = args val result end def _reduce_511(val, _values, result) result = args val result end def _reduce_512(val, _values, result) result = args val result end def _reduce_513(val, _values, result) result = args val result end def _reduce_514(val, _values, result) result = args val result end def _reduce_515(val, _values, result) result = args val result end def _reduce_516(val, _values, result) result = args val result end def _reduce_517(val, _values, result) result = args val result end def _reduce_518(val, _values, result) result = args val result end def _reduce_519(val, _values, result) yyerror "formal argument cannot be a constant" result end def _reduce_520(val, _values, result) yyerror "formal argument cannot be an instance variable" result end def _reduce_521(val, _values, result) yyerror "formal argument cannot be a global variable" result end def _reduce_522(val, _values, result) yyerror "formal argument cannot be a class variable" result end # reduce 523 omitted def _reduce_524(val, _values, result) identifier = val[0].to_sym self.env[identifier] = :lvar result = identifier result end # reduce 525 omitted def _reduce_526(val, _values, result) result = val[1] result end def _reduce_527(val, _values, result) case val[0] when Symbol then result = s(:args) result << val[0] when Sexp then result = val[0] else raise "Unknown f_arg type: #{val.inspect}" end result end def _reduce_528(val, _values, result) list, _, item = val if list.sexp_type == :args then result = list else result = s(:args, list) end result << item result end def _reduce_529(val, _values, result) result = self.assignable val[0], val[2] # TODO: detect duplicate names result end def _reduce_530(val, _values, result) result = self.assignable val[0], val[2] result end def _reduce_531(val, _values, result) result = s(:block, val[0]) result end def _reduce_532(val, _values, result) result = val[0] result << val[2] result end def _reduce_533(val, _values, result) result = s(:block, val[0]) result end def _reduce_534(val, _values, result) result = self.block_append val[0], val[2] result end # reduce 535 omitted # reduce 536 omitted def _reduce_537(val, _values, result) # TODO: differs from parse.y - needs tests name = val[1].to_sym self.assignable name result = :"*#{name}" result end def _reduce_538(val, _values, result) name = :"*" self.env[name] = :lvar result = name result end # reduce 539 omitted # reduce 540 omitted def _reduce_541(val, _values, result) identifier = val[1].to_sym self.env[identifier] = :lvar result = "&#{identifier}".to_sym result end def _reduce_542(val, _values, result) result = val[1] result end def _reduce_543(val, _values, result) result = nil result end # reduce 544 omitted def _reduce_545(val, _values, result) lexer.lex_state = :expr_beg result end def _reduce_546(val, _values, result) result = val[2] yyerror "Can't define single method for literals." if result[0] == :lit result end def _reduce_547(val, _values, result) result = s(:array) result end def _reduce_548(val, _values, result) result = val[0] result end # reduce 549 omitted def _reduce_550(val, _values, result) list = val[0].dup more = val[2][1..-1] list.push(*more) unless more.empty? result = list result end def _reduce_551(val, _values, result) result = s(:array, val[0], val[2]) result end def _reduce_552(val, _values, result) label, _ = val[0] # TODO: fix lineno? result = s(:array, s(:lit, label.to_sym), val[1]) result end # reduce 553 omitted # reduce 554 omitted # reduce 555 omitted # reduce 556 omitted # reduce 557 omitted # reduce 558 omitted # reduce 559 omitted # reduce 560 omitted # reduce 561 omitted # reduce 562 omitted # reduce 563 omitted # reduce 564 omitted # reduce 565 omitted # reduce 566 omitted # reduce 567 omitted # reduce 568 omitted # reduce 569 omitted # reduce 570 omitted # reduce 571 omitted # reduce 572 omitted # reduce 573 omitted def _reduce_574(val, _values, result) yyerrok result end # reduce 575 omitted # reduce 576 omitted def _reduce_577(val, _values, result) yyerrok result end def _reduce_578(val, _values, result) result = nil result end def _reduce_none(val, _values, result) val[0] end end # class Ruby19Parser ruby_parser-3.2.2/lib/ruby_parser_extras.rb0000444000004100000410000010347312250152360021123 0ustar www-datawww-data# encoding: ASCII-8BIT require 'stringio' require 'racc/parser' require 'sexp' require 'strscan' require 'ruby_lexer' require "timeout" # :stopdoc: # WHY do I have to do this?!? class Regexp ONCE = 0 unless defined? ONCE # FIX: remove this - it makes no sense unless defined? ENC_NONE then ENC_NONE = /x/n.options ENC_EUC = /x/e.options ENC_SJIS = /x/s.options ENC_UTF8 = /x/u.options end end # I hate ruby 1.9 string changes class Fixnum def ord self end end unless "a"[0] == "a" # :startdoc: class RPStringScanner < StringScanner # if ENV['TALLY'] then # alias :old_getch :getch # def getch # warn({:getch => caller[0]}.inspect) # old_getch # end # end if "".respond_to? :encoding then if "".respond_to? :byteslice then def string_to_pos string.byteslice(0, pos) end else def string_to_pos string.bytes.first(pos).pack("c*").force_encoding(string.encoding) end end def charpos string_to_pos.length end else alias :charpos :pos def string_to_pos string[0..pos] end end def current_line # HAHA fuck you (HACK) string_to_pos[/\A.*__LINE__/m].split(/\n/).size end def extra_lines_added @extra_lines_added ||= 0 end def extra_lines_added= val @extra_lines_added = val end def lineno string[0...charpos].count("\n") + 1 - extra_lines_added end # TODO: once we get rid of these, we can make things like # TODO: current_line and lineno much more accurate and easy to do def unread_many str # TODO: remove this entirely - we should not need it warn({:unread_many => caller[0]}.inspect) if ENV['TALLY'] self.extra_lines_added += str.count("\n") - 1 begin string[charpos, 0] = str rescue IndexError # HACK -- this is a bandaid on a dirty rag on an open festering wound end end if ENV['DEBUG'] then alias :old_getch :getch def getch c = self.old_getch p :getch => [c, caller.first] c end alias :old_scan :scan def scan re s = old_scan re where = caller.first.split(/:/).first(2).join(":") d :scan => [s, where] if s s end end def d o $stderr.puts o.inspect end end module RubyParserStuff VERSION = "3.2.2" unless constants.include? "VERSION" # SIGH attr_accessor :lexer, :in_def, :in_single, :file attr_reader :env, :comments $good20 = [] %w[ ].map(&:to_i).each do |n| $good20[n] = n end def debug20 n, v = nil, r = nil raise "not yet #{n} #{v.inspect} => #{r.inspect}" unless $good20[n] end ruby19 = "".respond_to? :encoding # Rhis is in sorted order of occurrence according to # charlock_holmes against 500k files, with UTF_8 forced # to the top. # # Overwrite this contstant if you need something different. ENCODING_ORDER = [ Encoding::UTF_8, # moved to top to reflect default in 2.0 Encoding::ISO_8859_1, Encoding::ISO_8859_2, Encoding::ISO_8859_9, Encoding::SHIFT_JIS, Encoding::WINDOWS_1252, Encoding::EUC_JP ] if ruby19 def syntax_error msg raise RubyParser::SyntaxError, msg end def arg_add(node1, node2) # TODO: nuke return s(:arglist, node2) unless node1 node1[0] = :arglist if node1[0] == :array return node1 << node2 if node1[0] == :arglist return s(:arglist, node1, node2) end def arg_blk_pass node1, node2 # TODO: nuke node1 = s(:arglist, node1) unless [:arglist, :call_args, :array, :args].include? node1.first node1 << node2 if node2 node1 end def arg_concat node1, node2 # TODO: nuke raise "huh" unless node2 node1 << s(:splat, node2).compact node1 end def clean_mlhs sexp case sexp.sexp_type when :masgn then if sexp.size == 2 and sexp[1].sexp_type == :array then s(:masgn, *sexp[1][1..-1].map { |sub| clean_mlhs sub }) else debug20 5 sexp end when :gasgn, :iasgn, :lasgn, :cvasgn then if sexp.size == 2 then sexp.last else debug20 7 sexp # optional value end else raise "unsupported type: #{sexp.inspect}" end end def block_var *args result = self.args args result[0] = :masgn result end def block_var18 ary, splat, block ary ||= s(:array) if splat then splat = splat[1] unless Symbol === splat ary << "*#{splat}".to_sym end ary << "&#{block[1]}".to_sym if block if ary.length > 2 or ary.splat then # HACK s(:masgn, *ary[1..-1]) else ary.last end end def array_to_hash array case array.sexp_type when :kwsplat then array else s(:hash, *array[1..-1]) end end def call_args args result = s(:call_args) args.each do |arg| case arg when Sexp then case arg.sexp_type when :array, :args, :call_args then # HACK? remove array at some point result.concat arg[1..-1] else result << arg end when Symbol then result << arg when ",", nil then # ignore else raise "unhandled: #{arg.inspect} in #{args.inspect}" end end result end def args args result = s(:args) args.each do |arg| case arg when Sexp then case arg.sexp_type when :args, :block, :array, :call_args then # HACK call_args mismatch result.concat arg[1..-1] when :block_arg then result << :"&#{arg.last}" when :shadow then if Sexp === result.last and result.last.sexp_type == :shadow then result.last << arg.last else result << arg end when :masgn, :block_pass, :hash then # HACK: remove. prolly call_args result << arg else raise "unhandled: #{arg.sexp_type} in #{args.inspect}" end when Symbol then result << arg when ",", "|", ";", "(", ")", nil then # ignore else raise "unhandled: #{arg.inspect} in #{args.inspect}" end end result end def aryset receiver, index index ||= [] s(:attrasgn, receiver, :"[]=", *index[1..-1]) end def assignable(lhs, value = nil) id = lhs.to_sym unless Sexp === lhs id = id.to_sym if Sexp === id raise "write a test 1" if id.to_s =~ /^(?:self|nil|true|false|__LINE__|__FILE__)$/ raise SyntaxError, "Can't change the value of #{id}" if id.to_s =~ /^(?:self|nil|true|false|__LINE__|__FILE__)$/ result = case id.to_s when /^@@/ then asgn = in_def || in_single > 0 s((asgn ? :cvasgn : :cvdecl), id) when /^@/ then s(:iasgn, id) when /^\$/ then s(:gasgn, id) when /^[A-Z]/ then s(:cdecl, id) else case self.env[id] when :lvar then s(:lasgn, id) when :dvar, nil then if self.env.current[id] == :dvar then s(:lasgn, id) elsif self.env[id] == :dvar then self.env.use(id) s(:lasgn, id) elsif ! self.env.dynamic? then s(:lasgn, id) else s(:lasgn, id) end else raise "wtf? unknown type: #{self.env[id]}" end end self.env[id] ||= :lvar unless result.sexp_type == :cdecl # HACK? cdecl result << value if value return result end def block_append(head, tail) return head if tail.nil? return tail if head.nil? line = [head.line, tail.line].compact.min head = remove_begin(head) head = s(:block, head) unless head.node_type == :block head.line = line head << tail end def cond node return nil if node.nil? node = value_expr node case node.first when :lit then if Regexp === node.last then return s(:match, node) else return node end when :and then return s(:and, cond(node[1]), cond(node[2])) when :or then return s(:or, cond(node[1]), cond(node[2])) when :dot2 then label = "flip#{node.hash}" env[label] = :lvar return s(:flip2, node[1], node[2]) when :dot3 then label = "flip#{node.hash}" env[label] = :lvar return s(:flip3, node[1], node[2]) else return node end end ## # for pure ruby systems only def do_parse _racc_do_parse_rb(_racc_setup, false) end if ENV['PURE_RUBY'] def get_match_node lhs, rhs # TODO: rename to new_match if lhs then case lhs[0] when :dregx, :dregx_once then return s(:match2, lhs, rhs).line(lhs.line) when :lit then return s(:match2, lhs, rhs).line(lhs.line) if Regexp === lhs.last end end if rhs then case rhs[0] when :dregx, :dregx_once then return s(:match3, rhs, lhs).line(lhs.line) when :lit then return s(:match3, rhs, lhs).line(lhs.line) if Regexp === rhs.last end end return new_call(lhs, :"=~", argl(rhs)).line(lhs.line) end def gettable(id) id = id.to_sym if String === id result = case id.to_s when /^@@/ then s(:cvar, id) when /^@/ then s(:ivar, id) when /^\$/ then s(:gvar, id) when /^[A-Z]/ then s(:const, id) else type = env[id] if type then s(type, id) else new_call(nil, id) end end result.line(result.line - 1) if result.line and lexer.src.bol? raise "identifier #{id.inspect} is not valid" unless result result end ## # Canonicalize conditionals. Eg: # # not x ? a : b # # becomes: # # x ? b : a attr_accessor :canonicalize_conditions def initialize(options = {}) super() v = self.class.name[/1[89]/] self.lexer = RubyLexer.new v && v.to_i self.lexer.parser = self @env = RubyParserStuff::Environment.new @comments = [] @canonicalize_conditions = true self.reset end def list_append list, item # TODO: nuke me *sigh* return s(:array, item) unless list list = s(:array, list) unless Sexp === list && list.first == :array list << item end def list_prepend item, list # TODO: nuke me *sigh* list = s(:array, list) unless Sexp === list && list[0] == :array list.insert 1, item list end def literal_concat head, tail return tail unless head return head unless tail htype, ttype = head[0], tail[0] head = s(:dstr, '', head) if htype == :evstr case ttype when :str then if htype == :str head[-1] << tail[-1] elsif htype == :dstr and head.size == 2 then head[-1] << tail[-1] else head << tail end when :dstr then if htype == :str then tail[1] = head[-1] + tail[1] head = tail else tail[0] = :array tail[1] = s(:str, tail[1]) tail.delete_at 1 if tail[1] == s(:str, '') head.push(*tail[1..-1]) end when :evstr then head[0] = :dstr if htype == :str if head.size == 2 and tail.size > 1 and tail[1][0] == :str then head[-1] << tail[1][-1] head[0] = :str if head.size == 2 # HACK ? else head.push(tail) end else x = [head, tail] raise "unknown type: #{x.inspect}" end return head end def logop(type, left, right) # TODO: rename logical_op left = value_expr left if left and left[0] == type and not left.paren then node, second = left, nil while (second = node[2]) && second[0] == type and not second.paren do node = second end node[2] = s(type, second, right) return left end return s(type, left, right) end def new_aref val val[2] ||= s(:arglist) val[2][0] = :arglist if val[2][0] == :array # REFACTOR if val[0].node_type == :self then result = new_call nil, :"[]", val[2] else result = new_call val[0], :"[]", val[2] end result end def new_body val body, resbody, elsebody, ensurebody = val result = body if resbody then result = s(:rescue) result << body if body res = resbody while res do result << res res = res.resbody(true) end result << elsebody if elsebody result.line = (body || resbody).line end if elsebody and not resbody then warning("else without rescue is useless") result = block_append(s(:begin, result), elsebody) end result = s(:ensure, result, ensurebody).compact if ensurebody result end def argl x x = s(:arglist, x) if x and x[0] != :arglist x end def backref_assign_error ref # TODO: need a test for this... obviously case ref.first when :nth_ref then raise "write a test 2" raise SyntaxError, "Can't set variable %p" % ref.last when :back_ref then raise "write a test 3" raise SyntaxError, "Can't set back reference %p" % ref.last else raise "Unknown backref type: #{ref.inspect}" end end def new_call recv, meth, args = nil result = s(:call, recv, meth) # TODO: need a test with f(&b) to produce block_pass # TODO: need a test with f(&b) { } to produce warning args ||= s(:arglist) args[0] = :arglist if [:args, :array, :call_args].include? args.first args = s(:arglist, args) unless args.first == :arglist # HACK quick hack to make this work quickly... easy to clean up above result.concat args[1..-1] line = result.grep(Sexp).map(&:line).compact.min result.line = line if line result end def new_case expr, body result = s(:case, expr) line = (expr || body).line while body and body.node_type == :when result << body body = body.delete_at 3 end result[2..-1].each do |node| block = node.block(:delete) node.concat block[1..-1] if block end # else body = nil if body == s(:block) result << body result.line = line result end def new_class val line, path, superclass, body = val[1], val[2], val[3], val[5] result = s(:class, path, superclass) if body then if body.first == :block then result.push(*body[1..-1]) else result.push body end end result.line = line result.comments = self.comments.pop result end def new_compstmt val result = void_stmts(val.grep(Sexp)[0]) result = remove_begin(result) if result result end def new_defn val (_, line), name, _, args, body, * = val body ||= s(:nil) result = s(:defn, name.to_sym, args) if body then if body.first == :block then result.push(*body[1..-1]) else result.push body end end result.line = line result.comments = self.comments.pop result end def new_defs val recv, name, args, body = val[1], val[4], val[6], val[7] result = s(:defs, recv, name.to_sym, args) if body then if body.first == :block then result.push(*body[1..-1]) else result.push body end end result.line = recv.line result.comments = self.comments.pop result end def new_for expr, var, body result = s(:for, expr, var).line(var.line) result << body if body result end def new_if c, t, f l = [c.line, t && t.line, f && f.line].compact.min c = cond c c, t, f = c.last, f, t if c[0] == :not and canonicalize_conditions s(:if, c, t, f).line(l) end def new_iter call, args, body body ||= nil args ||= s(:args) args = s(:args, args) if Symbol === args result = s(:iter) result << call if call result << args result << body if body args[0] = :args unless args == 0 result end def new_masgn lhs, rhs, wrap = false rhs = value_expr(rhs) rhs = lhs[1] ? s(:to_ary, rhs) : s(:array, rhs) if wrap lhs.delete_at 1 if lhs[1].nil? lhs << rhs lhs end def new_module val line, path, body = val[1], val[2], val[4] result = s(:module, path) if body then # REFACTOR? if body.first == :block then result.push(*body[1..-1]) else result.push body end end result.line = line result.comments = self.comments.pop result end def new_op_asgn val lhs, asgn_op, arg = val[0], val[1].to_sym, val[2] name = lhs.value arg = remove_begin(arg) result = case asgn_op # REFACTOR when :"||" then lhs << arg s(:op_asgn_or, self.gettable(name), lhs) when :"&&" then lhs << arg s(:op_asgn_and, self.gettable(name), lhs) else # TODO: why [2] ? lhs[2] = new_call(self.gettable(name), asgn_op, argl(arg)) lhs end result.line = lhs.line result end def new_regexp val node = val[1] || s(:str, '') options = val[2] o, k = 0, nil options.split(//).uniq.each do |c| # FIX: this has a better home v = { 'x' => Regexp::EXTENDED, 'i' => Regexp::IGNORECASE, 'm' => Regexp::MULTILINE, 'o' => Regexp::ONCE, 'n' => Regexp::ENC_NONE, 'e' => Regexp::ENC_EUC, 's' => Regexp::ENC_SJIS, 'u' => Regexp::ENC_UTF8, }[c] raise "unknown regexp option: #{c}" unless v o += v k = c if c =~ /[esu]/ end case node[0] when :str then node[0] = :lit node[1] = if k then Regexp.new(node[1], o, k) else begin Regexp.new(node[1], o) rescue RegexpError => e warn "Ignoring: #{e.message}" Regexp.new(node[1], Regexp::ENC_NONE) end end when :dstr then if options =~ /o/ then node[0] = :dregx_once else node[0] = :dregx end node << o if o and o != 0 else node = s(:dregx, '', node); node[0] = :dregx_once if options =~ /o/ node << o if o and o != 0 end node end def new_resbody cond, body if body && body.first == :block then body.shift # remove block and splat it in directly else body = [body] end s(:resbody, cond, *body) end def new_sclass val recv, in_def, in_single, body = val[3], val[4], val[6], val[7] result = s(:sclass, recv) if body then if body.first == :block then result.push(*body[1..-1]) else result.push body end end result.line = val[2] self.in_def = in_def self.in_single = in_single result end def new_super args if args && args.node_type == :block_pass then s(:super, args) else args ||= s(:arglist) s(:super, *args[1..-1]) end end def new_undef n, m = nil if m then block_append(n, s(:undef, m)) else s(:undef, n) end end def new_until block, expr, pre new_until_or_while :until, block, expr, pre end def new_until_or_while type, block, expr, pre other = type == :until ? :while : :until line = [block && block.line, expr.line].compact.min block, pre = block.last, false if block && block[0] == :begin expr = cond expr result = unless expr.first == :not and canonicalize_conditions then s(type, expr, block, pre) else s(other, expr.last, block, pre) end result.line = line result end def new_when cond, body s(:when, cond, body) end def new_while block, expr, pre new_until_or_while :while, block, expr, pre end def new_xstring str if str then case str[0] when :str str[0] = :xstr when :dstr str[0] = :dxstr else str = s(:dxstr, '', str) end str else s(:xstr, '') end end def new_yield args = nil # TODO: raise args.inspect unless [:arglist].include? args.first # HACK raise "write a test 4" if args && args.node_type == :block_pass raise SyntaxError, "Block argument should not be given." if args && args.node_type == :block_pass args ||= s(:arglist) args[0] = :arglist if [:call_args, :array].include?(args[0]) args = s(:arglist, args) unless args.first == :arglist return s(:yield, *args[1..-1]) end def next_token if self.lexer.advance then return self.lexer.token, self.lexer.yacc_value else return [false, '$end'] end end def node_assign(lhs, rhs) # TODO: rename new_assign return nil unless lhs rhs = value_expr rhs case lhs[0] when :gasgn, :iasgn, :lasgn, :masgn, :cdecl, :cvdecl, :cvasgn then lhs << rhs when :attrasgn, :call then args = lhs.pop unless Symbol === lhs.last lhs.concat arg_add(args, rhs)[1..-1] when :const then lhs[0] = :cdecl lhs << rhs else raise "unknown lhs #{lhs.inspect}" end lhs end ## # Returns a UTF-8 encoded string after processing BOMs and magic # encoding comments. # # Holy crap... ok. Here goes: # # Ruby's file handling and encoding support is insane. We need to be # able to lex a file. The lexer file is explicitly UTF-8 to make # things cleaner. This allows us to deal with extended chars in # class and method names. In order to do this, we need to encode all # input source files as UTF-8. First, we look for a UTF-8 BOM by # looking at the first line while forcing its encoding to # ASCII-8BIT. If we find a BOM, we strip it and set the expected # encoding to UTF-8. Then, we search for a magic encoding comment. # If found, it overrides the BOM. Finally, we force the encoding of # the input string to whatever was found, and then encode that to # UTF-8 for compatibility with the lexer. def handle_encoding str str = str.dup ruby19 = str.respond_to? :encoding encoding = nil header = str.lines.first(2) header.map! { |s| s.force_encoding "ASCII-8BIT" } if ruby19 first = header.first || "" encoding, str = "utf-8", str[3..-1] if first =~ /\A\xEF\xBB\xBF/ encoding = $1.strip if header.find { |s| s[/^#.*?-\*-.*?coding:\s*([^ ;]+).*?-\*-/, 1] || s[/^#.*(?:en)?coding(?:\s*[:=])\s*([\w-]+)/, 1] } if encoding then if ruby19 then encoding.sub!(/utf-8-.+$/, 'utf-8') # HACK for stupid emacs formats hack_encoding str, encoding else warn "Skipping magic encoding comment" end else # nothing specified... ugh. try to encode as utf-8 hack_encoding str if ruby19 end str end def hack_encoding str, extra = nil encodings = ENCODING_ORDER.dup encodings.unshift(extra) unless extra.nil? # terrible, horrible, no good, very bad, last ditch effort. encodings.each do |enc| begin str.force_encoding enc if str.valid_encoding? then str.encode! Encoding::UTF_8 break end rescue Encoding::InvalidByteSequenceError # do nothing rescue Encoding::UndefinedConversionError # do nothing end end # no amount of pain is enough for you. raise "Bad encoding. Need a magic encoding comment." unless str.encoding.name == "UTF-8" end ## # Parse +str+ at path +file+ and return a sexp. Raises # Timeout::Error if it runs for more than +time+ seconds. def process(str, file = "(string)", time = 10) Timeout.timeout time do raise "bad val: #{str.inspect}" unless String === str str = handle_encoding str self.file = file.dup self.lexer.src = str @yydebug = ENV.has_key? 'DEBUG' do_parse end end alias :parse :process def remove_begin node oldnode = node if node and :begin == node[0] and node.size == 2 then node = node[-1] node.line = oldnode.line end node end def reset lexer.reset self.in_def = false self.in_single = 0 self.env.reset self.comments.clear end def block_dup_check call_or_args, block syntax_error "Both block arg and actual block given." if block and call_or_args.block_pass? end def ret_args node if node then raise "write a test 5" if node[0] == :block_pass raise SyntaxError, "block argument should not be given" if node[0] == :block_pass node[0] = :array if node[0] == :call_args node = node.last if node[0] == :array && node.size == 2 # HACK matz wraps ONE of the FOUR splats in a newline to # distinguish. I use paren for now. ugh node = s(:svalue, node) if node[0] == :splat and not node.paren node[0] = :svalue if node[0] == :arglist && node[1][0] == :splat end node end def s(*args) result = Sexp.new(*args) result.line ||= lexer.lineno if lexer.src # otherwise... result.file = self.file result end def value_expr oldnode # HACK node = remove_begin oldnode node.line = oldnode.line if oldnode node[2] = value_expr(node[2]) if node and node[0] == :if node end def void_stmts node return nil unless node return node unless node[0] == :block node[1..-1] = node[1..-1].map { |n| remove_begin(n) } node end def warning s # do nothing for now end alias yyerror syntax_error def on_error(et, ev, values) super rescue Racc::ParseError => e # I don't like how the exception obscures the error message e.message.replace "%s:%p :: %s" % [self.file, lexer.lineno, e.message.strip] warn e.message if $DEBUG raise end class Keyword class KWtable attr_accessor :name, :state, :id0, :id1 def initialize(name, id=[], state=nil) @name = name @id0, @id1 = id @state = state end end ## # :stopdoc: # # :expr_beg = ignore newline, +/- is a sign. # :expr_end = newline significant, +/- is a operator. # :expr_arg = newline significant, +/- is a operator. # :expr_cmdarg = newline significant, +/- is a operator. # :expr_endarg = newline significant, +/- is a operator. # :expr_mid = newline significant, +/- is a operator. # :expr_fname = ignore newline, no reserved words. # :expr_dot = right after . or ::, no reserved words. # :expr_class = immediate after class, no here document. wordlist = [ ["end", [:kEND, :kEND ], :expr_end ], ["else", [:kELSE, :kELSE ], :expr_beg ], ["case", [:kCASE, :kCASE ], :expr_beg ], ["ensure", [:kENSURE, :kENSURE ], :expr_beg ], ["module", [:kMODULE, :kMODULE ], :expr_beg ], ["elsif", [:kELSIF, :kELSIF ], :expr_beg ], ["def", [:kDEF, :kDEF ], :expr_fname ], ["rescue", [:kRESCUE, :kRESCUE_MOD ], :expr_mid ], ["not", [:kNOT, :kNOT ], :expr_beg ], ["then", [:kTHEN, :kTHEN ], :expr_beg ], ["yield", [:kYIELD, :kYIELD ], :expr_arg ], ["for", [:kFOR, :kFOR ], :expr_beg ], ["self", [:kSELF, :kSELF ], :expr_end ], ["false", [:kFALSE, :kFALSE ], :expr_end ], ["retry", [:kRETRY, :kRETRY ], :expr_end ], ["return", [:kRETURN, :kRETURN ], :expr_mid ], ["true", [:kTRUE, :kTRUE ], :expr_end ], ["if", [:kIF, :kIF_MOD ], :expr_beg ], ["defined?", [:kDEFINED, :kDEFINED ], :expr_arg ], ["super", [:kSUPER, :kSUPER ], :expr_arg ], ["undef", [:kUNDEF, :kUNDEF ], :expr_fname ], ["break", [:kBREAK, :kBREAK ], :expr_mid ], ["in", [:kIN, :kIN ], :expr_beg ], ["do", [:kDO, :kDO ], :expr_beg ], ["nil", [:kNIL, :kNIL ], :expr_end ], ["until", [:kUNTIL, :kUNTIL_MOD ], :expr_beg ], ["unless", [:kUNLESS, :kUNLESS_MOD ], :expr_beg ], ["or", [:kOR, :kOR ], :expr_beg ], ["next", [:kNEXT, :kNEXT ], :expr_mid ], ["when", [:kWHEN, :kWHEN ], :expr_beg ], ["redo", [:kREDO, :kREDO ], :expr_end ], ["and", [:kAND, :kAND ], :expr_beg ], ["begin", [:kBEGIN, :kBEGIN ], :expr_beg ], ["__LINE__", [:k__LINE__, :k__LINE__ ], :expr_end ], ["class", [:kCLASS, :kCLASS ], :expr_class ], ["__FILE__", [:k__FILE__, :k__FILE__ ], :expr_end ], ["END", [:klEND, :klEND ], :expr_end ], ["BEGIN", [:klBEGIN, :klBEGIN ], :expr_end ], ["while", [:kWHILE, :kWHILE_MOD ], :expr_beg ], ["alias", [:kALIAS, :kALIAS ], :expr_fname ], ["__ENCODING__", [:k__ENCODING__, :k__ENCODING__], :expr_end], ].map { |args| KWtable.new(*args) } # :startdoc: WORDLIST18 = Hash[*wordlist.map { |o| [o.name, o] }.flatten] WORDLIST19 = Hash[*wordlist.map { |o| [o.name, o] }.flatten] WORDLIST18.delete "__ENCODING__" %w[and case elsif for if in module or unless until when while].each do |k| WORDLIST19[k] = WORDLIST19[k].dup WORDLIST19[k].state = :expr_value end %w[not].each do |k| WORDLIST19[k] = WORDLIST19[k].dup WORDLIST19[k].state = :expr_arg end def self.keyword18 str # REFACTOR WORDLIST18[str] end def self.keyword19 str WORDLIST19[str] end end class Environment attr_reader :env, :dyn def [] k self.all[k] end def []= k, v raise "no" if v == true self.current[k] = v end def all idx = @dyn.index(false) || 0 @env[0..idx].reverse.inject { |env, scope| env.merge scope } end def current @env.first end def dynamic idx = @dyn.index false @env[0...idx].reverse.inject { |env, scope| env.merge scope } || {} end def dynamic? @dyn[0] != false end def extend dyn = false @dyn.unshift dyn @env.unshift({}) @use.unshift({}) end def initialize dyn = false @dyn = [] @env = [] @use = [] self.reset end def reset @dyn.clear @env.clear @use.clear self.extend end def unextend @dyn.shift @env.shift @use.shift raise "You went too far unextending env" if @env.empty? end def use id @env.each_with_index do |env, i| if env[id] then @use[i][id] = true end end end def used? id idx = @dyn.index false # REFACTOR u = @use[0...idx].reverse.inject { |env, scope| env.merge scope } || {} u[id] end end class StackState attr_reader :name attr_reader :stack attr_accessor :debug def initialize(name) @name = name @stack = [false] @debug = false end def inspect "StackState(#{@name}, #{@stack.inspect})" end def is_in_state p :stack_is_in_state => [name, @stack.last, caller.first] if debug @stack.last end def lexpop p :stack_lexpop => caller.first if debug raise if @stack.size == 0 a = @stack.pop b = @stack.pop @stack.push(a || b) end def pop r = @stack.pop p :stack_pop => [name, r, @stack, caller.first] if debug @stack.push false if @stack.size == 0 r end def push val @stack.push val p :stack_push => [name, @stack, caller.first] if debug nil end end end class Ruby20Parser < Racc::Parser include RubyParserStuff end class Ruby19Parser < Racc::Parser include RubyParserStuff end class Ruby18Parser < Racc::Parser include RubyParserStuff end ## # RubyParser is a compound parser that first attempts to parse using # the 1.9 syntax parser and falls back to the 1.8 syntax parser on a # parse error. class RubyParser class SyntaxError < RuntimeError; end def initialize @p18 = Ruby18Parser.new @p19 = Ruby19Parser.new @p20 = Ruby20Parser.new end def process(s, f = "(string)", t = 10) # parens for emacs *sigh* @p20.process s, f, t rescue Racc::ParseError, RubyParser::SyntaxError begin @p19.process s, f, t rescue Racc::ParseError, RubyParser::SyntaxError @p18.process s, f, t end end alias :parse :process def reset @p18.reset @p19.reset end def self.for_current_ruby case RUBY_VERSION when /^1\.8/ then Ruby18Parser.new when /^1\.9/ then Ruby19Parser.new when /^2.0/ then Ruby20Parser.new else raise "unrecognized RUBY_VERSION #{RUBY_VERSION}" end end end ############################################################ # HACK HACK HACK HACK HACK HACK HACK HACK HACK HACK HACK HACK unless "".respond_to?(:grep) then class String def grep re lines.grep re end end end class Sexp attr_writer :paren def paren @paren ||= false end def value raise "multi item sexp" if size > 2 last end def to_sym raise "no: #{self.inspect}.to_sym is a bug" self.value.to_sym end def add x concat x end def add_all x raise "no: #{self.inspect}.add_all #{x.inspect}" # TODO: need a test to trigger this end def block_pass? any? { |s| Sexp === s && s[0] == :block_pass } end alias :node_type :sexp_type alias :values :sexp_body # TODO: retire end # END HACK ############################################################ ruby_parser-3.2.2/lib/ruby20_parser.y0000444000004100000410000022562512250152360017550 0ustar www-datawww-data# -*- racc -*- class Ruby20Parser token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS kTHEN kELSIF kELSE kCASE kWHEN kWHILE kUNTIL kFOR kBREAK kNEXT kREDO kRETRY kIN kDO kDO_COND kDO_BLOCK kDO_LAMBDA kRETURN kYIELD kSUPER kSELF kNIL kTRUE kFALSE kAND kOR kNOT kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__ k__FILE__ k__ENCODING__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT tLABEL tCVAR tNTH_REF tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT tREGEXP_END tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ tGEQ tLEQ tANDOP tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF tASET tLSHFT tRSHFT tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN tLPAREN2 tRPAREN tLPAREN_ARG tLBRACK tLBRACK2 tRBRACK tLBRACE tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2 tTILDE tPERCENT tDIVIDE tPLUS tMINUS tLT tGT tPIPE tBANG tCARET tLCURLY tRCURLY tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG tWORDS_BEG tQWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END tSTRING tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA tLAMBEG tDSTAR tCHAR tSYMBOLS_BEG tQSYMBOLS_BEG tSTRING_DEND tUBANG prechigh right tBANG tTILDE tUPLUS right tPOW right tUMINUS_NUM tUMINUS left tSTAR2 tDIVIDE tPERCENT left tPLUS tMINUS left tLSHFT tRSHFT left tAMPER2 left tPIPE tCARET left tGT tGEQ tLT tLEQ nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH left tANDOP left tOROP nonassoc tDOT2 tDOT3 right tEH tCOLON left kRESCUE_MOD right tEQL tOP_ASGN nonassoc kDEFINED right kNOT left kOR kAND nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD nonassoc tLBRACE_ARG nonassoc tLOWEST preclow rule program: { self.lexer.lex_state = :expr_beg } top_compstmt { result = new_compstmt val } top_compstmt: top_stmts opt_terms { result = val[0] } top_stmts: none | top_stmt | top_stmts terms top_stmt { result = self.block_append val[0], val[2] } | error top_stmt top_stmt: stmt { result = val[0] # TODO: remove once I have more confidence this is fixed # result.each_of_type :call_args do |s| # debug20 666, s, result # end } | klBEGIN { if (self.in_def || self.in_single > 0) then debug20 1 yyerror "BEGIN in method" end self.env.extend } tLCURLY top_compstmt tRCURLY { result = new_iter s(:preexe), nil, val[3] } bodystmt: compstmt opt_rescue opt_else opt_ensure { result = new_body val } compstmt: stmts opt_terms { result = new_compstmt val } stmts: none | stmt | stmts terms stmt { result = self.block_append val[0], val[2] } | error stmt { result = val[1] debug20 2, val, result } stmt: kALIAS fitem { lexer.lex_state = :expr_fname result = self.lexer.lineno } fitem { result = s(:alias, val[1], val[3]).line(val[2]) } | kALIAS tGVAR tGVAR { result = s(:valias, val[1].to_sym, val[2].to_sym) } | kALIAS tGVAR tBACK_REF { result = s(:valias, val[1].to_sym, :"$#{val[2]}") } | kALIAS tGVAR tNTH_REF { yyerror "can't make alias for the number variables" } | kUNDEF undef_list { result = val[1] } | stmt kIF_MOD expr_value { result = new_if val[2], val[0], nil } | stmt kUNLESS_MOD expr_value { result = new_if val[2], nil, val[0] } | stmt kWHILE_MOD expr_value { result = new_while val[0], val[2], true } | stmt kUNTIL_MOD expr_value { result = new_until val[0], val[2], true } | stmt kRESCUE_MOD stmt { result = s(:rescue, val[0], new_resbody(s(:array), val[2])) } | klEND tLCURLY compstmt tRCURLY { if (self.in_def || self.in_single > 0) then debug20 3 yyerror "END in method; use at_exit" end result = new_iter s(:postexe), nil, val[2] } | command_asgn | mlhs tEQL command_call { result = new_masgn val[0], val[2], :wrap } | var_lhs tOP_ASGN command_call { result = new_op_asgn val } | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_call { result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5]) } | primary_value tDOT tIDENTIFIER tOP_ASGN command_call { result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym) } | primary_value tDOT tCONSTANT tOP_ASGN command_call { result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym) } | primary_value tCOLON2 tCONSTANT tOP_ASGN command_call { result = s(:op_asgn, val[0], val[4], val[2], val[3]) debug20 4, val, result } | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call { result = s(:op_asgn, val[0], val[4], val[2], val[3]) debug20 5, val, result } | backref tOP_ASGN command_call { self.backref_assign_error val[0] } | lhs tEQL mrhs { result = self.node_assign val[0], s(:svalue, val[2]) } | mlhs tEQL arg_value { result = new_masgn val[0], val[2], :wrap } | mlhs tEQL mrhs { result = new_masgn val[0], val[2] } | expr command_asgn: lhs tEQL command_call { result = self.node_assign val[0], val[2] } | lhs tEQL command_asgn { result = self.node_assign val[0], val[2] } expr: command_call | expr kAND expr { result = logop(:and, val[0], val[2]) } | expr kOR expr { result = logop(:or, val[0], val[2]) } | kNOT opt_nl expr { result = s(:call, val[2], :"!") } | tBANG command_call { result = s(:call, val[1], :"!") } | arg expr_value: expr { result = value_expr(val[0]) } command_call: command | block_command block_command: block_call | block_call dot_or_colon operation2 command_args { result = new_call val[0], val[2].to_sym, val[3] } cmd_brace_block: tLBRACE_ARG { self.env.extend(:dynamic) result = self.lexer.lineno } opt_block_param { result = self.env.dynamic.keys } compstmt tRCURLY { result = new_iter nil, val[2], val[4] result.line = val[1] self.env.unextend } fcall: operation { result = new_call nil, val[0].to_sym } command: fcall command_args =tLOWEST { result = val[0].concat val[1][1..-1] # REFACTOR pattern } | fcall command_args cmd_brace_block { result = val[0].concat val[1][1..-1] if val[2] then block_dup_check result, val[2] result, operation = val[2], result result.insert 1, operation end } | primary_value tDOT operation2 command_args =tLOWEST { result = new_call val[0], val[2].to_sym, val[3] } | primary_value tDOT operation2 command_args cmd_brace_block { recv, _, msg, args, block = val call = new_call recv, msg.to_sym, args block_dup_check call, block block.insert 1, call result = block } | primary_value tCOLON2 operation2 command_args =tLOWEST { result = new_call val[0], val[2].to_sym, val[3] } | primary_value tCOLON2 operation2 command_args cmd_brace_block { recv, _, msg, args, block = val call = new_call recv, msg.to_sym, args block_dup_check call, block block.insert 1, call result = block } | kSUPER command_args { result = new_super val[1] } | kYIELD command_args { result = new_yield val[1] } | kRETURN call_args { line = val[0].last result = s(:return, ret_args(val[1])).line(line) } | kBREAK call_args { line = val[0].last result = s(:break, ret_args(val[1])).line(line) } | kNEXT call_args { line = val[0].last result = s(:next, ret_args(val[1])).line(line) } mlhs: mlhs_basic | tLPAREN mlhs_inner rparen { result = val[1] } mlhs_inner: mlhs_basic | tLPAREN mlhs_inner rparen { result = s(:masgn, s(:array, val[1])) } mlhs_basic: mlhs_head { result = s(:masgn, val[0]) } | mlhs_head mlhs_item { result = s(:masgn, val[0] << val[1].compact) } | mlhs_head tSTAR mlhs_node { result = s(:masgn, val[0] << s(:splat, val[2])) } | mlhs_head tSTAR mlhs_node tCOMMA mlhs_post { ary1, _, splat, _, ary2 = val result = list_append ary1, s(:splat, splat) result.concat ary2[1..-1] result = s(:masgn, result) } | mlhs_head tSTAR { result = s(:masgn, val[0] << s(:splat)) } | mlhs_head tSTAR tCOMMA mlhs_post { ary = list_append val[0], s(:splat) ary.concat val[3][1..-1] result = s(:masgn, ary) } | tSTAR mlhs_node { result = s(:masgn, s(:array, s(:splat, val[1]))) } | tSTAR mlhs_node tCOMMA mlhs_post { ary = s(:array, s(:splat, val[1])) ary.concat val[3][1..-1] result = s(:masgn, ary) } | tSTAR { result = s(:masgn, s(:array, s(:splat))) } | tSTAR tCOMMA mlhs_post { result = s(:masgn, s(:array, s(:splat), *val[2][1..-1])) } mlhs_item: mlhs_node | tLPAREN mlhs_inner rparen { result = val[1] } mlhs_head: mlhs_item tCOMMA { result = s(:array, val[0]) } | mlhs_head mlhs_item tCOMMA { result = val[0] << val[1].compact } mlhs_post: mlhs_item { result = s(:array, val[0]) } | mlhs_post tCOMMA mlhs_item { result = list_append val[0], val[2] } mlhs_node: user_variable { result = self.assignable val[0] } | keyword_variable { result = self.assignable val[0] } | primary_value tLBRACK2 opt_call_args rbracket { result = self.aryset val[0], val[2] } | primary_value tDOT tIDENTIFIER { result = s(:attrasgn, val[0], :"#{val[2]}=") } | primary_value tCOLON2 tIDENTIFIER { result = s(:attrasgn, val[0], :"#{val[2]}=") } | primary_value tDOT tCONSTANT { result = s(:attrasgn, val[0], :"#{val[2]}=") } | primary_value tCOLON2 tCONSTANT { if (self.in_def || self.in_single > 0) then debug20 7 yyerror "dynamic constant assignment" end result = s(:const, s(:colon2, val[0], val[2].to_sym), nil) } | tCOLON3 tCONSTANT { if (self.in_def || self.in_single > 0) then debug20 8 yyerror "dynamic constant assignment" end result = s(:const, nil, s(:colon3, val[1].to_sym)) } | backref { self.backref_assign_error val[0] } lhs: user_variable { result = self.assignable val[0] } | keyword_variable { result = self.assignable val[0] debug20 9, val, result } | primary_value tLBRACK2 opt_call_args rbracket { result = self.aryset val[0], val[2] } | primary_value tDOT tIDENTIFIER # REFACTOR { result = s(:attrasgn, val[0], :"#{val[2]}=") } | primary_value tCOLON2 tIDENTIFIER { result = s(:attrasgn, val[0], :"#{val[2]}=") } | primary_value tDOT tCONSTANT # REFACTOR? { result = s(:attrasgn, val[0], :"#{val[2]}=") } | primary_value tCOLON2 tCONSTANT { if (self.in_def || self.in_single > 0) then debug20 10 yyerror "dynamic constant assignment" end result = s(:const, s(:colon2, val[0], val[2].to_sym)) } | tCOLON3 tCONSTANT { if (self.in_def || self.in_single > 0) then debug20 11 yyerror "dynamic constant assignment" end result = s(:const, s(:colon3, val[1].to_sym)) } | backref { self.backref_assign_error val[0] } cname: tIDENTIFIER { yyerror "class/module name must be CONSTANT" } | tCONSTANT cpath: tCOLON3 cname { result = s(:colon3, val[1].to_sym) } | cname { result = val[0].to_sym } | primary_value tCOLON2 cname { result = s(:colon2, val[0], val[2].to_sym) } fname: tIDENTIFIER | tCONSTANT | tFID | op { lexer.lex_state = :expr_end result = val[0] } | reswords { lexer.lex_state = :expr_end result = val[0] } fsym: fname | symbol fitem: fsym { result = s(:lit, val[0].to_sym) } | dsym undef_list: fitem { result = new_undef val[0] } | undef_list tCOMMA { lexer.lex_state = :expr_fname } fitem { result = new_undef val[0], val[3] } op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ | tMATCH | tNMATCH | tGT | tGEQ | tLT | tLEQ | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2 | tSTAR | tDIVIDE | tPERCENT | tPOW | tDSTAR | tBANG | tTILDE | tUPLUS | tUMINUS | tUBANG | tAREF | tASET | tBACK_REF2 reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND | kALIAS | kAND | kBEGIN | kBREAK | kCASE | kCLASS | kDEF | kDEFINED | kDO | kELSE | kELSIF | kEND | kENSURE | kFALSE | kFOR | kIN | kMODULE | kNEXT | kNIL | kNOT | kOR | kREDO | kRESCUE | kRETRY | kRETURN | kSELF | kSUPER | kTHEN | kTRUE | kUNDEF | kWHEN | kYIELD | kIF | kUNLESS | kWHILE | kUNTIL arg: lhs tEQL arg { result = self.node_assign val[0], val[2] } | lhs tEQL arg kRESCUE_MOD arg { result = self.node_assign val[0], s(:rescue, val[2], new_resbody(s(:array), val[4])) } | var_lhs tOP_ASGN arg { result = new_op_asgn val } | var_lhs tOP_ASGN arg kRESCUE_MOD arg { result = new_op_asgn val result = s(:rescue, result, new_resbody(s(:array), val[4])) } | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg { val[2][0] = :arglist if val[2] result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5]) } | primary_value tDOT tIDENTIFIER tOP_ASGN arg { result = s(:op_asgn2, val[0], :"#{val[2]}=", val[3].to_sym, val[4]) } | primary_value tDOT tCONSTANT tOP_ASGN arg { result = s(:op_asgn2, val[0], :"#{val[2]}=", val[3].to_sym, val[4]) } | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg { result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym) } | primary_value tCOLON2 tCONSTANT tOP_ASGN arg { yyerror "constant re-assignment" } | tCOLON3 tCONSTANT tOP_ASGN arg { yyerror "constant re-assignment" } | backref tOP_ASGN arg { self.backref_assign_error val[0] } | arg tDOT2 arg { v1, v2 = val[0], val[2] if v1.node_type == :lit and v2.node_type == :lit and Fixnum === v1.last and Fixnum === v2.last then result = s(:lit, (v1.last)..(v2.last)) else result = s(:dot2, v1, v2) end } | arg tDOT3 arg { v1, v2 = val[0], val[2] if v1.node_type == :lit and v2.node_type == :lit and Fixnum === v1.last and Fixnum === v2.last then result = s(:lit, (v1.last)...(v2.last)) else result = s(:dot3, v1, v2) end } | arg tPLUS arg { result = new_call val[0], :+, argl(val[2]) } | arg tMINUS arg { result = new_call val[0], :-, argl(val[2]) } | arg tSTAR2 arg # TODO: rename { result = new_call val[0], :*, argl(val[2]) } | arg tDIVIDE arg { result = new_call val[0], :"/", argl(val[2]) } | arg tPERCENT arg { result = new_call val[0], :"%", argl(val[2]) } | arg tPOW arg { result = new_call val[0], :**, argl(val[2]) } | tUMINUS_NUM tINTEGER tPOW arg { result = new_call(new_call(s(:lit, val[1]), :"**", argl(val[3])), :"-@") } | tUMINUS_NUM tFLOAT tPOW arg { result = new_call(new_call(s(:lit, val[1]), :"**", argl(val[3])), :"-@") debug20 12, val, result } | tUPLUS arg { result = new_call val[1], :"+@" } | tUMINUS arg { result = new_call val[1], :"-@" } | arg tPIPE arg { result = new_call val[0], :"|", argl(val[2]) } | arg tCARET arg { result = new_call val[0], :"^", argl(val[2]) } | arg tAMPER2 arg { result = new_call val[0], :"&", argl(val[2]) } | arg tCMP arg { result = new_call val[0], :"<=>", argl(val[2]) } | arg tGT arg { result = new_call val[0], :">", argl(val[2]) } | arg tGEQ arg { result = new_call val[0], :">=", argl(val[2]) } | arg tLT arg { result = new_call val[0], :"<", argl(val[2]) } | arg tLEQ arg { result = new_call val[0], :"<=", argl(val[2]) } | arg tEQ arg { result = new_call val[0], :"==", argl(val[2]) } | arg tEQQ arg { result = new_call val[0], :"===", argl(val[2]) } | arg tNEQ arg { result = new_call val[0], :"!=", argl(val[2]) } | arg tMATCH arg { result = self.get_match_node val[0], val[2] } | arg tNMATCH arg { result = s(:not, self.get_match_node(val[0], val[2])) } | tBANG arg { result = new_call val[1], :"!" } | tTILDE arg { result = new_call value_expr(val[1]), :"~" } | arg tLSHFT arg { val[0] = value_expr val[0] val[2] = value_expr val[2] result = new_call val[0], :"\<\<", argl(val[2]) } | arg tRSHFT arg { val[0] = value_expr val[0] val[2] = value_expr val[2] result = new_call val[0], :">>", argl(val[2]) } | arg tANDOP arg { result = logop(:and, val[0], val[2]) } | arg tOROP arg { result = logop(:or, val[0], val[2]) } | kDEFINED opt_nl arg { result = s(:defined, val[2]) } | arg tEH arg opt_nl tCOLON arg { lexer.tern.pop result = s(:if, val[0], val[2], val[5]) } | primary arg_value: arg { result = value_expr(val[0]) } aref_args: none | args trailer { result = args [val[0]] } | args tCOMMA assocs trailer { result = args [val[0], array_to_hash(val[2])] } | assocs trailer { result = args [array_to_hash(val[0])] } paren_args: tLPAREN2 opt_call_args rparen { result = val[1] } opt_paren_args: none | paren_args opt_call_args: none { result = val[0] } | call_args { result = val[0] } | args tCOMMA { result = args val } | args tCOMMA assocs tCOMMA { result = args [val[0], array_to_hash(val[2])] } | assocs tCOMMA { result = args [array_to_hash(val[0])] } call_args: command { warning "parenthesize argument(s) for future version" result = call_args val } | args opt_block_arg { result = call_args val result = self.arg_blk_pass val[0], val[1] } | assocs opt_block_arg { result = call_args [array_to_hash(val[0])] result = self.arg_blk_pass result, val[1] } | args tCOMMA assocs opt_block_arg { result = call_args [val[0], array_to_hash(val[2])] result = self.arg_blk_pass result, val[3] } | block_arg { result = call_args val } command_args: { result = lexer.cmdarg.stack.dup # TODO: smell? lexer.cmdarg.push true } call_args { lexer.cmdarg.stack.replace val[0] result = val[1] } block_arg: tAMPER arg_value { result = s(:block_pass, val[1]) } opt_block_arg: tCOMMA block_arg { result = val[1] } | none args: arg_value { result = s(:array, val[0]) } | tSTAR arg_value { result = s(:array, s(:splat, val[1])) } | args tCOMMA arg_value { result = self.list_append val[0], val[2] } | args tCOMMA tSTAR arg_value { result = self.list_append val[0], s(:splat, val[3]) } mrhs: args tCOMMA arg_value { result = val[0] << val[2] } | args tCOMMA tSTAR arg_value { result = self.arg_concat val[0], val[3] } | tSTAR arg_value { result = s(:splat, val[1]) } primary: literal | strings | xstring | regexp | words | qwords | symbols | qsymbols | var_ref | backref | tFID { result = new_call nil, val[0].to_sym } | kBEGIN { result = self.lexer.lineno } bodystmt kEND { unless val[2] then result = s(:nil) else result = s(:begin, val[2]) end result.line = val[1] } | tLPAREN_ARG rparen { debug20 13, val, result } | tLPAREN_ARG expr { lexer.lex_state = :expr_endarg } rparen { warning "(...) interpreted as grouped expression" result = val[1] } | tLPAREN compstmt tRPAREN { result = val[1] || s(:nil) result.paren = true } | primary_value tCOLON2 tCONSTANT { result = s(:colon2, val[0], val[2].to_sym) } | tCOLON3 tCONSTANT { result = s(:colon3, val[1].to_sym) } | tLBRACK aref_args tRBRACK { result = val[1] || s(:array) result[0] = :array # aref_args is :args } | tLBRACE assoc_list tRCURLY { result = s(:hash, *val[1].values) # TODO: array_to_hash? } | kRETURN { result = s(:return) } | kYIELD tLPAREN2 call_args rparen { result = new_yield val[2] } | kYIELD tLPAREN2 rparen { result = new_yield } | kYIELD { result = new_yield } | kDEFINED opt_nl tLPAREN2 expr rparen { result = s(:defined, val[3]) } | kNOT tLPAREN2 expr rparen { result = s(:call, val[2], :"!") } | kNOT tLPAREN2 rparen { debug20 14, val, result } | fcall brace_block { oper, iter = val[0], val[1] call = oper # FIX iter.insert 1, call result = iter call.line = iter.line } | method_call | method_call brace_block { call, iter = val[0], val[1] block_dup_check call, iter iter.insert 1, call # FIX result = iter } | tLAMBDA lambda { result = val[1] # TODO: fix lineno } | kIF expr_value then compstmt if_tail kEND { result = new_if val[1], val[3], val[4] } | kUNLESS expr_value then compstmt opt_else kEND { result = new_if val[1], val[4], val[3] } | kWHILE { lexer.cond.push true } expr_value do { lexer.cond.pop } compstmt kEND { result = new_while val[5], val[2], true } | kUNTIL { lexer.cond.push true } expr_value do { lexer.cond.pop } compstmt kEND { result = new_until val[5], val[2], true } | kCASE expr_value opt_terms case_body kEND { result = new_case val[1], val[3] } | kCASE opt_terms case_body kEND { result = new_case nil, val[2] } | kFOR for_var kIN { lexer.cond.push true } expr_value do { lexer.cond.pop } compstmt kEND { result = new_for val[4], val[1], val[7] } | kCLASS { result = self.lexer.lineno } cpath superclass { self.comments.push self.lexer.comments if (self.in_def || self.in_single > 0) then yyerror "class definition in method body" end self.env.extend } bodystmt kEND { result = new_class val self.env.unextend self.lexer.comments # we don't care about comments in the body } | kCLASS tLSHFT { result = self.lexer.lineno } expr { result = self.in_def self.in_def = false } term { result = self.in_single self.in_single = 0 self.env.extend } bodystmt kEND { result = new_sclass val self.env.unextend self.lexer.comments # we don't care about comments in the body } | kMODULE { result = self.lexer.lineno } cpath { self.comments.push self.lexer.comments yyerror "module definition in method body" if self.in_def or self.in_single > 0 self.env.extend } bodystmt kEND { result = new_module val self.env.unextend self.lexer.comments # we don't care about comments in the body } | kDEF fname { result = [lexer.lineno, self.in_def] self.comments.push self.lexer.comments self.in_def = true self.env.extend } f_arglist bodystmt kEND { line, in_def = val[2] result = new_defn val result[2].line line self.env.unextend self.in_def = in_def self.lexer.comments # we don't care about comments in the body } | kDEF singleton dot_or_colon { self.comments.push self.lexer.comments lexer.lex_state = :expr_fname } fname { self.in_single += 1 self.env.extend lexer.lex_state = :expr_end # force for args result = lexer.lineno } f_arglist bodystmt kEND { result = new_defs val result[3].line val[5] self.env.unextend self.in_single -= 1 self.lexer.comments # we don't care about comments in the body } | kBREAK { result = s(:break) } | kNEXT { result = s(:next) } | kREDO { result = s(:redo) } | kRETRY { result = s(:retry) } primary_value: primary { result = value_expr(val[0]) } # These are really stupid k_begin: kBEGIN k_if: kIF k_unless: kUNLESS k_while: kWHILE k_until: kUNTIL k_case: kCASE k_for: kFOR k_class: kCLASS k_module: kMODULE k_def: kDEF k_end: kEND then: term | kTHEN | term kTHEN do: term | kDO_COND if_tail: opt_else | kELSIF expr_value then compstmt if_tail { result = s(:if, val[1], val[3], val[4]) } opt_else: none | kELSE compstmt { result = val[1] } for_var: lhs | mlhs { val[0].delete_at 1 if val[0][1].nil? # HACK } f_marg: f_norm_arg | tLPAREN f_margs rparen { result = val[1] } f_marg_list: f_marg { result = s(:array, val[0]) } | f_marg_list tCOMMA f_marg { result = list_append val[0], val[2] } f_margs: f_marg_list { args, = val result = block_var args } | f_marg_list tCOMMA tSTAR f_norm_arg { args, _, _, splat = val result = block_var args, "*#{splat}".to_sym } | f_marg_list tCOMMA tSTAR f_norm_arg tCOMMA f_marg_list { args, _, _, splat, _, args2 = val result = block_var args, "*#{splat}".to_sym, args2 } | f_marg_list tCOMMA tSTAR { args, _, _ = val result = block_var args, :* } | f_marg_list tCOMMA tSTAR tCOMMA f_marg_list { args, _, _, _, args2 = val result = block_var args, :*, args2 debug20 16, val, result } | tSTAR f_norm_arg { _, splat = val result = block_var :"*#{splat}" } | tSTAR f_norm_arg tCOMMA f_marg_list { _, splat, _, args = val result = block_var :"*#{splat}", args debug20 17, val, result } | tSTAR { result = block_var :* debug20 18, val, result } | tSTAR tCOMMA f_marg_list { _, _, args = val result = block_var :*, args } block_args_tail: f_block_kwarg tCOMMA f_kwrest opt_f_block_arg { result = call_args val } | f_block_kwarg opt_f_block_arg { result = call_args val } | f_kwrest opt_f_block_arg { result = call_args val } | f_block_arg { result = call_args val } opt_block_args_tail: tCOMMA block_args_tail { result = args val } | none block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_block_args_tail { result = args val } | f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail { result = args val } | f_arg tCOMMA f_block_optarg opt_block_args_tail { result = args val } | f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_block_args_tail { result = args val } | f_arg tCOMMA f_rest_arg opt_block_args_tail { result = args val } | f_arg tCOMMA { result = args val } | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail { result = args val } | f_arg opt_block_args_tail { result = args val } | f_block_optarg tCOMMA f_rest_arg opt_block_args_tail { result = args val } | f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail { result = args val } | f_block_optarg opt_block_args_tail { result = args val } | f_block_optarg tCOMMA f_arg opt_block_args_tail { result = args val } | f_rest_arg opt_block_args_tail { result = args val } | f_rest_arg tCOMMA f_arg opt_block_args_tail { result = args val } | block_args_tail { result = args val } opt_block_param: none | block_param_def block_param_def: tPIPE opt_bv_decl tPIPE { result = args val result = 0 if result == s(:args) } | tOROP { result = 0 self.lexer.command_start = true } | tPIPE block_param opt_bv_decl tPIPE { result = args val } opt_bv_decl: opt_nl | opt_nl tSEMI bv_decls opt_nl { result = args val } bv_decls: bvar { result = args val } | bv_decls tCOMMA bvar { result = args val } bvar: tIDENTIFIER { result = s(:shadow, val[0].to_sym) } | f_bad_arg lambda: { # TODO: dyna_push ? hrm result = lexer.lpar_beg lexer.paren_nest += 1 lexer.lpar_beg = lexer.paren_nest } f_larglist lambda_body { lpar, args, body = val lexer.lpar_beg = lpar args = 0 if args == s(:args) call = new_call nil, :lambda result = new_iter call, args, body } f_larglist: tLPAREN2 f_args opt_bv_decl rparen { result = args val } | f_args { result = val[0] } lambda_body: tLAMBEG compstmt tRCURLY { result = val[1] } | kDO_LAMBDA compstmt kEND { result = val[1] } do_block: kDO_BLOCK { self.env.extend :dynamic result = self.lexer.lineno } opt_block_param { result = self.env.dynamic.keys } compstmt kEND { args = val[2] body = val[4] result = new_iter nil, args, body result.line = val[1] self.env.unextend } block_call: command do_block { # TODO: # if (nd_type($1) == NODE_YIELD) { # compile_error(PARSER_ARG "block given to yield"); syntax_error "Both block arg and actual block given." if val[0].block_pass? result = val[1] result.insert 1, val[0] } | block_call dot_or_colon operation2 opt_paren_args { result = new_call val[0], val[2].to_sym, val[3] } | block_call dot_or_colon operation2 opt_paren_args brace_block { debug20 21, val, result } | block_call dot_or_colon operation2 command_args do_block { debug20 22, val, result } method_call: fcall { result = self.lexer.lineno } paren_args { args = self.call_args val[2..-1] result = val[0].concat args[1..-1] } | primary_value tDOT operation2 opt_paren_args { result = new_call val[0], val[2].to_sym, val[3] } | primary_value tCOLON2 operation2 paren_args { result = new_call val[0], val[2].to_sym, val[3] } | primary_value tCOLON2 operation3 { result = new_call val[0], val[2].to_sym } | primary_value tDOT paren_args { result = new_call val[0], :call, val[2] } | primary_value tCOLON2 paren_args { result = new_call val[0], :call, val[2] } | kSUPER paren_args { result = new_super val[1] } | kSUPER { result = s(:zsuper) } | primary_value tLBRACK2 opt_call_args rbracket { result = new_aref val } brace_block: tLCURLY { self.env.extend :dynamic result = self.lexer.lineno } opt_block_param { result = self.env.dynamic.keys } compstmt tRCURLY { _, line, args, _, body, _ = val result = new_iter nil, args, body result.line = line self.env.unextend } | kDO { self.env.extend :dynamic result = self.lexer.lineno } opt_block_param { result = self.env.dynamic.keys } compstmt kEND { _, line, args, _, body, _ = val result = new_iter nil, args, body result.line = line self.env.unextend } case_body: kWHEN { result = self.lexer.lineno } args then compstmt cases { result = new_when(val[2], val[4]) result.line = val[1] result << val[5] if val[5] } cases: opt_else | case_body opt_rescue: kRESCUE exc_list exc_var then compstmt opt_rescue { _, klasses, var, _, body, rest = val klasses ||= s(:array) klasses << node_assign(var, s(:gvar, :"$!")) if var result = new_resbody(klasses, body) result << rest if rest # UGH, rewritten above } | { result = nil } exc_list: arg_value { result = s(:array, val[0]) } | mrhs | none exc_var: tASSOC lhs { result = val[1] } | none opt_ensure: kENSURE compstmt { _, body = val result = body || s(:nil) } | none literal: numeric { result = s(:lit, val[0]) } | symbol { result = s(:lit, val[0]) } | dsym strings: string { val[0] = s(:dstr, val[0].value) if val[0][0] == :evstr result = val[0] } string: tCHAR { debug20 23, val, result } | string1 | string string1 { result = self.literal_concat val[0], val[1] } string1: tSTRING_BEG string_contents tSTRING_END { result = val[1] } | tSTRING { result = s(:str, val[0]) } xstring: tXSTRING_BEG xstring_contents tSTRING_END { result = new_xstring val[1] } regexp: tREGEXP_BEG regexp_contents tREGEXP_END { result = new_regexp val } words: tWORDS_BEG tSPACE tSTRING_END { result = s(:array) } | tWORDS_BEG word_list tSTRING_END { result = val[1] } word_list: none { result = s(:array) } | word_list word tSPACE { word = val[1][0] == :evstr ? s(:dstr, "", val[1]) : val[1] result = val[0].dup << word } word: string_content | word string_content { result = self.literal_concat val[0], val[1] } symbols: tSYMBOLS_BEG tSPACE tSTRING_END { result = s(:array) } | tSYMBOLS_BEG symbol_list tSTRING_END { result = val[1] } symbol_list: none { result = s(:array) } | symbol_list word tSPACE { list, sym, _ = val case sym[0] when :dstr then sym[0] = :dsym when :str then sym = s(:lit, sym.last.to_sym) else debug20 24 sym = s(:dsym, "", result) end result = list.dup << sym } qwords: tQWORDS_BEG tSPACE tSTRING_END { result = s(:array) } | tQWORDS_BEG qword_list tSTRING_END { result = val[1] } qsymbols: tQSYMBOLS_BEG tSPACE tSTRING_END { result = s(:array) } | tQSYMBOLS_BEG qsym_list tSTRING_END { result = val[1] } qword_list: none { result = s(:array) } | qword_list tSTRING_CONTENT tSPACE { result = val[0].dup << s(:str, val[1]) } qsym_list: none { result = s(:array) } | qsym_list tSTRING_CONTENT tSPACE { result = val[0].dup << s(:lit, val[1].to_sym) } string_contents: none { result = s(:str, "") } | string_contents string_content { result = literal_concat(val[0], val[1]) } xstring_contents: none { result = nil } | xstring_contents string_content { result = literal_concat(val[0], val[1]) } regexp_contents: none { result = nil } | regexp_contents string_content { result = literal_concat(val[0], val[1]) } string_content: tSTRING_CONTENT { result = s(:str, val[0]) } | tSTRING_DVAR { result = lexer.lex_strterm lexer.lex_strterm = nil lexer.lex_state = :expr_beg } string_dvar { lexer.lex_strterm = val[1] result = s(:evstr, val[2]) } | tSTRING_DBEG { result = [lexer.lex_strterm, lexer.brace_nest, lexer.string_nest] lexer.lex_strterm = nil lexer.brace_nest = 0 lexer.string_nest = 0 lexer.cond.push false lexer.cmdarg.push false lexer.lex_state = :expr_beg } compstmt tRCURLY { # TODO: tRCURLY -> tSTRING_DEND _, memo, stmt, _ = val lex_strterm, brace_nest, string_nest = memo lexer.lex_strterm = lex_strterm lexer.brace_nest = brace_nest lexer.string_nest = string_nest lexer.cond.lexpop lexer.cmdarg.lexpop case stmt when Sexp then case stmt[0] when :str, :dstr, :evstr then result = stmt else result = s(:evstr, stmt) end when nil then result = s(:evstr) else debug20 25 raise "unknown string body: #{stmt.inspect}" end } string_dvar: tGVAR { result = s(:gvar, val[0].to_sym) } | tIVAR { result = s(:ivar, val[0].to_sym) } | tCVAR { result = s(:cvar, val[0].to_sym) } | backref symbol: tSYMBEG sym { lexer.lex_state = :expr_end result = val[1].to_sym } | tSYMBOL { result = val[0].to_sym } sym: fname | tIVAR | tGVAR | tCVAR dsym: tSYMBEG xstring_contents tSTRING_END { lexer.lex_state = :expr_end result = val[1] result ||= s(:str, "") case result[0] when :dstr then result[0] = :dsym when :str then result = s(:lit, result.last.to_sym) when :evstr then result = s(:dsym, "", result) else debug20 26, val, result end } numeric: tINTEGER | tFLOAT | tUMINUS_NUM tINTEGER =tLOWEST { result = -val[1] # TODO: pt_testcase } | tUMINUS_NUM tFLOAT =tLOWEST { result = -val[1] # TODO: pt_testcase } user_variable: tIDENTIFIER | tIVAR | tGVAR | tCONSTANT | tCVAR keyword_variable: kNIL { result = s(:nil) } | kSELF { result = s(:self) } | kTRUE { result = s(:true) } | kFALSE { result = s(:false) } | k__FILE__ { result = s(:str, self.file) } | k__LINE__ { result = s(:lit, lexer.src.current_line) } | k__ENCODING__ { result = if defined? Encoding then s(:colon2, s(:const, :Encoding), :UTF_8) else s(:str, "Unsupported!") end } var_ref: user_variable { var = val[0] result = Sexp === var ? var : self.gettable(var) } | keyword_variable { var = val[0] result = Sexp === var ? var : self.gettable(var) } var_lhs: user_variable { result = self.assignable val[0] } | keyword_variable { result = self.assignable val[0] debug20 29, val, result } backref: tNTH_REF { result = s(:nth_ref, val[0]) } | tBACK_REF { result = s(:back_ref, val[0]) } superclass: term { result = nil } | tLT { lexer.lex_state = :expr_beg } expr_value term { result = val[2] } | error term { yyerrok result = nil debug20 30, val, result } f_arglist: tLPAREN2 f_args rparen { result = val[1] lexer.lex_state = :expr_beg self.lexer.command_start = true } | f_args term { self.lexer.lex_state = :expr_beg result = val[0] } args_tail: f_kwarg tCOMMA f_kwrest opt_f_block_arg { result = args val } | f_kwarg opt_f_block_arg { result = args val } | f_kwrest opt_f_block_arg { result = args val } | f_block_arg opt_args_tail: tCOMMA args_tail { result = val[1] } | { result = nil } f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_args_tail { result = args val } | f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail { result = args val } | f_arg tCOMMA f_optarg opt_args_tail { result = args val } | f_arg tCOMMA f_optarg tCOMMA f_arg opt_args_tail { result = args val } | f_arg tCOMMA f_rest_arg opt_args_tail { result = args val } | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail { result = args val } | f_arg opt_args_tail { result = args val } | f_optarg tCOMMA f_rest_arg opt_args_tail { result = args val } | f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail { result = args val } | f_optarg opt_args_tail { result = args val } | f_optarg tCOMMA f_arg opt_args_tail { result = args val } | f_rest_arg opt_args_tail { result = args val } | f_rest_arg tCOMMA f_arg opt_args_tail { result = args val } | args_tail { result = args val } | { result = args val } f_bad_arg: tCONSTANT { yyerror "formal argument cannot be a constant" } | tIVAR { yyerror "formal argument cannot be an instance variable" } | tGVAR { yyerror "formal argument cannot be a global variable" } | tCVAR { yyerror "formal argument cannot be a class variable" } f_norm_arg: f_bad_arg | tIDENTIFIER { identifier = val[0].to_sym self.env[identifier] = :lvar result = identifier } f_arg_item: f_norm_arg | tLPAREN f_margs rparen { result = val[1] } f_arg: f_arg_item { case val[0] when Symbol then result = s(:args) result << val[0] when Sexp then result = val[0] else debug20 32 raise "Unknown f_arg type: #{val.inspect}" end } | f_arg tCOMMA f_arg_item { list, _, item = val if list.sexp_type == :args then result = list else result = s(:args, list) end result << item } f_kw: tLABEL arg_value { # TODO: call_args label, _ = val[0] # TODO: fix lineno? result = s(:array, s(:kwarg, label.to_sym, val[1])) } f_block_kw: tLABEL primary_value { # TODO: call_args label, _ = val[0] # TODO: fix lineno? result = s(:array, s(:kwarg, label.to_sym, val[1])) } f_block_kwarg: f_block_kw | f_block_kwarg tCOMMA f_block_kw { debug20 35, val, result } f_kwarg: f_kw | f_kwarg tCOMMA f_kw { result = args val } kwrest_mark: tPOW | tDSTAR f_kwrest: kwrest_mark tIDENTIFIER { result = :"**#{val[1]}" } | kwrest_mark { debug20 36, val, result } f_opt: tIDENTIFIER tEQL arg_value { result = self.assignable val[0], val[2] # TODO: detect duplicate names } f_block_opt: tIDENTIFIER tEQL primary_value { result = self.assignable val[0], val[2] } f_block_optarg: f_block_opt { result = s(:block, val[0]) } | f_block_optarg tCOMMA f_block_opt { result = val[0] result << val[2] } f_optarg: f_opt { result = s(:block, val[0]) } | f_optarg tCOMMA f_opt { result = self.block_append val[0], val[2] } restarg_mark: tSTAR2 | tSTAR f_rest_arg: restarg_mark tIDENTIFIER { # TODO: differs from parse.y - needs tests name = val[1].to_sym self.assignable name result = :"*#{name}" } | restarg_mark { name = :"*" self.env[name] = :lvar result = name } blkarg_mark: tAMPER2 | tAMPER f_block_arg: blkarg_mark tIDENTIFIER { identifier = val[1].to_sym self.env[identifier] = :lvar result = "&#{identifier}".to_sym } opt_f_block_arg: tCOMMA f_block_arg { result = val[1] } | { result = nil } singleton: var_ref | tLPAREN2 { lexer.lex_state = :expr_beg } expr rparen { result = val[2] yyerror "Can't define single method for literals." if result[0] == :lit } assoc_list: none # [!nil] { result = s(:array) } | assocs trailer # [!nil] { result = val[0] } assocs: assoc | assocs tCOMMA assoc { list = val[0].dup more = val[2][1..-1] list.push(*more) unless more.empty? result = list result[0] = :hash # TODO: shouldn't this be a hash? } assoc: arg_value tASSOC arg_value { result = s(:array, val[0], val[2]) } | tLABEL arg_value { result = s(:array, s(:lit, val[0][0].to_sym), val[1]) } | tDSTAR arg_value { result = s(:kwsplat, val[1]) } operation: tIDENTIFIER | tCONSTANT | tFID operation2: tIDENTIFIER | tCONSTANT | tFID | op operation3: tIDENTIFIER | tFID | op dot_or_colon: tDOT | tCOLON2 opt_terms: | terms opt_nl: | tNL rparen: opt_nl tRPAREN rbracket: opt_nl tRBRACK trailer: | tNL | tCOMMA term: tSEMI { yyerrok } | tNL terms: term | terms tSEMI { yyerrok } none: { result = nil; } end ---- inner require "ruby_lexer" require "ruby_parser_extras" # :stopdoc: # Local Variables: ** # racc-token-length-max:14 ** # End: ** ruby_parser-3.2.2/lib/gauntlet_rubyparser.rb0000555000004100000410000000446012250152360021300 0ustar www-datawww-data#!/usr/bin/ruby -ws $f ||= false $:.unshift "../../ruby_parser/dev/lib" $:.unshift "../../ruby2ruby/dev/lib" require 'rubygems' require 'ruby2ruby' require 'ruby_parser' require 'gauntlet' class RubyParserGauntlet < Gauntlet def initialize super self.data = Hash.new { |h,k| h[k] = {} } old_data = load_yaml data_file self.data.merge! old_data end def should_skip? name if $f then if Hash === data[name] then ! data[name].empty? else data[name] end else data[name] == true # yes, == true on purpose end end def diff_pp o1, o2 require 'pp' Tempfile.new('ruby_parser_a') do |file_a| PP.pp o1, file_a Tempfile.new('ruby_parser_b') do |file_b| PP.pp o2, file_b `diff -u #{file_a.path} #{file_b.path}` end end end def broke name, file, msg warn "bad" self.data[name][file] = msg self.dirty = true end def process path, name begin $stderr.print " #{path}: " rp = RubyParser.new r2r = Ruby2Ruby.new old_ruby = File.read(path) begin old_sexp = rp.process old_ruby rescue Racc::ParseError => e self.data[name][path] = :unparsable self.dirty = true return end new_ruby = r2r.process old_sexp.deep_clone begin new_sexp = rp.process new_ruby rescue Racc::ParseError => e broke name, path, "couldn't parse new_ruby: #{e.message.strip}" return end if old_sexp != new_sexp then broke name, path, diff_pp(old_sexp, new_sexp) return end self.data[name][path] = true self.dirty = true warn "good" rescue Interrupt puts "User cancelled" exit 1 rescue Exception => e broke name, path, " UNKNOWN ERROR: #{e}: #{e.message.strip}" end end def run name warn name Dir["**/*.rb"].sort.each do |path| next if path =~ /gemspec.rb/ # HACK next if data[name][path] == true process path, name end if self.data[name].values.all? { |v| v == true } then warn " ALL GOOD!" self.data[name] = true self.dirty = true end end end filter = ARGV.shift filter = Regexp.new filter if filter gauntlet = RubyParserGauntlet.new gauntlet.run_the_gauntlet filter ruby_parser-3.2.2/lib/ruby20_parser.rb0000644000004100000410000074720412250152360017707 0ustar www-datawww-data# # DO NOT MODIFY!!!! # This file is automatically generated by Racc 1.4.9 # from Racc grammer file "". # require 'racc/parser.rb' class Ruby20Parser < Racc::Parser require "ruby_lexer" require "ruby_parser_extras" # :stopdoc: # Local Variables: ** # racc-token-length-max:14 ** # End: ** ##### State transition tables begin ### clist = [ '-501,528,-102,507,528,-101,237,-501,-501,-501,651,658,-501,-501,-501', '237,-501,-99,301,651,-107,-85,128,237,-501,651,-501,-501,-501,-101,-103', '528,-71,356,-103,528,-501,-501,359,-501,-501,-501,-501,-501,652,528', '-104,530,434,3,299,435,16,652,308,310,-106,-100,129,652,57,251,252,731', '651,846,506,-501,-501,-501,-501,-501,-501,-501,-501,-501,-501,-501,-501', '-501,-501,-105,731,-501,-501,-501,-104,-501,-501,731,751,-501,840,236', '-501,-501,-594,-501,652,-501,-106,-501,236,-501,-501,-501,-501,-501', '-501,-501,236,-501,-594,-501,-93,356,-102,661,356,-101,359,-102,-90', '359,-101,-98,-501,-501,-501,-501,-598,-501,556,-501,-92,-94,356,-598', '-598,-598,-501,359,-598,-598,-598,356,-598,-595,-103,356,359,129,919', '-103,359,-598,-598,-598,-598,356,-104,-97,-91,356,359,-104,-598,-598', '359,-598,-598,-598,-598,-598,657,-102,-501,-95,655,428,814,-93,356,-501', '237,412,-96,359,356,356,-266,-95,412,359,359,749,301,-598,-598,-598', '-598,-598,-598,-598,-598,-598,-598,-598,-598,-598,-598,301,469,-598', '-598,-598,-93,777,-598,-93,129,-598,251,252,-598,-598,855,-598,412,-598', '-93,-598,-107,-598,-598,-598,-598,-598,-598,-598,356,-598,-598,-598', '-95,359,409,410,411,-417,824,251,252,409,410,-598,-598,-598,-598,-598', '-289,-598,666,-598,719,530,129,-289,-289,-289,-103,236,-289,-289,-289', '468,-289,-511,-510,-95,-93,814,-95,572,-511,-510,-289,-289,-289,409', '410,412,434,-95,472,578,-289,-289,684,-289,-289,-289,-289,-289,-512', '-515,-93,-97,-598,774,434,-512,129,435,328,-598,412,-102,-106,412,-594', '773,874,-426,-598,400,401,-289,-289,-289,-289,-289,-289,-289,-289,-289', '-289,-289,-289,-289,-289,129,-598,-289,-289,-289,412,776,-289,336,412', '-289,409,410,-289,-289,338,-289,-99,-289,814,-289,-102,-289,-289,-289', '-289,-289,-289,-289,812,-289,-516,-289,-104,-101,-426,409,410,451,409', '410,476,-426,-598,-591,-289,-289,-289,-289,-504,-289,-426,-289,388,674', '356,-504,-504,-504,-105,359,-504,-504,-504,129,-504,409,410,439,-426', '409,410,455,-504,-506,-504,-504,-504,301,674,-509,-506,-592,129,-100', '-504,-504,-509,-504,-504,-504,-504,-504,-508,781,-98,-598,-501,434,421', '-508,435,356,-598,-501,599,-107,359,-594,-591,299,415,-598,-501,308', '310,-504,-504,-504,-504,-504,-504,-504,-504,-504,-504,-504,-504,-504', '-504,-598,-591,-504,-504,-504,-504,-504,-504,598,603,-504,873,-504,-504', '-504,352,-504,-592,-504,839,-504,-504,-504,-504,-504,-504,-504,-504', '-504,600,-504,744,-504,621,624,596,-504,606,129,-592,599,-515,605,-504', '372,-504,-504,-504,-504,-289,-504,374,-504,251,252,352,-289,-289,-289', '-504,373,-92,-289,-289,744,-289,621,624,596,781,606,-336,-101,598,603', '336,356,-507,-336,762,599,359,338,-90,-507,-289,-289,-336,-289,-289', '-289,-289,-289,744,-99,621,624,596,515,606,356,761,601,513,514,359,759', '605,129,980,738,999,758,598,603,129,-289,-289,-289,-289,-289,-289,-289', '-289,-289,-289,-289,-289,-289,-289,-289,716,-289,-289,-289,882,722,-289', '826,814,-289,884,-595,-289,-516,885,-289,605,-289,887,-289,888,-289', '-289,-289,-289,-289,-289,-289,889,-289,891,-289,744,756,621,624,596', '301,606,754,857,752,-95,-598,-289,-289,747,-96,129,-289,-598,-598,-598', '-104,738,-91,-598,-598,-105,-598,736,744,897,621,624,596,-100,606,-598', '299,740,662,129,308,310,314,317,674,943,-598,-598,129,-598,-598,-598', '-598,-598,663,900,436,727,744,904,621,624,596,437,606,744,740,621,624', '596,572,606,426,598,603,746,-265,-598,-598,-598,-598,-598,-598,-598', '-598,-598,-598,-598,-598,-598,-598,-513,906,-598,-598,-598,740,725,-513', '251,252,-598,352,740,-598,924,910,-513,301,-598,129,-598,746,-598,-598', '-598,-598,-598,-598,-598,-267,-598,-598,-598,312,315,955,-514,621,624', '596,129,606,913,-514,914,-598,-598,-85,-94,299,-598,303,-514,308,310', '314,317,826,814,-103,140,142,144,148,152,158,163,167,170,176,181,192', '196,202,206,210,213,133,136,139,143,145,150,154,251,252,129,171,177', '182,187,197,200,208,211,214,134,389,390,391,392,393,156,161,166,169', '173,179,184,189,194,198,204,212,710,131,301,389,390,391,392,393,157', '162,709,174,180,186,191,195,201,207,312,315,132,138,341,342,301,149', '153,159,164,744,129,621,624,596,299,606,251,252,308,310,314,317,141', '146,705,155,160,165,168,172,178,183,188,193,203,209,299,-265,135,-289', '308,310,314,317,703,699,-289,740,690,129,744,-595,621,624,596,-289,606', '688,137,925,687,129,928,151,140,142,144,148,152,158,163,167,170,176', '181,192,196,202,206,210,213,133,136,139,143,145,150,154,740,929,738', '171,177,182,187,197,200,208,211,214,134,389,390,391,392,393,156,161', '166,169,173,179,184,189,194,932,934,212,936,955,301,621,624,596,938', '606,157,162,936,174,180,186,191,195,201,207,312,315,132,138,301,941', '942,149,153,159,164,744,301,621,624,596,299,606,303,944,308,310,314', '317,141,146,301,155,160,165,168,172,178,183,188,193,203,209,301,678', '135,403,129,-513,675,674,425,959,405,740,-513,961,744,427,621,624,596', '404,606,-513,137,556,426,517,576,151,140,142,144,148,152,158,163,167', '170,176,181,192,196,202,206,210,213,133,136,139,143,145,150,154,740', '574,546,171,177,182,187,197,200,208,211,214,134,389,390,391,392,393', '156,161,166,169,173,179,184,189,194,572,972,212,768,770,352,-514,766', '8,15,-268,157,162,-514,174,180,186,191,195,201,207,556,-514,132,138', '-290,-289,662,149,153,159,164,-290,-289,943,549,129,-70,-595,526,977', '-290,-289,663,978,141,146,525,155,160,165,168,172,178,183,188,193,203', '209,662,1005,135,9,459,-290,523,664,1007,982,301,461,-290,64,508,479', '663,1006,478,470,460,-290,137,466,991,993,995,151,140,142,144,148,152', '158,163,167,170,176,181,192,196,202,206,210,213,133,136,139,143,145', '150,154,997,458,995,171,177,182,187,197,200,208,211,214,134,457,738', '454,438,415,156,161,166,169,173,179,184,189,194,331,430,212,1004,424', '423,-281,421,418,1010,415,157,162,-281,174,180,186,191,195,201,207,1014', '-281,132,138,-281,-290,352,149,153,159,164,-281,-290,982,348,936,1018', '936,936,1021,-281,-290,-595,-594,141,146,402,155,160,165,168,172,178', '183,188,193,203,209,129,398,135,9,128,395,1027,1028,368,347,345,340', '690,64,129,328,982,326,995,1040,995,995,137,291,288,129,270,151,140', '142,144,148,152,158,163,167,170,176,181,192,196,202,206,210,213,133', '136,139,143,145,150,154,255,982,936,171,177,182,280,283,284,285,211', '214,134,248,109,995,,,156,161,166,169,275,278,279,281,194,86,93,287', ',4,,,,,,,157,162,,174,180,186,191,195,201,207,,,132,138,,,,149,153,159', '164,,,,,,282,,,,,,,,141,146,,155,160,165,168,172,178,183,188,193,203', '209,,,135,,,,,,,,,,,,,,,,,,,,137,,,,,151,140,142,144,148,152,158,163', '167,170,176,181,192,196,202,206,210,213,133,136,139,143,145,150,154', ',,,171,177,182,187,197,200,208,211,214,134,,,,,,156,161,166,169,173', '179,184,189,194,,,212,,,,,,,,,157,162,,174,180,186,191,195,201,207,', ',132,138,,,,149,153,159,164,,,,,,,,,,,,,,141,146,,155,160,165,168,172', '178,183,188,193,203,209,,,135,9,,,,,,,,,,64,,,,,,,,,137,,,,,151,140', '142,144,148,152,158,163,167,170,176,181,192,196,202,206,210,213,133', '136,139,143,145,150,154,,,,171,177,182,187,197,200,208,211,214,134,', ',,,,156,161,166,169,173,179,184,189,194,,,212,,,,,,,,,157,162,,174,180', '186,191,195,201,207,,,132,138,,,,149,153,159,164,,,,,,,,,,,,,,141,146', ',155,160,165,168,172,178,183,188,193,203,209,,,135,9,,,,,,,,,,64,14', '19,26,33,38,41,,,137,59,69,,,151,88,,100,106,5,11,20,25,32,,,,,,62,66', '72,74,80,85,92,,,6,,,,,735,43,48,51,54,56,63,70,75,82,86,93,98,,4,8', '15,,29,35,,45,49,55,301,302,305,307,309,313,316,318,320,322,298,,304', '306,,,312,315,,60,,,78,,,97,101,,,13,,27,299,,303,46,308,310,314,317', '319,321,323,91,300,,,,9,16,23,31,36,40,,,,57,64,,311,,-242,,,108,,,17', '22,30,362,19,26,33,38,41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,', '62,66,72,74,80,85,92,,,6,,,,,714,43,48,,54,56,63,70,75,82,86,93,98,', '4,8,15,,29,35,,45,49,55,301,302,305,307,309,313,316,318,320,322,298', ',304,306,,,312,315,,60,,,78,,,97,101,,,13,,27,299,,303,46,308,310,314', '317,319,321,323,91,300,,,,9,16,23,31,36,40,,,,57,64,,311,,,,,108,,,17', '22,30,362,19,26,33,38,41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,', '62,66,72,74,80,85,92,,,6,,,,,735,43,48,,54,56,63,70,75,82,86,93,98,', '4,8,15,,29,35,,45,49,55,301,302,305,307,309,313,316,318,320,322,298', ',304,306,,,312,315,,60,,,78,,,97,101,,,13,,27,299,,303,46,308,310,314', '317,319,321,323,91,300,,,,9,16,23,31,36,40,,,,57,64,,311,,,,,108,,,17', '22,30,362,19,26,33,38,41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,', '62,66,72,74,80,85,92,,,6,,,,,,43,48,,54,56,63,70,75,82,86,93,98,,4,8', '15,,29,35,,45,49,55,301,302,305,307,309,313,316,318,320,322,298,,304', '306,,,312,315,,60,,,78,,,97,101,,,13,,27,299,,303,46,308,310,314,317', '319,321,323,91,300,,,,9,16,23,31,36,40,,,,57,64,,311,,,,,108,,,17,22', '30,362,19,26,33,38,41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62', '66,72,74,80,85,92,,,6,,,,,,43,48,,54,56,63,70,75,82,86,93,98,,4,8,15', ',29,35,,45,49,55,301,302,305,307,309,313,316,318,320,322,298,,304,306', ',,312,315,,60,,,78,,,97,101,,,13,,27,299,,303,46,308,310,314,317,319', '321,323,91,300,,,,9,16,23,31,36,40,,,,57,64,,311,,,,,108,,,17,22,30', '362,19,26,33,38,41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66', '72,74,80,85,92,,,6,,,,,,43,48,,54,56,63,70,75,82,86,93,98,,4,8,15,,29', '35,,45,49,55,301,302,305,307,309,313,316,318,320,322,298,,304,306,,', '312,315,,60,,,78,,,97,101,,,13,,27,299,,303,46,308,310,314,317,319,321', '323,91,300,,,,9,16,23,31,36,40,,,,57,64,,311,,,,,108,,,17,22,30,362', '19,26,33,38,41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74', '80,85,92,,,6,,,,,,43,48,,54,56,63,70,75,82,86,93,98,,4,8,15,,29,35,', '45,49,55,301,302,305,307,309,313,316,318,320,322,298,,304,306,,,312', '315,,60,,,78,,,97,101,,,13,,27,299,,303,46,308,310,314,317,319,321,323', '91,300,,,,9,16,23,31,36,40,,,,57,64,,311,,,,,108,,,17,22,30,362,19,26', '33,38,41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74,80,85', '92,,,6,,,,,,43,48,,54,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49', '55,301,302,305,307,309,313,316,318,320,322,298,,304,306,,,312,315,,60', ',,78,,,97,101,,,13,,27,299,,303,46,308,310,314,317,319,321,323,91,300', ',,,9,16,23,31,36,40,,,,57,64,,311,,,,,108,,,17,22,30,362,19,26,33,38', '41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74,80,85,92,', ',6,,,,,,43,48,,54,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,301', '302,305,307,309,313,316,318,320,322,298,,304,306,,,312,315,,60,,,78', ',,97,101,,,13,,27,299,,303,46,308,310,314,317,319,321,323,91,300,,,', '9,16,23,31,36,40,,,,57,64,,311,,,,,108,,,17,22,30,362,19,26,33,38,41', ',,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74,80,85,92,,,6', ',,,,,43,48,,54,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,301', '302,305,307,309,313,316,318,320,322,298,,304,306,,,312,315,,60,,,78', ',,97,101,,,13,,27,299,,303,46,308,310,314,317,319,321,323,91,300,,,', '9,16,23,31,36,40,,,,57,64,,311,,,,,108,,,17,22,30,362,19,26,33,38,41', ',,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74,80,85,92,,,6', ',,,,,43,48,,54,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,301', '302,305,307,309,313,316,318,320,322,298,,304,306,,,312,315,,60,,,78', ',,97,101,,,13,,27,299,,303,46,308,310,314,317,319,321,323,91,300,,,', '9,16,23,31,36,40,,,,57,64,,311,,,,,108,,,17,22,30,362,19,26,33,38,41', ',,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74,80,85,92,,,6', ',,,,,43,48,,54,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,301', '302,305,307,309,313,316,318,320,322,298,,304,306,,,312,315,,60,,,78', ',,97,101,,,13,,27,299,,303,46,308,310,314,317,319,321,323,91,300,,,', '9,16,23,31,36,40,,,,57,64,129,311,,,,,108,,,17,22,30,362,19,26,33,38', '41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74,80,85,92,', ',6,,,,,,43,48,,54,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,301', '302,305,307,309,313,316,318,320,322,298,,304,306,,,312,315,,60,,,365', ',,97,101,,,13,,27,299,,303,46,308,310,314,317,319,321,323,91,300,,,', '9,16,23,31,36,40,,,,57,64,,311,,,,,108,,,17,22,30,362,19,26,33,38,41', ',,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74,80,85,92,,,6', ',,,,,43,48,,54,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,301', '302,305,307,309,313,316,318,320,322,298,,304,306,,,312,315,,60,,,78', ',,97,101,,,13,,27,299,,303,46,308,310,314,317,319,321,323,91,300,,,', '9,16,23,31,36,40,,,,57,64,,311,,,,,108,,,17,22,30,362,19,26,33,38,41', ',,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74,80,85,92,,,6', ',,,,,43,48,,54,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,301', '302,305,307,309,313,316,318,320,322,298,,304,306,,,312,315,,60,,,78', ',,97,101,,,13,,27,299,,303,46,308,310,314,317,319,321,323,91,300,,,', '9,16,23,31,36,40,,,,57,64,,311,,,,,108,,,17,22,30,362,19,26,33,38,41', ',,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74,80,85,92,,,6', ',,,,,43,48,,54,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,301', '302,305,307,309,313,316,318,320,322,298,,304,306,,,312,315,,60,,,78', ',,97,101,,,13,,27,299,,303,46,308,310,314,317,319,321,323,91,300,,,', '9,16,23,31,36,40,,,,57,64,,311,,,,,108,,,17,22,30,362,19,26,33,38,41', ',,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74,80,85,92,,,6', ',,,,,43,48,,54,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,301', '302,305,307,309,313,316,318,320,322,298,,304,306,,,312,315,,60,,,78', ',,97,101,,,13,,27,299,,303,46,308,310,314,317,319,321,323,91,300,,,', '9,16,23,31,36,40,,,,57,64,,311,,,,,108,,,17,22,30,362,19,26,33,38,41', ',,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74,80,85,92,,,6', ',,,,,43,48,,54,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,301', ',,,,,,,,,,,,,,,312,315,,60,,,78,,,97,101,,,13,,27,299,,303,46,308,310', '314,317,,,323,91,300,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22', '30,362,19,26,33,38,41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62', '66,72,74,80,85,92,,,6,,,,,,43,48,,54,56,63,70,75,82,86,93,98,,4,8,15', ',29,35,,45,49,55,301,-617,-617,-617,-617,313,316,,,-617,-617,,,,,,312', '315,,60,,,78,,,97,101,,,13,,27,299,,303,46,308,310,314,317,319,321,323', '91,300,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,362,19,26,33', '38,41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74,80,85,92', ',,6,,,,,,43,48,,54,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55', '301,,,,,,,,,,,,,,,,312,315,,60,,,78,,,97,101,,,13,,27,299,,303,46,308', '310,314,317,,,323,91,300,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17', '22,30,362,19,26,33,38,41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,', '62,66,72,74,80,85,92,,,6,,,,,,43,48,,54,56,63,70,75,82,86,93,98,,4,8', '15,,29,35,,45,49,55,301,-617,-617,-617,-617,313,316,,,-617,-617,,,,', ',312,315,,60,,,78,,,97,101,,,13,,27,299,,303,46,308,310,314,317,319', '321,323,91,300,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,362', '19,26,33,38,41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74', '80,85,92,,,6,,,,,,43,48,,54,56,63,70,75,82,86,93,98,,4,8,15,,29,35,', '45,49,55,301,302,305,307,309,313,316,318,320,322,298,,-617,-617,,,312', '315,,60,,,78,,,97,101,,,13,,27,299,,303,46,308,310,314,317,319,321,323', '91,300,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,362,19,26,33', '38,41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74,80,85,92', ',,6,,,,,,43,48,,54,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55', '301,-617,-617,-617,-617,313,316,,,-617,-617,,,,,,312,315,,60,,,78,,', '97,101,,,13,,27,299,,303,46,308,310,314,317,319,321,323,91,300,,,,9', '16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,362,19,26,33,38,41,,,,59', '69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74,80,85,92,,,6,,,,,,43', '48,,54,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,301,302,305', '307,309,313,316,,,322,298,,,,,,312,315,,60,,,365,,,97,101,,,13,,27,299', ',303,46,308,310,314,317,319,321,323,91,300,,,,9,16,23,31,36,40,,,,57', '64,,,,,,,108,,,17,22,30,362,19,26,33,38,41,,,,59,69,,,,88,,100,106,5', '11,20,25,32,,,,,,62,66,72,74,80,85,92,,,6,,,,,,43,48,,54,56,63,70,75', '82,86,93,98,,4,8,15,,29,35,,45,49,55,301,,,,,,,,,,,,,,,,312,315,,60', ',,78,,,97,101,,,13,,27,299,,303,46,308,310,314,317,,,323,91,300,,,,9', '16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,362,19,26,33,38,41,,,,59', '69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74,80,85,92,,,6,,,,,,43', '48,,54,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,301,-617,-617', '-617,-617,313,316,,,-617,-617,,,,,,312,315,,60,,,78,,,97,101,,,13,,27', '299,,303,46,308,310,314,317,319,321,323,91,300,,,,9,16,23,31,36,40,', ',,57,64,,,,,,,108,,,17,22,30,362,19,26,33,38,41,,,,59,69,,,,88,,100', '106,5,11,20,25,32,,,,,,62,66,72,74,80,85,92,,,6,,,,,,43,48,,54,56,63', '70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,301,302,305,307,309,313,316', '318,320,322,298,,-617,-617,,,312,315,,60,,,365,,,97,101,,,13,,27,299', ',303,46,308,310,314,317,319,321,323,91,300,,,,9,16,23,31,36,40,,,,57', '64,,,,,,,108,,,17,22,30,362,19,26,33,38,41,,,,59,69,,,,88,,100,106,5', '11,20,25,32,,,,,,62,66,72,74,80,85,92,,,6,,,,,,43,48,,54,56,63,70,75', '82,86,93,98,,4,8,15,,29,35,,45,49,55,301,-617,-617,-617,-617,313,316', ',,-617,-617,,,,,,312,315,,60,,,78,,,97,101,,,13,,27,299,,303,46,308', '310,314,317,319,321,323,91,300,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108', ',,17,22,30,362,19,26,33,38,41,,,,59,69,,,,88,,100,106,5,11,20,25,32', ',,,,,62,66,72,74,80,85,92,,,6,,,,,,43,48,,54,56,63,70,75,82,86,93,98', ',4,8,15,,29,35,,45,49,55,301,302,305,307,309,313,316,318,,322,298,,', ',,,312,315,,60,,,78,,,97,101,,,13,,27,299,,303,46,308,310,314,317,319', '321,323,91,300,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,14', '19,26,33,38,41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74', '80,85,92,,,6,,,,,,43,48,51,54,56,63,70,75,82,86,93,98,,4,8,15,,29,35', ',45,49,55,301,-617,-617,-617,-617,313,316,,,-617,-617,,,,,,312,315,', '60,,,78,,,97,101,,,13,,27,299,,303,46,308,310,314,317,319,321,323,91', '300,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,', ',,59,69,,,,88,,100,106,5,111,112,25,32,,,,,,119,121,122,74,80,85,92', ',,110,,,,,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,', ',,,,,,,,,,,,,,,,,226,,,228,,,97,101,,744,13,621,624,596,600,606,46,', ',,,,,,231,599,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,601,,17,22,30,19', '26,33,,41,,598,603,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72', '74,80,85,92,,,110,,,,605,,,48,,,56,63,70,75,82,86,93,98,233,4,8,15,', '29,35,,45,49,55,301,,,,,,,,,,,,,,,,312,315,,226,,,228,,,97,101,,,13', ',218,299,220,303,46,308,310,314,317,,,323,231,300,,,,9,16,23,31,36,40', ',,,57,64,,,,,,,108,,215,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106', '5,111,112,25,32,,,,,,119,121,122,74,80,85,92,,,110,,,,,,,48,,,56,63', '70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,', '228,,,97,101,,744,13,621,624,596,781,606,46,,,,,,,,231,599,,,,9,16,23', '31,36,40,,,,57,64,,,,,,,108,601,,17,22,30,19,26,33,,41,,598,603,59,69', ',,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74,80,85,92,,,110,,,,605', ',,48,,,56,63,70,75,82,86,93,98,233,4,8,15,,29,35,,45,49,55,,,,,,,,,', ',,,,,,,,,,226,,,228,,,97,101,,,13,,218,,220,,46,,,,,,,,231,,,,,9,16', '23,31,36,40,,,,57,64,,,,,,,108,,215,17,22,30,19,26,33,,41,,,,59,69,', ',,88,,100,106,5,111,112,25,32,,,,,,119,121,122,74,80,85,92,,,110,,,', ',,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,', ',,,,,,,,226,,,228,,,97,101,,744,13,621,624,596,781,606,46,,,,,,,,231', '599,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,601,,17,22,30,19,26,33,,41', ',598,603,59,69,,,,88,,100,106,5,111,112,25,32,,,,,,119,121,122,74,80', '85,92,,,110,,,,605,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45', '49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,744,13,621,624,596,781', '606,46,,,,,,,,231,599,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,601,,17', '22,30,19,26,33,,41,,598,603,59,69,,,,88,,100,106,5,11,20,25,32,,,,,', '62,66,72,74,80,85,92,,,6,,,,605,,,48,,,56,63,70,75,82,86,93,98,,4,8', '15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,744,13,621', '624,596,600,606,46,,,,,,,,91,599,,,,9,16,23,31,36,40,,,,57,64,356,,', ',,359,108,601,,17,22,30,19,26,33,,41,,598,603,59,69,,,,88,,100,106,5', '11,20,25,32,,,,,,62,66,72,74,80,85,92,,,110,,,,605,,,48,,,56,63,70,75', '82,86,93,98,233,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228', ',,97,101,,,13,,218,,220,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64', ',,,,,,108,,215,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,11,20', '25,32,,,,,,62,66,72,74,80,85,92,,,6,,,,,,,48,,,56,63,70,75,82,86,93', '98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,744', '13,621,624,596,781,606,46,,,,,,,,91,599,,,,9,16,23,31,36,40,,,,57,64', '129,,,,,,108,601,,17,22,30,19,26,33,,41,,598,603,59,69,,,,88,,100,106', '5,11,20,25,32,,,,,,62,66,72,74,80,85,92,,,110,,,,605,,,48,,,56,63,70', '75,82,86,93,98,233,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,', '228,,,97,101,,,13,,218,,220,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57', '64,,,,,,,108,,215,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,111', '112,25,32,,,,,,119,121,122,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75', '82,86,93,98,233,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228', ',,97,101,,,13,,218,,,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,,', ',,,,108,,215,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,11,20,25', '32,,,,,,62,66,72,74,80,85,92,,,6,,,,,,,48,,,56,63,70,75,82,86,93,98', ',4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,744', '13,621,624,596,600,606,46,,,,,,,,91,599,,,,9,16,23,31,36,40,,,,57,64', ',,,,,,108,601,,17,22,30,19,26,33,,41,,598,603,59,69,,,,88,,100,106,5', '111,112,25,32,,,,,,119,121,122,74,80,85,92,,,110,,,,605,,,48,,,56,63', '70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,', '228,,,97,101,,744,13,621,624,596,600,606,46,,,,,,,,231,599,,,,9,16,23', '31,36,40,,,,57,64,,,,,,,108,601,,17,22,30,19,26,33,,41,,598,603,59,69', ',,,88,,100,106,5,111,112,25,32,,,,,,119,121,122,74,80,85,92,,,110,,', ',605,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,', ',,,,,,,,,,,,226,,,228,,,97,101,,744,13,621,624,596,600,606,46,,,,,,', ',231,599,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,601,,17,22,30,19,26', '33,,41,,598,603,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74', '80,85,92,,,6,,,,605,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45', '49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,,,,,91,', ',,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59', '69,,,,88,,100,106,5,111,112,25,32,,,,,,119,121,122,74,80,85,92,,,110', ',,,,,,115,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,,,117,,,,,,,,,,', ',,,,,,,,,877,,,228,,,97,101,,,13,,,,,,,,,,,,,,,,,,,9,16,23,31,36,40', ',,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5', '111,112,25,32,,,,,,119,121,122,74,80,85,92,,,110,,,,,,,48,,,56,63,70', '75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228', ',,97,101,,,13,,,,,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,', ',108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,111,112,25,32', ',,,,,119,121,122,74,80,85,92,,,110,,,,,,,115,,,56,63,70,75,82,86,93', '98,,4,8,15,,29,35,,,,117,,,,,,,,,,,,,,,,,,,,261,,,267,,,97,101,,,13', ',,,,,,,,,,,,,,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19', '26,33,,41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74,80', '85,92,,,6,,,,,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55', ',,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,,,,,91,,,,,9,16', '23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88', ',100,106,5,111,112,25,32,,,,,,119,121,122,74,80,85,92,,,110,,,,,,,48', ',,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,', ',,226,,,228,,,97,101,,,13,,,,,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,', ',57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,111', '112,25,32,,,,,,119,121,122,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75', '82,86,93,98,233,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228', ',,97,101,,,13,,638,,,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,,', ',,,,108,,215,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,111,112', '25,32,,,,,,119,121,122,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86', '93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101', ',,13,,,,,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17', '22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,111,112,25,32,,,,,,119', '121,122,74,80,85,92,,,110,,,,,,,115,,,56,63,70,75,82,86,93,98,,4,8,15', ',29,35,,,,117,,,,,,,,,,,,,,,,,,,,261,,,267,,,97,101,,,13,,,,,,,,,,,', ',,,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,', ',,59,69,,,,88,,100,106,5,111,112,25,32,,,,,,119,121,122,74,80,85,92', ',,110,,,,,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,', ',,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,,,,,231,,,,,9,16', '23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88', ',100,106,5,111,112,25,32,,,,,,119,121,122,74,80,85,92,,,110,,,,,,,48', ',,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,', ',,226,,,228,,,97,101,,,13,,,,,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,', ',57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,111', '112,25,32,,,,,,119,121,122,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75', '82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,', '97,101,,,13,,,,,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108', ',,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62', '66,72,74,80,85,92,,,6,,,,,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29', '35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,', ',,,91,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41', ',,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74,80,85,92,,,6', ',,,,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,', ',,,,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,,,,,91,,,,,9,16,23,31', '36,40,,,,57,64,129,,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,', '100,106,5,11,20,25,32,,,,,,62,66,72,74,80,85,92,,,6,,,,,,,48,,,56,63', '70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,', '228,,,97,101,,,13,,,,,,46,,,,,,,,91,,,,,9,16,23,31,36,40,,,,57,64,,', ',,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,111,112,25', '32,,,,,,119,121,122,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86,93', '98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,', '13,,,,,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22', '30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,111,112,25,32,,,,,,119,121', '122,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29', '35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,', ',,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,38', '41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74,80,85,92,', ',6,,,,,,43,48,,54,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,', ',,,,,,,,,,,,,,,,,,60,,,78,,,97,101,,,13,,27,,,,46,,,,,,,,91,,,,,9,16', '23,31,36,40,,,,57,64,,,,,,546,108,,,17,22,30,19,26,33,,41,,,,59,69,', ',,88,,100,106,5,111,112,25,32,,,,,,119,121,122,74,80,85,92,,,110,,,', ',,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,', ',,,,,,,,226,,,228,,,97,101,,,13,,534,,,,46,,,,,,,,231,,,,,9,16,23,31', '36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100', '106,5,111,112,25,32,,,,,,119,121,122,74,80,85,92,,,110,,,,,,,48,,,56', '63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226', ',,228,,,97,101,,,13,,,,,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64', ',,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,111,112', '25,32,,,,,,119,121,122,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86', '93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101', ',,13,,829,,,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,', ',17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,111,112,25,32,,,,,', '119,121,122,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86,93,98,,4', '8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,', ',,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19', '26,33,,41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74,80', '85,92,,,110,,,,,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49', '55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,,,,,231,,,', ',9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69', ',,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74,80,85,92,,,110,,,,,,,48', ',,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,', ',,226,,,228,,,97,101,,,13,,,,,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,', ',57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,111', '112,25,32,,,,,,119,121,122,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75', '82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,', '97,101,,,13,,,,,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108', ',,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,111,112,25,32,,,,', ',119,121,122,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86,93,98,,4', '8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,', ',,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19', '26,33,,41,,,,59,69,,,,88,,100,106,5,111,112,25,32,,,,,,119,121,122,74', '80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45', '49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,,,,,231', ',,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59', '69,,,,88,,100,106,5,111,112,25,32,,,,,,119,121,122,74,80,85,92,,,110', ',,,,,,115,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,,,117,,,,,,,,,,', ',,,,,,,,,261,,,267,,,97,101,,,13,,265,,,,,,,,,,,,,,,,,9,16,23,31,36', '40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106', '5,111,112,25,32,,,,,,119,121,122,74,80,85,92,,,110,,,,,,,115,,,56,63', '70,75,82,86,93,98,,4,8,15,,29,35,,,,117,,,,,,,,,,,,,,,,,,,,261,,,228', ',,97,101,,,13,,,,,,,,,,,,,,,,,,,9,16,23,31,36,40,,,,57,64,,,,263,,,108', ',,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,111,112,25,32,,,,', ',119,121,122,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86,93,98,,4', '8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,', ',,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19', '26,33,,41,,,,59,69,,,,88,,100,106,5,111,112,25,32,,,,,,119,121,122,74', '80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45', '49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,,,,,231', ',,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59', '69,,,,88,,100,106,5,111,112,25,32,,,,,,119,121,122,74,80,85,92,,,110', ',,,,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,', ',,,,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,,,,,231,,,,,9,16,23,31', '36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100', '106,5,111,112,25,32,,,,,,119,121,122,74,80,85,92,,,110,,,,,,,48,,,56', '63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226', ',,228,,,97,101,,,13,,,,,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64', ',,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,111,112', '25,32,,,,,,119,121,122,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86', '93,98,233,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97', '101,,,13,,638,,220,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,', ',,108,,215,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,111,112,25', '32,,,,,,119,121,122,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86,93', '98,233,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101', ',,13,,,,220,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,', '215,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,,', ',62,66,72,74,80,85,92,,,6,,,,,,,48,,,56,63,70,75,82,86,93,98,,4,8,15', ',29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46', ',,,,,,,91,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33', ',41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74,80,85,92', ',,110,,,,,,,48,,,56,63,70,75,82,86,93,98,233,4,8,15,,29,35,,45,49,55', ',,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,218,,220,,46,,,,,,,,231', ',,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,215,17,22,30,19,26,33,,41,', ',,59,69,,,,88,,100,106,5,111,112,25,32,,,,,,119,121,122,74,80,85,92', ',,110,,,,,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,', ',,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,,,,,231,,,,,9,16', '23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88', ',100,106,5,111,112,25,32,,,,,,119,121,122,74,80,85,92,,,110,,,,,,,115', ',,56,63,70,445,82,86,93,448,,4,8,15,,29,35,,,,117,,,,,,,,,,,,,,,,,,', ',443,,,228,,,97,101,,,13,,,,,,,,,,,,,,,,,,,9,16,23,31,36,40,,,,57,64', ',,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,11,20,25', '32,,,,,,62,66,72,74,80,85,92,,,6,,,,,,,48,,,56,63,70,75,82,86,93,98', ',4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13', ',,,,,46,,,,,,,,91,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30', '19,26,33,,41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74', '80,85,92,,,6,,,,,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49', '55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,,,,,91,,,,', '9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69', ',,,88,,100,106,5,111,112,25,32,,,,,,119,121,122,74,80,85,92,,,110,,', ',,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,', ',,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,,,,,231,,,,,9,16,23,31,36', '40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106', '5,11,20,25,32,,,,,,62,66,72,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75', '82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,', '97,101,,,13,,,,,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108', ',,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62', '66,72,74,80,85,92,,,6,,,,,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29', '35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,', ',,,91,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41', ',,,59,69,,,,88,,100,106,5,111,112,25,32,,,,,,119,121,122,74,80,85,92', ',,110,,,,,,,115,,,56,63,70,445,82,86,93,448,,4,8,15,,29,35,,,,117,,', ',,,,,,,,,,,,,,,,,443,,,228,,,97,101,,,13,,,,,,,,,,,,,,,,,,,9,16,23,31', '36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100', '106,5,111,112,25,32,,,,,,119,121,122,74,80,85,92,,,110,,,,,,,115,,,56', '63,70,75,82,86,93,98,,4,8,15,,29,35,,,,117,,,,,,,,,,,,,,,,,,,,877,,', '228,,,97,101,,,13,,,,,,,,,,,,,,,,,,,9,16,23,31,36,40,,,,57,64,,,,,,', '108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,111,112,25,32', ',,,,,119,121,122,74,80,85,92,,,110,,,,,,,115,,,56,63,70,75,82,86,93', '98,,4,8,15,,29,35,,,,117,,,,,,,,,,,,,,,,,,,,261,,,267,,,97,101,,,13', ',,,,,,,,,,,,,,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19', '26,33,,41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74,80', '85,92,,,110,,,,,,,48,,,56,63,70,75,82,86,93,98,233,4,8,15,,29,35,,45', '49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,218,,220,,46,,,,,', ',,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,215,17,22,30,19,26,33', ',41,,,,59,69,,,,88,,100,106,5,111,112,25,32,,,,,,119,121,122,74,80,85', '92,,,110,,,,,,,115,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,,,117,', ',,,,,,,,,,,,,,,,,,261,,,267,,,97,101,,,13,,,,,,,,,,,,,,,,,,,9,16,23', '31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,', '100,106,5,11,20,25,32,,,,,,62,66,72,74,80,85,92,,,6,,,,,,,48,,,56,63', '70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,', '228,,,97,101,,,13,,,,,,46,,,,,,,,91,,,,,9,16,23,31,36,40,,,,57,64,,', ',,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,111,112,25', '32,,,,,,119,121,122,74,80,85,92,,,110,,,,,,,115,,,56,63,70,75,82,86', '93,98,,4,8,15,,29,35,,,,117,,,,,,,,,,,,,,,,,,,,261,,,267,,,97,101,,', '13,,,,,,,,,,,,,,,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30', '19,26,33,,41,,,,59,69,,,,88,,100,106,5,111,112,25,32,,,,,,119,121,122', '74,80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86,93,98,233,4,8,15,,29', '35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,', ',,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,215,17,22,30,19,26,33', ',41,,,,59,69,,,,88,,100,106,5,111,112,25,32,,,,,,119,121,122,74,80,85', '92,,,110,,,,,,,115,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,,,117,', ',,,,,,,,,,,,,,,,,,261,,,228,,,97,101,,,13,,,,,,,,,,,,,,,,,,,9,16,23', '31,36,40,,,,57,64,,,,465,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88', ',100,106,5,111,112,25,32,,,,,,119,121,122,74,80,85,92,,,110,,,,,,,48', ',,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,', ',,226,,,228,,,97,101,,,13,,,,,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,', ',57,64,,,,,,,108,,,17,22,30,19,26,33,38,41,,,,59,69,,,,88,,100,106,5', '11,20,25,32,,,,,,62,66,72,74,80,85,92,,,6,,,,,,43,48,51,54,56,63,70', '75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,60,,,78,', ',97,101,,,13,,27,,,,46,,,,,,,,91,,,,,9,16,23,31,36,40,,,,57,64,,,,,', ',108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,111,112,25,32', ',,,,,119,121,122,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86,93,98', ',4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13', ',,,,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30', '19,26,33,,41,,,,59,69,,,,88,,100,106,5,111,112,25,32,,,,,,119,121,122', '74,80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86,93,98,233,4,8,15,,29', '35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,', ',,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,215,17,22,30,19,26,33', ',41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74,80,85,92', ',,110,,,,,,,48,,,56,63,70,75,82,86,93,98,233,4,8,15,,29,35,,45,49,55', ',,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,218,,220,,46,,,,,,,,231', ',,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,215,17,22,30,19,26,33,,41,', ',,59,69,,,,88,,100,106,5,111,112,25,32,,,,,,119,121,122,74,80,85,92', ',,110,,,,,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,', ',,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,,,,,231,,,,,9,16', '23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88', ',100,106,5,111,112,25,32,,,,,,119,121,122,74,80,85,92,,,110,,,,,,,48', ',,56,63,70,75,82,86,93,98,233,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,', ',,,,,226,,,228,,,97,101,,,13,,,,220,,46,,,,,,,,231,,,,,9,16,23,31,36', '40,,,,57,64,,,,,,,108,,215,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100', '106,5,111,112,25,32,,,,,,119,121,122,74,80,85,92,,,110,,,,,,,48,,,56', '63,70,75,82,86,93,98,233,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,', '226,,,228,,,97,101,,,13,,638,,220,,46,,,,,,,,231,,,,,9,16,23,31,36,40', ',,,57,64,,,,,,,108,,215,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106', '5,111,112,25,32,,,,,,119,121,122,74,80,85,92,,,110,,,,,,,48,,,56,63', '70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,', '228,,,97,101,,,13,,,,,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,', ',,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,11,20,25', '32,,,,,,62,66,72,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86,93,98', '233,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,', '13,,218,,220,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108', ',215,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,', ',,62,66,72,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86,93,98,,4,8', '15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,534', ',,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30', '19,26,33,,41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74', '80,85,92,,,6,,,,,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49', '55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,,,,,91,,,,', '9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,38,41,,,,59', '69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74,80,85,92,,,6,,,,,,43', '48,,54,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,', ',,,,,,,60,,,78,,,97,101,,,13,,27,,,,46,,,,,,,,91,,,,,9,16,23,31,36,40', ',,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5', '11,20,25,32,,,,,,62,66,72,74,80,85,92,,,6,,,,,,,48,,,56,63,70,75,82', '86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97', '101,,,13,,,,,,46,,,,,,,,91,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,', ',17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62', '66,72,74,80,85,92,,,6,,,,,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29', '35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,', ',,,91,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41', ',,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74,80,85,92,,,6', ',,,,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,', ',,,,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,,,,,91,,,,,9,16,23,31', '36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100', '106,5,11,20,25,32,,,,,,62,66,72,74,80,85,92,,,6,,,,,,,48,,,56,63,70', '75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228', ',,97,101,,,13,,,,,,46,,,,,,,,91,,,,,9,16,23,31,36,40,,,,57,64,,,,,,', '108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,', ',,,62,66,72,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86,93,98,,4', '8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,', ',,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19', '26,33,,41,,,,59,69,,,,88,,100,106,5,111,112,25,32,,,,,,119,121,122,74', '80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45', '49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,,,,,231', ',,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59', '69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74,80,85,92,,,6,,,,,,', '48,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,', ',,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,,,,,91,,,,,9,16,23,31,36,40', ',,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5', '111,112,25,32,,,,,,119,121,122,74,80,85,92,,,110,,,,,,,48,,,56,63,70', '75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228', ',,97,101,,,13,,,,,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,', ',108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,111,112,25,32', ',,,,,119,121,122,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86,93,98', ',4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13', ',,,,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30', '19,26,33,,41,,,,59,69,,,,88,,100,106,5,111,112,25,32,,,,,,119,121,122', '74,80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35', ',45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,,,,', '231,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41', ',,,59,69,,,,88,,100,106,5,111,112,25,32,,,,,,119,121,122,74,80,85,92', ',,110,,,,,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,', ',,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,,,,,231,,,,,9,16', '23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88', ',100,106,5,111,112,25,32,,,,,,119,121,122,74,80,85,92,,,110,,,,,,,48', ',,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,', ',,226,,,228,,,97,101,,,13,,,,,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,', ',57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,111', '112,25,32,,,,,,119,121,122,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75', '82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,', '97,101,,,13,,,,,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108', ',,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,111,112,25,32,,,,', ',119,121,122,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86,93,98,,4', '8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,', ',,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19', '26,33,,41,,,,59,69,,,,88,,100,106,5,111,112,25,32,,,,,,119,121,122,74', '80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45', '49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,,,,,231', ',,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59', '69,,,,88,,100,106,5,111,112,25,32,,,,,,119,121,122,74,80,85,92,,,110', ',,,,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,', ',,,,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,,,,,231,,,,,9,16,23,31', '36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100', '106,5,111,112,25,32,,,,,,119,121,122,74,80,85,92,,,110,,,,,,,48,,,56', '63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226', ',,228,,,97,101,,,13,,,,,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64', ',,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,111,112', '25,32,,,,,,119,121,122,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86', '93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101', ',,13,,,,,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17', '22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,111,112,25,32,,,,,,119', '121,122,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86,93,98,,4,8,15', ',29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46', ',,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26', '33,,41,,,,59,69,,,,88,,100,106,5,111,112,25,32,,,,,,119,121,122,74,80', '85,92,,,110,,,,,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49', '55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,,,,,231,,,', ',9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69', ',,,88,,100,106,5,111,112,25,32,,,,,,119,121,122,74,80,85,92,,,110,,', ',,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,', ',,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,,,,,231,,,,,9,16,23,31,36', '40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106', '5,111,112,25,32,,,,,,119,121,122,74,80,85,92,,,110,,,,,,,48,,,56,63', '70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,', '228,,,97,101,,,13,,,,,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,', ',,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,111,112,25', '32,,,,,,119,121,122,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86,93', '98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,', '13,,,,,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22', '30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,111,112,25,32,,,,,,119,121', '122,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29', '35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,', ',,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,', '41,,,,59,69,,,,88,,100,106,5,111,112,25,32,,,,,,119,121,122,74,80,85', '92,,,110,,,,,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55', ',,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,,,,,231,,,,,9', '16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,', ',,88,,100,106,5,111,112,25,32,,,,,,119,121,122,74,80,85,92,,,110,,,', ',,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,', ',,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,,,,,231,,,,,9,16,23,31,36', '40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106', '5,111,112,25,32,,,,,,119,121,122,74,80,85,92,,,110,,,,,,,48,,,56,63', '70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,', '228,,,97,101,,,13,,,,,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,', ',,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,111,112,25', '32,,,,,,119,121,122,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86,93', '98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,', '13,,,,,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22', '30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,111,112,25,32,,,,,,119,121', '122,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29', '35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,', ',,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,', '41,,,,59,69,,,,88,,100,106,5,111,112,25,32,,,,,,119,121,122,74,80,85', '92,,,110,,,,,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55', ',,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,,,,,231,,,,,9', '16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,', ',,88,,100,106,5,111,112,25,32,,,,,,119,121,122,74,80,85,92,,,110,,,', ',,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,', ',,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,,,,,231,,,,,9,16,23,31,36', '40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106', '5,11,20,25,32,,,,,,62,66,72,74,80,85,92,,,6,,,,,,,48,,,56,63,70,75,82', '86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97', '101,,,13,,,,,,46,,,,,,,,91,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,', ',17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62', '66,72,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,', '29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,', ',,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33', ',41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74,80,85,92', ',,110,,,,,,,48,,,56,63,70,75,82,86,93,98,233,4,8,15,,29,35,,45,49,55', ',,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,218,,220,,46,,,,,,,,231', ',,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,215,17,22,30,19,26,33,,41,', ',,59,69,,,,88,,100,106,5,111,112,25,32,,,,,,119,121,122,74,80,85,92', ',,110,,,,,,,115,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,,,117,,,,', ',,,,,,,,,,,,,,,967,,,228,,,97,101,,,13,,,,,,,,,,,,,,,,,,,9,16,23,31', '36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100', '106,5,111,112,25,32,,,,,,119,121,122,74,80,85,92,,,110,,,,,,,48,,,56', '63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226', ',,228,517,,97,101,,,13,,,,,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57', '64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,11,20', '25,32,,,,,,62,66,72,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86,93', '98,233,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101', ',,13,,218,,220,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108', ',215,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,111,112,25,32,', ',,,,119,121,122,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86,93,98', '233,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,', '13,,,,220,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,215', '17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62', '66,72,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,', '29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,', ',,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33', ',41,,,,59,69,,,,88,,100,106,5,111,112,25,32,,,,,,119,121,122,74,80,85', '92,,,110,,,,,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55', ',,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,218,,,,46,,,,,,,,231,,,', ',9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69', ',,,88,,100,106,5,111,112,25,32,,,,,,119,121,122,74,80,85,92,,,110,,', ',,,,115,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,,,117,,,,,,,,,,,,', ',,,,,,,118,,,78,,,97,101,,,13,,27,,,,,,,,,,,,,,,,,9,16,23,31,36,40,', ',,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5', '111,112,25,32,,,,,,119,121,122,74,80,85,92,,,110,,,,,,,48,,,56,63,70', '75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228', ',,97,101,,,13,,638,,,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,,', ',,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,11,20,25,32', ',,,,,62,66,72,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86,93,98,', '4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,', ',,,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30', '19,26,33,38,41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74', '80,85,92,,,6,,,,,,43,48,,54,56,63,70,75,82,86,93,98,,4,8,15,,29,35,', '45,49,55,,,,,,,,,,,,,,,,,,,,60,,,78,,,97,101,,,13,,27,,,,46,,,,,,,,91', ',,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59', '69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74,80,85,92,,,110,,,,', ',,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,', ',,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,,,,,231,,,,,9,16,23,31,36', '40,,,,57,64,,,,,,,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106', '5,11,20,25,32,,,,,,62,66,72,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75', '82,86,93,98,,4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,', '97,101,,,13,,534,,,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,', ',,108,,,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,11,20,25,32', ',,,,,62,66,72,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86,93,98,233', '4,8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,', '218,,220,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,129,,,,,,108,', '215,17,22,30,19,26,33,,41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,,', ',62,66,72,74,80,85,92,,,110,,,,,,,48,,,56,63,70,75,82,86,93,98,233,4', '8,15,,29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,218', ',220,,46,,,,,,,,231,,,,,9,16,23,31,36,40,,,,57,64,,,,,,,108,,215,17', '22,30,19,26,33,38,41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66', '72,74,80,85,92,,,6,,,,,,43,48,51,54,56,63,70,75,82,86,93,98,,4,8,15', ',29,35,,45,49,55,,,,,,,,,,,,,,,,,,,,60,,,78,,,97,101,,,13,,27,,,,46', ',,,,,,,91,,,,,9,16,23,31,36,40,,,,57,64,,,,,,546,108,,,17,22,30,19,26', '33,,41,,,,59,69,,,,88,,100,106,5,11,20,25,32,,,,,,62,66,72,74,80,85', '92,,,110,,,,,,,48,,,56,63,70,75,82,86,93,98,,4,8,15,,29,35,,45,49,55', ',,,,,,,,,,,,,,,,,,,226,,,228,,,97,101,,,13,,,,,,46,,,,,,,,231,,,,-282', '9,16,23,31,36,40,-282,-282,-282,57,64,-282,-282,-282,,-282,,108,,,17', '22,30,,,-282,-282,-282,,,,,,,,-282,-282,,-282,-282,-282,-282,-282,,', ',,,,,,,,,,,,,,,,,,,,,-282,-282,-282,-282,-282,-282,-282,-282,-282,-282', '-282,-282,-282,-282,,,-282,-282,-282,,,-282,,,-282,,,-282,-282,,-282', ',-282,,-282,,-282,-282,-282,-282,-282,-282,-282,,-282,,-282,,,,,,,,', ',,,,-282,-282,-282,-282,-599,-282,,-282,,,,-599,-599,-599,,,-599,-599', '-599,786,-599,621,624,596,781,606,,,,-599,-599,-599,-599,,,599,,,,,-599', '-599,,-599,-599,-599,-599,-599,,,,,,,,,,601,,,,,,,,,622,594,598,603', ',-599,-599,-599,-599,-599,-599,-599,-599,-599,-599,-599,-599,-599,-599', ',,-599,-599,-599,,,-599,,,-599,,,-599,-599,,-599,605,-599,,-599,,-599', '-599,-599,-599,-599,-599,-599,,-599,-599,-599,,,,,,,,,,,,,-599,-599', '-599,-599,-600,-599,,-599,,,,-600,-600,-600,,,-600,-600,-600,618,-600', '621,624,596,600,606,,,,-600,-600,-600,-600,,,599,,,,,-600,-600,,-600', '-600,-600,-600,-600,,,,,,,,,,601,680,,,,,,,,622,594,598,603,,-600,-600', '-600,-600,-600,-600,-600,-600,-600,-600,-600,-600,-600,-600,,,-600,-600', '-600,,,-600,,,-600,,,-600,-600,,-600,605,-600,,-600,,-600,-600,-600', '-600,-600,-600,-600,,-600,-600,-600,,,,,,,,,,,,,-600,-600,-600,-600', '-616,-600,,-600,,,,-616,-616,-616,,,-616,-616,-616,618,-616,621,624', '596,600,606,,,,-616,-616,-616,,,,599,,,,,-616,-616,,-616,-616,-616,-616', '-616,,,,,,,,,,601,,,,,,,,,622,594,598,603,,-616,-616,-616,-616,-616', '-616,-616,-616,-616,-616,-616,-616,-616,-616,,,-616,-616,-616,,,-616', ',352,-616,,,-616,-616,,-616,605,-616,,-616,,-616,-616,-616,-616,-616', '-616,-616,,-616,-616,-616,,,,,,,,,,,,-616,-616,-616,,-616,,-616,-616', '-616,-616,,,-616,-616,-616,786,-616,621,624,596,781,606,,,,-616,-616', ',,,,599,,,,,-616,-616,,-616,-616,-616,-616,-616,,,,,,,,,,601,,,,,,,', ',622,594,598,603,,-425,,,,,,,-425,-425,-425,,-616,-425,-425,-425,,-425', ',-616,,,,,352,-616,-425,-425,-425,,,,605,,,,,-425,-425,,-425,-425,-425', '-425,-425,,-616,-616,,,,,,,,,,,,,-616,,,,,-616,,,-425,-425,-425,-425', '-425,-425,-425,-425,-425,-425,-425,-425,-425,-425,,,-425,-425,-425,', ',-425,,352,-425,,,-425,-425,,-425,,-425,,-425,,-425,-425,-425,-425,-425', '-425,-425,,-425,-425,-425,,,,,,,,,,,,-296,-425,-425,,-425,,-425,-296', '-296,-296,,,-296,-296,-296,618,-296,621,624,596,600,606,,,,,-296,-296', ',,,599,,,,,-296,-296,,-296,-296,-296,-296,-296,,,,,,,,,,601,680,,,,', ',,,622,594,598,603,,-296,-296,-296,-296,-296,-296,-296,-296,-296,-296', '-296,-296,-296,-296,,,-296,-296,-296,,,-296,,348,-296,,,-296,-296,,-296', '605,-296,,-296,,-296,-296,-296,-296,-296,-296,-296,,-296,,-296,,,,,', '521,522,,,518,,,-296,-296,,-296,,-296,157,162,,174,180,186,191,195,201', '207,,,132,138,,,,149,153,159,164,,,,,,,,,,,,,,141,146,,155,160,165,168', '172,178,183,188,193,203,209,,,135,,,,,,,,,,632,568,,,630,,,,,,137,,', '157,162,151,174,180,186,191,195,201,207,,,132,138,,,,149,153,159,164', ',,,,,352,,,,,,,,141,146,,155,160,165,168,172,178,183,188,193,203,209', ',,135,,,,,,,,,,628,522,,,626,,,,,,137,,,157,162,151,174,180,186,191', '195,201,207,,,132,138,,,,149,153,159,164,,,,,,352,,,,,,,,141,146,,155', '160,165,168,172,178,183,188,193,203,209,,,135,,,,,,,,,,1033,568,,,1032', ',,,,,137,,,157,162,151,174,180,186,191,195,201,207,,,132,138,,,,149', '153,159,164,,,,,,352,,,,,,,,141,146,,155,160,165,168,172,178,183,188', '193,203,209,,,135,,,,,,,,,,643,522,,,642,,,,,,137,,,157,162,151,174', '180,186,191,195,201,207,,,132,138,,,,149,153,159,164,,,,,,352,,,,,,', ',141,146,,155,160,165,168,172,178,183,188,193,203,209,,,135,,,,,,,,', ',521,522,,,518,,,,,,137,,,157,162,151,174,180,186,191,195,201,207,,', '132,138,,,,149,153,159,164,,,,,,352,,,,,,,,141,146,,155,160,165,168', '172,178,183,188,193,203,209,,,135,,,,,,,,,,801,568,,,799,,,,,,137,,', '157,162,151,174,180,186,191,195,201,207,,,132,138,,,,149,153,159,164', ',,,,,352,,,,,,,,141,146,,155,160,165,168,172,178,183,188,193,203,209', ',,135,,,,,,,,,,1030,522,,,1029,,,,,,137,,,157,162,151,174,180,186,191', '195,201,207,,,132,138,,,,149,153,159,164,,,,,,352,,,,,,,,141,146,,155', '160,165,168,172,178,183,188,193,203,209,,,135,,,,,,,,,,567,568,,,563', ',,,,,137,,,157,162,151,174,180,186,191,195,201,207,,,132,138,,,,149', '153,159,164,,,,,,352,,,,,,,,141,146,,155,160,165,168,172,178,183,188', '193,203,209,,,135,,,,,,,,,,673,568,,,672,,,,,,137,,,157,162,151,174', '180,186,191,195,201,207,,,132,138,,,,149,153,159,164,,,,,,352,,,,,,', ',141,146,,155,160,165,168,172,178,183,188,193,203,209,,,135,,,,,,,,', ',646,568,,,645,,,,,,137,,,157,162,151,174,180,186,191,195,201,207,,', '132,138,,,,149,153,159,164,,,,,,352,,,,,,,,141,146,,155,160,165,168', '172,178,183,188,193,203,209,,,135,,,,,,,,,,670,522,,,669,,,,,,137,,', '157,162,151,174,180,186,191,195,201,207,,,132,138,,,,149,153,159,164', ',,,,,352,,,,,,,,141,146,,155,160,165,168,172,178,183,188,193,203,209', ',,135,,,,,,,,,,989,568,,,988,,,,,,137,,,157,162,151,174,180,186,191', '195,201,207,,,132,138,,,,149,153,159,164,,,,,,352,,,,,,,,141,146,,155', '160,165,168,172,178,183,188,193,203,209,,,135,,,,,,,,,,561,522,,,558', ',,,,,137,,,157,162,151,174,180,186,191,195,201,207,,,132,138,,,,149', '153,159,164,,,,,,352,,,,,,,,141,146,,155,160,165,168,172,178,183,188', '193,203,209,,,135,,,,,,,,,,646,568,,,645,,,,,,137,,,157,162,151,174', '180,186,191,195,201,207,,,132,138,,,,149,153,159,164,,,,,,352,,,,,,', ',141,146,,155,160,165,168,172,178,183,188,193,203,209,,,135,,,,,,,,', ',643,522,,,642,,,,,,137,,,157,162,151,174,180,186,191,195,201,207,,', '132,138,,,,149,153,159,164,,,,,,352,,,,,,,,141,146,,155,160,165,168', '172,178,183,188,193,203,209,,786,135,621,624,596,781,606,786,,621,624', '596,781,606,,,599,,,,,137,,599,,618,151,621,624,596,600,606,,,,,,,601', ',,599,,,,601,,622,594,598,603,,,,622,594,598,603,,,,,618,601,621,624', '596,600,606,,,,622,594,598,603,,,599,,,,129,605,,,,,,618,605,621,624', '596,600,606,,,,,601,,,,,599,,,605,622,594,598,603,618,,621,624,596,600', '606,,,,,,,,601,618,599,621,624,596,600,606,,622,594,598,603,,,,,599', '605,,,,,,601,,,,,,,,,622,594,598,603,,,601,608,,,,,605,,,622,594,598', '603,,,,,,,,,,,,,,,,,,605,,,,,,,,,,,,,,,605' ] racc_action_table = arr = ::Array.new(25699, nil) idx = 0 clist.each do |str| str.split(',', -1).each do |i| arr[idx] = i.to_i unless i.empty? idx += 1 end end clist = [ '75,351,1030,325,911,1043,695,75,75,75,715,444,75,75,75,12,75,113,496', '511,125,713,6,123,75,431,75,75,75,764,632,344,713,681,1033,847,75,75', '681,75,75,75,75,75,715,908,1029,423,240,1,496,240,18,511,496,496,402', '116,6,431,18,406,406,575,432,726,325,75,75,75,75,75,75,75,75,75,75,75', '75,75,75,630,763,75,75,75,626,75,75,587,609,75,721,695,75,75,632,75', '432,75,423,75,12,75,75,75,75,75,75,75,123,75,1033,75,670,351,1030,444', '911,1043,351,1030,113,911,1043,125,75,75,75,75,646,75,718,75,764,632', '444,646,646,646,75,444,646,646,646,344,646,630,1033,847,344,406,847', '1033,847,646,646,646,646,908,1029,402,116,575,908,1029,646,646,575,646', '646,646,646,646,443,628,281,669,443,232,708,670,763,281,81,147,630,763', '375,587,706,626,452,375,587,609,701,646,646,646,646,646,646,646,646', '646,646,646,646,646,646,700,269,646,646,646,670,646,646,670,743,646', '683,683,646,646,745,646,477,646,670,646,232,646,646,646,646,646,646', '646,364,646,646,646,669,364,147,147,147,81,698,693,693,452,452,673,646', '646,646,646,645,646,452,646,561,345,748,645,645,645,646,81,645,645,645', '269,645,275,278,669,628,975,669,975,275,278,645,645,645,477,477,271', '385,669,271,385,645,645,477,645,645,645,645,645,279,223,561,345,673', '643,386,279,683,386,697,673,254,561,345,289,673,642,775,803,673,117', '117,645,645,645,645,645,645,645,645,645,645,645,645,645,645,693,673', '645,645,645,245,645,645,276,256,645,271,271,645,645,276,645,223,645', '689,645,643,645,645,645,645,645,645,645,686,645,225,645,642,775,803', '254,254,254,289,289,289,803,801,445,645,645,645,645,98,645,803,645,102', '676,794,98,98,98,645,794,98,98,98,671,98,245,245,245,803,256,256,256', '98,283,98,98,98,499,668,285,283,448,644,225,98,98,285,98,98,98,98,98', '284,891,102,801,445,733,639,284,733,76,801,445,891,102,76,801,445,499', '637,801,445,499,499,98,98,98,98,98,98,98,98,98,98,98,98,98,98,801,445', '98,98,98,448,98,98,891,891,98,765,448,98,98,631,98,448,98,720,98,448', '98,98,98,98,98,98,98,754,98,924,98,924,924,924,287,924,629,448,754,44', '891,287,84,98,98,98,98,563,98,84,98,343,343,627,563,563,563,98,84,720', '563,563,997,563,997,997,997,997,997,104,720,754,754,50,895,280,104,623', '997,895,50,44,280,563,563,104,563,563,563,563,563,746,44,746,746,746', '331,746,658,619,997,331,331,658,618,754,956,924,779,956,616,997,997', '783,563,563,563,563,563,563,563,563,563,563,563,563,563,563,1032,558', '563,563,563,784,563,1032,702,702,563,785,1032,563,52,786,1032,997,563', '787,563,789,563,563,563,563,563,563,563,791,563,792,563,982,613,982', '982,982,494,982,612,746,610,558,567,563,563,604,563,798,563,567,567', '567,558,597,52,567,567,563,567,593,740,802,740,740,740,52,740,567,494', '982,878,573,494,494,494,494,805,878,567,567,807,567,567,567,567,567', '878,809,241,571,855,813,855,855,855,241,855,601,740,601,601,601,570', '601,241,738,738,740,817,567,567,567,567,567,567,567,567,567,567,567', '567,567,567,965,819,567,567,567,855,567,965,21,21,567,566,601,567,855', '825,965,505,567,562,567,601,567,567,567,567,567,567,567,828,567,567', '567,505,505,999,966,999,999,999,552,999,830,966,831,567,567,547,567', '505,567,505,966,505,505,505,505,1009,1009,567,9,9,9,9,9,9,9,9,9,9,9', '9,9,9,9,9,9,9,9,9,9,9,9,9,654,654,543,9,9,9,9,9,9,9,9,9,9,105,105,105', '105,105,9,9,9,9,9,9,9,9,9,9,9,9,541,9,485,712,712,712,712,712,9,9,540', '9,9,9,9,9,9,9,485,485,9,9,55,55,497,9,9,9,9,925,537,925,925,925,485', '925,380,380,485,485,485,485,9,9,533,9,9,9,9,9,9,9,9,9,9,9,497,532,9', '799,497,497,497,497,529,524,799,925,510,853,857,799,857,857,857,799', '857,509,9,856,507,858,859,9,679,679,679,679,679,679,679,679,679,679', '679,679,679,679,679,679,679,679,679,679,679,679,679,679,857,860,861', '679,679,679,679,679,679,679,679,679,679,548,548,548,548,548,679,679', '679,679,679,679,679,679,679,864,866,679,868,889,482,889,889,889,869', '889,679,679,871,679,679,679,679,679,679,679,482,482,679,679,492,875', '877,679,679,679,679,980,490,980,980,980,482,980,482,879,482,482,482', '482,679,679,483,679,679,679,679,679,679,679,679,679,679,679,481,469', '679,124,467,259,464,463,230,892,124,980,259,894,1014,230,1014,1014,1014', '124,1014,259,679,724,230,399,384,679,685,685,685,685,685,685,685,685', '685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,1014', '382,377,685,685,685,685,685,685,685,685,685,685,367,367,367,367,367', '685,685,685,685,685,685,685,685,685,376,909,685,635,635,371,260,635', '635,635,912,685,685,260,685,685,685,685,685,685,685,369,260,685,685', '458,672,951,685,685,685,685,458,672,951,363,361,360,672,342,920,458', '672,951,921,685,685,341,685,685,685,685,685,685,685,685,685,685,685', '446,968,685,685,262,655,339,446,968,926,335,262,655,685,326,293,446', '968,291,270,262,655,685,266,945,946,949,685,43,43,43,43,43,43,43,43', '43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,950,261,952,43,43,43', '43,43,43,43,43,43,43,258,957,255,243,239,43,43,43,43,43,43,43,43,43', '43,234,43,967,229,226,969,219,217,974,216,43,43,969,43,43,43,43,43,43', '43,979,969,43,43,264,1004,122,43,43,43,43,264,1004,981,121,983,984,985', '986,987,264,1004,988,989,43,43,118,43,43,43,43,43,43,43,43,43,43,43', '115,114,43,43,110,107,1002,1003,79,65,60,54,1008,43,48,42,1015,40,1022', '1023,1024,1025,43,36,34,1031,30,43,33,33,33,33,33,33,33,33,33,33,33', '33,33,33,33,33,33,33,33,33,33,33,33,33,22,1036,1037,33,33,33,33,33,33', '33,33,33,33,19,3,1045,,,33,33,33,33,33,33,33,33,33,33,33,33,,33,,,,', ',,33,33,,33,33,33,33,33,33,33,,,33,33,,,,33,33,33,33,,,,,,33,,,,,,,', '33,33,,33,33,33,33,33,33,33,33,33,33,33,,,33,,,,,,,,,,,,,,,,,,,,33,', ',,,33,512,512,512,512,512,512,512,512,512,512,512,512,512,512,512,512', '512,512,512,512,512,512,512,512,,,,512,512,512,512,512,512,512,512,512', '512,,,,,,512,512,512,512,512,512,512,512,512,,,512,,,,,,,,,512,512,', '512,512,512,512,512,512,512,,,512,512,,,,512,512,512,512,,,,,,,,,,,', ',,512,512,,512,512,512,512,512,512,512,512,512,512,512,,,512,512,,,', ',,,,,,512,,,,,,,,,512,,,,,512,38,38,38,38,38,38,38,38,38,38,38,38,38', '38,38,38,38,38,38,38,38,38,38,38,,,,38,38,38,38,38,38,38,38,38,38,,', ',,,38,38,38,38,38,38,38,38,38,,,38,,,,,,,,,38,38,,38,38,38,38,38,38', '38,,,38,38,,,,38,38,38,38,,,,,,,,,,,,,,38,38,,38,38,38,38,38,38,38,38', '38,38,38,,,38,38,,,,,,,,,,38,523,523,523,523,523,523,,,38,523,523,,', '38,523,,523,523,523,523,523,523,523,,,,,,523,523,523,523,523,523,523', ',,523,,,,,590,523,523,523,523,523,523,523,523,523,523,523,523,,523,523', '523,,523,523,,523,523,523,590,590,590,590,590,590,590,590,590,590,590', ',590,590,,,590,590,,523,,,523,,,523,523,,,523,,523,590,,590,523,590', '590,590,590,590,590,590,523,590,,,,523,523,523,523,523,523,,,,523,523', ',590,,590,,,523,,,523,523,523,850,850,850,850,850,850,,,,850,850,,,', '850,,850,850,850,850,850,850,850,,,,,,850,850,850,850,850,850,850,,', '850,,,,,553,850,850,,850,850,850,850,850,850,850,850,850,,850,850,850', ',850,850,,850,850,850,553,553,553,553,553,553,553,553,553,553,553,,553', '553,,,553,553,,850,,,850,,,850,850,,,850,,850,553,,553,850,553,553,553', '553,553,553,553,850,553,,,,850,850,850,850,850,850,,,,850,850,,553,', ',,,850,,,850,850,850,527,527,527,527,527,527,,,,527,527,,,,527,,527', '527,527,527,527,527,527,,,,,,527,527,527,527,527,527,527,,,527,,,,,647', '527,527,,527,527,527,527,527,527,527,527,527,,527,527,527,,527,527,', '527,527,527,647,647,647,647,647,647,647,647,647,647,647,,647,647,,,647', '647,,527,,,527,,,527,527,,,527,,527,647,,647,527,647,647,647,647,647', '647,647,527,647,,,,527,527,527,527,527,527,,,,527,527,,647,,,,,527,', ',527,527,527,848,848,848,848,848,848,,,,848,848,,,,848,,848,848,848', '848,848,848,848,,,,,,848,848,848,848,848,848,848,,,848,,,,,,848,848', ',848,848,848,848,848,848,848,848,848,,848,848,848,,848,848,,848,848', '848,834,834,834,834,834,834,834,834,834,834,834,,834,834,,,834,834,', '848,,,848,,,848,848,,,848,,848,834,,834,848,834,834,834,834,834,834', '834,848,834,,,,848,848,848,848,848,848,,,,848,848,,834,,,,,848,,,848', '848,848,228,228,228,228,228,228,,,,228,228,,,,228,,228,228,228,228,228', '228,228,,,,,,228,228,228,228,228,228,228,,,228,,,,,,228,228,,228,228', '228,228,228,228,228,228,228,,228,228,228,,228,228,,228,228,228,39,39', '39,39,39,39,39,39,39,39,39,,39,39,,,39,39,,228,,,228,,,228,228,,,228', ',228,39,,39,228,39,39,39,39,39,39,39,228,39,,,,228,228,228,228,228,228', ',,,228,228,,39,,,,,228,,,228,228,228,963,963,963,963,963,963,,,,963', '963,,,,963,,963,963,963,963,963,963,963,,,,,,963,963,963,963,963,963', '963,,,963,,,,,,963,963,,963,963,963,963,963,963,963,963,963,,963,963', '963,,963,963,,963,963,963,851,851,851,851,851,851,851,851,851,851,851', ',851,851,,,851,851,,963,,,963,,,963,963,,,963,,963,851,,851,963,851', '851,851,851,851,851,851,963,851,,,,963,963,963,963,963,963,,,,963,963', ',851,,,,,963,,,963,963,963,539,539,539,539,539,539,,,,539,539,,,,539', ',539,539,539,539,539,539,539,,,,,,539,539,539,539,539,539,539,,,539', ',,,,,539,539,,539,539,539,539,539,539,539,539,539,,539,539,539,,539', '539,,539,539,539,916,916,916,916,916,916,916,916,916,916,916,,916,916', ',,916,916,,539,,,539,,,539,539,,,539,,539,916,,916,539,916,916,916,916', '916,916,916,539,916,,,,539,539,539,539,539,539,,,,539,539,,916,,,,,539', ',,539,539,539,971,971,971,971,971,971,,,,971,971,,,,971,,971,971,971', '971,971,971,971,,,,,,971,971,971,971,971,971,971,,,971,,,,,,971,971', ',971,971,971,971,971,971,971,971,971,,971,971,971,,971,971,,971,971', '971,832,832,832,832,832,832,832,832,832,832,832,,832,832,,,832,832,', '971,,,971,,,971,971,,,971,,971,832,,832,971,832,832,832,832,832,832', '832,971,832,,,,971,971,971,971,971,971,,,,971,971,,832,,,,,971,,,971', '971,971,960,960,960,960,960,960,,,,960,960,,,,960,,960,960,960,960,960', '960,960,,,,,,960,960,960,960,960,960,960,,,960,,,,,,960,960,,960,960', '960,960,960,960,960,960,960,,960,960,960,,960,960,,960,960,960,516,516', '516,516,516,516,516,516,516,516,516,,516,516,,,516,516,,960,,,960,,', '960,960,,,960,,960,516,,516,960,516,516,516,516,516,516,516,960,516', ',,,960,960,960,960,960,960,,,,960,960,,516,,,,,960,,,960,960,960,749', '749,749,749,749,749,,,,749,749,,,,749,,749,749,749,749,749,749,749,', ',,,,749,749,749,749,749,749,749,,,749,,,,,,749,749,,749,749,749,749', '749,749,749,749,749,,749,749,749,,749,749,,749,749,749,580,580,580,580', '580,580,580,580,580,580,580,,580,580,,,580,580,,749,,,749,,,749,749', ',,749,,749,580,,580,749,580,580,580,580,580,580,580,749,580,,,,749,749', '749,749,749,749,,,,749,749,,580,,,,,749,,,749,749,749,973,973,973,973', '973,973,,,,973,973,,,,973,,973,973,973,973,973,973,973,,,,,,973,973', '973,973,973,973,973,,,973,,,,,,973,973,,973,973,973,973,973,973,973', '973,973,,973,973,973,,973,973,,973,973,973,837,837,837,837,837,837,837', '837,837,837,837,,837,837,,,837,837,,973,,,973,,,973,973,,,973,,973,837', ',837,973,837,837,837,837,837,837,837,973,837,,,,973,973,973,973,973', '973,,,,973,973,,837,,,,,973,,,973,973,973,751,751,751,751,751,751,,', ',751,751,,,,751,,751,751,751,751,751,751,751,,,,,,751,751,751,751,751', '751,751,,,751,,,,,,751,751,,751,751,751,751,751,751,751,751,751,,751', '751,751,,751,751,,751,751,751,493,493,493,493,493,493,493,493,493,493', '493,,493,493,,,493,493,,751,,,751,,,751,751,,,751,,751,493,,493,751', '493,493,493,493,493,493,493,751,493,,,,751,751,751,751,751,751,,,,751', '751,493,493,,,,,751,,,751,751,751,267,267,267,267,267,267,,,,267,267', ',,,267,,267,267,267,267,267,267,267,,,,,,267,267,267,267,267,267,267', ',,267,,,,,,267,267,,267,267,267,267,267,267,267,267,267,,267,267,267', ',267,267,,267,267,267,221,221,221,221,221,221,221,221,221,221,221,,221', '221,,,221,221,,267,,,267,,,267,267,,,267,,267,221,,221,267,221,221,221', '221,221,221,221,267,221,,,,267,267,267,267,267,267,,,,267,267,,221,', ',,,267,,,267,267,267,940,940,940,940,940,940,,,,940,940,,,,940,,940', '940,940,940,940,940,940,,,,,,940,940,940,940,940,940,940,,,940,,,,,', '940,940,,940,940,940,940,940,940,940,940,940,,940,940,940,,940,940,', '940,940,940,841,841,841,841,841,841,841,841,841,841,841,,841,841,,,841', '841,,940,,,940,,,940,940,,,940,,940,841,,841,940,841,841,841,841,841', '841,841,940,841,,,,940,940,940,940,940,940,,,,940,940,,841,,,,,940,', ',940,940,940,904,904,904,904,904,904,,,,904,904,,,,904,,904,904,904', '904,904,904,904,,,,,,904,904,904,904,904,904,904,,,904,,,,,,904,904', ',904,904,904,904,904,904,904,904,904,,904,904,904,,904,904,,904,904', '904,844,844,844,844,844,844,844,844,844,844,844,,844,844,,,844,844,', '904,,,904,,,904,904,,,904,,904,844,,844,904,844,844,844,844,844,844', '844,904,844,,,,904,904,904,904,904,904,,,,904,904,,844,,,,,904,,,904', '904,904,820,820,820,820,820,820,,,,820,820,,,,820,,820,820,820,820,820', '820,820,,,,,,820,820,820,820,820,820,820,,,820,,,,,,820,820,,820,820', '820,820,820,820,820,820,820,,820,820,820,,820,820,,820,820,820,704,704', '704,704,704,704,704,704,704,704,704,,704,704,,,704,704,,820,,,820,,', '820,820,,,820,,820,704,,704,820,704,704,704,704,704,704,704,820,704', ',,,820,820,820,820,820,820,,,,820,820,,704,,,,,820,,,820,820,820,682', '682,682,682,682,682,,,,682,682,,,,682,,682,682,682,682,682,682,682,', ',,,,682,682,682,682,682,682,682,,,682,,,,,,682,682,,682,682,682,682', '682,682,682,682,682,,682,682,682,,682,682,,682,682,682,901,901,901,901', '901,901,901,901,901,901,901,,901,901,,,901,901,,682,,,682,,,682,682', ',,682,,682,901,,901,682,901,901,901,901,901,901,901,682,901,,,,682,682', '682,682,682,682,,,,682,682,,901,,,,,682,,,682,682,682,327,327,327,327', '327,327,,,,327,327,,,,327,,327,327,327,327,327,327,327,,,,,,327,327', '327,327,327,327,327,,,327,,,,,,327,327,,327,327,327,327,327,327,327', '327,327,,327,327,327,,327,327,,327,327,327,498,,,,,,,,,,,,,,,,498,498', ',327,,,327,,,327,327,,,327,,327,498,,498,327,498,498,498,498,,,498,327', '498,,,,327,327,327,327,327,327,,,,327,327,,,,,,,327,,,327,327,327,340', '340,340,340,340,340,,,,340,340,,,,340,,340,340,340,340,340,340,340,', ',,,,340,340,340,340,340,340,340,,,340,,,,,,340,340,,340,340,340,340', '340,340,340,340,340,,340,340,340,,340,340,,340,340,340,487,487,487,487', '487,487,487,,,487,487,,,,,,487,487,,340,,,340,,,340,340,,,340,,340,487', ',487,340,487,487,487,487,487,487,487,340,487,,,,340,340,340,340,340', '340,,,,340,340,,,,,,,340,,,340,340,340,814,814,814,814,814,814,,,,814', '814,,,,814,,814,814,814,814,814,814,814,,,,,,814,814,814,814,814,814', '814,,,814,,,,,,814,814,,814,814,814,814,814,814,814,814,814,,814,814', '814,,814,814,,814,814,814,495,,,,,,,,,,,,,,,,495,495,,814,,,814,,,814', '814,,,814,,814,495,,495,814,495,495,495,495,,,495,814,495,,,,814,814', '814,814,814,814,,,,814,814,,,,,,,814,,,814,814,814,796,796,796,796,796', '796,,,,796,796,,,,796,,796,796,796,796,796,796,796,,,,,,796,796,796', '796,796,796,796,,,796,,,,,,796,796,,796,796,796,796,796,796,796,796', '796,,796,796,796,,796,796,,796,796,796,480,480,480,480,480,480,480,', ',480,480,,,,,,480,480,,796,,,796,,,796,796,,,796,,796,480,,480,796,480', '480,480,480,480,480,480,796,480,,,,796,796,796,796,796,796,,,,796,796', ',,,,,,796,,,796,796,796,793,793,793,793,793,793,,,,793,793,,,,793,,793', '793,793,793,793,793,793,,,,,,793,793,793,793,793,793,793,,,793,,,,,', '793,793,,793,793,793,793,793,793,793,793,793,,793,793,793,,793,793,', '793,793,793,486,486,486,486,486,486,486,486,486,486,486,,486,486,,,486', '486,,793,,,793,,,793,793,,,793,,793,486,,486,793,486,486,486,486,486', '486,486,793,486,,,,793,793,793,793,793,793,,,,793,793,,,,,,,793,,,793', '793,793,778,778,778,778,778,778,,,,778,778,,,,778,,778,778,778,778,778', '778,778,,,,,,778,778,778,778,778,778,778,,,778,,,,,,778,778,,778,778', '778,778,778,778,778,778,778,,778,778,778,,778,778,,778,778,778,491,491', '491,491,491,491,491,,,491,491,,,,,,491,491,,778,,,778,,,778,778,,,778', ',778,491,,491,778,491,491,491,491,491,491,491,778,491,,,,778,778,778', '778,778,778,,,,778,778,,,,,,,778,,,778,778,778,365,365,365,365,365,365', ',,,365,365,,,,365,,365,365,365,365,365,365,365,,,,,,365,365,365,365', '365,365,365,,,365,,,,,,365,365,,365,365,365,365,365,365,365,365,365', ',365,365,365,,365,365,,365,365,365,500,500,500,500,500,500,500,,,500', '500,,,,,,500,500,,365,,,365,,,365,365,,,365,,365,500,,500,365,500,500', '500,500,500,500,500,365,500,,,,365,365,365,365,365,365,,,,365,365,,', ',,,,365,,,365,365,365,634,634,634,634,634,634,,,,634,634,,,,634,,634', '634,634,634,634,634,634,,,,,,634,634,634,634,634,634,634,,,634,,,,,', '634,634,,634,634,634,634,634,634,634,634,634,,634,634,634,,634,634,', '634,634,634,501,,,,,,,,,,,,,,,,501,501,,634,,,634,,,634,634,,,634,,634', '501,,501,634,501,501,501,501,,,501,634,501,,,,634,634,634,634,634,634', ',,,634,634,,,,,,,634,,,634,634,634,667,667,667,667,667,667,,,,667,667', ',,,667,,667,667,667,667,667,667,667,,,,,,667,667,667,667,667,667,667', ',,667,,,,,,667,667,,667,667,667,667,667,667,667,667,667,,667,667,667', ',667,667,,667,667,667,484,484,484,484,484,484,484,,,484,484,,,,,,484', '484,,667,,,667,,,667,667,,,667,,667,484,,484,667,484,484,484,484,484', '484,484,667,484,,,,667,667,667,667,667,667,,,,667,667,,,,,,,667,,,667', '667,667,78,78,78,78,78,78,,,,78,78,,,,78,,78,78,78,78,78,78,78,,,,,', '78,78,78,78,78,78,78,,,78,,,,,,78,78,,78,78,78,78,78,78,78,78,78,,78', '78,78,,78,78,,78,78,78,488,488,488,488,488,488,488,488,488,488,488,', '488,488,,,488,488,,78,,,78,,,78,78,,,78,,78,488,,488,78,488,488,488', '488,488,488,488,78,488,,,,78,78,78,78,78,78,,,,78,78,,,,,,,78,,,78,78', '78,915,915,915,915,915,915,,,,915,915,,,,915,,915,915,915,915,915,915', '915,,,,,,915,915,915,915,915,915,915,,,915,,,,,,915,915,,915,915,915', '915,915,915,915,915,915,,915,915,915,,915,915,,915,915,915,489,489,489', '489,489,489,489,,,489,489,,,,,,489,489,,915,,,915,,,915,915,,,915,,915', '489,,489,915,489,489,489,489,489,489,489,915,489,,,,915,915,915,915', '915,915,,,,915,915,,,,,,,915,,,915,915,915,918,918,918,918,918,918,', ',,918,918,,,,918,,918,918,918,918,918,918,918,,,,,,918,918,918,918,918', '918,918,,,918,,,,,,918,918,,918,918,918,918,918,918,918,918,918,,918', '918,918,,918,918,,918,918,918,502,502,502,502,502,502,502,502,,502,502', ',,,,,502,502,,918,,,918,,,918,918,,,918,,918,502,,502,918,502,502,502', '502,502,502,502,918,502,,,,918,918,918,918,918,918,,,,918,918,,,,,,', '918,,,918,918,918,2,2,2,2,2,2,,,,2,2,,,,2,,2,2,2,2,2,2,2,,,,,,2,2,2', '2,2,2,2,,,2,,,,,,2,2,2,2,2,2,2,2,2,2,2,2,,2,2,2,,2,2,,2,2,2,504,504', '504,504,504,504,504,,,504,504,,,,,,504,504,,2,,,2,,,2,2,,,2,,2,504,', '504,2,504,504,504,504,504,504,504,2,504,,,,2,2,2,2,2,2,,,,2,2,,,,,,', '2,,,2,2,2,299,299,299,,299,,,,299,299,,,,299,,299,299,299,299,299,299', '299,,,,,,299,299,299,299,299,299,299,,,299,,,,,,,299,,,299,299,299,299', '299,299,299,299,,299,299,299,,299,299,,299,299,299,,,,,,,,,,,,,,,,,', ',,299,,,299,,,299,299,,761,299,761,761,761,761,761,299,,,,,,,,299,761', ',,,299,299,299,299,299,299,,,,299,299,,,,,,,299,761,,299,299,299,663', '663,663,,663,,761,761,663,663,,,,663,,663,663,663,663,663,663,663,,', ',,,663,663,663,663,663,663,663,,,663,,,,761,,,663,,,663,663,663,663', '663,663,663,663,663,663,663,663,,663,663,,663,663,663,503,,,,,,,,,,', ',,,,,503,503,,663,,,663,,,663,663,,,663,,663,503,663,503,663,503,503', '503,503,,,503,663,503,,,,663,663,663,663,663,663,,,,663,663,,,,,,,663', ',663,663,663,663,638,638,638,,638,,,,638,638,,,,638,,638,638,638,638', '638,638,638,,,,,,638,638,638,638,638,638,638,,,638,,,,,,,638,,,638,638', '638,638,638,638,638,638,,638,638,638,,638,638,,638,638,638,,,,,,,,,', ',,,,,,,,,,638,,,638,,,638,638,,1040,638,1040,1040,1040,1040,1040,638', ',,,,,,,638,1040,,,,638,638,638,638,638,638,,,,638,638,,,,,,,638,1040', ',638,638,638,62,62,62,,62,,1040,1040,62,62,,,,62,,62,62,62,62,62,62', '62,,,,,,62,62,62,62,62,62,62,,,62,,,,1040,,,62,,,62,62,62,62,62,62,62', '62,62,62,62,62,,62,62,,62,62,62,,,,,,,,,,,,,,,,,,,,62,,,62,,,62,62,', ',62,,62,,62,,62,,,,,,,,62,,,,,62,62,62,62,62,62,,,,62,62,,,,,,,62,,62', '62,62,62,773,773,773,,773,,,,773,773,,,,773,,773,773,773,773,773,773', '773,,,,,,773,773,773,773,773,773,773,,,773,,,,,,,773,,,773,773,773,773', '773,773,773,773,,773,773,773,,773,773,,773,773,773,,,,,,,,,,,,,,,,,', ',,773,,,773,,,773,773,,995,773,995,995,995,995,995,773,,,,,,,,773,995', ',,,773,773,773,773,773,773,,,,773,773,,,,,,,773,995,,773,773,773,774', '774,774,,774,,995,995,774,774,,,,774,,774,774,774,774,774,774,774,,', ',,,774,774,774,774,774,774,774,,,774,,,,995,,,774,,,774,774,774,774', '774,774,774,774,,774,774,774,,774,774,,774,774,774,,,,,,,,,,,,,,,,,', ',,774,,,774,,,774,774,,887,774,887,887,887,887,887,774,,,,,,,,774,887', ',,,774,774,774,774,774,774,,,,774,774,,,,,,,774,887,,774,774,774,88', '88,88,,88,,887,887,88,88,,,,88,,88,88,88,88,88,88,88,,,,,,88,88,88,88', '88,88,88,,,88,,,,887,,,88,,,88,88,88,88,88,88,88,88,,88,88,88,,88,88', ',88,88,88,,,,,,,,,,,,,,,,,,,,88,,,88,,,88,88,,1018,88,1018,1018,1018', '1018,1018,88,,,,,,,,88,1018,,,,88,88,88,88,88,88,,,,88,88,88,,,,,88', '88,1018,,88,88,88,352,352,352,,352,,1018,1018,352,352,,,,352,,352,352', '352,352,352,352,352,,,,,,352,352,352,352,352,352,352,,,352,,,,1018,', ',352,,,352,352,352,352,352,352,352,352,352,352,352,352,,352,352,,352', '352,352,,,,,,,,,,,,,,,,,,,,352,,,352,,,352,352,,,352,,352,,352,,352', ',,,,,,,352,,,,,352,352,352,352,352,352,,,,352,352,,,,,,,352,,352,352', '352,352,97,97,97,,97,,,,97,97,,,,97,,97,97,97,97,97,97,97,,,,,,97,97', '97,97,97,97,97,,,97,,,,,,,97,,,97,97,97,97,97,97,97,97,,97,97,97,,97', '97,,97,97,97,,,,,,,,,,,,,,,,,,,,97,,,97,,,97,97,,993,97,993,993,993', '993,993,97,,,,,,,,97,993,,,,97,97,97,97,97,97,,,,97,97,97,,,,,,97,993', ',97,97,97,1006,1006,1006,,1006,,993,993,1006,1006,,,,1006,,1006,1006', '1006,1006,1006,1006,1006,,,,,,1006,1006,1006,1006,1006,1006,1006,,,1006', ',,,993,,,1006,,,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006', '1006,,1006,1006,,1006,1006,1006,,,,,,,,,,,,,,,,,,,,1006,,,1006,,,1006', '1006,,,1006,,1006,,1006,,1006,,,,,,,,1006,,,,,1006,1006,1006,1006,1006', '1006,,,,1006,1006,,,,,,,1006,,1006,1006,1006,1006,101,101,101,,101,', ',,101,101,,,,101,,101,101,101,101,101,101,101,,,,,,101,101,101,101,101', '101,101,,,101,,,,,,,101,,,101,101,101,101,101,101,101,101,101,101,101', '101,,101,101,,101,101,101,,,,,,,,,,,,,,,,,,,,101,,,101,,,101,101,,,101', ',101,,,,101,,,,,,,,101,,,,,101,101,101,101,101,101,,,,101,101,,,,,,', '101,,101,101,101,101,625,625,625,,625,,,,625,625,,,,625,,625,625,625', '625,625,625,625,,,,,,625,625,625,625,625,625,625,,,625,,,,,,,625,,,625', '625,625,625,625,625,625,625,,625,625,625,,625,625,,625,625,625,,,,,', ',,,,,,,,,,,,,,625,,,625,,,625,625,,936,625,936,936,936,936,936,625,', ',,,,,,625,936,,,,625,625,625,625,625,625,,,,625,625,,,,,,,625,936,,625', '625,625,776,776,776,,776,,936,936,776,776,,,,776,,776,776,776,776,776', '776,776,,,,,,776,776,776,776,776,776,776,,,776,,,,936,,,776,,,776,776', '776,776,776,776,776,776,,776,776,776,,776,776,,776,776,776,,,,,,,,,', ',,,,,,,,,,776,,,776,,,776,776,,938,776,938,938,938,938,938,776,,,,,', ',,776,938,,,,776,776,776,776,776,776,,,,776,776,,,,,,,776,938,,776,776', '776,777,777,777,,777,,938,938,777,777,,,,777,,777,777,777,777,777,777', '777,,,,,,777,777,777,777,777,777,777,,,777,,,,938,,,777,,,777,777,777', '777,777,777,777,777,,777,777,777,,777,777,,777,777,777,,,,,,,,,,,,,', ',,,,,,777,,,777,,,777,777,,934,777,934,934,934,934,934,777,,,,,,,,777', '934,,,,777,777,777,777,777,777,,,,777,777,,,,,,,777,934,,777,777,777', '59,59,59,,59,,934,934,59,59,,,,59,,59,59,59,59,59,59,59,,,,,,59,59,59', '59,59,59,59,,,59,,,,934,,,59,,,59,59,59,59,59,59,59,59,,59,59,59,,59', '59,,59,59,59,,,,,,,,,,,,,,,,,,,,59,,,59,,,59,59,,,59,,,,,,59,,,,,,,', '59,,,,,59,59,59,59,59,59,,,,59,59,,,,,,,59,,,59,59,59,781,781,781,,781', ',,,781,781,,,,781,,781,781,781,781,781,781,781,,,,,,781,781,781,781', '781,781,781,,,781,,,,,,,781,,,781,781,781,781,781,781,781,781,,781,781', '781,,781,781,,,,781,,,,,,,,,,,,,,,,,,,,781,,,781,,,781,781,,,781,,,', ',,,,,,,,,,,,,,,781,781,781,781,781,781,,,,781,781,,,,,,,781,,,781,781', '781,759,759,759,,759,,,,759,759,,,,759,,759,759,759,759,759,759,759', ',,,,,759,759,759,759,759,759,759,,,759,,,,,,,759,,,759,759,759,759,759', '759,759,759,,759,759,759,,759,759,,759,759,759,,,,,,,,,,,,,,,,,,,,759', ',,759,,,759,759,,,759,,,,,,759,,,,,,,,759,,,,,759,759,759,759,759,759', ',,,759,759,,,,,,,759,,,759,759,759,674,674,674,,674,,,,674,674,,,,674', ',674,674,674,674,674,674,674,,,,,,674,674,674,674,674,674,674,,,674', ',,,,,,674,,,674,674,674,674,674,674,674,674,,674,674,674,,674,674,,', ',674,,,,,,,,,,,,,,,,,,,,674,,,674,,,674,674,,,674,,,,,,,,,,,,,,,,,,', '674,674,674,674,674,674,,,,674,674,,,,,,,674,,,674,674,674,797,797,797', ',797,,,,797,797,,,,797,,797,797,797,797,797,797,797,,,,,,797,797,797', '797,797,797,797,,,797,,,,,,,797,,,797,797,797,797,797,797,797,797,,797', '797,797,,797,797,,797,797,797,,,,,,,,,,,,,,,,,,,,797,,,797,,,797,797', ',,797,,,,,,797,,,,,,,,797,,,,,797,797,797,797,797,797,,,,797,797,,,', ',,,797,,,797,797,797,600,600,600,,600,,,,600,600,,,,600,,600,600,600', '600,600,600,600,,,,,,600,600,600,600,600,600,600,,,600,,,,,,,600,,,600', '600,600,600,600,600,600,600,,600,600,600,,600,600,,600,600,600,,,,,', ',,,,,,,,,,,,,,600,,,600,,,600,600,,,600,,,,,,600,,,,,,,,600,,,,,600', '600,600,600,600,600,,,,600,600,,,,,,,600,,,600,600,600,578,578,578,', '578,,,,578,578,,,,578,,578,578,578,578,578,578,578,,,,,,578,578,578', '578,578,578,578,,,578,,,,,,,578,,,578,578,578,578,578,578,578,578,578', '578,578,578,,578,578,,578,578,578,,,,,,,,,,,,,,,,,,,,578,,,578,,,578', '578,,,578,,578,,,,578,,,,,,,,578,,,,,578,578,578,578,578,578,,,,578', '578,,,,,,,578,,578,578,578,578,812,812,812,,812,,,,812,812,,,,812,,812', '812,812,812,812,812,812,,,,,,812,812,812,812,812,812,812,,,812,,,,,', ',812,,,812,812,812,812,812,812,812,812,,812,812,812,,812,812,,812,812', '812,,,,,,,,,,,,,,,,,,,,812,,,812,,,812,812,,,812,,,,,,812,,,,,,,,812', ',,,,812,812,812,812,812,812,,,,812,812,,,,,,,812,,,812,812,812,675,675', '675,,675,,,,675,675,,,,675,,675,675,675,675,675,675,675,,,,,,675,675', '675,675,675,675,675,,,675,,,,,,,675,,,675,675,675,675,675,675,675,675', ',675,675,675,,675,675,,,,675,,,,,,,,,,,,,,,,,,,,675,,,675,,,675,675', ',,675,,,,,,,,,,,,,,,,,,,675,675,675,675,675,675,,,,675,675,,,,,,,675', ',,675,675,675,49,49,49,,49,,,,49,49,,,,49,,49,49,49,49,49,49,49,,,,', ',49,49,49,49,49,49,49,,,49,,,,,,,49,,,49,49,49,49,49,49,49,49,,49,49', '49,,49,49,,49,49,49,,,,,,,,,,,,,,,,,,,,49,,,49,,,49,49,,,49,,,,,,49', ',,,,,,,49,,,,,49,49,49,49,49,49,,,,49,49,,,,,,,49,,,49,49,49,46,46,46', ',46,,,,46,46,,,,46,,46,46,46,46,46,46,46,,,,,,46,46,46,46,46,46,46,', ',46,,,,,,,46,,,46,46,46,46,46,46,46,46,,46,46,46,,46,46,,46,46,46,,', ',,,,,,,,,,,,,,,,,46,,,46,,,46,46,,,46,,,,,,46,,,,,,,,46,,,,,46,46,46', '46,46,46,,,,46,46,,,,,,,46,,,46,46,46,45,45,45,,45,,,,45,45,,,,45,,45', '45,45,45,45,45,45,,,,,,45,45,45,45,45,45,45,,,45,,,,,,,45,,,45,45,45', '45,45,45,45,45,,45,45,45,,45,45,,45,45,45,,,,,,,,,,,,,,,,,,,,45,,,45', ',,45,45,,,45,,,,,,45,,,,,,,,45,,,,,45,45,45,45,45,45,,,,45,45,,,,,,', '45,,,45,45,45,826,826,826,,826,,,,826,826,,,,826,,826,826,826,826,826', '826,826,,,,,,826,826,826,826,826,826,826,,,826,,,,,,,826,,,826,826,826', '826,826,826,826,826,,826,826,826,,826,826,,826,826,826,,,,,,,,,,,,,', ',,,,,,826,,,826,,,826,826,,,826,,,,,,826,,,,,,,,826,,,,,826,826,826', '826,826,826,,,,826,826,,,,,,,826,,,826,826,826,128,128,128,,128,,,,128', '128,,,,128,,128,128,128,128,128,128,128,,,,,,128,128,128,128,128,128', '128,,,128,,,,,,,128,,,128,128,128,128,128,128,128,128,,128,128,128,', '128,128,,128,128,128,,,,,,,,,,,,,,,,,,,,128,,,128,,,128,128,,,128,,', ',,,128,,,,,,,,128,,,,,128,128,128,128,128,128,,,,128,128,128,,,,,,128', ',,128,128,128,130,130,130,,130,,,,130,130,,,,130,,130,130,130,130,130', '130,130,,,,,,130,130,130,130,130,130,130,,,130,,,,,,,130,,,130,130,130', '130,130,130,130,130,,130,130,130,,130,130,,130,130,130,,,,,,,,,,,,,', ',,,,,,130,,,130,,,130,130,,,130,,,,,,130,,,,,,,,130,,,,,130,130,130', '130,130,130,,,,130,130,,,,,,,130,,,130,130,130,829,829,829,,829,,,,829', '829,,,,829,,829,829,829,829,829,829,829,,,,,,829,829,829,829,829,829', '829,,,829,,,,,,,829,,,829,829,829,829,829,829,829,829,,829,829,829,', '829,829,,829,829,829,,,,,,,,,,,,,,,,,,,,829,,,829,,,829,829,,,829,,', ',,,829,,,,,,,,829,,,,,829,829,829,829,829,829,,,,829,829,,,,,,,829,', ',829,829,829,215,215,215,,215,,,,215,215,,,,215,,215,215,215,215,215', '215,215,,,,,,215,215,215,215,215,215,215,,,215,,,,,,,215,,,215,215,215', '215,215,215,215,215,,215,215,215,,215,215,,215,215,215,,,,,,,,,,,,,', ',,,,,,215,,,215,,,215,215,,,215,,,,,,215,,,,,,,,215,,,,,215,215,215', '215,215,215,,,,215,215,,,,,,,215,,,215,215,215,551,551,551,551,551,', ',,551,551,,,,551,,551,551,551,551,551,551,551,,,,,,551,551,551,551,551', '551,551,,,551,,,,,,551,551,,551,551,551,551,551,551,551,551,551,,551', '551,551,,551,551,,551,551,551,,,,,,,,,,,,,,,,,,,,551,,,551,,,551,551', ',,551,,551,,,,551,,,,,,,,551,,,,,551,551,551,551,551,551,,,,551,551', ',,,,,551,551,,,551,551,551,690,690,690,,690,,,,690,690,,,,690,,690,690', '690,690,690,690,690,,,,,,690,690,690,690,690,690,690,,,690,,,,,,,690', ',,690,690,690,690,690,690,690,690,,690,690,690,,690,690,,690,690,690', ',,,,,,,,,,,,,,,,,,,690,,,690,,,690,690,,,690,,690,,,,690,,,,,,,,690', ',,,,690,690,690,690,690,690,,,,690,690,,,,,,,690,,,690,690,690,218,218', '218,,218,,,,218,218,,,,218,,218,218,218,218,218,218,218,,,,,,218,218', '218,218,218,218,218,,,218,,,,,,,218,,,218,218,218,218,218,218,218,218', ',218,218,218,,218,218,,218,218,218,,,,,,,,,,,,,,,,,,,,218,,,218,,,218', '218,,,218,,,,,,218,,,,,,,,218,,,,,218,218,218,218,218,218,,,,218,218', ',,,,,,218,,,218,218,218,705,705,705,,705,,,,705,705,,,,705,,705,705', '705,705,705,705,705,,,,,,705,705,705,705,705,705,705,,,705,,,,,,,705', ',,705,705,705,705,705,705,705,705,,705,705,705,,705,705,,705,705,705', ',,,,,,,,,,,,,,,,,,,705,,,705,,,705,705,,,705,,705,,,,705,,,,,,,,705', ',,,,705,705,705,705,705,705,,,,705,705,,,,,,,705,,,705,705,705,220,220', '220,,220,,,,220,220,,,,220,,220,220,220,220,220,220,220,,,,,,220,220', '220,220,220,220,220,,,220,,,,,,,220,,,220,220,220,220,220,220,220,220', ',220,220,220,,220,220,,220,220,220,,,,,,,,,,,,,,,,,,,,220,,,220,,,220', '220,,,220,,,,,,220,,,,,,,,220,,,,,220,220,220,220,220,220,,,,220,220', ',,,,,,220,,,220,220,220,839,839,839,,839,,,,839,839,,,,839,,839,839', '839,839,839,839,839,,,,,,839,839,839,839,839,839,839,,,839,,,,,,,839', ',,839,839,839,839,839,839,839,839,,839,839,839,,839,839,,839,839,839', ',,,,,,,,,,,,,,,,,,,839,,,839,,,839,839,,,839,,,,,,839,,,,,,,,839,,,', ',839,839,839,839,839,839,,,,839,839,,,,,,,839,,,839,839,839,736,736', '736,,736,,,,736,736,,,,736,,736,736,736,736,736,736,736,,,,,,736,736', '736,736,736,736,736,,,736,,,,,,,736,,,736,736,736,736,736,736,736,736', ',736,736,736,,736,736,,736,736,736,,,,,,,,,,,,,,,,,,,,736,,,736,,,736', '736,,,736,,,,,,736,,,,,,,,736,,,,,736,736,736,736,736,736,,,,736,736', ',,,,,,736,,,736,736,736,534,534,534,,534,,,,534,534,,,,534,,534,534', '534,534,534,534,534,,,,,,534,534,534,534,534,534,534,,,534,,,,,,,534', ',,534,534,534,534,534,534,534,534,,534,534,534,,534,534,,534,534,534', ',,,,,,,,,,,,,,,,,,,534,,,534,,,534,534,,,534,,,,,,534,,,,,,,,534,,,', ',534,534,534,534,534,534,,,,534,534,,,,,,,534,,,534,534,534,530,530', '530,,530,,,,530,530,,,,530,,530,530,530,530,530,530,530,,,,,,530,530', '530,530,530,530,530,,,530,,,,,,,530,,,530,530,530,530,530,530,530,530', ',530,530,530,,530,530,,530,530,530,,,,,,,,,,,,,,,,,,,,530,,,530,,,530', '530,,,530,,,,,,530,,,,,,,,530,,,,,530,530,530,530,530,530,,,,530,530', ',,,,,,530,,,530,530,530,735,735,735,,735,,,,735,735,,,,735,,735,735', '735,735,735,735,735,,,,,,735,735,735,735,735,735,735,,,735,,,,,,,735', ',,735,735,735,735,735,735,735,735,,735,735,735,,735,735,,735,735,735', ',,,,,,,,,,,,,,,,,,,735,,,735,,,735,735,,,735,,,,,,735,,,,,,,,735,,,', ',735,735,735,735,735,735,,,,735,735,,,,,,,735,,,735,735,735,28,28,28', ',28,,,,28,28,,,,28,,28,28,28,28,28,28,28,,,,,,28,28,28,28,28,28,28,', ',28,,,,,,,28,,,28,28,28,28,28,28,28,28,,28,28,28,,28,28,,,,28,,,,,,', ',,,,,,,,,,,,,28,,,28,,,28,28,,,28,,28,,,,,,,,,,,,,,,,,28,28,28,28,28', '28,,,,28,28,,,,,,,28,,,28,28,28,27,27,27,,27,,,,27,27,,,,27,,27,27,27', '27,27,27,27,,,,,,27,27,27,27,27,27,27,,,27,,,,,,,27,,,27,27,27,27,27', '27,27,27,,27,27,27,,27,27,,,,27,,,,,,,,,,,,,,,,,,,,27,,,27,,,27,27,', ',27,,,,,,,,,,,,,,,,,,,27,27,27,27,27,27,,,,27,27,,,,27,,,27,,,27,27', '27,231,231,231,,231,,,,231,231,,,,231,,231,231,231,231,231,231,231,', ',,,,231,231,231,231,231,231,231,,,231,,,,,,,231,,,231,231,231,231,231', '231,231,231,,231,231,231,,231,231,,231,231,231,,,,,,,,,,,,,,,,,,,,231', ',,231,,,231,231,,,231,,,,,,231,,,,,,,,231,,,,,231,231,231,231,231,231', ',,,231,231,,,,,,,231,,,231,231,231,526,526,526,,526,,,,526,526,,,,526', ',526,526,526,526,526,526,526,,,,,,526,526,526,526,526,526,526,,,526', ',,,,,,526,,,526,526,526,526,526,526,526,526,,526,526,526,,526,526,,526', '526,526,,,,,,,,,,,,,,,,,,,,526,,,526,,,526,526,,,526,,,,,,526,,,,,,', ',526,,,,,526,526,526,526,526,526,,,,526,526,,,,,,,526,,,526,526,526', '233,233,233,,233,,,,233,233,,,,233,,233,233,233,233,233,233,233,,,,', ',233,233,233,233,233,233,233,,,233,,,,,,,233,,,233,233,233,233,233,233', '233,233,,233,233,233,,233,233,,233,233,233,,,,,,,,,,,,,,,,,,,,233,,', '233,,,233,233,,,233,,,,,,233,,,,,,,,233,,,,,233,233,233,233,233,233', ',,,233,233,,,,,,,233,,,233,233,233,525,525,525,,525,,,,525,525,,,,525', ',525,525,525,525,525,525,525,,,,,,525,525,525,525,525,525,525,,,525', ',,,,,,525,,,525,525,525,525,525,525,525,525,,525,525,525,,525,525,,525', '525,525,,,,,,,,,,,,,,,,,,,,525,,,525,,,525,525,,,525,,,,,,525,,,,,,', ',525,,,,,525,525,525,525,525,525,,,,525,525,,,,,,,525,,,525,525,525', '709,709,709,,709,,,,709,709,,,,709,,709,709,709,709,709,709,709,,,,', ',709,709,709,709,709,709,709,,,709,,,,,,,709,,,709,709,709,709,709,709', '709,709,709,709,709,709,,709,709,,709,709,709,,,,,,,,,,,,,,,,,,,,709', ',,709,,,709,709,,,709,,709,,709,,709,,,,,,,,709,,,,,709,709,709,709', '709,709,,,,709,709,,,,,,,709,,709,709,709,709,710,710,710,,710,,,,710', '710,,,,710,,710,710,710,710,710,710,710,,,,,,710,710,710,710,710,710', '710,,,710,,,,,,,710,,,710,710,710,710,710,710,710,710,710,710,710,710', ',710,710,,710,710,710,,,,,,,,,,,,,,,,,,,,710,,,710,,,710,710,,,710,', ',,710,,710,,,,,,,,710,,,,,710,710,710,710,710,710,,,,710,710,,,,,,,710', ',710,710,710,710,517,517,517,,517,,,,517,517,,,,517,,517,517,517,517', '517,517,517,,,,,,517,517,517,517,517,517,517,,,517,,,,,,,517,,,517,517', '517,517,517,517,517,517,,517,517,517,,517,517,,517,517,517,,,,,,,,,', ',,,,,,,,,,517,,,517,,,517,517,,,517,,,,,,517,,,,,,,,517,,,,,517,517', '517,517,517,517,,,,517,517,,,,,,,517,,,517,517,517,20,20,20,,20,,,,20', '20,,,,20,,20,20,20,20,20,20,20,,,,,,20,20,20,20,20,20,20,,,20,,,,,,', '20,,,20,20,20,20,20,20,20,20,20,20,20,20,,20,20,,20,20,20,,,,,,,,,,', ',,,,,,,,,20,,,20,,,20,20,,,20,,20,,20,,20,,,,,,,,20,,,,,20,20,20,20', '20,20,,,,20,20,,,,,,,20,,20,20,20,20,714,714,714,,714,,,,714,714,,,', '714,,714,714,714,714,714,714,714,,,,,,714,714,714,714,714,714,714,,', '714,,,,,,,714,,,714,714,714,714,714,714,714,714,,714,714,714,,714,714', ',714,714,714,,,,,,,,,,,,,,,,,,,,714,,,714,,,714,714,,,714,,,,,,714,', ',,,,,,714,,,,,714,714,714,714,714,714,,,,714,714,,,,,,,714,,,714,714', '714,249,249,249,,249,,,,249,249,,,,249,,249,249,249,249,249,249,249', ',,,,,249,249,249,249,249,249,249,,,249,,,,,,,249,,,249,249,249,249,249', '249,249,249,,249,249,249,,249,249,,,,249,,,,,,,,,,,,,,,,,,,,249,,,249', ',,249,249,,,249,,,,,,,,,,,,,,,,,,,249,249,249,249,249,249,,,,249,249', ',,,,,,249,,,249,249,249,251,251,251,,251,,,,251,251,,,,251,,251,251', '251,251,251,251,251,,,,,,251,251,251,251,251,251,251,,,251,,,,,,,251', ',,251,251,251,251,251,251,251,251,,251,251,251,,251,251,,251,251,251', ',,,,,,,,,,,,,,,,,,,251,,,251,,,251,251,,,251,,,,,,251,,,,,,,,251,,,', ',251,251,251,251,251,251,,,,251,251,,,,,,,251,,,251,251,251,252,252', '252,,252,,,,252,252,,,,252,,252,252,252,252,252,252,252,,,,,,252,252', '252,252,252,252,252,,,252,,,,,,,252,,,252,252,252,252,252,252,252,252', ',252,252,252,,252,252,,252,252,252,,,,,,,,,,,,,,,,,,,,252,,,252,,,252', '252,,,252,,,,,,252,,,,,,,,252,,,,,252,252,252,252,252,252,,,,252,252', ',,,,,,252,,,252,252,252,874,874,874,,874,,,,874,874,,,,874,,874,874', '874,874,874,874,874,,,,,,874,874,874,874,874,874,874,,,874,,,,,,,874', ',,874,874,874,874,874,874,874,874,,874,874,874,,874,874,,874,874,874', ',,,,,,,,,,,,,,,,,,,874,,,874,,,874,874,,,874,,,,,,874,,,,,,,,874,,,', ',874,874,874,874,874,874,,,,874,874,,,,,,,874,,,874,874,874,716,716', '716,,716,,,,716,716,,,,716,,716,716,716,716,716,716,716,,,,,,716,716', '716,716,716,716,716,,,716,,,,,,,716,,,716,716,716,716,716,716,716,716', ',716,716,716,,716,716,,716,716,716,,,,,,,,,,,,,,,,,,,,716,,,716,,,716', '716,,,716,,,,,,716,,,,,,,,716,,,,,716,716,716,716,716,716,,,,716,716', ',,,,,,716,,,716,716,716,475,475,475,,475,,,,475,475,,,,475,,475,475', '475,475,475,475,475,,,,,,475,475,475,475,475,475,475,,,475,,,,,,,475', ',,475,475,475,475,475,475,475,475,,475,475,475,,475,475,,475,475,475', ',,,,,,,,,,,,,,,,,,,475,,,475,,,475,475,,,475,,,,,,475,,,,,,,,475,,,', ',475,475,475,475,475,475,,,,475,475,,,,,,,475,,,475,475,475,257,257', '257,,257,,,,257,257,,,,257,,257,257,257,257,257,257,257,,,,,,257,257', '257,257,257,257,257,,,257,,,,,,,257,,,257,257,257,257,257,257,257,257', ',257,257,257,,257,257,,,,257,,,,,,,,,,,,,,,,,,,,257,,,257,,,257,257', ',,257,,,,,,,,,,,,,,,,,,,257,257,257,257,257,257,,,,257,257,,,,,,,257', ',,257,257,257,885,885,885,,885,,,,885,885,,,,885,,885,885,885,885,885', '885,885,,,,,,885,885,885,885,885,885,885,,,885,,,,,,,885,,,885,885,885', '885,885,885,885,885,,885,885,885,,885,885,,,,885,,,,,,,,,,,,,,,,,,,', '885,,,885,,,885,885,,,885,,,,,,,,,,,,,,,,,,,885,885,885,885,885,885', ',,,885,885,,,,,,,885,,,885,885,885,465,465,465,,465,,,,465,465,,,,465', ',465,465,465,465,465,465,465,,,,,,465,465,465,465,465,465,465,,,465', ',,,,,,465,,,465,465,465,465,465,465,465,465,,465,465,465,,465,465,,', ',465,,,,,,,,,,,,,,,,,,,,465,,,465,,,465,465,,,465,,,,,,,,,,,,,,,,,,', '465,465,465,465,465,465,,,,465,465,,,,,,,465,,,465,465,465,460,460,460', ',460,,,,460,460,,,,460,,460,460,460,460,460,460,460,,,,,,460,460,460', '460,460,460,460,,,460,,,,,,,460,,,460,460,460,460,460,460,460,460,460', '460,460,460,,460,460,,460,460,460,,,,,,,,,,,,,,,,,,,,460,,,460,,,460', '460,,,460,,460,,460,,460,,,,,,,,460,,,,,460,460,460,460,460,460,,,,460', '460,,,,,,,460,,460,460,460,460,457,457,457,,457,,,,457,457,,,,457,,457', '457,457,457,457,457,457,,,,,,457,457,457,457,457,457,457,,,457,,,,,', ',457,,,457,457,457,457,457,457,457,457,,457,457,457,,457,457,,,,457', ',,,,,,,,,,,,,,,,,,,457,,,457,,,457,457,,,457,,,,,,,,,,,,,,,,,,,457,457', '457,457,457,457,,,,457,457,,,,,,,457,,,457,457,457,441,441,441,,441', ',,,441,441,,,,441,,441,441,441,441,441,441,441,,,,,,441,441,441,441', '441,441,441,,,441,,,,,,,441,,,441,441,441,441,441,441,441,441,,441,441', '441,,441,441,,441,441,441,,,,,,,,,,,,,,,,,,,,441,,,441,,,441,441,,,441', ',,,,,441,,,,,,,,441,,,,,441,441,441,441,441,441,,,,441,441,,,,,,,441', ',,441,441,441,263,263,263,,263,,,,263,263,,,,263,,263,263,263,263,263', '263,263,,,,,,263,263,263,263,263,263,263,,,263,,,,,,,263,,,263,263,263', '263,263,263,263,263,,263,263,263,,263,263,,,,263,,,,,,,,,,,,,,,,,,,', '263,,,263,,,263,263,,,263,,,,,,,,,,,,,,,,,,,263,263,263,263,263,263', ',,,263,263,,,,,,,263,,,263,263,263,435,435,435,,435,,,,435,435,,,,435', ',435,435,435,435,435,435,435,,,,,,435,435,435,435,435,435,435,,,435', ',,,,,,435,,,435,435,435,435,435,435,435,435,435,435,435,435,,435,435', ',435,435,435,,,,,,,,,,,,,,,,,,,,435,,,435,,,435,435,,,435,,,,,,435,', ',,,,,,435,,,,,435,435,435,435,435,435,,,,435,435,,,,,,,435,,435,435', '435,435,265,265,265,,265,,,,265,265,,,,265,,265,265,265,265,265,265', '265,,,,,,265,265,265,265,265,265,265,,,265,,,,,,,265,,,265,265,265,265', '265,265,265,265,,265,265,265,,265,265,,,,265,,,,,,,,,,,,,,,,,,,,265', ',,265,,,265,265,,,265,,,,,,,,,,,,,,,,,,,265,265,265,265,265,265,,,,265', '265,,,,265,,,265,,,265,265,265,430,430,430,,430,,,,430,430,,,,430,,430', '430,430,430,430,430,430,,,,,,430,430,430,430,430,430,430,,,430,,,,,', ',430,,,430,430,430,430,430,430,430,430,,430,430,430,,430,430,,430,430', '430,,,,,,,,,,,,,,,,,,,,430,,,430,,,430,430,,,430,,,,,,430,,,,,,,,430', ',,,,430,430,430,430,430,430,,,,430,430,,,,,,,430,,,430,430,430,14,14', '14,14,14,,,,14,14,,,,14,,14,14,14,14,14,14,14,,,,,,14,14,14,14,14,14', '14,,,14,,,,,,14,14,14,14,14,14,14,14,14,14,14,14,,14,14,14,,14,14,,14', '14,14,,,,,,,,,,,,,,,,,,,,14,,,14,,,14,14,,,14,,14,,,,14,,,,,,,,14,,', ',,14,14,14,14,14,14,,,,14,14,,,,,,,14,,,14,14,14,428,428,428,,428,,', ',428,428,,,,428,,428,428,428,428,428,428,428,,,,,,428,428,428,428,428', '428,428,,,428,,,,,,,428,,,428,428,428,428,428,428,428,428,,428,428,428', ',428,428,,428,428,428,,,,,,,,,,,,,,,,,,,,428,,,428,,,428,428,,,428,', ',,,,428,,,,,,,,428,,,,,428,428,428,428,428,428,,,,428,428,,,,,,,428', ',,428,428,428,13,13,13,,13,,,,13,13,,,,13,,13,13,13,13,13,13,13,,,,', ',13,13,13,13,13,13,13,,,13,,,,,,,13,,,13,13,13,13,13,13,13,13,13,13', '13,13,,13,13,,13,13,13,,,,,,,,,,,,,,,,,,,,13,,,13,,,13,13,,,13,,,,,', '13,,,,,,,,13,,,,,13,13,13,13,13,13,,,,13,13,,,,,,,13,,13,13,13,13,426', '426,426,,426,,,,426,426,,,,426,,426,426,426,426,426,426,426,,,,,,426', '426,426,426,426,426,426,,,426,,,,,,,426,,,426,426,426,426,426,426,426', '426,426,426,426,426,,426,426,,426,426,426,,,,,,,,,,,,,,,,,,,,426,,,426', ',,426,426,,,426,,426,,426,,426,,,,,,,,426,,,,,426,426,426,426,426,426', ',,,426,426,,,,,,,426,,426,426,426,426,424,424,424,,424,,,,424,424,,', ',424,,424,424,424,424,424,424,424,,,,,,424,424,424,424,424,424,424,', ',424,,,,,,,424,,,424,424,424,424,424,424,424,424,,424,424,424,,424,424', ',424,424,424,,,,,,,,,,,,,,,,,,,,424,,,424,,,424,424,,,424,,,,,,424,', ',,,,,,424,,,,,424,424,424,424,424,424,,,,424,424,,,,,,,424,,,424,424', '424,421,421,421,,421,,,,421,421,,,,421,,421,421,421,421,421,421,421', ',,,,,421,421,421,421,421,421,421,,,421,,,,,,,421,,,421,421,421,421,421', '421,421,421,421,421,421,421,,421,421,,421,421,421,,,,,,,,,,,,,,,,,,', ',421,,,421,,,421,421,,,421,,,,421,,421,,,,,,,,421,,,,,421,421,421,421', '421,421,,,,421,421,,,,,,,421,,421,421,421,421,418,418,418,,418,,,,418', '418,,,,418,,418,418,418,418,418,418,418,,,,,,418,418,418,418,418,418', '418,,,418,,,,,,,418,,,418,418,418,418,418,418,418,418,418,418,418,418', ',418,418,,418,418,418,,,,,,,,,,,,,,,,,,,,418,,,418,,,418,418,,,418,', '418,,418,,418,,,,,,,,418,,,,,418,418,418,418,418,418,,,,418,418,,,,', ',,418,,418,418,418,418,415,415,415,,415,,,,415,415,,,,415,,415,415,415', '415,415,415,415,,,,,,415,415,415,415,415,415,415,,,415,,,,,,,415,,,415', '415,415,415,415,415,415,415,,415,415,415,,415,415,,415,415,415,,,,,', ',,,,,,,,,,,,,,415,,,415,,,415,415,,,415,,,,,,415,,,,,,,,415,,,,,415', '415,415,415,415,415,,,,415,415,,,,,,,415,,,415,415,415,404,404,404,', '404,,,,404,404,,,,404,,404,404,404,404,404,404,404,,,,,,404,404,404', '404,404,404,404,,,404,,,,,,,404,,,404,404,404,404,404,404,404,404,404', '404,404,404,,404,404,,404,404,404,,,,,,,,,,,,,,,,,,,,404,,,404,,,404', '404,,,404,,404,,404,,404,,,,,,,,404,,,,,404,404,404,404,404,404,,,,404', '404,,,,,,,404,,404,404,404,404,395,395,395,,395,,,,395,395,,,,395,,395', '395,395,395,395,395,395,,,,,,395,395,395,395,395,395,395,,,395,,,,,', ',395,,,395,395,395,395,395,395,395,395,,395,395,395,,395,395,,395,395', '395,,,,,,,,,,,,,,,,,,,,395,,,395,,,395,395,,,395,,395,,,,395,,,,,,,', '395,,,,,395,395,395,395,395,395,,,,395,395,,,,,,,395,,,395,395,395,394', '394,394,,394,,,,394,394,,,,394,,394,394,394,394,394,394,394,,,,,,394', '394,394,394,394,394,394,,,394,,,,,,,394,,,394,394,394,394,394,394,394', '394,,394,394,394,,394,394,,394,394,394,,,,,,,,,,,,,,,,,,,,394,,,394', ',,394,394,,,394,,,,,,394,,,,,,,,394,,,,,394,394,394,394,394,394,,,,394', '394,,,,,,,394,,,394,394,394,393,393,393,393,393,,,,393,393,,,,393,,393', '393,393,393,393,393,393,,,,,,393,393,393,393,393,393,393,,,393,,,,,', '393,393,,393,393,393,393,393,393,393,393,393,,393,393,393,,393,393,', '393,393,393,,,,,,,,,,,,,,,,,,,,393,,,393,,,393,393,,,393,,393,,,,393', ',,,,,,,393,,,,,393,393,393,393,393,393,,,,393,393,,,,,,,393,,,393,393', '393,392,392,392,,392,,,,392,392,,,,392,,392,392,392,392,392,392,392', ',,,,,392,392,392,392,392,392,392,,,392,,,,,,,392,,,392,392,392,392,392', '392,392,392,,392,392,392,,392,392,,392,392,392,,,,,,,,,,,,,,,,,,,,392', ',,392,,,392,392,,,392,,,,,,392,,,,,,,,392,,,,,392,392,392,392,392,392', ',,,392,392,,,,,,,392,,,392,392,392,391,391,391,,391,,,,391,391,,,,391', ',391,391,391,391,391,391,391,,,,,,391,391,391,391,391,391,391,,,391', ',,,,,,391,,,391,391,391,391,391,391,391,391,,391,391,391,,391,391,,391', '391,391,,,,,,,,,,,,,,,,,,,,391,,,391,,,391,391,,,391,,,,,,391,,,,,,', ',391,,,,,391,391,391,391,391,391,,,,391,391,,,,,,,391,,,391,391,391', '390,390,390,,390,,,,390,390,,,,390,,390,390,390,390,390,390,390,,,,', ',390,390,390,390,390,390,390,,,390,,,,,,,390,,,390,390,390,390,390,390', '390,390,,390,390,390,,390,390,,390,390,390,,,,,,,,,,,,,,,,,,,,390,,', '390,,,390,390,,,390,,,,,,390,,,,,,,,390,,,,,390,390,390,390,390,390', ',,,390,390,,,,,,,390,,,390,390,390,389,389,389,,389,,,,389,389,,,,389', ',389,389,389,389,389,389,389,,,,,,389,389,389,389,389,389,389,,,389', ',,,,,,389,,,389,389,389,389,389,389,389,389,,389,389,389,,389,389,,389', '389,389,,,,,,,,,,,,,,,,,,,,389,,,389,,,389,389,,,389,,,,,,389,,,,,,', ',389,,,,,389,389,389,389,389,389,,,,389,389,,,,,,,389,,,389,389,389', '388,388,388,,388,,,,388,388,,,,388,,388,388,388,388,388,388,388,,,,', ',388,388,388,388,388,388,388,,,388,,,,,,,388,,,388,388,388,388,388,388', '388,388,,388,388,388,,388,388,,388,388,388,,,,,,,,,,,,,,,,,,,,388,,', '388,,,388,388,,,388,,,,,,388,,,,,,,,388,,,,,388,388,388,388,388,388', ',,,388,388,,,,,,,388,,,388,388,388,298,298,298,,298,,,,298,298,,,,298', ',298,298,298,298,298,298,298,,,,,,298,298,298,298,298,298,298,,,298', ',,,,,,298,,,298,298,298,298,298,298,298,298,,298,298,298,,298,298,,298', '298,298,,,,,,,,,,,,,,,,,,,,298,,,298,,,298,298,,,298,,,,,,298,,,,,,', ',298,,,,,298,298,298,298,298,298,,,,298,298,,,,,,,298,,,298,298,298', '69,69,69,,69,,,,69,69,,,,69,,69,69,69,69,69,69,69,,,,,,69,69,69,69,69', '69,69,,,69,,,,,,,69,,,69,69,69,69,69,69,69,69,,69,69,69,,69,69,,69,69', '69,,,,,,,,,,,,,,,,,,,,69,,,69,,,69,69,,,69,,,,,,69,,,,,,,,69,,,,,69', '69,69,69,69,69,,,,69,69,,,,,,,69,,,69,69,69,300,300,300,,300,,,,300', '300,,,,300,,300,300,300,300,300,300,300,,,,,,300,300,300,300,300,300', '300,,,300,,,,,,,300,,,300,300,300,300,300,300,300,300,,300,300,300,', '300,300,,300,300,300,,,,,,,,,,,,,,,,,,,,300,,,300,,,300,300,,,300,,', ',,,300,,,,,,,,300,,,,,300,300,300,300,300,300,,,,300,300,,,,,,,300,', ',300,300,300,301,301,301,,301,,,,301,301,,,,301,,301,301,301,301,301', '301,301,,,,,,301,301,301,301,301,301,301,,,301,,,,,,,301,,,301,301,301', '301,301,301,301,301,,301,301,301,,301,301,,301,301,301,,,,,,,,,,,,,', ',,,,,,301,,,301,,,301,301,,,301,,,,,,301,,,,,,,,301,,,,,301,301,301', '301,301,301,,,,301,301,,,,,,,301,,,301,301,301,302,302,302,,302,,,,302', '302,,,,302,,302,302,302,302,302,302,302,,,,,,302,302,302,302,302,302', '302,,,302,,,,,,,302,,,302,302,302,302,302,302,302,302,,302,302,302,', '302,302,,302,302,302,,,,,,,,,,,,,,,,,,,,302,,,302,,,302,302,,,302,,', ',,,302,,,,,,,,302,,,,,302,302,302,302,302,302,,,,302,302,,,,,,,302,', ',302,302,302,303,303,303,,303,,,,303,303,,,,303,,303,303,303,303,303', '303,303,,,,,,303,303,303,303,303,303,303,,,303,,,,,,,303,,,303,303,303', '303,303,303,303,303,,303,303,303,,303,303,,303,303,303,,,,,,,,,,,,,', ',,,,,,303,,,303,,,303,303,,,303,,,,,,303,,,,,,,,303,,,,,303,303,303', '303,303,303,,,,303,303,,,,,,,303,,,303,303,303,304,304,304,,304,,,,304', '304,,,,304,,304,304,304,304,304,304,304,,,,,,304,304,304,304,304,304', '304,,,304,,,,,,,304,,,304,304,304,304,304,304,304,304,,304,304,304,', '304,304,,304,304,304,,,,,,,,,,,,,,,,,,,,304,,,304,,,304,304,,,304,,', ',,,304,,,,,,,,304,,,,,304,304,304,304,304,304,,,,304,304,,,,,,,304,', ',304,304,304,305,305,305,,305,,,,305,305,,,,305,,305,305,305,305,305', '305,305,,,,,,305,305,305,305,305,305,305,,,305,,,,,,,305,,,305,305,305', '305,305,305,305,305,,305,305,305,,305,305,,305,305,305,,,,,,,,,,,,,', ',,,,,,305,,,305,,,305,305,,,305,,,,,,305,,,,,,,,305,,,,,305,305,305', '305,305,305,,,,305,305,,,,,,,305,,,305,305,305,306,306,306,,306,,,,306', '306,,,,306,,306,306,306,306,306,306,306,,,,,,306,306,306,306,306,306', '306,,,306,,,,,,,306,,,306,306,306,306,306,306,306,306,,306,306,306,', '306,306,,306,306,306,,,,,,,,,,,,,,,,,,,,306,,,306,,,306,306,,,306,,', ',,,306,,,,,,,,306,,,,,306,306,306,306,306,306,,,,306,306,,,,,,,306,', ',306,306,306,307,307,307,,307,,,,307,307,,,,307,,307,307,307,307,307', '307,307,,,,,,307,307,307,307,307,307,307,,,307,,,,,,,307,,,307,307,307', '307,307,307,307,307,,307,307,307,,307,307,,307,307,307,,,,,,,,,,,,,', ',,,,,,307,,,307,,,307,307,,,307,,,,,,307,,,,,,,,307,,,,,307,307,307', '307,307,307,,,,307,307,,,,,,,307,,,307,307,307,308,308,308,,308,,,,308', '308,,,,308,,308,308,308,308,308,308,308,,,,,,308,308,308,308,308,308', '308,,,308,,,,,,,308,,,308,308,308,308,308,308,308,308,,308,308,308,', '308,308,,308,308,308,,,,,,,,,,,,,,,,,,,,308,,,308,,,308,308,,,308,,', ',,,308,,,,,,,,308,,,,,308,308,308,308,308,308,,,,308,308,,,,,,,308,', ',308,308,308,309,309,309,,309,,,,309,309,,,,309,,309,309,309,309,309', '309,309,,,,,,309,309,309,309,309,309,309,,,309,,,,,,,309,,,309,309,309', '309,309,309,309,309,,309,309,309,,309,309,,309,309,309,,,,,,,,,,,,,', ',,,,,,309,,,309,,,309,309,,,309,,,,,,309,,,,,,,,309,,,,,309,309,309', '309,309,309,,,,309,309,,,,,,,309,,,309,309,309,310,310,310,,310,,,,310', '310,,,,310,,310,310,310,310,310,310,310,,,,,,310,310,310,310,310,310', '310,,,310,,,,,,,310,,,310,310,310,310,310,310,310,310,,310,310,310,', '310,310,,310,310,310,,,,,,,,,,,,,,,,,,,,310,,,310,,,310,310,,,310,,', ',,,310,,,,,,,,310,,,,,310,310,310,310,310,310,,,,310,310,,,,,,,310,', ',310,310,310,311,311,311,,311,,,,311,311,,,,311,,311,311,311,311,311', '311,311,,,,,,311,311,311,311,311,311,311,,,311,,,,,,,311,,,311,311,311', '311,311,311,311,311,,311,311,311,,311,311,,311,311,311,,,,,,,,,,,,,', ',,,,,,311,,,311,,,311,311,,,311,,,,,,311,,,,,,,,311,,,,,311,311,311', '311,311,311,,,,311,311,,,,,,,311,,,311,311,311,312,312,312,,312,,,,312', '312,,,,312,,312,312,312,312,312,312,312,,,,,,312,312,312,312,312,312', '312,,,312,,,,,,,312,,,312,312,312,312,312,312,312,312,,312,312,312,', '312,312,,312,312,312,,,,,,,,,,,,,,,,,,,,312,,,312,,,312,312,,,312,,', ',,,312,,,,,,,,312,,,,,312,312,312,312,312,312,,,,312,312,,,,,,,312,', ',312,312,312,313,313,313,,313,,,,313,313,,,,313,,313,313,313,313,313', '313,313,,,,,,313,313,313,313,313,313,313,,,313,,,,,,,313,,,313,313,313', '313,313,313,313,313,,313,313,313,,313,313,,313,313,313,,,,,,,,,,,,,', ',,,,,,313,,,313,,,313,313,,,313,,,,,,313,,,,,,,,313,,,,,313,313,313', '313,313,313,,,,313,313,,,,,,,313,,,313,313,313,314,314,314,,314,,,,314', '314,,,,314,,314,314,314,314,314,314,314,,,,,,314,314,314,314,314,314', '314,,,314,,,,,,,314,,,314,314,314,314,314,314,314,314,,314,314,314,', '314,314,,314,314,314,,,,,,,,,,,,,,,,,,,,314,,,314,,,314,314,,,314,,', ',,,314,,,,,,,,314,,,,,314,314,314,314,314,314,,,,314,314,,,,,,,314,', ',314,314,314,315,315,315,,315,,,,315,315,,,,315,,315,315,315,315,315', '315,315,,,,,,315,315,315,315,315,315,315,,,315,,,,,,,315,,,315,315,315', '315,315,315,315,315,,315,315,315,,315,315,,315,315,315,,,,,,,,,,,,,', ',,,,,,315,,,315,,,315,315,,,315,,,,,,315,,,,,,,,315,,,,,315,315,315', '315,315,315,,,,315,315,,,,,,,315,,,315,315,315,316,316,316,,316,,,,316', '316,,,,316,,316,316,316,316,316,316,316,,,,,,316,316,316,316,316,316', '316,,,316,,,,,,,316,,,316,316,316,316,316,316,316,316,,316,316,316,', '316,316,,316,316,316,,,,,,,,,,,,,,,,,,,,316,,,316,,,316,316,,,316,,', ',,,316,,,,,,,,316,,,,,316,316,316,316,316,316,,,,316,316,,,,,,,316,', ',316,316,316,317,317,317,,317,,,,317,317,,,,317,,317,317,317,317,317', '317,317,,,,,,317,317,317,317,317,317,317,,,317,,,,,,,317,,,317,317,317', '317,317,317,317,317,,317,317,317,,317,317,,317,317,317,,,,,,,,,,,,,', ',,,,,,317,,,317,,,317,317,,,317,,,,,,317,,,,,,,,317,,,,,317,317,317', '317,317,317,,,,317,317,,,,,,,317,,,317,317,317,318,318,318,,318,,,,318', '318,,,,318,,318,318,318,318,318,318,318,,,,,,318,318,318,318,318,318', '318,,,318,,,,,,,318,,,318,318,318,318,318,318,318,318,,318,318,318,', '318,318,,318,318,318,,,,,,,,,,,,,,,,,,,,318,,,318,,,318,318,,,318,,', ',,,318,,,,,,,,318,,,,,318,318,318,318,318,318,,,,318,318,,,,,,,318,', ',318,318,318,319,319,319,,319,,,,319,319,,,,319,,319,319,319,319,319', '319,319,,,,,,319,319,319,319,319,319,319,,,319,,,,,,,319,,,319,319,319', '319,319,319,319,319,,319,319,319,,319,319,,319,319,319,,,,,,,,,,,,,', ',,,,,,319,,,319,,,319,319,,,319,,,,,,319,,,,,,,,319,,,,,319,319,319', '319,319,319,,,,319,319,,,,,,,319,,,319,319,319,320,320,320,,320,,,,320', '320,,,,320,,320,320,320,320,320,320,320,,,,,,320,320,320,320,320,320', '320,,,320,,,,,,,320,,,320,320,320,320,320,320,320,320,,320,320,320,', '320,320,,320,320,320,,,,,,,,,,,,,,,,,,,,320,,,320,,,320,320,,,320,,', ',,,320,,,,,,,,320,,,,,320,320,320,320,320,320,,,,320,320,,,,,,,320,', ',320,320,320,321,321,321,,321,,,,321,321,,,,321,,321,321,321,321,321', '321,321,,,,,,321,321,321,321,321,321,321,,,321,,,,,,,321,,,321,321,321', '321,321,321,321,321,,321,321,321,,321,321,,321,321,321,,,,,,,,,,,,,', ',,,,,,321,,,321,,,321,321,,,321,,,,,,321,,,,,,,,321,,,,,321,321,321', '321,321,321,,,,321,321,,,,,,,321,,,321,321,321,322,322,322,,322,,,,322', '322,,,,322,,322,322,322,322,322,322,322,,,,,,322,322,322,322,322,322', '322,,,322,,,,,,,322,,,322,322,322,322,322,322,322,322,,322,322,322,', '322,322,,322,322,322,,,,,,,,,,,,,,,,,,,,322,,,322,,,322,322,,,322,,', ',,,322,,,,,,,,322,,,,,322,322,322,322,322,322,,,,322,322,,,,,,,322,', ',322,322,322,323,323,323,,323,,,,323,323,,,,323,,323,323,323,323,323', '323,323,,,,,,323,323,323,323,323,323,323,,,323,,,,,,,323,,,323,323,323', '323,323,323,323,323,,323,323,323,,323,323,,323,323,323,,,,,,,,,,,,,', ',,,,,,323,,,323,,,323,323,,,323,,,,,,323,,,,,,,,323,,,,,323,323,323', '323,323,323,,,,323,323,,,,,,,323,,,323,323,323,383,383,383,,383,,,,383', '383,,,,383,,383,383,383,383,383,383,383,,,,,,383,383,383,383,383,383', '383,,,383,,,,,,,383,,,383,383,383,383,383,383,383,383,,383,383,383,', '383,383,,383,383,383,,,,,,,,,,,,,,,,,,,,383,,,383,,,383,383,,,383,,', ',,,383,,,,,,,,383,,,,,383,383,383,383,383,383,,,,383,383,,,,,,,383,', ',383,383,383,719,719,719,,719,,,,719,719,,,,719,,719,719,719,719,719', '719,719,,,,,,719,719,719,719,719,719,719,,,719,,,,,,,719,,,719,719,719', '719,719,719,719,719,,719,719,719,,719,719,,719,719,719,,,,,,,,,,,,,', ',,,,,,719,,,719,,,719,719,,,719,,,,,,719,,,,,,,,719,,,,,719,719,719', '719,719,719,,,,719,719,,,,,,,719,,,719,719,719,11,11,11,,11,,,,11,11', ',,,11,,11,11,11,11,11,11,11,,,,,,11,11,11,11,11,11,11,,,11,,,,,,,11', ',,11,11,11,11,11,11,11,11,11,11,11,11,,11,11,,11,11,11,,,,,,,,,,,,,', ',,,,,,11,,,11,,,11,11,,,11,,11,,11,,11,,,,,,,,11,,,,,11,11,11,11,11', '11,,,,11,11,,,,,,,11,,11,11,11,11,906,906,906,,906,,,,906,906,,,,906', ',906,906,906,906,906,906,906,,,,,,906,906,906,906,906,906,906,,,906', ',,,,,,906,,,906,906,906,906,906,906,906,906,,906,906,906,,906,906,,', ',906,,,,,,,,,,,,,,,,,,,,906,,,906,,,906,906,,,906,,,,,,,,,,,,,,,,,,', '906,906,906,906,906,906,,,,906,906,,,,,,,906,,,906,906,906,334,334,334', ',334,,,,334,334,,,,334,,334,334,334,334,334,334,334,,,,,,334,334,334', '334,334,334,334,,,334,,,,,,,334,,,334,334,334,334,334,334,334,334,,334', '334,334,,334,334,,334,334,334,,,,,,,,,,,,,,,,,,,,334,,,334,334,,334', '334,,,334,,,,,,334,,,,,,,,334,,,,,334,334,334,334,334,334,,,,334,334', ',,,,,,334,,,334,334,334,373,373,373,,373,,,,373,373,,,,373,,373,373', '373,373,373,373,373,,,,,,373,373,373,373,373,373,373,,,373,,,,,,,373', ',,373,373,373,373,373,373,373,373,373,373,373,373,,373,373,,373,373', '373,,,,,,,,,,,,,,,,,,,,373,,,373,,,373,373,,,373,,373,,373,,373,,,,', ',,,373,,,,,373,373,373,373,373,373,,,,373,373,,,,,,,373,,373,373,373', '373,914,914,914,,914,,,,914,914,,,,914,,914,914,914,914,914,914,914', ',,,,,914,914,914,914,914,914,914,,,914,,,,,,,914,,,914,914,914,914,914', '914,914,914,914,914,914,914,,914,914,,914,914,914,,,,,,,,,,,,,,,,,,', ',914,,,914,,,914,914,,,914,,,,914,,914,,,,,,,,914,,,,,914,914,914,914', '914,914,,,,914,914,,,,,,,914,,914,914,914,914,368,368,368,,368,,,,368', '368,,,,368,,368,368,368,368,368,368,368,,,,,,368,368,368,368,368,368', '368,,,368,,,,,,,368,,,368,368,368,368,368,368,368,368,,368,368,368,', '368,368,,368,368,368,,,,,,,,,,,,,,,,,,,,368,,,368,,,368,368,,,368,,', ',,,368,,,,,,,,368,,,,,368,368,368,368,368,368,,,,368,368,,,,,,,368,', ',368,368,368,728,728,728,,728,,,,728,728,,,,728,,728,728,728,728,728', '728,728,,,,,,728,728,728,728,728,728,728,,,728,,,,,,,728,,,728,728,728', '728,728,728,728,728,,728,728,728,,728,728,,728,728,728,,,,,,,,,,,,,', ',,,,,,728,,,728,,,728,728,,,728,,728,,,,728,,,,,,,,728,,,,,728,728,728', '728,728,728,,,,728,728,,,,,,,728,,,728,728,728,5,5,5,,5,,,,5,5,,,,5', ',5,5,5,5,5,5,5,,,,,,5,5,5,5,5,5,5,,,5,,,,,,,5,,,5,5,5,5,5,5,5,5,,5,5', '5,,5,5,,,,5,,,,,,,,,,,,,,,,,,,,5,,,5,,,5,5,,,5,,5,,,,,,,,,,,,,,,,,5', '5,5,5,5,5,,,,5,5,,,,,,,5,,,5,5,5,919,919,919,,919,,,,919,919,,,,919', ',919,919,919,919,919,919,919,,,,,,919,919,919,919,919,919,919,,,919', ',,,,,,919,,,919,919,919,919,919,919,919,919,,919,919,919,,919,919,,919', '919,919,,,,,,,,,,,,,,,,,,,,919,,,919,,,919,919,,,919,,919,,,,919,,,', ',,,,919,,,,,919,919,919,919,919,919,,,,919,919,,,,,,,919,,,919,919,919', '722,722,722,,722,,,,722,722,,,,722,,722,722,722,722,722,722,722,,,,', ',722,722,722,722,722,722,722,,,722,,,,,,,722,,,722,722,722,722,722,722', '722,722,,722,722,722,,722,722,,722,722,722,,,,,,,,,,,,,,,,,,,,722,,', '722,,,722,722,,,722,,,,,,722,,,,,,,,722,,,,,722,722,722,722,722,722', ',,,722,722,,,,,,,722,,,722,722,722,362,362,362,362,362,,,,362,362,,', ',362,,362,362,362,362,362,362,362,,,,,,362,362,362,362,362,362,362,', ',362,,,,,,362,362,,362,362,362,362,362,362,362,362,362,,362,362,362', ',362,362,,362,362,362,,,,,,,,,,,,,,,,,,,,362,,,362,,,362,362,,,362,', '362,,,,362,,,,,,,,362,,,,,362,362,362,362,362,362,,,,362,362,,,,,,,362', ',,362,362,362,725,725,725,,725,,,,725,725,,,,725,,725,725,725,725,725', '725,725,,,,,,725,725,725,725,725,725,725,,,725,,,,,,,725,,,725,725,725', '725,725,725,725,725,,725,725,725,,725,725,,725,725,725,,,,,,,,,,,,,', ',,,,,,725,,,725,,,725,725,,,725,,,,,,725,,,,,,,,725,,,,,725,725,725', '725,725,725,,,,725,725,,,,,,,725,,,725,725,725,347,347,347,,347,,,,347', '347,,,,347,,347,347,347,347,347,347,347,,,,,,347,347,347,347,347,347', '347,,,347,,,,,,,347,,,347,347,347,347,347,347,347,347,,347,347,347,', '347,347,,347,347,347,,,,,,,,,,,,,,,,,,,,347,,,347,,,347,347,,,347,,347', ',,,347,,,,,,,,347,,,,,347,347,347,347,347,347,,,,347,347,,,,,,,347,', ',347,347,347,348,348,348,,348,,,,348,348,,,,348,,348,348,348,348,348', '348,348,,,,,,348,348,348,348,348,348,348,,,348,,,,,,,348,,,348,348,348', '348,348,348,348,348,348,348,348,348,,348,348,,348,348,348,,,,,,,,,,', ',,,,,,,,,348,,,348,,,348,348,,,348,,348,,348,,348,,,,,,,,348,,,,,348', '348,348,348,348,348,,,,348,348,348,,,,,,348,,348,348,348,348,350,350', '350,,350,,,,350,350,,,,350,,350,350,350,350,350,350,350,,,,,,350,350', '350,350,350,350,350,,,350,,,,,,,350,,,350,350,350,350,350,350,350,350', '350,350,350,350,,350,350,,350,350,350,,,,,,,,,,,,,,,,,,,,350,,,350,', ',350,350,,,350,,350,,350,,350,,,,,,,,350,,,,,350,350,350,350,350,350', ',,,350,350,,,,,,,350,,350,350,350,350,358,358,358,358,358,,,,358,358', ',,,358,,358,358,358,358,358,358,358,,,,,,358,358,358,358,358,358,358', ',,358,,,,,,358,358,358,358,358,358,358,358,358,358,358,358,,358,358', '358,,358,358,,358,358,358,,,,,,,,,,,,,,,,,,,,358,,,358,,,358,358,,,358', ',358,,,,358,,,,,,,,358,,,,,358,358,358,358,358,358,,,,358,358,,,,,,358', '358,,,358,358,358,91,91,91,,91,,,,91,91,,,,91,,91,91,91,91,91,91,91', ',,,,,91,91,91,91,91,91,91,,,91,,,,,,,91,,,91,91,91,91,91,91,91,91,,91', '91,91,,91,91,,91,91,91,,,,,,,,,,,,,,,,,,,,91,,,91,,,91,91,,,91,,,,,', '91,,,,,,,,91,,,,82,91,91,91,91,91,91,82,82,82,91,91,82,82,82,,82,,91', ',,91,91,91,,,82,82,82,,,,,,,,82,82,,82,82,82,82,82,,,,,,,,,,,,,,,,,', ',,,,,,82,82,82,82,82,82,82,82,82,82,82,82,82,82,,,82,82,82,,,82,,,82', ',,82,82,,82,,82,,82,,82,82,82,82,82,82,82,,82,,82,,,,,,,,,,,,,82,82', '82,82,568,82,,82,,,,568,568,568,,,568,568,568,991,568,991,991,991,991', '991,,,,568,568,568,568,,,991,,,,,568,568,,568,568,568,568,568,,,,,,', ',,,991,,,,,,,,,991,991,991,991,,568,568,568,568,568,568,568,568,568', '568,568,568,568,568,,,568,568,568,,,568,,,568,,,568,568,,568,991,568', ',568,,568,568,568,568,568,568,568,,568,568,568,,,,,,,,,,,,,568,568,568', '568,564,568,,568,,,,564,564,564,,,564,564,564,474,564,474,474,474,474', '474,,,,564,564,564,564,,,474,,,,,564,564,,564,564,564,564,564,,,,,,', ',,,474,474,,,,,,,,474,474,474,474,,564,564,564,564,564,564,564,564,564', '564,564,564,564,564,,,564,564,564,,,564,,,564,,,564,564,,564,474,564', ',564,,564,564,564,564,564,564,564,,564,564,564,,,,,,,,,,,,,564,564,564', '564,560,564,,564,,,,560,560,560,,,560,560,560,608,560,608,608,608,608', '608,,,,560,560,560,,,,608,,,,,560,560,,560,560,560,560,560,,,,,,,,,', '608,,,,,,,,,608,608,608,608,,560,560,560,560,560,560,560,560,560,560', '560,560,560,560,,,560,560,560,,,560,,560,560,,,560,560,,560,608,560', ',560,,560,560,560,560,560,560,560,,560,560,560,,,,,,,,,,,,520,560,560', ',560,,560,520,520,520,,,520,520,520,884,520,884,884,884,884,884,,,,520', '520,,,,,884,,,,,520,520,,520,520,520,520,520,,,,,,,,,,884,,,,,,,,,884', '884,884,884,,72,,,,,,,72,72,72,,520,72,72,72,,72,,520,,,,,520,520,72', '72,72,,,,884,,,,,72,72,,72,72,72,72,72,,520,520,,,,,,,,,,,,,520,,,,', '520,,,72,72,72,72,72,72,72,72,72,72,72,72,72,72,,,72,72,72,,,72,,72', '72,,,72,72,,72,,72,,72,,72,72,72,72,72,72,72,,72,72,72,,,,,,,,,,,,66', '72,72,,72,,72,66,66,66,,,66,66,66,898,66,898,898,898,898,898,,,,,66', '66,,,,898,,,,,66,66,,66,66,66,66,66,,,,,,,,,,898,898,,,,,,,,898,898', '898,898,,66,66,66,66,66,66,66,66,66,66,66,66,66,66,,,66,66,66,,,66,', '66,66,,,66,66,,66,898,66,,66,,66,66,66,66,66,66,66,,66,,66,,,,,,337', '337,,,337,,,66,66,,66,,66,337,337,,337,337,337,337,337,337,337,,,337', '337,,,,337,337,337,337,,,,,,,,,,,,,,337,337,,337,337,337,337,337,337', '337,337,337,337,337,,,337,,,,,,,,,,405,405,,,405,,,,,,337,,,405,405', '337,405,405,405,405,405,405,405,,,405,405,,,,405,405,405,405,,,,,,405', ',,,,,,,405,405,,405,405,405,405,405,405,405,405,405,405,405,,,405,,', ',,,,,,,403,403,,,403,,,,,,405,,,403,403,405,403,403,403,403,403,403', '403,,,403,403,,,,403,403,403,403,,,,,,403,,,,,,,,403,403,,403,403,403', '403,403,403,403,403,403,403,403,,,403,,,,,,,,,,1007,1007,,,1007,,,,', ',403,,,1007,1007,403,1007,1007,1007,1007,1007,1007,1007,,,1007,1007', ',,,1007,1007,1007,1007,,,,,,1007,,,,,,,,1007,1007,,1007,1007,1007,1007', '1007,1007,1007,1007,1007,1007,1007,,,1007,,,,,,,,,,436,436,,,436,,,', ',,1007,,,436,436,1007,436,436,436,436,436,436,436,,,436,436,,,,436,436', '436,436,,,,,,436,,,,,,,,436,436,,436,436,436,436,436,436,436,436,436', '436,436,,,436,,,,,,,,,,662,662,,,662,,,,,,436,,,662,662,436,662,662', '662,662,662,662,662,,,662,662,,,,662,662,662,662,,,,,,662,,,,,,,,662', '662,,662,662,662,662,662,662,662,662,662,662,662,,,662,,,,,,,,,,664', '664,,,664,,,,,,662,,,664,664,662,664,664,664,664,664,664,664,,,664,664', ',,,664,664,664,664,,,,,,664,,,,,,,,664,664,,664,664,664,664,664,664', '664,664,664,664,664,,,664,,,,,,,,,,1005,1005,,,1005,,,,,,664,,,1005', '1005,664,1005,1005,1005,1005,1005,1005,1005,,,1005,1005,,,,1005,1005', '1005,1005,,,,,,1005,,,,,,,,1005,1005,,1005,1005,1005,1005,1005,1005', '1005,1005,1005,1005,1005,,,1005,,,,,,,,,,374,374,,,374,,,,,,1005,,,374', '374,1005,374,374,374,374,374,374,374,,,374,374,,,,374,374,374,374,,', ',,,374,,,,,,,,374,374,,374,374,374,374,374,374,374,374,374,374,374,', ',374,,,,,,,,,,461,461,,,461,,,,,,374,,,461,461,374,461,461,461,461,461', '461,461,,,461,461,,,,461,461,461,461,,,,,,461,,,,,,,,461,461,,461,461', '461,461,461,461,461,461,461,461,461,,,461,,,,,,,,,,427,427,,,427,,,', ',,461,,,427,427,461,427,427,427,427,427,427,427,,,427,427,,,,427,427', '427,427,,,,,,427,,,,,,,,427,427,,427,427,427,427,427,427,427,427,427', '427,427,,,427,,,,,,,,,,459,459,,,459,,,,,,427,,,459,459,427,459,459', '459,459,459,459,459,,,459,459,,,,459,459,459,459,,,,,,459,,,,,,,,459', '459,,459,459,459,459,459,459,459,459,459,459,459,,,459,,,,,,,,,,943', '943,,,943,,,,,,459,,,943,943,459,943,943,943,943,943,943,943,,,943,943', ',,,943,943,943,943,,,,,,943,,,,,,,,943,943,,943,943,943,943,943,943', '943,943,943,943,943,,,943,,,,,,,,,,372,372,,,372,,,,,,943,,,372,372', '943,372,372,372,372,372,372,372,,,372,372,,,,372,372,372,372,,,,,,372', ',,,,,,,372,372,,372,372,372,372,372,372,372,372,372,372,372,,,372,,', ',,,,,,,437,437,,,437,,,,,,372,,,437,437,372,437,437,437,437,437,437', '437,,,437,437,,,,437,437,437,437,,,,,,437,,,,,,,,437,437,,437,437,437', '437,437,437,437,437,437,437,437,,,437,,,,,,,,,,425,425,,,425,,,,,,437', ',,425,425,437,425,425,425,425,425,425,425,,,425,425,,,,425,425,425,425', ',,,,,425,,,,,,,,425,425,,425,425,425,425,425,425,425,425,425,425,425', ',882,425,882,882,882,882,882,652,,652,652,652,652,652,,,882,,,,,425', ',652,,758,425,758,758,758,758,758,,,,,,,882,,,758,,,,652,,882,882,882', '882,,,,652,652,652,652,,,,,756,758,756,756,756,756,756,,,,758,758,758', '758,,,756,,,,652,882,,,,,,680,652,680,680,680,680,680,,,,,756,,,,,680', ',,758,756,756,756,756,932,,932,932,932,932,932,,,,,,,,680,396,932,396', '396,396,396,396,,680,680,680,680,,,,,396,756,,,,,,932,,,,,,,,,932,932', '932,932,,,396,396,,,,,680,,,396,396,396,396,,,,,,,,,,,,,,,,,,932,,,', ',,,,,,,,,,,396' ] racc_action_check = arr = ::Array.new(25699, nil) idx = 0 clist.each do |str| str.split(',', -1).each do |i| arr[idx] = i.to_i unless i.empty? idx += 1 end end racc_action_pointer = [ nil, 49, 5710, 1376, nil, 22166, -68, nil, nil, 784, nil, 21214, -10, 15366, 15094, nil, nil, nil, -64, 1292, 12646, 698, 1232, nil, nil, nil, nil, 11558, 11422, nil, 1206, nil, nil, 1336, 1205, nil, 1203, nil, 1612, 2285, 1197, nil, 1298, 1198, 425, 9246, 9110, nil, 1198, 8974, 468, nil, 528, nil, 1209, 801, nil, nil, nil, 7750, 1265, nil, 6254, nil, nil, 1179, 24211, nil, nil, 17542, nil, nil, 24086, nil, nil, 0, 317, nil, 5299, 1231, nil, 159, 23504, nil, 437, nil, nil, nil, 6662, nil, nil, 23390, nil, nil, nil, nil, nil, 6934, 390, nil, nil, 7206, 307, nil, 464, 784, nil, 1175, nil, nil, 1224, nil, nil, -7, 1287, 1184, 33, 264, 1243, nil, nil, 1196, 1188, -2, 959, -4, nil, nil, 9518, nil, 9654, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 125, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 9926, 1173, 1130, 10334, 1129, 10606, 3381, nil, 218, nil, 285, 1201, nil, 2285, 1168, 964, 11694, 92, 11966, 1112, nil, nil, nil, nil, 1153, -78, 613, nil, 1127, nil, 286, nil, nil, nil, 12918, nil, 13054, 13190, nil, 256, 1116, 290, 13734, 1108, 961, 1041, 1170, 1098, 14550, 1198, 14822, 1066, 3381, nil, 152, 1068, 231, nil, nil, nil, 199, 271, nil, 200, 226, 470, 98, nil, 337, 356, 343, nil, 429, nil, 259, nil, 1067, nil, 1058, nil, nil, nil, nil, 17406, 5846, 17678, 17814, 17950, 18086, 18222, 18358, 18494, 18630, 18766, 18902, 19038, 19174, 19310, 19446, 19582, 19718, 19854, 19990, 20126, 20262, 20398, 20534, 20670, 20806, nil, -57, 1063, 4066, nil, nil, nil, 516, nil, nil, 21486, 1115, nil, 24279, nil, 1066, 4203, 1093, 1085, 488, 19, 178, nil, 22846, 22982, nil, 23118, -11, 6798, nil, nil, nil, nil, nil, 23254, nil, 1010, 1023, 22574, 1057, 114, 4888, nil, 1060, 21894, 1037, nil, 1028, 25228, 21622, 24863, 62, 1097, 957, nil, nil, 840, nil, 996, 20942, 965, 166, 184, nil, 17270, 17134, 16998, 16862, 16726, 16590, 16454, 16318, 25564, nil, nil, 969, nil, nil, 32, 24425, 16182, 24352, 25, nil, nil, nil, nil, nil, nil, nil, nil, 16046, nil, nil, 15910, nil, nil, 15774, nil, -40, 15638, 25374, 15502, 25009, 15230, nil, 14958, -50, -11, nil, nil, 14686, 24571, 25301, nil, nil, nil, 14414, nil, 123, 10, 360, 1094, nil, 398, nil, nil, nil, 132, nil, nil, nil, nil, 14278, 1060, 25082, 14142, 24936, nil, 912, 911, 14006, nil, 912, nil, 905, nil, nil, nil, nil, 23728, 13598, nil, 168, nil, nil, 4477, 967, 913, 955, 5162, 775, 4614, 4203, 5299, 5436, 941, 4751, 933, 3244, 572, 4340, -49, 797, 4066, 352, 4888, 5025, 5573, 5982, 5710, 676, nil, 790, nil, 908, 901, -56, 1474, nil, nil, nil, 2833, 12510, nil, nil, 24019, nil, nil, 1737, 792, 12102, 11830, 2011, nil, 892, 11150, nil, 768, 755, 11014, nil, nil, 744, nil, 2559, 721, 711, nil, 686, nil, nil, nil, 644, 922, nil, nil, 10062, 640, 1874, nil, nil, nil, nil, 515, nil, 23894, 177, 619, 520, 23764, nil, 647, 645, 23634, nil, 689, 683, nil, 548, nil, 37, nil, nil, 8566, nil, 2970, nil, nil, nil, nil, nil, nil, 63, nil, nil, 1737, nil, nil, 522, nil, nil, nil, 527, nil, nil, 8430, 649, nil, nil, 597, nil, nil, nil, 23858, 62, 592, nil, 512, 506, nil, nil, 454, nil, 437, 443, nil, nil, nil, 499, nil, 7342, 62, 436, 151, 383, 57, 396, 6, nil, 5025, 1063, nil, 364, 6118, 311, nil, nil, 234, 222, 298, 260, 130, 2011, nil, nil, nil, nil, 25443, nil, 774, 1099, nil, nil, 445, nil, nil, nil, 24644, 5982, 24717, nil, nil, 5162, 291, 153, 90, 279, 1061, 230, 8158, 8838, 266, nil, nil, 922, 25525, -93, 3929, 186, nil, 1060, 242, nil, nil, 346, 10198, nil, nil, 215, nil, -19, nil, 287, 137, nil, 144, 129, 596, nil, 3792, 10470, 61, nil, 166, 12238, 12374, nil, 804, -108, 12782, -65, 13462, nil, 35, 21078, 403, -3, 22438, nil, 960, 22710, 56, nil, 22030, nil, nil, nil, nil, 313, nil, 11286, 10878, nil, 608, nil, 612, nil, nil, 94, nil, 97, 513, nil, 140, 2970, nil, 3244, nil, nil, 444, nil, 25498, nil, 25461, 8022, nil, 5890, nil, 56, 5, 369, nil, nil, nil, nil, nil, nil, nil, 6390, 6526, 235, 7478, 7614, 4751, 452, nil, 7886, nil, 460, 477, 483, 476, 491, nil, 513, nil, 499, 503, 4614, 270, nil, 4477, 8294, 524, 821, nil, 359, 655, 298, nil, 550, nil, 557, nil, 681, nil, nil, 8702, 686, 4340, nil, nil, 582, nil, 639, 3792, nil, nil, nil, nil, 732, 9382, nil, 626, 9790, 759, 641, 2696, nil, 2148, nil, nil, 3107, nil, 10742, nil, 3518, nil, nil, 3655, nil, nil, 23, 2148, nil, 1874, 2422, nil, 783, nil, 642, 790, 859, 795, 809, 940, 821, nil, nil, 846, nil, 847, nil, 849, 855, nil, 859, nil, nil, 13326, 888, nil, 947, 595, 906, nil, nil, 25436, nil, 23983, 13870, nil, 6570, nil, 928, nil, 379, 1034, nil, 1038, 421, nil, nil, 24175, nil, nil, 3929, nil, nil, 3655, nil, 21350, nil, 33, 1105, nil, -8, 994, nil, 21758, 5436, 2559, nil, 5573, 22302, 1144, 1148, nil, nil, 451, 818, 1052, nil, nil, nil, nil, nil, 25549, nil, 7658, nil, 7386, nil, 7522, nil, 3518, nil, nil, 25155, nil, 1067, 1068, nil, nil, 1069, 1095, 1062, 1097, nil, nil, nil, 453, 1109, nil, nil, 2833, nil, nil, 2422, nil, 648, 684, 1199, 1095, 1179, nil, 2696, nil, 3107, 1147, 267, nil, nil, nil, 1143, 956, 1156, 583, 1158, 1159, 1160, 1161, 1282, 1204, 1205, nil, 23598, nil, 6978, nil, 6434, nil, 484, nil, 710, nil, nil, 1307, 1308, 1199, 24790, 7070, 24498, 1315, 770, nil, nil, nil, nil, 997, 1197, nil, nil, 6706, nil, nil, nil, 1199, 1200, 1201, 1202, nil, nil, nil, 34, -10, 1209, 523, 22, nil, nil, 1234, 1235, nil, nil, 6162, nil, nil, -7, nil, 1248, nil ] racc_action_default = [ -1, -617, -616, -617, -505, -617, -605, -70, -517, -616, -446, -332, -301, -616, -617, -518, -616, -450, -449, -317, -333, -41, -616, -616, -451, -334, -324, -82, -74, -497, -616, -616, -335, -617, -617, -498, -616, -84, -617, -49, -616, -283, -51, -617, -513, -617, -617, -52, -605, -617, -53, -9, -514, -272, -617, -617, -511, -454, -273, -617, -617, -29, -293, -510, -491, -617, -260, -2, -274, -617, -512, -44, -260, -275, -507, -591, -603, -276, -616, -617, -506, -260, -593, -277, -617, -508, -503, -447, -603, -4, -278, -617, -509, -502, -448, -5, -279, -605, -592, -280, -306, -616, -281, -58, -241, -8, -309, -617, -404, 1047, -617, -332, -333, -513, -617, -605, -514, -617, -617, -293, -358, -296, -425, -417, -617, -281, -336, -357, -605, -606, -617, -495, -131, -175, -180, -155, -164, -147, -132, -178, -166, -143, -177, -182, -167, -184, -142, -617, -190, -153, -176, -152, -163, -154, -169, -127, -161, -150, -183, -138, -149, -168, -151, -173, -139, -145, -159, -172, -144, -160, -193, -185, -140, -156, -146, -492, -194, -192, -141, -157, -128, -188, -187, -135, -158, -116, -129, -186, -133, -113, -117, -130, -171, -125, -115, -137, -170, -179, -494, -477, -189, -134, -165, -148, -493, -490, -191, -136, -174, -126, -195, -162, -114, -196, -181, -617, -265, -616, -617, -616, -617, -242, -255, -513, -259, -514, -617, -586, -616, -617, -617, -617, -281, -617, -617, -68, -427, -430, -302, -617, -609, -617, -584, -617, -7, -617, -475, -452, -320, -617, -69, -617, -617, -465, -617, -617, -617, -617, -80, -90, -91, -617, -617, -617, -98, -78, -75, -616, -473, -617, -617, -617, -479, -513, -514, -156, -617, -327, -157, -158, -186, -113, -582, -179, -189, -174, -581, -114, -86, -617, -459, -617, -122, -22, -118, -120, -119, -121, -617, -617, -617, -617, -617, -617, -617, -617, -617, -617, -617, -617, -617, -617, -617, -617, -617, -617, -617, -617, -617, -617, -617, -617, -617, -617, -471, -617, -617, -616, -410, -413, -17, -617, -218, -234, -617, -219, -601, -617, -602, -617, -616, -499, -500, -50, -617, -290, -67, -617, -605, -66, -617, -617, -616, -424, -65, -3, -613, -614, -604, -612, -72, -605, -617, -617, -603, -616, -13, -14, -617, -59, -300, -617, -617, -616, -617, -603, -617, -604, -233, -48, -286, -285, -617, -617, -617, -609, -609, -243, -617, -617, -617, -617, -617, -617, -617, -617, -545, -303, -314, -617, -499, -500, -290, -617, -616, -617, -605, -299, -47, -484, -482, -496, -481, -478, -590, -617, -264, -256, -617, -266, -257, -617, -262, -290, -617, -617, -616, -617, -617, -589, -617, -616, -616, -585, -610, -611, -617, -617, -292, -453, -476, -617, -111, -617, -617, -108, -617, -281, -109, -45, -46, -464, -617, -461, -463, -455, -325, -617, -97, -617, -616, -617, -88, -83, -76, -617, -87, -605, -470, -617, -469, -480, -456, -329, -545, -617, -458, -617, -457, -123, -232, -212, -221, -215, -223, -222, -208, -228, -209, -229, -214, -230, -213, -605, -235, -225, -210, -236, -227, -211, -237, -226, -238, -224, -231, -220, -468, -617, -467, -617, -438, -616, -617, -21, -20, -19, -239, -617, -595, -597, -260, -594, -596, -616, -617, -617, -617, -616, -349, -348, -617, -40, -39, -617, -617, -30, -295, -605, -261, -616, -616, -616, -250, -605, -251, -6, -615, -71, -16, -288, -12, -604, -605, -199, -31, -60, -55, -418, -595, -422, -260, -594, -605, -595, -597, -423, -260, -594, -596, -421, -617, -617, -433, -605, -607, -617, -291, -244, -611, -246, -207, -37, -23, -24, -25, -26, -27, -617, -38, -265, -197, -43, -42, -617, -572, -570, -546, -580, -577, -562, -617, -617, -550, -576, -575, -563, -549, -528, -545, -617, -617, -544, -580, -530, -407, -552, -530, -554, -551, -530, -560, -548, -573, -565, -547, -617, -595, -616, -594, -605, -289, -617, -598, -298, -616, -617, -588, -267, -617, -616, -263, -587, -595, -594, -605, -595, -594, -197, -393, -428, -394, -396, -605, -431, -321, -109, -110, -108, -617, -318, -519, -520, -617, -616, -617, -462, -466, -616, -81, -595, -594, -605, -96, -94, -617, -617, -79, -85, -474, -617, -545, -617, -616, -605, -460, -617, -617, -472, -284, -616, -616, -411, -18, -605, -249, -414, -248, -54, -617, -28, -216, -217, -616, -350, -206, -617, -271, -294, -616, -252, -254, -247, -15, -73, -617, -616, -617, -419, -61, -617, -426, -617, -617, -420, -63, -617, -617, -313, -617, -287, -307, -352, -351, -609, -310, -617, -617, -527, -617, -556, -617, -361, -359, -605, -551, -363, -370, -574, -605, -616, -405, -616, -578, -526, -617, -537, -617, -540, -617, -617, -542, -617, -564, -617, -426, -617, -488, -489, -486, -483, -487, -268, -258, -617, -617, -426, -617, -617, -616, -580, -568, -617, -375, -605, -616, -616, -551, -616, -558, -617, -392, -398, -580, -616, -617, -522, -616, -617, -605, -109, -112, -108, -617, -92, -89, -77, -330, -605, -524, -617, -583, -124, -617, -616, -616, -355, -440, -439, -441, -616, -616, -297, -415, -416, -10, -617, -617, -353, -269, -617, -617, -616, -200, -56, -203, -34, -62, -202, -33, -617, -608, -205, -35, -64, -204, -36, -312, -617, -616, -245, -616, -198, -579, -605, -553, -617, -368, -617, -605, -617, -617, -580, -561, -529, -530, -555, -530, -571, -530, -530, -566, -530, -315, -485, -617, -617, -374, -617, -557, -617, -385, -377, -383, -388, -617, -617, -390, -617, -395, -617, -373, -617, -617, -322, -617, -617, -426, -326, -545, -523, -328, -240, -11, -445, -616, -356, -617, -443, -617, -617, -304, -617, -270, -305, -253, -616, -201, -32, -616, -617, -617, -617, -360, -362, -366, -617, -371, -406, -408, -409, -525, -533, -617, -535, -617, -541, -617, -538, -617, -543, -616, -429, -290, -617, -397, -616, -616, -376, -569, -616, -616, -567, -616, -400, -403, -402, -605, -580, -559, -432, -616, -319, -521, -616, -444, -99, -100, -617, -617, -107, -442, -616, -412, -616, -617, -616, -267, -308, -311, -364, -617, -369, -617, -530, -530, -530, -530, -617, -289, -598, -380, -617, -382, -617, -389, -617, -386, -617, -391, -617, -399, -372, -617, -617, -106, -617, -616, -617, -438, -616, -57, -435, -436, -434, -617, -367, -534, -531, -617, -536, -539, -316, -616, -616, -616, -616, -401, -323, -331, -595, -594, -605, -105, -598, -437, -354, -365, -530, -381, -378, -617, -384, -387, -426, -532, -616, -379 ] clist = [ '89,130,344,175,357,571,105,199,222,238,329,242,351,126,246,67,357,222', '105,358,253,199,353,379,217,292,185,277,268,272,330,375,296,217,290', '126,126,296,324,219,433,240,520,334,509,689,297,420,219,527,185,297', '682,720,463,185,539,543,555,222,185,266,611,591,361,349,244,825,641', '531,865,354,353,640,258,217,640,560,562,566,369,785,641,656,867,743', '360,337,235,355,219,789,953,84,813,730,124,250,614,387,923,376,230,649', '653,84,926,734,627,629,399,230,452,830,385,954,948,588,262,262,764,750', '249,147,796,444,441,794,960,386,560,644,566,456,257,775,737,256,667', '346,611,627,474,679,898,339,659,477,625,114,230,753,790,230,902,397', '293,243,783,286,230,120,803,695,627,671,850,956,394,84,848,609,940,396', '981,512,384,511,820,230,431,778,230,691,432,577,579,858,230,793,1013', '728,819,908,247,245,865,383,271,726,289,573,1026,685,254,325,269,769', '635,634,205,797,715,2,864,416,915,416,862,230,958,230,879,948,853,954', '327,923,440,1015,276,475,1,,,,,453,,,,,,,,,,,668,,865,,,467,471,,676', '126,867,,,,,1036,,126,,,,,343,126,453,126,611,360,,,,535,343,,,872,', ',,,,896,,,357,,,,462,,,343,554,,,357,800,,,551,380,865,748,945,464,473', ',,,,876,84,581,557,559,,,,575,592,,,,890,582,583,584,585,,587,,406,446', '408,230,230,,222,611,222,446,222,542,552,,559,262,,262,641,84,,533,217', '105,217,640,640,548,627,798,420,222,542,660,360,1035,559,219,550,219', ',1011,,807,,802,,559,833,570,,,564,,,,,,586,,809,930,222,542,,591,,', '836,533,559,545,,816,843,,,,,84,,,,564,222,542,537,,538,,648,648,84', ',,,665,,,230,230,,230,,230,564,,639,,,84,,,,84,564,,84,222,542,230,665', ',449,450,230,126,805,772,,239,694,,,126,230,,963,,564,230,230,230,230', '230,84,230,230,,686,,462,755,,,757,230,1001,760,462,692,,,,732,,,296', ',,648,694,,,894,,732,723,230,696,697,297,89,1043,,,,,105,,185,,,230', '849,,,698,,416,416,784,,,1034,,,,,262,,,230,918,,,712,262,721,696,718', ',641,,,611,724,230,,763,640,,,,,,,,694,,,,723,,,,,795,,,,,,,,343,,,', ',,343,343,343,343,1012,343,733,,230,808,,,559,971,84,,973,787,84,,,', ',,721,696,,,,,84,,,,,,,416,,721,,,84,,,,868,791,835,871,,838,654,,842', ',,845,,772,222,542,,,,823,721,,592,742,,414,811,806,419,,422,1002,,296', '1003,564,126,126,,,683,815,818,429,,732,822,297,,,185,,,779,815,,185', '533,,,815,804,462,,627,1031,,648,,,230,,,,81,866,893,869,,84,,,693,81', ',,81,,,,,831,81,,895,847,931,791,933,,935,937,,939,,,,,230,,,,84,,,', ',,,262,262,,,911,,917,949,84,,952,,81,791,,81,,881,881,,881,,81,,126', ',,,721,,,81,782,,,,861,,532,,,81,230,742,81,230,903,,230,856,81,230', '907,,,983,,985,962,,,986,230,,416,,,,,,,343,,,,84,,84,,,,81,946,81,950', ',589,,,,,,,,,,1016,1017,1019,1020,,,,,84,,636,878,,637,,,239,,1022,', '1024,,852,84,1025,,84,230,,,239,,126,,,,984,,852,,,,,,84,1037,,,,,84', ',,126,1044,,230,,,,,,742,,742,,,1045,779,230,779,,,779,,,,957,84,,84', ',881,881,,81,881,881,,881,1000,,,107,559,1023,127,,,564,,,,,,107,,,81', '81,,,815,,,951,,,,,,,,,81,,,,,706,,979,742,,84,,968,,,,,,222,542,,84', '815,343,84,,,,,,,,,,,881,881,881,881,564,,721,782,,782,107,84,782,,637', ',852,343,779,,779,,779,881,779,81,,,742,,742,84,,,84,,739,,81,,,,84', ',84,81,81,,81,,81,,,,,,81,,,,81,,742,81,,,81,779,,,,81,,,771,,,230,', ',,81,,,,,81,81,81,81,81,81,81,81,,,221,,221,,,,81,,,221,,,880,883,,886', ',,,,782,,782,,782,,782,,81,,817,,,,332,333,,,335,,,,,81,,828,,,,637', '239,221,,,,,,,,,,,81,,107,,,,589,782,,,,,,,,81,,,378,,,,,,,363,,,221', ',,,,,,,,870,,,,107,,44,,,113,,,,,,,,,44,,81,,,,,,81,,,,81,259,259,,', ',,273,381,,,,81,,,,,,,,,,,,81,,,,,,,,,,107,,,,,407,912,,,,990,992,,107', '994,996,,998,44,,,,,,,,,,,,,107,,,,107,,,107,,,221,,,221,,221,,,,,,', ',,,,378,,221,,,,,81,,107,,593,,,,,81,363,,,,,,,,,,,,,1038,1039,1041', '1042,239,,,,,976,,,,,,81,,,79,81,,,,1046,,,363,,,,79,,,,81,,,480,481', '482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498', '499,500,501,502,503,504,505,,,,,,81,,,81,,516,81,,,81,,,,44,,,,,221', '221,81,221,,221,,,79,,,,,524,,81,273,81,,,,553,,107,273,,221,107,,,259', ',259,,44,,,,363,107,,580,,,81,,,,590,,,107,536,,,,,221,,81,,,81,81,', '547,,,221,,,221,,,221,,,553,,221,81,580,,647,,,81,,221,,,,81,,44,,,', ',,,,,,,81,,44,,,633,,,221,81,,81,,,,,,,,,44,,,,44,,,44,,107,,,,,,,,', ',,,,,,,,,,,,,,,79,,44,,,,,,,107,,,81,677,,,,,,,700,701,,81,107,704,81', ',,221,,,,,,,,,,79,,,702,,,,,,81,,,,,,708,,,,,,,,,,,,259,,81,,,81,,221', '259,,,,593,81,,81,,707,,,,,,711,,107,,107,,221,,,713,79,,,,,,,,,,,,', '79,,81,102,,,125,729,107,,,,,,,102,,,79,,44,221,79,107,44,79,107,,264', '264,,,,,,,44,765,,,,,,,107,,221,,44,,107,,,79,,,,,,,,,,,,,,,,,,,,221', ',,,,107,102,107,,,,,,,,221,,,,221,221,,,,832,,834,,,837,,,841,,,844', ',,221,,,,,,810,851,647,,,,,,,,821,,,,44,,,107,,970,,,,,,221,,,107,,', '107,,,,859,,860,,834,837,,841,844,,,,44,,52,,,116,107,259,259,,,,,854', '52,44,,875,,79,,,,79,,,107,260,260,107,,901,892,274,,79,,107,,107,,', ',,,,,79,221,,,,,905,,,,,916,909,,,,,,102,,,,,,,,,,,,899,52,,,,44,,44', ',447,920,,921,,,,916,447,,,,,,264,,264,,102,,,,,,,44,,,273,,,,,,,,,922', ',,44,,927,44,79,,,221,,,,,221,,,,,964,,,,44,,,,,,44,974,,,975,,,,,,79', '102,,,,,,,,,,,,,102,79,987,,44,,44,,,,,,,,,,,,102,,,,102,,,102,,,,,', ',,1008,,1009,,,,,,273,,,,,,,221,,,52,,102,,,,,,,44,,965,,,,,,79,,79', '44,274,,44,,,,,,274,,,,,,260,,260,,52,,,,,,44,79,,,,,,,,,,,,,,,79,,', '79,44,264,,44,,,,,,264,,44,,44,,,,79,,,,,,79,,,,,,,,,,,52,,,,,,,,,,', ',,52,,,,79,,79,,,,,,,,,,,,52,,102,,52,,102,52,,,,,,,,,,,102,,,,,,,,', ',,,102,,,,,52,,,,,,,79,,,,,,,,,,,79,,,79,,,,,,,,,,,,,,,,,,,,,,79,,,', ',,,,,,,,,,,,,,,,79,260,,79,,,,,,260,,79,,79,,102,767,,,,,,,,,,,,,,,', ',,,,,,,,,,,,,,,,102,,,,,,,264,264,,,,,,,102,,,,52,,,,52,,,,,,,,,,,,52', ',,,,,,,,,,,52,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,102,,102,,,,,,,,,,,', ',,,,,,,,,,,,,,,102,,,447,,,,,,,,,,,,102,,,102,52,,,,,,,,,,,,,,,,,102', ',,,,,102,,,,,,,,,,52,,,,,,,260,260,,,,,,,52,,,102,,102,,,,,,,,,,,,,', ',,,,,,,,,,,,,,,,,,,,,447,,,,,,,,,,,,,,,,,,,102,,969,,,,,,52,,52,102', ',,102,,,,,,,,,,,,,,,,,,,,,,102,52,,,274,,,,,,,,,,,,52,,,52,102,,,102', ',,,,,,,102,,102,,,,52,,,,,,52,,,,,,,,,,,,,,,,,,,,,,,,,,,,52,,52,,,,', ',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,274,,,,,,,,,,,,,,,,,,,52,,966,,,,,,,,', '52,,,52,,,,,,,,,,,,,,,,,,,,,,52,,,,,,,,,,,,,,,,,,,,52,,,52,,,,,,,,52', ',52' ] racc_goto_table = arr = ::Array.new(2860, nil) idx = 0 clist.each do |str| str.split(',', -1).each do |i| arr[idx] = i.to_i unless i.empty? idx += 1 end end clist = [ '6,33,19,59,95,92,9,6,35,86,150,6,19,66,6,2,95,35,9,8,6,6,71,22,68,17', '60,59,6,6,17,19,63,68,6,66,66,63,6,70,69,70,39,33,10,13,64,73,70,89', '60,64,96,26,54,60,89,25,41,35,60,52,180,20,49,40,7,90,193,29,184,40', '71,74,53,68,74,39,25,39,40,139,193,57,188,129,48,38,47,5,70,142,144', '24,14,91,24,47,149,6,127,5,24,42,42,24,130,91,39,25,33,24,170,14,68', '145,189,29,24,24,26,147,106,167,107,58,108,109,110,70,39,25,39,58,111', '26,134,167,112,47,180,39,113,114,115,11,94,170,104,93,24,134,131,24', '15,88,18,85,137,84,24,21,26,72,39,25,103,143,102,24,101,146,105,148', '130,32,67,151,152,24,155,156,24,42,157,69,69,142,24,158,159,160,161', '162,165,166,184,100,168,92,169,99,144,65,172,173,174,175,176,177,178', '179,44,3,183,6,45,6,185,24,186,24,142,189,129,145,98,127,171,130,97', '192,1,,,,,171,,,,,,,,,,,54,,184,,,49,171,,54,66,188,,,,,130,,66,,,,', '31,66,171,66,180,48,,,,22,31,,,91,,,,,,26,,,95,,,,52,,,31,22,,,95,57', ',,8,31,184,149,139,53,38,,,,,134,24,22,71,71,,,,19,22,,,,134,19,19,19', '19,,19,,31,24,31,24,24,,35,180,35,24,35,6,49,,71,24,,24,193,24,,68,68', '9,68,74,74,9,39,25,73,35,6,95,48,90,71,70,5,70,,14,,149,,10,,71,42,5', ',,60,,,,,,9,,10,134,35,6,,20,,,41,68,71,7,,29,41,,,,,24,,,,60,35,6,47', ',47,,6,6,24,,,,171,,,24,24,,24,,24,60,,70,,,24,,,,24,60,,24,35,6,24', '171,,31,31,24,66,54,73,,30,71,,,66,24,,96,,60,24,24,24,24,24,24,24,24', ',33,,52,182,,,182,24,134,182,52,17,,,,95,,,63,,,6,71,,,10,,95,71,24', '6,40,64,6,26,,,,,9,,60,,,24,69,,,2,,6,6,138,,,13,,,,,24,,,24,89,,,9', '24,33,6,40,,193,,,180,40,24,,19,74,,,,,,,,71,,,,71,,,,,95,,,,,,,,31', ',,,,,31,31,31,31,92,31,70,,24,95,,,71,89,24,,89,140,24,,,,,,33,6,,,', ',24,,,,,,,6,,33,,,24,,,,138,33,22,138,,22,31,,22,,,22,,73,35,6,,,,150', '33,,22,128,,30,17,59,30,,30,10,,63,10,60,66,66,,,31,6,6,30,,95,86,64', ',,60,,,133,6,,60,68,,,6,52,52,,39,25,,6,,,24,,,,43,140,95,140,,24,,', '31,43,,,43,,,,,70,43,,19,68,182,33,182,,182,182,,182,,,,,24,,,,24,,', ',,,,24,24,,,19,,22,138,24,,138,,43,33,,43,,6,6,,6,,43,,66,,,,33,,,43', '135,,,,133,,30,,,43,24,128,43,24,6,,24,128,43,24,6,,,138,,138,95,,,138', '24,,6,,,,,,,31,,,,24,,24,,,,43,140,43,140,,30,,,,,,,,,,182,182,182,182', ',,,,24,,30,24,,30,,,30,,138,,138,,135,24,138,,24,24,,,30,,66,,,,140', ',135,,,,,,24,138,,,,,24,,,66,182,,24,,,,,,128,,128,,,138,133,24,133', ',,133,,,,133,24,,24,,6,6,,43,6,6,,6,33,,,28,71,140,28,,,60,,,,,,28,', ',43,43,,,6,,,24,,,,,,,,,43,,,,,30,,128,128,,24,,24,,,,,,35,6,,24,6,31', '24,,,,,,,,,,,6,6,6,6,60,,33,135,,135,28,24,135,,30,,135,31,133,,133', ',133,6,133,43,,,128,,128,24,,,24,,30,,43,,,,24,,24,43,43,,43,,43,,,', ',,43,,,,43,,128,43,,,43,133,,,,43,,,30,,,24,,,,43,,,,,43,43,43,43,43', '43,43,43,,,34,,34,,,,43,,,34,,,136,136,,136,,,,,135,,135,,135,,135,', '43,,30,,,,34,34,,,34,,,,,43,,30,,,,30,30,34,,,,,,,,,,,43,,28,,,,30,135', ',,,,,,,43,,,34,,,,,,,12,,,34,,,,,,,,,30,,,,28,,55,,,55,,,,,,,,,55,,43', ',,,,,43,,,,43,55,55,,,,,55,50,,,,43,,,,,,,,,,,,43,,,,,,,,,,28,,,,,50', '30,,,,136,136,,28,136,136,,136,55,,,,,,,,,,,,,28,,,,28,,,28,,,34,,,34', ',34,,,,,,,,,,,34,,34,,,,,43,,28,,28,,,,,43,12,,,,,,,,,,,,,136,136,136', '136,30,,,,,30,,,,,,43,,,23,43,,,,136,,,12,,,,23,,,,43,,,34,34,34,34', '34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,,', ',,,43,,,43,,34,43,,,43,,,,55,,,,,34,34,43,34,,34,,,23,,,,,12,,43,55', '43,,,,34,,28,55,,34,28,,,55,,55,,55,,,,12,28,,34,,,43,,,,34,,,28,50', ',,,,34,,43,,,43,43,,50,,,34,,,34,,,34,,,34,,34,43,34,,34,,,43,,34,,', ',43,,55,,,,,,,,,,,43,,55,,,50,,,34,43,,43,,,,,,,,,55,,,,55,,,55,,28', ',,,,,,,,,,,,,,,,,,,,,,,23,,55,,,,,,,28,,,43,50,,,,,,,34,34,,43,28,34', '43,,,34,,,,,,,,,,23,,,12,,,,,,43,,,,,,12,,,,,,,,,,,,55,,43,,,43,,34', '55,,,,28,43,,43,,50,,,,,,50,,28,,28,,34,,,50,23,,,,,,,,,,,,,23,,43,27', ',,27,50,28,,,,,,,27,,,23,,55,34,23,28,55,23,28,,27,27,,,,,,,55,12,,', ',,,,28,,34,,55,,28,,,23,,,,,,,,,,,,,,,,,,,,34,,,,,28,27,28,,,,,,,,34', ',,,34,34,,,,34,,34,,,34,,,34,,,34,,,34,,,,,,50,34,34,,,,,,,,50,,,,55', ',,28,,28,,,,,,34,,,28,,,28,,,,12,,12,,34,34,,34,34,,,,55,,56,,,56,28', '55,55,,,,,50,56,55,,12,,23,,,,23,,,28,56,56,28,,34,12,56,,23,,28,,28', ',,,,,,,23,34,,,,,12,,,,,34,12,,,,,,27,,,,,,,,,,,,50,56,,,,55,,55,,27', '12,,12,,,,34,27,,,,,,27,,27,,27,,,,,,,55,,,55,,,,,,,,,50,,,55,,50,55', '23,,,34,,,,,34,,,,,12,,,,55,,,,,,55,12,,,12,,,,,,23,27,,,,,,,,,,,,,27', '23,12,,55,,55,,,,,,,,,,,,27,,,,27,,,27,,,,,,,,12,,12,,,,,,55,,,,,,,34', ',,56,,27,,,,,,,55,,55,,,,,,23,,23,55,56,,55,,,,,,56,,,,,,56,,56,,56', ',,,,,55,23,,,,,,,,,,,,,,,23,,,23,55,27,,55,,,,,,27,,55,,55,,,,23,,,', ',,23,,,,,,,,,,,56,,,,,,,,,,,,,56,,,,23,,23,,,,,,,,,,,,56,,27,,56,,27', '56,,,,,,,,,,,27,,,,,,,,,,,,27,,,,,56,,,,,,,23,,,,,,,,,,,23,,,23,,,,', ',,,,,,,,,,,,,,,,,23,,,,,,,,,,,,,,,,,,,,23,56,,23,,,,,,56,,23,,23,,27', '27,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,27,,,,,,,27,27,,,,,,,27,,,,56,,,,56', ',,,,,,,,,,,56,,,,,,,,,,,,56,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,27,,27', ',,,,,,,,,,,,,,,,,,,,,,,,,,27,,,27,,,,,,,,,,,,27,,,27,56,,,,,,,,,,,,', ',,,,27,,,,,,27,,,,,,,,,,56,,,,,,,56,56,,,,,,,56,,,27,,27,,,,,,,,,,,', ',,,,,,,,,,,,,,,,,,,,,,,27,,,,,,,,,,,,,,,,,,,27,,27,,,,,,56,,56,27,,', '27,,,,,,,,,,,,,,,,,,,,,,27,56,,,56,,,,,,,,,,,,56,,,56,27,,,27,,,,,,', ',27,,27,,,,56,,,,,,56,,,,,,,,,,,,,,,,,,,,,,,,,,,,56,,56,,,,,,,,,,,,', ',,,,,,,,,,,,,,,,,,,,,,56,,,,,,,,,,,,,,,,,,,56,,56,,,,,,,,,56,,,56,,', ',,,,,,,,,,,,,,,,,,,56,,,,,,,,,,,,,,,,,,,,56,,,56,,,,,,,,56,,56' ] racc_goto_check = arr = ::Array.new(2860, nil) idx = 0 clist.each do |str| str.split(',', -1).each do |i| arr[idx] = i.to_i unless i.empty? idx += 1 end end racc_goto_pointer = [ nil, 232, 13, 213, nil, 13, -2, 52, -57, 4, -283, 94, 1125, -465, -595, -659, nil, -13, 118, -57, -332, 156, -68, 1382, 91, -295, -509, 1723, 952, -278, 456, 211, -155, -5, 1105, -3, nil, nil, 37, -295, -1, -311, -328, 718, -344, -617, nil, 77, 8, -14, 1156, nil, 33, 47, -209, 1219, 1886, -360, -124, -6, 17, nil, nil, -6, 8, -276, 8, 75, 13, -200, 28, -50, -357, -172, -345, nil, nil, nil, nil, nil, nil, nil, nil, nil, 126, 144, -3, nil, 47, -295, -635, -480, -371, 144, -298, -72, -422, 197, 185, -179, 97, -560, 62, -568, -250, -700, 103, -535, -122, -527, -765, 108, -318, -135, -330, -662, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, -755, 68, -516, -751, -500, nil, 47, -461, 145, 344, -494, -112, -571, -35, nil, -561, -722, -797, -774, -225, -488, 65, -298, -32, -151, -513, nil, nil, -56, -468, -53, -464, -785, -381, -498, -626, nil, nil, 176, 179, 114, 167, 164, -142, -17, 182, 165, 176, -428, -202, -200, 201, -450, -334, nil, -122, -542, -686, -536, -671, nil, -674, -768, nil, nil, -51, -353 ] racc_goto_default = [ nil, nil, nil, nil, 76, nil, 366, 95, 377, 367, nil, nil, 510, nil, 827, nil, 364, nil, nil, nil, 61, 65, 71, 229, 241, nil, nil, 232, 234, nil, 216, 21, nil, 382, 39, 42, 47, 50, nil, 631, nil, nil, nil, 123, nil, nil, 103, 544, 7, nil, nil, 28, 34, 37, nil, 223, 225, 442, nil, 294, 519, 190, 295, 87, 94, nil, 104, nil, 540, nil, 541, 565, 717, 417, 224, 350, 53, 58, 68, 73, 77, 83, 90, 96, 99, nil, 370, 12, nil, nil, nil, nil, nil, nil, nil, 529, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 741, 615, nil, 745, 947, 792, 597, nil, 607, nil, nil, 613, nil, 619, 650, nil, nil, nil, 602, nil, nil, nil, 681, nil, nil, nil, 569, 371, nil, nil, nil, nil, nil, nil, nil, nil, 10, 18, 24, nil, nil, nil, nil, nil, 413, nil, nil, nil, nil, nil, nil, nil, nil, 863, 612, nil, 616, 617, 620, 788, 623, 595, 780, 604, 610, nil, 227 ] racc_reduce_table = [ 0, 0, :racc_error, 0, 145, :_reduce_1, 2, 143, :_reduce_2, 2, 144, :_reduce_3, 1, 146, :_reduce_none, 1, 146, :_reduce_none, 3, 146, :_reduce_6, 2, 146, :_reduce_none, 1, 149, :_reduce_8, 0, 153, :_reduce_9, 5, 149, :_reduce_10, 4, 152, :_reduce_11, 2, 154, :_reduce_12, 1, 158, :_reduce_none, 1, 158, :_reduce_none, 3, 158, :_reduce_15, 2, 158, :_reduce_16, 0, 174, :_reduce_17, 4, 151, :_reduce_18, 3, 151, :_reduce_19, 3, 151, :_reduce_20, 3, 151, :_reduce_21, 2, 151, :_reduce_22, 3, 151, :_reduce_23, 3, 151, :_reduce_24, 3, 151, :_reduce_25, 3, 151, :_reduce_26, 3, 151, :_reduce_27, 4, 151, :_reduce_28, 1, 151, :_reduce_none, 3, 151, :_reduce_30, 3, 151, :_reduce_31, 6, 151, :_reduce_32, 5, 151, :_reduce_33, 5, 151, :_reduce_34, 5, 151, :_reduce_35, 5, 151, :_reduce_36, 3, 151, :_reduce_37, 3, 151, :_reduce_38, 3, 151, :_reduce_39, 3, 151, :_reduce_40, 1, 151, :_reduce_none, 3, 162, :_reduce_42, 3, 162, :_reduce_43, 1, 173, :_reduce_none, 3, 173, :_reduce_45, 3, 173, :_reduce_46, 3, 173, :_reduce_47, 2, 173, :_reduce_48, 1, 173, :_reduce_none, 1, 161, :_reduce_50, 1, 164, :_reduce_none, 1, 164, :_reduce_none, 1, 178, :_reduce_none, 4, 178, :_reduce_54, 0, 186, :_reduce_55, 0, 187, :_reduce_56, 6, 183, :_reduce_57, 1, 185, :_reduce_58, 2, 177, :_reduce_59, 3, 177, :_reduce_60, 4, 177, :_reduce_61, 5, 177, :_reduce_62, 4, 177, :_reduce_63, 5, 177, :_reduce_64, 2, 177, :_reduce_65, 2, 177, :_reduce_66, 2, 177, :_reduce_67, 2, 177, :_reduce_68, 2, 177, :_reduce_69, 1, 163, :_reduce_none, 3, 163, :_reduce_71, 1, 191, :_reduce_none, 3, 191, :_reduce_73, 1, 190, :_reduce_74, 2, 190, :_reduce_75, 3, 190, :_reduce_76, 5, 190, :_reduce_77, 2, 190, :_reduce_78, 4, 190, :_reduce_79, 2, 190, :_reduce_80, 4, 190, :_reduce_81, 1, 190, :_reduce_82, 3, 190, :_reduce_83, 1, 194, :_reduce_none, 3, 194, :_reduce_85, 2, 193, :_reduce_86, 3, 193, :_reduce_87, 1, 196, :_reduce_88, 3, 196, :_reduce_89, 1, 195, :_reduce_90, 1, 195, :_reduce_91, 4, 195, :_reduce_92, 3, 195, :_reduce_93, 3, 195, :_reduce_94, 3, 195, :_reduce_95, 3, 195, :_reduce_96, 2, 195, :_reduce_97, 1, 195, :_reduce_98, 1, 170, :_reduce_99, 1, 170, :_reduce_100, 4, 170, :_reduce_101, 3, 170, :_reduce_102, 3, 170, :_reduce_103, 3, 170, :_reduce_104, 3, 170, :_reduce_105, 2, 170, :_reduce_106, 1, 170, :_reduce_107, 1, 199, :_reduce_108, 1, 199, :_reduce_none, 2, 200, :_reduce_110, 1, 200, :_reduce_111, 3, 200, :_reduce_112, 1, 201, :_reduce_none, 1, 201, :_reduce_none, 1, 201, :_reduce_none, 1, 201, :_reduce_116, 1, 201, :_reduce_117, 1, 204, :_reduce_none, 1, 204, :_reduce_none, 1, 159, :_reduce_120, 1, 159, :_reduce_none, 1, 160, :_reduce_122, 0, 207, :_reduce_123, 4, 160, :_reduce_124, 1, 202, :_reduce_none, 1, 202, :_reduce_none, 1, 202, :_reduce_none, 1, 202, :_reduce_none, 1, 202, :_reduce_none, 1, 202, :_reduce_none, 1, 202, :_reduce_none, 1, 202, :_reduce_none, 1, 202, :_reduce_none, 1, 202, :_reduce_none, 1, 202, :_reduce_none, 1, 202, :_reduce_none, 1, 202, :_reduce_none, 1, 202, :_reduce_none, 1, 202, :_reduce_none, 1, 202, :_reduce_none, 1, 202, :_reduce_none, 1, 202, :_reduce_none, 1, 202, :_reduce_none, 1, 202, :_reduce_none, 1, 202, :_reduce_none, 1, 202, :_reduce_none, 1, 202, :_reduce_none, 1, 202, :_reduce_none, 1, 202, :_reduce_none, 1, 202, :_reduce_none, 1, 202, :_reduce_none, 1, 202, :_reduce_none, 1, 202, :_reduce_none, 1, 202, :_reduce_none, 1, 202, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 1, 203, :_reduce_none, 3, 176, :_reduce_197, 5, 176, :_reduce_198, 3, 176, :_reduce_199, 5, 176, :_reduce_200, 6, 176, :_reduce_201, 5, 176, :_reduce_202, 5, 176, :_reduce_203, 5, 176, :_reduce_204, 5, 176, :_reduce_205, 4, 176, :_reduce_206, 3, 176, :_reduce_207, 3, 176, :_reduce_208, 3, 176, :_reduce_209, 3, 176, :_reduce_210, 3, 176, :_reduce_211, 3, 176, :_reduce_212, 3, 176, :_reduce_213, 3, 176, :_reduce_214, 3, 176, :_reduce_215, 4, 176, :_reduce_216, 4, 176, :_reduce_217, 2, 176, :_reduce_218, 2, 176, :_reduce_219, 3, 176, :_reduce_220, 3, 176, :_reduce_221, 3, 176, :_reduce_222, 3, 176, :_reduce_223, 3, 176, :_reduce_224, 3, 176, :_reduce_225, 3, 176, :_reduce_226, 3, 176, :_reduce_227, 3, 176, :_reduce_228, 3, 176, :_reduce_229, 3, 176, :_reduce_230, 3, 176, :_reduce_231, 3, 176, :_reduce_232, 2, 176, :_reduce_233, 2, 176, :_reduce_234, 3, 176, :_reduce_235, 3, 176, :_reduce_236, 3, 176, :_reduce_237, 3, 176, :_reduce_238, 3, 176, :_reduce_239, 6, 176, :_reduce_240, 1, 176, :_reduce_none, 1, 172, :_reduce_242, 1, 209, :_reduce_none, 2, 209, :_reduce_244, 4, 209, :_reduce_245, 2, 209, :_reduce_246, 3, 213, :_reduce_247, 1, 214, :_reduce_none, 1, 214, :_reduce_none, 1, 167, :_reduce_250, 1, 167, :_reduce_251, 2, 167, :_reduce_252, 4, 167, :_reduce_253, 2, 167, :_reduce_254, 1, 189, :_reduce_255, 2, 189, :_reduce_256, 2, 189, :_reduce_257, 4, 189, :_reduce_258, 1, 189, :_reduce_259, 0, 217, :_reduce_260, 2, 182, :_reduce_261, 2, 216, :_reduce_262, 2, 215, :_reduce_263, 1, 215, :_reduce_none, 1, 210, :_reduce_265, 2, 210, :_reduce_266, 3, 210, :_reduce_267, 4, 210, :_reduce_268, 3, 171, :_reduce_269, 4, 171, :_reduce_270, 2, 171, :_reduce_271, 1, 208, :_reduce_none, 1, 208, :_reduce_none, 1, 208, :_reduce_none, 1, 208, :_reduce_none, 1, 208, :_reduce_none, 1, 208, :_reduce_none, 1, 208, :_reduce_none, 1, 208, :_reduce_none, 1, 208, :_reduce_none, 1, 208, :_reduce_none, 1, 208, :_reduce_282, 0, 240, :_reduce_283, 4, 208, :_reduce_284, 2, 208, :_reduce_285, 0, 241, :_reduce_286, 4, 208, :_reduce_287, 3, 208, :_reduce_288, 3, 208, :_reduce_289, 2, 208, :_reduce_290, 3, 208, :_reduce_291, 3, 208, :_reduce_292, 1, 208, :_reduce_293, 4, 208, :_reduce_294, 3, 208, :_reduce_295, 1, 208, :_reduce_296, 5, 208, :_reduce_297, 4, 208, :_reduce_298, 3, 208, :_reduce_299, 2, 208, :_reduce_300, 1, 208, :_reduce_none, 2, 208, :_reduce_302, 2, 208, :_reduce_303, 6, 208, :_reduce_304, 6, 208, :_reduce_305, 0, 242, :_reduce_306, 0, 243, :_reduce_307, 7, 208, :_reduce_308, 0, 244, :_reduce_309, 0, 245, :_reduce_310, 7, 208, :_reduce_311, 5, 208, :_reduce_312, 4, 208, :_reduce_313, 0, 246, :_reduce_314, 0, 247, :_reduce_315, 9, 208, :_reduce_316, 0, 248, :_reduce_317, 0, 249, :_reduce_318, 7, 208, :_reduce_319, 0, 250, :_reduce_320, 0, 251, :_reduce_321, 0, 252, :_reduce_322, 9, 208, :_reduce_323, 0, 253, :_reduce_324, 0, 254, :_reduce_325, 6, 208, :_reduce_326, 0, 255, :_reduce_327, 6, 208, :_reduce_328, 0, 256, :_reduce_329, 0, 257, :_reduce_330, 9, 208, :_reduce_331, 1, 208, :_reduce_332, 1, 208, :_reduce_333, 1, 208, :_reduce_334, 1, 208, :_reduce_335, 1, 166, :_reduce_336, 1, 258, :_reduce_none, 1, 259, :_reduce_none, 1, 260, :_reduce_none, 1, 261, :_reduce_none, 1, 262, :_reduce_none, 1, 263, :_reduce_none, 1, 264, :_reduce_none, 1, 265, :_reduce_none, 1, 266, :_reduce_none, 1, 267, :_reduce_none, 1, 268, :_reduce_none, 1, 231, :_reduce_none, 1, 231, :_reduce_none, 2, 231, :_reduce_none, 1, 233, :_reduce_none, 1, 233, :_reduce_none, 1, 232, :_reduce_none, 5, 232, :_reduce_354, 1, 156, :_reduce_none, 2, 156, :_reduce_356, 1, 235, :_reduce_none, 1, 235, :_reduce_358, 1, 269, :_reduce_none, 3, 269, :_reduce_360, 1, 272, :_reduce_361, 3, 272, :_reduce_362, 1, 271, :_reduce_363, 4, 271, :_reduce_364, 6, 271, :_reduce_365, 3, 271, :_reduce_366, 5, 271, :_reduce_367, 2, 271, :_reduce_368, 4, 271, :_reduce_369, 1, 271, :_reduce_370, 3, 271, :_reduce_371, 4, 273, :_reduce_372, 2, 273, :_reduce_373, 2, 273, :_reduce_374, 1, 273, :_reduce_375, 2, 278, :_reduce_376, 1, 278, :_reduce_none, 6, 279, :_reduce_378, 8, 279, :_reduce_379, 4, 279, :_reduce_380, 6, 279, :_reduce_381, 4, 279, :_reduce_382, 2, 279, :_reduce_383, 6, 279, :_reduce_384, 2, 279, :_reduce_385, 4, 279, :_reduce_386, 6, 279, :_reduce_387, 2, 279, :_reduce_388, 4, 279, :_reduce_389, 2, 279, :_reduce_390, 4, 279, :_reduce_391, 1, 279, :_reduce_392, 1, 184, :_reduce_none, 1, 184, :_reduce_none, 3, 283, :_reduce_395, 1, 283, :_reduce_396, 4, 283, :_reduce_397, 1, 284, :_reduce_none, 4, 284, :_reduce_399, 1, 285, :_reduce_400, 3, 285, :_reduce_401, 1, 286, :_reduce_402, 1, 286, :_reduce_none, 0, 290, :_reduce_404, 3, 230, :_reduce_405, 4, 288, :_reduce_406, 1, 288, :_reduce_407, 3, 289, :_reduce_408, 3, 289, :_reduce_409, 0, 293, :_reduce_410, 0, 294, :_reduce_411, 6, 292, :_reduce_412, 2, 179, :_reduce_413, 4, 179, :_reduce_414, 5, 179, :_reduce_415, 5, 179, :_reduce_416, 0, 296, :_reduce_417, 3, 229, :_reduce_418, 4, 229, :_reduce_419, 4, 229, :_reduce_420, 3, 229, :_reduce_421, 3, 229, :_reduce_422, 3, 229, :_reduce_423, 2, 229, :_reduce_424, 1, 229, :_reduce_425, 4, 229, :_reduce_426, 0, 297, :_reduce_427, 0, 298, :_reduce_428, 6, 228, :_reduce_429, 0, 299, :_reduce_430, 0, 300, :_reduce_431, 6, 228, :_reduce_432, 0, 302, :_reduce_433, 6, 234, :_reduce_434, 1, 301, :_reduce_none, 1, 301, :_reduce_none, 6, 155, :_reduce_437, 0, 155, :_reduce_438, 1, 303, :_reduce_439, 1, 303, :_reduce_none, 1, 303, :_reduce_none, 2, 304, :_reduce_442, 1, 304, :_reduce_none, 2, 157, :_reduce_444, 1, 157, :_reduce_none, 1, 218, :_reduce_446, 1, 218, :_reduce_447, 1, 218, :_reduce_none, 1, 219, :_reduce_449, 1, 306, :_reduce_450, 1, 306, :_reduce_none, 2, 306, :_reduce_452, 3, 307, :_reduce_453, 1, 307, :_reduce_454, 3, 220, :_reduce_455, 3, 221, :_reduce_456, 3, 222, :_reduce_457, 3, 222, :_reduce_458, 1, 311, :_reduce_459, 3, 311, :_reduce_460, 1, 312, :_reduce_none, 2, 312, :_reduce_462, 3, 224, :_reduce_463, 3, 224, :_reduce_464, 1, 314, :_reduce_465, 3, 314, :_reduce_466, 3, 223, :_reduce_467, 3, 223, :_reduce_468, 3, 225, :_reduce_469, 3, 225, :_reduce_470, 1, 315, :_reduce_471, 3, 315, :_reduce_472, 1, 316, :_reduce_473, 3, 316, :_reduce_474, 1, 308, :_reduce_475, 2, 308, :_reduce_476, 1, 309, :_reduce_477, 2, 309, :_reduce_478, 1, 310, :_reduce_479, 2, 310, :_reduce_480, 1, 313, :_reduce_481, 0, 318, :_reduce_482, 3, 313, :_reduce_483, 0, 319, :_reduce_484, 4, 313, :_reduce_485, 1, 317, :_reduce_486, 1, 317, :_reduce_487, 1, 317, :_reduce_488, 1, 317, :_reduce_none, 2, 205, :_reduce_490, 1, 205, :_reduce_491, 1, 320, :_reduce_none, 1, 320, :_reduce_none, 1, 320, :_reduce_none, 1, 320, :_reduce_none, 3, 206, :_reduce_496, 1, 305, :_reduce_none, 1, 305, :_reduce_none, 2, 305, :_reduce_499, 2, 305, :_reduce_500, 1, 197, :_reduce_none, 1, 197, :_reduce_none, 1, 197, :_reduce_none, 1, 197, :_reduce_none, 1, 197, :_reduce_none, 1, 198, :_reduce_506, 1, 198, :_reduce_507, 1, 198, :_reduce_508, 1, 198, :_reduce_509, 1, 198, :_reduce_510, 1, 198, :_reduce_511, 1, 198, :_reduce_512, 1, 226, :_reduce_513, 1, 226, :_reduce_514, 1, 165, :_reduce_515, 1, 165, :_reduce_516, 1, 169, :_reduce_517, 1, 169, :_reduce_518, 1, 236, :_reduce_519, 0, 321, :_reduce_520, 4, 236, :_reduce_521, 2, 236, :_reduce_522, 3, 238, :_reduce_523, 2, 238, :_reduce_524, 4, 322, :_reduce_525, 2, 322, :_reduce_526, 2, 322, :_reduce_527, 1, 322, :_reduce_none, 2, 324, :_reduce_529, 0, 324, :_reduce_530, 6, 291, :_reduce_531, 8, 291, :_reduce_532, 4, 291, :_reduce_533, 6, 291, :_reduce_534, 4, 291, :_reduce_535, 6, 291, :_reduce_536, 2, 291, :_reduce_537, 4, 291, :_reduce_538, 6, 291, :_reduce_539, 2, 291, :_reduce_540, 4, 291, :_reduce_541, 2, 291, :_reduce_542, 4, 291, :_reduce_543, 1, 291, :_reduce_544, 0, 291, :_reduce_545, 1, 287, :_reduce_546, 1, 287, :_reduce_547, 1, 287, :_reduce_548, 1, 287, :_reduce_549, 1, 270, :_reduce_none, 1, 270, :_reduce_551, 1, 326, :_reduce_none, 3, 326, :_reduce_553, 1, 280, :_reduce_554, 3, 280, :_reduce_555, 2, 327, :_reduce_556, 2, 328, :_reduce_557, 1, 274, :_reduce_none, 3, 274, :_reduce_559, 1, 323, :_reduce_none, 3, 323, :_reduce_561, 1, 329, :_reduce_none, 1, 329, :_reduce_none, 2, 275, :_reduce_564, 1, 275, :_reduce_565, 3, 330, :_reduce_566, 3, 331, :_reduce_567, 1, 281, :_reduce_568, 3, 281, :_reduce_569, 1, 325, :_reduce_570, 3, 325, :_reduce_571, 1, 332, :_reduce_none, 1, 332, :_reduce_none, 2, 282, :_reduce_574, 1, 282, :_reduce_575, 1, 333, :_reduce_none, 1, 333, :_reduce_none, 2, 277, :_reduce_578, 2, 276, :_reduce_579, 0, 276, :_reduce_580, 1, 239, :_reduce_none, 0, 334, :_reduce_582, 4, 239, :_reduce_583, 1, 227, :_reduce_584, 2, 227, :_reduce_585, 1, 212, :_reduce_none, 3, 212, :_reduce_587, 3, 335, :_reduce_588, 2, 335, :_reduce_589, 2, 335, :_reduce_590, 1, 188, :_reduce_none, 1, 188, :_reduce_none, 1, 188, :_reduce_none, 1, 181, :_reduce_none, 1, 181, :_reduce_none, 1, 181, :_reduce_none, 1, 181, :_reduce_none, 1, 295, :_reduce_none, 1, 295, :_reduce_none, 1, 295, :_reduce_none, 1, 180, :_reduce_none, 1, 180, :_reduce_none, 0, 147, :_reduce_none, 1, 147, :_reduce_none, 0, 175, :_reduce_none, 1, 175, :_reduce_none, 2, 192, :_reduce_none, 2, 168, :_reduce_none, 0, 211, :_reduce_none, 1, 211, :_reduce_none, 1, 211, :_reduce_none, 1, 237, :_reduce_612, 1, 237, :_reduce_none, 1, 150, :_reduce_none, 2, 150, :_reduce_615, 0, 148, :_reduce_616 ] racc_reduce_n = 617 racc_shift_n = 1047 racc_token_table = { false => 0, :error => 1, :kCLASS => 2, :kMODULE => 3, :kDEF => 4, :kUNDEF => 5, :kBEGIN => 6, :kRESCUE => 7, :kENSURE => 8, :kEND => 9, :kIF => 10, :kUNLESS => 11, :kTHEN => 12, :kELSIF => 13, :kELSE => 14, :kCASE => 15, :kWHEN => 16, :kWHILE => 17, :kUNTIL => 18, :kFOR => 19, :kBREAK => 20, :kNEXT => 21, :kREDO => 22, :kRETRY => 23, :kIN => 24, :kDO => 25, :kDO_COND => 26, :kDO_BLOCK => 27, :kDO_LAMBDA => 28, :kRETURN => 29, :kYIELD => 30, :kSUPER => 31, :kSELF => 32, :kNIL => 33, :kTRUE => 34, :kFALSE => 35, :kAND => 36, :kOR => 37, :kNOT => 38, :kIF_MOD => 39, :kUNLESS_MOD => 40, :kWHILE_MOD => 41, :kUNTIL_MOD => 42, :kRESCUE_MOD => 43, :kALIAS => 44, :kDEFINED => 45, :klBEGIN => 46, :klEND => 47, :k__LINE__ => 48, :k__FILE__ => 49, :k__ENCODING__ => 50, :tIDENTIFIER => 51, :tFID => 52, :tGVAR => 53, :tIVAR => 54, :tCONSTANT => 55, :tLABEL => 56, :tCVAR => 57, :tNTH_REF => 58, :tBACK_REF => 59, :tSTRING_CONTENT => 60, :tINTEGER => 61, :tFLOAT => 62, :tREGEXP_END => 63, :tUPLUS => 64, :tUMINUS => 65, :tUMINUS_NUM => 66, :tPOW => 67, :tCMP => 68, :tEQ => 69, :tEQQ => 70, :tNEQ => 71, :tGEQ => 72, :tLEQ => 73, :tANDOP => 74, :tOROP => 75, :tMATCH => 76, :tNMATCH => 77, :tDOT => 78, :tDOT2 => 79, :tDOT3 => 80, :tAREF => 81, :tASET => 82, :tLSHFT => 83, :tRSHFT => 84, :tCOLON2 => 85, :tCOLON3 => 86, :tOP_ASGN => 87, :tASSOC => 88, :tLPAREN => 89, :tLPAREN2 => 90, :tRPAREN => 91, :tLPAREN_ARG => 92, :tLBRACK => 93, :tLBRACK2 => 94, :tRBRACK => 95, :tLBRACE => 96, :tLBRACE_ARG => 97, :tSTAR => 98, :tSTAR2 => 99, :tAMPER => 100, :tAMPER2 => 101, :tTILDE => 102, :tPERCENT => 103, :tDIVIDE => 104, :tPLUS => 105, :tMINUS => 106, :tLT => 107, :tGT => 108, :tPIPE => 109, :tBANG => 110, :tCARET => 111, :tLCURLY => 112, :tRCURLY => 113, :tBACK_REF2 => 114, :tSYMBEG => 115, :tSTRING_BEG => 116, :tXSTRING_BEG => 117, :tREGEXP_BEG => 118, :tWORDS_BEG => 119, :tQWORDS_BEG => 120, :tSTRING_DBEG => 121, :tSTRING_DVAR => 122, :tSTRING_END => 123, :tSTRING => 124, :tSYMBOL => 125, :tNL => 126, :tEH => 127, :tCOLON => 128, :tCOMMA => 129, :tSPACE => 130, :tSEMI => 131, :tLAMBDA => 132, :tLAMBEG => 133, :tDSTAR => 134, :tCHAR => 135, :tSYMBOLS_BEG => 136, :tQSYMBOLS_BEG => 137, :tSTRING_DEND => 138, :tUBANG => 139, :tEQL => 140, :tLOWEST => 141 } racc_nt_base = 142 racc_use_result_var = true Racc_arg = [ racc_action_table, racc_action_check, racc_action_default, racc_action_pointer, racc_goto_table, racc_goto_check, racc_goto_default, racc_goto_pointer, racc_nt_base, racc_reduce_table, racc_token_table, racc_shift_n, racc_reduce_n, racc_use_result_var ] Racc_token_to_s_table = [ "$end", "error", "kCLASS", "kMODULE", "kDEF", "kUNDEF", "kBEGIN", "kRESCUE", "kENSURE", "kEND", "kIF", "kUNLESS", "kTHEN", "kELSIF", "kELSE", "kCASE", "kWHEN", "kWHILE", "kUNTIL", "kFOR", "kBREAK", "kNEXT", "kREDO", "kRETRY", "kIN", "kDO", "kDO_COND", "kDO_BLOCK", "kDO_LAMBDA", "kRETURN", "kYIELD", "kSUPER", "kSELF", "kNIL", "kTRUE", "kFALSE", "kAND", "kOR", "kNOT", "kIF_MOD", "kUNLESS_MOD", "kWHILE_MOD", "kUNTIL_MOD", "kRESCUE_MOD", "kALIAS", "kDEFINED", "klBEGIN", "klEND", "k__LINE__", "k__FILE__", "k__ENCODING__", "tIDENTIFIER", "tFID", "tGVAR", "tIVAR", "tCONSTANT", "tLABEL", "tCVAR", "tNTH_REF", "tBACK_REF", "tSTRING_CONTENT", "tINTEGER", "tFLOAT", "tREGEXP_END", "tUPLUS", "tUMINUS", "tUMINUS_NUM", "tPOW", "tCMP", "tEQ", "tEQQ", "tNEQ", "tGEQ", "tLEQ", "tANDOP", "tOROP", "tMATCH", "tNMATCH", "tDOT", "tDOT2", "tDOT3", "tAREF", "tASET", "tLSHFT", "tRSHFT", "tCOLON2", "tCOLON3", "tOP_ASGN", "tASSOC", "tLPAREN", "tLPAREN2", "tRPAREN", "tLPAREN_ARG", "tLBRACK", "tLBRACK2", "tRBRACK", "tLBRACE", "tLBRACE_ARG", "tSTAR", "tSTAR2", "tAMPER", "tAMPER2", "tTILDE", "tPERCENT", "tDIVIDE", "tPLUS", "tMINUS", "tLT", "tGT", "tPIPE", "tBANG", "tCARET", "tLCURLY", "tRCURLY", "tBACK_REF2", "tSYMBEG", "tSTRING_BEG", "tXSTRING_BEG", "tREGEXP_BEG", "tWORDS_BEG", "tQWORDS_BEG", "tSTRING_DBEG", "tSTRING_DVAR", "tSTRING_END", "tSTRING", "tSYMBOL", "tNL", "tEH", "tCOLON", "tCOMMA", "tSPACE", "tSEMI", "tLAMBDA", "tLAMBEG", "tDSTAR", "tCHAR", "tSYMBOLS_BEG", "tQSYMBOLS_BEG", "tSTRING_DEND", "tUBANG", "tEQL", "tLOWEST", "$start", "program", "top_compstmt", "@1", "top_stmts", "opt_terms", "none", "top_stmt", "terms", "stmt", "bodystmt", "@2", "compstmt", "opt_rescue", "opt_else", "opt_ensure", "stmts", "fitem", "undef_list", "expr_value", "command_asgn", "mlhs", "command_call", "var_lhs", "primary_value", "opt_call_args", "rbracket", "backref", "lhs", "mrhs", "arg_value", "expr", "@3", "opt_nl", "arg", "command", "block_command", "block_call", "dot_or_colon", "operation2", "command_args", "cmd_brace_block", "opt_block_param", "fcall", "@4", "@5", "operation", "call_args", "mlhs_basic", "mlhs_inner", "rparen", "mlhs_head", "mlhs_item", "mlhs_node", "mlhs_post", "user_variable", "keyword_variable", "cname", "cpath", "fname", "op", "reswords", "fsym", "symbol", "dsym", "@6", "primary", "aref_args", "args", "trailer", "assocs", "paren_args", "opt_paren_args", "opt_block_arg", "block_arg", "@7", "literal", "strings", "xstring", "regexp", "words", "qwords", "symbols", "qsymbols", "var_ref", "assoc_list", "brace_block", "method_call", "lambda", "then", "if_tail", "do", "case_body", "for_var", "superclass", "term", "f_arglist", "singleton", "@8", "@9", "@10", "@11", "@12", "@13", "@14", "@15", "@16", "@17", "@18", "@19", "@20", "@21", "@22", "@23", "@24", "@25", "k_begin", "k_if", "k_unless", "k_while", "k_until", "k_case", "k_for", "k_class", "k_module", "k_def", "k_end", "f_marg", "f_norm_arg", "f_margs", "f_marg_list", "block_args_tail", "f_block_kwarg", "f_kwrest", "opt_f_block_arg", "f_block_arg", "opt_block_args_tail", "block_param", "f_arg", "f_block_optarg", "f_rest_arg", "block_param_def", "opt_bv_decl", "bv_decls", "bvar", "f_bad_arg", "f_larglist", "lambda_body", "@26", "f_args", "do_block", "@27", "@28", "operation3", "@29", "@30", "@31", "@32", "@33", "cases", "@34", "exc_list", "exc_var", "numeric", "string", "string1", "string_contents", "xstring_contents", "regexp_contents", "word_list", "word", "string_content", "symbol_list", "qword_list", "qsym_list", "string_dvar", "@35", "@36", "sym", "@37", "args_tail", "f_kwarg", "opt_args_tail", "f_optarg", "f_arg_item", "f_kw", "f_block_kw", "kwrest_mark", "f_opt", "f_block_opt", "restarg_mark", "blkarg_mark", "@38", "assoc" ] Racc_debug_parser = false ##### State transition tables end ##### # reduce 0 omitted def _reduce_1(val, _values, result) self.lexer.lex_state = :expr_beg result end def _reduce_2(val, _values, result) result = new_compstmt val result end def _reduce_3(val, _values, result) result = val[0] result end # reduce 4 omitted # reduce 5 omitted def _reduce_6(val, _values, result) result = self.block_append val[0], val[2] result end # reduce 7 omitted def _reduce_8(val, _values, result) result = val[0] # TODO: remove once I have more confidence this is fixed # result.each_of_type :call_args do |s| # debug20 666, s, result # end result end def _reduce_9(val, _values, result) if (self.in_def || self.in_single > 0) then debug20 1 yyerror "BEGIN in method" end self.env.extend result end def _reduce_10(val, _values, result) result = new_iter s(:preexe), nil, val[3] result end def _reduce_11(val, _values, result) result = new_body val result end def _reduce_12(val, _values, result) result = new_compstmt val result end # reduce 13 omitted # reduce 14 omitted def _reduce_15(val, _values, result) result = self.block_append val[0], val[2] result end def _reduce_16(val, _values, result) result = val[1] debug20 2, val, result result end def _reduce_17(val, _values, result) lexer.lex_state = :expr_fname result = self.lexer.lineno result end def _reduce_18(val, _values, result) result = s(:alias, val[1], val[3]).line(val[2]) result end def _reduce_19(val, _values, result) result = s(:valias, val[1].to_sym, val[2].to_sym) result end def _reduce_20(val, _values, result) result = s(:valias, val[1].to_sym, :"$#{val[2]}") result end def _reduce_21(val, _values, result) yyerror "can't make alias for the number variables" result end def _reduce_22(val, _values, result) result = val[1] result end def _reduce_23(val, _values, result) result = new_if val[2], val[0], nil result end def _reduce_24(val, _values, result) result = new_if val[2], nil, val[0] result end def _reduce_25(val, _values, result) result = new_while val[0], val[2], true result end def _reduce_26(val, _values, result) result = new_until val[0], val[2], true result end def _reduce_27(val, _values, result) result = s(:rescue, val[0], new_resbody(s(:array), val[2])) result end def _reduce_28(val, _values, result) if (self.in_def || self.in_single > 0) then debug20 3 yyerror "END in method; use at_exit" end result = new_iter s(:postexe), nil, val[2] result end # reduce 29 omitted def _reduce_30(val, _values, result) result = new_masgn val[0], val[2], :wrap result end def _reduce_31(val, _values, result) result = new_op_asgn val result end def _reduce_32(val, _values, result) result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5]) result end def _reduce_33(val, _values, result) result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym) result end def _reduce_34(val, _values, result) result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym) result end def _reduce_35(val, _values, result) result = s(:op_asgn, val[0], val[4], val[2], val[3]) debug20 4, val, result result end def _reduce_36(val, _values, result) result = s(:op_asgn, val[0], val[4], val[2], val[3]) debug20 5, val, result result end def _reduce_37(val, _values, result) self.backref_assign_error val[0] result end def _reduce_38(val, _values, result) result = self.node_assign val[0], s(:svalue, val[2]) result end def _reduce_39(val, _values, result) result = new_masgn val[0], val[2], :wrap result end def _reduce_40(val, _values, result) result = new_masgn val[0], val[2] result end # reduce 41 omitted def _reduce_42(val, _values, result) result = self.node_assign val[0], val[2] result end def _reduce_43(val, _values, result) result = self.node_assign val[0], val[2] result end # reduce 44 omitted def _reduce_45(val, _values, result) result = logop(:and, val[0], val[2]) result end def _reduce_46(val, _values, result) result = logop(:or, val[0], val[2]) result end def _reduce_47(val, _values, result) result = s(:call, val[2], :"!") result end def _reduce_48(val, _values, result) result = s(:call, val[1], :"!") result end # reduce 49 omitted def _reduce_50(val, _values, result) result = value_expr(val[0]) result end # reduce 51 omitted # reduce 52 omitted # reduce 53 omitted def _reduce_54(val, _values, result) result = new_call val[0], val[2].to_sym, val[3] result end def _reduce_55(val, _values, result) self.env.extend(:dynamic) result = self.lexer.lineno result end def _reduce_56(val, _values, result) result = self.env.dynamic.keys result end def _reduce_57(val, _values, result) result = new_iter nil, val[2], val[4] result.line = val[1] self.env.unextend result end def _reduce_58(val, _values, result) result = new_call nil, val[0].to_sym result end def _reduce_59(val, _values, result) result = val[0].concat val[1][1..-1] # REFACTOR pattern result end def _reduce_60(val, _values, result) result = val[0].concat val[1][1..-1] if val[2] then block_dup_check result, val[2] result, operation = val[2], result result.insert 1, operation end result end def _reduce_61(val, _values, result) result = new_call val[0], val[2].to_sym, val[3] result end def _reduce_62(val, _values, result) recv, _, msg, args, block = val call = new_call recv, msg.to_sym, args block_dup_check call, block block.insert 1, call result = block result end def _reduce_63(val, _values, result) result = new_call val[0], val[2].to_sym, val[3] result end def _reduce_64(val, _values, result) recv, _, msg, args, block = val call = new_call recv, msg.to_sym, args block_dup_check call, block block.insert 1, call result = block result end def _reduce_65(val, _values, result) result = new_super val[1] result end def _reduce_66(val, _values, result) result = new_yield val[1] result end def _reduce_67(val, _values, result) line = val[0].last result = s(:return, ret_args(val[1])).line(line) result end def _reduce_68(val, _values, result) line = val[0].last result = s(:break, ret_args(val[1])).line(line) result end def _reduce_69(val, _values, result) line = val[0].last result = s(:next, ret_args(val[1])).line(line) result end # reduce 70 omitted def _reduce_71(val, _values, result) result = val[1] result end # reduce 72 omitted def _reduce_73(val, _values, result) result = s(:masgn, s(:array, val[1])) result end def _reduce_74(val, _values, result) result = s(:masgn, val[0]) result end def _reduce_75(val, _values, result) result = s(:masgn, val[0] << val[1].compact) result end def _reduce_76(val, _values, result) result = s(:masgn, val[0] << s(:splat, val[2])) result end def _reduce_77(val, _values, result) ary1, _, splat, _, ary2 = val result = list_append ary1, s(:splat, splat) result.concat ary2[1..-1] result = s(:masgn, result) result end def _reduce_78(val, _values, result) result = s(:masgn, val[0] << s(:splat)) result end def _reduce_79(val, _values, result) ary = list_append val[0], s(:splat) ary.concat val[3][1..-1] result = s(:masgn, ary) result end def _reduce_80(val, _values, result) result = s(:masgn, s(:array, s(:splat, val[1]))) result end def _reduce_81(val, _values, result) ary = s(:array, s(:splat, val[1])) ary.concat val[3][1..-1] result = s(:masgn, ary) result end def _reduce_82(val, _values, result) result = s(:masgn, s(:array, s(:splat))) result end def _reduce_83(val, _values, result) result = s(:masgn, s(:array, s(:splat), *val[2][1..-1])) result end # reduce 84 omitted def _reduce_85(val, _values, result) result = val[1] result end def _reduce_86(val, _values, result) result = s(:array, val[0]) result end def _reduce_87(val, _values, result) result = val[0] << val[1].compact result end def _reduce_88(val, _values, result) result = s(:array, val[0]) result end def _reduce_89(val, _values, result) result = list_append val[0], val[2] result end def _reduce_90(val, _values, result) result = self.assignable val[0] result end def _reduce_91(val, _values, result) result = self.assignable val[0] result end def _reduce_92(val, _values, result) result = self.aryset val[0], val[2] result end def _reduce_93(val, _values, result) result = s(:attrasgn, val[0], :"#{val[2]}=") result end def _reduce_94(val, _values, result) result = s(:attrasgn, val[0], :"#{val[2]}=") result end def _reduce_95(val, _values, result) result = s(:attrasgn, val[0], :"#{val[2]}=") result end def _reduce_96(val, _values, result) if (self.in_def || self.in_single > 0) then debug20 7 yyerror "dynamic constant assignment" end result = s(:const, s(:colon2, val[0], val[2].to_sym), nil) result end def _reduce_97(val, _values, result) if (self.in_def || self.in_single > 0) then debug20 8 yyerror "dynamic constant assignment" end result = s(:const, nil, s(:colon3, val[1].to_sym)) result end def _reduce_98(val, _values, result) self.backref_assign_error val[0] result end def _reduce_99(val, _values, result) result = self.assignable val[0] result end def _reduce_100(val, _values, result) result = self.assignable val[0] debug20 9, val, result result end def _reduce_101(val, _values, result) result = self.aryset val[0], val[2] result end def _reduce_102(val, _values, result) result = s(:attrasgn, val[0], :"#{val[2]}=") result end def _reduce_103(val, _values, result) result = s(:attrasgn, val[0], :"#{val[2]}=") result end def _reduce_104(val, _values, result) result = s(:attrasgn, val[0], :"#{val[2]}=") result end def _reduce_105(val, _values, result) if (self.in_def || self.in_single > 0) then debug20 10 yyerror "dynamic constant assignment" end result = s(:const, s(:colon2, val[0], val[2].to_sym)) result end def _reduce_106(val, _values, result) if (self.in_def || self.in_single > 0) then debug20 11 yyerror "dynamic constant assignment" end result = s(:const, s(:colon3, val[1].to_sym)) result end def _reduce_107(val, _values, result) self.backref_assign_error val[0] result end def _reduce_108(val, _values, result) yyerror "class/module name must be CONSTANT" result end # reduce 109 omitted def _reduce_110(val, _values, result) result = s(:colon3, val[1].to_sym) result end def _reduce_111(val, _values, result) result = val[0].to_sym result end def _reduce_112(val, _values, result) result = s(:colon2, val[0], val[2].to_sym) result end # reduce 113 omitted # reduce 114 omitted # reduce 115 omitted def _reduce_116(val, _values, result) lexer.lex_state = :expr_end result = val[0] result end def _reduce_117(val, _values, result) lexer.lex_state = :expr_end result = val[0] result end # reduce 118 omitted # reduce 119 omitted def _reduce_120(val, _values, result) result = s(:lit, val[0].to_sym) result end # reduce 121 omitted def _reduce_122(val, _values, result) result = new_undef val[0] result end def _reduce_123(val, _values, result) lexer.lex_state = :expr_fname result end def _reduce_124(val, _values, result) result = new_undef val[0], val[3] result end # reduce 125 omitted # reduce 126 omitted # reduce 127 omitted # reduce 128 omitted # reduce 129 omitted # reduce 130 omitted # reduce 131 omitted # reduce 132 omitted # reduce 133 omitted # reduce 134 omitted # reduce 135 omitted # reduce 136 omitted # reduce 137 omitted # reduce 138 omitted # reduce 139 omitted # reduce 140 omitted # reduce 141 omitted # reduce 142 omitted # reduce 143 omitted # reduce 144 omitted # reduce 145 omitted # reduce 146 omitted # reduce 147 omitted # reduce 148 omitted # reduce 149 omitted # reduce 150 omitted # reduce 151 omitted # reduce 152 omitted # reduce 153 omitted # reduce 154 omitted # reduce 155 omitted # reduce 156 omitted # reduce 157 omitted # reduce 158 omitted # reduce 159 omitted # reduce 160 omitted # reduce 161 omitted # reduce 162 omitted # reduce 163 omitted # reduce 164 omitted # reduce 165 omitted # reduce 166 omitted # reduce 167 omitted # reduce 168 omitted # reduce 169 omitted # reduce 170 omitted # reduce 171 omitted # reduce 172 omitted # reduce 173 omitted # reduce 174 omitted # reduce 175 omitted # reduce 176 omitted # reduce 177 omitted # reduce 178 omitted # reduce 179 omitted # reduce 180 omitted # reduce 181 omitted # reduce 182 omitted # reduce 183 omitted # reduce 184 omitted # reduce 185 omitted # reduce 186 omitted # reduce 187 omitted # reduce 188 omitted # reduce 189 omitted # reduce 190 omitted # reduce 191 omitted # reduce 192 omitted # reduce 193 omitted # reduce 194 omitted # reduce 195 omitted # reduce 196 omitted def _reduce_197(val, _values, result) result = self.node_assign val[0], val[2] result end def _reduce_198(val, _values, result) result = self.node_assign val[0], s(:rescue, val[2], new_resbody(s(:array), val[4])) result end def _reduce_199(val, _values, result) result = new_op_asgn val result end def _reduce_200(val, _values, result) result = new_op_asgn val result = s(:rescue, result, new_resbody(s(:array), val[4])) result end def _reduce_201(val, _values, result) val[2][0] = :arglist if val[2] result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5]) result end def _reduce_202(val, _values, result) result = s(:op_asgn2, val[0], :"#{val[2]}=", val[3].to_sym, val[4]) result end def _reduce_203(val, _values, result) result = s(:op_asgn2, val[0], :"#{val[2]}=", val[3].to_sym, val[4]) result end def _reduce_204(val, _values, result) result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym) result end def _reduce_205(val, _values, result) yyerror "constant re-assignment" result end def _reduce_206(val, _values, result) yyerror "constant re-assignment" result end def _reduce_207(val, _values, result) self.backref_assign_error val[0] result end def _reduce_208(val, _values, result) v1, v2 = val[0], val[2] if v1.node_type == :lit and v2.node_type == :lit and Fixnum === v1.last and Fixnum === v2.last then result = s(:lit, (v1.last)..(v2.last)) else result = s(:dot2, v1, v2) end result end def _reduce_209(val, _values, result) v1, v2 = val[0], val[2] if v1.node_type == :lit and v2.node_type == :lit and Fixnum === v1.last and Fixnum === v2.last then result = s(:lit, (v1.last)...(v2.last)) else result = s(:dot3, v1, v2) end result end def _reduce_210(val, _values, result) result = new_call val[0], :+, argl(val[2]) result end def _reduce_211(val, _values, result) result = new_call val[0], :-, argl(val[2]) result end def _reduce_212(val, _values, result) result = new_call val[0], :*, argl(val[2]) result end def _reduce_213(val, _values, result) result = new_call val[0], :"/", argl(val[2]) result end def _reduce_214(val, _values, result) result = new_call val[0], :"%", argl(val[2]) result end def _reduce_215(val, _values, result) result = new_call val[0], :**, argl(val[2]) result end def _reduce_216(val, _values, result) result = new_call(new_call(s(:lit, val[1]), :"**", argl(val[3])), :"-@") result end def _reduce_217(val, _values, result) result = new_call(new_call(s(:lit, val[1]), :"**", argl(val[3])), :"-@") debug20 12, val, result result end def _reduce_218(val, _values, result) result = new_call val[1], :"+@" result end def _reduce_219(val, _values, result) result = new_call val[1], :"-@" result end def _reduce_220(val, _values, result) result = new_call val[0], :"|", argl(val[2]) result end def _reduce_221(val, _values, result) result = new_call val[0], :"^", argl(val[2]) result end def _reduce_222(val, _values, result) result = new_call val[0], :"&", argl(val[2]) result end def _reduce_223(val, _values, result) result = new_call val[0], :"<=>", argl(val[2]) result end def _reduce_224(val, _values, result) result = new_call val[0], :">", argl(val[2]) result end def _reduce_225(val, _values, result) result = new_call val[0], :">=", argl(val[2]) result end def _reduce_226(val, _values, result) result = new_call val[0], :"<", argl(val[2]) result end def _reduce_227(val, _values, result) result = new_call val[0], :"<=", argl(val[2]) result end def _reduce_228(val, _values, result) result = new_call val[0], :"==", argl(val[2]) result end def _reduce_229(val, _values, result) result = new_call val[0], :"===", argl(val[2]) result end def _reduce_230(val, _values, result) result = new_call val[0], :"!=", argl(val[2]) result end def _reduce_231(val, _values, result) result = self.get_match_node val[0], val[2] result end def _reduce_232(val, _values, result) result = s(:not, self.get_match_node(val[0], val[2])) result end def _reduce_233(val, _values, result) result = new_call val[1], :"!" result end def _reduce_234(val, _values, result) result = new_call value_expr(val[1]), :"~" result end def _reduce_235(val, _values, result) val[0] = value_expr val[0] val[2] = value_expr val[2] result = new_call val[0], :"\<\<", argl(val[2]) result end def _reduce_236(val, _values, result) val[0] = value_expr val[0] val[2] = value_expr val[2] result = new_call val[0], :">>", argl(val[2]) result end def _reduce_237(val, _values, result) result = logop(:and, val[0], val[2]) result end def _reduce_238(val, _values, result) result = logop(:or, val[0], val[2]) result end def _reduce_239(val, _values, result) result = s(:defined, val[2]) result end def _reduce_240(val, _values, result) lexer.tern.pop result = s(:if, val[0], val[2], val[5]) result end # reduce 241 omitted def _reduce_242(val, _values, result) result = value_expr(val[0]) result end # reduce 243 omitted def _reduce_244(val, _values, result) result = args [val[0]] result end def _reduce_245(val, _values, result) result = args [val[0], array_to_hash(val[2])] result end def _reduce_246(val, _values, result) result = args [array_to_hash(val[0])] result end def _reduce_247(val, _values, result) result = val[1] result end # reduce 248 omitted # reduce 249 omitted def _reduce_250(val, _values, result) result = val[0] result end def _reduce_251(val, _values, result) result = val[0] result end def _reduce_252(val, _values, result) result = args val result end def _reduce_253(val, _values, result) result = args [val[0], array_to_hash(val[2])] result end def _reduce_254(val, _values, result) result = args [array_to_hash(val[0])] result end def _reduce_255(val, _values, result) warning "parenthesize argument(s) for future version" result = call_args val result end def _reduce_256(val, _values, result) result = call_args val result = self.arg_blk_pass val[0], val[1] result end def _reduce_257(val, _values, result) result = call_args [array_to_hash(val[0])] result = self.arg_blk_pass result, val[1] result end def _reduce_258(val, _values, result) result = call_args [val[0], array_to_hash(val[2])] result = self.arg_blk_pass result, val[3] result end def _reduce_259(val, _values, result) result = call_args val result end def _reduce_260(val, _values, result) result = lexer.cmdarg.stack.dup # TODO: smell? lexer.cmdarg.push true result end def _reduce_261(val, _values, result) lexer.cmdarg.stack.replace val[0] result = val[1] result end def _reduce_262(val, _values, result) result = s(:block_pass, val[1]) result end def _reduce_263(val, _values, result) result = val[1] result end # reduce 264 omitted def _reduce_265(val, _values, result) result = s(:array, val[0]) result end def _reduce_266(val, _values, result) result = s(:array, s(:splat, val[1])) result end def _reduce_267(val, _values, result) result = self.list_append val[0], val[2] result end def _reduce_268(val, _values, result) result = self.list_append val[0], s(:splat, val[3]) result end def _reduce_269(val, _values, result) result = val[0] << val[2] result end def _reduce_270(val, _values, result) result = self.arg_concat val[0], val[3] result end def _reduce_271(val, _values, result) result = s(:splat, val[1]) result end # reduce 272 omitted # reduce 273 omitted # reduce 274 omitted # reduce 275 omitted # reduce 276 omitted # reduce 277 omitted # reduce 278 omitted # reduce 279 omitted # reduce 280 omitted # reduce 281 omitted def _reduce_282(val, _values, result) result = new_call nil, val[0].to_sym result end def _reduce_283(val, _values, result) result = self.lexer.lineno result end def _reduce_284(val, _values, result) unless val[2] then result = s(:nil) else result = s(:begin, val[2]) end result.line = val[1] result end def _reduce_285(val, _values, result) debug20 13, val, result result end def _reduce_286(val, _values, result) lexer.lex_state = :expr_endarg result end def _reduce_287(val, _values, result) warning "(...) interpreted as grouped expression" result = val[1] result end def _reduce_288(val, _values, result) result = val[1] || s(:nil) result.paren = true result end def _reduce_289(val, _values, result) result = s(:colon2, val[0], val[2].to_sym) result end def _reduce_290(val, _values, result) result = s(:colon3, val[1].to_sym) result end def _reduce_291(val, _values, result) result = val[1] || s(:array) result[0] = :array # aref_args is :args result end def _reduce_292(val, _values, result) result = s(:hash, *val[1].values) # TODO: array_to_hash? result end def _reduce_293(val, _values, result) result = s(:return) result end def _reduce_294(val, _values, result) result = new_yield val[2] result end def _reduce_295(val, _values, result) result = new_yield result end def _reduce_296(val, _values, result) result = new_yield result end def _reduce_297(val, _values, result) result = s(:defined, val[3]) result end def _reduce_298(val, _values, result) result = s(:call, val[2], :"!") result end def _reduce_299(val, _values, result) debug20 14, val, result result end def _reduce_300(val, _values, result) oper, iter = val[0], val[1] call = oper # FIX iter.insert 1, call result = iter call.line = iter.line result end # reduce 301 omitted def _reduce_302(val, _values, result) call, iter = val[0], val[1] block_dup_check call, iter iter.insert 1, call # FIX result = iter result end def _reduce_303(val, _values, result) result = val[1] # TODO: fix lineno result end def _reduce_304(val, _values, result) result = new_if val[1], val[3], val[4] result end def _reduce_305(val, _values, result) result = new_if val[1], val[4], val[3] result end def _reduce_306(val, _values, result) lexer.cond.push true result end def _reduce_307(val, _values, result) lexer.cond.pop result end def _reduce_308(val, _values, result) result = new_while val[5], val[2], true result end def _reduce_309(val, _values, result) lexer.cond.push true result end def _reduce_310(val, _values, result) lexer.cond.pop result end def _reduce_311(val, _values, result) result = new_until val[5], val[2], true result end def _reduce_312(val, _values, result) result = new_case val[1], val[3] result end def _reduce_313(val, _values, result) result = new_case nil, val[2] result end def _reduce_314(val, _values, result) lexer.cond.push true result end def _reduce_315(val, _values, result) lexer.cond.pop result end def _reduce_316(val, _values, result) result = new_for val[4], val[1], val[7] result end def _reduce_317(val, _values, result) result = self.lexer.lineno result end def _reduce_318(val, _values, result) self.comments.push self.lexer.comments if (self.in_def || self.in_single > 0) then yyerror "class definition in method body" end self.env.extend result end def _reduce_319(val, _values, result) result = new_class val self.env.unextend self.lexer.comments # we don't care about comments in the body result end def _reduce_320(val, _values, result) result = self.lexer.lineno result end def _reduce_321(val, _values, result) result = self.in_def self.in_def = false result end def _reduce_322(val, _values, result) result = self.in_single self.in_single = 0 self.env.extend result end def _reduce_323(val, _values, result) result = new_sclass val self.env.unextend self.lexer.comments # we don't care about comments in the body result end def _reduce_324(val, _values, result) result = self.lexer.lineno result end def _reduce_325(val, _values, result) self.comments.push self.lexer.comments yyerror "module definition in method body" if self.in_def or self.in_single > 0 self.env.extend result end def _reduce_326(val, _values, result) result = new_module val self.env.unextend self.lexer.comments # we don't care about comments in the body result end def _reduce_327(val, _values, result) result = [lexer.lineno, self.in_def] self.comments.push self.lexer.comments self.in_def = true self.env.extend result end def _reduce_328(val, _values, result) line, in_def = val[2] result = new_defn val result[2].line line self.env.unextend self.in_def = in_def self.lexer.comments # we don't care about comments in the body result end def _reduce_329(val, _values, result) self.comments.push self.lexer.comments lexer.lex_state = :expr_fname result end def _reduce_330(val, _values, result) self.in_single += 1 self.env.extend lexer.lex_state = :expr_end # force for args result = lexer.lineno result end def _reduce_331(val, _values, result) result = new_defs val result[3].line val[5] self.env.unextend self.in_single -= 1 self.lexer.comments # we don't care about comments in the body result end def _reduce_332(val, _values, result) result = s(:break) result end def _reduce_333(val, _values, result) result = s(:next) result end def _reduce_334(val, _values, result) result = s(:redo) result end def _reduce_335(val, _values, result) result = s(:retry) result end def _reduce_336(val, _values, result) result = value_expr(val[0]) result end # reduce 337 omitted # reduce 338 omitted # reduce 339 omitted # reduce 340 omitted # reduce 341 omitted # reduce 342 omitted # reduce 343 omitted # reduce 344 omitted # reduce 345 omitted # reduce 346 omitted # reduce 347 omitted # reduce 348 omitted # reduce 349 omitted # reduce 350 omitted # reduce 351 omitted # reduce 352 omitted # reduce 353 omitted def _reduce_354(val, _values, result) result = s(:if, val[1], val[3], val[4]) result end # reduce 355 omitted def _reduce_356(val, _values, result) result = val[1] result end # reduce 357 omitted def _reduce_358(val, _values, result) val[0].delete_at 1 if val[0][1].nil? # HACK result end # reduce 359 omitted def _reduce_360(val, _values, result) result = val[1] result end def _reduce_361(val, _values, result) result = s(:array, val[0]) result end def _reduce_362(val, _values, result) result = list_append val[0], val[2] result end def _reduce_363(val, _values, result) args, = val result = block_var args result end def _reduce_364(val, _values, result) args, _, _, splat = val result = block_var args, "*#{splat}".to_sym result end def _reduce_365(val, _values, result) args, _, _, splat, _, args2 = val result = block_var args, "*#{splat}".to_sym, args2 result end def _reduce_366(val, _values, result) args, _, _ = val result = block_var args, :* result end def _reduce_367(val, _values, result) args, _, _, _, args2 = val result = block_var args, :*, args2 debug20 16, val, result result end def _reduce_368(val, _values, result) _, splat = val result = block_var :"*#{splat}" result end def _reduce_369(val, _values, result) _, splat, _, args = val result = block_var :"*#{splat}", args debug20 17, val, result result end def _reduce_370(val, _values, result) result = block_var :* debug20 18, val, result result end def _reduce_371(val, _values, result) _, _, args = val result = block_var :*, args result end def _reduce_372(val, _values, result) result = call_args val result end def _reduce_373(val, _values, result) result = call_args val result end def _reduce_374(val, _values, result) result = call_args val result end def _reduce_375(val, _values, result) result = call_args val result end def _reduce_376(val, _values, result) result = args val result end # reduce 377 omitted def _reduce_378(val, _values, result) result = args val result end def _reduce_379(val, _values, result) result = args val result end def _reduce_380(val, _values, result) result = args val result end def _reduce_381(val, _values, result) result = args val result end def _reduce_382(val, _values, result) result = args val result end def _reduce_383(val, _values, result) result = args val result end def _reduce_384(val, _values, result) result = args val result end def _reduce_385(val, _values, result) result = args val result end def _reduce_386(val, _values, result) result = args val result end def _reduce_387(val, _values, result) result = args val result end def _reduce_388(val, _values, result) result = args val result end def _reduce_389(val, _values, result) result = args val result end def _reduce_390(val, _values, result) result = args val result end def _reduce_391(val, _values, result) result = args val result end def _reduce_392(val, _values, result) result = args val result end # reduce 393 omitted # reduce 394 omitted def _reduce_395(val, _values, result) result = args val result = 0 if result == s(:args) result end def _reduce_396(val, _values, result) result = 0 self.lexer.command_start = true result end def _reduce_397(val, _values, result) result = args val result end # reduce 398 omitted def _reduce_399(val, _values, result) result = args val result end def _reduce_400(val, _values, result) result = args val result end def _reduce_401(val, _values, result) result = args val result end def _reduce_402(val, _values, result) result = s(:shadow, val[0].to_sym) result end # reduce 403 omitted def _reduce_404(val, _values, result) # TODO: dyna_push ? hrm result = lexer.lpar_beg lexer.paren_nest += 1 lexer.lpar_beg = lexer.paren_nest result end def _reduce_405(val, _values, result) lpar, args, body = val lexer.lpar_beg = lpar args = 0 if args == s(:args) call = new_call nil, :lambda result = new_iter call, args, body result end def _reduce_406(val, _values, result) result = args val result end def _reduce_407(val, _values, result) result = val[0] result end def _reduce_408(val, _values, result) result = val[1] result end def _reduce_409(val, _values, result) result = val[1] result end def _reduce_410(val, _values, result) self.env.extend :dynamic result = self.lexer.lineno result end def _reduce_411(val, _values, result) result = self.env.dynamic.keys result end def _reduce_412(val, _values, result) args = val[2] body = val[4] result = new_iter nil, args, body result.line = val[1] self.env.unextend result end def _reduce_413(val, _values, result) # TODO: # if (nd_type($1) == NODE_YIELD) { # compile_error(PARSER_ARG "block given to yield"); syntax_error "Both block arg and actual block given." if val[0].block_pass? result = val[1] result.insert 1, val[0] result end def _reduce_414(val, _values, result) result = new_call val[0], val[2].to_sym, val[3] result end def _reduce_415(val, _values, result) debug20 21, val, result result end def _reduce_416(val, _values, result) debug20 22, val, result result end def _reduce_417(val, _values, result) result = self.lexer.lineno result end def _reduce_418(val, _values, result) args = self.call_args val[2..-1] result = val[0].concat args[1..-1] result end def _reduce_419(val, _values, result) result = new_call val[0], val[2].to_sym, val[3] result end def _reduce_420(val, _values, result) result = new_call val[0], val[2].to_sym, val[3] result end def _reduce_421(val, _values, result) result = new_call val[0], val[2].to_sym result end def _reduce_422(val, _values, result) result = new_call val[0], :call, val[2] result end def _reduce_423(val, _values, result) result = new_call val[0], :call, val[2] result end def _reduce_424(val, _values, result) result = new_super val[1] result end def _reduce_425(val, _values, result) result = s(:zsuper) result end def _reduce_426(val, _values, result) result = new_aref val result end def _reduce_427(val, _values, result) self.env.extend :dynamic result = self.lexer.lineno result end def _reduce_428(val, _values, result) result = self.env.dynamic.keys result end def _reduce_429(val, _values, result) _, line, args, _, body, _ = val result = new_iter nil, args, body result.line = line self.env.unextend result end def _reduce_430(val, _values, result) self.env.extend :dynamic result = self.lexer.lineno result end def _reduce_431(val, _values, result) result = self.env.dynamic.keys result end def _reduce_432(val, _values, result) _, line, args, _, body, _ = val result = new_iter nil, args, body result.line = line self.env.unextend result end def _reduce_433(val, _values, result) result = self.lexer.lineno result end def _reduce_434(val, _values, result) result = new_when(val[2], val[4]) result.line = val[1] result << val[5] if val[5] result end # reduce 435 omitted # reduce 436 omitted def _reduce_437(val, _values, result) _, klasses, var, _, body, rest = val klasses ||= s(:array) klasses << node_assign(var, s(:gvar, :"$!")) if var result = new_resbody(klasses, body) result << rest if rest # UGH, rewritten above result end def _reduce_438(val, _values, result) result = nil result end def _reduce_439(val, _values, result) result = s(:array, val[0]) result end # reduce 440 omitted # reduce 441 omitted def _reduce_442(val, _values, result) result = val[1] result end # reduce 443 omitted def _reduce_444(val, _values, result) _, body = val result = body || s(:nil) result end # reduce 445 omitted def _reduce_446(val, _values, result) result = s(:lit, val[0]) result end def _reduce_447(val, _values, result) result = s(:lit, val[0]) result end # reduce 448 omitted def _reduce_449(val, _values, result) val[0] = s(:dstr, val[0].value) if val[0][0] == :evstr result = val[0] result end def _reduce_450(val, _values, result) debug20 23, val, result result end # reduce 451 omitted def _reduce_452(val, _values, result) result = self.literal_concat val[0], val[1] result end def _reduce_453(val, _values, result) result = val[1] result end def _reduce_454(val, _values, result) result = s(:str, val[0]) result end def _reduce_455(val, _values, result) result = new_xstring val[1] result end def _reduce_456(val, _values, result) result = new_regexp val result end def _reduce_457(val, _values, result) result = s(:array) result end def _reduce_458(val, _values, result) result = val[1] result end def _reduce_459(val, _values, result) result = s(:array) result end def _reduce_460(val, _values, result) word = val[1][0] == :evstr ? s(:dstr, "", val[1]) : val[1] result = val[0].dup << word result end # reduce 461 omitted def _reduce_462(val, _values, result) result = self.literal_concat val[0], val[1] result end def _reduce_463(val, _values, result) result = s(:array) result end def _reduce_464(val, _values, result) result = val[1] result end def _reduce_465(val, _values, result) result = s(:array) result end def _reduce_466(val, _values, result) list, sym, _ = val case sym[0] when :dstr then sym[0] = :dsym when :str then sym = s(:lit, sym.last.to_sym) else debug20 24 sym = s(:dsym, "", result) end result = list.dup << sym result end def _reduce_467(val, _values, result) result = s(:array) result end def _reduce_468(val, _values, result) result = val[1] result end def _reduce_469(val, _values, result) result = s(:array) result end def _reduce_470(val, _values, result) result = val[1] result end def _reduce_471(val, _values, result) result = s(:array) result end def _reduce_472(val, _values, result) result = val[0].dup << s(:str, val[1]) result end def _reduce_473(val, _values, result) result = s(:array) result end def _reduce_474(val, _values, result) result = val[0].dup << s(:lit, val[1].to_sym) result end def _reduce_475(val, _values, result) result = s(:str, "") result end def _reduce_476(val, _values, result) result = literal_concat(val[0], val[1]) result end def _reduce_477(val, _values, result) result = nil result end def _reduce_478(val, _values, result) result = literal_concat(val[0], val[1]) result end def _reduce_479(val, _values, result) result = nil result end def _reduce_480(val, _values, result) result = literal_concat(val[0], val[1]) result end def _reduce_481(val, _values, result) result = s(:str, val[0]) result end def _reduce_482(val, _values, result) result = lexer.lex_strterm lexer.lex_strterm = nil lexer.lex_state = :expr_beg result end def _reduce_483(val, _values, result) lexer.lex_strterm = val[1] result = s(:evstr, val[2]) result end def _reduce_484(val, _values, result) result = [lexer.lex_strterm, lexer.brace_nest, lexer.string_nest] lexer.lex_strterm = nil lexer.brace_nest = 0 lexer.string_nest = 0 lexer.cond.push false lexer.cmdarg.push false lexer.lex_state = :expr_beg result end def _reduce_485(val, _values, result) # TODO: tRCURLY -> tSTRING_DEND _, memo, stmt, _ = val lex_strterm, brace_nest, string_nest = memo lexer.lex_strterm = lex_strterm lexer.brace_nest = brace_nest lexer.string_nest = string_nest lexer.cond.lexpop lexer.cmdarg.lexpop case stmt when Sexp then case stmt[0] when :str, :dstr, :evstr then result = stmt else result = s(:evstr, stmt) end when nil then result = s(:evstr) else debug20 25 raise "unknown string body: #{stmt.inspect}" end result end def _reduce_486(val, _values, result) result = s(:gvar, val[0].to_sym) result end def _reduce_487(val, _values, result) result = s(:ivar, val[0].to_sym) result end def _reduce_488(val, _values, result) result = s(:cvar, val[0].to_sym) result end # reduce 489 omitted def _reduce_490(val, _values, result) lexer.lex_state = :expr_end result = val[1].to_sym result end def _reduce_491(val, _values, result) result = val[0].to_sym result end # reduce 492 omitted # reduce 493 omitted # reduce 494 omitted # reduce 495 omitted def _reduce_496(val, _values, result) lexer.lex_state = :expr_end result = val[1] result ||= s(:str, "") case result[0] when :dstr then result[0] = :dsym when :str then result = s(:lit, result.last.to_sym) when :evstr then result = s(:dsym, "", result) else debug20 26, val, result end result end # reduce 497 omitted # reduce 498 omitted def _reduce_499(val, _values, result) result = -val[1] # TODO: pt_testcase result end def _reduce_500(val, _values, result) result = -val[1] # TODO: pt_testcase result end # reduce 501 omitted # reduce 502 omitted # reduce 503 omitted # reduce 504 omitted # reduce 505 omitted def _reduce_506(val, _values, result) result = s(:nil) result end def _reduce_507(val, _values, result) result = s(:self) result end def _reduce_508(val, _values, result) result = s(:true) result end def _reduce_509(val, _values, result) result = s(:false) result end def _reduce_510(val, _values, result) result = s(:str, self.file) result end def _reduce_511(val, _values, result) result = s(:lit, lexer.src.current_line) result end def _reduce_512(val, _values, result) result = if defined? Encoding then s(:colon2, s(:const, :Encoding), :UTF_8) else s(:str, "Unsupported!") end result end def _reduce_513(val, _values, result) var = val[0] result = Sexp === var ? var : self.gettable(var) result end def _reduce_514(val, _values, result) var = val[0] result = Sexp === var ? var : self.gettable(var) result end def _reduce_515(val, _values, result) result = self.assignable val[0] result end def _reduce_516(val, _values, result) result = self.assignable val[0] debug20 29, val, result result end def _reduce_517(val, _values, result) result = s(:nth_ref, val[0]) result end def _reduce_518(val, _values, result) result = s(:back_ref, val[0]) result end def _reduce_519(val, _values, result) result = nil result end def _reduce_520(val, _values, result) lexer.lex_state = :expr_beg result end def _reduce_521(val, _values, result) result = val[2] result end def _reduce_522(val, _values, result) yyerrok result = nil debug20 30, val, result result end def _reduce_523(val, _values, result) result = val[1] lexer.lex_state = :expr_beg self.lexer.command_start = true result end def _reduce_524(val, _values, result) self.lexer.lex_state = :expr_beg result = val[0] result end def _reduce_525(val, _values, result) result = args val result end def _reduce_526(val, _values, result) result = args val result end def _reduce_527(val, _values, result) result = args val result end # reduce 528 omitted def _reduce_529(val, _values, result) result = val[1] result end def _reduce_530(val, _values, result) result = nil result end def _reduce_531(val, _values, result) result = args val result end def _reduce_532(val, _values, result) result = args val result end def _reduce_533(val, _values, result) result = args val result end def _reduce_534(val, _values, result) result = args val result end def _reduce_535(val, _values, result) result = args val result end def _reduce_536(val, _values, result) result = args val result end def _reduce_537(val, _values, result) result = args val result end def _reduce_538(val, _values, result) result = args val result end def _reduce_539(val, _values, result) result = args val result end def _reduce_540(val, _values, result) result = args val result end def _reduce_541(val, _values, result) result = args val result end def _reduce_542(val, _values, result) result = args val result end def _reduce_543(val, _values, result) result = args val result end def _reduce_544(val, _values, result) result = args val result end def _reduce_545(val, _values, result) result = args val result end def _reduce_546(val, _values, result) yyerror "formal argument cannot be a constant" result end def _reduce_547(val, _values, result) yyerror "formal argument cannot be an instance variable" result end def _reduce_548(val, _values, result) yyerror "formal argument cannot be a global variable" result end def _reduce_549(val, _values, result) yyerror "formal argument cannot be a class variable" result end # reduce 550 omitted def _reduce_551(val, _values, result) identifier = val[0].to_sym self.env[identifier] = :lvar result = identifier result end # reduce 552 omitted def _reduce_553(val, _values, result) result = val[1] result end def _reduce_554(val, _values, result) case val[0] when Symbol then result = s(:args) result << val[0] when Sexp then result = val[0] else debug20 32 raise "Unknown f_arg type: #{val.inspect}" end result end def _reduce_555(val, _values, result) list, _, item = val if list.sexp_type == :args then result = list else result = s(:args, list) end result << item result end def _reduce_556(val, _values, result) # TODO: call_args label, _ = val[0] # TODO: fix lineno? result = s(:array, s(:kwarg, label.to_sym, val[1])) result end def _reduce_557(val, _values, result) # TODO: call_args label, _ = val[0] # TODO: fix lineno? result = s(:array, s(:kwarg, label.to_sym, val[1])) result end # reduce 558 omitted def _reduce_559(val, _values, result) debug20 35, val, result result end # reduce 560 omitted def _reduce_561(val, _values, result) result = args val result end # reduce 562 omitted # reduce 563 omitted def _reduce_564(val, _values, result) result = :"**#{val[1]}" result end def _reduce_565(val, _values, result) debug20 36, val, result result end def _reduce_566(val, _values, result) result = self.assignable val[0], val[2] # TODO: detect duplicate names result end def _reduce_567(val, _values, result) result = self.assignable val[0], val[2] result end def _reduce_568(val, _values, result) result = s(:block, val[0]) result end def _reduce_569(val, _values, result) result = val[0] result << val[2] result end def _reduce_570(val, _values, result) result = s(:block, val[0]) result end def _reduce_571(val, _values, result) result = self.block_append val[0], val[2] result end # reduce 572 omitted # reduce 573 omitted def _reduce_574(val, _values, result) # TODO: differs from parse.y - needs tests name = val[1].to_sym self.assignable name result = :"*#{name}" result end def _reduce_575(val, _values, result) name = :"*" self.env[name] = :lvar result = name result end # reduce 576 omitted # reduce 577 omitted def _reduce_578(val, _values, result) identifier = val[1].to_sym self.env[identifier] = :lvar result = "&#{identifier}".to_sym result end def _reduce_579(val, _values, result) result = val[1] result end def _reduce_580(val, _values, result) result = nil result end # reduce 581 omitted def _reduce_582(val, _values, result) lexer.lex_state = :expr_beg result end def _reduce_583(val, _values, result) result = val[2] yyerror "Can't define single method for literals." if result[0] == :lit result end def _reduce_584(val, _values, result) result = s(:array) result end def _reduce_585(val, _values, result) result = val[0] result end # reduce 586 omitted def _reduce_587(val, _values, result) list = val[0].dup more = val[2][1..-1] list.push(*more) unless more.empty? result = list result[0] = :hash # TODO: shouldn't this be a hash? result end def _reduce_588(val, _values, result) result = s(:array, val[0], val[2]) result end def _reduce_589(val, _values, result) result = s(:array, s(:lit, val[0][0].to_sym), val[1]) result end def _reduce_590(val, _values, result) result = s(:kwsplat, val[1]) result end # reduce 591 omitted # reduce 592 omitted # reduce 593 omitted # reduce 594 omitted # reduce 595 omitted # reduce 596 omitted # reduce 597 omitted # reduce 598 omitted # reduce 599 omitted # reduce 600 omitted # reduce 601 omitted # reduce 602 omitted # reduce 603 omitted # reduce 604 omitted # reduce 605 omitted # reduce 606 omitted # reduce 607 omitted # reduce 608 omitted # reduce 609 omitted # reduce 610 omitted # reduce 611 omitted def _reduce_612(val, _values, result) yyerrok result end # reduce 613 omitted # reduce 614 omitted def _reduce_615(val, _values, result) yyerrok result end def _reduce_616(val, _values, result) result = nil; result end def _reduce_none(val, _values, result) val[0] end end # class Ruby20Parser ruby_parser-3.2.2/lib/ruby_lexer.rb0000444000004100000410000012402612250152360017355 0ustar www-datawww-data# encoding: UTF-8 class RubyLexer # :stopdoc: RUBY19 = "".respond_to? :encoding IDENT_CHAR_RE = if RUBY19 then /[\w\u0080-\u{10ffff}]/u else /[\w\x80-\xFF]/n end IDENT_RE = /^#{IDENT_CHAR_RE}+/o attr_accessor :command_start attr_accessor :cmdarg attr_accessor :cond attr_accessor :tern # TODO: rename ternary damnit... wtf attr_accessor :string_nest ESC_RE = /\\((?>[0-7]{1,3}|x[0-9a-fA-F]{1,2}|M-[^\\]|(C-|c)[^\\]|[^0-7xMCc]))/u # :startdoc: ## # What version of ruby to parse. 18 and 19 are the only valid values # currently supported. attr_accessor :version # Additional context surrounding tokens that both the lexer and # grammar use. attr_reader :lex_state attr_accessor :lex_strterm attr_accessor :parser # HACK for very end of lexer... *sigh* # Stream of data that yylex examines. attr_reader :src # Last token read via yylex. attr_accessor :token attr_accessor :string_buffer # Value of last token which had a value associated with it. attr_accessor :yacc_value # What handles warnings attr_accessor :warnings attr_accessor :space_seen attr_accessor :paren_nest attr_accessor :brace_nest attr_accessor :lpar_beg EOF = :eof_haha! # ruby constants for strings (should this be moved somewhere else?) # :stopdoc: STR_FUNC_BORING = 0x00 STR_FUNC_ESCAPE = 0x01 # TODO: remove and replace with REGEXP STR_FUNC_EXPAND = 0x02 STR_FUNC_REGEXP = 0x04 STR_FUNC_QWORDS = 0x08 STR_FUNC_SYMBOL = 0x10 STR_FUNC_INDENT = 0x20 # <<-HEREDOC STR_SQUOTE = STR_FUNC_BORING STR_DQUOTE = STR_FUNC_BORING | STR_FUNC_EXPAND STR_XQUOTE = STR_FUNC_BORING | STR_FUNC_EXPAND STR_REGEXP = STR_FUNC_REGEXP | STR_FUNC_ESCAPE | STR_FUNC_EXPAND STR_SSYM = STR_FUNC_SYMBOL STR_DSYM = STR_FUNC_SYMBOL | STR_FUNC_EXPAND TOKENS = { "!" => :tBANG, "!=" => :tNEQ, # "!@" => :tUBANG, "!~" => :tNMATCH, "," => :tCOMMA, ".." => :tDOT2, "..." => :tDOT3, "=" => :tEQL, "==" => :tEQ, "===" => :tEQQ, "=>" => :tASSOC, "=~" => :tMATCH, "->" => :tLAMBDA, } # :startdoc: # How the parser advances to the next token. # # @return true if not at end of file (EOF). def advance r = yylex self.token = r raise "yylex returned nil" unless r return RubyLexer::EOF != r end def arg_ambiguous self.warning("Ambiguous first argument. make sure.") end def comments c = @comments.join @comments.clear c end def expr_beg_push val cond.push false cmdarg.push false self.lex_state = :expr_beg self.yacc_value = val end def fix_arg_lex_state self.lex_state = if in_lex_state? :expr_fname, :expr_dot then :expr_arg else :expr_beg end end def heredoc here # 63 lines _, eos, func, last_line = here indent = (func & STR_FUNC_INDENT) != 0 ? "[ \t]*" : nil expand = (func & STR_FUNC_EXPAND) != 0 eos_re = /#{indent}#{Regexp.escape eos}(\r*\n|\z)/ err_msg = "can't match #{eos_re.inspect} anywhere in " rb_compile_error err_msg if src.eos? if src.beginning_of_line? && src.scan(eos_re) then src.unread_many last_line # TODO: figure out how to remove this self.yacc_value = eos return :tSTRING_END end self.string_buffer = [] if expand then case when src.scan(/#[$@]/) then src.pos -= 1 # FIX omg stupid self.yacc_value = src.matched return :tSTRING_DVAR when src.scan(/#[{]/) then self.yacc_value = src.matched return :tSTRING_DBEG when src.scan(/#/) then string_buffer << '#' end begin c = tokadd_string func, "\n", nil rb_compile_error err_msg if c == RubyLexer::EOF if c != "\n" then self.yacc_value = string_buffer.join.delete("\r") return :tSTRING_CONTENT else string_buffer << src.scan(/\n/) end rb_compile_error err_msg if src.eos? end until src.check(eos_re) else until src.check(eos_re) do string_buffer << src.scan(/.*(\n|\z)/) rb_compile_error err_msg if src.eos? end end self.lex_strterm = [:heredoc, eos, func, last_line] self.yacc_value = string_buffer.join.delete("\r") return :tSTRING_CONTENT end def heredoc_identifier # 51 lines term, func = nil, STR_FUNC_BORING self.string_buffer = [] case when src.scan(/(-?)([\'\"\`])(.*?)\2/) then term = src[2] func |= STR_FUNC_INDENT unless src[1].empty? func |= case term when "\'" then STR_SQUOTE when '"' then STR_DQUOTE else STR_XQUOTE end string_buffer << src[3] when src.scan(/-?([\'\"\`])(?!\1*\Z)/) then rb_compile_error "unterminated here document identifier" when src.scan(/(-?)(#{IDENT_CHAR_RE}+)/) then term = '"' func |= STR_DQUOTE unless src[1].empty? then func |= STR_FUNC_INDENT end string_buffer << src[2] else return nil end if src.scan(/.*\n/) then # TODO: think about storing off the char range instead line = src.matched src.extra_lines_added += 1 else line = nil end self.lex_strterm = [:heredoc, string_buffer.join, func, line] if term == '`' then self.yacc_value = "`" return :tXSTRING_BEG else self.yacc_value = "\"" return :tSTRING_BEG end end def in_lex_state?(*states) states.include? lex_state end def initialize v = 18 self.version = v self.cond = RubyParserStuff::StackState.new(:cond) self.cmdarg = RubyParserStuff::StackState.new(:cmdarg) self.tern = RubyParserStuff::StackState.new(:tern) self.string_nest = 0 self.paren_nest = 0 self.brace_nest = 0 self.lpar_beg = nil @comments = [] reset end def int_with_base base rb_compile_error "Invalid numeric format" if src.matched =~ /__/ self.yacc_value = src.matched.to_i(base) return :tINTEGER end def lex_state= o # warn "wtf lex_state = #{o.inspect} from #{caller.first}" raise "wtf\?" unless Symbol === o @lex_state = o end attr_writer :lineno def lineno @lineno ||= src.lineno end ## # Parse a number from the input stream. # # @param c The first character of the number. # @return A int constant wich represents a token. def parse_number self.lex_state = :expr_end case when src.scan(/[+-]?0[xXbBdD]\b/) then rb_compile_error "Invalid numeric format" when src.scan(/[+-]?(?:(?:[1-9][\d_]*|0)(?!\.\d)\b|0[Dd][0-9_]+)/) then int_with_base(10) when src.scan(/[+-]?0x[a-f0-9_]+/i) then int_with_base(16) when src.scan(/[+-]?0[Bb][01_]+/) then int_with_base(2) when src.scan(/[+-]?0[Oo]?[0-7_]*[89]/) then rb_compile_error "Illegal octal digit." when src.scan(/[+-]?0[Oo]?[0-7_]+|0[Oo]/) then int_with_base(8) when src.scan(/[+-]?[\d_]+_(e|\.)/) then rb_compile_error "Trailing '_' in number." when src.scan(/[+-]?[\d_]+\.[\d_]+(e[+-]?[\d_]+)?\b|[+-]?[\d_]+e[+-]?[\d_]+\b/i) then number = src.matched if number =~ /__/ then rb_compile_error "Invalid numeric format" end self.yacc_value = number.to_f :tFLOAT when src.scan(/[+-]?[0-9_]+(?![e])/) then int_with_base(10) else rb_compile_error "Bad number format" end end def parse_quote # 58 lines beg, nnd, short_hand, c = nil, nil, false, nil if src.scan(/[a-z0-9]{1,2}/i) then # Long-hand (e.g. %Q{}). rb_compile_error "unknown type of %string" if src.matched_size == 2 c, beg, short_hand = src.matched, src.getch, false else # Short-hand (e.g. %{, %., %!, etc) c, beg, short_hand = 'Q', src.getch, true end if src.eos? or c == RubyLexer::EOF or beg == RubyLexer::EOF then rb_compile_error "unterminated quoted string meets end of file" end # Figure nnd-char. "\0" is special to indicate beg=nnd and that no nesting? nnd = { "(" => ")", "[" => "]", "{" => "}", "<" => ">" }[beg] nnd, beg = beg, "\0" if nnd.nil? token_type, self.yacc_value = nil, "%#{c}#{beg}" token_type, string_type = case c when 'Q' then ch = short_hand ? nnd : c + beg self.yacc_value = "%#{ch}" [:tSTRING_BEG, STR_DQUOTE] when 'q' then [:tSTRING_BEG, STR_SQUOTE] when 'W' then src.scan(/\s*/) [:tWORDS_BEG, STR_DQUOTE | STR_FUNC_QWORDS] when 'w' then src.scan(/\s*/) [:tQWORDS_BEG, STR_SQUOTE | STR_FUNC_QWORDS] when 'x' then [:tXSTRING_BEG, STR_XQUOTE] when 'r' then [:tREGEXP_BEG, STR_REGEXP] when 's' then self.lex_state = :expr_fname [:tSYMBEG, STR_SSYM] when 'I' then [:tSYMBOLS_BEG, STR_DQUOTE | STR_FUNC_QWORDS] when 'i' then [:tQSYMBOLS_BEG, STR_SQUOTE | STR_FUNC_QWORDS] end rb_compile_error "Bad %string type. Expected [Qq\Wwxrs], found '#{c}'." if token_type.nil? self.lex_strterm = [:strterm, string_type, nnd, beg] return token_type end def parse_string(quote) # 65 lines _, string_type, term, open = quote space = false # FIX: remove these func = string_type paren = open term_re = @@regexp_cache[term] qwords = (func & STR_FUNC_QWORDS) != 0 regexp = (func & STR_FUNC_REGEXP) != 0 expand = (func & STR_FUNC_EXPAND) != 0 unless func then # FIX: impossible, prolly needs == 0 self.lineno = nil return :tSTRING_END end space = true if qwords and src.scan(/\s+/) if self.string_nest == 0 && src.scan(/#{term_re}/) then if qwords then quote[1] = nil # TODO: make struct return :tSPACE elsif regexp then self.yacc_value = self.regx_options self.lineno = nil return :tREGEXP_END else self.yacc_value = term self.lineno = nil return :tSTRING_END end end if space then return :tSPACE end self.string_buffer = [] if expand case when src.scan(/#(?=[$@])/) then return :tSTRING_DVAR when src.scan(/#[{]/) then return :tSTRING_DBEG when src.scan(/#/) then string_buffer << '#' end end if tokadd_string(func, term, paren) == RubyLexer::EOF then rb_compile_error "unterminated string meets end of file" end self.yacc_value = string_buffer.join return :tSTRING_CONTENT end def rb_compile_error msg msg += ". near line #{self.lineno}: #{src.rest[/^.*/].inspect}" raise RubyParser::SyntaxError, msg end def read_escape # 51 lines case when src.scan(/\\/) then # Backslash '\\' when src.scan(/n/) then # newline "\n" when src.scan(/t/) then # horizontal tab "\t" when src.scan(/r/) then # carriage-return "\r" when src.scan(/f/) then # form-feed "\f" when src.scan(/v/) then # vertical tab "\13" when src.scan(/a/) then # alarm(bell) "\007" when src.scan(/e/) then # escape "\033" when src.scan(/b/) then # backspace "\010" when src.scan(/s/) then # space " " when src.scan(/[0-7]{1,3}/) then # octal constant (src.matched.to_i(8) & 0xFF).chr when src.scan(/x([0-9a-fA-F]{1,2})/) then # hex constant src[1].to_i(16).chr when src.check(/M-\\[\\MCc]/) then src.scan(/M-\\/) # eat it c = self.read_escape c[0] = (c[0].ord | 0x80).chr c when src.scan(/M-(.)/) then c = src[1] c[0] = (c[0].ord | 0x80).chr c when src.check(/(C-|c)\\[\\MCc]/) then src.scan(/(C-|c)\\/) # eat it c = self.read_escape c[0] = (c[0].ord & 0x9f).chr c when src.scan(/C-\?|c\?/) then 127.chr when src.scan(/(C-|c)(.)/) then c = src[2] c[0] = (c[0].ord & 0x9f).chr c when src.scan(/^[89]/i) then # bad octal or hex... MRI ignores them :( src.matched when src.scan(/[McCx0-9]/) || src.eos? then rb_compile_error("Invalid escape character syntax") else src.getch end end def regx_options # 15 lines good, bad = [], [] if src.scan(/[a-z]+/) then good, bad = src.matched.split(//).partition { |s| s =~ /^[ixmonesu]$/ } end unless bad.empty? then rb_compile_error("unknown regexp option%s - %s" % [(bad.size > 1 ? "s" : ""), bad.join.inspect]) end return good.join end def reset self.command_start = true self.lex_strterm = nil self.token = nil self.yacc_value = nil @src = nil @lex_state = nil end def ruby18 Ruby18Parser === parser end def ruby19 Ruby19Parser === parser end def src= src raise "bad src: #{src.inspect}" unless String === src @src = RPStringScanner.new(src) end def tokadd_escape term # 20 lines case when src.scan(/\\\n/) then # just ignore when src.scan(/\\([0-7]{1,3}|x[0-9a-fA-F]{1,2})/) then self.string_buffer << src.matched when src.scan(/\\([MC]-|c)(?=\\)/) then self.string_buffer << src.matched self.tokadd_escape term when src.scan(/\\([MC]-|c)(.)/) then self.string_buffer << src.matched when src.scan(/\\[McCx]/) then rb_compile_error "Invalid escape character syntax" when src.scan(/\\(.)/m) then self.string_buffer << src.matched else rb_compile_error "Invalid escape character syntax" end end @@regexp_cache = Hash.new { |h,k| h[k] = Regexp.new(Regexp.escape(k)) } @@regexp_cache[nil] = nil def tokadd_string(func, term, paren) # 105 lines qwords = (func & STR_FUNC_QWORDS) != 0 escape = (func & STR_FUNC_ESCAPE) != 0 expand = (func & STR_FUNC_EXPAND) != 0 regexp = (func & STR_FUNC_REGEXP) != 0 symbol = (func & STR_FUNC_SYMBOL) != 0 paren_re = @@regexp_cache[paren] term_re = @@regexp_cache[term] until src.eos? do c = nil handled = true case when paren_re && src.scan(paren_re) then self.string_nest += 1 when src.scan(term_re) then if self.string_nest == 0 then src.pos -= 1 break else self.string_nest -= 1 end when expand && src.scan(/#(?=[\$\@\{])/) then src.pos -= 1 break when qwords && src.scan(/\s/) then src.pos -= 1 break when expand && src.scan(/#(?!\n)/) then # do nothing when src.check(/\\/) then case when qwords && src.scan(/\\\n/) then string_buffer << "\n" next when qwords && src.scan(/\\\s/) then c = ' ' when expand && src.scan(/\\\n/) then next when regexp && src.check(/\\/) then self.tokadd_escape term next when expand && src.scan(/\\/) then c = self.read_escape when src.scan(/\\\n/) then # do nothing when src.scan(/\\\\/) then string_buffer << '\\' if escape c = '\\' when src.scan(/\\/) then unless src.scan(term_re) || paren.nil? || src.scan(paren_re) then string_buffer << "\\" end else handled = false end # inner /\\/ case else handled = false end # top case unless handled then t = Regexp.escape term x = Regexp.escape(paren) if paren && paren != "\000" re = if qwords then if RUBY19 then /[^#{t}#{x}\#\0\\\s]+|./ # |. to pick up whatever else /[^#{t}#{x}\#\0\\\s\v]+|./ # argh. 1.8's \s doesn't pick up \v end else /[^#{t}#{x}\#\0\\]+|./ end src.scan re c = src.matched rb_compile_error "symbol cannot contain '\\0'" if symbol && c =~ /\0/ end # unless handled c ||= src.matched string_buffer << c end # until c ||= src.matched c = RubyLexer::EOF if src.eos? return c end ESCAPES = { "a" => "\007", "b" => "\010", "e" => "\033", "f" => "\f", "n" => "\n", "r" => "\r", "s" => " ", "t" => "\t", "v" => "\13", "\\" => '\\', "\n" => "", "C-\?" => 127.chr, "c\?" => 127.chr, } def unescape s r = ESCAPES[s] return r if r x = case s when /^[0-7]{1,3}/ then ($&.to_i(8) & 0xFF).chr when /^x([0-9a-fA-F]{1,2})/ then $1.to_i(16).chr when /^M-(.)/ then ($1[0].ord | 0x80).chr when /^(C-|c)(.)/ then ($2[0].ord & 0x9f).chr when /^[89a-f]/i then # bad octal or hex... ignore? that's what MRI does :( s when /^[McCx0-9]/ then rb_compile_error("Invalid escape character syntax") else s end x.force_encoding "UTF-8" if RUBY19 x end def warning s # do nothing for now end ## # Returns the next token. Also sets yy_val is needed. # # @return Description of the Returned Value def yylex # 826 lines c = '' self.space_seen = false command_state = false src = self.src self.token = nil self.yacc_value = nil return yylex_string if lex_strterm command_state = self.command_start self.command_start = false last_state = lex_state loop do # START OF CASE if src.scan(/[\ \t\r\f\v]/) then # \s - \n + \v self.space_seen = true next elsif src.check(/[^a-zA-Z]/) then if src.scan(/\n|#/) then self.lineno = nil c = src.matched if c == '#' then src.pos -= 1 while src.scan(/\s*#.*(\n+|\z)/) do @comments << src.matched.gsub(/^ +#/, '#').gsub(/^ +$/, '') end return RubyLexer::EOF if src.eos? end # Replace a string of newlines with a single one src.scan(/\n+/) next if in_lex_state?(:expr_beg, :expr_value, :expr_class, :expr_fname, :expr_dot) if src.scan(/([\ \t\r\f\v]*)\./) then self.space_seen = true unless src[1].empty? src.pos -= 1 next unless src.check(/\.\./) end self.command_start = true self.lex_state = :expr_beg return :tNL elsif src.scan(/[\]\)\}]/) then if src.matched == "}" then self.brace_nest -= 1 else self.paren_nest -= 1 end cond.lexpop cmdarg.lexpop tern.lexpop self.lex_state = if src.matched == ")" then :expr_endfn else :expr_endarg end self.yacc_value = src.matched result = { ")" => :tRPAREN, "]" => :tRBRACK, "}" => :tRCURLY }[src.matched] return result elsif src.scan(/\!/) then if in_lex_state?(:expr_fname, :expr_dot) then self.lex_state = :expr_arg if src.scan(/@/) then self.yacc_value = "!@" return :tUBANG end else self.lex_state = :expr_beg end if src.scan(/[=~]/) then self.yacc_value = "!#{src.matched}" else self.yacc_value = "!" end return TOKENS[self.yacc_value] elsif src.scan(/\.\.\.?|,|![=~]?/) then self.lex_state = :expr_beg tok = self.yacc_value = src.matched return TOKENS[tok] elsif src.check(/\./) then if src.scan(/\.\d/) then rb_compile_error "no . floating literal anymore put 0 before dot" elsif src.scan(/\./) then self.lex_state = :expr_dot self.yacc_value = "." return :tDOT end elsif src.scan(/\(/) then result = if ruby18 then yylex_paren18 else yylex_paren19 end self.paren_nest += 1 self.expr_beg_push "(" return result elsif src.check(/\=/) then if src.scan(/\=\=\=|\=\=|\=~|\=>|\=(?!begin\b)/) then self.fix_arg_lex_state tok = self.yacc_value = src.matched return TOKENS[tok] elsif src.scan(/\=begin(?=\s)/) then @comments << src.matched unless src.scan(/.*?\n=end( |\t|\f)*[^\n]*(\n|\z)/m) then @comments.clear rb_compile_error("embedded document meets end of file") end @comments << src.matched next else raise "you shouldn't be able to get here" end elsif src.scan(/\"(#{ESC_RE}|#(#{ESC_RE}|[^\{\#\@\$\"\\])|[^\"\\\#])*\"/o) then self.yacc_value = src.matched[1..-2].gsub(ESC_RE) { unescape $1 } self.lex_state = :expr_end return :tSTRING elsif src.scan(/\"/) then # FALLBACK self.lex_strterm = [:strterm, STR_DQUOTE, '"', "\0"] # TODO: question this self.yacc_value = "\"" return :tSTRING_BEG elsif src.scan(/\@\@?#{IDENT_CHAR_RE}+/o) then self.token = src.matched rb_compile_error "`#{token}` is not allowed as a variable name" if token =~ /\@\d/ return process_token(command_state) elsif src.scan(/\:\:/) then if is_beg? || in_lex_state?(:expr_class) || is_space_arg? then self.lex_state = :expr_beg self.yacc_value = "::" return :tCOLON3 end self.lex_state = :expr_dot self.yacc_value = "::" return :tCOLON2 elsif ! is_end? && src.scan(/:([a-zA-Z_]#{IDENT_CHAR_RE}*(?:[?!]|=(?==>)|=(?![=>]))?)/) then # scanning shortcut to symbols self.yacc_value = src[1] self.lex_state = :expr_end return :tSYMBOL elsif src.scan(/\:/) then # ?: / then / when if is_end? || src.check(/\s/) then self.lex_state = :expr_beg # TODO warn_balanced(":", "symbol literal"); self.yacc_value = ":" return :tCOLON end case when src.scan(/\'/) then self.lex_strterm = [:strterm, STR_SSYM, src.matched, "\0"] when src.scan(/\"/) then self.lex_strterm = [:strterm, STR_DSYM, src.matched, "\0"] end self.lex_state = :expr_fname self.yacc_value = ":" return :tSYMBEG elsif src.check(/[0-9]/) then return parse_number elsif src.scan(/\[/) then self.paren_nest += 1 result = src.matched if in_lex_state? :expr_fname, :expr_dot then self.lex_state = :expr_arg case when src.scan(/\]\=/) then self.paren_nest -= 1 # HACK? I dunno, or bug in MRI self.yacc_value = "[]=" return :tASET when src.scan(/\]/) then self.paren_nest -= 1 # HACK? I dunno, or bug in MRI self.yacc_value = "[]" return :tAREF else rb_compile_error "unexpected '['" end elsif is_beg? then self.tern.push false result = :tLBRACK elsif is_arg? && space_seen then self.tern.push false result = :tLBRACK else result = :tLBRACK2 end self.expr_beg_push "[" return result elsif src.scan(/\'(\\.|[^\'])*\'/) then self.yacc_value = src.matched[1..-2].gsub(/\\\\/, "\\").gsub(/\\'/, "'") # " self.lex_state = :expr_end return :tSTRING elsif src.check(/\|/) then if src.scan(/\|\|\=/) then self.lex_state = :expr_beg self.yacc_value = "||" return :tOP_ASGN elsif src.scan(/\|\|/) then self.lex_state = :expr_beg self.yacc_value = "||" return :tOROP elsif src.scan(/\|\=/) then self.lex_state = :expr_beg self.yacc_value = "|" return :tOP_ASGN elsif src.scan(/\|/) then self.fix_arg_lex_state self.yacc_value = "|" return :tPIPE end elsif src.scan(/\{/) then self.brace_nest += 1 if lpar_beg && lpar_beg == paren_nest then self.lpar_beg = nil self.paren_nest -= 1 expr_beg_push "{" return :tLAMBEG end result = if is_arg? || in_lex_state?(:expr_end, :expr_endfn) then :tLCURLY # block (primary) elsif in_lex_state?(:expr_endarg) then :tLBRACE_ARG # block (expr) else self.tern.push false :tLBRACE # hash end self.expr_beg_push "{" self.command_start = true unless result == :tLBRACE return result elsif src.scan(/->/) then self.lex_state = :expr_endfn return :tLAMBDA elsif src.scan(/[+-]/) then sign = src.matched utype, type = if sign == "+" then [:tUPLUS, :tPLUS] else [:tUMINUS, :tMINUS] end if in_lex_state? :expr_fname, :expr_dot then self.lex_state = :expr_arg if src.scan(/@/) then self.yacc_value = "#{sign}@" return utype else self.yacc_value = sign return type end end if src.scan(/\=/) then self.lex_state = :expr_beg self.yacc_value = sign return :tOP_ASGN end if (is_beg? || (is_arg? && space_seen && !src.check(/\s/))) then if is_arg? then arg_ambiguous end self.lex_state = :expr_beg self.yacc_value = sign if src.check(/\d/) then if utype == :tUPLUS then return self.parse_number else return :tUMINUS_NUM end end return utype end self.lex_state = :expr_beg self.yacc_value = sign return type elsif src.check(/\*/) then if src.scan(/\*\*=/) then self.lex_state = :expr_beg self.yacc_value = "**" return :tOP_ASGN elsif src.scan(/\*\*/) then result = if is_space_arg? src.check(/./m) then warning "`**' interpreted as argument prefix" :tDSTAR elsif is_beg? then :tDSTAR else # TODO: warn_balanced("**", "argument prefix"); :tPOW end self.yacc_value = "**" self.fix_arg_lex_state return result elsif src.scan(/\*\=/) then self.lex_state = :expr_beg self.yacc_value = "*" return :tOP_ASGN elsif src.scan(/\*/) then result = if is_space_arg? src.check(/./m) then warning("`*' interpreted as argument prefix") :tSTAR elsif is_beg? then :tSTAR else # TODO: warn_balanced("*", "argument prefix"); :tSTAR2 # TODO: rename end self.yacc_value = "*" self.fix_arg_lex_state return result end elsif src.check(/\/) then self.fix_arg_lex_state self.yacc_value = "<=>" return :tCMP elsif src.scan(/\<\=/) then self.fix_arg_lex_state self.yacc_value = "<=" return :tLEQ elsif src.scan(/\<\<\=/) then self.fix_arg_lex_state self.lex_state = :expr_beg self.yacc_value = "\<\<" return :tOP_ASGN elsif src.scan(/\<\/) then if src.scan(/\>\=/) then self.fix_arg_lex_state self.yacc_value = ">=" return :tGEQ elsif src.scan(/\>\>=/) then self.fix_arg_lex_state self.lex_state = :expr_beg self.yacc_value = ">>" return :tOP_ASGN elsif src.scan(/\>\>/) then self.fix_arg_lex_state self.yacc_value = ">>" return :tRSHFT elsif src.scan(/\>/) then self.fix_arg_lex_state self.yacc_value = ">" return :tGT end elsif src.scan(/\`/) then self.yacc_value = "`" case lex_state when :expr_fname then self.lex_state = :expr_end return :tBACK_REF2 when :expr_dot then self.lex_state = if command_state then :expr_cmdarg else :expr_arg end return :tBACK_REF2 end self.lex_strterm = [:strterm, STR_XQUOTE, '`', "\0"] return :tXSTRING_BEG elsif src.scan(/\?/) then if is_end? then self.lex_state = ruby18 ? :expr_beg : :expr_value # HACK? self.tern.push true self.yacc_value = "?" return :tEH end if src.eos? then rb_compile_error "incomplete character syntax" end if src.check(/\s|\v/) then unless is_arg? then c2 = { " " => 's', "\n" => 'n', "\t" => 't', "\v" => 'v', "\r" => 'r', "\f" => 'f' }[src.matched] if c2 then warning("invalid character syntax; use ?\\" + c2) end end # ternary self.lex_state = ruby18 ? :expr_beg : :expr_value # HACK? self.tern.push true self.yacc_value = "?" return :tEH elsif src.check(/\w(?=\w)/) then # ternary, also self.lex_state = :expr_beg self.tern.push true self.yacc_value = "?" return :tEH end c = if src.scan(/\\/) then self.read_escape else src.getch end self.lex_state = :expr_end if version == 18 then self.yacc_value = c[0].ord & 0xff return :tINTEGER else self.yacc_value = c return :tSTRING end elsif src.check(/\&/) then if src.scan(/\&\&\=/) then self.yacc_value = "&&" self.lex_state = :expr_beg return :tOP_ASGN elsif src.scan(/\&\&/) then self.lex_state = :expr_beg self.yacc_value = "&&" return :tANDOP elsif src.scan(/\&\=/) then self.yacc_value = "&" self.lex_state = :expr_beg return :tOP_ASGN elsif src.scan(/&/) then result = if is_arg? && space_seen && !src.check(/\s/) then warning("`&' interpreted as argument prefix") :tAMPER elsif in_lex_state? :expr_beg, :expr_mid then :tAMPER else :tAMPER2 end self.fix_arg_lex_state self.yacc_value = "&" return result end elsif src.scan(/\//) then if is_beg? then self.lex_strterm = [:strterm, STR_REGEXP, '/', "\0"] self.yacc_value = "/" return :tREGEXP_BEG end if src.scan(/\=/) then self.yacc_value = "/" self.lex_state = :expr_beg return :tOP_ASGN end if is_arg? && space_seen then unless src.scan(/\s/) then arg_ambiguous self.lex_strterm = [:strterm, STR_REGEXP, '/', "\0"] self.yacc_value = "/" return :tREGEXP_BEG end end self.fix_arg_lex_state self.yacc_value = "/" return :tDIVIDE elsif src.scan(/\^=/) then self.lex_state = :expr_beg self.yacc_value = "^" return :tOP_ASGN elsif src.scan(/\^/) then self.fix_arg_lex_state self.yacc_value = "^" return :tCARET elsif src.scan(/\;/) then self.command_start = true self.lex_state = :expr_beg self.yacc_value = ";" return :tSEMI elsif src.scan(/\~/) then if in_lex_state? :expr_fname, :expr_dot then src.scan(/@/) end self.fix_arg_lex_state self.yacc_value = "~" return :tTILDE elsif src.scan(/\\/) then if src.scan(/\r?\n/) then self.lineno = nil self.space_seen = true next end rb_compile_error "bare backslash only allowed before newline" elsif src.scan(/\%/) then if is_beg? then return parse_quote end if src.scan(/\=/) then self.lex_state = :expr_beg self.yacc_value = "%" return :tOP_ASGN end return parse_quote if is_arg? && space_seen && ! src.check(/\s/) self.fix_arg_lex_state self.yacc_value = "%" return :tPERCENT elsif src.check(/\$/) then if src.scan(/(\$_)(\w+)/) then self.lex_state = :expr_end self.token = src.matched return process_token(command_state) elsif src.scan(/\$_/) then self.lex_state = :expr_end self.token = src.matched self.yacc_value = src.matched return :tGVAR elsif src.scan(/\$[~*$?!@\/\\;,.=:<>\"]|\$-\w?/) then self.lex_state = :expr_end self.yacc_value = src.matched return :tGVAR elsif src.scan(/\$([\&\`\'\+])/) then self.lex_state = :expr_end # Explicit reference to these vars as symbols... if last_state == :expr_fname then self.yacc_value = src.matched return :tGVAR else self.yacc_value = src[1].to_sym return :tBACK_REF end elsif src.scan(/\$([1-9]\d*)/) then self.lex_state = :expr_end if last_state == :expr_fname then self.yacc_value = src.matched return :tGVAR else self.yacc_value = src[1].to_i return :tNTH_REF end elsif src.scan(/\$0/) then self.lex_state = :expr_end self.token = src.matched return process_token(command_state) elsif src.scan(/\$\W|\$\z/) then # TODO: remove? self.lex_state = :expr_end self.yacc_value = "$" return "$" elsif src.scan(/\$\w+/) self.lex_state = :expr_end self.token = src.matched return process_token(command_state) end elsif src.check(/\_/) then if src.beginning_of_line? && src.scan(/\__END__(\r?\n|\Z)/) then self.lineno = nil return RubyLexer::EOF elsif src.scan(/\_\w*/) then self.token = src.matched return process_token(command_state) end end end # END OF CASE if src.scan(/\004|\032|\000/) || src.eos? then # ^D, ^Z, EOF return RubyLexer::EOF else # alpha check rb_compile_error "Invalid char #{src.rest[0].chr} in expression" unless src.check IDENT_RE end self.token = src.matched if self.src.scan IDENT_RE return process_token(command_state) end end def yylex_paren18 self.command_start = true result = :tLPAREN2 if in_lex_state? :expr_beg, :expr_mid then result = :tLPAREN elsif space_seen then if in_lex_state? :expr_cmdarg then result = :tLPAREN_ARG elsif in_lex_state? :expr_arg then self.tern.push false warning "don't put space before argument parentheses" end else self.tern.push false end result end def yylex_paren19 if is_beg? then :tLPAREN elsif is_space_arg? then :tLPAREN_ARG else :tLPAREN2 # plain '(' in parse.y end end def is_arg? in_lex_state? :expr_arg, :expr_cmdarg end def is_end? in_lex_state? :expr_end, :expr_endarg, :expr_endfn end def is_beg? in_lex_state? :expr_beg, :expr_value, :expr_mid, :expr_class end # TODO #define IS_AFTER_OPERATOR() IS_lex_state(EXPR_FNAME | EXPR_DOT) def is_space_arg? c = "x" is_arg? and space_seen and c !~ /\s/ end def is_label_possible? command_state (in_lex_state?(:expr_beg) && !command_state) || is_arg? end def process_token(command_state) token << src.matched if token =~ IDENT_RE && src.scan(/[\!\?](?!=)/) result = nil last_state = lex_state case token when /^\$/ then self.lex_state, result = :expr_end, :tGVAR when /^@@/ then self.lex_state, result = :expr_end, :tCVAR when /^@/ then self.lex_state, result = :expr_end, :tIVAR else if token =~ /[!?]$/ then result = :tFID else if in_lex_state? :expr_fname then # ident=, not =~ => == or followed by => # TODO test lexing of a=>b vs a==>b if src.scan(/=(?:(?![~>=])|(?==>))/) then result = :tIDENTIFIER token << src.matched end end result ||= if token =~ /^[A-Z]/ then :tCONSTANT else :tIDENTIFIER end end unless ruby18 if is_label_possible? command_state then colon = src.scan(/:/) if colon && src.peek(1) != ":" then self.lex_state = :expr_beg self.yacc_value = [token, src.lineno] return :tLABEL end src.unscan if colon end end unless in_lex_state? :expr_dot then # See if it is a reserved word. keyword = if ruby18 then # REFACTOR need 18/19 lexer subclasses RubyParserStuff::Keyword.keyword18 token else RubyParserStuff::Keyword.keyword19 token end if keyword then state = lex_state self.lex_state = keyword.state self.yacc_value = [token, src.lineno] if state == :expr_fname then self.yacc_value = keyword.name return keyword.id0 end self.command_start = true if lex_state == :expr_beg if keyword.id0 == :kDO then if lpar_beg && lpar_beg == paren_nest then self.lpar_beg = nil self.paren_nest -= 1 return :kDO_LAMBDA end return :kDO_COND if cond.is_in_state return :kDO_BLOCK if cmdarg.is_in_state && state != :expr_cmdarg return :kDO_BLOCK if [:expr_beg, :expr_endarg].include? state return :kDO end return keyword.id0 if [:expr_beg, :expr_value].include? state self.lex_state = :expr_beg if keyword.id0 != keyword.id1 return keyword.id1 end end # TODO: # if (mb == ENC_CODERANGE_7BIT && lex_state != EXPR_DOT) { self.lex_state = if is_beg? || is_arg? || in_lex_state?(:expr_dot) then if command_state then :expr_cmdarg else :expr_arg end elsif !ruby18 && in_lex_state?(:expr_fname) then :expr_endfn else :expr_end end end self.yacc_value = token if (![:expr_dot, :expr_fname].include?(last_state) && self.parser.env[token.to_sym] == :lvar) then self.lex_state = :expr_end end return result end def yylex_string # 23 lines token = if lex_strterm[0] == :heredoc then self.heredoc lex_strterm else self.parse_string lex_strterm end if token == :tSTRING_END || token == :tREGEXP_END then self.lineno = nil self.lex_strterm = nil self.lex_state = :expr_end end return token end end ruby_parser-3.2.2/metadata.yml0000644000004100000410000001325612250152360016411 0ustar www-datawww-data--- !ruby/object:Gem::Specification name: ruby_parser version: !ruby/object:Gem::Version hash: 11 prerelease: segments: - 3 - 2 - 2 version: 3.2.2 platform: ruby authors: - Ryan Davis autorequire: bindir: bin cert_chain: - | -----BEGIN CERTIFICATE----- MIIDPjCCAiagAwIBAgIBADANBgkqhkiG9w0BAQUFADBFMRMwEQYDVQQDDApyeWFu ZC1ydWJ5MRkwFwYKCZImiZPyLGQBGRYJemVuc3BpZGVyMRMwEQYKCZImiZPyLGQB GRYDY29tMB4XDTA5MDMwNjE4NTMxNVoXDTEwMDMwNjE4NTMxNVowRTETMBEGA1UE AwwKcnlhbmQtcnVieTEZMBcGCgmSJomT8ixkARkWCXplbnNwaWRlcjETMBEGCgmS JomT8ixkARkWA2NvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALda b9DCgK+627gPJkB6XfjZ1itoOQvpqH1EXScSaba9/S2VF22VYQbXU1xQXL/WzCkx taCPaLmfYIaFcHHCSY4hYDJijRQkLxPeB3xbOfzfLoBDbjvx5JxgJxUjmGa7xhcT oOvjtt5P8+GSK9zLzxQP0gVLS/D0FmoE44XuDr3iQkVS2ujU5zZL84mMNqNB1znh GiadM9GHRaDiaxuX0cIUBj19T01mVE2iymf9I6bEsiayK/n6QujtyCbTWsAS9Rqt qhtV7HJxNKuPj/JFH0D2cswvzznE/a5FOYO68g+YCuFi5L8wZuuM8zzdwjrWHqSV gBEfoTEGr7Zii72cx+sCAwEAAaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAw HQYDVR0OBBYEFEfFe9md/r/tj/Wmwpy+MI8d9k/hMA0GCSqGSIb3DQEBBQUAA4IB AQAY59gYvDxqSqgC92nAP9P8dnGgfZgLxP237xS6XxFGJSghdz/nI6pusfCWKM8m vzjjH2wUMSSf3tNudQ3rCGLf2epkcU13/rguI88wO6MrE0wi4ZqLQX+eZQFskJb/ w6x9W1ur8eR01s397LSMexySDBrJOh34cm2AlfKr/jokKCTwcM0OvVZnAutaovC0 l1SVZ0ecg88bsWHA0Yhh7NFxK1utWoIhtB6AFC/+trM0FQEB/jZkIS8SaNzn96Rl n0sZEf77FLf5peR8TP/PtmIg7Cyqz23sLM4mCOoTGIy5OcZ8TdyiyINUHtb5ej/T FBHgymkyj/AOSqKRIpXPhjC6 -----END CERTIFICATE----- date: 2013-07-12 00:00:00 Z dependencies: - !ruby/object:Gem::Dependency name: sexp_processor prerelease: false requirement: &id001 !ruby/object:Gem::Requirement none: false requirements: - - ~> - !ruby/object:Gem::Version hash: 25 segments: - 4 - 1 version: "4.1" type: :runtime version_requirements: *id001 - !ruby/object:Gem::Dependency name: minitest prerelease: false requirement: &id002 !ruby/object:Gem::Requirement none: false requirements: - - ~> - !ruby/object:Gem::Version hash: 31 segments: - 5 - 0 version: "5.0" type: :development version_requirements: *id002 - !ruby/object:Gem::Dependency name: rdoc prerelease: false requirement: &id003 !ruby/object:Gem::Requirement none: false requirements: - - ~> - !ruby/object:Gem::Version hash: 27 segments: - 4 - 0 version: "4.0" type: :development version_requirements: *id003 - !ruby/object:Gem::Dependency name: racc prerelease: false requirement: &id004 !ruby/object:Gem::Requirement none: false requirements: - - ~> - !ruby/object:Gem::Version hash: 11 segments: - 1 - 4 - 6 version: 1.4.6 type: :development version_requirements: *id004 - !ruby/object:Gem::Dependency name: rake prerelease: false requirement: &id005 !ruby/object:Gem::Requirement none: false requirements: - - < - !ruby/object:Gem::Version hash: 23 segments: - 10 version: "10" type: :development version_requirements: *id005 - !ruby/object:Gem::Dependency name: hoe prerelease: false requirement: &id006 !ruby/object:Gem::Requirement none: false requirements: - - ~> - !ruby/object:Gem::Version hash: 11 segments: - 3 - 6 version: "3.6" type: :development version_requirements: *id006 description: |- ruby_parser (RP) is a ruby parser written in pure ruby (utilizing racc--which does by default use a C extension). RP's output is the same as ParseTree's output: s-expressions using ruby's arrays and base types. As an example: def conditional1 arg1 return 1 if arg1 == 0 return 0 end becomes: s(:defn, :conditional1, s(:args, :arg1), s(:if, s(:call, s(:lvar, :arg1), :==, s(:lit, 0)), s(:return, s(:lit, 1)), nil), s(:return, s(:lit, 0))) Tested against 801,039 files from the latest of all rubygems (as of 2013-05): * 1.8 parser is at 99.9739% accuracy, 3.651 sigma * 1.9 parser is at 99.9940% accuracy, 4.013 sigma * 2.0 parser is at 99.9939% accuracy, 4.008 sigma email: - ryand-ruby@zenspider.com executables: - ruby_parse - ruby_parse_extract_error extensions: [] extra_rdoc_files: - History.txt - Manifest.txt - README.txt files: - .autotest - History.txt - Manifest.txt - README.txt - Rakefile - bin/ruby_parse - bin/ruby_parse_extract_error - lib/gauntlet_rubyparser.rb - lib/ruby18_parser.rb - lib/ruby18_parser.y - lib/ruby19_parser.rb - lib/ruby19_parser.y - lib/ruby20_parser.rb - lib/ruby20_parser.y - lib/ruby_lexer.rb - lib/ruby_parser.rb - lib/ruby_parser_extras.rb - test/test_ruby_lexer.rb - test/test_ruby_parser.rb - test/test_ruby_parser_extras.rb - .gemtest homepage: https://github.com/seattlerb/ruby_parser licenses: [] post_install_message: rdoc_options: - --main - README.txt require_paths: - lib required_ruby_version: !ruby/object:Gem::Requirement none: false requirements: - - ">=" - !ruby/object:Gem::Version hash: 3 segments: - 0 version: "0" required_rubygems_version: !ruby/object:Gem::Requirement none: false requirements: - - ">=" - !ruby/object:Gem::Version hash: 3 segments: - 0 version: "0" requirements: [] rubyforge_project: parsetree rubygems_version: 1.8.25 signing_key: specification_version: 3 summary: ruby_parser (RP) is a ruby parser written in pure ruby (utilizing racc--which does by default use a C extension) test_files: - test/test_ruby_lexer.rb - test/test_ruby_parser.rb - test/test_ruby_parser_extras.rb ruby_parser-3.2.2/test/0000755000004100000410000000000012250152360015056 5ustar www-datawww-dataruby_parser-3.2.2/test/test_ruby_lexer.rb0000555000004100000410000020173512250152360020633 0ustar www-datawww-data#!/usr/local/bin/ruby # encoding: US-ASCII require 'rubygems' require 'minitest/autorun' require 'ruby_lexer' require 'ruby18_parser' require 'ruby20_parser' class TestRubyLexer < Minitest::Test attr_accessor :processor, :lex, :parser_class alias :lexer :lex # lets me copy/paste code from parser alias :lexer= :lex= def setup setup_lexer_class Ruby20Parser end def setup_lexer input, exp_sexp = nil setup_new_parser lex.src = input lex.lex_state = :expr_beg assert_equal exp_sexp, processor.class.new.parse(input) if exp_sexp end def setup_new_parser self.processor = parser_class.new self.lex = processor.lexer end def setup_lexer_class parser_class self.parser_class = parser_class setup_new_parser setup_lexer "blah blah" end def test_advance assert @lex.advance # blah assert @lex.advance # blah refute @lex.advance # nada end def test_unicode_ident s = "@\u1088\u1077\u1093\u1072" util_lex_token(s.dup, :tIVAR, s.dup) end def test_read_escape util_escape "\\", "\\" util_escape "\n", "n" util_escape "\t", "t" util_escape "\r", "r" util_escape "\f", "f" util_escape "\13", "v" util_escape "\0", "0" util_escape "\07", "a" util_escape "\007", "a" util_escape "\033", "e" util_escape "\377", "377" util_escape "\377", "xff" util_escape "\010", "b" util_escape " ", "s" util_escape "q", "q" # plain vanilla escape util_escape "8", "8" # ugh... mri... WHY?!? util_escape "9", "9" # ugh... mri... WHY?!? util_escape "$", "444" # ugh end def test_read_escape_c util_escape "\030", "C-x" util_escape "\030", "cx" util_escape "\230", 'C-\M-x' util_escape "\230", 'c\M-x' util_escape "\177", "C-?" util_escape "\177", "c?" end def test_read_escape_errors util_escape_bad "" util_escape_bad "M" util_escape_bad "M-" util_escape_bad "Mx" util_escape_bad "Cx" util_escape_bad "C" util_escape_bad "C-" util_escape_bad "c" end def test_read_escape_m util_escape "\370", "M-x" util_escape "\230", 'M-\C-x' util_escape "\230", 'M-\cx' end def test_yylex_ambiguous_uminus util_lex_token("m -3", :tIDENTIFIER, "m", :tUMINUS_NUM, "-", :tINTEGER, 3) # TODO: verify warning end def test_yylex_ambiguous_uplus util_lex_token("m +3", :tIDENTIFIER, "m", :tINTEGER, 3) # TODO: verify warning end def test_yylex_and util_lex_token "&", :tAMPER, "&" end def test_yylex_and2 util_lex_token "&&", :tANDOP, "&&" end def test_yylex_and2_equals util_lex_token "&&=", :tOP_ASGN, "&&" end def test_yylex_and_arg @lex.lex_state = :expr_arg util_lex_token(" &y", :tAMPER, "&", :tIDENTIFIER, "y") end def test_yylex_and_equals util_lex_token "&=", :tOP_ASGN, "&" end def test_yylex_and_expr @lex.lex_state = :expr_arg util_lex_token("x & y", :tIDENTIFIER, "x", :tAMPER2, "&", :tIDENTIFIER, "y") end def test_yylex_and_meth util_lex_fname "&", :tAMPER2 end def test_yylex_assoc util_lex_token "=>", :tASSOC, "=>" end def test_yylex_label__18 setup_lexer_class Ruby18Parser util_lex_token("{a:", :tLBRACE, "{", :tIDENTIFIER, "a", :tSYMBEG, ":") end def test_yylex_label_in_params__18 setup_lexer_class Ruby18Parser util_lex_token("foo(a:", :tIDENTIFIER, "foo", :tLPAREN2, "(", :tIDENTIFIER, "a", :tSYMBEG, ":") end def test_yylex_label__19 setup_lexer_class Ruby19Parser util_lex_token("{a:", :tLBRACE, "{", :tLABEL, "a") end def test_yylex_label_in_params__19 setup_lexer_class Ruby19Parser util_lex_token("foo(a:", :tIDENTIFIER, "foo", :tLPAREN2, "(", :tLABEL, "a") end def assert_next_lexeme token=nil, value=nil, state=nil, paren=nil, brace=nil assert @lex.advance, "no more tokens" msg = message { act = [@lex.token, @lex.yacc_value, @lex.lex_state, @lex.paren_nest, @lex.brace_nest] exp = [token, value, state, paren, brace] "#{exp.inspect} vs #{act.inspect}" } act_value = @lex.yacc_value act_value = act_value.first if Array === act_value assert_equal token, @lex.token, msg assert_equal value, act_value, msg assert_equal state, @lex.lex_state, msg assert_equal paren, @lex.paren_nest, msg if paren assert_equal brace, @lex.brace_nest, msg if brace end def refute_lexeme refute @lex.advance, "not empty: #{[@lex.token, @lex.yacc_value].inspect}" end def assert_lex input, exp_sexp, *args setup_lexer input, exp_sexp args.each_slice(5) do |token, value, state, paren, brace| assert_next_lexeme token, value, state, paren, brace end refute_lexeme end def emulate_string_interpolation lex_strterm = lexer.lex_strterm string_nest = lexer.string_nest brace_nest = lexer.brace_nest lexer.string_nest = 0 lexer.brace_nest = 0 lexer.cond.push false lexer.cmdarg.push false lexer.lex_strterm = nil lexer.lex_state = :expr_beg yield lexer.lex_state = :expr_endarg assert_next_lexeme :tRCURLY, "}", :expr_endarg, 0 lexer.lex_strterm = lex_strterm lexer.lex_state = :expr_beg lexer.string_nest = string_nest lexer.brace_nest = brace_nest lexer.cond.lexpop lexer.cmdarg.lexpop end def test_yylex_paren_string_parens_interpolated setup_lexer('%((#{b}#{d}))', s(:dstr, "(", s(:evstr, s(:call, nil, :b)), s(:evstr, s(:call, nil, :d)), s(:str, ")"))) assert_next_lexeme :tSTRING_BEG, "%)", :expr_beg, 0, 0 assert_next_lexeme :tSTRING_CONTENT, "(", :expr_beg, 0, 0 assert_next_lexeme :tSTRING_DBEG, nil, :expr_beg, 0, 0 emulate_string_interpolation do assert_next_lexeme :tIDENTIFIER, "b", :expr_arg, 0, 0 end assert_next_lexeme :tSTRING_DBEG, nil, :expr_beg, 0, 0 emulate_string_interpolation do assert_next_lexeme :tIDENTIFIER, "d", :expr_arg, 0, 0 end assert_next_lexeme :tSTRING_CONTENT, ")", :expr_beg, 0, 0 assert_next_lexeme :tSTRING_END, ")", :expr_end, 0, 0 refute_lexeme end def test_yylex_paren_string_interpolated_regexp setup_lexer('%( #{(/abcd/)} )', s(:dstr, " ", s(:evstr, s(:lit, /abcd/)), s(:str, " "))) assert_next_lexeme :tSTRING_BEG, "%)", :expr_beg, 0, 0 assert_next_lexeme :tSTRING_CONTENT, " ", :expr_beg, 0, 0 assert_next_lexeme :tSTRING_DBEG, nil, :expr_beg, 0, 0 emulate_string_interpolation do assert_next_lexeme :tLPAREN, "(", :expr_beg, 1, 0 assert_next_lexeme :tREGEXP_BEG, "/", :expr_beg, 1, 0 assert_next_lexeme :tSTRING_CONTENT, "abcd", :expr_beg, 1, 0 assert_next_lexeme :tREGEXP_END, "", :expr_end, 1, 0 assert_next_lexeme :tRPAREN, ")", :expr_endfn, 0, 0 end assert_next_lexeme :tSTRING_CONTENT, " ", :expr_beg, 0, 0 assert_next_lexeme :tSTRING_END, ")", :expr_end, 0, 0 refute_lexeme end def test_yylex_not_at_defn assert_lex("def +@; end", s(:defn, :+@, s(:args), s(:nil)), :kDEF, "def", :expr_fname, 0, 0, :tUPLUS, "+@", :expr_arg, 0, 0, :tSEMI, ";", :expr_beg, 0, 0, :kEND, "end", :expr_end, 0, 0) assert_lex("def !@; end", s(:defn, :"!@", s(:args), s(:nil)), :kDEF, "def", :expr_fname, 0, 0, :tUBANG, "!@", :expr_arg, 0, 0, :tSEMI, ";", :expr_beg, 0, 0, :kEND, "end", :expr_end, 0, 0) end def test_yylex_not_at_ivar assert_lex("!@ivar", s(:call, s(:ivar, :@ivar), :"!"), :tBANG, "!", :expr_beg, 0, 0, :tIVAR, "@ivar", :expr_end, 0, 0) end def test_yylex_number_times_ident_times_return_number assert_lex("1 * b * 3", s(:call, s(:call, s(:lit, 1), :*, s(:call, nil, :b)), :*, s(:lit, 3)), :tINTEGER, 1, :expr_end, 0, 0, :tSTAR2, "*", :expr_beg, 0, 0, :tIDENTIFIER, "b", :expr_arg, 0, 0, :tSTAR2, "*", :expr_beg, 0, 0, :tINTEGER, 3, :expr_end, 0, 0) assert_lex("1 * b *\n 3", s(:call, s(:call, s(:lit, 1), :*, s(:call, nil, :b)), :*, s(:lit, 3)), :tINTEGER, 1, :expr_end, 0, 0, :tSTAR2, "*", :expr_beg, 0, 0, :tIDENTIFIER, "b", :expr_arg, 0, 0, :tSTAR2, "*", :expr_beg, 0, 0, :tINTEGER, 3, :expr_end, 0, 0) end def test_yylex_paren_string_parens_interpolated_regexp setup_lexer('%((#{(/abcd/)}))', s(:dstr, "(", s(:evstr, s(:lit, /abcd/)), s(:str, ")"))) assert_next_lexeme :tSTRING_BEG, "%)", :expr_beg, 0, 0 assert_next_lexeme :tSTRING_CONTENT, "(", :expr_beg, 0, 0 assert_next_lexeme :tSTRING_DBEG, nil, :expr_beg, 0, 0 emulate_string_interpolation do assert_next_lexeme :tLPAREN, "(", :expr_beg, 1, 0 assert_next_lexeme :tREGEXP_BEG, "/", :expr_beg, 1, 0 assert_next_lexeme :tSTRING_CONTENT, "abcd", :expr_beg, 1, 0 assert_next_lexeme :tREGEXP_END, "", :expr_end, 1, 0 assert_next_lexeme :tRPAREN, ")", :expr_endfn, 0, 0 end assert_next_lexeme :tSTRING_CONTENT, ")", :expr_beg, 0, 0 assert_next_lexeme :tSTRING_END, ")", :expr_end, 0, 0 refute_lexeme end def test_yylex_method_parens_chevron assert_lex("a()<<1", s(:call, s(:call, nil, :a), :<<, s(:lit, 1)), :tIDENTIFIER, "a", :expr_cmdarg, 0, 0, :tLPAREN2, "(", :expr_beg, 1, 0, :tRPAREN, ")", :expr_endfn, 0, 0, :tLSHFT, "<<" , :expr_beg, 0, 0, :tINTEGER, 1, :expr_end, 0, 0) end def test_yylex_lambda_args__20 setup_lexer_class Ruby20Parser assert_lex("-> (a) { }", s(:iter, s(:call, nil, :lambda), s(:args, :a)), :tLAMBDA, nil, :expr_endfn, 0, 0, :tLPAREN2, "(", :expr_beg, 1, 0, :tIDENTIFIER, "a", :expr_arg, 1, 0, :tRPAREN, ")", :expr_endfn, 0, 0, :tLCURLY, "{", :expr_beg, 0, 1, :tRCURLY, "}", :expr_endarg, 0, 0) end def test_yylex_lambda_args_opt__20 setup_lexer_class Ruby20Parser assert_lex("-> (a=nil) { }", s(:iter, s(:call, nil, :lambda), s(:args, s(:lasgn, :a, s(:nil)))), :tLAMBDA, nil, :expr_endfn, 0, 0, :tLPAREN2, "(", :expr_beg, 1, 0, :tIDENTIFIER, "a", :expr_arg, 1, 0, :tEQL, "=", :expr_beg, 1, 0, :kNIL, "nil", :expr_end, 1, 0, :tRPAREN, ")", :expr_endfn, 0, 0, :tLCURLY, "{", :expr_beg, 0, 1, :tRCURLY, "}", :expr_endarg, 0, 0) end def test_yylex_lambda_hash__20 setup_lexer_class Ruby20Parser assert_lex("-> (a={}) { }", s(:iter, s(:call, nil, :lambda), s(:args, s(:lasgn, :a, s(:hash)))), :tLAMBDA, nil, :expr_endfn, 0, 0, :tLPAREN2, "(", :expr_beg, 1, 0, :tIDENTIFIER, "a", :expr_arg, 1, 0, :tEQL, "=", :expr_beg, 1, 0, :tLBRACE, "{", :expr_beg, 1, 1, :tRCURLY, "}", :expr_endarg, 1, 0, :tRPAREN, ")", :expr_endfn, 0, 0, :tLCURLY, "{", :expr_beg, 0, 1, :tRCURLY, "}", :expr_endarg, 0, 0) end def test_yylex_iter_array_curly assert_lex("f :a, [:b] { |c, d| }", # yes, this is bad code s(:iter, s(:call, nil, :f, s(:lit, :a), s(:array, s(:lit, :b))), s(:args, :c, :d)), :tIDENTIFIER, "f", :expr_cmdarg, 0, 0, :tSYMBOL, "a", :expr_end, 0, 0, :tCOMMA, ",", :expr_beg, 0, 0, :tLBRACK, "[", :expr_beg, 1, 0, :tSYMBOL, "b", :expr_end, 1, 0, :tRBRACK, "]", :expr_endarg, 0, 0, :tLBRACE_ARG, "{", :expr_beg, 0, 1, :tPIPE, "|", :expr_beg, 0, 1, :tIDENTIFIER, "c", :expr_arg, 0, 1, :tCOMMA, ",", :expr_beg, 0, 1, :tIDENTIFIER, "d", :expr_arg, 0, 1, :tPIPE, "|", :expr_beg, 0, 1, :tRCURLY, "}", :expr_endarg, 0, 0) end def test_yylex_const_call_same_name assert_lex("X = a { }; b { f :c }", s(:block, s(:cdecl, :X, s(:iter, s(:call, nil, :a), s(:args))), s(:iter, s(:call, nil, :b), s(:args), s(:call, nil, :f, s(:lit, :c)))), :tCONSTANT, "X", :expr_cmdarg, 0, 0, :tEQL, "=", :expr_beg, 0, 0, :tIDENTIFIER, "a", :expr_arg, 0, 0, :tLCURLY, "{", :expr_beg, 0, 1, :tRCURLY, "}", :expr_endarg, 0, 0, :tSEMI, ";", :expr_beg, 0, 0, :tIDENTIFIER, "b", :expr_cmdarg, 0, 0, :tLCURLY, "{", :expr_beg, 0, 1, :tIDENTIFIER, "f", :expr_cmdarg, 0, 1, # different :tSYMBOL, "c", :expr_end, 0, 1, :tRCURLY, "}", :expr_endarg, 0, 0) assert_lex("X = a { }; b { X :c }", s(:block, s(:cdecl, :X, s(:iter, s(:call, nil, :a), s(:args))), s(:iter, s(:call, nil, :b), s(:args), s(:call, nil, :X, s(:lit, :c)))), :tCONSTANT, "X", :expr_cmdarg, 0, 0, :tEQL, "=", :expr_beg, 0, 0, :tIDENTIFIER, "a", :expr_arg, 0, 0, :tLCURLY, "{", :expr_beg, 0, 1, :tRCURLY, "}", :expr_endarg, 0, 0, :tSEMI, ";", :expr_beg, 0, 0, :tIDENTIFIER, "b", :expr_cmdarg, 0, 0, :tLCURLY, "{", :expr_beg, 0, 1, :tCONSTANT, "X", :expr_cmdarg, 0, 1, # same :tSYMBOL, "c", :expr_end, 0, 1, :tRCURLY, "}", :expr_endarg, 0, 0) end def test_yylex_lasgn_call_same_name assert_lex("a = b.c :d => 1", s(:lasgn, :a, s(:call, s(:call, nil, :b), :c, s(:hash, s(:lit, :d), s(:lit, 1)))), :tIDENTIFIER, "a", :expr_cmdarg, 0, 0, :tEQL, "=", :expr_beg, 0, 0, :tIDENTIFIER, "b", :expr_arg, 0, 0, :tDOT, ".", :expr_dot, 0, 0, :tIDENTIFIER, "c", :expr_arg, 0, 0, # different :tSYMBOL, "d", :expr_end, 0, 0, :tASSOC, "=>", :expr_beg, 0, 0, :tINTEGER, 1, :expr_end, 0, 0) assert_lex("a = b.a :d => 1", s(:lasgn, :a, s(:call, s(:call, nil, :b), :a, s(:hash, s(:lit, :d), s(:lit, 1)))), :tIDENTIFIER, "a", :expr_cmdarg, 0, 0, :tEQL, "=", :expr_beg, 0, 0, :tIDENTIFIER, "b", :expr_arg, 0, 0, :tDOT, ".", :expr_dot, 0, 0, :tIDENTIFIER, "a", :expr_arg, 0, 0, # same as lvar :tSYMBOL, "d", :expr_end, 0, 0, :tASSOC, "=>", :expr_beg, 0, 0, :tINTEGER, 1, :expr_end, 0, 0) end def test_yylex_back_ref util_lex_token("[$&, $`, $', $+]", :tLBRACK, "[", :tBACK_REF, :"&", :tCOMMA, ",", :tBACK_REF, :"`", :tCOMMA, ",", :tBACK_REF, :"'", :tCOMMA, ",", :tBACK_REF, :"+", :tRBRACK, "]") end def test_yylex_backslash util_lex_token("1 \\\n+ 2", :tINTEGER, 1, :tPLUS, "+", :tINTEGER, 2) end def test_yylex_backslash_bad util_bad_token("1 \\ + 2", :tINTEGER, 1) end def test_yylex_backtick util_lex_token("`ls`", :tXSTRING_BEG, "`", :tSTRING_CONTENT, "ls", :tSTRING_END, "`") end def test_yylex_backtick_cmdarg @lex.lex_state = :expr_dot util_lex_token("\n`", :tBACK_REF2, "`") # \n ensures expr_cmd assert_equal :expr_cmdarg, @lex.lex_state end def test_yylex_backtick_dot @lex.lex_state = :expr_dot util_lex_token("a.`(3)", :tIDENTIFIER, "a", :tDOT, ".", :tBACK_REF2, "`", :tLPAREN2, "(", :tINTEGER, 3, :tRPAREN, ")") end def test_yylex_backtick_method @lex.lex_state = :expr_fname util_lex_token("`", :tBACK_REF2, "`") assert_equal :expr_end, @lex.lex_state end def test_yylex_bad_char util_bad_token(" \010 ") end def test_yylex_bang util_lex_token "!", :tBANG, "!" end def test_yylex_bang_equals util_lex_token "!=", :tNEQ, "!=" end def test_yylex_bang_tilde util_lex_token "!~", :tNMATCH, "!~" end def test_yylex_carat util_lex_token "^", :tCARET, "^" end def test_yylex_carat_equals util_lex_token "^=", :tOP_ASGN, "^" end def test_yylex_colon2 util_lex_token("A::B", :tCONSTANT, "A", :tCOLON2, "::", :tCONSTANT, "B") end def test_yylex_colon3 util_lex_token("::Array", :tCOLON3, "::", :tCONSTANT, "Array") end def test_yylex_comma util_lex_token ",", :tCOMMA, "," end def test_yylex_comment util_lex_token("1 # one\n# two\n2", :tINTEGER, 1, :tNL, nil, :tINTEGER, 2) assert_equal "# one\n# two\n", @lex.comments end def test_yylex_comment_begin util_lex_token("=begin\nblah\nblah\n=end\n42", :tINTEGER, 42) assert_equal "=begin\nblah\nblah\n=end\n", @lex.comments end def test_yylex_comment_begin_bad util_bad_token("=begin\nblah\nblah\n") assert_equal "", @lex.comments end def test_yylex_comment_begin_not_comment util_lex_token("beginfoo = 5\np x \\\n=beginfoo", :tIDENTIFIER, "beginfoo", :tEQL, "=", :tINTEGER, 5, :tNL, nil, :tIDENTIFIER, "p", :tIDENTIFIER, "x", :tEQL, "=", :tIDENTIFIER, "beginfoo") end def test_yylex_comment_begin_space util_lex_token("=begin blah\nblah\n=end\n") assert_equal "=begin blah\nblah\n=end\n", @lex.comments end def test_yylex_comment_end_space_and_text util_lex_token("=begin blah\nblah\n=end blab\n") assert_equal "=begin blah\nblah\n=end blab\n", @lex.comments end def test_yylex_comment_eos util_lex_token("# comment") end def test_yylex_constant util_lex_token("ArgumentError", :tCONSTANT, "ArgumentError") end def test_yylex_constant_semi util_lex_token("ArgumentError;", :tCONSTANT, "ArgumentError", :tSEMI, ";") end def test_yylex_cvar util_lex_token "@@blah", :tCVAR, "@@blah" end def test_yylex_cvar_bad assert_raises RubyParser::SyntaxError do util_lex_token "@@1" end end def test_yylex_def_bad_name @lex.lex_state = :expr_fname util_bad_token("def [ ", :kDEF, "def") end def test_yylex_div util_lex_token("a / 2", :tIDENTIFIER, "a", :tDIVIDE, "/", :tINTEGER, 2) end def test_yylex_div_equals util_lex_token("a /= 2", :tIDENTIFIER, "a", :tOP_ASGN, "/", :tINTEGER, 2) end def test_yylex_do util_lex_token("x do 42 end", :tIDENTIFIER, "x", :kDO, "do", :tINTEGER, 42, :kEND, "end") end def test_yylex_do_block @lex.lex_state = :expr_endarg @lex.cmdarg.push true util_lex_token("x.y do 42 end", :tIDENTIFIER, "x", :tDOT, ".", :tIDENTIFIER, "y", :kDO_BLOCK, "do", :tINTEGER, 42, :kEND, "end") end def test_yylex_do_block2 @lex.lex_state = :expr_endarg util_lex_token("do 42 end", :kDO_BLOCK, "do", :tINTEGER, 42, :kEND, "end") end def test_yylex_do_cond @lex.cond.push true util_lex_token("x do 42 end", :tIDENTIFIER, "x", :kDO_COND, "do", :tINTEGER, 42, :kEND, "end") end def test_yylex_dollar util_lex_token("$", "$", "$") # FIX: wtf is this?!? end def test_yylex_dot # HINT message sends util_lex_token ".", :tDOT, "." end def test_yylex_dot2 util_lex_token "..", :tDOT2, ".." end def test_yylex_dot3 util_lex_token "...", :tDOT3, "..." end def test_yylex_equals util_lex_token "=", :tEQL, "=" # FIX: this sucks end def test_yylex_equals2 util_lex_token "==", :tEQ, "==" end def test_yylex_equals3 util_lex_token "===", :tEQQ, "===" end def test_yylex_equals_tilde util_lex_token "=~", :tMATCH, "=~" end def test_yylex_float util_lex_token "1.0", :tFLOAT, 1.0 end def test_yylex_float_bad_no_underscores util_bad_token "1__0.0" end def test_yylex_float_bad_no_zero_leading util_bad_token ".0" end def test_yylex_float_bad_trailing_underscore util_bad_token "123_.0" end def test_yylex_float_call util_lex_token("1.0.to_s", :tFLOAT, 1.0, :tDOT, ".", :tIDENTIFIER, "to_s") end def test_yylex_float_dot_E util_lex_token "1.0E10", :tFLOAT, 1.0e10 end def test_yylex_float_dot_E_neg util_lex_token("-1.0E10", :tUMINUS_NUM, "-", :tFLOAT, 1.0e10) end def test_yylex_float_dot_e util_lex_token "1.0e10", :tFLOAT, 1.0e10 end def test_yylex_float_dot_e_neg util_lex_token("-1.0e10", :tUMINUS_NUM, "-", :tFLOAT, 1.0e10) end def test_yylex_float_e util_lex_token "1e10", :tFLOAT, 1e10 end def test_yylex_float_e_bad_double_e util_bad_token "1e2e3" end def test_yylex_float_e_bad_trailing_underscore util_bad_token "123_e10" end def test_yylex_float_e_minus util_lex_token "1e-10", :tFLOAT, 1e-10 end def test_yylex_float_e_neg util_lex_token("-1e10", :tUMINUS_NUM, "-", :tFLOAT, 1e10) end def test_yylex_float_e_neg_minus util_lex_token("-1e-10", :tUMINUS_NUM, "-", :tFLOAT, 1e-10) end def test_yylex_float_e_neg_plus util_lex_token("-1e+10", :tUMINUS_NUM, "-", :tFLOAT, 1e10) end def test_yylex_float_e_plus util_lex_token "1e+10", :tFLOAT, 1e10 end def test_yylex_float_e_zero util_lex_token "0e0", :tFLOAT, 0e0 end def test_yylex_float_neg util_lex_token("-1.0", :tUMINUS_NUM, "-", :tFLOAT, 1.0) end def test_yylex_ge util_lex_token("a >= 2", :tIDENTIFIER, "a", :tGEQ, ">=", :tINTEGER, 2) end def test_yylex_global util_lex_token("$blah", :tGVAR, "$blah") end def test_yylex_global_backref @lex.lex_state = :expr_fname util_lex_token("$`", :tGVAR, "$`") end def test_yylex_global_dash_nothing util_lex_token("$- ", :tGVAR, "$-") end def test_yylex_global_dash_something util_lex_token("$-x", :tGVAR, "$-x") end def test_yylex_global_number @lex.lex_state = :expr_fname util_lex_token("$1", :tGVAR, "$1") end def test_yylex_global_number_big @lex.lex_state = :expr_fname util_lex_token("$1234", :tGVAR, "$1234") end def test_yylex_global_other util_lex_token("[$~, $*, $$, $?, $!, $@, $/, $\\, $;, $,, $., $=, $:, $<, $>, $\"]", :tLBRACK, "[", :tGVAR, "$~", :tCOMMA, ",", :tGVAR, "$*", :tCOMMA, ",", :tGVAR, "$$", :tCOMMA, ",", :tGVAR, "$\?", :tCOMMA, ",", :tGVAR, "$!", :tCOMMA, ",", :tGVAR, "$@", :tCOMMA, ",", :tGVAR, "$/", :tCOMMA, ",", :tGVAR, "$\\", :tCOMMA, ",", :tGVAR, "$;", :tCOMMA, ",", :tGVAR, "$,", :tCOMMA, ",", :tGVAR, "$.", :tCOMMA, ",", :tGVAR, "$=", :tCOMMA, ",", :tGVAR, "$:", :tCOMMA, ",", :tGVAR, "$<", :tCOMMA, ",", :tGVAR, "$>", :tCOMMA, ",", :tGVAR, "$\"", :tRBRACK, "]") end def test_yylex_global_underscore util_lex_token("$_", :tGVAR, "$_") end def test_yylex_global_wierd util_lex_token("$__blah", :tGVAR, "$__blah") end def test_yylex_global_zero util_lex_token("$0", :tGVAR, "$0") end def test_yylex_gt util_lex_token("a > 2", :tIDENTIFIER, "a", :tGT, ">", :tINTEGER, 2) end def test_yylex_heredoc_backtick util_lex_token("a = <<`EOF`\n blah blah\nEOF\n", :tIDENTIFIER, "a", :tEQL, "=", :tXSTRING_BEG, "`", :tSTRING_CONTENT, " blah blah\n", :tSTRING_END, "EOF", :tNL, nil) end def test_yylex_heredoc_double util_lex_token("a = <<\"EOF\"\n blah blah\nEOF\n", :tIDENTIFIER, "a", :tEQL, "=", :tSTRING_BEG, "\"", :tSTRING_CONTENT, " blah blah\n", :tSTRING_END, "EOF", :tNL, nil) end def test_yylex_heredoc_double_dash util_lex_token("a = <<-\"EOF\"\n blah blah\n EOF\n", :tIDENTIFIER, "a", :tEQL, "=", :tSTRING_BEG, "\"", :tSTRING_CONTENT, " blah blah\n", :tSTRING_END, "EOF", :tNL, nil) end def test_yylex_heredoc_double_eos util_bad_token("a = <<\"EOF\"\nblah", :tIDENTIFIER, "a", :tEQL, "=", :tSTRING_BEG, "\"") end def test_yylex_heredoc_double_eos_nl util_bad_token("a = <<\"EOF\"\nblah\n", :tIDENTIFIER, "a", :tEQL, "=", :tSTRING_BEG, "\"") end def test_yylex_heredoc_double_interp # TODO: convert to assert_lex util_lex_token("a = <<\"EOF\"\n#x a \#@a b \#$b c \#{3} \nEOF\n", :tIDENTIFIER, "a", :tEQL, "=", :tSTRING_BEG, "\"", :tSTRING_CONTENT, "#x a ", :tSTRING_DVAR, "\#@", :tSTRING_CONTENT, "@a b ", # HUH? :tSTRING_DVAR, "\#$", :tSTRING_CONTENT, "$b c ", # HUH? :tSTRING_DBEG, "\#{", :tSTRING_CONTENT, "3} \n", # HUH? :tSTRING_END, "EOF", :tNL, nil) end def test_yylex_heredoc_empty util_lex_token("<<\"\"\n\#{x}\nblah2\n\n", :tSTRING_BEG, "\"", :tSTRING_DBEG, "\#{", :tSTRING_CONTENT, "x}\nblah2\n", :tSTRING_END, "", :tNL, nil) end def test_yylex_heredoc_none util_lex_token("a = <", :tCMP end def test_yylex_identifier_def__18 setup_lexer_class Ruby18Parser util_lex_fname "identifier", :tIDENTIFIER, :expr_end end def test_yylex_identifier_def__1920 setup_lexer_class Ruby19Parser util_lex_fname "identifier", :tIDENTIFIER, :expr_endfn end def test_yylex_identifier_eh util_lex_token("identifier?", :tFID, "identifier?") end def test_yylex_identifier_equals_arrow @lex.lex_state = :expr_fname util_lex_token(":blah==>", :tSYMBOL, "blah=", :tASSOC, "=>") end def test_yylex_identifier_equals3 # @lex.lex_state = :expr_fname util_lex_token(":a===b", :tSYMBOL, "a", :tEQQ, "===", :tIDENTIFIER, "b") end def test_yylex_identifier_equals_equals_arrow # @lex.lex_state = :expr_fname util_lex_token(":a==>b", :tSYMBOL, "a=", :tASSOC, "=>", :tIDENTIFIER, "b") end def test_yylex_identifier_equals_caret util_lex_fname "^", :tCARET end def test_yylex_identifier_equals_def__18 setup_lexer_class Ruby18Parser util_lex_fname "identifier=", :tIDENTIFIER, :expr_end end def test_yylex_identifier_equals_def__1920 setup_lexer_class Ruby19Parser util_lex_fname "identifier=", :tIDENTIFIER, :expr_endfn end def test_yylex_identifier_equals_def2 util_lex_fname "==", :tEQ end def test_yylex_identifier_equals_expr @lex.lex_state = :expr_dot util_lex_token("y = arg", :tIDENTIFIER, "y", :tEQL, "=", :tIDENTIFIER, "arg") assert_equal :expr_arg, @lex.lex_state end def test_yylex_identifier_equals_or util_lex_fname "|", :tPIPE end def test_yylex_identifier_equals_slash util_lex_fname "/", :tDIVIDE end def test_yylex_identifier_equals_tilde @lex.lex_state = :expr_fname # can only set via parser's defs util_lex_token("identifier=~", :tIDENTIFIER, "identifier", :tMATCH, "=~") end def test_yylex_identifier_gt util_lex_fname ">", :tGT end def test_yylex_identifier_le util_lex_fname "<=", :tLEQ end def test_yylex_identifier_lt util_lex_fname "<", :tLT end def test_yylex_identifier_tilde util_lex_fname "~", :tTILDE end def test_yylex_index util_lex_fname "[]", :tAREF end def test_yylex_index_equals util_lex_fname "[]=", :tASET end def test_yylex_integer util_lex_token "42", :tINTEGER, 42 end def test_yylex_integer_bin util_lex_token "0b101010", :tINTEGER, 42 end def test_yylex_integer_bin_bad_none util_bad_token "0b " end def test_yylex_integer_bin_bad_underscores util_bad_token "0b10__01" end def test_yylex_integer_dec util_lex_token "42", :tINTEGER, 42 end def test_yylex_integer_dec_bad_underscores util_bad_token "42__24" end def test_yylex_integer_dec_d util_lex_token "0d42", :tINTEGER, 42 end def test_yylex_integer_dec_d_bad_none util_bad_token "0d" end def test_yylex_integer_dec_d_bad_underscores util_bad_token "0d42__24" end def test_yylex_question_eh_a__18 setup_lexer_class Ruby18Parser util_lex_token "?a", :tINTEGER, 97 end def test_yylex_question_eh_a__19 setup_lexer_class Ruby19Parser util_lex_token '?a', :tSTRING, "a" end def test_yylex_question_eh_escape_M_escape_C__18 setup_lexer_class Ruby18Parser util_lex_token '?\M-\C-a', :tINTEGER, 129 end def test_yylex_question_eh_escape_M_escape_C__19 setup_lexer_class Ruby19Parser util_lex_token '?\M-\C-a', :tSTRING, "\M-\C-a" end def test_yylex_integer_hex util_lex_token "0x2a", :tINTEGER, 42 end def test_yylex_integer_hex_bad_none util_bad_token "0x " end def test_yylex_integer_hex_bad_underscores util_bad_token "0xab__cd" end def test_yylex_integer_oct util_lex_token "052", :tINTEGER, 42 end def test_yylex_integer_oct_bad_range util_bad_token "08" end def test_yylex_integer_oct_bad_range2 util_bad_token "08" end def test_yylex_integer_oct_bad_underscores util_bad_token "01__23" end def test_yylex_integer_oct_O util_lex_token "0O52", :tINTEGER, 42 end def test_yylex_integer_oct_O_bad_range util_bad_token "0O8" end def test_yylex_integer_oct_O_bad_underscores util_bad_token "0O1__23" end def test_yylex_integer_oct_O_not_bad_none util_lex_token "0O ", :tINTEGER, 0 end def test_yylex_integer_oct_o util_lex_token "0o52", :tINTEGER, 42 end def test_yylex_integer_oct_o_bad_range util_bad_token "0o8" end def test_yylex_integer_oct_o_bad_underscores util_bad_token "0o1__23" end def test_yylex_integer_oct_o_not_bad_none util_lex_token "0o ", :tINTEGER, 0 end def test_yylex_integer_trailing util_lex_token("1.to_s", :tINTEGER, 1, :tDOT, '.', :tIDENTIFIER, 'to_s') end def test_yylex_integer_underscore util_lex_token "4_2", :tINTEGER, 42 end def test_yylex_integer_underscore_bad util_bad_token "4__2" end def test_yylex_integer_zero util_lex_token "0", :tINTEGER, 0 end def test_yylex_ivar util_lex_token "@blah", :tIVAR, "@blah" end def test_yylex_ivar_bad util_bad_token "@1" end def test_yylex_ivar_bad_0_length util_bad_token "1+@\n", :tINTEGER, 1, :tPLUS, "+" end def test_yylex_keyword_expr @lex.lex_state = :expr_endarg util_lex_token("if", :kIF_MOD, "if") assert_equal :expr_beg, @lex.lex_state end def test_yylex_lt util_lex_token "<", :tLT, "<" end def test_yylex_lt2 util_lex_token("a <\< b", :tIDENTIFIER, "a", :tLSHFT, "<\<", :tIDENTIFIER, "b") end def test_yylex_lt2_equals util_lex_token("a <\<= b", :tIDENTIFIER, "a", :tOP_ASGN, "<\<", :tIDENTIFIER, "b") end def test_yylex_lt_equals util_lex_token "<=", :tLEQ, "<=" end def test_yylex_minus util_lex_token("1 - 2", :tINTEGER, 1, :tMINUS, "-", :tINTEGER, 2) end def test_yylex_minus_equals util_lex_token "-=", :tOP_ASGN, "-" end def test_yylex_minus_method @lex.lex_state = :expr_fname util_lex_token "-", :tMINUS, "-" end def test_yylex_minus_unary_method @lex.lex_state = :expr_fname util_lex_token "-@", :tUMINUS, "-@" end def test_yylex_minus_unary_number util_lex_token("-42", :tUMINUS_NUM, "-", :tINTEGER, 42) end def test_yylex_nth_ref util_lex_token('[$1, $2, $3, $4, $5, $6, $7, $8, $9]', :tLBRACK, "[", :tNTH_REF, 1, :tCOMMA, ",", :tNTH_REF, 2, :tCOMMA, ",", :tNTH_REF, 3, :tCOMMA, ",", :tNTH_REF, 4, :tCOMMA, ",", :tNTH_REF, 5, :tCOMMA, ",", :tNTH_REF, 6, :tCOMMA, ",", :tNTH_REF, 7, :tCOMMA, ",", :tNTH_REF, 8, :tCOMMA, ",", :tNTH_REF, 9, :tRBRACK, "]") end def test_yylex_open_bracket util_lex_token("(", :tLPAREN, "(") end def test_yylex_open_bracket_cmdarg @lex.lex_state = :expr_cmdarg util_lex_token(" (", :tLPAREN_ARG, "(") end def test_yylex_open_bracket_exprarg__18 setup_lexer_class Ruby18Parser @lex.lex_state = :expr_arg util_lex_token(" (", :tLPAREN2, "(") end def test_yylex_open_bracket_exprarg__19 setup_lexer_class Ruby19Parser @lex.lex_state = :expr_arg util_lex_token(" (", :tLPAREN_ARG, "(") end def test_yylex_open_curly_bracket util_lex_token("{", :tLBRACE, "{") end def test_yylex_open_curly_bracket_arg @lex.lex_state = :expr_arg util_lex_token("m { 3 }", :tIDENTIFIER, "m", :tLCURLY, "{", :tINTEGER, 3, :tRCURLY, "}") end def test_yylex_open_curly_bracket_block @lex.lex_state = :expr_endarg # seen m(3) util_lex_token("{ 4 }", :tLBRACE_ARG, "{", :tINTEGER, 4, :tRCURLY, "}") end def test_yylex_open_square_bracket_arg @lex.lex_state = :expr_arg util_lex_token("m [ 3 ]", :tIDENTIFIER, "m", :tLBRACK, "[", :tINTEGER, 3, :tRBRACK, "]") end def test_yylex_open_square_bracket_ary util_lex_token("[1, 2, 3]", :tLBRACK, "[", :tINTEGER, 1, :tCOMMA, ",", :tINTEGER, 2, :tCOMMA, ",", :tINTEGER, 3, :tRBRACK, "]") end def test_yylex_open_square_bracket_meth util_lex_token("m[3]", :tIDENTIFIER, "m", :tLBRACK2, "[", :tINTEGER, 3, :tRBRACK, "]") end def test_yylex_or util_lex_token "|", :tPIPE, "|" end def test_yylex_or2 util_lex_token "||", :tOROP, "||" end def test_yylex_or2_equals util_lex_token "||=", :tOP_ASGN, "||" end def test_yylex_or_equals util_lex_token "|=", :tOP_ASGN, "|" end def test_yylex_percent util_lex_token("a % 2", :tIDENTIFIER, "a", :tPERCENT, "%", :tINTEGER, 2) end def test_yylex_percent_equals util_lex_token("a %= 2", :tIDENTIFIER, "a", :tOP_ASGN, "%", :tINTEGER, 2) end def test_yylex_plus util_lex_token("1 + 1", # TODO lex_state? :tINTEGER, 1, :tPLUS, "+", :tINTEGER, 1) end def test_yylex_plus_equals util_lex_token "+=", :tOP_ASGN, "+" end def test_yylex_plus_method @lex.lex_state = :expr_fname util_lex_token "+", :tPLUS, "+" end def test_yylex_plus_unary_method @lex.lex_state = :expr_fname util_lex_token "+@", :tUPLUS, "+@" end def test_yylex_not_unary_method skip "not yet" @lex.lex_state = :expr_fname util_lex_token "!@", :tUBANG, "!@" end def test_yylex_numbers util_lex_token "0b10", :tINTEGER, 2 util_lex_token "0B10", :tINTEGER, 2 util_lex_token "0d10", :tINTEGER, 10 util_lex_token "0D10", :tINTEGER, 10 util_lex_token "0x10", :tINTEGER, 16 util_lex_token "0X10", :tINTEGER, 16 util_lex_token "0o10", :tINTEGER, 8 util_lex_token "0O10", :tINTEGER, 8 util_lex_token "0o", :tINTEGER, 0 util_lex_token "0O", :tINTEGER, 0 util_lex_token "0o", :tINTEGER, 0 util_lex_token "0O", :tINTEGER, 0 util_lex_token "0", :tINTEGER, 0 util_bad_token "0x" util_bad_token "0X" util_bad_token "0b" util_bad_token "0B" util_bad_token "0d" util_bad_token "0D" util_bad_token "08" util_bad_token "09" util_bad_token "0o8" util_bad_token "0o9" util_bad_token "0O8" util_bad_token "0O9" util_bad_token "1_e1" util_bad_token "1_.1" util_bad_token "1__1" end def test_yylex_plus_unary_number util_lex_token("+42", :tINTEGER, 42) end def test_yylex_question__18 setup_lexer_class Ruby18Parser util_lex_token "?*", :tINTEGER, 42 end def test_yylex_question__19 setup_lexer_class Ruby19Parser util_lex_token "?*", :tSTRING, "*" end def test_yylex_question_bad_eos util_bad_token "?" end def test_yylex_question_ws util_lex_token "? ", :tEH, "?" util_lex_token "?\n", :tEH, "?" util_lex_token "?\t", :tEH, "?" util_lex_token "?\v", :tEH, "?" util_lex_token "?\r", :tEH, "?" util_lex_token "?\f", :tEH, "?" end def test_yylex_question_ws_backslashed__18 setup_lexer_class Ruby18Parser @lex.lex_state = :expr_beg util_lex_token "?\\ ", :tINTEGER, 32 @lex.lex_state = :expr_beg util_lex_token "?\\n", :tINTEGER, 10 @lex.lex_state = :expr_beg util_lex_token "?\\t", :tINTEGER, 9 @lex.lex_state = :expr_beg util_lex_token "?\\v", :tINTEGER, 11 @lex.lex_state = :expr_beg util_lex_token "?\\r", :tINTEGER, 13 @lex.lex_state = :expr_beg util_lex_token "?\\f", :tINTEGER, 12 end def test_yylex_question_ws_backslashed__19 setup_lexer_class Ruby19Parser @lex.lex_state = :expr_beg util_lex_token "?\\ ", :tSTRING, " " @lex.lex_state = :expr_beg util_lex_token "?\\n", :tSTRING, "\n" @lex.lex_state = :expr_beg util_lex_token "?\\t", :tSTRING, "\t" @lex.lex_state = :expr_beg util_lex_token "?\\v", :tSTRING, "\v" @lex.lex_state = :expr_beg util_lex_token "?\\r", :tSTRING, "\r" @lex.lex_state = :expr_beg util_lex_token "?\\f", :tSTRING, "\f" end def test_yylex_rbracket util_lex_token "]", :tRBRACK, "]" end def test_yylex_rcurly util_lex_token "}", :tRCURLY, "}" end def test_yylex_regexp util_lex_token("/regexp/", :tREGEXP_BEG, "/", :tSTRING_CONTENT, "regexp", :tREGEXP_END, "") end def test_yylex_regexp_ambiguous util_lex_token("method /regexp/", :tIDENTIFIER, "method", :tREGEXP_BEG, "/", :tSTRING_CONTENT, "regexp", :tREGEXP_END, "") end def test_yylex_regexp_bad util_bad_token("/.*/xyz", :tREGEXP_BEG, "/", :tSTRING_CONTENT, ".*") end def test_yylex_regexp_escape_C util_lex_token('/regex\\C-x/', :tREGEXP_BEG, "/", :tSTRING_CONTENT, "regex\\C-x", :tREGEXP_END, "") end def test_yylex_regexp_escape_C_M util_lex_token('/regex\\C-\\M-x/', :tREGEXP_BEG, "/", :tSTRING_CONTENT, "regex\\C-\\M-x", :tREGEXP_END, "") end def test_yylex_regexp_escape_C_M_craaaazy util_lex_token("/regex\\C-\\\n\\M-x/", :tREGEXP_BEG, "/", :tSTRING_CONTENT, "regex\\C-\\M-x", :tREGEXP_END, "") end def test_yylex_regexp_escape_C_bad_dash util_bad_token '/regex\\Cx/', :tREGEXP_BEG, "/" end def test_yylex_regexp_escape_C_bad_dash_eos util_bad_token '/regex\\C-/', :tREGEXP_BEG, "/" end def test_yylex_regexp_escape_C_bad_dash_eos2 util_bad_token '/regex\\C-', :tREGEXP_BEG, "/" end def test_yylex_regexp_escape_C_bad_eos util_bad_token '/regex\\C/', :tREGEXP_BEG, "/" end def test_yylex_regexp_escape_C_bad_eos2 util_bad_token '/regex\\c', :tREGEXP_BEG, "/" end def test_yylex_regexp_escape_M util_lex_token('/regex\\M-x/', :tREGEXP_BEG, "/", :tSTRING_CONTENT, "regex\\M-x", :tREGEXP_END, "") end def test_yylex_regexp_escape_M_C util_lex_token('/regex\\M-\\C-x/', :tREGEXP_BEG, "/", :tSTRING_CONTENT, "regex\\M-\\C-x", :tREGEXP_END, "") end def test_yylex_regexp_escape_M_bad_dash util_bad_token '/regex\\Mx/', :tREGEXP_BEG, "/" end def test_yylex_regexp_escape_M_bad_dash_eos util_bad_token '/regex\\M-/', :tREGEXP_BEG, "/" end def test_yylex_regexp_escape_M_bad_dash_eos2 util_bad_token '/regex\\M-', :tREGEXP_BEG, "/" end def test_yylex_regexp_escape_M_bad_eos util_bad_token '/regex\\M/', :tREGEXP_BEG, "/" end def test_yylex_regexp_escape_backslash_slash util_lex_token('/\\//', :tREGEXP_BEG, "/", :tSTRING_CONTENT, '\\/', :tREGEXP_END, "") end def test_yylex_regexp_escape_backslash_terminator util_lex_token('%r%blah\\%blah%', :tREGEXP_BEG, "%r\000", # FIX ?!? :tSTRING_CONTENT, "blah\\%blah", :tREGEXP_END, "") end def test_yylex_regexp_escape_backslash_terminator_meta1 util_lex_token('%r{blah\\}blah}', :tREGEXP_BEG, "%r{", # FIX ?!? :tSTRING_CONTENT, "blah\\}blah", :tREGEXP_END, "") end def test_yylex_regexp_escape_backslash_terminator_meta2 util_lex_token('%r/blah\\/blah/', :tREGEXP_BEG, "%r\000", # FIX ?!? :tSTRING_CONTENT, "blah\\/blah", :tREGEXP_END, "") end def test_yylex_regexp_escape_backslash_terminator_meta3 util_lex_token('%r/blah\\%blah/', :tREGEXP_BEG, "%r\000", # FIX ?!? :tSTRING_CONTENT, "blah\\%blah", :tREGEXP_END, "") end def test_yylex_regexp_escape_bad_eos util_bad_token '/regex\\', :tREGEXP_BEG, "/" end def test_yylex_regexp_escape_bs util_lex_token('/regex\\\\regex/', :tREGEXP_BEG, "/", :tSTRING_CONTENT, "regex\\\\regex", :tREGEXP_END, "") end def test_yylex_regexp_escape_c util_lex_token('/regex\\cxxx/', :tREGEXP_BEG, "/", :tSTRING_CONTENT, "regex\\cxxx", :tREGEXP_END, "") end def test_yylex_regexp_escape_c_backslash util_lex_token('/regex\\c\\n/', :tREGEXP_BEG, "/", :tSTRING_CONTENT, "regex\\c\\n", :tREGEXP_END, "") end def test_yylex_regexp_escape_chars util_lex_token('/re\\tge\\nxp/', :tREGEXP_BEG, "/", :tSTRING_CONTENT, "re\\tge\\nxp", :tREGEXP_END, "") end def test_yylex_regexp_escape_double_backslash regexp = '/[\\/\\\\]$/' util_lex_token(regexp, :tREGEXP_BEG, "/", :tSTRING_CONTENT, regexp[1..-2], :tREGEXP_END, "") end def test_yylex_regexp_escape_hex util_lex_token('/regex\\x61xp/', :tREGEXP_BEG, "/", :tSTRING_CONTENT, "regex\\x61xp", :tREGEXP_END, "") end def test_yylex_regexp_escape_hex_bad util_bad_token '/regex\\xzxp/', :tREGEXP_BEG, "/" end def test_yylex_regexp_escape_hex_one util_lex_token('/^[\\xd\\xa]{2}/on', :tREGEXP_BEG, '/', :tSTRING_CONTENT, '^[\\xd\\xa]{2}', :tREGEXP_END, 'on') end def test_yylex_regexp_escape_oct1 util_lex_token('/regex\\0xp/', :tREGEXP_BEG, "/", :tSTRING_CONTENT, "regex\\0xp", :tREGEXP_END, "") end def test_yylex_regexp_escape_oct2 util_lex_token('/regex\\07xp/', :tREGEXP_BEG, "/", :tSTRING_CONTENT, "regex\\07xp", :tREGEXP_END, "") end def test_yylex_regexp_escape_oct3 util_lex_token('/regex\\10142/', :tREGEXP_BEG, "/", :tSTRING_CONTENT, "regex\\10142", :tREGEXP_END, "") end def test_yylex_regexp_escape_return util_lex_token("/regex\\\nregex/", :tREGEXP_BEG, "/", :tSTRING_CONTENT, "regexregex", :tREGEXP_END, "") end def test_yylex_regexp_nm util_lex_token("/.*/nm", :tREGEXP_BEG, "/", :tSTRING_CONTENT, ".*", :tREGEXP_END, "nm") end def test_yylex_rparen util_lex_token ")", :tRPAREN, ")" end def test_yylex_rshft util_lex_token("a >> 2", :tIDENTIFIER, "a", :tRSHFT, ">>", :tINTEGER, 2) end def test_yylex_rshft_equals util_lex_token("a >>= 2", :tIDENTIFIER, "a", :tOP_ASGN, ">>", :tINTEGER, 2) end def test_yylex_star util_lex_token("a * ", :tIDENTIFIER, "a", :tSTAR2, "*") assert_equal :expr_beg, @lex.lex_state end def test_yylex_star2 util_lex_token("a ** ", :tIDENTIFIER, "a", :tPOW, "**") assert_equal :expr_beg, @lex.lex_state end def test_yylex_star2_equals util_lex_token("a **= ", :tIDENTIFIER, "a", :tOP_ASGN, "**") assert_equal :expr_beg, @lex.lex_state end def test_yylex_star_arg @lex.lex_state = :expr_arg util_lex_token(" *a", :tSTAR, "*", :tIDENTIFIER, "a") assert_equal :expr_arg, @lex.lex_state end def test_yylex_star_arg_beg @lex.lex_state = :expr_beg util_lex_token("*a", :tSTAR, "*", :tIDENTIFIER, "a") assert_equal :expr_arg, @lex.lex_state end def test_yylex_star_arg_beg_fname @lex.lex_state = :expr_fname util_lex_token("*a", :tSTAR2, "*", :tIDENTIFIER, "a") assert_equal :expr_arg, @lex.lex_state end def test_yylex_star_equals util_lex_token("a *= ", :tIDENTIFIER, "a", :tOP_ASGN, "*") assert_equal :expr_beg, @lex.lex_state end def test_yylex_string_bad_eos util_bad_token('%', :tSTRING_BEG, '%') end def test_yylex_string_bad_eos_quote util_bad_token('%{nest', :tSTRING_BEG, '%}') end def test_yylex_string_double util_lex_token('"string"', :tSTRING, "string") end def test_yylex_string_double_escape_C util_lex_token('"\\C-a"', :tSTRING, "\001") end def test_yylex_string_double_escape_C_backslash util_lex_token('"\\C-\\\\"', :tSTRING_BEG, "\"", :tSTRING_CONTENT, "\034", :tSTRING_END, "\"") end def test_yylex_string_double_escape_C_escape util_lex_token('"\\C-\\M-a"', :tSTRING_BEG, "\"", :tSTRING_CONTENT, "\201", :tSTRING_END, "\"") end def test_yylex_string_double_escape_C_question util_lex_token('"\\C-?"', :tSTRING, "\177") end def test_yylex_string_double_escape_M chr = "\341" chr.force_encoding("UTF-8") if RubyLexer::RUBY19 util_lex_token('"\\M-a"', :tSTRING, chr) end def test_why_does_ruby_hate_me? util_lex_token('"Nl%\000\000A\000\999"', # you should be ashamed :tSTRING, ["Nl%", "\x00", "\x00", "A", "\x00", "999"].join) end def test_yylex_string_double_escape_M_backslash util_lex_token('"\\M-\\\\"', :tSTRING_BEG, "\"", :tSTRING_CONTENT, "\334", :tSTRING_END, "\"") end def test_yylex_string_double_escape_M_escape util_lex_token('"\\M-\\C-a"', :tSTRING_BEG, "\"", :tSTRING_CONTENT, "\201", :tSTRING_END, "\"") end def test_yylex_string_double_escape_bs1 util_lex_token('"a\\a\\a"', :tSTRING, "a\a\a") end def test_yylex_string_double_escape_bs2 util_lex_token('"a\\\\a"', :tSTRING, "a\\a") end def test_yylex_string_double_escape_c util_lex_token('"\\ca"', :tSTRING, "\001") end def test_yylex_string_double_escape_c_backslash util_lex_token('"\\c\\"', :tSTRING_BEG, "\"", :tSTRING_CONTENT, "\034", :tSTRING_END, "\"") end def test_yylex_string_double_escape_c_escape util_lex_token('"\\c\\M-a"', :tSTRING_BEG, "\"", :tSTRING_CONTENT, "\201", :tSTRING_END, "\"") end def test_yylex_string_double_escape_c_question util_lex_token('"\\c?"', :tSTRING, "\177") end def test_yylex_string_double_escape_chars util_lex_token('"s\\tri\\ng"', :tSTRING, "s\tri\ng") end def test_yylex_string_double_escape_hex util_lex_token('"n = \\x61\\x62\\x63"', :tSTRING, "n = abc") end def test_yylex_string_double_escape_octal util_lex_token('"n = \\101\\102\\103"', :tSTRING, "n = ABC") end def test_yylex_string_double_escape_octal_fucked util_lex_token('"n = \\444"', :tSTRING, "n = $") end def test_yylex_string_double_interp util_lex_token("\"blah #x a \#@a b \#$b c \#{3} # \"", :tSTRING_BEG, "\"", :tSTRING_CONTENT, "blah #x a ", :tSTRING_DVAR, nil, :tSTRING_CONTENT, "@a b ", :tSTRING_DVAR, nil, :tSTRING_CONTENT, "$b c ", :tSTRING_DBEG, nil, :tSTRING_CONTENT, "3} # ", :tSTRING_END, "\"") end def test_yylex_string_double_nested_curlies util_lex_token('%{nest{one{two}one}nest}', :tSTRING_BEG, '%}', :tSTRING_CONTENT, "nest{one{two}one}nest", :tSTRING_END, '}') end def test_yylex_string_double_no_interp util_lex_token("\"# blah\"", # pound first :tSTRING, "# blah") util_lex_token("\"blah # blah\"", # pound not first :tSTRING, "blah # blah") end def test_yylex_string_escape_x_single util_lex_token('"\\x0"', :tSTRING, "\000") end def test_yylex_string_pct_i util_lex_token("%i[s1 s2\ns3]", :tQSYMBOLS_BEG, "%i[", :tSTRING_CONTENT, "s1", :tSPACE, nil, :tSTRING_CONTENT, "s2", :tSPACE, nil, :tSTRING_CONTENT, "s3", :tSPACE, nil, :tSTRING_END, nil) end def test_yylex_string_pct_I util_lex_token("%I[s1 s2\ns3]", :tSYMBOLS_BEG, "%I[", :tSTRING_CONTENT, "s1", :tSPACE, nil, :tSTRING_CONTENT, "s2", :tSPACE, nil, :tSTRING_CONTENT, "s3", :tSPACE, nil, :tSTRING_END, nil) end def test_yylex_string_pct_Q util_lex_token("%Q[s1 s2]", :tSTRING_BEG, "%Q[", :tSTRING_CONTENT, "s1 s2", :tSTRING_END, "]") end def test_yylex_string_pct_W util_lex_token("%W[s1 s2\ns3]", # TODO: add interpolation to these :tWORDS_BEG, "%W[", :tSTRING_CONTENT, "s1", :tSPACE, nil, :tSTRING_CONTENT, "s2", :tSPACE, nil, :tSTRING_CONTENT, "s3", :tSPACE, nil, :tSTRING_END, nil) end def test_yylex_string_pct_W_bs_nl util_lex_token("%W[s1 \\\ns2]", # TODO: add interpolation to these :tWORDS_BEG, "%W[", :tSTRING_CONTENT, "s1", :tSPACE, nil, :tSTRING_CONTENT, "\ns2", :tSPACE, nil, :tSTRING_END, nil) end def test_yylex_string_pct_angle util_lex_token("%", :tSTRING_BEG, "%>", :tSTRING_CONTENT, "blah", :tSTRING_END, ">") end def test_yylex_string_pct_other util_lex_token("%%blah%", :tSTRING_BEG, "%%", :tSTRING_CONTENT, "blah", :tSTRING_END, "%") end def test_yylex_string_pct_w util_bad_token("%w[s1 s2 ", :tQWORDS_BEG, "%w[", :tSTRING_CONTENT, "s1", :tSPACE, nil, :tSTRING_CONTENT, "s2", :tSPACE, nil) end def test_yylex_string_pct_w_bs_nl util_lex_token("%w[s1 \\\ns2]", :tQWORDS_BEG, "%w[", :tSTRING_CONTENT, "s1", :tSPACE, nil, :tSTRING_CONTENT, "\ns2", :tSPACE, nil, :tSTRING_END, nil) end def test_yylex_string_pct_w_bs_sp util_lex_token("%w[s\\ 1 s\\ 2]", :tQWORDS_BEG, "%w[", :tSTRING_CONTENT, "s 1", :tSPACE, nil, :tSTRING_CONTENT, "s 2", :tSPACE, nil, :tSTRING_END, nil) end def test_yylex_string_single util_lex_token("'string'", :tSTRING, "string") end def test_yylex_string_single_escape_chars util_lex_token("'s\\tri\\ng'", :tSTRING, "s\\tri\\ng") end def test_yylex_string_single_nl util_lex_token("'blah\\\nblah'", :tSTRING, "blah\\\nblah") end def test_yylex_symbol util_lex_token(":symbol", :tSYMBOL, "symbol") end def test_yylex_symbol_bad_zero util_bad_token(":\"blah\0\"", :tSYMBEG, ":") end def test_yylex_symbol_double util_lex_token(":\"symbol\"", :tSYMBEG, ":", :tSTRING_CONTENT, "symbol", :tSTRING_END, '"') end def test_yylex_symbol_single util_lex_token(":'symbol'", :tSYMBEG, ":", :tSTRING_CONTENT, "symbol", :tSTRING_END, "'") end def test_yylex_ternary util_lex_token("a ? b : c", :tIDENTIFIER, "a", :tEH, "?", :tIDENTIFIER, "b", :tCOLON, ":", :tIDENTIFIER, "c") util_lex_token("a ?bb : c", # GAH! MATZ!!! :tIDENTIFIER, "a", :tEH, "?", :tIDENTIFIER, "bb", :tCOLON, ":", :tIDENTIFIER, "c") util_lex_token("42 ?", # 42 forces expr_end :tINTEGER, 42, :tEH, "?") end def test_yylex_tilde util_lex_token "~", :tTILDE, "~" end def test_yylex_tilde_unary @lex.lex_state = :expr_fname util_lex_token "~@", :tTILDE, "~" end def test_yylex_uminus util_lex_token("-blah", :tUMINUS, "-", :tIDENTIFIER, "blah") end def test_yylex_underscore util_lex_token("_var", :tIDENTIFIER, "_var") end def test_yylex_underscore_end @lex.src = "__END__\n" refute @lex.advance end def test_yylex_uplus util_lex_token("+blah", :tUPLUS, "+", :tIDENTIFIER, "blah") end def test_zbug_float_in_decl util_lex_token("def initialize(u = ", :kDEF, "def", :tIDENTIFIER, "initialize", :tLPAREN2, "(", :tIDENTIFIER, "u", :tEQL, "=") assert_equal :expr_beg, @lex.lex_state util_lex_token("0.0, s = 0.0", :tFLOAT, 0.0, :tCOMMA, ',', :tIDENTIFIER, "s", :tEQL, "=", :tFLOAT, 0.0) end def test_zbug_id_equals util_lex_token("a =", :tIDENTIFIER, "a", :tEQL, "=") assert_equal :expr_beg, @lex.lex_state util_lex_token("0.0", :tFLOAT, 0.0) end def test_zbug_no_spaces_in_decl util_lex_token("def initialize(u=", :kDEF, "def", :tIDENTIFIER, "initialize", :tLPAREN2, "(", :tIDENTIFIER, "u", :tEQL, "=") assert_equal :expr_beg, @lex.lex_state util_lex_token("0.0,s=0.0", :tFLOAT, 0.0, :tCOMMA, ",", :tIDENTIFIER, "s", :tEQL, "=", :tFLOAT, 0.0) end def test_pct_w_backslashes ["\t", "\n", "\r", "\v", "\f"].each do |char| next if !RubyLexer::RUBY19 and char == "\v" assert_lex("%w[foo#{char}bar]", s(:array, s(:str, "foo"), s(:str, "bar")), :tQWORDS_BEG, "%w[", :expr_beg, 0, 0, :tSTRING_CONTENT, "foo", :expr_beg, 0, 0, :tSPACE, nil, :expr_beg, 0, 0, :tSTRING_CONTENT, "bar", :expr_beg, 0, 0, :tSPACE, nil, :expr_beg, 0, 0, :tSTRING_END, nil, :expr_end, 0, 0) end # flunk "Not yet" end ############################################################ def util_bad_token s, *args assert_raises RubyParser::SyntaxError do util_lex_token s, *args end end def util_escape expected, input @lex.src = input assert_equal expected, @lex.read_escape, input end def util_escape_bad input @lex.src = input assert_raises RubyParser::SyntaxError do @lex.read_escape end end def util_lex_fname name, type, end_state = :expr_arg @lex.lex_state = :expr_fname # can only set via parser's defs assert_lex("def #{name} ", nil, :kDEF, "def", :expr_fname, 0, 0, type, name, end_state, 0, 0) assert_equal end_state, @lex.lex_state end def util_lex_token input, *args @lex.src = input until args.empty? do token = args.shift value = args.shift assert @lex.advance, "no more tokens" # assert_equal [token, value].map(&:encoding), [@lex.token, [@lex.yacc_value].flatten.first].map(&:encoding), input # TODO assert_equal [token, value], [@lex.token, [@lex.yacc_value].flatten.first], input end refute @lex.advance, "must be empty, but had #{[@lex.token, @lex.yacc_value].inspect}" end end ruby_parser-3.2.2/test/test_ruby_parser.rb0000555000004100000410000020215512250152360021005 0ustar www-datawww-data#!/usr/local/bin/ruby # encoding: utf-8 # ENV['VERBOSE'] = "1" require 'rubygems' require 'minitest/autorun' require 'ruby_parser' $: << File.expand_path('~/Work/p4/zss/src/sexp_processor/dev/lib') require 'pt_testcase' class Sexp alias oldeq2 == def ==(obj) # :nodoc: if obj.class == self.class then super and (self.line.nil? or obj.line.nil? or self.line == obj.line) else false end end end class RubyParserTestCase < ParseTreeTestCase attr_accessor :result, :processor make_my_diffs_pretty! def self.previous key "Ruby" end def self.generate_test klass, node, data, input_name, output_name return if node.to_s =~ /bmethod|dmethod/ return if Array === data['Ruby'] output_name = "ParseTree" super end def assert_parse rb, pt self.result = processor.parse rb assert_equal pt, result end def assert_syntax_error rb, emsg e = nil assert_silent do e = assert_raises RubyParser::SyntaxError do processor.parse rb end end assert_equal emsg, e.message end def assert_parse_error rb, emsg e = nil assert_silent do e = assert_raises Racc::ParseError do processor.parse rb end end assert_equal emsg, e.message end def assert_parse_line rb, pt, line assert_parse rb, pt assert_equal line, result.line, "call should have line number" end end module TestRubyParserShared def setup super # p :test => [self.class, __name__] end BLOCK_DUP_MSG = "Both block arg and actual block given." def test_double_block_error_01 assert_syntax_error "a(1, &b) { }", BLOCK_DUP_MSG end def test_double_block_error_02 assert_syntax_error "a(1, &b) do end", BLOCK_DUP_MSG end def test_double_block_error_03 assert_syntax_error "a 1, &b do end", BLOCK_DUP_MSG end def test_double_block_error_04 assert_syntax_error "m.a(1, &b) { }", BLOCK_DUP_MSG end def test_double_block_error_05 assert_syntax_error "m.a(1, &b) do end", BLOCK_DUP_MSG end def test_double_block_error_06 assert_syntax_error "m.a 1, &b do end", BLOCK_DUP_MSG end def test_double_block_error_07 assert_syntax_error "m::a(1, &b) { }", BLOCK_DUP_MSG end def test_double_block_error_08 assert_syntax_error "m::a(1, &b) do end", BLOCK_DUP_MSG end def test_double_block_error_09 assert_syntax_error "m::a 1, &b do end", BLOCK_DUP_MSG end def test_wtf_7 rb = "a.b (1) {c}" pt = s(:iter, s(:call, s(:call, nil, :a), :b, s(:lit, 1)), s(:args), s(:call, nil, :c)) assert_parse rb, pt end def test_wtf_8 rb = "a::b (1) {c}" pt = s(:iter, s(:call, s(:call, nil, :a), :b, s(:lit, 1)), s(:args), s(:call, nil, :c)) assert_parse rb, pt end def test_attrasgn_array_lhs rb = '[1, 2, 3, 4][from .. to] = ["a", "b", "c"]' pt = s(:attrasgn, s(:array, s(:lit, 1), s(:lit, 2), s(:lit, 3), s(:lit, 4)), :[]=, s(:dot2, s(:call, nil, :from), s(:call, nil, :to)), s(:array, s(:str, "a"), s(:str, "b"), s(:str, "c"))) assert_parse rb, pt end def test_block_append head = s(:args) tail = s(:zsuper) expected = s(:block, s(:args), s(:zsuper)) assert_equal expected, processor.block_append(head, tail) end def test_block_append_begin_begin head = s(:begin, s(:args)) tail = s(:begin, s(:args)) expected = s(:block, s(:args), s(:begin, s(:args))) assert_equal expected, processor.block_append(head, tail) end def test_block_append_block head = s(:block, s(:args)) tail = s(:zsuper) expected = s(:block, s(:args), s(:zsuper)) assert_equal expected, processor.block_append(head, tail) end def test_block_append_nil_head head = nil tail = s(:zsuper) expected = s(:zsuper) assert_equal expected, processor.block_append(head, tail) end def test_block_append_nil_tail head = s(:args) tail = nil expected = s(:args) assert_equal expected, processor.block_append(head, tail) end def test_block_append_tail_block head = s(:call, nil, :f1) tail = s(:block, s(:undef, s(:lit, :x)), s(:undef, s(:lit, :y))) expected = s(:block, s(:call, nil, :f1), s(:block, s(:undef, s(:lit, :x)), s(:undef, s(:lit, :y)))) assert_equal expected, processor.block_append(head, tail) end def test_call_array_arg rb = "1 == [:b, :c]" pt = s(:call, s(:lit, 1), :==, s(:array, s(:lit, :b), s(:lit, :c))) assert_parse rb, pt end def test_call_env processor.env[:a] = :lvar rb = "a.happy" pt = s(:call, s(:lvar, :a), :happy) assert_parse rb, pt end def test_dasgn_icky2 rb = "a do\n v = nil\n begin\n yield\n rescue Exception => v\n break\n end\nend" pt = s(:iter, s(:call, nil, :a), s(:args), s(:block, s(:lasgn, :v, s(:nil)), s(:rescue, s(:yield), s(:resbody, s(:array, s(:const, :Exception), s(:lasgn, :v, s(:gvar, :$!))), s(:break))))) assert_parse rb, pt end def test_class_comments rb = "# blah 1\n# blah 2\n\nclass X\n # blah 3\n def blah\n # blah 4\n end\nend" pt = s(:class, :X, nil, s(:defn, :blah, s(:args), s(:nil))) assert_parse rb, pt assert_equal "# blah 1\n# blah 2\n\n", result.comments assert_equal "# blah 3\n", result.defn.comments end def test_module_comments rb = "# blah 1\n \n # blah 2\n\nmodule X\n # blah 3\n def blah\n # blah 4\n end\nend" pt = s(:module, :X, s(:defn, :blah, s(:args), s(:nil))) assert_parse rb, pt assert_equal "# blah 1\n\n# blah 2\n\n", result.comments assert_equal "# blah 3\n", result.defn.comments end def test_defn_comments rb = "# blah 1\n# blah 2\n\ndef blah\nend" pt = s(:defn, :blah, s(:args), s(:nil)) assert_parse rb, pt assert_equal "# blah 1\n# blah 2\n\n", result.comments end def test_defs_comments rb = "# blah 1\n# blah 2\n\ndef self.blah\nend" pt = s(:defs, s(:self), :blah, s(:args)) assert_parse rb, pt assert_equal "# blah 1\n# blah 2\n\n", result.comments end def test_do_bug # TODO: rename rb = "a 1\na.b do |c|\n # do nothing\nend" pt = s(:block, s(:call, nil, :a, s(:lit, 1)), s(:iter, s(:call, s(:call, nil, :a), :b), s(:args, :c))) assert_parse rb, pt end def test_bug_begin_else rb = "begin 1; else; 2 end" pt = s(:block, s(:lit, 1), s(:lit, 2)) assert_parse rb, pt end def test_bug_comment_eq_begin rb = "\n\n#\n=begin\nblah\n=end\n\n" pt = nil exp = rb.strip + "\n" assert_parse rb, pt assert_equal exp, processor.lexer.comments end def test_bug_call_arglist_parens rb = 'g ( 1), 2' pt = s(:call, nil, :g, s(:lit, 1), s(:lit, 2)) assert_parse rb, pt rb = <<-CODE def f g ( 1), 2 end CODE pt = s(:defn, :f, s(:args), s(:call, nil, :g, s(:lit, 1), s(:lit, 2))) assert_parse rb, pt rb = <<-CODE def f() g (1), 2 end CODE assert_parse rb, pt end def test_dstr_evstr rb = "\"#\{'a'}#\{b}\"" pt = s(:dstr, "a", s(:evstr, s(:call, nil, :b))) assert_parse rb, pt end def test_dstr_str rb = "\"#\{'a'} b\"" pt = s(:str, "a b") assert_parse rb, pt end def test_empty rb = "" pt = nil assert_parse rb, pt end def test_evstr_evstr rb = "\"#\{a}#\{b}\"" pt = s(:dstr, "", s(:evstr, s(:call, nil, :a)), s(:evstr, s(:call, nil, :b))) assert_parse rb, pt end def test_evstr_str rb = "\"#\{a} b\"" pt = s(:dstr, "", s(:evstr, s(:call, nil, :a)), s(:str, " b")) assert_parse rb, pt end def test_lasgn_env rb = 'a = 42' pt = s(:lasgn, :a, s(:lit, 42)) expected_env = { :a => :lvar } assert_parse rb, pt assert_equal expected_env, processor.env.all end def test_list_append a = s(:lit, 1) b = s(:lit, 2) c = s(:lit, 3) result = processor.list_append(s(:array, b.dup), c.dup) assert_equal s(:array, b, c), result result = processor.list_append(b.dup, c.dup) assert_equal s(:array, b, c), result result = processor.list_append(result, a.dup) assert_equal s(:array, b, c, a), result lhs, rhs = s(:array, s(:lit, :iter)), s(:when, s(:const, :BRANCHING), nil) expected = s(:array, s(:lit, :iter), s(:when, s(:const, :BRANCHING), nil)) assert_equal expected, processor.list_append(lhs, rhs) end def test_list_prepend a = s(:lit, 1) b = s(:lit, 2) c = s(:lit, 3) result = processor.list_prepend(b.dup, s(:array, c.dup)) assert_equal s(:array, b, c), result result = processor.list_prepend(b.dup, c.dup) assert_equal s(:array, b, c), result result = processor.list_prepend(a.dup, result) assert_equal s(:array, a, b, c), result end def test_literal_concat_dstr_dstr lhs = s(:dstr, "Failed to download spec ", s(:evstr, s(:call, nil, :spec_name)), s(:str, " from "), s(:evstr, s(:call, nil, :source_uri)), s(:str, ":\n")) rhs = s(:dstr, "\t", s(:evstr, s(:call, s(:ivar, :@fetch_error), :message))) expected = s(:dstr, "Failed to download spec ", s(:evstr, s(:call, nil, :spec_name)), s(:str, " from "), s(:evstr, s(:call, nil, :source_uri)), s(:str, ":\n"), s(:str, "\t"), s(:evstr, s(:call, s(:ivar, :@fetch_error), :message))) assert_equal expected, processor.literal_concat(lhs, rhs) end def test_literal_concat_dstr_evstr lhs, rhs = s(:dstr, "a"), s(:evstr, s(:call, nil, :b)) expected = s(:dstr, "a", s(:evstr, s(:call, nil, :b))) assert_equal expected, processor.literal_concat(lhs, rhs) end def test_literal_concat_evstr_evstr lhs, rhs = s(:evstr, s(:lit, 1)), s(:evstr, s(:lit, 2)) expected = s(:dstr, "", s(:evstr, s(:lit, 1)), s(:evstr, s(:lit, 2))) assert_equal expected, processor.literal_concat(lhs, rhs) end def test_literal_concat_str_evstr lhs, rhs = s(:str, ""), s(:evstr, s(:str, "blah")) assert_equal s(:str, "blah"), processor.literal_concat(lhs, rhs) end def test_logop_12 lhs = s(:lit, 1) rhs = s(:lit, 2) exp = s(:and, s(:lit, 1), s(:lit, 2)) assert_equal exp, processor.logop(:and, lhs, rhs) end def test_logop_1234_5 lhs = s(:and, s(:lit, 1), s(:and, s(:lit, 2), s(:and, s(:lit, 3), s(:lit, 4)))) rhs = s(:lit, 5) exp = s(:and, s(:lit, 1), s(:and, s(:lit, 2), s(:and, s(:lit, 3), s(:and, s(:lit, 4), s(:lit, 5))))) assert_equal exp, processor.logop(:and, lhs, rhs) end def test_logop_123_4 lhs = s(:and, s(:lit, 1), s(:and, s(:lit, 2), s(:lit, 3))) rhs = s(:lit, 4) exp = s(:and, s(:lit, 1), s(:and, s(:lit, 2), s(:and, s(:lit, 3), s(:lit, 4)))) assert_equal exp, processor.logop(:and, lhs, rhs) end def test_logop_12_3 lhs = s(:and, s(:lit, 1), s(:lit, 2)) rhs = s(:lit, 3) exp = s(:and, s(:lit, 1), s(:and, s(:lit, 2), s(:lit, 3))) assert_equal exp, processor.logop(:and, lhs, rhs) end def test_logop_nested_mix lhs = s(:or, s(:call, nil, :a), s(:call, nil, :b)) rhs = s(:and, s(:call, nil, :c), s(:call, nil, :d)) exp = s(:or, s(:or, s(:call, nil, :a), s(:call, nil, :b)), s(:and, s(:call, nil, :c), s(:call, nil, :d))) lhs.paren = true rhs.paren = true assert_equal exp, processor.logop(:or, lhs, rhs) end def test_str_evstr rb = "\"a #\{b}\"" pt = s(:dstr, "a ", s(:evstr, s(:call, nil, :b))) assert_parse rb, pt end def test_dsym_to_sym pt = s(:alias, s(:lit, :<<), s(:lit, :>>)) rb = 'alias :<< :>>' assert_parse rb, pt rb = 'alias :"<<" :">>"' assert_parse rb, pt end def test_regexp regexps = { "/wtf/" => /wtf/, "/wtf/n" => /wtf/n, "/wtf/m" => /wtf/m, "/wtf/nm" => /wtf/nm, "/wtf/nmnmnmnm" => /wtf/nm, } regexps.each do |rb, lit| assert_parse rb, s(:lit, lit) end # TODO: add more including interpolation etc end def test_str_pct_Q_nested rb = "%Q[before [#\{nest}] after]" pt = s(:dstr, "before [", s(:evstr, s(:call, nil, :nest)), s(:str, "] after")) assert_parse rb, pt end # def test_str_pct_nested_nested # rb = "%{ { #\{ \"#\{1}\" } } }" # assert_equal " { 1 } ", eval(rb) # pt = s(:dstr, " { ", s(:evstr, s(:lit, 1)), s(:str, " } ")) # # assert_parse rb, pt # end def test_str_str rb = "\"a #\{'b'}\"" pt = s(:str, "a b") assert_parse rb, pt end def test_str_str_str rb = "\"a #\{'b'} c\"" pt = s(:str, "a b c") assert_parse rb, pt end STARTING_LINE = { "case_no_expr" => 2, # TODO this should be 1 "structure_unused_literal_wwtt" => 3, # yes, 3... odd test } def after_process_hook klass, node, data, input_name, output_name expected = STARTING_LINE[node] || 1 assert_equal expected, @result.line, "should have proper line number" end def test_parse_line_block rb = "a = 42\np a" pt = s(:block, s(:lasgn, :a, s(:lit, 42)), s(:call, nil, :p, s(:lvar, :a))) assert_parse_line rb, pt, 1 assert_equal 1, result.lasgn.line, "lasgn should have line number" assert_equal 2, result.call.line, "call should have line number" expected = "(string)" assert_equal expected, result.file assert_equal expected, result.lasgn.file assert_equal expected, result.call.file assert_same result.file, result.lasgn.file assert_same result.file, result.call.file end def test_parse_line_call_no_args rb = "f do |x, y|\n x + y\nend" pt = s(:iter, s(:call, nil, :f), s(:args, :x, :y), s(:call, s(:lvar, :x), :+, s(:lvar, :y))) assert_parse_line rb, pt, 1 assert_equal 1, result[1].line, "call should have line number" assert_equal 1, result[2].line, "masgn should have line number" assert_equal 2, result[3].line, "call should have line number" end def test_parse_line_defn_no_parens pt = s(:defn, :f, s(:args), s(:nil)) rb = "def f\nend" assert_parse_line rb, pt, 1 rb = "def f\n\nend" assert_parse_line rb, pt, 1 end def test_parse_line_defn_complex rb = "def x(y)\n p(y)\n y *= 2\n return y;\nend" # TODO: remove () & ; pt = s(:defn, :x, s(:args, :y), s(:call, nil, :p, s(:lvar, :y)), s(:lasgn, :y, s(:call, s(:lvar, :y), :*, s(:lit, 2))), s(:return, s(:lvar, :y))) assert_parse_line rb, pt, 1 body = result assert_equal 2, body.call.line, "call should have line number" assert_equal 3, body.lasgn.line, "lasgn should have line number" assert_equal 4, body.return.line, "return should have line number" end def test_parse_line_iter_call_parens rb = "f(a) do |x, y|\n x + y\nend" pt = s(:iter, s(:call, nil, :f, s(:call, nil, :a)), s(:args, :x, :y), s(:call, s(:lvar, :x), :+, s(:lvar, :y))) assert_parse_line rb, pt, 1 assert_equal 1, result[1].line, "call should have line number" assert_equal 1, result[2].line, "masgn should have line number" assert_equal 2, result[3].line, "call should have line number" end def test_parse_line_iter_call_no_parens rb = "f a do |x, y|\n x + y\nend" pt = s(:iter, s(:call, nil, :f, s(:call, nil, :a)), s(:args, :x, :y), s(:call, s(:lvar, :x), :+, s(:lvar, :y))) assert_parse_line rb, pt, 1 assert_equal 1, result[1].line, "call should have line number" assert_equal 1, result[2].line, "masgn should have line number" assert_equal 2, result[3].line, "call should have line number" end def test_parse_line_heredoc rb = <<-CODE string = <<-HEREDOC very long string HEREDOC puts string CODE pt = s(:block, s(:lasgn, :string, s(:str, " very long string\n").line(1)).line(1), s(:call, nil, :puts, s(:lvar, :string).line(4)).line(4)).line(1) assert_parse rb, pt end def test_parse_line_heredoc_regexp_chars rb = <<-CODE string = <<-"^D" very long string ^D puts string CODE pt = s(:block, s(:lasgn, :string, s(:str, " very long string\n").line(1)).line(1), s(:call, nil, :puts, s(:lvar, :string).line(4)).line(4)).line(1) assert_parse rb, pt end def test_parse_line_newlines rb = "true\n\n" pt = s(:true) assert_parse_line rb, pt, 1 end def test_parse_line_return rb = <<-RUBY def blah if true then return 42 end end RUBY pt = s(:defn, :blah, s(:args), s(:if, s(:true), s(:return, s(:lit, 42)), nil)) assert_parse_line rb, pt, 1 assert_equal 3, result.if.return.line assert_equal 3, result.if.return.lit.line end def test_bug_and rb = "true and []" pt = s(:and, s(:true), s(:array)) assert_parse rb, pt rb = "true and\ntrue" pt = s(:and, s(:true), s(:true)) assert_parse rb, pt end def test_bug_cond_pct rb = "case; when %r%blahblah%; end" pt = s(:case, nil, s(:when, s(:array, s(:lit, /blahblah/)), nil), nil) assert_parse rb, pt end # according to 2.3.1 parser -- added: ON 1.8 only: # rp.process("f { |(a,b),c| }") == rp.process("f { |((a,b),c)| }") # ruby18 -e "p lambda { |(a,b)| }.arity" # => 2 # ruby19 -e "p lambda { |(a,b)| }.arity" # => 1 # ruby18 -e "p lambda { |(a,b),c| }.arity" # => 2 # ruby19 -e "p lambda { |(a,b),c| }.arity" # => 2 # ruby18 -e "p lambda { |((a,b),c)| }.arity" # => 2 # ruby19 -e "p lambda { |((a,b),c)| }.arity" # => 1 def test_bug_args_masgn rb = "f { |(a, b), c| }" pt = s(:iter, s(:call, nil, :f), s(:args, s(:masgn, :a, :b), :c)) assert_parse rb, pt.dup end def test_bug_args_masgn2 rb = "f { |((a, b), c), d| }" pt = s(:iter, s(:call, nil, :f), s(:args, s(:masgn, s(:masgn, :a, :b), :c), :d)) assert_parse rb, pt end def ruby18 Ruby18Parser === self.processor end def ruby19 Ruby19Parser === self.processor end def ruby20 Ruby20Parser === self.processor end def test_bug_comma val = if ruby18 then s(:lit, 100) elsif ruby19 or ruby20 then s(:str, "d") else raise "wtf" end rb = "if test ?d, dir then end" pt = s(:if, s(:call, nil, :test, val, s(:call, nil, :dir)), nil, nil) assert_parse rb, pt end def test_bug_case_when_regexp rb = "case :x; when /x/ then end" pt = s(:case, s(:lit, :x), s(:when, s(:array, s(:lit, /x/)), nil), nil) assert_parse rb, pt end def test_bug_masgn_right rb = "f { |a, (b, c)| }" pt = s(:iter, s(:call, nil, :f), s(:args, :a, s(:masgn, :b, :c))) assert_parse rb, pt end def test_when_splat rb = "case a; when *b then; end" pt = s(:case, s(:call, nil, :a), s(:when, s(:array, s(:splat, s(:call, nil, :b))), nil), nil) assert_parse rb, pt end def test_if_symbol rb = "if f :x; end" pt = s(:if, s(:call, nil, :f, s(:lit, :x)), nil, nil) assert_parse rb, pt end def test_bug_not_parens rb = "not(a)" pt = if ruby18 then s(:not, s(:call, nil, :a)) elsif ruby19 or ruby20 then s(:call, s(:call, nil, :a), :"!") else raise "wtf" end assert_parse rb, pt end def test_pipe_space rb = "a.b do | | end" pt = s(:iter, s(:call, s(:call, nil, :a), :b), 0) assert_parse rb, pt end def test_cond_unary_minus rb = "if -1; end" pt = s(:if, s(:lit, -1), nil, nil) assert_parse rb, pt end def test_bug_op_asgn_rescue rb = "a ||= b rescue nil" pt = s(:rescue, s(:op_asgn_or, s(:lvar, :a), s(:lasgn, :a, s(:call, nil, :b))), s(:resbody, s(:array), s(:nil))) assert_parse rb, pt end def test_magic_encoding_comment rb = "# encoding: utf-8\nclass ExampleUTF8ClassNameVarietà; def self.è; così = :però; end\nend\n" rb.force_encoding "ASCII-8BIT" if rb.respond_to? :force_encoding # TODO: class vars # TODO: odd-ternary: a ?bb : c # TODO: globals pt = s(:class, :"ExampleUTF8ClassNameVariet\303\240", nil, s(:defs, s(:self), :"\303\250", s(:args), s(:lasgn, :"cos\303\254", s(:lit, :"per\303\262")))) err = RUBY_VERSION =~ /^1\.8/ ? "Skipping magic encoding comment\n" : "" assert_output "", err do assert_parse rb, pt end end def test_iter_args_1 rb = "f { |a,b| }" pt = s(:iter, s(:call, nil, :f), s(:args, :a, :b)) assert_parse rb, pt end def test_iter_args_3 rb = "f { |a, (b, c), d| }" pt = s(:iter, s(:call, nil, :f), s(:args, :a, s(:masgn, :b, :c), :d)) assert_parse rb, pt end def test_str_heredoc_interp rb = "<<\"\"\n\#{x}\nblah2\n\n" pt = s(:dstr, "", s(:evstr, s(:call, nil, :x)), s(:str, "\nblah2\n")) assert_parse rb, pt end def test_i_fucking_hate_line_numbers rb = <<-END.gsub(/^ {6}/, '') if true p 1 a.b 2 c.d 3, 4 e.f 5 g.h 6, 7 p(1) a.b(2) c.d(3, 4) e.f(5) g.h(6, 7) end END pt = s(:if, s(:true).line(1), s(:block, s(:call, nil, :p, s(:lit, 1).line(2)).line(2), s(:call, s(:call, nil, :a).line(3), :b, s(:lit, 2).line(3)).line(3), s(:call, s(:call, nil, :c).line(4), :d, s(:lit, 3).line(4), s(:lit, 4).line(4)).line(4), s(:call, s(:call, nil, :e).line(5), :f, s(:lit, 5).line(5)).line(5), s(:call, s(:call, nil, :g).line(6), :h, s(:lit, 6).line(6), s(:lit, 7).line(6)).line(6), s(:call, nil, :p, s(:lit, 1).line(7)).line(7), s(:call, s(:call, nil, :a).line(8), :b, s(:lit, 2).line(8)).line(8), s(:call, s(:call, nil, :c).line(9), :d, s(:lit, 3).line(9), s(:lit, 4).line(9)).line(9), s(:call, s(:call, nil, :e).line(10), :f, s(:lit, 5).line(10)).line(10), s(:call, s(:call, nil, :g).line(11), :h, s(:lit, 6).line(11), s(:lit, 7).line(11)).line(11)).line(2), nil).line(1) assert_parse rb, pt end def test_i_fucking_hate_line_numbers2 rb = <<-EOM.gsub(/^ {6}/, '') if true then p('a') b = 1 p b c =1 end a EOM pt = s(:block, s(:if, s(:true).line(1), s(:block, s(:call, nil, :p, s(:str, "a").line(2)).line(2), s(:lasgn, :b, s(:lit, 1).line(3)).line(3), s(:call, nil, :p, s(:lvar, :b).line(4)).line(4), s(:lasgn, :c, s(:lit, 1).line(5)).line(5)).line(2), # TODO line 2? nil).line(1), s(:call, nil, :a).line(7)).line(1) assert_parse rb, pt end def test_parse_comments p = RubyParser.new sexp = p.parse <<-CODE # class comment class Inline def show # woot end # Returns a list of things def list # woot end end CODE assert_equal "# class comment\n", sexp.comments act = sexp.find_nodes(:defn).map(&:comments) exp = ["", "# Returns a list of things\n"] assert_equal exp, act assert_equal [], processor.comments assert_equal "", processor.lexer.comments end def test_call_pipe rb = "1 | 2" pt = s(:call, s(:lit, 1), :|, s(:lit, 2)) assert_parse rb, pt end def test_lasgn_command rb = "a = b.c 1" pt = s(:lasgn, :a, s(:call, s(:call, nil, :b), :c, s(:lit, 1))) assert_parse rb, pt end def test_call_args_command rb = "a.b c.d 1" pt = s(:call, s(:call, nil, :a), :b, s(:call, s(:call, nil, :c), :d, s(:lit, 1))) assert_parse rb, pt end def test_defined_eh_parens rb = "defined?(42)" pt = s(:defined, s(:lit, 42)) assert_parse rb, pt end def test_if_elsif rb = "if 1; elsif 2; end" pt = s(:if, s(:lit, 1), nil, s(:if, s(:lit, 2), nil, nil)) assert_parse rb, pt end def test_call_gt rb = "1 > 2" pt = s(:call, s(:lit, 1), :>, s(:lit, 2)) assert_parse rb, pt end def test_call_lt rb = "1 < 2" pt = s(:call, s(:lit, 1), :<, s(:lit, 2)) assert_parse rb, pt end def test_call_lte rb = "1 <= 2" pt = s(:call, s(:lit, 1), :<=, s(:lit, 2)) assert_parse rb, pt end def test_call_spaceship rb = "1 <=> 2" pt = s(:call, s(:lit, 1), :<=>, s(:lit, 2)) assert_parse rb, pt end def test_call_and rb = "1 & 2" pt = s(:call, s(:lit, 1), :&, s(:lit, 2)) assert_parse rb, pt end def test_call_star2 rb = "1 ** 2" pt = s(:call, s(:lit, 1), :"**", s(:lit, 2)) assert_parse rb, pt end def test_call_colon2 rb = "A::b" pt = s(:call, s(:const, :A), :b) assert_parse rb, pt end def test_call_star rb = "1 * 2" pt = s(:call, s(:lit, 1), :"*", s(:lit, 2)) assert_parse rb, pt end def test_yield_arg rb = "yield 42" pt = s(:yield, s(:lit, 42)) assert_parse rb, pt end def test_call_div rb = "1 / 2" pt = s(:call, s(:lit, 1), :/, s(:lit, 2)) assert_parse rb, pt end def test_call_eq3 rb = "1 === 2" pt = s(:call, s(:lit, 1), :===, s(:lit, 2)) assert_parse rb, pt end def test_call_carat rb = "1 ^ 2" pt = s(:call, s(:lit, 1), :^, s(:lit, 2)) assert_parse rb, pt end def test_call_rshift rb = "1 >> 2" pt = s(:call, s(:lit, 1), :>>, s(:lit, 2)) assert_parse rb, pt end def test_lasgn_arg_rescue_arg rb = "a = 1 rescue 2" pt = s(:lasgn, :a, s(:rescue, s(:lit, 1), s(:resbody, s(:array), s(:lit, 2)))) assert_parse rb, pt end def test_call_bang_squiggle rb = "1 !~ 2" pt = s(:not, s(:call, s(:lit, 1), :=~, s(:lit, 2))) # TODO: check for 1.9+ assert_parse rb, pt end def test_super_arg rb = "super 42" pt = s(:super, s(:lit, 42)) assert_parse rb, pt end def test_defns_reserved rb = "def self.return; end" pt = s(:defs, s(:self), :return, s(:args)) assert_parse rb, pt end def test_unary_minus rb = "-a" pt = s(:call, s(:call, nil, :a), :"-@") assert_parse rb, pt end def test_masgn_command_call rb = "a, = b.c 1" pt = s(:masgn, s(:array, s(:lasgn, :a)), s(:to_ary, s(:call, s(:call, nil, :b), :c, s(:lit, 1)))) assert_parse rb, pt end def test_uminus_float rb = "-0.0" pt = s(:lit, -0.0) assert_parse rb, pt end def test_op_asgn_command_call rb = "a ||= b.c 2" pt = s(:op_asgn_or, s(:lvar, :a), s(:lasgn, :a, s(:call, s(:call, nil, :b), :c, s(:lit, 2)))) assert_parse rb, pt end def test_masgn_paren rb = "(a, b) = c.d" pt = s(:masgn, s(:array, s(:lasgn, :a), s(:lasgn, :b)), s(:to_ary, s(:call, s(:call, nil, :c), :d))) assert_parse rb, pt end def test_unary_tilde rb = "~a" pt = s(:call, s(:call, nil, :a), :~) assert_parse rb, pt end def test_unary_plus rb = "+a" pt = s(:call, s(:call, nil, :a), :+@) assert_parse rb, pt end def test_qwords_empty rb = "%w()" pt = s(:array) assert_parse rb, pt end def test_qWords_space rb = "%W( )" pt = s(:array) assert_parse rb, pt end def test_attr_asgn_colon_id rb = "A::b = 1" pt = s(:attrasgn, s(:const, :A), :b=, s(:lit, 1)) assert_parse rb, pt end def test_aref_args_assocs rb = "[1 => 2]" pt = s(:array, s(:hash, s(:lit, 1), s(:lit, 2))) assert_parse rb, pt end def test_aref_args_lit_assocs skip if ruby18 rb = "[1, 2 => 3]" pt = s(:array, s(:lit, 1), s(:hash, s(:lit, 2), s(:lit, 3))) assert_parse rb, pt end def test_BEGIN rb = "BEGIN { 42 }" pt = s(:iter, s(:preexe), s(:args), s(:lit, 42)) assert_parse rb, pt end def test_attrasgn_primary_dot_constant rb = "a.B = 1" pt = s(:attrasgn, s(:call, nil, :a), :"B=", s(:lit, 1)) assert_parse rb, pt end def test_op_asgn_primary_colon_identifier rb = "A::b += 1" pt = s(:op_asgn, s(:const, :A), s(:lit, 1), :b, :+) # TODO: check? looks wack assert_parse rb, pt end def test_words_interp rb = '%W(#{1}b)' pt = s(:array, s(:dstr, "", s(:evstr, s(:lit, 1)), s(:str, "b"))) assert_parse rb, pt end def test_op_asgn_index_command_call rb = "a[:b] ||= c 1, 2" pt = s(:op_asgn1, s(:call, nil, :a), s(:array, s(:lit, :b)), :"||", s(:call, nil, :c, s(:lit, 1), s(:lit, 2))) assert_parse rb, pt end def test_op_asgn_val_dot_ident_command_call rb = "a.b ||= c 1" pt = s(:op_asgn, s(:call, nil, :a), s(:call, nil, :c, s(:lit, 1)), :b, :"||") assert_parse rb, pt end def test_yield_empty_parens rb = "yield()" pt = s(:yield) assert_parse rb, pt end def test_masgn_lhs_splat rb = "*a = 1, 2, 3" pt = s(:masgn, s(:array, s(:splat, s(:lasgn, :a))), s(:array, s(:lit, 1), s(:lit, 2), s(:lit, 3))) assert_parse rb, pt end def test_block_decomp_arg_splat skip "not that smart yet" if ruby18 # HACK rb = "a { |(b, *)| }" pt = s(:iter, s(:call, nil, :a), s(:args, s(:masgn, :b, :*))) assert_parse rb, pt end def test_masgn_arg_ident rb = "a, b.C = d" pt = s(:masgn, s(:array, s(:lasgn, :a), s(:attrasgn, s(:call, nil, :b), :"C=")), s(:to_ary, s(:call, nil, :d))) assert_parse rb, pt end def test_masgn_arg_colon_arg rb = "a, b::c = d" pt = s(:masgn, s(:array, s(:lasgn, :a), s(:attrasgn, s(:call, nil, :b), :c=)), s(:to_ary, s(:call, nil, :d))) assert_parse rb, pt end def test_masgn_star rb = "* = 1" pt = s(:masgn, s(:array, s(:splat)), s(:to_ary, s(:lit, 1))) assert_parse rb, pt end def test_op_asgn_dot_ident_command_call rb = "A.B ||= c 1" pt = s(:op_asgn, s(:const, :A), s(:call, nil, :c, s(:lit, 1)), :B, :"||") assert_parse rb, pt end def test_block_decomp_splat skip "not that smart yet" if ruby18 # HACK rb = "f { |(*a)| }" pt = s(:iter, s(:call, nil, :f), s(:args, s(:masgn, :"*a"))) assert_parse rb, pt end def test_masgn_colon3 rb = "::A, ::B = 1, 2" pt = s(:masgn, s(:array, s(:const, nil, s(:colon3, :A)), s(:const, s(:colon3, :B))), s(:array, s(:lit, 1), s(:lit, 2))) assert_parse rb, pt end def test_masgn_colon2 rb = "a, b::C = 1, 2" pt = s(:masgn, s(:array, s(:lasgn, :a), s(:const, s(:colon2, s(:call, nil, :b), :C))), s(:array, s(:lit, 1), s(:lit, 2))) assert_parse rb, pt end def test_alias_gvar_backref rb = "alias $MATCH $&" pt = s(:valias, :$MATCH, :$&) assert_parse rb, pt end def test_heredoc_broken_windows_theory_applies_to_microsoft_more_than_anything rb = "< f_larglist lambda_body # f_larglist -> f_args opt_bv_decl # opt_bv_decl # bv_decls # bvar rb = "->(a, b=nil) { p [a, b] }" pt = s(:iter, s(:call, nil, :lambda), s(:args, :a, s(:lasgn, :b, s(:nil))), s(:call, nil, :p, s(:array, s(:lvar, :a), s(:lvar, :b)))) assert_parse rb, pt # rb = "->(a; b) { p [a, b] }" # # assert_parse rb, pt end def test_block_args_opt1 rb = "f { |a, b = 42| [a, b] }" pt = s(:iter, s(:call, nil, :f), s(:args, :a, s(:lasgn, :b, s(:lit, 42))), s(:array, s(:lvar, :a), s(:lvar, :b))) assert_parse rb, pt end def test_block_args_opt2 rb = "f { |a, b = 42, c = 24| [a, b, c] }" pt = s(:iter, s(:call, nil, :f), s(:args, :a, s(:lasgn, :b, s(:lit, 42)), s(:lasgn, :c, s(:lit, 24))), s(:array, s(:lvar, :a), s(:lvar, :b), s(:lvar, :c))) assert_parse rb, pt end def test_block_args_opt3 rb = "f { |a, b = 42, c = 24, &d| [a, b, c, d] }" pt = s(:iter, s(:call, nil, :f), s(:args, :a, s(:lasgn, :b, s(:lit, 42)), s(:lasgn, :c, s(:lit, 24)), :"&d"), s(:array, s(:lvar, :a), s(:lvar, :b), s(:lvar, :c), s(:lvar, :d))) assert_parse rb, pt end def test_i_have_no_freakin_clue rb = "1 ? b('') : 2\na d: 3" pt = s(:block, s(:if, s(:lit, 1), s(:call, nil, :b, s(:str, "")), s(:lit, 2)), s(:call, nil, :a, s(:hash, s(:lit, :d), s(:lit, 3)))) assert_parse rb, pt end def test_motherfuckin_leading_dots rb = "a\n.b" pt = s(:call, s(:call, nil, :a), :b) assert_parse rb, pt end def test_motherfuckin_leading_dots2 rb = "a\n..b" assert_parse_error rb, '(string):2 :: parse error on value ".." (tDOT2)' end def test_kill_me rb = "f { |a, (b, *c)| }" pt = s(:iter, s(:call, nil, :f), s(:args, :a, s(:masgn, :b, :"*c"))) assert_parse rb, pt end def test_kill_me2 rb = "f { |*a, b| }" pt = s(:iter, s(:call, nil, :f), s(:args, :"*a", :b)) assert_parse rb, pt end def test_kill_me3 rb = "f { |*a, b, &c| }" pt = s(:iter, s(:call, nil, :f), s(:args, :"*a", :b, :"&c")) assert_parse rb, pt end def test_kill_me4 rb = "a=b ? true: false" pt = s(:lasgn, :a, s(:if, s(:call, nil, :b), s(:true), s(:false))) assert_parse rb, pt end # def test_kill_me5 # rb = "f ->() { g do end }" # pt = 42 # # assert_parse rb, pt # end def test_iter_args_4 rb = "f { |a, *b, c| }" pt = s(:iter, s(:call, nil, :f), s(:args, :a, :"*b", :c)) assert_parse rb, pt end def test_iter_args_5 rb = "f { |a, &b| }" pt = s(:iter, s(:call, nil, :f), s(:args, :a, :"&b")) assert_parse rb, pt end def test_iter_args_6 rb = "f { |a, b=42, c| }" pt = s(:iter, s(:call, nil, :f), s(:args, :a, s(:lasgn, :b, s(:lit, 42)), :c)) assert_parse rb, pt end # In 1.8, block args with an outer set of parens are superfluous. # In 1.9, outer set of parens are NOT... they are an explicit extra masgn. def test_iter_args_2__19 rb = "f { |(a, b)| }" pt = s(:iter, s(:call, nil, :f), s(:args, s(:masgn, :a, :b))) assert_parse rb, pt end def test_bug_args__19 rb = "f { |(a, b)| d }" pt = s(:iter, s(:call, nil, :f), s(:args, s(:masgn, :a, :b)), s(:call, nil, :d)) assert_parse rb, pt end def test_bug_args_masgn_outer_parens__19 rb = "f { |((k, v), i)| }" pt = s(:iter, # NOTE: same sexp as test_bug_args_masgn s(:call, nil, :f), s(:args, s(:masgn, s(:masgn, :k, :v), :i))) assert_parse rb, pt.dup end def test_iter_args_7_1 rb = "f { |a = 42, *b| }" pt = s(:iter, s(:call, nil, :f), s(:args, s(:lasgn, :a, s(:lit, 42)), :"*b")) assert_parse rb, pt end def test_iter_args_7_2 rb = "f { |a = 42, *b, &c| }" pt = s(:iter, s(:call, nil, :f), s(:args, s(:lasgn, :a, s(:lit, 42)), :"*b", :"&c")) assert_parse rb, pt end def test_iter_args_8_1 rb = "f { |a = 42, *b, c| }" pt = s(:iter, s(:call, nil, :f), s(:args, s(:lasgn, :a, s(:lit, 42)), :"*b", :c)) assert_parse rb, pt end def test_iter_args_8_2 rb = "f { |a = 42, *b, c, &d| }" pt = s(:iter, s(:call, nil, :f), s(:args, s(:lasgn, :a, s(:lit, 42)), :"*b", :c, :"&d")) assert_parse rb, pt end def test_iter_args_9_1 rb = "f { |a = 42, b| }" pt = s(:iter, s(:call, nil, :f), s(:args, s(:lasgn, :a, s(:lit, 42)), :b)) assert_parse rb, pt end def test_iter_args_9_2 rb = "f { |a = 42, b, &c| }" pt = s(:iter, s(:call, nil, :f), s(:args, s(:lasgn, :a, s(:lit, 42)), :b, :"&c")) assert_parse rb, pt end def test_iter_args_10_1 rb = "f { |a, b = 42, *c| }" pt = s(:iter, s(:call, nil, :f), s(:args, :a, s(:lasgn, :b, s(:lit, 42)), :"*c")) assert_parse rb, pt end def test_iter_args_10_2 rb = "f { |a, b = 42, *c, &d| }" pt = s(:iter, s(:call, nil, :f), s(:args, :a, s(:lasgn, :b, s(:lit, 42)), :"*c", :"&d")) assert_parse rb, pt end def test_iter_args_11_1 rb = "f { |a, b = 42, *c, d| }" pt = s(:iter, s(:call, nil, :f), s(:args, :a, s(:lasgn, :b, s(:lit, 42)), :"*c", :d)) assert_parse rb, pt end def test_iter_args_11_2 rb = "f { |a, b = 42, *c, d, &e| }" pt = s(:iter, s(:call, nil, :f), s(:args, :a, s(:lasgn, :b, s(:lit, 42)), :"*c", :d, :"&e")) assert_parse rb, pt end def test_kill_me_6 # | f_marg_list tCOMMA tSTAR f_norm_arg tCOMMA f_marg_list rb = "f { |a, (b, *c, d)| }" pt = s(:iter, s(:call, nil, :f), s(:args, :a, s(:masgn, :b, :"*c", :d))) assert_parse rb, pt end def test_kill_me_7 # | f_marg_list tCOMMA tSTAR rb = "f { |a, (b, *)| }" pt = s(:iter, s(:call, nil, :f), s(:args, :a, s(:masgn, :b, :*))) assert_parse rb, pt end def test_kill_me_8 # | f_marg_list tCOMMA tSTAR tCOMMA f_marg_list rb = "f { |a, (b, *, c)| }" pt = s(:iter, s(:call, nil, :f), s(:args, :a, s(:masgn, :b, :*, :c))) assert_parse rb, pt end def test_kill_me_9 # | tSTAR f_norm_arg rb = "f { |a, (*b)| }" pt = s(:iter, s(:call, nil, :f), s(:args, :a, s(:masgn, :"*b"))) assert_parse rb, pt end def test_kill_me_10 # | tSTAR f_norm_arg tCOMMA f_marg_list rb = "f { |a, (*b, c)| }" pt = s(:iter, s(:call, nil, :f), s(:args, :a, s(:masgn, :"*b", :c))) assert_parse rb, pt end def test_kill_me_11 # | tSTAR rb = "f { |a, (*)| }" pt = s(:iter, s(:call, nil, :f), s(:args, :a, s(:masgn, :*))) assert_parse rb, pt end def test_kill_me_12 # | tSTAR tCOMMA f_marg_list rb = "f { |a, (*, b)| }" pt = s(:iter, s(:call, nil, :f), s(:args, :a, s(:masgn, :*, :b))) assert_parse rb, pt end def test_index_0 rb = "a[] = b" pt = s(:attrasgn, s(:call, nil, :a), :[]=, s(:call, nil, :b)) assert_parse rb, pt end def test_lambda_do_vs_brace pt = s(:call, nil, :f, s(:iter, s(:call, nil, :lambda), 0)) rb = "f ->() {}" assert_parse rb, pt rb = "f ->() do end" assert_parse rb, pt end def test_thingy pt = s(:call, s(:call, nil, :f), :call, s(:lit, 42)) rb = "f.(42)" assert_parse rb, pt rb = "f::(42)" assert_parse rb, pt end def test_unary_plus_on_literal rb = "+:a" pt = s(:call, s(:lit, :a), :+@) assert_parse rb, pt end end class TestRuby20Parser < RubyParserTestCase include TestRubyParserShared include TestRubyParserShared1920 def setup super self.processor = Ruby20Parser.new end def test_defn_kwarg_val rb = "def f(a, b:1) end" pt = s(:defn, :f, s(:args, :a, s(:kwarg, :b, s(:lit, 1))), s(:nil)) assert_parse rb, pt end def test_args_kw_block rb = "def f(a: 1, &b); end" pt = s(:defn, :f, s(:args, s(:kwarg, :a, s(:lit, 1)), :"&b"), s(:nil)) assert_parse rb, pt end def test_defn_kwarg_kwarg rb = "def f(a, b: 1, c: 2) end" pt = s(:defn, :f, s(:args, :a, s(:kwarg, :b, s(:lit, 1)), s(:kwarg, :c, s(:lit, 2))), s(:nil)) assert_parse rb, pt end def test_defn_powarg rb = "def f(**opts) end" pt = s(:defn, :f, s(:args, :"**opts"), s(:nil)) assert_parse rb, pt end def test_block_arg_kwsplat rb = "a { |**b| }" pt = s(:iter, s(:call, nil, :a), s(:args, :"**b")) assert_parse rb, pt end def test_symbols rb = "%i(a b c)" pt = s(:array, s(:lit, :a), s(:lit, :b), s(:lit, :c)) assert_parse rb, pt end def test_symbols_interp rb = '%i(a b#{1+1} c)' pt = s(:array, s(:lit, :a), s(:lit, :'b#{1+1}'), s(:lit, :c)) assert_parse rb, pt end def test_symbols_empty_space rb = "%i( )" pt = s(:array) assert_parse rb, pt end def test_symbols_empty rb = "%i()" pt = s(:array) assert_parse rb, pt end def test_qsymbols rb = "%I(a b c)" pt = s(:array, s(:lit, :a), s(:lit, :b), s(:lit, :c)) assert_parse rb, pt end def test_qsymbols_interp rb = '%I(a b#{1+1} c)' pt = s(:array, s(:lit, :a), s(:dsym, "b", s(:evstr, s(:call, s(:lit, 1), :+, s(:lit, 1)))), s(:lit, :c)) assert_parse rb, pt end def test_qsymbols_empty rb = "%I()" pt = s(:array) assert_parse rb, pt end def test_qsymbols_empty_space rb = "%I( )" pt = s(:array) assert_parse rb, pt end def test_defn_unary_not # TODO: this needs to work on 1.9 skip "Not yet" rb = "def !@; true; end" # I seriously HATE this pt = s(:defn, :"!@", s(:args), s(:true)) assert_parse rb, pt end def test_defn_kwarg_kwsplat rb = "def a(b: 1, **c) end" pt = s(:defn, :a, s(:args, s(:kwarg, :b, s(:lit, 1)), :"**c"), s(:nil)) assert_parse rb, pt end def test_call_arg_kwsplat rb = "a(b, **1)" pt = s(:call, nil, :a, s(:call, nil, :b), s(:kwsplat, s(:lit, 1))) assert_parse rb, pt end def test_call_kwsplat rb = "a(**1)" pt = s(:call, nil, :a, s(:kwsplat, s(:lit, 1))) assert_parse rb, pt end def test_iter_kwarg rb = "a { |b: 1| }" pt = s(:iter, s(:call, nil, :a), s(:args, s(:kwarg, :b, s(:lit, 1)))) assert_parse rb, pt end def test_iter_kwarg_kwsplat rb = "a { |b: 1, **c| }" pt = s(:iter, s(:call, nil, :a), s(:args, s(:kwarg, :b, s(:lit, 1)), :"**c")) assert_parse rb, pt end def test_iter_array_curly rb = "f :a, [:b] { |c, d| }" # yes, this is bad code... that's their problem pt = s(:iter, s(:call, nil, :f, s(:lit, :a), s(:array, s(:lit, :b))), s(:args, :c, :d)) assert_parse rb, pt end end ruby_parser-3.2.2/test/test_ruby_parser_extras.rb0000444000004100000410000001673712250152360022401 0ustar www-datawww-data# encoding: US-ASCII require 'rubygems' require 'minitest/autorun' require 'ruby_parser_extras' require 'minitest/unit' class TestStackState < Minitest::Test attr_reader :s def setup @s = RubyParserStuff::StackState.new :test end def assert_encoding str, default = false orig_str = str.dup p = Ruby19Parser.new s = nil out, err = capture_io do s = p.handle_encoding str end assert_equal orig_str.sub(/\357\273\277/, ''), s exp_err = "" if defined?(Encoding) then assert_equal "UTF-8", s.encoding.to_s, str.inspect else exp_err = "Skipping magic encoding comment\n" unless default end assert_equal "", out, str.inspect assert_equal exp_err, err, str.inspect # HACK end def test_handle_encoding_bom # bom support, default to utf-8 assert_encoding "\xEF\xBB\xBF# blah" # we force_encode to US-ASCII, then encode to UTF-8 so our lexer will work assert_encoding "\xEF\xBB\xBF# encoding: US-ASCII" end def test_handle_encoding_default assert_encoding "blah", :default end def test_handle_encoding_emacs # Q: how many different ways can we screw these up? A: ALL OF THEM assert_encoding "# - encoding: utf-8 -" assert_encoding "# - encoding:utf-8" assert_encoding "# -* coding: UTF-8 -*-" assert_encoding "# -*- coding: UTF-8 -*-" assert_encoding "# -*- coding: utf-8 -*" assert_encoding "# -*- coding: utf-8 -*-" assert_encoding "# -*- coding: utf-8; mode: ruby -*-" assert_encoding "# -*- coding: utf-8; mode: ruby; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2" assert_encoding "# -*- coding:utf-8; mode:ruby; -*-" assert_encoding "# -*- encoding: UTF-8 -*-" assert_encoding "# -*- encoding: utf-8 -*" assert_encoding "# -*- encoding: utf-8 -*-" assert_encoding "# -*- mode:ruby; coding:utf-8 -*-" assert_encoding "# -*- ruby encoding: utf-8 -*-" assert_encoding "# -- encoding: utf-8 --" assert_encoding "# ~*~ encoding: utf-8 ~*~" assert_encoding "#-*- coding: utf-8 -*-" assert_encoding "#-*- coding:utf-8" assert_encoding "#-- -*- mode: ruby; encoding: utf-8 -*-\n" end def test_handle_encoding_wtf assert_encoding "# coding : utf-8" assert_encoding "# Ruby 1.9: encoding: utf-8" assert_encoding "# Encoding: UTF-8 <-- required, please leave this in." assert_encoding "# Encoding: UTF-8" assert_encoding "# coding: utf-8" assert_encoding "# coding:utf-8" assert_encoding "# coding=utf-8" assert_encoding "# encoding: ASCII" assert_encoding "# encoding: ASCII-8BIT" assert_encoding "# encoding: ISO-8859-1" assert_encoding "# encoding: UTF-8" assert_encoding "# encoding: ascii-8bit" assert_encoding "# encoding: cp1252" assert_encoding "# encoding: euc-jp -*-" assert_encoding "# encoding: utf-8 # -*- ruby -*-" assert_encoding "# encoding: utf-8 require 'github_api/utils/url'" assert_encoding "# encoding: utf-8!" assert_encoding "# encoding: utf-8" assert_encoding "#" assert_encoding "#Encoding: UTF-8" assert_encoding "#coding:utf-8" assert_encoding "#encoding: UTF-8!" assert_encoding "#encoding: UTF-8" assert_encoding "#encoding: cp1252" assert_encoding "#encoding: sjis" assert_encoding "#encoding: utf-8" end def test_handle_encoding_normal assert_encoding "# encoding: UTF-8" assert_encoding "# encoding: UTF-8\r\n" # UGH I hate windoze assert_encoding "# coding: UTF-8" assert_encoding "# encoding = UTF-8" assert_encoding "# coding = UTF-8" end def test_handle_encoding_vim assert_encoding "# vim: set fileencoding=utf-8 filetype=ruby ts=2 : " assert_encoding "# vim: fileencoding=UTF-8 ft=ruby syn=ruby ts=2 sw=2 ai eol et si" assert_encoding "# vim: fileencoding=UTF-8 nobomb sw=2 ts=2 et" assert_encoding "# vim: filetype=ruby, fileencoding=UTF-8, tabsize=2, shiftwidth=2" assert_encoding "# vim: set fileencoding=utf-8" assert_encoding "# vim:encoding=UTF-8:" assert_encoding "# vim:fileencoding=UTF-8:" assert_encoding "# vim:set fileencoding=utf-8 filetype=ruby" assert_encoding "# vim:set fileencoding=utf-8:" end def test_stack_state s.push true s.push false s.lexpop assert_equal [false, true], s.stack end def test_is_in_state assert_equal false, s.is_in_state s.push false assert_equal false, s.is_in_state s.push true assert_equal true, s.is_in_state s.push false assert_equal false, s.is_in_state end def test_lexpop assert_equal [false], s.stack s.push true s.push false assert_equal [false, true, false], s.stack s.lexpop assert_equal [false, true], s.stack end def test_pop assert_equal [false], s.stack s.push true assert_equal [false, true], s.stack assert_equal true, s.pop assert_equal [false], s.stack end def test_push assert_equal [false], s.stack s.push true s.push false assert_equal [false, true, false], s.stack end end class TestEnvironment < Minitest::Test def deny t assert ! t end def setup @env = RubyParserStuff::Environment.new @env[:blah] = 42 assert_equal 42, @env[:blah] end def test_use @env.use :blah expected = [{ :blah => true }] assert_equal expected, @env.instance_variable_get(:"@use") end def test_use_scoped @env.use :blah @env.extend expected = [{}, { :blah => true }] assert_equal expected, @env.instance_variable_get(:"@use") end def test_used_eh @env.extend :dynamic @env[:x] = :dvar @env.use :x assert_equal true, @env.used?(:x) end def test_used_eh_none assert_equal nil, @env.used?(:x) end def test_used_eh_scoped self.test_used_eh @env.extend :dynamic assert_equal true, @env.used?(:x) end def test_var_scope_dynamic @env.extend :dynamic assert_equal 42, @env[:blah] @env.unextend assert_equal 42, @env[:blah] end def test_var_scope_static @env.extend assert_equal nil, @env[:blah] @env.unextend assert_equal 42, @env[:blah] end def test_dynamic expected1 = {} expected2 = { :x => 42 } assert_equal expected1, @env.dynamic begin @env.extend :dynamic assert_equal expected1, @env.dynamic @env[:x] = 42 assert_equal expected2, @env.dynamic begin @env.extend :dynamic assert_equal expected2, @env.dynamic @env.unextend end assert_equal expected2, @env.dynamic @env.unextend end assert_equal expected1, @env.dynamic end def test_all_dynamic expected = { :blah => 42 } @env.extend :dynamic assert_equal expected, @env.all @env.unextend assert_equal expected, @env.all end def test_all_static @env.extend expected = { } assert_equal expected, @env.all @env.unextend expected = { :blah => 42 } assert_equal expected, @env.all end def test_dynamic_eh assert_equal false, @env.dynamic? @env.extend :dynamic assert_equal true, @env.dynamic? @env.extend assert_equal false, @env.dynamic? end def test_all_static_deeper expected0 = { :blah => 42 } expected1 = { :blah => 42, :blah2 => 24 } expected2 = { :blah => 27 } @env.extend :dynamic @env[:blah2] = 24 assert_equal expected1, @env.all @env.extend @env[:blah] = 27 assert_equal expected2, @env.all @env.unextend assert_equal expected1, @env.all @env.unextend assert_equal expected0, @env.all end end ruby_parser-3.2.2/metadata.gz.sig0000644000004100000410000000040012250152360016774 0ustar www-datawww-data{X(Y@^,7K卷(rm v&/_+s53ǭ +?IsRd%:!b; /Vr^]y+ ɒi) ޞe"<3 Pvk#\-6C~kaQ&;Lۙ T)[㑜.ԂX6i GY:vMF]$L~ɱfwb;1aY){dRG$G܂