HXQ 0.16.0 → 0.17.0
raw patch · 23 files changed
+1064/−661 lines, 23 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Text.XML.HXQ.XQuery: isSchema :: Connection -> String -> IO Bool
- Text.XML.HXQ.XQuery: genSchema :: Connection -> FilePath -> String -> IO Table
+ Text.XML.HXQ.XQuery: genSchema :: Connection -> FilePath -> String -> [String] -> IO Table
Files
- HXQ.cabal +7/−4
- Main.hs +13/−11
- Makefile +23/−16
- TestDBLP.hs +35/−0
- TestDBLP1.hs +0/−8
- TestDBLP2.hs +0/−12
- TestXMark.hs +22/−0
- XQueryParser.y +10/−2
- data/q5.xq +12/−0
- db.html +16/−14
- hxq-manual.pdf binary
- index.html +10/−6
- release.html +37/−0
- src/DeepSeq.hs +73/−0
- src/Text/XML/HXQ/Compiler.hs +52/−30
- src/Text/XML/HXQ/Functions.hs +32/−26
- src/Text/XML/HXQ/Interpreter.hs +103/−93
- src/Text/XML/HXQ/Parser.hs +359/−319
- src/Text/XML/HXQ/XQuery.hs +1/−1
- src/Text/XML/HXQ/XTree.hs +112/−27
- src/noDB/Text/XML/HXQ/OptionalDB.hs +12/−3
- src/withDB/Text/XML/HXQ/DB.hs +134/−88
- src/withDB/Text/XML/HXQ/OptionalDB.hs +1/−1
HXQ.cabal view
@@ -1,6 +1,6 @@ Cabal-Version: >= 1.2 Name: HXQ-Version: 0.16.0+Version: 0.17.0 Synopsis: A Compiler from XQuery to Haskell Description: HXQ is a fast and space-efficient compiler from XQuery (the standard@@ -13,11 +13,12 @@ License-file: LICENSE License: BSD3 Author: Leonidas Fegaras-Copyright: 2008, Leonidas Fegaras+Copyright: 2008, 2009 Leonidas Fegaras Stability: experimental Maintainer: fegaras@cse.uta.edu Homepage: http://lambda.uta.edu/HXQ/ Extra-Source-Files:+ src/DeepSeq.hs src/noDB/Text/XML/HXQ/OptionalDB.hs src/withDB/Text/XML/HXQ/DB.hs src/withDB/Text/XML/HXQ/OptionalDB.hs@@ -31,13 +32,14 @@ TestDB.hs TestDBa.hs TestDB2.hs- TestDBLP1.hs- TestDBLP2.hs+ TestDBLP.hs+ TestXMark.hs compile compile.bat data-files: index.html db.html+ release.html hxq-manual.pdf data/cs.xml data/a.xml@@ -46,6 +48,7 @@ data/q2.xq data/q3.xq data/q4.xq+ data/q5.xq data/dblp.xq data/dblp2.xq data/test.xq
Main.hs view
@@ -27,7 +27,7 @@ type E = C.Exception -version = "0.16.0"+version = "0.17.0" parseEnv :: [String] -> [(String,String)]@@ -90,13 +90,13 @@ commit db _ -> do query <- readFile file t1 <- getCPUTime- (result,_,_) <- xqueryE query [] [] noDBerror verbose+ (result,_,_,_) <- xqueryE query [] [] [] noDBerror verbose putXSeq result t2 <- getCPUTime putTime (t2-t1) _ -> case lookup "p" env of Just query -> do t1 <- getCPUTime- (result,_,_) <- xqueryE query [] [] noDBerror verbose+ (result,_,_,_) <- xqueryE query [] [] [] noDBerror verbose putXSeq result t2 <- getCPUTime putTime (t2-t1)@@ -104,20 +104,22 @@ case lookup "db" env of Just filepath -> do db <- connect filepath- evalInput (\s vs fs -> C.catch+ evalInput (\s es fs vs -> C.catch (do t1 <- getCPUTime- (result,nvs,nfs) <- xqueryE s vs fs db verbose+ (result,nes,nfs,nvs) <- xqueryE s es fs vs db verbose putXSeq result t2 <- getCPUTime putTime (t2-t1) commit db- return (nvs,nfs))- (\e -> do putStrLn (show (e::E)); return (vs,fs))) [] [] "> "- _ -> evalInput (\s vs fs-> C.catch+ return (nes,nfs,nvs))+ (\e -> do putStrLn (show (e::E)); return (es,fs,vs))) [] [] [] "> " []+ return ()+ _ -> do evalInput (\s es fs vs -> C.catch (do t1 <- getCPUTime- (result,nvs,nfs) <- xqueryE s vs fs noDBerror verbose+ (result,nes,nfs,nvs) <- xqueryE s es fs vs noDBerror verbose putXSeq result t2 <- getCPUTime putTime (t2-t1)- return (nvs,nfs))- (\e -> do putStrLn (show (e::E)); return (vs,fs))) [] [] "> "+ return (nes,nfs,nvs))+ (\e -> do putStrLn (show (e::E)); return (es,fs,vs))) [] [] [] "> " []+ return ()
Makefile view
@@ -1,4 +1,7 @@-# the database driver must be mysql, sqlite, or nodb+# Programmer: Leonidas Fegaras+# The database driver must be mysql, sqlite, or nodb+# for using MySQL through ODBC, Sqlite, or no database at all+ driver = mysql ifeq (${driver},mysql)@@ -11,7 +14,8 @@ parser = src/Text/XML/HXQ/Parser.hs ghc = ghc -O2 -funfolding-use-threshold=16 ${args}-src = * src/hxml-0.2/* src/noDB/Text/XML/HXQ/* src/withDB/Text/XML/HXQ/* src/* src/Text/XML/HXQ/* src/mysql/* src/sqlite/*+src = * src/hxml-0.2/* src/noDB/Text/XML/HXQ/* src/withDB/Text/XML/HXQ/* \+ src/* src/Text/XML/HXQ/* src/mysql/* src/sqlite/* # build the xquery interpreter all: $(parser) Main.hs@@ -25,14 +29,15 @@ $(ghc) --make Test1.hs -o a.out ./a.out +# testing on a large file (dblp.xml) test2: $(parser) Test2.hs $(ghc) --make Test2.hs -o a.out- time ./a.out +RTS -H2m -M3.2m+ time ./a.out +RTS -H2m -# uses quasi-quotes (for ghc >= 6.9 only)+# like test2 but uses quasi-quotes (for ghc >= 6.9 only) test2a: $(parser) Test2a.hs $(ghc) --make Test2a.hs -o a.out- time ./a.out +RTS -H2m -M3.2m+ ./a.out +RTS -H2m -s test3: $(parser) TestDB.hs $(ghc) --make TestDB.hs -o a.out@@ -42,14 +47,13 @@ $(ghc) --make TestDB2.hs -o a.out ./a.out -# extract the structural summary of dblp.xml-dblp1: $(parser) TestDBLP1.hs- $(ghc) --make TestDBLP1.hs -o a.out- time ./a.out +RTS -H200m -K100m+xmark: $(parser) TestXMark.hs+ $(ghc) --make TestXMark.hs -o a.out+ time ./a.out +RTS -H2m -s -# store dblp.xml into a MySQL database-dblp2: $(parser) TestDBLP2.hs- $(ghc) --make TestDBLP2.hs -o a.out+# populate the DBLP database using the dblp.xml file+dblp: $(parser) TestDBLP.hs+ $(ghc) --make TestDBLP.hs -o a.out time ./a.out # run in the ghci interpreter and load HXQ@@ -60,10 +64,12 @@ test: $(parser) data/test.xq ./xquery data/test.xq | diff - data/test-results.txt -# heap profiling+# heap profiling of the compiler profile: $(parser) Test2.hs- ghc -O2 -funfolding-use-threshold=16 -isrc -isrc/hxml-0.2 -isrc/noDB --make Test2.hs -o a.out- ghc -O2 -funfolding-use-threshold=16 -isrc -isrc/hxml-0.2 -isrc/noDB -prof -auto-all -osuf p_o --make Test2.hs -o a.out+ ghc -O2 -funfolding-use-threshold=16 -isrc -isrc/hxml-0.2 -isrc/noDB \+ --make Test2.hs -o a.out+ ghc -O2 -funfolding-use-threshold=16 -isrc -isrc/hxml-0.2 -isrc/noDB \+ -prof -auto-all -osuf p_o --make Test2.hs -o a.out time ./a.out +RTS -hc hp2ps -color a.out.hp @@ -75,7 +81,8 @@ runhaskell Setup.lhs sdist clean:- /bin/rm -f xquery Temp.hs a.out $(addsuffix .hi,$(src)) $(addsuffix .o,$(src)) $(addsuffix .p_o,$(src))+ /bin/rm -f xquery Temp.hs a.out $(addsuffix .hi,$(src)) \+ $(addsuffix .o,$(src)) $(addsuffix .p_o,$(src)) distclean: clean runhaskell Setup.lhs clean
+ TestDBLP.hs view
@@ -0,0 +1,35 @@+{--------------------------------------------------------------+-+- Creating the DBLP database+- Download dblp.xml.gz from http://dblp.uni-trier.de/xml/+- and uncompress it in the data directory.+- Programmer: Leonidas Fegaras (fegaras@cse.uta.edu)+- Date: 02/01/2009+-+---------------------------------------------------------------}++{-# LANGUAGE TemplateHaskell #-}++module Main where++import Text.XML.HXQ.XQuery+import System.IO+++main = do db <- connect "hxq"+ exists <- isSchema db "d"+ ans <- if exists+ then do putStr $ "The DBLP database already exists. Do you want to rebuild it? [y/n] "+ hFlush stdout+ line <- getLine+ return $ line == "y"+ else return True+ if ans+ then do putStrLn "Generating the relational schema for the DBPL database using hybrid inlining."+ -- ignore the HTML tags <i>, <sub>, <sup>, and <tt>+ genSchema db "data/dblp.xml" "d" ["i","sub","sup","tt"]+ putStrLn "Populating the DBPL database (will insert about 5M tuples)."+ shred db "data/dblp.xml" "d"+ putStrLn "Creating an index on author name."+ createIndex db "d" "author"+ else return ()
− TestDBLP1.hs
@@ -1,8 +0,0 @@-module Main where--import Text.XML.HXQ.XQuery---main = do db <- connect "hxq"- -- Generate the relational schema for the DBPL database using hybrid inlining. Ignore HTML tags- genSchema db "data/dblp.xml" "d" ["i","sub","sup","tt"]
− TestDBLP2.hs
@@ -1,12 +0,0 @@-{-# LANGUAGE TemplateHaskell #-}--module Main where--import Text.XML.HXQ.XQuery---main = do db <- connect "hxq"- -- populate the DBPL database (it takes about 12 minutes)- $(shredC "hxq" "data/dblp.xml" "d")- -- create an index on author name- createIndex db "d" "author"
+ TestXMark.hs view
@@ -0,0 +1,22 @@+{--------------------------------------------------------------+-+- Test the XQuery processor using the XMark benchmark+- Dowmload and compile XMark from+- http://monetdb.cwi.nl/xml/index.html+- Then use parameter -f 10 to create 1.1GB test file xdata.xml+- Programmer: Leonidas Fegaras (fegaras@cse.uta.edu)+- Date: 03/29/2009+-+---------------------------------------------------------------}++{-# LANGUAGE TemplateHaskell #-}+++module Main where++import Text.XML.HXQ.XQuery++main = do a <- $(xq " for $m in doc('data/xdata.xml')//europe//mail \+ \ where $m/date='08/06/1999' \+ \ return <mail>from: {$m/child::from/text()}, to: {$m/child::to/text()}</mail> ")+ putXSeq a
XQueryParser.y view
@@ -85,6 +85,7 @@ 'declare' { DECLARE } 'function' { FUNCTION } 'variable' { VARIABLE }+ 'view' { VIEW } 'at' { AT } '..' { DOTS } '.' { DOT }@@ -146,6 +147,10 @@ | 'declare' 'function' qname '(' params ')' 'as' type '{' expr '}' { Ast "function" ([Avar $3,$10]++$5) }+ | 'declare' 'view' qname+ '(' params ')' '{' expr '}' { Ast "view" ([Avar $3,$8]++$5) }+ | 'declare' 'view' qname+ '(' ')' '{' expr '}' { Ast "view" ([Avar $3,$7,Avar "."]) } qname :: { String } qname : 'QName' { $1 }@@ -460,7 +465,7 @@ | AND | OR | NOT | UNION | INTERSECT | EXCEPT | FOR | LET | IN | COMMA | ASSIGN | WHERE | ORDER | BY | ASCENDING | DESCENDING | ELEMENT | ATTRIBUTE | STAG | ETAG | SATISFIES | ATSIGN | SLASH | DECLARE | SEMI | COLON- | FUNCTION | VARIABLE | AT | DOT | DOTS | TokenEOF | PRE | POST | IS+ | FUNCTION | VARIABLE | VIEW | AT | DOT | DOTS | TokenEOF | PRE | POST | IS | INSERT | INTO | DELETE | FROM | REPLACE | WITH | INSTANCE | OF | CAST | CASTABLE | CASE | DEFAULT | TYPESWITCH | QName String | Variable String | XMLtext String | TInteger Int@@ -503,7 +508,7 @@ (FOR,"for"),(LET,"let"),(IN,"in"),(AS,"as"),(COMMA,"','"),(ASSIGN,":="),(WHERE,"where"),(ORDER,"order"), (BY,"by"),(ASCENDING,"ascending"),(DESCENDING,"descending"),(ELEMENT,"element"), (ATTRIBUTE,"attribute"),(STAG,"</"),(ETAG,"/>"),(SATISFIES,"satisfies"),(ATSIGN,"@"),- (SLASH,"/"),(DECLARE,"declare"),(FUNCTION,"function"),(VARIABLE,"variable"),+ (SLASH,"/"),(DECLARE,"declare"),(FUNCTION,"function"),(VARIABLE,"variable"),(VIEW,"view"), (INSERT,"insert"),(INTO,"into"),(DELETE,"delete"),(FROM,"from"),(REPLACE,"replace"),(WITH,"with"), (AT,"at"),(DOTS,".."),(DOT,"."),(SEMI,";"),(COLON,":"),(INSTANCE,"instance"),(OF,"of"), (CAST,"cast"),(CASTABLE,"castable"),(CASE,"case"),(DEFAULT,"default"),(TYPESWITCH,"typeswitch")]@@ -704,6 +709,7 @@ "declare" -> DECLARE "function" -> FUNCTION "variable" -> VARIABLE+ "view" -> VIEW "at" -> AT "eq" -> SEQ "ne" -> SNE@@ -728,6 +734,8 @@ var -> QName var in case token of QName v1 -> case rest of+ ':':':':rest2 -> let (v2,rest3) = span isQN rest2+ in [QName v1,COLON,COLON,QName v2] ++ lexer rest3 n ':':rest2 -> let (v2,rest3) = span isQN rest2 in [QName v1,COLON,QName v2] ++ lexer rest3 n _ -> QName v1 : lexer rest n
+ data/q5.xq view
@@ -0,0 +1,12 @@+declare function local:copy($element as element()) as element() {+ element {name($element)}+ {$element/@*,+ for $child in $element/node()+ return+ if ($child instance of element())+ then local:copy($child)+ else $child+ }+};++local:copy(doc('data/cs.xml')/*)
db.html view
@@ -7,14 +7,13 @@ <body> <center> <h1>HXQ with Database Connectivity</h1>-<h3>Download <a href="/HXQ-0.16.0.tar.gz">HXQ-0.16.0.tar.gz</a></h3>+<h3>Download <a href="/HXQ-0.17.0.tar.gz">HXQ-0.17.0.tar.gz</a></h3> </center> <p> <h2>Installation Instructions (HXQ with database connectivity)</h2> <p> You may use either MySQL or sqlite.-The best is MySQL through an ODBC driver. The easiest to install-is sqlite but it cannot be used to store large XML files.+The easiest to install is sqlite. <p> <h3>Installation with MySQL</h3> <p>@@ -44,7 +43,7 @@ <a href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/HDBC">HDBC</a> and the <a href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/HDBC-odbc">HDBC-odbc</a> driver.-Then you do:+Then you untar HXQ and inside the HXQ directory you do: <pre> runhaskell Setup.lhs configure -fmysql runhaskell Setup.lhs build@@ -59,7 +58,7 @@ <a href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/HDBC">HDBC</a> and the <a href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/HDBC-sqlite3">HDBC-sqlite3</a> driver.-Then you do:+Then you untar HXQ and inside the HXQ directory you do: <pre> runhaskell Setup.lhs configure -fsqlite runhaskell Setup.lhs build@@ -121,10 +120,6 @@ genSchema db "data/cs.xml" "c" [] shred db "data/cs.xml" "c" </pre>-For large XML documents, you better use the compiled version of <tt>shred</tt>:-<pre>-$(shredC dbname pathname schemaname)-</pre> <p> The Haskell function <pre>@@ -177,14 +172,21 @@ for $e in publish('hxq','e')//employee return replace $e/salary with $e/salary*1.5 </pre> <p>+<h2>Virtual Views</h2>+<p>+Virtual views are declared using the <tt>declare view</tt> syntax. For example:+<pre>+declare view byAuthor ($x) { publish("hxq","d")//inproceedings[author=$x]/title }+</pre>+Virtual views are like functions but they are macro-expanded before optimization (so they cannot be recursive),+<p> <h2>Example: Installing and Querying the DBLP Database</h2> <p> First download and uncompress <tt>dblp.xml.gz</tt> from <a href="http://dblp.uni-trier.de/xml/">DBLP</a>.-To install the DBLP database using MySQL, compile and execute-<a href="TestDBLP1.hs">TestDBLP1.hs</a> first (using ghc options <tt>+RTS -H200m -K100m</tt>) and then-<a href="TestDBLP2.hs">TestDBLP2.hs</a>.+To install the DBLP database, compile and execute+<a href="TestDBLP.hs">TestDBLP.hs</a>. Then, you may evaluate queries, such as <a href="data/q4.xq">data/q4.xq</a>, using the HXQ interpreter,-<tt>xquery -db hxq -t data/q4.xq</tt>, which takes about 90 milliseconds.+<tt>xquery -db hxq -t data/q4.xq</tt>, which takes about 90 milliseconds with MySQL. <p> <h2>Status</h2> <p>@@ -195,4 +197,4 @@ <p> <hr> <p>-<address>Last modified: 01/17/09 by <a href="http://lambda.uta.edu/">Leonidas Fegaras</a></address>+<address>Last modified: 03/29/09 by <a href="http://lambda.uta.edu/">Leonidas Fegaras</a></address>
hxq-manual.pdf view
binary file changed (42281 → 42393 bytes)
index.html view
@@ -7,7 +7,7 @@ <body> <center> <h1>HXQ: A Compiler from XQuery to Haskell</h1>-<h3>Download <a href="/HXQ-0.16.0.tar.gz">HXQ-0.16.0.tar.gz</a></h3>+<h3>Download <a href="/HXQ-0.17.0.tar.gz">HXQ-0.17.0.tar.gz</a></h3> </center> <p> <h2>Description</h2>@@ -52,7 +52,7 @@ (420MB), runs in 36 seconds on my laptop PC and uses a maximum of 3.2MB of heap space (using the runtime options <tt>+RTS -H2m -M3.2m</tt>). (All results are taken on an Intel Core 2 Duo-2.2GHz 2GB running ghc-6.8.3 on Linux 2.6.27 kernel.) To contrast+2.2GHz 2GB running ghc-6.8.3 on a 32-bit Linux 2.6.27 kernel.) To contrast this, <a href="http://www.gnu.org/software/qexo/">Qexo</a>, which compiles XQueries to Java bytecode, takes 1 minute 17 seconds and uses 1400MB of heap space for the same query,@@ -98,7 +98,7 @@ if you want to modify the XQuery parser, you need to install the parser generator for Haskell, <a href="http://www.haskell.org/happy/">happy</a>. Then,-download <a href="/HXQ-0.16.0.tar.gz">HXQ version 0.16.0</a> and untar+download <a href="/HXQ-0.17.0.tar.gz">HXQ version 0.17.0</a> and untar it (using <tt>tar xfz</tt> on Linux/Mac or <a href="http://www.7-zip.org/">7z x</a> on Windows). Then, you execute the following commands inside the HXQ directory:@@ -147,8 +147,10 @@ <h2>XQuery Documentation</h2> <p> The complete XQuery syntax in HXQ is described in <a href="hxq-manual.pdf">hxq-manual.pdf</a>.-Here some tutorials on <a href="http://lambda.uta.edu/cse6339/queries2.pdf">XPath</a>-and <a href="http://lambda.uta.edu/cse6339/xquery2.pdf">XQuery</a>.+I have also written a <a href="/vldb09.pdf">paper</a> that describes some of the+ database related methods used in the implementation.+Here some tutorials on <a href="http://lambda.uta.edu/cse5335/queries.pdf">XPath</a>+and <a href="http://lambda.uta.edu/cse5335/xquery.pdf">XQuery</a>. Here are two relevant courses on XML and databases at <a href="http://www.stanford.edu/class/cs345b/">Stanford</a> and <a href="http://www.dbis.ethz.ch/education/ws0708/xml_db_ws2007">ETH</a>. A nice <a href="http://www.ics.uci.edu/community/events/carey/index.php">video lecture on XQuery</a> by Michael Carey.@@ -227,6 +229,8 @@ With <tt>xquery -help</tt> you get the list of system functions and usage information. <p>+<h3><a href="release.html">Release Notes</a></h3>+<p> <hr> <p>-<address>Last modified: 01/17/09 by <a href="http://lambda.uta.edu/">Leonidas Fegaras</a></address>+<address>Last modified: 03/30/09 by <a href="http://lambda.uta.edu/">Leonidas Fegaras</a></address>
+ release.html view
@@ -0,0 +1,37 @@+<html>+<head>+<link rel="shortcut icon" href="http://haskell.org/favicon.ico" type="image/x-icon" />+<link rel="icon" href="http://haskell.org/favicon.ico" type="image/x-icon" />+<title>HXQ: A Compiler from XQuery to Haskell</title>+</head>+<body>+<center>+<h1>HXQ: Release Notes</h1>+</center>+<p>+<dl>+<dt> HXQ-0.17.0 (released on 03/30/09)</dt>+<dd>+<ul>+<li> Improved streaming: Before this release, the cache requirements for parsing an XML document was the size+of the largest root child generated by the parser. For DBLP, this was not a problem since this data was generated from a relational+database so it was mostly flat. But for XMark, which is a automatically generated document-centric XML data,+the root contains only one child, which in turn contains one child, etc up to 3 levels. This created a space+leak for XMark. The way I improved it is to look at the event stream before constructing the XML tree+and decide at which level to chop the stream so that the size of the first XML tree would require a bounded space.+Then, during parsing, when the tree construction reaches this level, it immediately closes the current tree and start a new tree.+This was done in such a way that XQueries that do the testing/output beyond the chopping level, will still produce the correct result.+For all small documents and for most large documents (such as DBLP), chopping was not necessary.+For XMark, though the chopping was done at level 3. Now 1.1GB of XMark needs just 10MB of heap. The drawback: some queries that work+on level<3 will not return correct results. Eg, <tt>count(doc('data/xdata.xml')/site/sites/europe)</tt> over this XMark file will return 3M instead of just 1.+<li> Added virtual views using the syntax <tt>declare view ...</tt>, which is similar to function declarations.+In contrast to functions, views are unfolded before query optimization, so they cannot be recursive.+Also special care must be taken to have a linear use of the view parameters, since otherwise it may lead to code explosion.+XML views are very important for my data integration project that I am currently implementing.+</ul>+</dd>+</dl>+<p>+<hr>+<p>+<address>Last modified: 03/30/09 by <a href="http://lambda.uta.edu/">Leonidas Fegaras</a></address>
+ src/DeepSeq.hs view
@@ -0,0 +1,73 @@+{-+stolen from comp.lang.functional from Dean Herington+DeepSeq.lhs -- deep strict evaluation support+The DeepSeq class provides a method deepSeq that is similar to seq+except that it forces deep evaluation of its first argument before+returning its second argument.+Instances of DeepSeq are provided for Prelude types. Other instances+must be supplied by users of this module.+-}+++module DeepSeq where+++class DeepSeq a where deepSeq :: a -> b -> b+++infixr 0 `deepSeq`, $!!+++($!!) :: (DeepSeq a) => (a -> b) -> a -> b+f $!! x = x `deepSeq` f x+++instance DeepSeq () where deepSeq = seq+++instance DeepSeq Bool where deepSeq = seq+instance DeepSeq Char where deepSeq = seq+++instance (DeepSeq a) => DeepSeq (Maybe a) where+ deepSeq Nothing y = y+ deepSeq (Just x) y = deepSeq x y+++instance (DeepSeq a, DeepSeq b) => DeepSeq (Either a b) where+ deepSeq (Left a) y = deepSeq a y+ deepSeq (Right b) y = deepSeq b y+++instance DeepSeq Ordering where deepSeq = seq+++instance DeepSeq Int where deepSeq = seq+instance DeepSeq Integer where deepSeq = seq+instance DeepSeq Float where deepSeq = seq+instance DeepSeq Double where deepSeq = seq+++instance DeepSeq (a -> b) where deepSeq = seq+++instance DeepSeq (IO a) where deepSeq = seq+++instance (DeepSeq a) => DeepSeq [a] where+ deepSeq [] y = y+ deepSeq (x:xs) y = deepSeq x $ deepSeq xs y+++instance (DeepSeq a,DeepSeq b) => DeepSeq (a,b) where+ deepSeq (a,b) y = deepSeq a $ deepSeq b y+instance (DeepSeq a,DeepSeq b,DeepSeq c) => DeepSeq (a,b,c) where+ deepSeq (a,b,c) y = deepSeq a $ deepSeq b $ deepSeq c y+instance (DeepSeq a,DeepSeq b,DeepSeq c,DeepSeq d) => DeepSeq (a,b,c,d) where+ deepSeq (a,b,c,d) y = deepSeq a $ deepSeq b $ deepSeq c $ deepSeq d y+instance (DeepSeq a,DeepSeq b,DeepSeq c,DeepSeq d,DeepSeq e) => DeepSeq (a,b,c,d,e) where+ deepSeq (a,b,c,d,e) y = deepSeq a $ deepSeq b $ deepSeq c $ deepSeq d $ deepSeq e y+instance (DeepSeq a,DeepSeq b,DeepSeq c,DeepSeq d,DeepSeq e,DeepSeq f) => DeepSeq (a,b,c,d,e,f) where+ deepSeq (a,b,c,d,e,f) y = deepSeq a $ deepSeq b $ deepSeq c $ deepSeq d $ deepSeq e $ deepSeq f y+instance (DeepSeq a,DeepSeq b,DeepSeq c,DeepSeq d,DeepSeq e,DeepSeq f,DeepSeq g) => DeepSeq (a,b,c,d,e,f,g) where+ deepSeq (a,b,c,d,e,f,g) y = deepSeq a $ deepSeq b $ deepSeq c $ deepSeq d $ deepSeq e $ deepSeq f $ deepSeq g y
src/Text/XML/HXQ/Compiler.hs view
@@ -4,7 +4,7 @@ - Programmer: Leonidas Fegaras - Email: fegaras@cse.uta.edu - Web: http://lambda.uta.edu/-- Creation: 02/15/08, last update: 01/04/09+- Creation: 02/15/08, last update: 03/27/09 - - Copyright (c) 2008 by Leonidas Fegaras, the University of Texas at Arlington. All rights reserved. - This material is provided as is, with absolutely no warranty expressed or implied.@@ -19,7 +19,7 @@ module Text.XML.HXQ.Compiler ( xe, xq, xqdb, maxPosition, containsLast, qName, qx,- parent_error, pathPosition, liftIOSources, uploadFile ) where+ parent_error, pathPosition, liftIOSources, downloadFile, expandViews ) where import Text.XML.HXQ.Parser import Text.XML.HXQ.XTree@@ -38,8 +38,8 @@ -- need to handle URIs too-uploadFile :: String -> IO String-uploadFile path+downloadFile :: String -> IO String+downloadFile path = readFile path @@ -103,6 +103,26 @@ parent_error = XError "constructed elements have no parent" +expandViews views exp+ = expand exp+ where expand (Ast "call" xs@(Avar fname:args))+ = case filter (\(n,params,_) -> (n == fname || ("fn:"++n) == fname)+ && length args == length params) views of+ [] -> Ast "call" (map expand xs)+ (_,params,body):_ -> expand $ subst body (zip params args)+ expand (Ast n xs) = Ast n (map expand xs)+ expand x = x+ subst (Avar var) binds = if memV var binds then findV var binds else Avar var+ subst (Ast "let" [Avar var,source,body]) binds+ = Ast "let" [Avar var,subst source binds,+ if memV var binds then body else subst body binds]+ subst (Ast "for" [Avar var,Avar ivar,source,body]) binds+ = Ast "for" [Avar var,Avar ivar,subst source binds,+ if memV var binds || memV ivar binds then body else subst body binds]+ subst (Ast n xs) binds = Ast n (map (\x -> subst x binds) xs)+ subst x binds = x++ -- extract the QName qName :: XSeq -> String qName [XText s] = s@@ -152,11 +172,11 @@ = compilePredicates preds [| index $xs $(litE (IntegerL (toInteger (n-1)))) |] True compilePredicates ((Ast "call" [Avar "last"]):preds) xs _- = compilePredicates preds [| [ last $xs ] |] True+ = compilePredicates preds [| let s = $xs in if null s then [] else [ last s ] |] True compilePredicates (pred:preds) xs True -- top-k like- | maxPosition pathPosition pred > 0- = compilePredicates (pred:preds)- [| take $(litE (IntegerL (toInteger (maxPosition pathPosition pred)))) $xs |] False+ | pos > 0+ = compilePredicates (pred:preds) [| take $(litE (IntegerL (toInteger pos))) $xs |] False+ where pos = maxPosition pathPosition pred compilePredicates (pred:preds) xs _ | containsLast pred -- blocking: use only when last() is used in the predicate = compilePredicates preds@@ -283,7 +303,7 @@ in [| foldir (\x i -> $f [x] [XInt i]) [] $s 1 |] Ast "sortTuple" (exp:orderBys) -- prepare each FLWOR tuple for sorting -> let res = foldl (\r a -> let ac = compile a context position last effective_axis- in [| $r++[text $ac] |] )+ in [| $r++[toData $ac] |] ) [| [ $(compile exp context position last effective_axis) ] |] orderBys in [| [ $res ] |] Ast "sort" (exp:ordList) -- blocking@@ -310,11 +330,11 @@ = compilePredicatesM preds [| index $xs $(litE (IntegerL (toInteger (n-1)))) |] True compilePredicatesM ((Ast "call" [Avar "last"]):preds) xs _- = compilePredicatesM preds [| [ last $xs ] |] True+ = compilePredicatesM preds [| let s = $xs in if null s then [] else [ last s ] |] True compilePredicatesM (pred:preds) xs True -- top-k like- | maxPosition pathPosition pred > 0- = compilePredicatesM (pred:preds)- [| take $(litE (IntegerL (toInteger (maxPosition pathPosition pred)))) $xs |] False+ | pos > 0+ = compilePredicatesM (pred:preds) [| take $(litE (IntegerL (toInteger pos))) $xs |] False+ where pos = maxPosition pathPosition pred compilePredicatesM (pred:preds) xs _ | containsLast pred -- blocking: use only when last() is used in the predicate = [| do let bl = $xs@@ -363,7 +383,7 @@ -> [| return $last |] Ast "call" [Avar f,Astring file] | elem f ["doc","fn:doc"]- -> [| do doc <- uploadFile file+ -> [| do doc <- downloadFile file return [materialize False (parseDocument doc)] |] Ast "step" (Avar "child":tag:Avar ".":preds) | effective_axis /= ""@@ -486,7 +506,7 @@ -> let vs = compileM exp context position last effective_axis res = foldl (\r a -> [| do ac <- $(compileM a context position last effective_axis) s <- $r- return (s++[text ac]) |] )+ return (s++[toData ac]) |] ) [| do v <- $vs; return [ v ] |] orderBys in [| do r <- $res; return [r] |] Ast "sort" (exp:ordList) -- blocking@@ -581,8 +601,8 @@ compileAst :: Ast -> Q Exp compileAst ast = compile (optimize ast) undef1 undef2 undef3 "" -compileAstM :: Ast -> Q Exp-compileAstM ast = compileM (optimize ast) undef1 undef2 undef3 ""+compileAstM :: Ast -> [(String,[String],Ast)] -> Q Exp+compileAstM ast views = compileM (optimize (expandViews views ast)) undef1 undef2 undef3 "" -- Compile an XQuery AST that does not perform IO (unlifted).@@ -602,19 +622,21 @@ -- Compile an XQuery AST that may read XML documents or use databases (IO lifted). -- When evaluated, it returns IO XSeq.-compileQueryM :: [Ast] -> Q Exp-compileQueryM ((Ast "function" ((Avar f):b:args)):xs)+compileQueryM :: [Ast] -> [(String,[String],Ast)] -> Q Exp+compileQueryM ((Ast "function" ((Avar f):b:args)):xs) views = let lvars = case args of [Astring a] -> [varP (mkName a)] _ -> [tupP (map (\(Avar a) -> varP (mkName a)) args)]- in letE [valD (varP (mkName f)) (normalB (lamE lvars (compileAstM b))) []]- (compileQueryM xs)-compileQueryM ((Ast "variable" [Avar v,u]):xs)- = [| $(compileAstM u) >>= $(lamE [varP (mkName v)] (compileQueryM xs)) |]-compileQueryM (query:xs)- = let (ast,ns) = liftIOSources (optimize query)+ in letE [valD (varP (mkName f)) (normalB (lamE lvars (compileAstM b views))) []]+ (compileQueryM xs views)+compileQueryM ((Ast "view" ((Avar f):b:args)):xs) views+ = compileQueryM xs ((f,map (\(Avar v) -> v) args,b):views)+compileQueryM ((Ast "variable" [Avar v,u]):xs) views+ = [| $(compileAstM u views) >>= $(lamE [varP (mkName v)] (compileQueryM xs views)) |]+compileQueryM (query:xs) views+ = let (ast,ns) = liftIOSources (optimize (expandViews views query)) code = compileM ast undef1 undef2 undef3 ""- rest = compileQueryM xs+ rest = compileQueryM xs views in foldl (\r (n,b,e) -> let d = lamE [varP (mkName n)] r bc = if b then [| True |] else [| False |] -- needed due to a bug in template haskell in case e of@@ -624,10 +646,10 @@ $(varE (mkName "_db")) $(litE (StringL sql))) >>= $d |] _ -> [| do let [XText f] = $(compileAst e)- doc <- uploadFile f+ doc <- downloadFile f $d [materialize $bc (parseDocument doc)] |]) [| (liftM2 (++)) $code $rest |] ns-compileQueryM [] = [| return [] |]+compileQueryM [] _ = [| return [] |] -- | Compile an XQuery expression that does not perform IO.@@ -639,13 +661,13 @@ -- | Compile an XQuery that may perform IO (such as reading an XML document or calling a user function). -- When the compiled code is evaluated, it returns a value of type @IO XSeq@. xq :: String -> Q Exp-xq query = compileQueryM (parse (scan query))+xq query = compileQueryM (parse (scan query)) [] -- | Compile an XQuery that may perform IO and/or queries a database. -- When the compiled code is evaluated, it returns @Connection -> IO XSeq@. xqdb :: String -> Q Exp-xqdb query = lamE [varP (mkName "_db")] (compileQueryM (parse (scan query)))+xqdb query = lamE [varP (mkName "_db")] (compileQueryM (parse (scan query)) []) #if __GLASGOW_HASKELL__ >= 609
src/Text/XML/HXQ/Functions.hs view
@@ -39,7 +39,7 @@ self_step tag x = case x of XElem t _ _ _ _ -> if t==tag || tag=="*" then [x] else []- _ -> [x]+ _ -> [] -- XPath step /tag or / *@@ -239,6 +239,8 @@ -- lazy: like foldr but with an index foldir :: (a -> Int -> b -> b) -> b -> [a] -> Int -> b+{-# INLINE foldir #-}+{-# SPECIALIZE foldir :: (XTree -> Int -> XSeq -> XSeq) -> XSeq -> XSeq -> Int -> XSeq #-} foldir c n [] i = n foldir c n (x:xs) i = c x i (foldir c n xs $! (i+1)) @@ -257,18 +259,22 @@ toBool b = if b then [trueXT] else [falseXT] -text :: XSeq -> XSeq-text xs = foldr (\x r -> case x of- XElem _ _ _ _ zs- -> (filter (\a -> case a of XText _ -> True; XInt _ -> True; XNull -> True;- XFloat _ -> True; XBool _ -> True; _ -> False) zs)++r- XText _ -> x:r- XInt _ -> x:r- XFloat _ -> x:r- XBool _ -> x:r- _ -> r) [] xs+-- data()+toData :: XSeq -> XSeq+toData xs+ = foldr (\x r -> case x of+ XElem _ _ _ _ zs+ -> (filter (\a -> case a of XText _ -> True; XInt _ -> True; XNull -> True; XAttr _ _ -> True;+ XFloat _ -> True; XBool _ -> True; _ -> False) zs)++r+ XAttr a v -> (XText v):r+ XText _ -> x:r+ XInt _ -> x:r+ XFloat _ -> x:r+ XBool _ -> x:r+ _ -> r) [] xs +-- string() string :: XSeq -> XSeq string xs = foldr (\x r -> case x of XElem _ _ _ _ zs -> (string zs)++r@@ -470,23 +476,23 @@ = [ -- general comparisons ( "=", 2,- \[xs,ys] -> toBool $ or [ compareXTrees x y == EQ | x <- text xs, y <- text ys ],- \[xs,ys] -> [| toBool $ or [ compareXTrees x y == EQ | x <- text $xs, y <- text $ys ] |] ),+ \[xs,ys] -> toBool $ or [ compareXTrees x y == EQ | x <- toData xs, y <- toData ys ],+ \[xs,ys] -> [| toBool $ or [ compareXTrees x y == EQ | x <- toData $xs, y <- toData $ys ] |] ), ( "!=", 2, \[xs,ys] -> toBool $ strictCompare xs ys /= EQ, \[xs,ys] -> [| toBool $ strictCompare $xs $ys /= EQ |] ), ( ">", 2,- \[xs,ys] -> toBool $ or [ compareXTrees x y == GT | x <- text xs, y <- text ys ],- \[xs,ys] -> [| toBool $ or [ compareXTrees x y == GT | x <- text $xs, y <- text $ys ] |] ),+ \[xs,ys] -> toBool $ or [ compareXTrees x y == GT | x <- toData xs, y <- toData ys ],+ \[xs,ys] -> [| toBool $ or [ compareXTrees x y == GT | x <- toData $xs, y <- toData $ys ] |] ), ( "<", 2,- \[xs,ys] -> toBool $ or [ compareXTrees x y == LT | x <- text xs, y <- text ys ],- \[xs,ys] -> [| toBool $ or [ compareXTrees x y == LT | x <- text $xs, y <- text $ys ] |] ),+ \[xs,ys] -> toBool $ or [ compareXTrees x y == LT | x <- toData xs, y <- toData ys ],+ \[xs,ys] -> [| toBool $ or [ compareXTrees x y == LT | x <- toData $xs, y <- toData $ys ] |] ), ( ">=", 2,- \[xs,ys] -> toBool $ or [ compareXTrees x y `elem` [GT,EQ] | x <- text xs, y <- text ys ],- \[xs,ys] -> [| toBool $ or [ compareXTrees x y `elem` [GT,EQ] | x <- text $xs, y <- text $ys ] |] ),+ \[xs,ys] -> toBool $ or [ compareXTrees x y `elem` [GT,EQ] | x <- toData xs, y <- toData ys ],+ \[xs,ys] -> [| toBool $ or [ compareXTrees x y `elem` [GT,EQ] | x <- toData $xs, y <- toData $ys ] |] ), ( "<=", 2,- \[xs,ys] -> toBool $ or [ compareXTrees x y `elem` [LT,EQ] | x <- text xs, y <- text ys ],- \[xs,ys] -> [| toBool $ or [ compareXTrees x y `elem` [LT,EQ] | x <- text $xs, y <- text $ys ] |] ),+ \[xs,ys] -> toBool $ or [ compareXTrees x y `elem` [LT,EQ] | x <- toData xs, y <- toData ys ],+ \[xs,ys] -> [| toBool $ or [ compareXTrees x y `elem` [LT,EQ] | x <- toData $xs, y <- toData $ys ] |] ), ( "deep-equal", 2, \[xs,ys] -> toBool $ or [ deep_equal x y | x <- xs, y <- ys ], \[xs,ys] -> [| toBool $ or [ deep_equal x y | x <- $xs, y <- $ys ] |] ),@@ -699,9 +705,12 @@ \[xs,ys] -> concat [ (take (i-1) xs)++(drop i xs) | XInt i <- toNums ys ], \[xs,ys] -> [| let x = $xs in concat [ (take (i-1) x)++(drop i x) | XInt i <- toNums $ys ] |] ), -- type testing and casting+ ( "data", 1,+ \[xs] -> toData xs,+ \[xs] -> [| toData $xs |] ), ( "text", 1,- \[xs] -> [ w | XElem _ _ _ _ ts <- xs, w <- text ts ],- \[xs] -> [| [ w | XElem _ _ _ _ ts <- $xs, w <- text ts ] |] ),+ \[xs] -> [ w | XElem _ _ _ _ ts <- xs, w <- toData ts ],+ \[xs] -> [| [ w | XElem _ _ _ _ ts <- $xs, w <- toData ts ] |] ), ( "string", 1, \[xs] -> string xs, \[xs] -> [| string $xs |] ),@@ -711,9 +720,6 @@ ( "local-name", 1, \[xs] -> getNames xs, \[xs] -> [| getNames $xs |] ),- ( "data", 1,- \[xs] -> text xs,- \[xs] -> [| text $xs |] ), ( "number", 1, \[xs] -> toNums xs, \[xs] -> [| toNums $xs |] ),
src/Text/XML/HXQ/Interpreter.hs view
@@ -4,7 +4,7 @@ - Programmer: Leonidas Fegaras - Email: fegaras@cse.uta.edu - Web: http://lambda.uta.edu/-- Creation: 03/22/08, last update: 01/17/09+- Creation: 03/22/08, last update: 03/27/09 - - Copyright (c) 2008 by Leonidas Fegaras, the University of Texas at Arlington. All rights reserved. - This material is provided as is, with absolutely no warranty expressed or implied.@@ -22,6 +22,7 @@ import Text.XML.HXQ.OptionalDB import Control.Monad import List(sortBy)+import Data.List(foldl') import XMLParse(parseDocument) import Readline import Text.XML.HXQ.Optimizer@@ -46,27 +47,28 @@ -- Each XPath predicate must calculate position() and last() from its input XSeq -- if last() is used, then the evaluation is blocking (need to store the whole input XSeq)-applyPredicates :: [Ast] -> XSeq -> Bool -> Environment -> Functions -> XSeq-applyPredicates [] xs _ _ _ = xs-applyPredicates ((Aint n):preds) xs _ env fncs -- shortcut that improves laziness- = applyPredicates preds (index xs (n-1)) True env fncs-applyPredicates ((Ast "call" [Avar "last"]):preds) xs _ env fncs- = applyPredicates preds [ last $xs ] True env fncs-applyPredicates (pred:preds) xs True env fncs -- top-k like- | maxPosition pathPosition pred > 0- = applyPredicates (pred:preds) (take (maxPosition pathPosition pred) xs) False env fncs-applyPredicates (pred:preds) xs _ env fncs- | containsLast pred -- blocking: use only when last() is used in the predicate- = let last = length xs- in applyPredicates preds- (foldir (\x i r -> case eval pred x i last "" env fncs of- [XInt k] -> if k == i then x:r else r -- indexing- b -> if conditionTest b then x:r else r) [] xs 1) True env fncs-applyPredicates (pred:preds) xs _ env fncs- = applyPredicates preds- (foldir (\x i r -> case eval pred x i undefv3 "" env fncs of- [XInt k] -> if k == i then x:r else r -- indexing- b -> if conditionTest b then x:r else r) [] xs 1) True env fncs+applyPredicates :: [Ast] -> XSeq -> Environment -> Functions -> XSeq+applyPredicates preds xs env fncs+ = foldl' (\s p -> applyPred s p True) xs preds+ where applyPred [] _ _ = []+ applyPred xs (Aint n) _ -- shortcut that improves laziness+ = index xs (n-1)+ applyPred xs (Ast "call" [Avar "last"]) _+ = [ last xs ]+ applyPred xs pred True -- top-k like+ | pos > 0+ = applyPred (take pos xs) pred False+ where pos = maxPosition pathPosition pred+ applyPred xs pred _+ | containsLast pred -- blocking: use only when last() is used in the predicate+ = let last = length xs+ in foldir (\x i r -> case eval pred x i last "" env fncs of+ [XInt k] -> if k == i then x:r else r -- indexing+ b -> if conditionTest b then x:r else r) [] xs 1+ applyPred xs pred _+ = foldir (\x i r -> case eval pred x i undefv3 "" env fncs of+ [XInt k] -> if k == i then x:r else r -- indexing+ b -> if conditionTest b then x:r else r) [] xs 1 -- The XQuery interpreter@@ -98,15 +100,15 @@ v = eval e context position last effective_axis env fncs in if v==[XNull] then v- else foldr (\x r -> (applyPredicates preds (descendant_any_with_tagged_children ts x) True env fncs)++r) [] v+ else foldr (\x r -> (applyPredicates preds (descendant_any_with_tagged_children ts x) env fncs)++r) [] v Ast "step" (Avar step:Astring tag:e:preds) -> let step_fnc = findV step pathFunctions v = eval e context position last effective_axis env fncs in if v==[XNull] then v- else foldr (\x r -> (applyPredicates preds (step_fnc tag x) True env fncs)++r) [] v+ else foldr (\x r -> (applyPredicates preds (step_fnc tag x) env fncs)++r) [] v Ast "filter" (e:preds)- -> applyPredicates preds (eval e context position last effective_axis env fncs) True env fncs+ -> applyPredicates preds (eval e context position last effective_axis env fncs) env fncs Ast "predicate" [condition,body] -> if conditionTest (eval condition undefv1 undefv2 undefv3 "" env fncs) then eval body context position last effective_axis env fncs@@ -161,7 +163,7 @@ Ast "sortTuple" (exp:orderBys) -- prepare each FLWOR tuple for sorting -> let ee = eval exp context position last effective_axis env fncs in [ XElem "" [] 0 parent_error- (foldl (\r a -> r++[XElem "" [] 0 parent_error (text (eval a context position last effective_axis env fncs))])+ (foldl (\r a -> r++[XElem "" [] 0 parent_error (toData (eval a context position last effective_axis env fncs))]) [XElem "" [] 0 parent_error ee] orderBys) ] Ast "sort" (exp:ordList) -- blocking -> let ce = map (\(XElem _ _ _ _ xs) -> map (\(XElem _ _ _ _ ys) -> ys) xs)@@ -181,35 +183,36 @@ -- The monadic applyPredicates that propagates IO state-applyPredicatesM :: [Ast] -> XSeq -> Bool -> Environment -> Functions -> Connection -> Statements -> IO XSeq-applyPredicatesM [] xs _ _ _ _ _ = return $! xs-applyPredicatesM ((Aint n):preds) xs _ env fncs db stmts -- shortcut that improves laziness- = applyPredicatesM preds (index xs (n-1)) True env fncs db stmts-applyPredicatesM (pred:preds) xs True env fncs db stmts -- top-k like- | maxPosition pathPosition pred > 0- = applyPredicatesM (pred:preds) (take (maxPosition pathPosition pred) xs) False env fncs db stmts-applyPredicatesM ((Ast "call" [Avar "last"]):preds) xs _ env fncs db stmts- = applyPredicatesM preds [ last $xs ] True env fncs db stmts-applyPredicatesM (pred:preds) xs _ env fncs db stmts- | containsLast pred -- blocking: use only when last() is used in the predicate- = do let last = length xs- vs <- foldir (\x i r -> do vs <- evalM pred x i last "" env fncs db stmts- s <- r- return $! (if case vs of- [XInt k] -> k == i -- indexing- b -> conditionTest b- then x:s else s))- (return []) xs 1- applyPredicatesM preds vs True env fncs db stmts-applyPredicatesM (pred:preds) xs _ env fncs db stmts- = do vs <- foldir (\x i r -> do vs <- evalM pred x i undefv3 "" env fncs db stmts- s <- r- return $! (if case vs of- [XInt k] -> k == i -- indexing- b -> conditionTest b- then x:s else s))- (return []) xs 1- applyPredicatesM preds vs True env fncs db stmts+applyPredicatesM :: [Ast] -> XSeq -> Environment -> Functions -> Connection -> Statements -> IO XSeq+applyPredicatesM preds xs env fncs db stmts+ = foldl' (\s p -> s >>= \r -> applyPred r p True) (return xs) preds+ where applyPred [] _ _ = return []+ applyPred xs (Aint n) _ -- shortcut that improves laziness+ = return $! index xs (n-1)+ applyPred xs (Ast "call" [Avar "last"]) _+ = return $! [ last xs ]+ applyPred xs pred True -- top-k like+ | pos > 0+ = applyPred (take pos xs) pred False+ where pos = maxPosition pathPosition pred+ applyPred xs pred _+ | containsLast pred -- blocking: use only when last() is used in the predicate+ = let last = length xs+ in foldir (\x i r -> do vs <- evalM pred x i last "" env fncs db stmts+ s <- r+ return $! (if case vs of+ [XInt k] -> k == i -- indexing+ b -> conditionTest b+ then x:s else s))+ (return []) xs 1+ applyPred xs pred _+ = foldir (\x i r -> do vs <- evalM pred x i undefv3 "" env fncs db stmts+ s <- r+ return $! (if case vs of+ [XInt k] -> k == i -- indexing+ b -> conditionTest b+ then x:s else s))+ (return []) xs 1 -- The monadic XQuery interpreter; it is like eval but has plumbing to propagate IO state@@ -231,15 +234,15 @@ Ast "call" [Avar "last"] -> return $! [XInt last] Ast "call" [Avar f,Astring file] | elem f ["doc","fn:doc"]- -> do doc <- uploadFile file+ -> do doc <- downloadFile file return $! [materialize False (parseDocument doc)] Ast "call" [Avar "debug",c] -> do ec <- evalM c context position last effective_axis env fncs db stmts- debugSession ec env fncs db+ debugSession ec env fncs [] db Ast "call" [Avar "eval",x] -> do xc <- evalM x context position last effective_axis env fncs db stmts case xc of- [ XText q ] -> do (res,_,_) <- evalQueryM (parse (scan q)) env fncs db False+ [ XText q ] -> do (res,_,_,_) <- evalQueryM (parse (scan q)) env fncs [] db False return res _ -> error $ "The eval argument must be a string: " ++ show xc Ast "step" (Avar "child":tag:Avar ".":preds)@@ -251,7 +254,7 @@ if vs==[XNull] then return vs else foldr (\x r -> (liftM2 (++)) (applyPredicatesM preds (descendant_any_with_tagged_children ts x)- True env fncs db stmts) r)+ env fncs db stmts) r) (return []) vs Ast "step" (Avar step:Astring tag:e:preds) -> let step_fnc = findV step pathFunctions@@ -259,11 +262,11 @@ if vs==[XNull] then return vs else foldr (\x r -> (liftM2 (++)) (applyPredicatesM preds (step_fnc tag x)- True env fncs db stmts) r)+ env fncs db stmts) r) (return []) vs Ast "filter" (e:preds) -> do vs <- evalM e context position last effective_axis env fncs db stmts- applyPredicatesM preds vs True env fncs db stmts+ applyPredicatesM preds vs env fncs db stmts Ast "predicate" [condition,body] -> do eb <- evalM condition undefv1 undefv2 undefv3 "" env fncs db stmts if conditionTest eb@@ -338,7 +341,7 @@ Ast "sortTuple" (exp:orderBys) -- prepare each FLWOR tuple for sorting -> do vs <- evalM exp context position last effective_axis env fncs db stmts os <- mapM (\a -> evalM a context position last effective_axis env fncs db stmts) orderBys- return $! [ XElem "" [] 0 parent_error (foldl (\r a -> r++[XElem "" [] 0 parent_error (text a)])+ return $! [ XElem "" [] 0 parent_error (foldl (\r a -> r++[XElem "" [] 0 parent_error (toData a)]) [XElem "" [] 0 parent_error vs] os) ] Ast "sort" (exp:ordList) -- blocking -> do vs <- evalM exp context position last effective_axis env fncs db stmts@@ -355,8 +358,9 @@ -- evaluate from input continuously-evalInput :: (String -> Environment -> Functions -> IO(Environment,Functions)) -> Environment -> Functions -> String -> IO ()-evalInput eval vs fs prompt+evalInput :: (String -> Environment -> Functions -> Functions -> IO(Environment,Functions,Functions))+ -> Environment -> Functions -> Functions -> String -> XSeq -> IO XSeq+evalInput eval es fs vs prompt dvalue = do let bracs s = (length $ filter (== '{') s) - (length $ filter (== '}') s) oneline prompt = do line <- readline prompt case line of@@ -377,49 +381,54 @@ else readlines (tail line) c else return $! (line,0) if stmt == "quit"- then if prompt == "> " then putStrLn "Bye!" else putStrLn ""- else do addHistory stmt- (nvs,nfs) <- eval stmt vs fs- evalInput eval nvs nfs prompt+ then do putStrLn $ if prompt == "> " then "Bye!" else ""+ return dvalue+ else if take 7 stmt == "return "+ then do (result,_,_,_) <- xqueryE (drop 7 stmt) es fs vs (error "Cannot use database operations here") False+ return result+ else do addHistory stmt+ (nes,nfs,nvs) <- eval stmt es fs vs+ evalInput eval nes nfs nvs prompt dvalue -debugSession :: XSeq -> Environment -> Functions -> Connection -> IO XSeq-debugSession e env fncs db+debugSession :: XSeq -> Environment -> Functions -> Functions -> Connection -> IO XSeq+debugSession e env fncs views db = do let se = show e- putStrLn $ "*** debug " ++ if null(index se 20) then se else (take 20 se) ++ " ..."+ putStrLn $ "*** HXQ debugger: " ++ if null(index se 20) then se else (take 20 se) ++ " ..." putStr $ "Local variables:" mapM putStr (distinct $ map (\(v,_) -> " $"++v) env)- putStrLn "\nYou may evaluate any XQuery. Type quit or ctr-D to continue execution."- evalInput (\s vs fs -> do (result,nvs,nfs) <- xqueryE s vs fs db False- putXSeq result- return (nvs,nfs)) env fncs "debug> "- return e+ putStrLn "\nYou may evaluate any XQuery. Type ctr-D to exit and return the argument; type 'return exp' to exit and return exp."+ evalInput (\s es fs vs -> do (result,evs,nfs,nvs) <- xqueryE s es fs vs db False+ putXSeq result+ return (evs,nfs,nvs)) env fncs views "debug> " e -evalQueryM :: [Ast] -> Environment -> Functions -> Connection -> Bool -> IO (XSeq,Environment,Functions)-evalQueryM [] variables functions db verbose- = return $! ([],variables,functions)-evalQueryM (query:xs) variables functions db verbose+evalQueryM :: [Ast] -> Environment -> Functions -> Functions -> Connection -> Bool -> IO (XSeq,Environment,Functions,Functions)+evalQueryM [] variables functions views db verbose+ = return $! ([],variables,functions,views)+evalQueryM (query:xs) variables functions views db verbose = case query of Ast "function" ((Avar f):body:args)- -> do let opt = optimize body+ -> do let opt = optimize (expandViews views body) if verbose then do putStrLn "Abstract Syntax Tree (AST):" putStrLn (ppAst body) putStrLn "Optimized AST:" putStrLn (ppAst opt) else return ()- evalQueryM xs variables ((f,map (\(Avar v) -> v) args,opt):functions) db verbose+ evalQueryM xs variables ((f,map (\(Avar v) -> v) args,opt):functions) views db verbose+ Ast "view" ((Avar f):body:args)+ -> evalQueryM xs variables functions ((f,map (\(Avar v) -> v) args,body):views) db verbose Ast "variable" [Avar v,u] -> do uv <- evalM (optimize u) undefv1 undefv2 undefv3 "" variables functions db []- evalQueryM xs ((v,uv):variables) functions db verbose- _ -> do let opt = optimize query+ evalQueryM xs ((v,uv):variables) functions views db verbose+ _ -> do let opt = optimize (expandViews views query) (ast,ns) = liftIOSources opt if verbose then do putStrLn "Abstract Syntax Tree (AST):" putStrLn (ppAst query) putStrLn "Optimized AST:"- putStrLn (ppAst opt)+ putStrLn (ppAst (foldl (\r (n,_,e) -> Ast "let" [Avar n,case e of Astring _ -> Ast "doc" [e]; _ -> e,r]) ast ns)) putStrLn "Result:" else return () env <- foldr (\(n,b,s) r -> case s of@@ -427,7 +436,7 @@ -> do env <- r return $! ((n,findV m env):env) Astring file- -> do doc <- uploadFile file+ -> do doc <- downloadFile file env <- r return $! ((n,[materialize b (parseDocument doc)]):env) _ -> r)@@ -440,24 +449,25 @@ _ -> r) (return []) ns result <- evalM ast undefv1 undefv2 undefv3 "" (env++variables) functions db stmts- (rest,renv,rfuns) <- evalQueryM xs variables functions db verbose- return $! (result++rest,renv,rfuns)+ (rest,renv,rfuns,rviews) <- evalQueryM xs variables functions views db verbose+ return $! (result++rest,renv,rfuns,rviews) -xqueryE :: String -> Environment -> Functions -> Connection -> Bool -> IO (XSeq,Environment,Functions)-xqueryE query variables functions db verbose- = evalQueryM (parse (scan query)) variables functions db verbose+xqueryE :: String -> Environment -> Functions -> Functions -> Connection -> Bool+ -> IO (XSeq,Environment,Functions,Functions)+xqueryE query variables functions views db verbose+ = evalQueryM (parse (scan query)) variables functions views db verbose -- | Evaluate the XQuery using the interpreter. xquery :: String -> IO XSeq-xquery query = do (u,_,_) <- xqueryE query [] [] (error "No database connectivity") False+xquery query = do (u,_,_,_) <- xqueryE query [] [] [] (error "No database connectivity") False return $! u -- | Evaluate the XQuery with database connectivity using the interpreter. xqueryDB :: String -> Connection -> IO XSeq-xqueryDB query db = do (u,_,_) <- xqueryE query [] [] db False+xqueryDB query db = do (u,_,_,_) <- xqueryE query [] [] [] db False return $! u
src/Text/XML/HXQ/Parser.hs view
@@ -221,21 +221,21 @@ happyActOffsets :: HappyAddr-happyActOffsets = HappyA# "\xfe\x00\xfe\x00\x5f\x00\xdc\x02\x25\x03\x00\x00\x44\x04\xca\x00\x00\x00\x00\x00\x6b\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\xdb\x02\xdb\x02\x53\x01\xa9\x00\x53\x01\x53\x01\x53\x01\x00\x00\xb5\x02\x53\x01\x99\x02\x99\x02\x63\x00\x11\x00\xfb\xff\xac\x02\x4c\x01\x00\x00\x53\x01\xa2\x02\x53\x01\xe0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x8f\x02\x53\x01\xa4\x03\x53\x01\x88\x03\xa9\x02\x8d\x02\x41\x00\x00\x00\xd3\x02\xa5\x02\x53\x01\x9a\x02\xd1\x02\xa0\x02\x53\x01\xa8\x02\xa6\x02\x65\x00\xa3\x02\x00\x00\x94\x02\x00\x00\x00\x00\x44\x04\x6e\x00\x67\x00\x00\x00\x9d\x01\x47\x00\xe7\xff\x0c\x00\x53\x01\x00\x00\x15\x00\x00\x00\x9e\x02\x7b\x02\x7b\x02\x53\x01\x53\x01\x53\x01\x53\x01\x53\x01\x53\x01\x53\x01\x53\x01\x53\x01\x53\x01\x53\x01\x53\x01\x53\x01\x53\x01\x53\x01\x53\x01\x53\x01\x53\x01\x53\x01\x53\x01\x53\x01\x53\x01\x53\x01\x53\x01\x53\x01\x53\x01\x53\x01\x53\x01\x53\x01\x43\x02\x61\x02\x5f\x02\x54\x00\x00\x00\xff\xff\x00\x00\x37\x02\x66\x00\x00\x00\x8c\x00\x8c\x00\x8c\x00\x81\x0a\x81\x0a\x81\x0a\xca\x03\x81\x0a\x28\x04\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x00\x00\x00\x00\x00\x00\x00\x00\x9e\x00\x9e\x00\x99\x0a\x44\x04\x5c\x02\x5b\x02\x84\x02\x53\x02\x00\x00\xfc\xff\x53\x01\x13\x00\xfe\xff\x48\x02\x00\x00\x00\x00\x6a\x00\x47\x02\x00\x00\x53\x01\x51\x00\x2c\x02\x53\x01\x53\x01\x53\x01\x00\x00\x53\x01\x00\x00\x66\x02\x3e\x02\x53\x01\x26\x02\x26\x02\x53\x01\x04\x03\x6d\x02\x53\x01\x3b\x02\xe7\x02\x6b\x02\x53\x01\x0c\x00\x00\x00\x07\x00\x71\x00\x67\x02\x53\x01\x02\x04\x53\x01\x21\x02\x1e\x02\x02\x04\x02\x04\xfa\x01\x8c\x00\x53\x01\x00\x00\x00\x00\x11\x02\x69\x00\x00\x00\x1f\x02\x61\x00\x00\x00\x01\x02\xe6\x03\xdc\x01\xe0\x01\xe6\x03\xf5\x01\x05\x00\xe6\x03\xdf\x01\xe6\x03\xe6\x03\xed\xff\x00\x00\xfb\xff\x2e\x00\x00\x00\x00\x02\x00\x00\x00\x00\xd1\x01\x5a\x00\x00\x00\x53\x01\xad\x01\x00\x00\x00\x00\x53\x01\x53\x01\x0d\x00\x00\x00\x2f\x00\xdd\x01\xdb\x01\x00\x00\x00\x00\x00\x00\x00\x00\x37\x00\x25\x00\x00\x00\x00\x00\x00\x00\x97\x01\x00\x00\x00\x00\x00\x00\xe6\x03\x46\x03\xb6\x01\xca\x01\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfb\xff\x00\x00\x99\x01\x53\x01\x54\x01\x53\x01\x00\x00\x05\x00\x53\x01\x53\x01\x53\x01\x00\x00\x53\x01\x00\x00\xe6\x03\x70\x01\x1b\x00\x77\x01\x00\x00\x8c\x00\x9e\x01\x8c\x00\x01\x00\x4b\x01\x53\x01\xfa\xff\xf9\xff\xe6\x03\xe6\x03\x00\x00\xb9\x01\x71\x01\xe6\x03\x94\x01\x00\x00\x94\x01\x00\x00\x00\x00\x53\x01\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x01\x8c\x01\x00\x00\x68\x01\x89\x01\x00\x00\x00\x00\x57\x01\x00\x00\x57\x01\x46\x03\x8a\x01\x53\x01\x00\x00\x00\x00\xe6\x03\x64\x01\x53\x01\x8c\x00\x00\x00\x53\x01\x42\x02\x84\x01\xa4\x02\x8c\x00\xe6\x03\x00\x00\x41\x01\x3f\x01\x00\x00\x00\x00\x00\x00\x00\x00\x53\x01\x00\x00\x85\x01\x53\x01\x87\x02\x00\x00\xe6\x03\x00\x00"#+happyActOffsets = HappyA# "\x01\x01\x01\x01\xa0\x00\xe9\x02\x31\x03\x00\x00\xb2\x04\x4e\x00\x00\x00\x00\x00\xee\xff\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\xe6\x02\xe6\x02\x57\x01\xab\x00\x57\x01\x57\x01\x57\x01\x00\x00\xfd\x02\x57\x01\xe4\x02\xe4\x02\x14\x00\x11\x00\x51\x00\xf2\x02\xca\x00\x00\x00\x57\x01\xb0\x02\x57\x01\xef\x02\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x02\x57\x01\x10\x04\x57\x01\xf4\x03\xb9\x02\x9f\x02\xb5\x02\xe8\xff\x00\x00\xde\x02\xb2\x02\x57\x01\xa4\x02\xdc\x02\xab\x02\x57\x01\xae\x02\xb8\x02\x88\x00\xb7\x02\x00\x00\x9e\x02\x00\x00\x00\x00\xb2\x04\x83\x00\x6c\x00\x00\x00\xa2\x01\xfd\xff\xe9\xff\x0d\x00\x57\x01\x00\x00\x15\x00\x00\x00\xaf\x02\x85\x02\x85\x02\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x8b\x02\xaa\x02\xa9\x02\x55\x00\x00\x00\xff\xff\x00\x00\x42\x02\x6b\x00\x00\x00\x7d\x00\x7d\x00\x7d\x00\x07\x0b\x07\x0b\x07\x0b\x37\x04\x07\x0b\x96\x04\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x01\x2e\x01\x1f\x0b\xb2\x04\x68\x02\x66\x02\x91\x02\x60\x02\x00\x00\xfc\xff\x57\x01\x13\x00\x08\x00\x55\x02\x00\x00\x00\x00\x7c\x00\x52\x02\x00\x00\x57\x01\x2d\x00\x38\x02\x57\x01\x57\x01\x57\x01\x00\x00\x57\x01\x00\x00\x79\x02\x4e\x02\x57\x01\x33\x02\x33\x02\x57\x01\x6e\x03\x78\x02\x57\x01\x45\x02\x51\x03\x77\x02\x57\x01\x0d\x00\x00\x00\x07\x00\x76\x02\x58\x00\x75\x02\x57\x01\x6f\x04\x57\x01\x28\x02\x2d\x02\x6f\x04\x6f\x04\x25\x02\x7d\x00\x57\x01\xfa\xff\x00\x00\x00\x00\x3b\x02\x79\x00\x00\x00\x67\x02\x76\x00\x00\x00\x48\x02\x53\x04\x03\x02\x27\x02\x53\x04\x1b\x02\x05\x00\x53\x04\xe5\x01\x53\x04\x53\x04\xed\xff\x00\x00\x51\x00\x52\x00\x00\x00\x06\x02\x00\x00\x00\x00\xfa\x01\x75\x00\x00\x00\x57\x01\xd6\x01\x00\x00\x00\x00\x57\x01\x57\x01\x2e\x00\x00\x00\xfb\xff\x07\x02\xe6\x01\x00\x00\x00\x00\x00\x00\x00\x00\x63\x00\x2f\x00\x00\x00\x00\x00\x00\x00\x05\x02\x00\x00\x00\x00\x00\x00\x53\x04\xb1\x03\xc1\x01\xd4\x01\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x00\x00\x00\xe2\x01\x57\x01\x97\x01\x57\x01\x00\x00\x05\x00\x57\x01\x57\x01\x57\x01\x00\x00\x57\x01\x00\x00\x68\x00\xbc\x01\xdc\x01\x53\x04\x7d\x01\x02\x00\x00\x00\x7d\x00\xa7\x01\x66\x00\x53\x01\x57\x01\x57\x01\x7d\x00\x9a\x01\x64\x00\xf9\xff\x53\x04\x53\x04\x00\x00\xbe\x01\x79\x01\x53\x04\x9c\x01\x00\x00\x9c\x01\x00\x00\x00\x00\x57\x01\x00\x00\x00\x00\x00\x00\x00\x00\x75\x01\x96\x01\x00\x00\x74\x01\x95\x01\x00\x00\x00\x00\x60\x01\x00\x00\x60\x01\xb1\x03\x93\x01\x57\x01\x00\x00\x00\x00\x57\x01\x00\x00\x0d\x03\x53\x04\x6a\x01\x57\x01\x7d\x00\x57\x01\x49\x02\x84\x01\xf0\x02\x7d\x00\x00\x00\xac\x02\x53\x04\x00\x00\x3d\x01\x3a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x01\x00\x00\x7c\x01\x57\x01\x8f\x02\x00\x00\x53\x04\x00\x00"# happyGotoOffsets :: HappyAddr-happyGotoOffsets = HappyA# "\xc2\x00\x17\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x01\x00\x00\x15\x01\x0b\x01\x6f\x0a\xf4\x04\xdd\x04\x58\x0a\x41\x0a\x00\x00\x76\x01\x2a\x0a\x03\x01\xfb\x00\x74\x01\x72\x01\xf4\x00\x00\x00\x00\x00\x00\x00\x13\x0a\x00\x00\xfc\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\x09\x00\x00\xce\x09\x00\x00\x6f\x01\x66\x01\x00\x00\x4f\x01\x00\x00\x61\x01\xb7\x09\x00\x00\x00\x00\x5a\x01\xa0\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x01\xc6\x04\x00\x00\x0e\x00\x00\x00\x58\x01\xd9\x00\xdb\x00\x89\x09\x72\x09\x5b\x09\x44\x09\x2d\x09\x16\x09\xff\x08\xe8\x08\xd1\x08\xba\x08\xa3\x08\x8c\x08\x75\x08\x5e\x08\x47\x08\x30\x08\x19\x08\x02\x08\xeb\x07\xd4\x07\xbd\x07\xa6\x07\x8f\x07\x78\x07\x61\x07\x4a\x07\x33\x07\x1c\x07\x05\x07\x00\x00\x00\x00\x00\x00\xaf\x04\x00\x00\x5d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x01\x7b\x01\x67\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x01\x98\x04\x56\x01\x4e\x01\x49\x01\x00\x00\x00\x00\x00\x00\x21\x01\x00\x00\xee\x06\xe8\x00\x30\x01\xd7\x06\xc0\x06\xa9\x06\x00\x00\x92\x06\x00\x00\x00\x00\x33\x01\x7b\x06\x29\x01\x27\x01\x64\x06\x00\x00\x00\x00\x81\x04\x00\x00\x00\x00\x00\x00\x6a\x04\x01\x01\x00\x00\x23\x01\x00\x00\x00\x00\x4d\x06\x00\x00\x36\x06\x00\x00\x0d\x01\x00\x00\x00\x00\x98\x00\x55\x01\x1f\x06\x00\x00\x00\x00\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x01\xd4\x00\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x03\x07\x01\x00\x00\x00\x00\x2f\x03\x08\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7e\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdc\x00\xb2\x00\xd0\x00\x00\x00\xf1\x05\xe1\x00\xda\x05\x00\x00\xdf\x00\xc3\x05\xac\x05\xcf\x02\x00\x00\x69\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x01\x00\x00\x38\x01\x00\x00\xd2\x00\x95\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x7e\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x75\x00\x96\x00\x00\x00\x67\x05\x00\x00\x00\x00\x00\x00\x00\x00\x50\x05\xc3\x00\x00\x00\x39\x05\x0b\x00\x00\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x05\x00\x00\x00\x00\x0b\x05\x00\x00\x00\x00\x00\x00\x00\x00"#+happyGotoOffsets = HappyA# "\xc4\x00\x1a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x01\x00\x00\x0e\x01\x06\x01\xf5\x0a\x4c\x05\x35\x05\xde\x0a\xc7\x0a\x00\x00\x78\x01\xb0\x0a\xef\x00\xb5\x00\x76\x01\x6f\x01\x03\x01\x00\x00\x00\x00\x00\x00\x99\x0a\x00\x00\x82\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x0a\x00\x00\x54\x0a\x00\x00\x6c\x01\x63\x01\x65\x01\x00\x00\x45\x01\x00\x00\x5a\x01\x3d\x0a\x00\x00\x00\x00\x52\x01\x26\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x01\x1e\x05\x00\x00\x8c\x00\x00\x00\x41\x01\xed\x00\x1a\x00\x0f\x0a\xf8\x09\xe1\x09\xca\x09\xb3\x09\x9c\x09\x85\x09\x6e\x09\x57\x09\x40\x09\x29\x09\x12\x09\xfb\x08\xe4\x08\xcd\x08\xb6\x08\x9f\x08\x88\x08\x71\x08\x5a\x08\x43\x08\x2c\x08\x15\x08\xfe\x07\xe7\x07\xd0\x07\xb9\x07\xa2\x07\x8b\x07\x00\x00\x00\x00\x00\x00\x07\x05\x00\x00\x61\x01\x00\x00\x00\x00\x00\x00\x00\x00\x92\x01\x8e\x01\x83\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x01\xf0\x04\x38\x01\x36\x01\x31\x01\x00\x00\x00\x00\x00\x00\x17\x01\x00\x00\x74\x07\xf7\x00\x27\x01\x5d\x07\x46\x07\x2f\x07\x00\x00\x18\x07\x00\x00\x00\x00\x26\x01\x01\x07\x1c\x01\x0b\x01\xea\x06\x00\x00\x00\x00\xd8\x04\x00\x00\x00\x00\x00\x00\xd7\x03\x04\x01\x00\x00\x0a\x01\x00\x00\x00\x00\x00\x00\xd3\x06\x00\x00\xbc\x06\x00\x00\xdd\x00\x00\x00\x00\x00\xe6\x00\x7f\x01\xa5\x06\xe3\x00\x00\x00\x00\x00\xdb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd3\x00\xd6\x00\xcb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x03\xe9\x00\x00\x00\x00\x00\x39\x03\x8e\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbc\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\xb4\x00\xaf\x00\x00\x00\x77\x06\xb8\x00\x60\x06\x00\x00\xb3\x00\x49\x06\x32\x06\xd8\x02\x00\x00\x71\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x01\x00\x00\x00\x00\xb6\x00\x1b\x06\x04\x06\x59\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x00\x00\x00\x00\x00\x00\x00\xed\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x93\x00\x00\x00\x71\x00\x0a\x00\x00\x00\xd6\x05\x00\x00\x00\x00\xbf\x05\x00\x00\x00\x00\x00\x00\x00\x00\xa8\x05\x4c\x01\x91\x05\x21\x00\x00\x00\x00\x00\x3f\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x05\x00\x00\x00\x00\x63\x05\x00\x00\x00\x00\x00\x00\x00\x00"# happyDefActions :: HappyAddr-happyDefActions = HappyA# "\x00\x00\x00\x00\x00\x00\xfd\xff\x6c\xff\x69\xff\xf9\xff\x9d\xff\xd4\xff\xd5\xff\x00\x00\xb0\xff\x82\xff\xd6\xff\x6f\xff\x6e\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf4\xff\x00\x00\x68\xff\x00\x00\x00\x00\x00\x00\x00\x00\xdb\xff\xaf\xff\xae\xff\x81\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\xff\x00\x00\x00\x00\x00\x00\xf4\xff\x00\x00\x00\x00\x00\x00\x00\x00\xa7\xff\x00\x00\xa8\xff\xb1\xff\x8c\xff\xb2\xff\xb3\xff\xaa\xff\x00\x00\x00\x00\x66\xff\x00\x00\x00\x00\x00\x00\x7b\xff\x00\x00\x7f\xff\x00\x00\x91\xff\x9b\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc\xff\x00\x00\xfe\xff\xfb\xff\x00\x00\x64\xff\x00\x00\x00\x00\x00\x00\xb8\xff\xb9\xff\xba\xff\xbb\xff\xbc\xff\xbd\xff\xbe\xff\xbf\xff\xc0\xff\xc1\xff\xc2\xff\xc3\xff\xc4\xff\xc5\xff\xc6\xff\xc7\xff\xc8\xff\xc9\xff\xca\xff\xcb\xff\xcc\xff\xcd\xff\xce\xff\xcf\xff\xd0\xff\xd1\xff\xd2\xff\xd3\xff\x9e\xff\xa5\xff\xa6\xff\x00\x00\x00\x00\x87\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\xff\x89\xff\x00\x00\x79\xff\x77\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\xff\x00\x00\x80\xff\x00\x00\x8b\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\xff\xf3\xff\x00\x00\x00\x00\x00\x00\x00\x00\xac\xff\x00\x00\x00\x00\x00\x00\xab\xff\xad\xff\x00\x00\x00\x00\x00\x00\x6b\xff\x6a\xff\x78\xff\x00\x00\x94\xff\x00\x00\x00\x00\x95\xff\x00\x00\xa0\xff\x00\x00\x00\x00\xa4\xff\x00\x00\x00\x00\xa9\xff\x00\x00\xd8\xff\xd9\xff\x00\x00\x6f\xff\x00\x00\x00\x00\x71\xff\x00\x00\x76\xff\x7e\xff\x00\x00\x00\x00\x83\xff\x00\x00\x00\x00\x84\xff\x85\xff\x00\x00\x00\x00\xee\xff\xb7\xff\xea\xff\x00\x00\x00\x00\xb6\xff\xb5\xff\x65\xff\xfa\xff\x00\x00\x00\x00\xe9\xff\xe8\xff\xe7\xff\x00\x00\xed\xff\xec\xff\xeb\xff\xda\xff\x96\xff\x9c\xff\x00\x00\x00\x00\x8a\xff\x92\xff\x70\xff\x6f\xff\x00\x00\x6f\xff\x75\xff\x00\x00\x00\x00\x00\x00\x7d\xff\x00\x00\x00\x00\x00\x00\x00\x00\x8e\xff\x00\x00\x8d\xff\xf8\xff\x00\x00\x00\x00\xf2\xff\xb4\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\xff\xa3\xff\x7c\xff\xd7\xff\x00\x00\xa2\xff\x74\xff\x6f\xff\x73\xff\x86\xff\x93\xff\x00\x00\x9a\xff\x98\xff\x97\xff\xe4\xff\xe0\xff\x00\x00\xe6\xff\xe1\xff\x00\x00\xe5\xff\xe2\xff\x00\x00\xe3\xff\x00\x00\x96\xff\x72\xff\x00\x00\x90\xff\x8f\xff\xf7\xff\xf0\xff\x00\x00\x00\x00\xf1\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xff\x99\xff\xde\xff\xdf\xff\xdd\xff\xdc\xff\xef\xff\xf6\xff\x00\x00\x62\xff\x00\x00\x00\x00\x00\x00\xf5\xff\x63\xff"#+happyDefActions = HappyA# "\x00\x00\x00\x00\x00\x00\xfd\xff\x6a\xff\x67\xff\xf9\xff\x9b\xff\xd2\xff\xd3\xff\x00\x00\xae\xff\x80\xff\xd4\xff\x6d\xff\x6c\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\xff\x00\x00\x66\xff\x00\x00\x00\x00\x00\x00\x00\x00\xd9\xff\xad\xff\xac\xff\x7f\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\xff\x00\x00\x00\x00\x00\x00\xf2\xff\x00\x00\x00\x00\x00\x00\x00\x00\xa5\xff\x00\x00\xa6\xff\xaf\xff\x8a\xff\xb0\xff\xb1\xff\xa8\xff\x00\x00\x00\x00\x64\xff\x00\x00\x00\x00\x00\x00\x79\xff\x00\x00\x7d\xff\x00\x00\x8f\xff\x99\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc\xff\x00\x00\xfe\xff\xfb\xff\x00\x00\x62\xff\x00\x00\x00\x00\x00\x00\xb6\xff\xb7\xff\xb8\xff\xb9\xff\xba\xff\xbb\xff\xbc\xff\xbd\xff\xbe\xff\xbf\xff\xc0\xff\xc1\xff\xc2\xff\xc3\xff\xc4\xff\xc5\xff\xc6\xff\xc7\xff\xc8\xff\xc9\xff\xca\xff\xcb\xff\xcc\xff\xcd\xff\xce\xff\xcf\xff\xd0\xff\xd1\xff\x9c\xff\xa3\xff\xa4\xff\x00\x00\x00\x00\x85\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\xff\x87\xff\x00\x00\x77\xff\x75\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\xff\x00\x00\x7e\xff\x00\x00\x89\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x78\xff\xf1\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\xff\x00\x00\x00\x00\x00\x00\xa9\xff\xab\xff\x00\x00\x00\x00\x00\x00\x00\x00\x69\xff\x68\xff\x76\xff\x00\x00\x92\xff\x00\x00\x00\x00\x93\xff\x00\x00\x9e\xff\x00\x00\x00\x00\xa2\xff\x00\x00\x00\x00\xa7\xff\x00\x00\xd6\xff\xd7\xff\x00\x00\x6d\xff\x00\x00\x00\x00\x6f\xff\x00\x00\x74\xff\x7c\xff\x00\x00\x00\x00\x81\xff\x00\x00\x00\x00\x82\xff\x83\xff\x00\x00\x00\x00\xec\xff\xb5\xff\xe8\xff\x00\x00\x00\x00\xb4\xff\xb3\xff\x63\xff\xfa\xff\x00\x00\x00\x00\xe7\xff\xe6\xff\xe5\xff\x00\x00\xeb\xff\xea\xff\xe9\xff\xd8\xff\x94\xff\x9a\xff\x00\x00\x00\x00\x88\xff\x90\xff\x6e\xff\x6d\xff\x00\x00\x6d\xff\x73\xff\x00\x00\x00\x00\x00\x00\x7b\xff\x00\x00\x00\x00\x00\x00\x00\x00\x8c\xff\x00\x00\x8b\xff\x00\x00\xf0\xff\x00\x00\xf8\xff\x00\x00\x00\x00\xb2\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9d\xff\xa1\xff\x7a\xff\xd5\xff\x00\x00\xa0\xff\x72\xff\x6d\xff\x71\xff\x84\xff\x91\xff\x00\x00\x98\xff\x96\xff\x95\xff\xe2\xff\xde\xff\x00\x00\xe4\xff\xdf\xff\x00\x00\xe3\xff\xe0\xff\x00\x00\xe1\xff\x00\x00\x94\xff\x70\xff\x00\x00\x8e\xff\x8d\xff\x00\x00\xef\xff\x00\x00\xf7\xff\xee\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf3\xff\x00\x00\x9f\xff\x97\xff\xdc\xff\xdd\xff\xdb\xff\xda\xff\xf4\xff\xed\xff\xf6\xff\x00\x00\x60\xff\x00\x00\x00\x00\x00\x00\xf5\xff\x61\xff"# happyCheck :: HappyAddr-happyCheck = HappyA# "\xff\xff\x02\x00\x03\x00\x04\x00\x09\x00\x0c\x00\x0c\x00\x0b\x00\x09\x00\x0b\x00\x0b\x00\x10\x00\x0b\x00\x0e\x00\x0f\x00\x10\x00\x0b\x00\x0b\x00\x16\x00\x07\x00\x2d\x00\x16\x00\x09\x00\x10\x00\x2b\x00\x03\x00\x09\x00\x0e\x00\x0b\x00\x10\x00\x0b\x00\x38\x00\x0b\x00\x13\x00\x14\x00\x15\x00\x25\x00\x0a\x00\x2d\x00\x2d\x00\x29\x00\x2a\x00\x1f\x00\x16\x00\x3f\x00\x2c\x00\x18\x00\x0a\x00\x34\x00\x35\x00\x36\x00\x34\x00\x35\x00\x10\x00\x3b\x00\x09\x00\x39\x00\x3b\x00\x3b\x00\x3c\x00\x41\x00\x0e\x00\x10\x00\x10\x00\x41\x00\x0a\x00\x3b\x00\x44\x00\x45\x00\x46\x00\x3a\x00\x10\x00\x2d\x00\x34\x00\x35\x00\x36\x00\x3b\x00\x52\x00\x3b\x00\x53\x00\x51\x00\x52\x00\x56\x00\x54\x00\x55\x00\x56\x00\x02\x00\x03\x00\x04\x00\x4c\x00\x09\x00\x56\x00\x56\x00\x09\x00\x0a\x00\x0b\x00\x3b\x00\x10\x00\x0e\x00\x0f\x00\x10\x00\x0c\x00\x0c\x00\x39\x00\x53\x00\x3b\x00\x16\x00\x56\x00\x09\x00\x0c\x00\x0b\x00\x41\x00\x0a\x00\x0a\x00\x3b\x00\x03\x00\x2d\x00\x0c\x00\x0c\x00\x07\x00\x03\x00\x25\x00\x0c\x00\x4c\x00\x3b\x00\x29\x00\x2a\x00\x38\x00\x52\x00\x03\x00\x03\x00\x18\x00\x43\x00\x07\x00\x2d\x00\x2d\x00\x34\x00\x35\x00\x39\x00\x3a\x00\x3b\x00\x39\x00\x2d\x00\x3b\x00\x2b\x00\x40\x00\x41\x00\x2d\x00\x2d\x00\x41\x00\x2d\x00\x2d\x00\x44\x00\x45\x00\x46\x00\x2d\x00\x04\x00\x2c\x00\x3b\x00\x2e\x00\x08\x00\x42\x00\x37\x00\x52\x00\x3f\x00\x51\x00\x52\x00\x11\x00\x54\x00\x55\x00\x56\x00\x02\x00\x03\x00\x04\x00\x10\x00\x11\x00\x12\x00\x13\x00\x09\x00\x0a\x00\x0b\x00\x03\x00\x57\x00\x0e\x00\x0f\x00\x10\x00\x08\x00\x03\x00\x1c\x00\x05\x00\x06\x00\x16\x00\x34\x00\x35\x00\x00\x00\x01\x00\x02\x00\x03\x00\x03\x00\x3b\x00\x05\x00\x06\x00\x08\x00\x09\x00\x03\x00\x0b\x00\x25\x00\x1d\x00\x1e\x00\x08\x00\x29\x00\x2a\x00\x12\x00\x13\x00\x14\x00\x03\x00\x16\x00\x17\x00\x08\x00\x19\x00\x08\x00\x34\x00\x35\x00\x1d\x00\x1e\x00\x08\x00\x39\x00\x08\x00\x3b\x00\x0c\x00\x1d\x00\x1e\x00\x0d\x00\x08\x00\x41\x00\x03\x00\x1c\x00\x44\x00\x45\x00\x46\x00\x08\x00\x1d\x00\x1e\x00\x29\x00\x2a\x00\x16\x00\x17\x00\x03\x00\x1c\x00\x2f\x00\x51\x00\x52\x00\x08\x00\x54\x00\x55\x00\x56\x00\x02\x00\x03\x00\x04\x00\x08\x00\x11\x00\x1d\x00\x1e\x00\x09\x00\x0d\x00\x0b\x00\x03\x00\x08\x00\x0e\x00\x0f\x00\x10\x00\x0c\x00\x1b\x00\x1d\x00\x1e\x00\x08\x00\x16\x00\x16\x00\x17\x00\x0c\x00\x01\x00\x02\x00\x03\x00\x1a\x00\x1b\x00\x08\x00\x1c\x00\x08\x00\x09\x00\x0c\x00\x0b\x00\x25\x00\x13\x00\x14\x00\x03\x00\x29\x00\x2a\x00\x12\x00\x13\x00\x14\x00\x1f\x00\x16\x00\x17\x00\x08\x00\x19\x00\x08\x00\x34\x00\x35\x00\x1d\x00\x1e\x00\x03\x00\x39\x00\x08\x00\x3b\x00\x3c\x00\x03\x00\x1b\x00\x05\x00\x06\x00\x41\x00\x1a\x00\x1b\x00\x44\x00\x45\x00\x46\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x03\x00\x03\x00\x05\x00\x06\x00\x51\x00\x52\x00\x03\x00\x54\x00\x55\x00\x56\x00\x02\x00\x03\x00\x04\x00\x03\x00\x03\x00\x05\x00\x06\x00\x09\x00\x03\x00\x0b\x00\x02\x00\x03\x00\x0e\x00\x0f\x00\x10\x00\x03\x00\x08\x00\x09\x00\x0f\x00\x0b\x00\x16\x00\x03\x00\x1c\x00\x05\x00\x06\x00\x08\x00\x12\x00\x13\x00\x14\x00\x03\x00\x16\x00\x17\x00\x03\x00\x19\x00\x03\x00\x25\x00\x03\x00\x1d\x00\x1e\x00\x29\x00\x2a\x00\x03\x00\x1c\x00\x05\x00\x06\x00\x03\x00\x0e\x00\x05\x00\x06\x00\x01\x00\x34\x00\x35\x00\x3d\x00\x3e\x00\x4c\x00\x39\x00\x4c\x00\x3b\x00\x0b\x00\x2c\x00\x07\x00\x3b\x00\x0a\x00\x41\x00\x2d\x00\x0a\x00\x44\x00\x45\x00\x46\x00\x2d\x00\x07\x00\x2b\x00\x52\x00\x2e\x00\x01\x00\x07\x00\x0a\x00\x05\x00\x2c\x00\x51\x00\x52\x00\x52\x00\x54\x00\x55\x00\x56\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x18\x00\x2d\x00\x09\x00\x06\x00\x09\x00\x4a\x00\x3b\x00\x18\x00\x4d\x00\x4e\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x08\x00\x14\x00\x2e\x00\x2b\x00\x0b\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x4a\x00\x0b\x00\x0a\x00\x4d\x00\x4e\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x4a\x00\x3a\x00\x52\x00\x4d\x00\x4e\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x4a\x00\x03\x00\x4f\x00\x4d\x00\x4e\x00\x09\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0a\x00\x3b\x00\x0a\x00\x52\x00\x3b\x00\x14\x00\x12\x00\x13\x00\x14\x00\x52\x00\x16\x00\x17\x00\x3a\x00\x19\x00\x3b\x00\x31\x00\x01\x00\x1d\x00\x1e\x00\x2d\x00\x2d\x00\x53\x00\x2c\x00\x4a\x00\x2c\x00\x4b\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x52\x00\x30\x00\x3b\x00\x2d\x00\x4a\x00\x03\x00\x2d\x00\x4d\x00\x4e\x00\x2e\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x3b\x00\x0b\x00\x43\x00\x0b\x00\x52\x00\x3b\x00\x12\x00\x13\x00\x14\x00\x3b\x00\x16\x00\x17\x00\x58\x00\x19\x00\x09\x00\x48\x00\x52\x00\x1d\x00\x1e\x00\x4a\x00\x43\x00\x3b\x00\x4d\x00\x4e\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x52\x00\x09\x00\x53\x00\xff\xff\x4a\x00\x03\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\x10\x00\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\xff\xff\xff\xff\xff\xff\x1d\x00\x1e\x00\x4a\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x03\x00\xff\xff\xff\xff\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\x0b\x00\x32\x00\x33\x00\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\xff\xff\xff\xff\xff\xff\x1d\x00\x1e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4a\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\x47\x00\xff\xff\xff\xff\x4a\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x49\x00\x4a\x00\x25\x00\xff\xff\x4d\x00\x4e\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4a\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x4a\x00\x25\x00\xff\xff\x4d\x00\x4e\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x03\x00\xff\xff\xff\xff\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\xff\xff\x4a\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\xff\xff\xff\xff\xff\xff\x1d\x00\x1e\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#+happyCheck = HappyA# "\xff\xff\x02\x00\x03\x00\x04\x00\x0a\x00\x0c\x00\x18\x00\x0b\x00\x09\x00\x0e\x00\x0b\x00\x10\x00\x0a\x00\x0e\x00\x0f\x00\x10\x00\x0b\x00\x0b\x00\x16\x00\x0b\x00\x07\x00\x16\x00\x2d\x00\x10\x00\x2b\x00\x03\x00\x09\x00\x11\x00\x0b\x00\x09\x00\x0b\x00\x0b\x00\x0b\x00\x38\x00\x08\x00\x3b\x00\x25\x00\x37\x00\x2d\x00\x0d\x00\x29\x00\x2a\x00\x2d\x00\x16\x00\x44\x00\x40\x00\x18\x00\x2d\x00\x34\x00\x35\x00\x36\x00\x34\x00\x35\x00\x38\x00\x09\x00\x09\x00\x39\x00\x0a\x00\x3b\x00\x3c\x00\x0e\x00\x10\x00\x10\x00\x10\x00\x1f\x00\x42\x00\x3b\x00\x3b\x00\x45\x00\x46\x00\x47\x00\x3a\x00\x4d\x00\x34\x00\x35\x00\x36\x00\x3b\x00\x53\x00\x3b\x00\x3b\x00\x54\x00\x52\x00\x53\x00\x57\x00\x55\x00\x56\x00\x57\x00\x02\x00\x03\x00\x04\x00\x09\x00\x09\x00\x57\x00\x57\x00\x09\x00\x0a\x00\x0b\x00\x10\x00\x10\x00\x0e\x00\x0f\x00\x10\x00\x39\x00\x3a\x00\x3b\x00\x54\x00\x3b\x00\x16\x00\x57\x00\x0a\x00\x41\x00\x42\x00\x0c\x00\x0b\x00\x0a\x00\x10\x00\x03\x00\x0a\x00\x0a\x00\x29\x00\x2a\x00\x1c\x00\x25\x00\x4d\x00\x0c\x00\x2f\x00\x29\x00\x2a\x00\x53\x00\x0c\x00\x0c\x00\x03\x00\x2c\x00\x0c\x00\x2e\x00\x07\x00\x0c\x00\x34\x00\x35\x00\x39\x00\x3b\x00\x3b\x00\x39\x00\x0c\x00\x3b\x00\x2d\x00\x2c\x00\x42\x00\x42\x00\x2d\x00\x03\x00\x42\x00\x2d\x00\x2d\x00\x45\x00\x46\x00\x47\x00\x2d\x00\x3b\x00\x13\x00\x14\x00\x15\x00\x2d\x00\x2d\x00\x53\x00\x53\x00\x2d\x00\x52\x00\x53\x00\x2d\x00\x55\x00\x56\x00\x57\x00\x02\x00\x03\x00\x04\x00\x2d\x00\x34\x00\x35\x00\x2b\x00\x09\x00\x0a\x00\x0b\x00\x03\x00\x3b\x00\x0e\x00\x0f\x00\x10\x00\x08\x00\x08\x00\x08\x00\x03\x00\x08\x00\x16\x00\x0d\x00\x07\x00\x00\x00\x01\x00\x02\x00\x03\x00\x40\x00\x16\x00\x17\x00\x1c\x00\x08\x00\x09\x00\x03\x00\x0b\x00\x25\x00\x1d\x00\x1e\x00\x08\x00\x29\x00\x2a\x00\x12\x00\x13\x00\x14\x00\x03\x00\x16\x00\x17\x00\x1c\x00\x19\x00\x08\x00\x34\x00\x35\x00\x1d\x00\x1e\x00\x43\x00\x39\x00\x11\x00\x3b\x00\x04\x00\x1d\x00\x1e\x00\x04\x00\x08\x00\x03\x00\x42\x00\x08\x00\x1c\x00\x45\x00\x46\x00\x47\x00\x1d\x00\x1e\x00\x08\x00\x1b\x00\x08\x00\x58\x00\x0c\x00\x03\x00\x0c\x00\x1f\x00\x52\x00\x53\x00\x08\x00\x55\x00\x56\x00\x57\x00\x02\x00\x03\x00\x04\x00\x03\x00\x3d\x00\x3e\x00\x3f\x00\x09\x00\x08\x00\x0b\x00\x03\x00\x08\x00\x0e\x00\x0f\x00\x10\x00\x0c\x00\x08\x00\x1d\x00\x1e\x00\x08\x00\x16\x00\x16\x00\x17\x00\x0c\x00\x01\x00\x02\x00\x03\x00\x1a\x00\x1b\x00\x1d\x00\x1e\x00\x08\x00\x09\x00\x08\x00\x0b\x00\x25\x00\x13\x00\x14\x00\x03\x00\x29\x00\x2a\x00\x12\x00\x13\x00\x14\x00\x08\x00\x16\x00\x17\x00\x1b\x00\x19\x00\x03\x00\x34\x00\x35\x00\x1d\x00\x1e\x00\x03\x00\x39\x00\x03\x00\x3b\x00\x3c\x00\x10\x00\x11\x00\x12\x00\x13\x00\x03\x00\x42\x00\x05\x00\x06\x00\x45\x00\x46\x00\x47\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x03\x00\x0f\x00\x05\x00\x06\x00\x52\x00\x53\x00\x03\x00\x55\x00\x56\x00\x57\x00\x02\x00\x03\x00\x04\x00\x03\x00\x03\x00\x05\x00\x06\x00\x09\x00\x1c\x00\x0b\x00\x02\x00\x03\x00\x0e\x00\x0f\x00\x10\x00\x03\x00\x08\x00\x09\x00\x08\x00\x0b\x00\x16\x00\x03\x00\x03\x00\x05\x00\x06\x00\x03\x00\x12\x00\x13\x00\x14\x00\x0e\x00\x16\x00\x17\x00\x03\x00\x19\x00\x03\x00\x25\x00\x01\x00\x1d\x00\x1e\x00\x29\x00\x2a\x00\x03\x00\x1c\x00\x05\x00\x06\x00\x03\x00\x4d\x00\x05\x00\x06\x00\x4d\x00\x34\x00\x35\x00\x1a\x00\x1b\x00\x0b\x00\x39\x00\x03\x00\x3b\x00\x05\x00\x06\x00\x03\x00\x2c\x00\x05\x00\x06\x00\x42\x00\x07\x00\x3b\x00\x45\x00\x46\x00\x47\x00\x0a\x00\x0a\x00\x2d\x00\x2d\x00\x07\x00\x2b\x00\x0b\x00\x53\x00\x05\x00\x01\x00\x52\x00\x53\x00\x2e\x00\x55\x00\x56\x00\x57\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x0b\x00\x2c\x00\x07\x00\x53\x00\x06\x00\x18\x00\x4b\x00\x2d\x00\x09\x00\x4e\x00\x4f\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x08\x00\x0a\x00\x09\x00\x3b\x00\x18\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x14\x00\x4b\x00\x2e\x00\x0a\x00\x4e\x00\x4f\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x4b\x00\x2b\x00\x0b\x00\x4e\x00\x4f\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x0b\x00\x4b\x00\x03\x00\x3a\x00\x4e\x00\x4f\x00\x53\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x50\x00\x09\x00\x09\x00\x3b\x00\x0a\x00\x0a\x00\x12\x00\x13\x00\x14\x00\x53\x00\x16\x00\x17\x00\x3b\x00\x19\x00\x53\x00\x3a\x00\x14\x00\x1d\x00\x1e\x00\x3b\x00\x31\x00\x01\x00\x2d\x00\x4b\x00\x2d\x00\x54\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x2c\x00\x2c\x00\x4c\x00\x53\x00\x3b\x00\x4b\x00\x03\x00\x2e\x00\x4e\x00\x4f\x00\x30\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x2d\x00\x2d\x00\x3b\x00\x0b\x00\x44\x00\x0b\x00\x12\x00\x13\x00\x14\x00\x3b\x00\x16\x00\x17\x00\x3b\x00\x19\x00\x53\x00\x59\x00\x3b\x00\x1d\x00\x1e\x00\x4b\x00\x09\x00\x49\x00\x4e\x00\x4f\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x44\x00\x53\x00\x3b\x00\x53\x00\x09\x00\x4b\x00\x03\x00\x54\x00\x4e\x00\x4f\x00\xff\xff\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\x10\x00\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\xff\xff\xff\xff\xff\xff\x1d\x00\x1e\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\x4f\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4b\x00\x03\x00\xff\xff\x4e\x00\x4f\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\xff\xff\xff\xff\xff\xff\x1d\x00\x1e\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\x4f\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x03\x00\xff\xff\xff\xff\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\x0b\x00\x32\x00\x33\x00\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\xff\xff\xff\xff\xff\xff\x1d\x00\x1e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4b\x00\xff\xff\xff\xff\x4e\x00\x4f\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\x48\x00\xff\xff\xff\xff\x4b\x00\xff\xff\xff\xff\x4e\x00\x4f\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x4a\x00\x4b\x00\x25\x00\xff\xff\x4e\x00\x4f\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4b\x00\xff\xff\xff\xff\x4e\x00\x4f\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x4b\x00\x25\x00\xff\xff\x4e\x00\x4f\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x03\x00\xff\xff\xff\xff\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\xff\xff\x03\x00\xff\xff\x1d\x00\x1e\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x0b\x00\xff\xff\x4b\x00\xff\xff\xff\xff\x4e\x00\x4f\x00\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x03\x00\xff\xff\xff\xff\x1d\x00\x1e\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\xff\xff\xff\xff\xff\xff\x1d\x00\x1e\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"# happyTable :: HappyAddr-happyTable = HappyA# "\x00\x00\x11\x00\x12\x00\x13\x00\x14\x00\x44\x01\x45\x01\xeb\x00\x14\x00\x36\x00\x15\x00\x18\x00\x48\x01\x16\x00\x17\x00\x18\x00\x15\x00\x4b\x00\x19\x00\xa8\x00\xaa\x00\x19\x00\xff\x00\xce\x00\x0f\x01\xb0\x00\x35\x00\x00\x01\x36\x00\x01\x01\x3a\x00\xab\x00\x9f\x00\x9c\x00\x0a\x00\x9d\x00\x1a\x00\x22\x01\xaf\x00\xaf\x00\x1b\x00\x1c\x00\x58\x01\x19\x00\x10\x01\x49\x01\xb1\x00\x39\x01\xa0\x00\xa1\x00\xec\x00\x1d\x00\x1e\x00\x3a\x01\x20\x00\x14\x00\x1f\x00\x37\x00\x20\x00\x21\x00\x22\x00\xfc\x00\x18\x00\xfd\x00\x22\x00\x3c\x01\x37\x00\x23\x00\x24\x00\x25\x00\xa9\x00\x3a\x01\x23\x01\xa0\x00\xa1\x00\xa2\x00\x37\x00\x27\x00\x37\x00\xed\x00\x26\x00\x27\x00\xee\x00\x28\x00\x29\x00\x2a\x00\x11\x00\x12\x00\x13\x00\x02\x01\x14\x00\x2a\x00\x4c\x00\x14\x00\x78\x00\x15\x00\x37\x00\x18\x00\x16\x00\x17\x00\x18\x00\x30\x01\x08\x01\x0c\x01\xa3\x00\x20\x00\x19\x00\xa4\x00\x39\x00\x17\x01\x3a\x00\x22\x00\xf8\x00\xae\x00\x37\x00\x36\x01\xaa\x00\x19\x01\xe7\x00\x37\x01\x51\x01\x1a\x00\xb0\x00\xfe\x00\xbf\x00\x1b\x00\x1c\x00\xac\x00\x27\x00\x36\x01\x52\x01\x4d\x00\xc0\x00\x3a\x01\xaf\x00\xaf\x00\x1d\x00\x1e\x00\xe2\x00\xe3\x00\x20\x00\x1f\x00\xaf\x00\x20\x00\xb3\x00\xe4\x00\x22\x00\xaf\x00\xaf\x00\x22\x00\xaf\x00\xaf\x00\x23\x00\x24\x00\x25\x00\xaf\x00\x1b\x01\xcb\x00\x37\x00\xcc\x00\x1c\x01\x74\x00\x4e\x00\x27\x00\xb4\x00\x26\x00\x27\x00\x50\x01\x28\x00\x29\x00\x2a\x00\x11\x00\x12\x00\x13\x00\x56\x00\x57\x00\x58\x00\x59\x00\x14\x00\x46\x00\x15\x00\x04\x00\x75\x00\x16\x00\x17\x00\x18\x00\x05\x00\xf0\x00\x41\x01\x55\x01\xf2\x00\x19\x00\xf4\x00\xf5\x00\x2a\x00\x02\x00\x03\x00\x04\x00\xf0\x00\x37\x00\x4c\x01\xf2\x00\x05\x00\x06\x00\x04\x00\x07\x00\x1a\x00\x2d\x01\x0f\x00\x05\x00\x1b\x00\x1c\x00\x08\x00\x09\x00\x0a\x00\x04\x00\x0b\x00\x0c\x00\x46\x01\x0d\x00\x05\x00\x1d\x00\x1e\x00\x0e\x00\x0f\x00\x3c\x00\x1f\x00\x3a\x00\x20\x00\x99\x00\x0a\x01\x0f\x00\x98\x00\x2a\x01\x22\x00\x04\x00\x2c\x01\x23\x00\x24\x00\x25\x00\x05\x00\x0c\x01\x0f\x00\x50\x00\x51\x00\x28\x01\x0c\x00\x04\x00\x2e\x01\x52\x00\x26\x00\x27\x00\x05\x00\x28\x00\x29\x00\x2a\x00\x11\x00\x12\x00\x13\x00\x3a\x00\x32\x01\xe0\x00\x0f\x00\x14\x00\x3b\x00\x15\x00\x05\x01\x3c\x00\x16\x00\x17\x00\x18\x00\x3d\x00\xe5\x00\x32\x00\x0f\x00\x3c\x00\x19\x00\x11\x01\x0c\x00\x47\x00\x02\x00\x03\x00\x04\x00\xce\x00\xa6\x00\x3c\x00\x0d\x01\x05\x00\x06\x00\x48\x00\x07\x00\x1a\x00\xe9\x00\x0a\x00\xcc\x00\x1b\x00\x1c\x00\x08\x00\x09\x00\x0a\x00\x1d\x01\x0b\x00\x0c\x00\xd6\x00\x0d\x00\xd7\x00\x1d\x00\x1e\x00\x0e\x00\x0f\x00\xd9\x00\x1f\x00\xdf\x00\x20\x00\x21\x00\xf0\x00\xe5\x00\x49\x01\xf2\x00\x22\x00\xa5\x00\xa6\x00\x23\x00\x24\x00\x25\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\xf0\x00\xe7\x00\x1f\x01\xf2\x00\x26\x00\x27\x00\x33\x00\x28\x00\x29\x00\x2a\x00\x11\x00\x12\x00\x13\x00\xf0\x00\x37\x00\x1a\x01\xf2\x00\x14\x00\xb7\x00\x15\x00\x75\x00\x04\x00\x16\x00\x17\x00\x18\x00\xbb\x00\x05\x00\x06\x00\x9a\x00\x07\x00\x19\x00\xf0\x00\xbd\x00\xf1\x00\xf2\x00\xc0\x00\x08\x00\x09\x00\x0a\x00\xc1\x00\x0b\x00\x0c\x00\x33\x00\x0d\x00\x37\x00\x1a\x00\x3f\x00\x0e\x00\x0f\x00\x1b\x00\x1c\x00\xf0\x00\x49\x00\xf5\x00\xf2\x00\xf0\x00\x4e\x00\xf6\x00\xf2\x00\x5b\x01\x1d\x00\x1e\x00\x30\x00\x31\x00\x54\x01\x1f\x00\x55\x01\x20\x00\x58\x01\x4f\x01\xa8\x00\x37\x00\x3d\x01\x22\x00\x3e\x01\x3f\x01\x23\x00\x24\x00\x25\x00\x40\x01\xa8\x00\x43\x01\x27\x00\x24\x01\x4b\x01\xa8\x00\x36\x01\xad\x00\x21\x01\x26\x00\x27\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x31\x01\x32\x01\xfa\x00\x11\x01\xfb\x00\x6f\x00\x37\x00\x09\x01\x70\x00\x71\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x0a\x01\x13\x01\x15\x01\x14\x01\x16\x01\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x18\x01\xc7\x00\x70\x00\x71\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\xa9\x00\x27\x00\x70\x00\x71\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x04\x00\x1f\x01\x70\x00\x71\x00\xca\x00\x05\x00\x42\x00\x24\x01\x07\x00\xd1\x00\xbf\x00\xd4\x00\x27\x00\x37\x00\xdb\x00\x08\x00\x09\x00\x0a\x00\x27\x00\x0b\x00\x0c\x00\xa9\x00\x0d\x00\x37\x00\xef\x00\xf0\x00\x0e\x00\x0f\x00\xaa\x00\xb5\x00\xf9\x00\x79\x00\x6f\x00\x7a\x00\x7b\x00\x70\x00\x71\x00\x1f\x01\x5a\x01\x5d\x01\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x57\x01\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x27\x00\x9c\x00\x37\x00\xaa\x00\x6f\x00\x04\x00\xb5\x00\x70\x00\x71\x00\xb6\x00\x05\x00\x42\x00\x25\x01\x07\x00\x37\x00\xb9\x00\xba\x00\xbd\x00\x27\x00\x37\x00\x08\x00\x09\x00\x0a\x00\x37\x00\x0b\x00\x0c\x00\xff\xff\x0d\x00\x2c\x00\x2e\x00\x27\x00\x0e\x00\x0f\x00\x6f\x00\x32\x00\x37\x00\x70\x00\x71\x00\xd2\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\xd5\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x27\x00\x72\x00\x73\x00\x00\x00\x6f\x00\x04\x00\x00\x00\x70\x00\x71\x00\x00\x00\x05\x00\x03\x01\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x6f\x00\x00\x00\x00\x00\x70\x00\x71\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x42\x00\x06\x01\x07\x00\x34\x01\x35\x01\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x00\x00\x00\x00\x00\x70\x00\x71\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x00\x00\x00\x00\xc3\x00\x00\x00\x00\x00\x6f\x00\x00\x00\x00\x00\x70\x00\x71\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\xc5\x00\x6f\x00\x00\x00\x00\x00\x70\x00\x71\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x00\x00\x00\x00\x00\x70\x00\x71\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x00\x00\x6b\x00\x00\x00\x00\x00\x00\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x42\x00\xcf\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x42\x00\xd2\x00\x07\x00\x00\x00\x6f\x00\x00\x00\x00\x00\x70\x00\x71\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x42\x00\xe8\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x42\x00\x76\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x42\x00\xa4\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x42\x00\x43\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x42\x00\x44\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x5d\x01\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x5b\x01\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x4b\x01\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x4d\x01\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x4f\x01\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x40\x01\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x45\x01\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x26\x01\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x27\x01\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x29\x01\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x2b\x01\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x02\x01\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x19\x01\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\xc7\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\xc8\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\xd5\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\xd8\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\xdb\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\xdc\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\xdd\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\xde\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\xe4\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x7b\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x7c\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x7d\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x7e\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x7f\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x80\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x81\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x82\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x83\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x84\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x85\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x86\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x87\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x88\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x89\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x8a\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x8b\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x8c\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x8d\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x8e\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x8f\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x90\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x91\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x92\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x93\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x94\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x95\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x96\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x97\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\xb6\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\xba\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\xc3\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\xc5\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x2c\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x2e\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x3e\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x40\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x41\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x46\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#+happyTable = HappyA# "\x00\x00\x11\x00\x12\x00\x13\x00\x1f\x01\x4b\x01\x4e\x00\xee\x00\x14\x00\xff\x00\x15\x00\x00\x01\x26\x01\x16\x00\x17\x00\x18\x00\x15\x00\x4c\x00\x19\x00\x37\x00\xa9\x00\x19\x00\xab\x00\xd1\x00\x12\x01\xb1\x00\x36\x00\x5b\x01\x37\x00\x3a\x00\x3b\x00\x3b\x00\xa0\x00\xac\x00\x3b\x00\xc0\x00\x1a\x00\x4f\x00\xb0\x00\x99\x00\x1b\x00\x1c\x00\xab\x00\x19\x00\xc1\x00\x13\x01\xb2\x00\x27\x01\xa1\x00\xa2\x00\xef\x00\x1d\x00\x1e\x00\xad\x00\x14\x00\x02\x01\x1f\x00\x40\x01\x20\x00\x21\x00\x03\x01\x18\x00\x04\x01\x41\x01\x64\x01\x22\x00\x38\x00\x38\x00\x23\x00\x24\x00\x25\x00\xaa\x00\x01\x01\xa1\x00\xa2\x00\xa3\x00\x38\x00\x27\x00\x38\x00\x38\x00\xf0\x00\x26\x00\x27\x00\xf1\x00\x28\x00\x29\x00\x2a\x00\x11\x00\x12\x00\x13\x00\x14\x00\x14\x00\x2a\x00\x4d\x00\x14\x00\x79\x00\x15\x00\x18\x00\x18\x00\x16\x00\x17\x00\x18\x00\xe5\x00\xe6\x00\x20\x00\xa4\x00\x38\x00\x19\x00\xa5\x00\x43\x01\xe7\x00\x22\x00\x4c\x01\x52\x01\x2b\x01\x41\x01\x5c\x01\xfb\x00\xaf\x00\x51\x00\x52\x00\x48\x01\x1a\x00\x05\x01\x37\x01\x53\x00\x1b\x00\x1c\x00\x27\x00\x0b\x01\x1a\x01\x3d\x01\xcd\x00\x1c\x01\xce\x00\x3e\x01\xea\x00\x1d\x00\x1e\x00\x0f\x01\x20\x00\x20\x00\x1f\x00\xb1\x00\x20\x00\xb0\x00\x53\x01\x22\x00\x22\x00\x27\x01\x5d\x01\x22\x00\xb0\x00\xb0\x00\x23\x00\x24\x00\x25\x00\xb0\x00\x38\x00\x9d\x00\x0a\x00\x9e\x00\xb0\x00\xb0\x00\x27\x00\x27\x00\xb0\x00\x26\x00\x27\x00\xb0\x00\x28\x00\x29\x00\x2a\x00\x11\x00\x12\x00\x13\x00\xb0\x00\xf7\x00\xf8\x00\xb4\x00\x14\x00\x47\x00\x15\x00\x04\x00\x38\x00\x16\x00\x17\x00\x18\x00\x05\x00\x3b\x00\x50\x01\x3d\x01\x31\x01\x19\x00\x3c\x00\x41\x01\x2a\x00\x02\x00\x03\x00\x04\x00\xb5\x00\x2f\x01\x0c\x00\x33\x01\x05\x00\x06\x00\x04\x00\x07\x00\x1a\x00\x34\x01\x0f\x00\x05\x00\x1b\x00\x1c\x00\x08\x00\x09\x00\x0a\x00\x04\x00\x0b\x00\x0c\x00\x35\x01\x0d\x00\x05\x00\x1d\x00\x1e\x00\x0e\x00\x0f\x00\x75\x00\x1f\x00\x39\x01\x20\x00\x1c\x01\x0d\x01\x0f\x00\x21\x01\x1d\x01\x08\x01\x22\x00\x1d\x01\x10\x01\x23\x00\x24\x00\x25\x00\x0f\x01\x0f\x00\x3d\x00\xe8\x00\x3d\x00\x76\x00\x9a\x00\x04\x00\x3e\x00\x22\x01\x26\x00\x27\x00\x05\x00\x28\x00\x29\x00\x2a\x00\x11\x00\x12\x00\x13\x00\x04\x00\x30\x00\x31\x00\x32\x00\x14\x00\x05\x00\x15\x00\xcf\x00\x3d\x00\x16\x00\x17\x00\x18\x00\x48\x00\xd9\x00\xe3\x00\x0f\x00\x3d\x00\x19\x00\x14\x01\x0c\x00\x49\x00\x02\x00\x03\x00\x04\x00\xd1\x00\xa7\x00\x33\x00\x0f\x00\x05\x00\x06\x00\xda\x00\x07\x00\x1a\x00\xec\x00\x0a\x00\xdc\x00\x1b\x00\x1c\x00\x08\x00\x09\x00\x0a\x00\xe2\x00\x0b\x00\x0c\x00\xe8\x00\x0d\x00\xea\x00\x1d\x00\x1e\x00\x0e\x00\x0f\x00\x34\x00\x1f\x00\x38\x00\x20\x00\x21\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xf3\x00\x22\x00\x61\x01\xf5\x00\x23\x00\x24\x00\x25\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xf3\x00\x9b\x00\x55\x01\xf5\x00\x26\x00\x27\x00\xb8\x00\x28\x00\x29\x00\x2a\x00\x11\x00\x12\x00\x13\x00\xf3\x00\xbc\x00\x4d\x01\xf5\x00\x14\x00\xbe\x00\x15\x00\x76\x00\x04\x00\x16\x00\x17\x00\x18\x00\xc1\x00\x05\x00\x06\x00\xc2\x00\x07\x00\x19\x00\xf3\x00\xc3\x00\x24\x01\xf5\x00\x34\x00\x08\x00\x09\x00\x0a\x00\x4f\x00\x0b\x00\x0c\x00\x38\x00\x0d\x00\x40\x00\x1a\x00\x67\x01\x0e\x00\x0f\x00\x1b\x00\x1c\x00\xf3\x00\x4a\x00\x20\x01\xf5\x00\xf3\x00\x5f\x01\xf4\x00\xf5\x00\x60\x01\x1d\x00\x1e\x00\xa6\x00\xa7\x00\x64\x01\x1f\x00\xf3\x00\x20\x00\xf8\x00\xf5\x00\xf3\x00\x58\x01\xf9\x00\xf5\x00\x22\x00\xa9\x00\x38\x00\x23\x00\x24\x00\x25\x00\x44\x01\x46\x01\x45\x01\x47\x01\xa9\x00\x4a\x01\x4d\x01\x27\x00\xae\x00\x54\x01\x26\x00\x27\x00\x28\x01\x28\x00\x29\x00\x2a\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x29\x01\x2a\x01\xa9\x00\x27\x00\x14\x01\x38\x01\x70\x00\x39\x01\xfd\x00\x71\x00\x72\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x0d\x01\x3d\x01\xfe\x00\x38\x00\x0c\x01\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x16\x01\x70\x00\x18\x01\xc9\x00\x71\x00\x72\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x17\x01\x19\x01\x71\x00\x72\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x1b\x01\x70\x00\x04\x00\xaa\x00\x71\x00\x72\x00\x27\x00\x05\x00\x43\x00\x2b\x01\x07\x00\x24\x01\xcc\x00\xcf\x00\xc0\x00\xd4\x00\xd7\x00\x08\x00\x09\x00\x0a\x00\x27\x00\x0b\x00\x0c\x00\x38\x00\x0d\x00\x27\x00\xaa\x00\xde\x00\x0e\x00\x0f\x00\x38\x00\xf2\x00\xf3\x00\xab\x00\x70\x00\xb6\x00\xfc\x00\x71\x00\x72\x00\x24\x01\x66\x01\x69\x01\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x61\x01\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x7a\x00\x7b\x00\x7c\x00\x27\x00\x38\x00\x70\x00\x04\x00\xb7\x00\x71\x00\x72\x00\x9d\x00\x05\x00\x43\x00\x2c\x01\x07\x00\xab\x00\xb6\x00\x38\x00\xba\x00\xbb\x00\xbe\x00\x08\x00\x09\x00\x0a\x00\x38\x00\x0b\x00\x0c\x00\x38\x00\x0d\x00\x27\x00\xff\xff\x38\x00\x0e\x00\x0f\x00\x70\x00\x2c\x00\x2e\x00\x71\x00\x72\x00\x63\x01\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x59\x01\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x33\x00\x27\x00\x38\x00\x27\x00\x73\x00\x70\x00\x04\x00\x74\x00\x71\x00\x72\x00\x00\x00\x05\x00\x06\x01\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x01\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x70\x00\x00\x00\x00\x00\x71\x00\x72\x00\xd5\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\xd8\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x00\x04\x00\x00\x00\x71\x00\x72\x00\x00\x00\x05\x00\x43\x00\x09\x01\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x70\x00\x00\x00\x00\x00\x71\x00\x72\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x43\x00\xd2\x00\x07\x00\x3b\x01\x3c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x00\x00\x00\x00\x00\x71\x00\x72\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x00\x00\x00\x00\x00\x00\xc5\x00\x00\x00\x00\x00\x70\x00\x00\x00\x00\x00\x71\x00\x72\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\xc7\x00\x70\x00\x00\x00\x00\x00\x71\x00\x72\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x00\x00\x00\x00\x00\x71\x00\x72\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x00\x00\x6c\x00\x00\x00\x00\x00\x00\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x43\x00\xd5\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x00\x00\x04\x00\x00\x00\x0e\x00\x0f\x00\x00\x00\x05\x00\x43\x00\xeb\x00\x07\x00\x00\x00\x70\x00\x00\x00\x00\x00\x71\x00\x72\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x43\x00\x77\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x43\x00\xa5\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x43\x00\x44\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x43\x00\x45\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x69\x01\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x67\x01\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x54\x01\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x56\x01\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x59\x01\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x5a\x01\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x47\x01\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x4e\x01\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x4f\x01\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x2d\x01\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x2e\x01\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x30\x01\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x32\x01\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x05\x01\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x1f\x01\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\xc9\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\xca\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\xd8\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\xdb\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\xde\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\xdf\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\xe0\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\xe1\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\xe7\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x7c\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x7d\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x7e\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x7f\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x80\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x81\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x82\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x83\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x84\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x85\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x86\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x87\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x88\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x89\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x8a\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x8b\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x8c\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x8d\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x8e\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x8f\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x90\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x91\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x92\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x93\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x94\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x95\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x96\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x97\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x98\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\xb7\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\xbb\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\xc5\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\xc7\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x2c\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x2e\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x3f\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x41\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x42\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x04\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x05\x00\x47\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x0d\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x0f\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"# -happyReduceArr = array (1, 157) [+happyReduceArr = array (1, 159) [ (1 , happyReduce_1), (2 , happyReduce_2), (3 , happyReduce_3),@@ -392,10 +392,12 @@ (154 , happyReduce_154), (155 , happyReduce_155), (156 , happyReduce_156),- (157 , happyReduce_157)+ (157 , happyReduce_157),+ (158 , happyReduce_158),+ (159 , happyReduce_159) ] -happy_n_terms = 89 :: Int+happy_n_terms = 90 :: Int happy_n_nonterms = 32 :: Int happyReduce_1 = happySpecReduce_2 0# happyReduction_1@@ -516,15 +518,49 @@ (Ast "function" ([Avar happy_var_3,happy_var_10]++happy_var_5) ) `HappyStk` happyRest}}} -happyReduce_11 = happySpecReduce_1 3# happyReduction_11-happyReduction_11 happy_x_1+happyReduce_11 = happyReduce 9# 2# happyReduction_11+happyReduction_11 (happy_x_9 `HappyStk`+ happy_x_8 `HappyStk`+ happy_x_7 `HappyStk`+ happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut7 happy_x_3 of { happy_var_3 -> + case happyOut8 happy_x_5 of { happy_var_5 -> + case happyOut13 happy_x_8 of { happy_var_8 -> + happyIn6+ (Ast "view" ([Avar happy_var_3,happy_var_8]++happy_var_5)+ ) `HappyStk` happyRest}}}++happyReduce_12 = happyReduce 8# 2# happyReduction_12+happyReduction_12 (happy_x_8 `HappyStk`+ happy_x_7 `HappyStk`+ happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut7 happy_x_3 of { happy_var_3 -> + case happyOut13 happy_x_7 of { happy_var_7 -> + happyIn6+ (Ast "view" ([Avar happy_var_3,happy_var_7,Avar "."])+ ) `HappyStk` happyRest}}++happyReduce_13 = happySpecReduce_1 3# happyReduction_13+happyReduction_13 happy_x_1 = case happyOutTok happy_x_1 of { (QName happy_var_1) -> happyIn7 (happy_var_1 )} -happyReduce_12 = happySpecReduce_3 3# happyReduction_12-happyReduction_12 happy_x_3+happyReduce_14 = happySpecReduce_3 3# happyReduction_14+happyReduction_14 happy_x_3 happy_x_2 happy_x_1 = case happyOutTok happy_x_1 of { (QName happy_var_1) -> @@ -533,15 +569,15 @@ (happy_var_1++":"++happy_var_3 )}} -happyReduce_13 = happySpecReduce_1 4# happyReduction_13-happyReduction_13 happy_x_1+happyReduce_15 = happySpecReduce_1 4# happyReduction_15+happyReduction_15 happy_x_1 = case happyOut12 happy_x_1 of { happy_var_1 -> happyIn8 ([happy_var_1] )} -happyReduce_14 = happySpecReduce_3 4# happyReduction_14-happyReduction_14 happy_x_3+happyReduce_16 = happySpecReduce_3 4# happyReduction_16+happyReduction_16 happy_x_3 happy_x_2 happy_x_1 = case happyOut12 happy_x_1 of { happy_var_1 -> @@ -549,8 +585,8 @@ ([happy_var_1] )} -happyReduce_15 = happySpecReduce_3 4# happyReduction_15-happyReduction_15 happy_x_3+happyReduce_17 = happySpecReduce_3 4# happyReduction_17+happyReduction_17 happy_x_3 happy_x_2 happy_x_1 = case happyOut8 happy_x_1 of { happy_var_1 -> @@ -559,8 +595,8 @@ (happy_var_1++[happy_var_3] )}} -happyReduce_16 = happyReduce 5# 4# happyReduction_16-happyReduction_16 (happy_x_5 `HappyStk`+happyReduce_18 = happyReduce 5# 4# happyReduction_18+happyReduction_18 (happy_x_5 `HappyStk` happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk`@@ -572,86 +608,86 @@ (happy_var_1++[happy_var_3] ) `HappyStk` happyRest}} -happyReduce_17 = happySpecReduce_1 5# happyReduction_17-happyReduction_17 happy_x_1+happyReduce_19 = happySpecReduce_1 5# happyReduction_19+happyReduction_19 happy_x_1 = case happyOut7 happy_x_1 of { happy_var_1 -> happyIn9 (Avar happy_var_1 )} -happyReduce_18 = happySpecReduce_2 5# happyReduction_18-happyReduction_18 happy_x_2+happyReduce_20 = happySpecReduce_2 5# happyReduction_20+happyReduction_20 happy_x_2 happy_x_1 = case happyOut7 happy_x_1 of { happy_var_1 -> happyIn9 (Ast "+" [Avar happy_var_1] )} -happyReduce_19 = happySpecReduce_2 5# happyReduction_19-happyReduction_19 happy_x_2+happyReduce_21 = happySpecReduce_2 5# happyReduction_21+happyReduction_21 happy_x_2 happy_x_1 = case happyOut7 happy_x_1 of { happy_var_1 -> happyIn9 (Ast "*" [Avar happy_var_1] )} -happyReduce_20 = happySpecReduce_2 5# happyReduction_20-happyReduction_20 happy_x_2+happyReduce_22 = happySpecReduce_2 5# happyReduction_22+happyReduction_22 happy_x_2 happy_x_1 = case happyOut7 happy_x_1 of { happy_var_1 -> happyIn9 (Ast "?" [Avar happy_var_1] )} -happyReduce_21 = happySpecReduce_1 5# happyReduction_21-happyReduction_21 happy_x_1+happyReduce_23 = happySpecReduce_1 5# happyReduction_23+happyReduction_23 happy_x_1 = case happyOut10 happy_x_1 of { happy_var_1 -> happyIn9 (happy_var_1 )} -happyReduce_22 = happySpecReduce_2 5# happyReduction_22-happyReduction_22 happy_x_2+happyReduce_24 = happySpecReduce_2 5# happyReduction_24+happyReduction_24 happy_x_2 happy_x_1 = case happyOut10 happy_x_1 of { happy_var_1 -> happyIn9 (Ast "+" [happy_var_1] )} -happyReduce_23 = happySpecReduce_2 5# happyReduction_23-happyReduction_23 happy_x_2+happyReduce_25 = happySpecReduce_2 5# happyReduction_25+happyReduction_25 happy_x_2 happy_x_1 = case happyOut10 happy_x_1 of { happy_var_1 -> happyIn9 (Ast "*" [happy_var_1] )} -happyReduce_24 = happySpecReduce_2 5# happyReduction_24-happyReduction_24 happy_x_2+happyReduce_26 = happySpecReduce_2 5# happyReduction_26+happyReduction_26 happy_x_2 happy_x_1 = case happyOut10 happy_x_1 of { happy_var_1 -> happyIn9 (Ast "?" [happy_var_1] )} -happyReduce_25 = happySpecReduce_3 6# happyReduction_25-happyReduction_25 happy_x_3+happyReduce_27 = happySpecReduce_3 6# happyReduction_27+happyReduction_27 happy_x_3 happy_x_2 happy_x_1 = happyIn10 (Ast "element" [] ) -happyReduce_26 = happySpecReduce_3 6# happyReduction_26-happyReduction_26 happy_x_3+happyReduce_28 = happySpecReduce_3 6# happyReduction_28+happyReduction_28 happy_x_3 happy_x_2 happy_x_1 = happyIn10 (Ast "attribute" [] ) -happyReduce_27 = happySpecReduce_3 6# happyReduction_27-happyReduction_27 happy_x_3+happyReduce_29 = happySpecReduce_3 6# happyReduction_29+happyReduction_29 happy_x_3 happy_x_2 happy_x_1 = case happyOut7 happy_x_1 of { happy_var_1 -> @@ -659,8 +695,8 @@ (Ast happy_var_1 [] )} -happyReduce_28 = happyReduce 4# 6# happyReduction_28-happyReduction_28 (happy_x_4 `HappyStk`+happyReduce_30 = happyReduce 4# 6# happyReduction_30+happyReduction_30 (happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk` happy_x_1 `HappyStk`@@ -670,8 +706,8 @@ (Ast "element" happy_var_3 ) `HappyStk` happyRest} -happyReduce_29 = happyReduce 4# 6# happyReduction_29-happyReduction_29 (happy_x_4 `HappyStk`+happyReduce_31 = happyReduce 4# 6# happyReduction_31+happyReduction_31 (happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk` happy_x_1 `HappyStk`@@ -681,21 +717,21 @@ (Ast "attribute" happy_var_3 ) `HappyStk` happyRest} -happyReduce_30 = happySpecReduce_1 7# happyReduction_30-happyReduction_30 happy_x_1+happyReduce_32 = happySpecReduce_1 7# happyReduction_32+happyReduction_32 happy_x_1 = happyIn11 ([Avar "*"] ) -happyReduce_31 = happySpecReduce_1 7# happyReduction_31-happyReduction_31 happy_x_1+happyReduce_33 = happySpecReduce_1 7# happyReduction_33+happyReduction_33 happy_x_1 = case happyOut7 happy_x_1 of { happy_var_1 -> happyIn11 ([Avar happy_var_1] )} -happyReduce_32 = happySpecReduce_3 7# happyReduction_32-happyReduction_32 happy_x_3+happyReduce_34 = happySpecReduce_3 7# happyReduction_34+happyReduction_34 happy_x_3 happy_x_2 happy_x_1 = case happyOut7 happy_x_3 of { happy_var_3 -> @@ -703,8 +739,8 @@ ([Avar "*",Avar happy_var_3] )} -happyReduce_33 = happySpecReduce_3 7# happyReduction_33-happyReduction_33 happy_x_3+happyReduce_35 = happySpecReduce_3 7# happyReduction_35+happyReduction_35 happy_x_3 happy_x_2 happy_x_1 = case happyOut7 happy_x_1 of { happy_var_1 -> @@ -713,8 +749,8 @@ ([Avar happy_var_1,Avar happy_var_3] )}} -happyReduce_34 = happyReduce 4# 7# happyReduction_34-happyReduction_34 (happy_x_4 `HappyStk`+happyReduce_36 = happyReduce 4# 7# happyReduction_36+happyReduction_36 (happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk` happy_x_1 `HappyStk`@@ -724,8 +760,8 @@ ([Avar "*",Ast "?" [Avar happy_var_3]] ) `HappyStk` happyRest} -happyReduce_35 = happyReduce 4# 7# happyReduction_35-happyReduction_35 (happy_x_4 `HappyStk`+happyReduce_37 = happyReduce 4# 7# happyReduction_37+happyReduction_37 (happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk` happy_x_1 `HappyStk`@@ -736,15 +772,15 @@ ([Avar happy_var_1,Ast "?" [Avar happy_var_3]] ) `HappyStk` happyRest}} -happyReduce_36 = happySpecReduce_1 8# happyReduction_36-happyReduction_36 happy_x_1+happyReduce_38 = happySpecReduce_1 8# happyReduction_38+happyReduction_38 happy_x_1 = case happyOutTok happy_x_1 of { (Variable happy_var_1) -> happyIn12 (Avar happy_var_1 )} -happyReduce_37 = happyReduce 5# 9# happyReduction_37-happyReduction_37 (happy_x_5 `HappyStk`+happyReduce_39 = happyReduce 5# 9# happyReduction_39+happyReduction_39 (happy_x_5 `HappyStk` happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk`@@ -758,8 +794,8 @@ ((snd happy_var_3) (happy_var_1 (happy_var_2 ((fst happy_var_3) happy_var_5))) ) `HappyStk` happyRest}}}} -happyReduce_38 = happyReduce 4# 9# happyReduction_38-happyReduction_38 (happy_x_4 `HappyStk`+happyReduce_40 = happyReduce 4# 9# happyReduction_40+happyReduction_40 (happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk` happy_x_1 `HappyStk`@@ -770,8 +806,8 @@ (call "some" [happy_var_2 happy_var_4] ) `HappyStk` happyRest}} -happyReduce_39 = happyReduce 4# 9# happyReduction_39-happyReduction_39 (happy_x_4 `HappyStk`+happyReduce_41 = happyReduce 4# 9# happyReduction_41+happyReduction_41 (happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk` happy_x_1 `HappyStk`@@ -782,8 +818,8 @@ (call "not" [call "some" [happy_var_2 (call "not" [happy_var_4])]] ) `HappyStk` happyRest}} -happyReduce_40 = happyReduce 6# 9# happyReduction_40-happyReduction_40 (happy_x_6 `HappyStk`+happyReduce_42 = happyReduce 6# 9# happyReduction_42+happyReduction_42 (happy_x_6 `HappyStk` happy_x_5 `HappyStk` happy_x_4 `HappyStk` happy_x_3 `HappyStk`@@ -797,47 +833,27 @@ (Ast "if" [happy_var_2,happy_var_4,happy_var_6] ) `HappyStk` happyRest}}} -happyReduce_41 = happySpecReduce_1 9# happyReduction_41-happyReduction_41 happy_x_1+happyReduce_43 = happySpecReduce_1 9# happyReduction_43+happyReduction_43 happy_x_1 = case happyOut29 happy_x_1 of { happy_var_1 -> happyIn13 (happy_var_1 )} -happyReduce_42 = happySpecReduce_1 9# happyReduction_42-happyReduction_42 happy_x_1+happyReduce_44 = happySpecReduce_1 9# happyReduction_44+happyReduction_44 happy_x_1 = case happyOut23 happy_x_1 of { happy_var_1 -> happyIn13 (happy_var_1 )} -happyReduce_43 = happySpecReduce_1 9# happyReduction_43-happyReduction_43 happy_x_1+happyReduce_45 = happySpecReduce_1 9# happyReduction_45+happyReduction_45 happy_x_1 = case happyOut22 happy_x_1 of { happy_var_1 -> happyIn13 (happy_var_1 )} -happyReduce_44 = happySpecReduce_3 9# happyReduction_44-happyReduction_44 happy_x_3- happy_x_2- happy_x_1- = case happyOut13 happy_x_1 of { happy_var_1 -> - case happyOut13 happy_x_3 of { happy_var_3 -> - happyIn13- (call "to" [happy_var_1,happy_var_3]- )}}--happyReduce_45 = happySpecReduce_3 9# happyReduction_45-happyReduction_45 happy_x_3- happy_x_2- happy_x_1- = case happyOut13 happy_x_1 of { happy_var_1 -> - case happyOut13 happy_x_3 of { happy_var_3 -> - happyIn13- (call "+" [happy_var_1,happy_var_3]- )}}- happyReduce_46 = happySpecReduce_3 9# happyReduction_46 happyReduction_46 happy_x_3 happy_x_2@@ -845,7 +861,7 @@ = case happyOut13 happy_x_1 of { happy_var_1 -> case happyOut13 happy_x_3 of { happy_var_3 -> happyIn13- (call "-" [happy_var_1,happy_var_3]+ (call "to" [happy_var_1,happy_var_3] )}} happyReduce_47 = happySpecReduce_3 9# happyReduction_47@@ -855,7 +871,7 @@ = case happyOut13 happy_x_1 of { happy_var_1 -> case happyOut13 happy_x_3 of { happy_var_3 -> happyIn13- (call "*" [happy_var_1,happy_var_3]+ (call "+" [happy_var_1,happy_var_3] )}} happyReduce_48 = happySpecReduce_3 9# happyReduction_48@@ -865,7 +881,7 @@ = case happyOut13 happy_x_1 of { happy_var_1 -> case happyOut13 happy_x_3 of { happy_var_3 -> happyIn13- (call "div" [happy_var_1,happy_var_3]+ (call "-" [happy_var_1,happy_var_3] )}} happyReduce_49 = happySpecReduce_3 9# happyReduction_49@@ -875,7 +891,7 @@ = case happyOut13 happy_x_1 of { happy_var_1 -> case happyOut13 happy_x_3 of { happy_var_3 -> happyIn13- (call "idiv" [happy_var_1,happy_var_3]+ (call "*" [happy_var_1,happy_var_3] )}} happyReduce_50 = happySpecReduce_3 9# happyReduction_50@@ -885,7 +901,7 @@ = case happyOut13 happy_x_1 of { happy_var_1 -> case happyOut13 happy_x_3 of { happy_var_3 -> happyIn13- (call "mod" [happy_var_1,happy_var_3]+ (call "div" [happy_var_1,happy_var_3] )}} happyReduce_51 = happySpecReduce_3 9# happyReduction_51@@ -895,7 +911,7 @@ = case happyOut13 happy_x_1 of { happy_var_1 -> case happyOut13 happy_x_3 of { happy_var_3 -> happyIn13- (call "=" [happy_var_1,happy_var_3]+ (call "idiv" [happy_var_1,happy_var_3] )}} happyReduce_52 = happySpecReduce_3 9# happyReduction_52@@ -905,7 +921,7 @@ = case happyOut13 happy_x_1 of { happy_var_1 -> case happyOut13 happy_x_3 of { happy_var_3 -> happyIn13- (call "!=" [happy_var_1,happy_var_3]+ (call "mod" [happy_var_1,happy_var_3] )}} happyReduce_53 = happySpecReduce_3 9# happyReduction_53@@ -915,7 +931,7 @@ = case happyOut13 happy_x_1 of { happy_var_1 -> case happyOut13 happy_x_3 of { happy_var_3 -> happyIn13- (call "<" [happy_var_1,happy_var_3]+ (call "=" [happy_var_1,happy_var_3] )}} happyReduce_54 = happySpecReduce_3 9# happyReduction_54@@ -925,7 +941,7 @@ = case happyOut13 happy_x_1 of { happy_var_1 -> case happyOut13 happy_x_3 of { happy_var_3 -> happyIn13- (call "<=" [happy_var_1,happy_var_3]+ (call "!=" [happy_var_1,happy_var_3] )}} happyReduce_55 = happySpecReduce_3 9# happyReduction_55@@ -935,7 +951,7 @@ = case happyOut13 happy_x_1 of { happy_var_1 -> case happyOut13 happy_x_3 of { happy_var_3 -> happyIn13- (call ">" [happy_var_1,happy_var_3]+ (call "<" [happy_var_1,happy_var_3] )}} happyReduce_56 = happySpecReduce_3 9# happyReduction_56@@ -945,7 +961,7 @@ = case happyOut13 happy_x_1 of { happy_var_1 -> case happyOut13 happy_x_3 of { happy_var_3 -> happyIn13- (call ">=" [happy_var_1,happy_var_3]+ (call "<=" [happy_var_1,happy_var_3] )}} happyReduce_57 = happySpecReduce_3 9# happyReduction_57@@ -955,7 +971,7 @@ = case happyOut13 happy_x_1 of { happy_var_1 -> case happyOut13 happy_x_3 of { happy_var_3 -> happyIn13- (call "<<" [happy_var_1,happy_var_3]+ (call ">" [happy_var_1,happy_var_3] )}} happyReduce_58 = happySpecReduce_3 9# happyReduction_58@@ -965,7 +981,7 @@ = case happyOut13 happy_x_1 of { happy_var_1 -> case happyOut13 happy_x_3 of { happy_var_3 -> happyIn13- (call ">>" [happy_var_1,happy_var_3]+ (call ">=" [happy_var_1,happy_var_3] )}} happyReduce_59 = happySpecReduce_3 9# happyReduction_59@@ -975,7 +991,7 @@ = case happyOut13 happy_x_1 of { happy_var_1 -> case happyOut13 happy_x_3 of { happy_var_3 -> happyIn13- (call "is" [happy_var_1,happy_var_3]+ (call "<<" [happy_var_1,happy_var_3] )}} happyReduce_60 = happySpecReduce_3 9# happyReduction_60@@ -985,7 +1001,7 @@ = case happyOut13 happy_x_1 of { happy_var_1 -> case happyOut13 happy_x_3 of { happy_var_3 -> happyIn13- (call "eq" [happy_var_1,happy_var_3]+ (call ">>" [happy_var_1,happy_var_3] )}} happyReduce_61 = happySpecReduce_3 9# happyReduction_61@@ -995,7 +1011,7 @@ = case happyOut13 happy_x_1 of { happy_var_1 -> case happyOut13 happy_x_3 of { happy_var_3 -> happyIn13- (call "ne" [happy_var_1,happy_var_3]+ (call "is" [happy_var_1,happy_var_3] )}} happyReduce_62 = happySpecReduce_3 9# happyReduction_62@@ -1005,7 +1021,7 @@ = case happyOut13 happy_x_1 of { happy_var_1 -> case happyOut13 happy_x_3 of { happy_var_3 -> happyIn13- (call "lt" [happy_var_1,happy_var_3]+ (call "eq" [happy_var_1,happy_var_3] )}} happyReduce_63 = happySpecReduce_3 9# happyReduction_63@@ -1015,7 +1031,7 @@ = case happyOut13 happy_x_1 of { happy_var_1 -> case happyOut13 happy_x_3 of { happy_var_3 -> happyIn13- (call "le" [happy_var_1,happy_var_3]+ (call "ne" [happy_var_1,happy_var_3] )}} happyReduce_64 = happySpecReduce_3 9# happyReduction_64@@ -1025,7 +1041,7 @@ = case happyOut13 happy_x_1 of { happy_var_1 -> case happyOut13 happy_x_3 of { happy_var_3 -> happyIn13- (call "gt" [happy_var_1,happy_var_3]+ (call "lt" [happy_var_1,happy_var_3] )}} happyReduce_65 = happySpecReduce_3 9# happyReduction_65@@ -1035,7 +1051,7 @@ = case happyOut13 happy_x_1 of { happy_var_1 -> case happyOut13 happy_x_3 of { happy_var_3 -> happyIn13- (call "ge" [happy_var_1,happy_var_3]+ (call "le" [happy_var_1,happy_var_3] )}} happyReduce_66 = happySpecReduce_3 9# happyReduction_66@@ -1045,7 +1061,7 @@ = case happyOut13 happy_x_1 of { happy_var_1 -> case happyOut13 happy_x_3 of { happy_var_3 -> happyIn13- (call "and" [happy_var_1,happy_var_3]+ (call "gt" [happy_var_1,happy_var_3] )}} happyReduce_67 = happySpecReduce_3 9# happyReduction_67@@ -1055,7 +1071,7 @@ = case happyOut13 happy_x_1 of { happy_var_1 -> case happyOut13 happy_x_3 of { happy_var_3 -> happyIn13- (call "or" [happy_var_1,happy_var_3]+ (call "ge" [happy_var_1,happy_var_3] )}} happyReduce_68 = happySpecReduce_3 9# happyReduction_68@@ -1065,7 +1081,7 @@ = case happyOut13 happy_x_1 of { happy_var_1 -> case happyOut13 happy_x_3 of { happy_var_3 -> happyIn13- (call "not" [happy_var_1,happy_var_3]+ (call "and" [happy_var_1,happy_var_3] )}} happyReduce_69 = happySpecReduce_3 9# happyReduction_69@@ -1075,7 +1091,7 @@ = case happyOut13 happy_x_1 of { happy_var_1 -> case happyOut13 happy_x_3 of { happy_var_3 -> happyIn13- (call "union" [happy_var_1,happy_var_3]+ (call "or" [happy_var_1,happy_var_3] )}} happyReduce_70 = happySpecReduce_3 9# happyReduction_70@@ -1085,7 +1101,7 @@ = case happyOut13 happy_x_1 of { happy_var_1 -> case happyOut13 happy_x_3 of { happy_var_3 -> happyIn13- (call "intersect" [happy_var_1,happy_var_3]+ (call "not" [happy_var_1,happy_var_3] )}} happyReduce_71 = happySpecReduce_3 9# happyReduction_71@@ -1095,11 +1111,31 @@ = case happyOut13 happy_x_1 of { happy_var_1 -> case happyOut13 happy_x_3 of { happy_var_3 -> happyIn13+ (call "union" [happy_var_1,happy_var_3]+ )}}++happyReduce_72 = happySpecReduce_3 9# happyReduction_72+happyReduction_72 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut13 happy_x_1 of { happy_var_1 -> + case happyOut13 happy_x_3 of { happy_var_3 -> + happyIn13+ (call "intersect" [happy_var_1,happy_var_3]+ )}}++happyReduce_73 = happySpecReduce_3 9# happyReduction_73+happyReduction_73 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut13 happy_x_1 of { happy_var_1 -> + case happyOut13 happy_x_3 of { happy_var_3 -> + happyIn13 (call "except" [happy_var_1,happy_var_3] )}} -happyReduce_72 = happyReduce 4# 9# happyReduction_72-happyReduction_72 (happy_x_4 `HappyStk`+happyReduce_74 = happyReduce 4# 9# happyReduction_74+happyReduction_74 (happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk` happy_x_1 `HappyStk`@@ -1110,8 +1146,8 @@ (call "instance-of" [happy_var_1,Ast "type" [happy_var_4]] ) `HappyStk` happyRest}} -happyReduce_73 = happyReduce 4# 9# happyReduction_73-happyReduction_73 (happy_x_4 `HappyStk`+happyReduce_75 = happyReduce 4# 9# happyReduction_75+happyReduction_75 (happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk` happy_x_1 `HappyStk`@@ -1122,8 +1158,8 @@ (call "cast-as" [happy_var_1,Ast "type" [happy_var_4]] ) `HappyStk` happyRest}} -happyReduce_74 = happyReduce 4# 9# happyReduction_74-happyReduction_74 (happy_x_4 `HappyStk`+happyReduce_76 = happyReduce 4# 9# happyReduction_76+happyReduction_76 (happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk` happy_x_1 `HappyStk`@@ -1134,8 +1170,8 @@ (call "castable-as" [happy_var_1,Ast "type" [happy_var_4]] ) `HappyStk` happyRest}} -happyReduce_75 = happyReduce 5# 9# happyReduction_75-happyReduction_75 (happy_x_5 `HappyStk`+happyReduce_77 = happyReduce 5# 9# happyReduction_77+happyReduction_77 (happy_x_5 `HappyStk` happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk`@@ -1147,53 +1183,53 @@ (let v = "_tc" in Ast "let" [Avar v,happy_var_3,happy_var_5 v] ) `HappyStk` happyRest}} -happyReduce_76 = happySpecReduce_2 9# happyReduction_76-happyReduction_76 happy_x_2+happyReduce_78 = happySpecReduce_2 9# happyReduction_78+happyReduction_78 happy_x_2 happy_x_1 = case happyOut13 happy_x_2 of { happy_var_2 -> happyIn13 (call "uplus" [happy_var_2] )} -happyReduce_77 = happySpecReduce_2 9# happyReduction_77-happyReduction_77 happy_x_2+happyReduce_79 = happySpecReduce_2 9# happyReduction_79+happyReduction_79 happy_x_2 happy_x_1 = case happyOut13 happy_x_2 of { happy_var_2 -> happyIn13 (call "uminus" [happy_var_2] )} -happyReduce_78 = happySpecReduce_2 9# happyReduction_78-happyReduction_78 happy_x_2+happyReduce_80 = happySpecReduce_2 9# happyReduction_80+happyReduction_80 happy_x_2 happy_x_1 = case happyOut13 happy_x_2 of { happy_var_2 -> happyIn13 (call "not" [happy_var_2] )} -happyReduce_79 = happySpecReduce_1 9# happyReduction_79-happyReduction_79 happy_x_1+happyReduce_81 = happySpecReduce_1 9# happyReduction_81+happyReduction_81 happy_x_1 = case happyOut26 happy_x_1 of { happy_var_1 -> happyIn13 (happy_var_1 )} -happyReduce_80 = happySpecReduce_1 9# happyReduction_80-happyReduction_80 happy_x_1+happyReduce_82 = happySpecReduce_1 9# happyReduction_82+happyReduction_82 happy_x_1 = case happyOutTok happy_x_1 of { (TInteger happy_var_1) -> happyIn13 (Aint happy_var_1 )} -happyReduce_81 = happySpecReduce_1 9# happyReduction_81-happyReduction_81 happy_x_1+happyReduce_83 = happySpecReduce_1 9# happyReduction_83+happyReduction_83 happy_x_1 = case happyOutTok happy_x_1 of { (TFloat happy_var_1) -> happyIn13 (Afloat happy_var_1 )} -happyReduce_82 = happyReduce 4# 9# happyReduction_82-happyReduction_82 (happy_x_4 `HappyStk`+happyReduce_84 = happyReduce 4# 9# happyReduction_84+happyReduction_84 (happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk` happy_x_1 `HappyStk`@@ -1204,8 +1240,8 @@ (Ast "insert" [happy_var_2,Ast "destination" [happy_var_4]] ) `HappyStk` happyRest}} -happyReduce_83 = happySpecReduce_3 9# happyReduction_83-happyReduction_83 happy_x_3+happyReduce_85 = happySpecReduce_3 9# happyReduction_85+happyReduction_85 happy_x_3 happy_x_2 happy_x_1 = case happyOut13 happy_x_3 of { happy_var_3 -> @@ -1213,8 +1249,8 @@ (Ast "delete" [happy_var_3] )} -happyReduce_84 = happyReduce 4# 9# happyReduction_84-happyReduction_84 (happy_x_4 `HappyStk`+happyReduce_86 = happyReduce 4# 9# happyReduction_86+happyReduction_86 (happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk` happy_x_1 `HappyStk`@@ -1225,15 +1261,15 @@ (Ast "replace" [happy_var_2,happy_var_4] ) `HappyStk` happyRest}} -happyReduce_85 = happySpecReduce_1 10# happyReduction_85-happyReduction_85 happy_x_1+happyReduce_87 = happySpecReduce_1 10# happyReduction_87+happyReduction_87 happy_x_1 = case happyOut13 happy_x_1 of { happy_var_1 -> happyIn14 ([happy_var_1] )} -happyReduce_86 = happySpecReduce_3 10# happyReduction_86-happyReduction_86 happy_x_3+happyReduce_88 = happySpecReduce_3 10# happyReduction_88+happyReduction_88 happy_x_3 happy_x_2 happy_x_1 = case happyOut14 happy_x_1 of { happy_var_1 -> @@ -1242,24 +1278,24 @@ (happy_var_1++[happy_var_3] )}} -happyReduce_87 = happySpecReduce_2 11# happyReduction_87-happyReduction_87 happy_x_2+happyReduce_89 = happySpecReduce_2 11# happyReduction_89+happyReduction_89 happy_x_2 happy_x_1 = case happyOut16 happy_x_2 of { happy_var_2 -> happyIn15 (happy_var_2 )} -happyReduce_88 = happySpecReduce_2 11# happyReduction_88-happyReduction_88 happy_x_2+happyReduce_90 = happySpecReduce_2 11# happyReduction_90+happyReduction_90 happy_x_2 happy_x_1 = case happyOut17 happy_x_2 of { happy_var_2 -> happyIn15 (happy_var_2 )} -happyReduce_89 = happySpecReduce_3 11# happyReduction_89-happyReduction_89 happy_x_3+happyReduce_91 = happySpecReduce_3 11# happyReduction_91+happyReduction_91 happy_x_3 happy_x_2 happy_x_1 = case happyOut15 happy_x_1 of { happy_var_1 -> @@ -1268,8 +1304,8 @@ (happy_var_1 . happy_var_3 )}} -happyReduce_90 = happySpecReduce_3 11# happyReduction_90-happyReduction_90 happy_x_3+happyReduce_92 = happySpecReduce_3 11# happyReduction_92+happyReduction_92 happy_x_3 happy_x_2 happy_x_1 = case happyOut15 happy_x_1 of { happy_var_1 -> @@ -1278,8 +1314,8 @@ (happy_var_1 . happy_var_3 )}} -happyReduce_91 = happySpecReduce_3 12# happyReduction_91-happyReduction_91 happy_x_3+happyReduce_93 = happySpecReduce_3 12# happyReduction_93+happyReduction_93 happy_x_3 happy_x_2 happy_x_1 = case happyOut12 happy_x_1 of { happy_var_1 -> @@ -1288,8 +1324,8 @@ (\x -> Ast "for" [happy_var_1,Avar "$",happy_var_3,x] )}} -happyReduce_92 = happyReduce 5# 12# happyReduction_92-happyReduction_92 (happy_x_5 `HappyStk`+happyReduce_94 = happyReduce 5# 12# happyReduction_94+happyReduction_94 (happy_x_5 `HappyStk` happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk`@@ -1302,8 +1338,8 @@ (\x -> Ast "for" [happy_var_1,happy_var_3,happy_var_5,x] ) `HappyStk` happyRest}}} -happyReduce_93 = happyReduce 5# 12# happyReduction_93-happyReduction_93 (happy_x_5 `HappyStk`+happyReduce_95 = happyReduce 5# 12# happyReduction_95+happyReduction_95 (happy_x_5 `HappyStk` happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk`@@ -1316,8 +1352,8 @@ (\x -> happy_var_1(Ast "for" [happy_var_3,Avar "$",happy_var_5,x]) ) `HappyStk` happyRest}}} -happyReduce_94 = happyReduce 7# 12# happyReduction_94-happyReduction_94 (happy_x_7 `HappyStk`+happyReduce_96 = happyReduce 7# 12# happyReduction_96+happyReduction_96 (happy_x_7 `HappyStk` happy_x_6 `HappyStk` happy_x_5 `HappyStk` happy_x_4 `HappyStk`@@ -1333,8 +1369,8 @@ (\x -> happy_var_1(Ast "for" [happy_var_3,happy_var_5,happy_var_7,x]) ) `HappyStk` happyRest}}}} -happyReduce_95 = happySpecReduce_3 13# happyReduction_95-happyReduction_95 happy_x_3+happyReduce_97 = happySpecReduce_3 13# happyReduction_97+happyReduction_97 happy_x_3 happy_x_2 happy_x_1 = case happyOut12 happy_x_1 of { happy_var_1 -> @@ -1343,8 +1379,8 @@ (\x -> Ast "let" [happy_var_1,happy_var_3,x] )}} -happyReduce_96 = happyReduce 5# 13# happyReduction_96-happyReduction_96 (happy_x_5 `HappyStk`+happyReduce_98 = happyReduce 5# 13# happyReduction_98+happyReduction_98 (happy_x_5 `HappyStk` happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk`@@ -1357,21 +1393,21 @@ (\x -> happy_var_1(Ast "let" [happy_var_3,happy_var_5,x]) ) `HappyStk` happyRest}}} -happyReduce_97 = happySpecReduce_2 14# happyReduction_97-happyReduction_97 happy_x_2+happyReduce_99 = happySpecReduce_2 14# happyReduction_99+happyReduction_99 happy_x_2 happy_x_1 = case happyOut13 happy_x_2 of { happy_var_2 -> happyIn18 (\x -> Ast "predicate" [happy_var_2,x] )} -happyReduce_98 = happySpecReduce_0 14# happyReduction_98-happyReduction_98 = happyIn18+happyReduce_100 = happySpecReduce_0 14# happyReduction_100+happyReduction_100 = happyIn18 (id ) -happyReduce_99 = happySpecReduce_3 15# happyReduction_99-happyReduction_99 happy_x_3+happyReduce_101 = happySpecReduce_3 15# happyReduction_101+happyReduction_101 happy_x_3 happy_x_2 happy_x_1 = case happyOut20 happy_x_3 of { happy_var_3 -> @@ -1380,13 +1416,13 @@ \x -> Ast "sort" (x:(snd happy_var_3))) )} -happyReduce_100 = happySpecReduce_0 15# happyReduction_100-happyReduction_100 = happyIn19+happyReduce_102 = happySpecReduce_0 15# happyReduction_102+happyReduction_102 = happyIn19 ((id,id) ) -happyReduce_101 = happySpecReduce_2 16# happyReduction_101-happyReduction_101 happy_x_2+happyReduce_103 = happySpecReduce_2 16# happyReduction_103+happyReduction_103 happy_x_2 happy_x_1 = case happyOut13 happy_x_1 of { happy_var_1 -> case happyOut21 happy_x_2 of { happy_var_2 -> @@ -1394,8 +1430,8 @@ (([happy_var_1],[happy_var_2]) )}} -happyReduce_102 = happyReduce 4# 16# happyReduction_102-happyReduction_102 (happy_x_4 `HappyStk`+happyReduce_104 = happyReduce 4# 16# happyReduction_104+happyReduction_104 (happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk` happy_x_1 `HappyStk`@@ -1407,25 +1443,25 @@ (((fst happy_var_1)++[happy_var_3],(snd happy_var_1)++[happy_var_4]) ) `HappyStk` happyRest}}} -happyReduce_103 = happySpecReduce_1 17# happyReduction_103-happyReduction_103 happy_x_1+happyReduce_105 = happySpecReduce_1 17# happyReduction_105+happyReduction_105 happy_x_1 = happyIn21 (Avar "ascending" ) -happyReduce_104 = happySpecReduce_1 17# happyReduction_104-happyReduction_104 happy_x_1+happyReduce_106 = happySpecReduce_1 17# happyReduction_106+happyReduction_106 happy_x_1 = happyIn21 (Avar "descending" ) -happyReduce_105 = happySpecReduce_0 17# happyReduction_105-happyReduction_105 = happyIn21+happyReduce_107 = happySpecReduce_0 17# happyReduction_107+happyReduction_107 = happyIn21 (Avar "ascending" ) -happyReduce_106 = happyReduce 4# 18# happyReduction_106-happyReduction_106 (happy_x_4 `HappyStk`+happyReduce_108 = happyReduce 4# 18# happyReduction_108+happyReduction_108 (happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk` happy_x_1 `HappyStk`@@ -1435,8 +1471,8 @@ (call "element" [Avar happy_var_3] ) `HappyStk` happyRest} -happyReduce_107 = happyReduce 4# 18# happyReduction_107-happyReduction_107 (happy_x_4 `HappyStk`+happyReduce_109 = happyReduce 4# 18# happyReduction_109+happyReduction_109 (happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk` happy_x_1 `HappyStk`@@ -1446,8 +1482,8 @@ (call "attribute" [Avar happy_var_3] ) `HappyStk` happyRest} -happyReduce_108 = happyReduce 6# 19# happyReduction_108-happyReduction_108 (happy_x_6 `HappyStk`+happyReduce_110 = happyReduce 6# 19# happyReduction_110+happyReduction_110 (happy_x_6 `HappyStk` happy_x_5 `HappyStk` happy_x_4 `HappyStk` happy_x_3 `HappyStk`@@ -1464,8 +1500,8 @@ ++(show (head happy_var_1))++" '"++happy_var_5++"'")] ) `HappyStk` happyRest}}} -happyReduce_109 = happyReduce 5# 19# happyReduction_109-happyReduction_109 (happy_x_5 `HappyStk`+happyReduce_111 = happyReduce 5# 19# happyReduction_111+happyReduction_111 (happy_x_5 `HappyStk` happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk`@@ -1480,16 +1516,16 @@ ++(show (head happy_var_1))++" '"++happy_var_4++"'")] ) `HappyStk` happyRest}} -happyReduce_110 = happySpecReduce_2 19# happyReduction_110-happyReduction_110 happy_x_2+happyReduce_112 = happySpecReduce_2 19# happyReduction_112+happyReduction_112 happy_x_2 happy_x_1 = case happyOut24 happy_x_1 of { happy_var_1 -> happyIn23 (Ast "element_construction" (happy_var_1++[Ast "append" []]) )} -happyReduce_111 = happyReduce 7# 19# happyReduction_111-happyReduction_111 (happy_x_7 `HappyStk`+happyReduce_113 = happyReduce 7# 19# happyReduction_113+happyReduction_113 (happy_x_7 `HappyStk` happy_x_6 `HappyStk` happy_x_5 `HappyStk` happy_x_4 `HappyStk`@@ -1503,8 +1539,8 @@ (Ast "element_construction" [happy_var_3,Ast "attributes" [],concatenateAll happy_var_6] ) `HappyStk` happyRest}} -happyReduce_112 = happyReduce 7# 19# happyReduction_112-happyReduction_112 (happy_x_7 `HappyStk`+happyReduce_114 = happyReduce 7# 19# happyReduction_114+happyReduction_114 (happy_x_7 `HappyStk` happy_x_6 `HappyStk` happy_x_5 `HappyStk` happy_x_4 `HappyStk`@@ -1518,8 +1554,8 @@ (Ast "attribute_construction" [happy_var_3,concatenateAll happy_var_6] ) `HappyStk` happyRest}} -happyReduce_113 = happyReduce 5# 19# happyReduction_113-happyReduction_113 (happy_x_5 `HappyStk`+happyReduce_115 = happyReduce 5# 19# happyReduction_115+happyReduction_115 (happy_x_5 `HappyStk` happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk`@@ -1531,8 +1567,8 @@ (Ast "element_construction" [Astring happy_var_2,Ast "attributes" [],concatenateAll happy_var_4] ) `HappyStk` happyRest}} -happyReduce_114 = happyReduce 5# 19# happyReduction_114-happyReduction_114 (happy_x_5 `HappyStk`+happyReduce_116 = happyReduce 5# 19# happyReduction_116+happyReduction_116 (happy_x_5 `HappyStk` happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk`@@ -1544,16 +1580,16 @@ (Ast "attribute_construction" [Astring happy_var_2,concatenateAll happy_var_4] ) `HappyStk` happyRest}} -happyReduce_115 = happySpecReduce_2 20# happyReduction_115-happyReduction_115 happy_x_2+happyReduce_117 = happySpecReduce_2 20# happyReduction_117+happyReduction_117 happy_x_2 happy_x_1 = case happyOut7 happy_x_2 of { happy_var_2 -> happyIn24 ([Astring happy_var_2,Ast "attributes" []] )} -happyReduce_116 = happySpecReduce_3 20# happyReduction_116-happyReduction_116 happy_x_3+happyReduce_118 = happySpecReduce_3 20# happyReduction_118+happyReduction_118 happy_x_3 happy_x_2 happy_x_1 = case happyOut7 happy_x_2 of { happy_var_2 -> @@ -1562,8 +1598,8 @@ ([Astring happy_var_2,Ast "attributes" happy_var_3] )}} -happyReduce_117 = happySpecReduce_3 21# happyReduction_117-happyReduction_117 happy_x_3+happyReduce_119 = happySpecReduce_3 21# happyReduction_119+happyReduction_119 happy_x_3 happy_x_2 happy_x_1 = case happyOut14 happy_x_2 of { happy_var_2 -> @@ -1571,29 +1607,29 @@ ([concatenateAll happy_var_2] )} -happyReduce_118 = happySpecReduce_1 21# happyReduction_118-happyReduction_118 happy_x_1+happyReduce_120 = happySpecReduce_1 21# happyReduction_120+happyReduction_120 happy_x_1 = case happyOutTok happy_x_1 of { (TString happy_var_1) -> happyIn25 ([Astring happy_var_1] )} -happyReduce_119 = happySpecReduce_1 21# happyReduction_119-happyReduction_119 happy_x_1+happyReduce_121 = happySpecReduce_1 21# happyReduction_121+happyReduction_121 happy_x_1 = case happyOutTok happy_x_1 of { (XMLtext happy_var_1) -> happyIn25 ([Astring happy_var_1] )} -happyReduce_120 = happySpecReduce_1 21# happyReduction_120-happyReduction_120 happy_x_1+happyReduce_122 = happySpecReduce_1 21# happyReduction_122+happyReduction_122 happy_x_1 = case happyOut23 happy_x_1 of { happy_var_1 -> happyIn25 ([happy_var_1] )} -happyReduce_121 = happyReduce 4# 21# happyReduction_121-happyReduction_121 (happy_x_4 `HappyStk`+happyReduce_123 = happyReduce 4# 21# happyReduction_123+happyReduction_123 (happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk` happy_x_1 `HappyStk`@@ -1604,8 +1640,8 @@ (happy_var_1++[concatenateAll happy_var_3] ) `HappyStk` happyRest}} -happyReduce_122 = happySpecReduce_2 21# happyReduction_122-happyReduction_122 happy_x_2+happyReduce_124 = happySpecReduce_2 21# happyReduction_124+happyReduction_124 happy_x_2 happy_x_1 = case happyOut25 happy_x_1 of { happy_var_1 -> case happyOutTok happy_x_2 of { (TString happy_var_2) -> @@ -1613,8 +1649,8 @@ (happy_var_1++[Astring happy_var_2] )}} -happyReduce_123 = happySpecReduce_2 21# happyReduction_123-happyReduction_123 happy_x_2+happyReduce_125 = happySpecReduce_2 21# happyReduction_125+happyReduction_125 happy_x_2 happy_x_1 = case happyOut25 happy_x_1 of { happy_var_1 -> case happyOutTok happy_x_2 of { (XMLtext happy_var_2) -> @@ -1622,8 +1658,8 @@ (happy_var_1++[Astring happy_var_2] )}} -happyReduce_124 = happySpecReduce_2 21# happyReduction_124-happyReduction_124 happy_x_2+happyReduce_126 = happySpecReduce_2 21# happyReduction_126+happyReduction_126 happy_x_2 happy_x_1 = case happyOut25 happy_x_1 of { happy_var_1 -> case happyOut23 happy_x_2 of { happy_var_2 -> @@ -1631,23 +1667,23 @@ (happy_var_1++[happy_var_2] )}} -happyReduce_125 = happySpecReduce_1 22# happyReduction_125-happyReduction_125 happy_x_1+happyReduce_127 = happySpecReduce_1 22# happyReduction_127+happyReduction_127 happy_x_1 = case happyOut27 happy_x_1 of { happy_var_1 -> happyIn26 (if length happy_var_1 == 0 then Astring "" else if length happy_var_1 == 1 then head happy_var_1 else Ast "append" happy_var_1 )} -happyReduce_126 = happySpecReduce_1 23# happyReduction_126-happyReduction_126 happy_x_1+happyReduce_128 = happySpecReduce_1 23# happyReduction_128+happyReduction_128 happy_x_1 = case happyOutTok happy_x_1 of { (TString happy_var_1) -> happyIn27 (if happy_var_1=="" then [] else [Astring happy_var_1] )} -happyReduce_127 = happySpecReduce_3 23# happyReduction_127-happyReduction_127 happy_x_3+happyReduce_129 = happySpecReduce_3 23# happyReduction_129+happyReduction_129 happy_x_3 happy_x_2 happy_x_1 = case happyOut14 happy_x_2 of { happy_var_2 -> @@ -1655,8 +1691,8 @@ ([concatAll happy_var_2] )} -happyReduce_128 = happySpecReduce_2 23# happyReduction_128-happyReduction_128 happy_x_2+happyReduce_130 = happySpecReduce_2 23# happyReduction_130+happyReduction_130 happy_x_2 happy_x_1 = case happyOut27 happy_x_1 of { happy_var_1 -> case happyOutTok happy_x_2 of { (TString happy_var_2) -> @@ -1664,8 +1700,8 @@ (if happy_var_2=="" then happy_var_1 else happy_var_1++[Astring happy_var_2] )}} -happyReduce_129 = happyReduce 4# 23# happyReduction_129-happyReduction_129 (happy_x_4 `HappyStk`+happyReduce_131 = happyReduce 4# 23# happyReduction_131+happyReduction_131 (happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk` happy_x_1 `HappyStk`@@ -1676,8 +1712,8 @@ (happy_var_1++[concatAll happy_var_3] ) `HappyStk` happyRest}} -happyReduce_130 = happySpecReduce_3 24# happyReduction_130-happyReduction_130 happy_x_3+happyReduce_132 = happySpecReduce_3 24# happyReduction_132+happyReduction_132 happy_x_3 happy_x_2 happy_x_1 = case happyOut7 happy_x_1 of { happy_var_1 -> @@ -1686,8 +1722,8 @@ ([Ast "pair" [Astring happy_var_1,happy_var_3]] )}} -happyReduce_131 = happyReduce 4# 24# happyReduction_131-happyReduction_131 (happy_x_4 `HappyStk`+happyReduce_133 = happyReduce 4# 24# happyReduction_133+happyReduction_133 (happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk` happy_x_1 `HappyStk`@@ -1699,8 +1735,8 @@ (happy_var_1++[Ast "pair" [Astring happy_var_2,happy_var_4]] ) `HappyStk` happyRest}}} -happyReduce_132 = happySpecReduce_2 25# happyReduction_132-happyReduction_132 happy_x_2+happyReduce_134 = happySpecReduce_2 25# happyReduction_134+happyReduction_134 happy_x_2 happy_x_1 = case happyOut33 happy_x_1 of { happy_var_1 -> case happyOut32 happy_x_2 of { happy_var_2 -> @@ -1708,8 +1744,8 @@ (happy_var_1 "child" (Avar ".") happy_var_2 )}} -happyReduce_133 = happySpecReduce_3 25# happyReduction_133-happyReduction_133 happy_x_3+happyReduce_135 = happySpecReduce_3 25# happyReduction_135+happyReduction_135 happy_x_3 happy_x_2 happy_x_1 = case happyOut33 happy_x_2 of { happy_var_2 -> @@ -1718,8 +1754,8 @@ (happy_var_2 "attribute" (Avar ".") happy_var_3 )}} -happyReduce_134 = happySpecReduce_3 25# happyReduction_134-happyReduction_134 happy_x_3+happyReduce_136 = happySpecReduce_3 25# happyReduction_136+happyReduction_136 happy_x_3 happy_x_2 happy_x_1 = case happyOut33 happy_x_1 of { happy_var_1 -> @@ -1729,8 +1765,8 @@ (happy_var_3 (happy_var_1 "child" (Avar ".") happy_var_2) )}}} -happyReduce_135 = happyReduce 4# 25# happyReduction_135-happyReduction_135 (happy_x_4 `HappyStk`+happyReduce_137 = happyReduce 4# 25# happyReduction_137+happyReduction_137 (happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk` happy_x_1 `HappyStk`@@ -1742,15 +1778,15 @@ (happy_var_4 (happy_var_2 "attribute" (Avar ".") happy_var_3) ) `HappyStk` happyRest}}} -happyReduce_136 = happySpecReduce_1 26# happyReduction_136-happyReduction_136 happy_x_1+happyReduce_138 = happySpecReduce_1 26# happyReduction_138+happyReduction_138 happy_x_1 = case happyOut31 happy_x_1 of { happy_var_1 -> happyIn30 (happy_var_1 )} -happyReduce_137 = happySpecReduce_2 26# happyReduction_137-happyReduction_137 happy_x_2+happyReduce_139 = happySpecReduce_2 26# happyReduction_139+happyReduction_139 happy_x_2 happy_x_1 = case happyOut30 happy_x_1 of { happy_var_1 -> case happyOut31 happy_x_2 of { happy_var_2 -> @@ -1758,8 +1794,8 @@ (happy_var_2 . happy_var_1 )}} -happyReduce_138 = happySpecReduce_3 27# happyReduction_138-happyReduction_138 happy_x_3+happyReduce_140 = happySpecReduce_3 27# happyReduction_140+happyReduction_140 happy_x_3 happy_x_2 happy_x_1 = case happyOut33 happy_x_2 of { happy_var_2 -> @@ -1768,8 +1804,8 @@ (\e -> happy_var_2 "child" e happy_var_3 )}} -happyReduce_139 = happyReduce 4# 27# happyReduction_139-happyReduction_139 (happy_x_4 `HappyStk`+happyReduce_141 = happyReduce 4# 27# happyReduction_141+happyReduction_141 (happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk` happy_x_1 `HappyStk`@@ -1780,8 +1816,8 @@ (\e -> happy_var_3 "attribute" e happy_var_4 ) `HappyStk` happyRest}} -happyReduce_140 = happyReduce 4# 27# happyReduction_140-happyReduction_140 (happy_x_4 `HappyStk`+happyReduce_142 = happyReduce 4# 27# happyReduction_142+happyReduction_142 (happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk` happy_x_1 `HappyStk`@@ -1792,8 +1828,8 @@ (\e -> happy_var_3 "descendant" e happy_var_4 ) `HappyStk` happyRest}} -happyReduce_141 = happyReduce 5# 27# happyReduction_141-happyReduction_141 (happy_x_5 `HappyStk`+happyReduce_143 = happyReduce 5# 27# happyReduction_143+happyReduction_143 (happy_x_5 `HappyStk` happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk`@@ -1805,15 +1841,15 @@ (\e -> happy_var_4 "attribute-descendant" e happy_var_5 ) `HappyStk` happyRest}} -happyReduce_142 = happySpecReduce_2 27# happyReduction_142-happyReduction_142 happy_x_2+happyReduce_144 = happySpecReduce_2 27# happyReduction_144+happyReduction_144 happy_x_2 happy_x_1 = happyIn31 (\e -> Ast "step" [Avar "parent",Astring "*",e] ) -happyReduce_143 = happyReduce 4# 28# happyReduction_143-happyReduction_143 (happy_x_4 `HappyStk`+happyReduce_145 = happyReduce 4# 28# happyReduction_145+happyReduction_145 (happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk` happy_x_1 `HappyStk`@@ -1824,13 +1860,13 @@ (happy_var_1 ++ [happy_var_3] ) `HappyStk` happyRest}} -happyReduce_144 = happySpecReduce_0 28# happyReduction_144-happyReduction_144 = happyIn32+happyReduce_146 = happySpecReduce_0 28# happyReduction_146+happyReduction_146 = happyIn32 ([] ) -happyReduce_145 = happySpecReduce_1 29# happyReduction_145-happyReduction_145 happy_x_1+happyReduce_147 = happySpecReduce_1 29# happyReduction_147+happyReduction_147 happy_x_1 = case happyOut34 happy_x_1 of { happy_var_1 -> happyIn33 (\t e ps -> if null ps@@ -1838,14 +1874,14 @@ else Ast "filter" (happy_var_1 t e:ps) )} -happyReduce_146 = happySpecReduce_1 29# happyReduction_146-happyReduction_146 happy_x_1+happyReduce_148 = happySpecReduce_1 29# happyReduction_148+happyReduction_148 happy_x_1 = happyIn33 (\t e ps -> Ast "step" ((Avar t):(Astring "*"):e:ps) ) -happyReduce_147 = happySpecReduce_1 29# happyReduction_147-happyReduction_147 happy_x_1+happyReduce_149 = happySpecReduce_1 29# happyReduction_149+happyReduction_149 happy_x_1 = case happyOut7 happy_x_1 of { happy_var_1 -> happyIn33 (\t e ps -> if elem happy_var_1 path_steps@@ -1853,8 +1889,8 @@ else Ast "step" ((Avar t):(Astring happy_var_1):e:ps) )} -happyReduce_148 = happyReduce 4# 29# happyReduction_148-happyReduction_148 (happy_x_4 `HappyStk`+happyReduce_150 = happyReduce 4# 29# happyReduction_150+happyReduction_150 (happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk` happy_x_1 `HappyStk`@@ -1869,8 +1905,8 @@ else parseError [TError ("Not a valid axis name: "++happy_var_1)] ) `HappyStk` happyRest}} -happyReduce_149 = happyReduce 4# 29# happyReduction_149-happyReduction_149 (happy_x_4 `HappyStk`+happyReduce_151 = happyReduce 4# 29# happyReduction_151+happyReduction_151 (happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk` happy_x_1 `HappyStk`@@ -1884,21 +1920,21 @@ else parseError [TError ("Not a valid axis name: "++happy_var_1)] ) `HappyStk` happyRest} -happyReduce_150 = happySpecReduce_1 30# happyReduction_150-happyReduction_150 happy_x_1+happyReduce_152 = happySpecReduce_1 30# happyReduction_152+happyReduction_152 happy_x_1 = case happyOut12 happy_x_1 of { happy_var_1 -> happyIn34 (\_ _ -> happy_var_1 )} -happyReduce_151 = happySpecReduce_1 30# happyReduction_151-happyReduction_151 happy_x_1+happyReduce_153 = happySpecReduce_1 30# happyReduction_153+happyReduction_153 happy_x_1 = happyIn34 (\_ e -> e ) -happyReduce_152 = happySpecReduce_3 30# happyReduction_152-happyReduction_152 happy_x_3+happyReduce_154 = happySpecReduce_3 30# happyReduction_154+happyReduction_154 happy_x_3 happy_x_2 happy_x_1 = case happyOut14 happy_x_2 of { happy_var_2 -> @@ -1908,15 +1944,15 @@ else Ast "context" [e,Astring t,concatenateAll happy_var_2] )} -happyReduce_153 = happySpecReduce_2 30# happyReduction_153-happyReduction_153 happy_x_2+happyReduce_155 = happySpecReduce_2 30# happyReduction_155+happyReduction_155 happy_x_2 happy_x_1 = happyIn34 (\_ _ -> call "empty" [] ) -happyReduce_154 = happyReduce 4# 30# happyReduction_154-happyReduction_154 (happy_x_4 `HappyStk`+happyReduce_156 = happyReduce 4# 30# happyReduction_156+happyReduction_156 (happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk` happy_x_1 `HappyStk`@@ -1929,8 +1965,8 @@ else Ast "context" [e,Astring t,call happy_var_1 happy_var_3] ) `HappyStk` happyRest}} -happyReduce_155 = happySpecReduce_3 30# happyReduction_155-happyReduction_155 happy_x_3+happyReduce_157 = happySpecReduce_3 30# happyReduction_157+happyReduction_157 happy_x_3 happy_x_2 happy_x_1 = case happyOut7 happy_x_1 of { happy_var_1 -> @@ -1940,8 +1976,8 @@ else call happy_var_1 [e] )} -happyReduce_156 = happyReduce 7# 31# happyReduction_156-happyReduction_156 (happy_x_7 `HappyStk`+happyReduce_158 = happyReduce 7# 31# happyReduction_158+happyReduction_158 (happy_x_7 `HappyStk` happy_x_6 `HappyStk` happy_x_5 `HappyStk` happy_x_4 `HappyStk`@@ -1956,8 +1992,8 @@ (\v -> Ast "if" [call "instance-of" [Avar v,Ast "type" [happy_var_2]],happy_var_4,happy_var_7] ) `HappyStk` happyRest}}} -happyReduce_157 = happyReduce 5# 31# happyReduction_157-happyReduction_157 (happy_x_5 `HappyStk`+happyReduce_159 = happyReduce 5# 31# happyReduction_159+happyReduction_159 (happy_x_5 `HappyStk` happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk`@@ -1971,7 +2007,7 @@ ) `HappyStk` happyRest}}} happyNewToken action sts stk [] =- happyDoAction 88# notHappyAtAll action sts stk []+ happyDoAction 89# notHappyAtAll action sts stk [] happyNewToken action sts stk (tk:tks) = let cont i = happyDoAction i tk action sts stk tks in@@ -2038,31 +2074,32 @@ DECLARE -> cont 60#; FUNCTION -> cont 61#; VARIABLE -> cont 62#;- AT -> cont 63#;- DOTS -> cont 64#;- DOT -> cont 65#;- SEMI -> cont 66#;- COLON -> cont 67#;- INSERT -> cont 68#;- DELETE -> cont 69#;- REPLACE -> cont 70#;- INTO -> cont 71#;- FROM -> cont 72#;- WITH -> cont 73#;- INSTANCE -> cont 74#;- OF -> cont 75#;- QMARK -> cont 76#;- CAST -> cont 77#;- CASTABLE -> cont 78#;- CASE -> cont 79#;- DEFAULT -> cont 80#;- TYPESWITCH -> cont 81#;- Variable happy_dollar_dollar -> cont 82#;- XMLtext happy_dollar_dollar -> cont 83#;- TInteger happy_dollar_dollar -> cont 84#;- TFloat happy_dollar_dollar -> cont 85#;- TString happy_dollar_dollar -> cont 86#;- TokenEOF -> cont 87#;+ VIEW -> cont 63#;+ AT -> cont 64#;+ DOTS -> cont 65#;+ DOT -> cont 66#;+ SEMI -> cont 67#;+ COLON -> cont 68#;+ INSERT -> cont 69#;+ DELETE -> cont 70#;+ REPLACE -> cont 71#;+ INTO -> cont 72#;+ FROM -> cont 73#;+ WITH -> cont 74#;+ INSTANCE -> cont 75#;+ OF -> cont 76#;+ QMARK -> cont 77#;+ CAST -> cont 78#;+ CASTABLE -> cont 79#;+ CASE -> cont 80#;+ DEFAULT -> cont 81#;+ TYPESWITCH -> cont 82#;+ Variable happy_dollar_dollar -> cont 83#;+ XMLtext happy_dollar_dollar -> cont 84#;+ TInteger happy_dollar_dollar -> cont 85#;+ TFloat happy_dollar_dollar -> cont 86#;+ TString happy_dollar_dollar -> cont 87#;+ TokenEOF -> cont 88#; _ -> happyError' (tk:tks) } @@ -2165,7 +2202,7 @@ | AND | OR | NOT | UNION | INTERSECT | EXCEPT | FOR | LET | IN | COMMA | ASSIGN | WHERE | ORDER | BY | ASCENDING | DESCENDING | ELEMENT | ATTRIBUTE | STAG | ETAG | SATISFIES | ATSIGN | SLASH | DECLARE | SEMI | COLON- | FUNCTION | VARIABLE | AT | DOT | DOTS | TokenEOF | PRE | POST | IS+ | FUNCTION | VARIABLE | VIEW | AT | DOT | DOTS | TokenEOF | PRE | POST | IS | INSERT | INTO | DELETE | FROM | REPLACE | WITH | INSTANCE | OF | CAST | CASTABLE | CASE | DEFAULT | TYPESWITCH | QName String | Variable String | XMLtext String | TInteger Int@@ -2208,7 +2245,7 @@ (FOR,"for"),(LET,"let"),(IN,"in"),(AS,"as"),(COMMA,"','"),(ASSIGN,":="),(WHERE,"where"),(ORDER,"order"), (BY,"by"),(ASCENDING,"ascending"),(DESCENDING,"descending"),(ELEMENT,"element"), (ATTRIBUTE,"attribute"),(STAG,"</"),(ETAG,"/>"),(SATISFIES,"satisfies"),(ATSIGN,"@"),- (SLASH,"/"),(DECLARE,"declare"),(FUNCTION,"function"),(VARIABLE,"variable"),+ (SLASH,"/"),(DECLARE,"declare"),(FUNCTION,"function"),(VARIABLE,"variable"),(VIEW,"view"), (INSERT,"insert"),(INTO,"into"),(DELETE,"delete"),(FROM,"from"),(REPLACE,"replace"),(WITH,"with"), (AT,"at"),(DOTS,".."),(DOT,"."),(SEMI,";"),(COLON,":"),(INSTANCE,"instance"),(OF,"of"), (CAST,"cast"),(CASTABLE,"castable"),(CASE,"case"),(DEFAULT,"default"),(TYPESWITCH,"typeswitch")]@@ -2409,6 +2446,7 @@ "declare" -> DECLARE "function" -> FUNCTION "variable" -> VARIABLE+ "view" -> VIEW "at" -> AT "eq" -> SEQ "ne" -> SNE@@ -2433,6 +2471,8 @@ var -> QName var in case token of QName v1 -> case rest of+ ':':':':rest2 -> let (v2,rest3) = span isQN rest2+ in [QName v1,COLON,COLON,QName v2] ++ lexer rest3 n ':':rest2 -> let (v2,rest3) = span isQN rest2 in [QName v1,COLON,QName v2] ++ lexer rest3 n _ -> QName v1 : lexer rest n
src/Text/XML/HXQ/XQuery.hs view
@@ -34,7 +34,7 @@ -- * The XQuery Interpreter with Database Connectivity xqueryDB, -- * Shredding and Publishing XML Documents Using a Relational Database- genSchema, shred, shredC, printSchema, createIndex,+ genSchema, shred, shredC, isSchema, printSchema, createIndex, -- * Other Functions XMLEvent(..), connect, disconnect, commit, rollback, prepareSQL, executeSQL ) where
src/Text/XML/HXQ/XTree.hs view
@@ -4,7 +4,7 @@ - Programmer: Leonidas Fegaras - Email: fegaras@cse.uta.edu - Web: http://lambda.uta.edu/-- Creation: 05/01/08, last update: 01/17/09+- Creation: 05/01/08, last update: 03/29/09 - - Copyright (c) 2008 by Leonidas Fegaras, the University of Texas at Arlington. All rights reserved. - This material is provided as is, with absolutely no warranty expressed or implied.@@ -25,6 +25,9 @@ import XMLParse(XMLEvent(..)) import HXML(Name,AttList) import Text.XML.HXQ.Parser(Ast(..))+import System.CPUTime+-- import Debug.Trace+-- import System.IO.Unsafe -- | A rose tree representation of XML data.@@ -111,42 +114,96 @@ noParentError = XError "Undefined parent reference" +statistics = id+{- Collect statistics about the timing of I/O events+statistics n+ = if mod n 1000 == 0+ then unsafePerformIO (do t <- getCPUTime+ putStr $ show (div n 1000)+ putStrLn $ " " ++ show (div t (10^6))+ return n)+ else n+-}++ -- Lazily materialize the SAX stream into a DOM tree without setting parent references.-materializeWithoutParent :: Stream -> XTree-materializeWithoutParent stream+materializeWithoutParent :: Int -> Stream -> XTree+materializeWithoutParent level stream = XElem "_document" [] 1 noParentError- [head (filter (\x -> case x of XElem _ _ _ _ _ -> True; _ -> False)- ((\(x,_,_)->x) (ml stream 2)))]- where m ((TextEvent t):xs) i = (XText t,xs,i)- m ((EmptyEvent n atts):xs) i = (XElem n atts i noParentError [],xs,i+1)+ ((\(x,_,_)->x) (mdl stream 2 level []))+ where md s@(x@(StartEvent n atts):xs) i level ns+ | level == 0+ = let f [] i = m s i+ f ((StartEvent n atts):ns) i+ = let (e,xs',i') = f ns $! i+1+ in (XElem n atts i noParentError [e],xs',i')+ (e,xs',i') = (f $! (reverse ns)) i+ in (e,xs',i',ns)+ | otherwise+ = ((md xs $! i+1) $! level-1) $! x:ns+ md ((EndEvent n):xs) i level (x:ns)+ = (md xs i $! level+1) ns+ md (_:xs) i level ns+ = md xs i level ns+ md [] _ _ _ = (XText "",[],0,[])+ mdl xs@(_:_) i level ns+ = let (e,xs',i',ns') = md xs i level ns+ (el,xs'',i'') = mdl xs' i' 0 ns'+ in (e:el,xs'',i'')+ mdl [] _ _ _ = ([],[],0)+ m ((TextEvent t):xs) i = (XText t,xs,i)+ m ((EmptyEvent n atts):xs) i+ = (XElem n atts i noParentError [],xs,i+1) m ((StartEvent n atts):xs) i- = let (el,xs',i') = ml xs $! (i+1)+ = let (el,xs',i') = ml n xs $! i+1 in (XElem n atts i noParentError el,xs',i') m ((PIEvent n s):xs) i = (XPI n s,xs,i) m ((CommentEvent s):xs) i = (XComment s,xs,i) m ((GERefEvent n):xs) i = (XGERef n,xs,i) m ((ErrorEvent s):xs) i = (XError s,xs,i)- m (_:xs) i = (XError "unrecognized XML event",xs,i)- m [] i = (XError "unbalanced tags",[],i)- ml [] i = ([],[],i)- ml ((EndEvent n):xs) i = ([],xs,i)- ml xs i = let (e,xs',i') = m xs i- (el,xs'',i'') = ml xs' i'- in (e:el,xs'',i'')+ m (_:xs) i = (XError "Unrecognized XML event",xs,i)+ m [] i = (XError "Unterminated element",[],i)+ ml _ [] i = ([],[],i)+ ml tag ((EndEvent n):xs) i+ | n==tag = ([],xs,i)+ | otherwise = error $ "Unmatched tags: <"++tag++"></"++n++">"+ ml tag xs i = let (e,xs',i') = m xs i+ (el,xs'',i'') = ml tag xs' i'+ in (e:el,xs'',i'') -- Lazily materialize the SAX stream into a DOM tree setting parent references. -- It has space leaks for large documents. -- Used only if the query has backward steps that cannot be eliminated.-materializeWithParent :: Stream -> XTree-materializeWithParent stream = root+materializeWithParent :: Int -> Stream -> XTree+materializeWithParent level stream = root where root = XElem "_document" [] 1 (XError "Trying to access the root parent")- [head (filter (\x -> case x of XElem _ _ _ _ _ -> True; _ -> False)- ((\(x,_,_)->x) (ml stream 2 root)))]+ ((\(x,_,_)->x) (mdl stream 2 level root []))+ md s@(x@(StartEvent n atts):xs) i level p ns+ | level == 0+ = let f [] i p = m s i p+ f ((StartEvent n atts):ns) i p+ = let (e,xs',i') = (f ns $! i+1) x+ x = XElem n atts i p [e]+ in (x,xs',i')+ (e,xs',i') = (f $! (reverse ns)) i p+ in (e,xs',i',ns)+ | otherwise+ = ((md xs $! i+1) $! level-1) p $! x:ns+ md ((EndEvent n):xs) i level p (x:ns)+ = (md xs i $! level+1) p ns+ md (_:xs) i level p ns+ = md xs i level p ns+ md [] _ _ _ _ = (XText "",[],0,[])+ mdl xs@(_:_) i level p ns+ = let (e,xs',i',ns') = md xs i level p ns+ (el,xs'',i'') = mdl xs' i' 0 p ns'+ in (e:el,xs'',i'')+ mdl [] _ _ _ _ = ([],[],0) m ((TextEvent t):xs) i _ = (XText t,xs,i) m ((EmptyEvent n atts):xs) i p = (XElem n atts i p [],xs,i+1) m ((StartEvent n atts):xs) i p- = let (el,xs',i') = (ml xs $! (i+1)) node+ = let (el,xs',i') = (ml n xs $! (i+1)) node node = XElem n atts i p el in (node,xs',i') m ((PIEvent n s):xs) i _ = (XPI n s,xs,i)@@ -155,13 +212,41 @@ m ((ErrorEvent s):xs) i _ = (XError s,xs,i) m (_:xs) i _ = (XError "unrecognized XML event",xs,i) m [] i _ = (XError "unbalanced tags",[],i)- ml [] i _ = ([],[],i)- ml ((EndEvent n):xs) i _ = ([],xs,i)- ml xs i p = let (e,xs',i') = m xs i p- (el,xs'',i'') = ml xs' i' p- in (e:el,xs'',i'')+ ml _ [] i _ = ([],[],i)+ ml tag ((EndEvent n):xs) i _+ | n==tag = ([],xs,i)+ | otherwise = error $ "Unmatched tags: <"++tag++"></"++n++">"+ ml tag xs i p = let (e,xs',i') = m xs i p+ (el,xs'',i'') = ml tag xs' i' p+ in (e:el,xs'',i'') +-- It looks at the first maxStreamingUnitSize events in the stream to determine+-- the minimum nesting depth. If this minimum depth is greater than 0, then+-- the stream will be chopped into a list of XML elements at this depth level,+-- where each XML element corresponds to at most maxStreamingUnitSize events.+-- Otherwise, the cache requirenments would be the size of the largest root child+docLevel :: Stream -> Int -> Int -> Int -> Int+docLevel stream i level minLevel+ = if i < 0+ then minLevel+ else case stream of+ ((StartEvent n _):xs)+ -> ((docLevel xs $! i-1) $! level+1) minLevel+ ((EndEvent n):xs)+ -> ((docLevel xs $! i-1) $! level-1) $! min minLevel (level-1)+ (_:xs) -> (docLevel xs $! i-1) level minLevel+ _ -> 0+++-- | Maximum number of events that each streaming unit corresponds to+maxStreamingUnitSize :: Int+maxStreamingUnitSize = 10000++ materialize :: Bool -> Stream -> XTree-materialize True = materializeWithParent-materialize False = materializeWithoutParent+materialize withParent stream+ = let level = docLevel stream maxStreamingUnitSize 0 1000000+ in if withParent+ then materializeWithParent level stream+ else materializeWithoutParent level stream
src/noDB/Text/XML/HXQ/OptionalDB.hs view
@@ -66,7 +66,14 @@ rollback db = noDBerror --- | Print the relational schema of the XML document stored in the database under the given name+-- | True if there is a relational schema stored in the database under the given name+isSchema :: Connection -- ^ database connection+ -> String -- ^ schema name+ -> IO Bool+isSchema db name = noDBerror+++-- | Print the relational schema stored in the database under the given name printSchema :: Connection -- ^ database connection -> String -- ^ schema name -> IO ()@@ -74,11 +81,13 @@ -- | Create a schema for an XML document into the database under the given name.+-- The excluded tags are HTML tags to be ignored genSchema :: Connection -- ^ database connection -> FilePath -- ^ XML document pathname -> String -- ^ schema name+ -> [String] -- ^ excluded tags -> IO Table-genSchema db file name = noDBerror+genSchema db file name tags = noDBerror -- | Store an XML document into the database under the given name.@@ -89,7 +98,7 @@ shred db file name = noDBerror --- | Store an XML document into the database under the given name. Generates Haskell code.+-- | Store an XML document into the database under the given name. Generates Haskell code. It's 3 times faster than shred. shredC :: String -- ^ database name -> FilePath -- ^ XML document pathname -> String -- ^ schema name
src/withDB/Text/XML/HXQ/DB.hs view
@@ -4,7 +4,7 @@ - Programmer: Leonidas Fegaras - Email: fegaras@cse.uta.edu - Web: http://lambda.uta.edu/-- Creation: 05/12/08, last update: 01/06/09+- Creation: 05/12/08, last update: 02/01/09 - - Copyright (c) 2008 by Leonidas Fegaras, the University of Texas at Arlington. All rights reserved. - This material is provided as is, with absolutely no warranty expressed or implied.@@ -19,12 +19,13 @@ module Text.XML.HXQ.DB ( publishXmlDoc, executeSQL, prepareSQL, genSchema, shred, shredC,- printSchema, createIndex, insertDB, deleteDB, replaceDB ) where+ printSchema, isSchema, createIndex, insertDB, deleteDB, replaceDB ) where import System.IO.Unsafe import Char(isSpace,isDigit,toLower) import List(zip) import Data.List(foldl')+import System.IO import Database.HDBC import Text.XML.HXQ.XTree import Text.XML.HXQ.Functions(child_step)@@ -33,13 +34,15 @@ import Text.XML.HXQ.Parser import Connect import Language.Haskell.TH+import DeepSeq+import System.CPUTime sql2xml :: SqlValue -> XTree sql2xml value = case value of SqlString s -> XText s- SqlByteString bs -> XText (show bs)+ SqlByteString bs -> XText ((fromSql value)::String) SqlWord32 n -> XInt (fromEnum n) SqlWord64 n -> XInt (fromEnum n) SqlInt32 n -> XText (show n)@@ -65,6 +68,11 @@ _ -> error ("*** Cannot convert "++show e++" into sql") +dbString :: SqlValue -> String+dbString (SqlString s) = s+dbString x = fromSql x++ perror = error "Constructed elements do not have a parent" @@ -86,54 +94,57 @@ -- structural summary: tag id max# hasText size children-data SSnode = SSnode String !Int !Int !Int !Bool !Int [SSnode]+data SSnode = SSnode !String !Int !Int !Int !Bool !Int ![SSnode] deriving (Eq,Show) +instance DeepSeq SSnode where deepSeq = seq + insertSS :: String -> Int -> Int -> [SSnode] -> (Int,SSnode,[SSnode]) insertSS tag count size ((SSnode n i j l b len ts):s) | n == tag- = (count,SSnode n i j (l+1) b (max size len) ts,s)+ = (count,((SSnode n i j $! (l+1)) b $! (max size len)) ts,s) insertSS tag count size (x:xs)- = let (c,t,ts) = ((insertSS tag $! count) $! size) $! xs+ = let (c,t,ts) = insertSS tag count size xs in (c,t,x:ts) insertSS tag count size []- = (count+1,SSnode tag (count+1) 1 1 False size [],[])+ = (count+1,(SSnode tag $! (count+1)) 1 1 False size [],[]) insSS :: String -> Int -> Int -> [SSnode] -> (Int,[SSnode]) insSS tag count size ns- = let (c,t,s) = ((insertSS tag $! count) $! size) $! ns+ = let (c,t,s) = insertSS tag count size ns in (c,t:s) getSS :: [XMLEvent] -> Int -> [String] -> [SSnode] -> [SSnode] getSS ((EmptyEvent n atts):xs) count ignored rs- = ((getSS ((StartEvent n atts):(EndEvent n):xs) $! count) $! ignored) $! rs+ = getSS ((StartEvent n atts):(EndEvent n):xs) count ignored rs getSS ((StartEvent n atts):xs) count ignored rs | elem n ignored- = ((getSS xs $! count) $! ignored) $! rs+ = getSS xs count ignored rs getSS ((EndEvent n):xs) count ignored rs | elem n ignored- = ((getSS xs $! count) $! ignored) $! rs+ = getSS xs count ignored rs getSS ((StartEvent n atts):xs) count ignored ((SSnode m i j l b len ns):rs)- = let (c,SSnode m' i' j' l' b' len' ks,ts) = (insertSS n $! count) 0 $! ns- (nc,as) = foldr (\(a,v) (i,s) -> ((insSS ('@':a) $! i) $! (length v)) $! s) (c,ks) atts+ = let (c,SSnode m' i' j' l' b' len' ks,ts) = insertSS n count 0 ns+ (nc,as) = foldr (\(a,v) (i,s) -> (insSS ('@':a) i $! (length v)) s) (c,ks) atts r (SSnode m i j _ b len ts) = SSnode m i j 0 b len ts- reset (SSnode m i j l b len ts) = SSnode m i j l b len (map r ts)- in ((getSS xs $! nc) $! ignored) $! (reset (SSnode m' i' j' l' b' len' as):(SSnode m i j l b len ts):rs)+ reset (SSnode m i j l b len ts) = SSnode m i j l b len $!! (map r ts)+ in getSS xs nc ignored $!! ((reset $!! (SSnode m' i' j' l' b' len' as)):(SSnode m i j l b len ts):rs) getSS ((EndEvent n):xs) count ignored (t:(SSnode m i j l b len ns):rs)- = let s (SSnode m i j l b len ts) = SSnode m i (max j l) 0 b len ts- set (SSnode m i j l b len ts) = SSnode m i j l b len (map s ts)- in ((getSS xs $! count) $! ignored) $! ((SSnode m i j l b len (set t:ns):rs))+ = let s (SSnode m i j l b len ts) = (SSnode m i $! (max j l)) 0 b len ts+ set (SSnode m i j l b len ts) = SSnode m i j l b len $!! (map s ts)+ in getSS xs count ignored $!! (((SSnode m i j l b len $!! (set t:ns)):rs)) getSS ((TextEvent t):xs) count ignored ((SSnode m i j l _ len ns):rs) | any (not . isSpace) t- = ((getSS xs $! count) $! ignored) $! ((SSnode m i j l True (max len (length t)) ns):rs)+ = getSS xs count ignored $!! (((SSnode m i j l True $! (max len (length t))) ns):rs) getSS (_:xs) count ignored rs- = ((getSS xs $! count) $! ignored) $! rs+ = getSS xs count ignored rs getSS [] _ _ rs = rs + {--------------------------------------------------------------------------------------- -- Derive a good relational schema based on the structural summary (using hybrid inlining) ----------------------------------------------------------------------------------------}@@ -146,7 +157,9 @@ | Column String Path Int -- column-name relative-path max-byte-size deriving (Show,Read) +instance DeepSeq Table where deepSeq = seq + printPath :: Path -> String printPath [] = "" printPath [p] = p@@ -238,9 +251,15 @@ stmt <- handleSqlError (prepare db "select summary from HXQCatalog where name = ?") _ <- handleSqlError (execute stmt [SqlString name]) result <- handleSqlError (fetchAllRowsAL stmt)- if length result > 0- then do let [[(_,SqlString s)]] = result- summary = (read s)::Table+ ans <- if (length result == 0)+ then return True+ else do putStr $ "Schema "++name++" already exists. Do you want to replace it? [y/n] "+ hFlush stdout+ line <- getLine+ return $ line == "y"+ if ans && length result > 0+ then do let [[(_,s)]] = result+ summary = (read (dbString s))::Table tables = getTableNames summary _ <- mapM (\t -> handleSqlError (run db ("drop table if exists "++t) [])) (reverse tables)@@ -248,13 +267,15 @@ commit db else return () t <- deriveSchema file name ignored- let schema = relationalSchema t ""- _ <- handleSqlError (run db "insert into HXQCatalog values (?,?,?,?,?)"- [SqlString name, SqlInteger 0, SqlString file,- SqlString (show t), SqlString (concat schema)])- _ <- mapM (\s -> handleSqlError (run db s [])) schema- commit db- return $! t+ if ans+ then do let schema = relationalSchema t ""+ _ <- handleSqlError (run db "insert into HXQCatalog values (?,?,?,?,?)"+ [SqlString name, SqlInteger 0, SqlString file,+ SqlString (show t), SqlString (concat schema)])+ _ <- mapM (\s -> handleSqlError (run db s [])) schema+ commit db+ return $! t+ else return $! t -- | Create a schema for an XML document into the database under the given name.@@ -271,12 +292,22 @@ _ <- handleSqlError (execute stmt [SqlString name]) result <- handleSqlError (fetchAllRowsAL stmt) if length result == 1- then let [[(_,SqlString s)]] = result- in return $! ((read s)::Table)+ then let [[(_,s)]] = result+ in return $! ((read (dbString s))::Table) else error ("*** Schema "++name++" doesn't exist") --- | Print the relational schema of the XML document stored in the database under the given name+-- | True if there is a relational schema stored in the database under the given name+isSchema :: Connection -> String -> IO Bool+isSchema db name+ = do initializeDB db+ stmt <- handleSqlError (prepare db "select name from HXQCatalog where name = ?")+ _ <- handleSqlError (execute stmt [SqlString name])+ result <- handleSqlError (fetchAllRowsAL stmt)+ return $ length result == 1+++-- | Print the relational schema stored in the database under the given name printSchema :: Connection -> String -> IO () printSchema db name = do initializeDB db@@ -284,8 +315,8 @@ _ <- handleSqlError (execute stmt [SqlString name]) result <- handleSqlError (fetchAllRowsAL stmt) if length result == 1- then let [[(_,SqlString s)]] = result- in putStrLn s+ then let [[(_,s)]] = result+ in putStrLn (dbString s) else error ("*** Schema "++name++" doesn't exist") @@ -297,7 +328,7 @@ findPath :: [Table] -> [String] -> Int -> Maybe (Int,Table) findPath (t@(Table _ p _ s):ts) path _ | p == path- = Just (length[ 1 | Column _ _ _ <- s]-1,t)+ = Just $! (length[ 1 | Column _ _ _ <- s]-1,t) findPath (t@(Column _ p _):ts) path n | p == path = Just (n,t)@@ -306,7 +337,7 @@ xt = findPath ts path n in case xs of Nothing -> xt; _ -> xs findPath (_:ts) path n- = findPath ts path (n+1)+ = findPath ts path $! (n+1) findPath [] _ _ = Nothing @@ -316,55 +347,69 @@ populate (x@(StartEvent tag atts):xs) ((t@(Table n path _ s)):ts) _ (p:ps) = case findPath s (tag:p) 0 of Just (n,nt@(Table m _ _ as))- -> (-1,m):((popAtts atts as)++(populate xs (nt:t:ts) n ([]:p:ps)))+ -> (-1,m):((popAtts atts as)++(populate xs (nt:t:ts) n $! ([]:p:ps))) Just (n,nt) -> map (\(a,v) -> case findPath ts (('@':a):tag:p) 0 of Just (n,_) -> (n,v) Nothing -> error ("*** Unrecognized attribute: "++a)) atts- ++ populate xs (nt:t:ts) n ((tag:p):ps)- Nothing -> populate xs (t:ts) 0 ((tag:p):ps)+ ++ (populate xs (nt:t:ts) n $! ((tag:p):ps))+ Nothing -> (populate xs $! (t:ts)) 0 $! ((tag:p):ps) where popAtts ((a,v):as) ks = let Just(m,_) = findPath ks ['@':a] 0 in (m,v):(popAtts as ks) popAtts [] _ = []+populate (StartEvent tag atts:xs) ts _ (p:ps)+ = populate xs ts 0 $! ((tag:p):ps) populate ((EndEvent tag):xs) ((t@(Table n path _ s)):ts) _ ([]:ps) = (-2,n):populate xs ts 0 ps populate ((EndEvent tag):xs) ((Column m path _):ts) n (p:ps)- = populate xs ts 0 (tail p:ps)-populate ((EndEvent text):xs) ts _ (p:ps)- = populate xs ts 0 (tail p:ps)+ = populate xs ts 0 $! (tail p:ps)+populate ((EndEvent _):xs) ts _ (p:ps)+ = populate xs ts 0 $! (tail p:ps) populate ((TextEvent text):xs) ts n ps | any (not . isSpace) text = (n,text):populate xs ts n ps-populate (x:xs) ts n ps+populate (_:xs) ts n ps = populate xs ts n ps populate [] ts n ps = [] -insert :: [(Int,String)] -> Integer -> Integer -> [(String,Int,Statement)] -> IO (Integer,[(Int,String)])-insert xs id parent stmts = let (s,binds,rest,_) = m xs id parent- in if null rest- then do n <- s; return (n,binds)- else do n <- s- (m,mb) <- insert rest n parent stmts- return (m,mb++binds)- where m ((-1,m):xs) i p = let (s,el,xs',i') = ml xs (i+1) i- in ((insertTuple m el i p) >> s,[],xs',i')- m ((k,m):xs) i p = (return i,[(k,m)],xs,i)- m [] i p = (return i,[],[],i)- ml [] i p = (return i,[],[],i)- ml ((-2,m):xs) i p = (return i,[],xs,i)- ml xs i p = let (s,el,xs',i') = m xs i p- (s',el',xs'',i'') = ml xs' i' p- in (s >> s',el++el',xs'',i'')- find x xs = foldl' (\r (a,v) -> if x==a then v else r) "\NUL" xs+statistics n+ = if mod n 1000 == 0+ then do t <- getCPUTime+ putStr $ show (div n 1000)+ putStrLn $ " " ++ show (div t (10^6))+ return ()+ else return ()+++insert :: Connection -> [(Int,String)] -> Integer -> Integer -> [(String,Int,Statement)] -> (Integer,[(Int,String)])+insert db xs id parent stmts+ = let (binds,_,i) = m xs id parent+ in (i,binds)+ where m ((-1,m):xs) i p = let (el,xs',i') = (ml xs $! (i+1)) i+ in seq (insertTuple m el i p) ([],xs',i')+ m ((k,m):xs) i p = ([(k,m)],xs,i)+ m [] i p = ([],[],i)+ ml [] i p = ([],[],i)+ ml ((-2,m):xs) i p = ([],xs,i)+ ml xs i p = let (el,xs',i') = m xs i p+ (el',xs'',i'') = ml xs' i' p+ in (el++el',xs'',i'')+ {-# NOINLINE insertTuple #-} insertTuple m e i p = let (len,stmt) = foldr (\(a,l,s) r -> if m==a then (l,s) else r) (error "*** sql stmt not found") stmts tuple = map (\c -> find c e) [0..len]- lift x = if x=="\NUL" then SqlNull else SqlString x- in do -- putStrLn (m++show(show i:show p:tuple))- _ <- handleSqlError (execute stmt (SqlInteger i:SqlInteger p:(map lift tuple)))- return i+ find x xs = foldl' (\r (a,v) -> if x==a then v else r) "\NUL" xs+ lift x = if x == "\NUL" then SqlNull else SqlString x+ in unsafePerformIO (+ do -- putStrLn (m++show(show i:show p:tuple))+ -- _ <- statistics i+ if mod i 10000 == 9999+ then do putStrLn (show (i+1)++" tuples")+ commit db+ else return ()+ handleSqlError (execute stmt $! (SqlInteger i:SqlInteger p:(map lift tuple)))) tableStmt db root (Table n _ _ ts)@@ -384,13 +429,12 @@ stmts <- tableStmt db root t stmt1 <- prepare db "select next_id from HXQCatalog where name = ?" _ <- execute stmt1 [SqlString prefix]- [[(_,SqlString ids)]] <- fetchAllRowsAL stmt1+ [[(_,ids)]] <- fetchAllRowsAL stmt1 doc <- readFile file- let id = (read ids)+1+ let id = (read (dbString ids))+1 ts = parseDocument doc ic = populate ts [Table prefix [] True [t]] 0 [[]]- -- putStrLn (show ic)- (new_id,_) <- insert ic id 0 stmts+ (new_id,_) = insert db ic id 0 stmts stmt2 <- prepare db "update HXQCatalog set next_id = ? where name = ?" execute stmt2 [SqlInteger new_id,SqlString prefix] commit db@@ -401,10 +445,10 @@ createIndex :: Connection -> String -> String -> IO () createIndex db name tagname = do let prefix = map toLower name- table <- findSchema db name+ table <- findSchema db prefix let indexes = getIndexes "" table _ <- if null indexes- then error ("*** Tthere is no tagname: "++tagname)+ then error ("*** There is no tagname: "++tagname) else mapM (\(t,c) -> do -- putStrLn (t++" "++c) stmt <- handleSqlError (prepare db ("create index "++t++"_"++c++" on "++t++" ("++c++")")) handleSqlError (execute stmt [])) indexes@@ -462,7 +506,7 @@ {-# NOINLINE shredC #-}--- | Store an XML document into the database under the given name. Generates Haskell code.+-- | Store an XML document into the database under the given name. Generates Haskell code. It's 3 times faster than shred. shredC :: String -> String -> String -> Q Exp shredC dbname file name = unsafePerformIO (@@ -590,8 +634,8 @@ db <- connect $(litE (stringL dbname)) stmt <- prepare db "select next_id from HXQCatalog where name = ?" _ <- handleSqlError (execute stmt [SqlString prefix])- [[(_,SqlString ids)]] <- fetchAllRowsAL stmt- let id = read ids+ [[(_,ids)]] <- fetchAllRowsAL stmt+ let id = read (dbString ids) new_id <- handleSqlError ($(lamE [varP (mkName "db"),varP (mkName "doc"),varP (mkName "id")] ret) db doc id) stmt2 <- prepare db "update HXQCatalog set next_id = ? where name = ?"@@ -680,23 +724,25 @@ dbError db msg = rollback db >> error ("*** "++msg) -toStream :: XSeq -> [XMLEvent]-toStream ((XElem tag al _ _ ts):xs)- = (StartEvent tag al):(toStream ts++((EndEvent tag):toStream xs))-toStream (x:xs) = (TextEvent (show x)):toStream xs-toStream [] = []-- insertChildren :: Connection -> String -> Table -> XSeq -> Int -> IO [(Int,String)] insertChildren db schema table children parent = do stmts <- tableStmt db schema table stmt1 <- prepare db "select next_id from HXQCatalog where name = ?" execute stmt1 [SqlString schema]- [[(_,SqlString ids)]] <- fetchAllRowsAL stmt1- let id = (read ids)+1- Table tag _ _ ts = table- ic = populate (toStream children) [table,table] 0 [[],[]]- (new_id,binds) <- insert ic id (toInteger parent) stmts+ [[(_,ids)]] <- fetchAllRowsAL stmt1+ let id = (read (dbString ids))+1+ toStream (XElem tag al _ _ ts)+ = (StartEvent tag al) : (concatMap toStream ts ++ [EndEvent tag])+ toStream x = [TextEvent (show x)]+ insertTree tree i+ = let ic = populate (toStream tree) [table,table] 0 [[],[]]+ in insert db ic i (toInteger parent) stmts+ insertTrees (t:ts) i+ = let (n1,b1) = insertTree t i+ (n2,b2) = insertTrees ts n1+ in (n2,b1++b2)+ insertTrees [] i = (i,[])+ (new_id,binds) = insertTrees children id stmt2 <- prepare db "update HXQCatalog set next_id = ? where name = ?" execute stmt2 [SqlInteger new_id,SqlString schema] return binds@@ -751,8 +797,8 @@ handleSqlError (execute stmt [SqlInteger parent]) result <- fetchAllRowsAL stmt case result of- [[(_,SqlString ids)]]- -> do let id = read ids+ [[(_,ids)]]+ -> do let id = read (dbString ids) handleSqlError (run db ("delete from "++n++" where "++n++"_id = ?") [SqlInteger id]) mapM (\t -> removeTuples db schema t id) ts return ()
src/withDB/Text/XML/HXQ/OptionalDB.hs view
@@ -16,7 +16,7 @@ module Text.XML.HXQ.OptionalDB ( IConnection, Statement, Connection, publishXmlDoc, executeSQL, prepareSQL, connect, disconnect, commit, rollback,- genSchema, shred, shredC, printSchema, createIndex, insertDB, deleteDB, replaceDB+ genSchema, shred, shredC, printSchema, isSchema, createIndex, insertDB, deleteDB, replaceDB ) where