packages feed

language-c 0.7.1 → 0.7.2

raw patch · 49 files changed

+12408/−19785 lines, 49 filesdep ~basedep ~containersdep ~prettysetup-changedPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependency ranges changed: base, containers, pretty

API changes (from Hackage documentation)

+ Language.C.Analysis.DeclAnalysis: BaseFloat128 :: NumBaseType
+ Language.C.Analysis.SemRep: TyFloat128 :: FloatType
- Language.C.Data.Error: class (Typeable e, Show e) => Error e where fromError (CError e) = cast e toError = CError changeErrorLevel e lvl = if errorLevel e == lvl then e else error $ "changeErrorLevel: not possible for " ++ show e
+ Language.C.Data.Error: class (Typeable e, Show e) => Error e
- Language.C.Pretty: class Pretty p where pretty = prettyPrec 0 prettyPrec _ = pretty
+ Language.C.Pretty: class Pretty p

Files

AUTHORS view
@@ -1,19 +1,19 @@-Benedikt Huber          <benedikt.huber@gmail.com>-Manuel M T Chakravarty  <chak@cse.unsw.edu.au>-Duncan Coutts           <duncan@haskell.org>-Bertram Felgenhauer     <int-e@gmx.de>--with code contributions and patches from--Iavor Diatchki          <iavor.diatchki@gmail.com>-Kevin Charter           <kcharter@gmail.com>-Aleksey Kliger--This project originated from the C parser component of c2hs,-for many additional contributors see AUTHORS.c2hs.--Special thanks for their great support, comments and suggestions to:--Duncan Coutts           <duncan@haskell.org>-Iavor Diatchki          <iavor.diatchki@gmail.com>-Don Steward             <dons@galois.com>+Benedikt Huber          <benedikt.huber@gmail.com>
+Manuel M T Chakravarty  <chak@cse.unsw.edu.au>
+Duncan Coutts           <duncan@haskell.org>
+Bertram Felgenhauer     <int-e@gmx.de>
+
+with code contributions and patches from
+
+Iavor Diatchki          <iavor.diatchki@gmail.com>
+Kevin Charter           <kcharter@gmail.com>
+Aleksey Kliger
+
+This project originated from the C parser component of c2hs,
+for many additional contributors see AUTHORS.c2hs.
+
+Special thanks for their great support, comments and suggestions to:
+
+Duncan Coutts           <duncan@haskell.org>
+Iavor Diatchki          <iavor.diatchki@gmail.com>
+Don Steward             <dons@galois.com>
AUTHORS.c2hs view
@@ -1,25 +1,25 @@-Manuel M T Chakravarty	<chak@cse.unsw.edu.au>-Duncan Coutts		<duncan@haskell.org>--with contributions from (alphabetical order)--Bertram Felgenhauer	<int-e@gmx.de>-Ian Lynagh		<igloo@earth.li>-André Pang		<ozone@algorithm.com.au>-Jens-Ulrik Petersen	<petersen@haskell.org>-Armin Sander		<armin@mindwalker.org>-Sean Seefried		<sseefried@cse.unsw.edu.au>-Udo Stenzel		<u.stenzel@web.de>-Axel Simon              <A.Simon@ukc.ac.uk>-Michael Weber		<michaelw@debian.org>--Thanks for comments and suggestions to --Roman Leshchinskiy	<rl@cs.tu-berlin.de>-Jan Kort		<kort@science.uva.nl>-Seth Kurtzberg		<seth@cql.com>-Simon Marlow		<simonmar@microsoft.com>-Matthias Neubauer	<neubauer@informatik.uni-freiburg.de>-Sven Panne		<sven.panne@aedion.de>-Simon L. Peyton Jones	<simonpj@microsoft.com>-Volker Wysk		<post@volker-wysk.de>+Manuel M T Chakravarty	<chak@cse.unsw.edu.au>
+Duncan Coutts		<duncan@haskell.org>
+
+with contributions from (alphabetical order)
+
+Bertram Felgenhauer	<int-e@gmx.de>
+Ian Lynagh		<igloo@earth.li>
+André Pang		<ozone@algorithm.com.au>
+Jens-Ulrik Petersen	<petersen@haskell.org>
+Armin Sander		<armin@mindwalker.org>
+Sean Seefried		<sseefried@cse.unsw.edu.au>
+Udo Stenzel		<u.stenzel@web.de>
+Axel Simon              <A.Simon@ukc.ac.uk>
+Michael Weber		<michaelw@debian.org>
+
+Thanks for comments and suggestions to 
+
+Roman Leshchinskiy	<rl@cs.tu-berlin.de>
+Jan Kort		<kort@science.uva.nl>
+Seth Kurtzberg		<seth@cql.com>
+Simon Marlow		<simonmar@microsoft.com>
+Matthias Neubauer	<neubauer@informatik.uni-freiburg.de>
+Sven Panne		<sven.panne@aedion.de>
+Simon L. Peyton Jones	<simonpj@microsoft.com>
+Volker Wysk		<post@volker-wysk.de>
ChangeLog view
@@ -1,117 +1,117 @@-Changes since 0.7.0-==========================================================================--Sat Nov 25 00:46:33 2017 -0600-    add support for _Float128 (#41)--Changes since 0.6.0-==========================================================================-Mon Jul 31 2017-    Improve TypeCheck output (#31)--Sun Jul 30 2017-    * Add `__float128` (fixes #33)--Mon Maz 22 2017-    * Support clang’s __builtin_convertvector (Fixes #34)--Wed Mar 8 2017-    * Move file and parent information to new datatype FilePosition for performance reasons--Changes since 0.5.0-==========================================================================-Thu Feb 23 2017-  * Make gccParseCPPArgs grab the arg to -MF -MT and -MQ-Wed Feb 15 2017-  * In enums, allow multiple attribute specifiers per enumerator-Tue Feb 21 2017-  * Allow typedef redefinition if it denotes the same type-Tue Feb 21 2017-  * Change TypeDefRef to store Type, not Maybe Type-Tue Feb 14 2017-  * Parse (and ignore) Clang __attribute__((availability(id=major.minor.rev)))-Sun Sep 11 2016-  * Add __builtin_bswap32/64.-Wed Jun 22 2016-  * Add '_Alignof' to Lexer.x (fixes #7)-Mon Jun 27 2016-  * Updates for C11 (part 1)-  * _Nullable and _Nonnull support as well as Warnings/lint fixes provided by Anthony Cowley (https://github.com/acowley)-Wed Mar 16 2016-  * Consider storage specifier "ThreadSpec" for global and local declarations-Tue Mar 15 2016-  * Support C11 _NoReturn, genearlize is_inline to FunSpecs (Syntax) / FunAttrs (SemRep)--Changes since 0.4.3-==========================================================================-Wed Mar 2 2016-  * Add direct base type BaseInt128 (complements previous __int128 patch)-    ryan.gl.scott@gmail.com-Sun Feb 28 2016-  * Parse gcc-specific __int128 type-Thu Dec 4 2014-  * Scott Kovach <dskovach@gmail.com>: added derived Eq,Ord instances to NodeInfo--Changes since 0.4.2-==========================================================================-Sat Jan 11 2014-  * Allow unicode characters in string/char literals and filenames-Mon Oct 27 2014-  * macos-attributes-Tue Aug 13 2013-  * Do not derive Error instances for newtypes (type parameter has non-parametric role)-Mon Aug 12 2013-  * Fix bug caused by applying posFile to nopos (reported by Mikhail Sosonkin)--Changes since 0.4.1-==========================================================================-Tue Mar 19 2013-  * TypeCheck: Return Left str instead of fail str (do not rely on MonadError instance of Either)-  * Improve printing of SUERefs and Ident-Thu Feb 28 2013-  * Fix parsing and printing of octal character escapes.-Tue Jun 12 2012-  * Export Annotated type class from AST module-Wed Aug 24 2012-  * Patch for alex-3.0--Changes 0.3.1 - 0.4.1-==========================================================================-Tue Aug 16 2011:-  * Port to ghc-7.2-Fr April 15 2011: Alexander Bernauer <bernauer@inf.ethz.ch>-  * Show instances (popular request) for AST types, DumpAst demo--Changes 0.3 - 0.3.1-==========================================================================-Thu Aug 21 benedikt.huber@gmail.com-  * add aliases for exposed parsers, in order to document them--Fri Aug 15 benedikt.huber@gmail.com-  * Remove NameMap from Data.Name. We will do this right when neccessary.-  * Parser public API: expose parsers and the Parser Monad-  * ParserMonad: Return updated name supply when executing parser-  * Parser: Expose expression, statement, declaration and file parsers-  * Data: Add newNameSupply ~ (namesStartingFrom 0)--Thu Aug 14 17:13:29 CEST 2008  iavor.diatchki@gmail.com-  * Add a utility function to create a "blank" set of cpp arguments.-  * Make that analysis traversal monad abstract.-  * Export the type synonym "Register" (and bump version)--Wed Aug 13 12:00:57 CEST 2008  benedikt.huber@gmail.com-  * add Data.Position: internalIdentAt---Old Changes-==========================================================================--Mon Jun  9 23:12:46 CEST 2008  benedikt.huber@gmail.com-  * License switched to 3-clause BSD-  $--  In accordance with the original authors, Language.C is now licensed as BSD-3.-   See:-   http://haskell.org/pipermail/c2hs/2008-June/000833.html-   http://haskell.org/pipermail/c2hs/2008-June/000834.html-   http://haskell.org/pipermail/c2hs/2008-June/000835.html-+Changes since 0.7.0
+==========================================================================
+
+Sat Nov 25 00:46:33 2017 -0600
+    add support for _Float128 (#41)
+
+Changes since 0.6.0
+==========================================================================
+Mon Jul 31 2017
+    Improve TypeCheck output (#31)
+
+Sun Jul 30 2017
+    * Add `__float128` (fixes #33)
+
+Mon Maz 22 2017
+    * Support clang’s __builtin_convertvector (Fixes #34)
+
+Wed Mar 8 2017
+    * Move file and parent information to new datatype FilePosition for performance reasons
+
+Changes since 0.5.0
+==========================================================================
+Thu Feb 23 2017
+  * Make gccParseCPPArgs grab the arg to -MF -MT and -MQ
+Wed Feb 15 2017
+  * In enums, allow multiple attribute specifiers per enumerator
+Tue Feb 21 2017
+  * Allow typedef redefinition if it denotes the same type
+Tue Feb 21 2017
+  * Change TypeDefRef to store Type, not Maybe Type
+Tue Feb 14 2017
+  * Parse (and ignore) Clang __attribute__((availability(id=major.minor.rev)))
+Sun Sep 11 2016
+  * Add __builtin_bswap32/64.
+Wed Jun 22 2016
+  * Add '_Alignof' to Lexer.x (fixes #7)
+Mon Jun 27 2016
+  * Updates for C11 (part 1)
+  * _Nullable and _Nonnull support as well as Warnings/lint fixes provided by Anthony Cowley (https://github.com/acowley)
+Wed Mar 16 2016
+  * Consider storage specifier "ThreadSpec" for global and local declarations
+Tue Mar 15 2016
+  * Support C11 _NoReturn, genearlize is_inline to FunSpecs (Syntax) / FunAttrs (SemRep)
+
+Changes since 0.4.3
+==========================================================================
+Wed Mar 2 2016
+  * Add direct base type BaseInt128 (complements previous __int128 patch)
+    ryan.gl.scott@gmail.com
+Sun Feb 28 2016
+  * Parse gcc-specific __int128 type
+Thu Dec 4 2014
+  * Scott Kovach <dskovach@gmail.com>: added derived Eq,Ord instances to NodeInfo
+
+Changes since 0.4.2
+==========================================================================
+Sat Jan 11 2014
+  * Allow unicode characters in string/char literals and filenames
+Mon Oct 27 2014
+  * macos-attributes
+Tue Aug 13 2013
+  * Do not derive Error instances for newtypes (type parameter has non-parametric role)
+Mon Aug 12 2013
+  * Fix bug caused by applying posFile to nopos (reported by Mikhail Sosonkin)
+
+Changes since 0.4.1
+==========================================================================
+Tue Mar 19 2013
+  * TypeCheck: Return Left str instead of fail str (do not rely on MonadError instance of Either)
+  * Improve printing of SUERefs and Ident
+Thu Feb 28 2013
+  * Fix parsing and printing of octal character escapes.
+Tue Jun 12 2012
+  * Export Annotated type class from AST module
+Wed Aug 24 2012
+  * Patch for alex-3.0
+
+Changes 0.3.1 - 0.4.1
+==========================================================================
+Tue Aug 16 2011:
+  * Port to ghc-7.2
+Fr April 15 2011: Alexander Bernauer <bernauer@inf.ethz.ch>
+  * Show instances (popular request) for AST types, DumpAst demo
+
+Changes 0.3 - 0.3.1
+==========================================================================
+Thu Aug 21 benedikt.huber@gmail.com
+  * add aliases for exposed parsers, in order to document them
+
+Fri Aug 15 benedikt.huber@gmail.com
+  * Remove NameMap from Data.Name. We will do this right when neccessary.
+  * Parser public API: expose parsers and the Parser Monad
+  * ParserMonad: Return updated name supply when executing parser
+  * Parser: Expose expression, statement, declaration and file parsers
+  * Data: Add newNameSupply ~ (namesStartingFrom 0)
+
+Thu Aug 14 17:13:29 CEST 2008  iavor.diatchki@gmail.com
+  * Add a utility function to create a "blank" set of cpp arguments.
+  * Make that analysis traversal monad abstract.
+  * Export the type synonym "Register" (and bump version)
+
+Wed Aug 13 12:00:57 CEST 2008  benedikt.huber@gmail.com
+  * add Data.Position: internalIdentAt
+
+
+Old Changes
+==========================================================================
+
+Mon Jun  9 23:12:46 CEST 2008  benedikt.huber@gmail.com
+  * License switched to 3-clause BSD
+  $
+-  In accordance with the original authors, Language.C is now licensed as BSD-3.
+   See:
+   http://haskell.org/pipermail/c2hs/2008-June/000833.html
+   http://haskell.org/pipermail/c2hs/2008-June/000834.html
+   http://haskell.org/pipermail/c2hs/2008-June/000835.html
+
LICENSE view
@@ -1,29 +1,29 @@-Copyright (c) 1999-2008 Manuel M T Chakravarty -												Duncan Coutts-					              Benedikt Huber-Portions Copyright (c)  1989,  1990  James  A.  Roskind-All rights reserved.--Redistribution and use in source and binary forms, with or without-modification, are permitted provided that the following conditions-are met:-1. Redistributions of source code must retain the above copyright-   notice, this list of conditions and the following disclaimer.-2. Redistributions in binary form must reproduce the above copyright-   notice, this list of conditions and the following disclaimer in the-   documentation and/or other materials provided with the distribution.-3. Neither the name of the author nor the names of his contributors-   may be used to endorse or promote products derived from this software-   without specific prior written permission.--THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE-ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS-OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY-OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF-SUCH DAMAGE.+Copyright (c) 1999-2008 Manuel M T Chakravarty 
+												Duncan Coutts
+					              Benedikt Huber
+Portions Copyright (c)  1989,  1990  James  A.  Roskind
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+3. Neither the name of the author nor the names of his contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
README view
@@ -1,56 +1,56 @@-= Language.C =--Language.C is a parser and pretty-printer framework for C11 and the extensions of gcc.--See http://visq.github.io/language-c/--== Build and Install ==--cabal install---- or ----runhaskell Setup.hs configure FLAGS-runhaskell Setup.hs build-runhaskell Setup.hs install--Provide the set of flags passing- --flags="<flags-seperated-by-space>"-to configure.--== Compatibility ==--Tested with GHC 7.8, 7.10, 8.0 and 8.2.-It is recommended to use the most recent platform release: http://hackage.haskell.org/platform/.--== C Language Compatibility ==--Currently unsupported C11 constructs:- - static assertion 6.7.10 (_Static_assert)- - generic selection 6.5.1.1 (_Generic)- - _Atomic, _Alignas, _Thread_local- - Universal character names--Currently unsupported GNU C extensions:- - __auto_type- - __builtin_offsetof-   char a[__builtin_offsetof (struct S, sa->f)- - _Decimal32- - Extended assembler-   __asm__ __volatile__ ("" : : : );-   __asm__ goto ("" : : : : label);--== Sources ==--see src/README--== Examples ==--A couple of small examples are available in /examples--== Testing ==--A couple of regression tests can be run via-> cd test/harness; make--For more tests, see test/README.+= Language.C =
+
+Language.C is a parser and pretty-printer framework for C11 and the extensions of gcc.
+
+See http://visq.github.io/language-c/
+
+== Build and Install ==
+
+cabal install
+
+-- or --
+
+runhaskell Setup.hs configure FLAGS
+runhaskell Setup.hs build
+runhaskell Setup.hs install
+
+Provide the set of flags passing
+ --flags="<flags-seperated-by-space>"
+to configure.
+
+== Compatibility ==
+
+Tested with GHC 7.8, 7.10, 8.0 and 8.2.
+It is recommended to use the most recent platform release: http://hackage.haskell.org/platform/.
+
+== C Language Compatibility ==
+
+Currently unsupported C11 constructs:
+ - static assertion 6.7.10 (_Static_assert)
+ - generic selection 6.5.1.1 (_Generic)
+ - _Atomic, _Alignas, _Thread_local
+ - Universal character names
+
+Currently unsupported GNU C extensions:
+ - __auto_type
+ - __builtin_offsetof
+   char a[__builtin_offsetof (struct S, sa->f)
+ - _Decimal32
+ - Extended assembler
+   __asm__ __volatile__ ("" : : : );
+   __asm__ goto ("" : : : : label);
+
+== Sources ==
+
+see src/README
+
+== Examples ==
+
+A couple of small examples are available in /examples
+
+== Testing ==
+
+A couple of regression tests can be run via
+> cd test/harness; make
+
+For more tests, see test/README.
Setup.hs view
@@ -1,5 +1,5 @@-#!/usr/bin/env runhaskell--import Distribution.Simple--main = defaultMain+#!/usr/bin/env runhaskell
+
+import Distribution.Simple
+
+main = defaultMain
− dist/build/Language/C/Parser/Lexer.hs
@@ -1,675 +0,0 @@-{-# OPTIONS_GHC -fno-warn-unused-binds -fno-warn-missing-signatures #-}-{-# LANGUAGE CPP,MagicHash #-}-{-# LINE 49 "src/Language/C/Parser/Lexer.x" #-}---module Language.C.Parser.Lexer (lexC, parseError) where--import Data.Char (chr, isDigit)-import Data.Word (Word8)-import Control.Monad (liftM, when)--import Language.C.Data.InputStream-  (InputStream, inputStreamEmpty, takeByte, takeChar, takeChars)---- (    InputStream, readInputStream,inputStreamToString,inputStreamFromString,---     takeByte, takeChar, inputStreamEmpty, takeChars,---     countLines,--- )-import Language.C.Data.Position-import Language.C.Data.Ident    (mkIdent)--import Language.C.Syntax.Constants--import Language.C.Parser.Tokens-import Language.C.Parser.ParserMonad--#if __GLASGOW_HASKELL__ >= 603-#include "ghcconfig.h"-#elif defined(__GLASGOW_HASKELL__)-#include "config.h"-#endif-#if __GLASGOW_HASKELL__ >= 503-import Data.Array-import Data.Array.Base (unsafeAt)-#else-import Array-#endif-#if __GLASGOW_HASKELL__ >= 503-import GHC.Exts-#else-import GlaExts-#endif-alex_tab_size :: Int-alex_tab_size = 8-alex_base :: AlexAddr-alex_base = AlexA# "\xf8\xff\xff\xff\x6d\x00\x00\x00\x63\x01\x00\x00\x59\x02\x00\x00\x4f\x03\x00\x00\x45\x04\x00\x00\x3b\x05\x00\x00\x31\x06\x00\x00\x27\x07\x00\x00\x1d\x08\x00\x00\x13\x09\x00\x00\xdf\xff\xff\xff\xe0\xff\xff\xff\x6f\x00\x00\x00\xa7\xff\xff\xff\x93\x09\x00\x00\x9c\xff\xff\xff\x13\x0a\x00\x00\x93\x0a\x00\x00\x13\x0b\x00\x00\x93\x0b\x00\x00\x13\x0c\x00\x00\x93\x0c\x00\x00\x13\x0d\x00\x00\x93\x0d\x00\x00\x13\x0e\x00\x00\x93\x0e\x00\x00\x13\x0f\x00\x00\x93\x0f\x00\x00\x13\x10\x00\x00\xa3\xff\xff\xff\x93\x10\x00\x00\xa6\xff\xff\xff\x13\x11\x00\x00\x93\x11\x00\x00\x13\x12\x00\x00\x93\x12\x00\x00\x13\x13\x00\x00\x93\x13\x00\x00\x13\x14\x00\x00\x93\x14\x00\x00\x13\x15\x00\x00\x93\x15\x00\x00\x13\x16\x00\x00\xab\xff\xff\xff\x4c\x01\x00\x00\x54\x16\x00\x00\x00\x00\x00\x00\xc5\x16\x00\x00\x00\x00\x00\x00\x45\x17\x00\x00\xc5\x17\x00\x00\x54\x00\x00\x00\x37\x02\x00\x00\xc5\x18\x00\x00\x6e\x02\x00\x00\x85\x18\x00\x00\x00\x00\x00\x00\x36\x03\x00\x00\x23\x04\x00\x00\x7b\x19\x00\x00\x49\x04\x00\x00\x19\x05\x00\x00\x50\x05\x00\x00\x0f\x06\x00\x00\x9b\xff\xff\xff\x46\x06\x00\x00\x0e\x07\x00\x00\xaa\xff\xff\xff\x00\x00\x00\x00\xec\x19\x00\x00\xfb\x07\x00\x00\x00\x00\x00\x00\x5d\x1a\x00\x00\x00\x00\x00\x00\xce\x1a\x00\x00\x21\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x1b\x00\x00\xb0\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x1c\x00\x00\x92\x1c\x00\x00\x00\x00\x00\x00\x03\x1d\x00\x00\x00\x00\x00\x00\x74\x1d\x00\x00\x00\x00\x00\x00\xe5\x1d\x00\x00\x00\x00\x00\x00\x56\x1e\x00\x00\x00\x00\x00\x00\xc7\x1e\x00\x00\x00\x00\x00\x00\x38\x1f\x00\x00\x00\x00\x00\x00\x79\x1f\x00\x00\xf1\x08\x00\x00\x00\x00\x00\x00\xba\x1f\x00\x00\x00\x00\x00\x00\xfb\x1f\x00\x00\x17\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x20\x00\x00\x7d\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x20\x00\x00\xff\x20\x00\x00\x00\x00\x00\x00\x40\x21\x00\x00\x00\x00\x00\x00\x81\x21\x00\x00\x00\x00\x00\x00\xc2\x21\x00\x00\x00\x00\x00\x00\x03\x22\x00\x00\xa1\xff\xff\xff\x00\x00\x00\x00\x44\x22\x00\x00\x00\x00\x00\x00\x85\x22\x00\x00\x85\x23\x00\x00\x59\x19\x00\x00\x81\x19\x00\x00\x45\x23\x00\x00\x00\x00\x00\x00\x45\x24\x00\x00\x95\x24\x00\x00\xad\x24\x00\x00\x66\x24\x00\x00\x00\x00\x00\x00\x66\x25\x00\x00\x26\x25\x00\x00\x00\x00\x00\x00\xf6\x25\x00\x00\x5d\x26\x00\x00\xdd\x26\x00\x00\x2d\x27\x00\x00\x44\x27\x00\x00\x7b\x27\x00\x00\x96\x27\x00\x00\x4f\x27\x00\x00\x8f\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8f\x28\x00\x00\x0f\x29\x00\x00\x5f\x29\x00\x00\x76\x29\x00\x00\xad\x29\x00\x00\xc8\x29\x00\x00\x81\x29\x00\x00\xc1\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x2a\x00\x00\x11\x2b\x00\x00\x29\x2b\x00\x00\xe2\x2a\x00\x00\x00\x00\x00\x00\xe2\x2b\x00\x00\x32\x2c\x00\x00\x4a\x2c\x00\x00\x03\x2c\x00\x00\x00\x00\x00\x00\x03\x2d\x00\x00\x53\x2d\x00\x00\x98\x2d\x00\x00\x8e\x2e\x00\x00\xce\x2e\x00\x00\x00\x00\x00\x00\xce\x2f\x00\x00\x6c\x2e\x00\x00\x44\x30\x00\x00\x3a\x31\x00\x00\x7a\x31\x00\x00\x00\x00\x00\x00\x7a\x32\x00\x00\x9d\xff\xff\xff\x3a\x32\x00\x00\x00\x00\x00\x00\x3a\x33\x00\x00\xfa\x32\x00\x00\x00\x00\x00\x00\xf0\x33\x00\x00\xe2\xff\xff\xff\xe6\x34\x00\x00\xdc\x35\x00\x00\xd2\x36\x00\x00\xc8\x37\x00\x00\xbe\x38\x00\x00\x92\x2e\x00\x00\x9a\x00\x00\x00\x79\x00\x00\x00\xb0\x00\x00\x00\x8b\x00\x00\x00\x76\x2d\x00\x00\x95\x01\x00\x00\x2b\x30\x00\x00\x18\x31\x00\x00\xb4\x39\x00\x00\xaa\x3a\x00\x00\x88\x02\x00\x00\x87\x04\x00\x00\x6a\x05\x00\x00\x60\x06\x00\x00\x08\x00\x00\x00\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xec\x33\x00\x00\xe2\x34\x00\x00\x26\x01\x00\x00\x67\x01\x00\x00\xe3\xff\xff\xff\x30\x01\x00\x00\x61\x02\x00\x00\x51\x03\x00\x00\x00\x00\x00\x00\xa8\xff\xff\xff\x55\x03\x00\x00\x5a\x01\x00\x00\x68\x01\x00\x00\x59\x03\x00\x00\x43\x05\x00\x00\xc7\xff\xff\xff\x47\x00\x00\x00\x3b\x31\x00\x00\xba\x35\x00\x00\x39\x06\x00\x00\x29\x07\x00\x00\x5f\x00\x00\x00\x32\x01\x00\x00\x2d\x07\x00\x00\x31\x07\x00\x00\x00\x00\x00\x00\xa9\xff\xff\xff\x1f\x08\x00\x00\x60\x01\x00\x00\x62\x02\x00\x00\x23\x08\x00\x00\x27\x08\x00\x00\xca\xff\xff\xff\x38\x01\x00\x00\xe5\x35\x00\x00\x15\x09\x00\x00\x19\x09\x00\x00\x34\x01\x00\x00\x66\x01\x00\x00\x1d\x09\x00\x00\x58\x19\x00\x00\x00\x00\x00\x00\xe8\xff\xff\xff\x7f\x19\x00\x00\x64\x01\x00\x00\x41\x03\x00\x00\x87\x24\x00\x00\x4a\x27\x00\x00\xcb\xff\xff\xff\x57\x01\x00\x00\xb4\x36\x00\x00\xb0\x37\x00\x00\x54\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x04\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x88\x27\x00\x00\x9c\x38\x00\x00\xa6\x38\x00\x00\x8f\x39\x00\x00\xb7\x39\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x9f\x29\x00\x00\x85\x3a\x00\x00\x7a\x3b\x00\x00\x00\x00\x00\x00\xaa\x3b\x00\x00\x00\x00\x00\x00\xa0\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x04\x00\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9d\x00\x00\x00\x61\x00\x00\x00\x53\x00\x00\x00\x5e\x00\x00\x00\x60\x00\x00\x00\xaf\x00\x00\x00\x89\x00\x00\x00\x99\x00\x00\x00\xae\x00\x00\x00\x00\x00\x00\x00\x37\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9c\x00\x00\x00\x3a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#--alex_table :: AlexAddr-alex_table = AlexA# "\x00\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\x22\x01\x23\x01\xce\x00\x0e\x00\x10\x00\x79\x00\x1e\x00\x2c\x00\x20\x00\xb7\x00\x52\x01\xcd\x00\xd5\x00\xe0\x00\xe0\x00\xf1\x00\xf1\x00\x01\x01\xd4\x00\x2b\x01\xc2\x00\x0d\x00\xd8\x00\x33\x01\x34\x01\xb3\x00\x25\x01\x26\x01\x31\x01\x2f\x01\x4e\x01\x30\x01\x2a\x01\x32\x01\xea\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\x42\x01\x4f\x01\x37\x01\x43\x01\x39\x01\x41\x01\xe0\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd9\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\x27\x01\x01\x01\x28\x01\x3d\x01\xd8\x00\xe0\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\x50\x01\x3e\x01\x51\x01\x2c\x01\xff\xff\x0d\x00\x3c\x01\xff\xff\xd4\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\x13\x01\x13\x01\x1a\x01\x1a\x01\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x2e\x01\x0d\x00\x46\x01\x00\x00\xd4\x00\xe7\x00\x0d\x01\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x47\x01\x00\x00\x48\x01\x45\x01\x29\x01\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\xe1\x00\xf1\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\xc6\x00\x4c\x01\xc6\x00\x2d\x01\xa7\x00\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\xf1\x00\x3f\x01\x4d\x01\x00\x00\x44\x00\x4a\x01\x44\x01\xc8\x00\x3b\x01\xc8\x00\x00\x00\x41\x00\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x35\x01\x38\x01\x49\x01\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa5\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa8\x00\x14\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x74\x00\x23\x00\x57\x00\x57\x00\x57\x00\x58\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\x3c\x00\x00\x00\xff\xff\x00\x00\x0c\x01\x3c\x00\x3a\x01\x36\x01\x00\x00\x4b\x01\x00\x00\x00\x00\x00\x00\xde\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\xf8\x00\xe0\x00\x00\x00\xf1\x00\x00\x00\x01\x01\x0d\x01\x3c\x00\x00\x00\x00\x00\x00\x00\xe0\x00\xe0\x00\x3c\x00\x0c\x01\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\xde\x00\xdc\x00\x00\x00\xed\x00\x00\x00\x00\x00\x34\x00\x00\x00\x08\x01\xf2\x00\xe0\x00\xdc\x00\xf1\x00\x3c\x00\x01\x01\x00\x00\x00\x00\xed\x00\x3c\x00\x3c\x00\xe0\x00\xfd\x00\x3c\x00\x3c\x00\x0c\x01\xe3\x00\xf1\x00\x40\x01\x00\x00\x00\x00\x01\x01\x3c\x00\x01\x01\xde\x00\xe8\x00\x3c\x00\xa7\x00\x3c\x00\x42\x00\x3c\x00\x02\x01\x37\x00\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\xe0\x00\xe0\x00\xe0\x00\xfd\x00\xda\x00\xdd\x00\xf1\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00\x00\x01\x01\xde\x00\xe8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa5\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa8\x00\x14\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x74\x00\x23\x00\x57\x00\x57\x00\x57\x00\x58\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\x00\x00\x00\x00\xff\xff\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x0d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\xcf\x00\xd5\x00\x00\x00\x00\x00\xd3\x00\x00\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x01\xf4\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\xa7\x00\x0c\x01\xf9\x00\x00\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\xe0\x00\x00\x00\x0c\x01\xee\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x00\x00\x0c\x01\xf9\x00\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa5\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa8\x00\x14\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x74\x00\x23\x00\x57\x00\x57\x00\x57\x00\x58\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\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0d\x01\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x00\x00\x00\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x00\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x09\x01\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x0c\x01\x00\x00\x00\x00\x0c\x01\xda\x00\x00\x00\x00\x00\x00\x00\xde\x00\x0c\x01\x00\x00\x00\x00\x0c\x01\xde\x00\xa7\x00\x00\x00\xfe\x00\x0c\x01\x00\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x09\x01\x00\x00\x00\x00\x00\x00\xe0\x00\xe0\x00\x00\x00\xde\x00\xe0\x00\xe0\x00\x0c\x01\x0c\x01\xe0\x00\xe0\x00\x00\x00\x0c\x01\x0c\x01\x00\x00\x00\x00\x0c\x01\xde\x00\x00\x00\x00\x00\x00\x00\x0c\x01\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa5\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa8\x00\x14\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x74\x00\x23\x00\x57\x00\x57\x00\x57\x00\x58\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\x00\x00\x00\x00\xff\xff\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x00\x00\x00\x00\x0e\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x00\x00\x00\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x00\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\xd0\x00\xd5\x00\x00\x00\xbe\x00\xd3\x00\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x00\x00\x00\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x00\x00\x00\xbd\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa0\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa3\x00\x15\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x72\x00\x24\x00\x55\x00\x55\x00\x55\x00\x56\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\x00\x00\x00\x00\xff\xff\x40\x00\x40\x00\x40\x00\x40\x00\x40\x00\x40\x00\x40\x00\x40\x00\x40\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x40\x00\x40\x00\x40\x00\x40\x00\x40\x00\x00\x00\x00\x00\x0e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\xcf\x00\xd5\x00\x00\x00\x00\x00\xd3\x00\x00\x00\x00\x00\x40\x00\x40\x00\x40\x00\x40\x00\x40\x00\x40\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\x00\x00\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\xa2\x00\x0c\x01\x00\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\xe0\x00\x00\x00\xdf\x00\x00\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x00\x00\x0c\x01\x00\x00\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa0\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa3\x00\x15\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x72\x00\x24\x00\x55\x00\x55\x00\x55\x00\x56\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\x00\x00\x00\x00\xff\xff\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x00\x00\x00\x00\x0e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\xd0\x00\xd5\x00\x00\x00\x00\x00\xd3\x00\x00\x00\x00\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x47\x00\x47\x00\x47\x00\x47\x00\x47\x00\x47\x00\x47\x00\x47\x00\x47\x00\x47\x00\xd0\x00\x00\x00\xbd\x00\x00\x00\x00\x00\x0c\x01\x00\x00\x47\x00\x47\x00\x47\x00\x47\x00\x47\x00\x47\x00\xa2\x00\xef\x00\x00\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x00\xf1\x00\x00\x00\x0c\x01\x00\x00\x47\x00\x47\x00\x47\x00\x47\x00\x47\x00\x47\x00\x00\x00\xef\x00\x00\x00\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa0\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa3\x00\x15\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x72\x00\x24\x00\x55\x00\x55\x00\x55\x00\x56\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\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x01\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x00\x00\x00\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x00\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x0c\x01\xef\x00\x00\x00\x00\x00\x00\x00\x0c\x01\xa2\x00\x00\x00\x00\x00\x0c\x01\x00\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x00\xf1\x00\x00\x00\xeb\x00\xf1\x00\xf1\x00\x00\x00\x0c\x01\xf1\x00\xf1\x00\x00\x00\xef\x00\xef\x00\x00\x00\x00\x00\x00\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x0c\x01\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa0\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa3\x00\x15\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x72\x00\x24\x00\x55\x00\x55\x00\x55\x00\x56\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\x00\x00\x00\x00\xff\xff\x63\x00\x63\x00\x63\x00\x63\x00\x63\x00\x63\x00\x63\x00\x63\x00\x63\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x00\x63\x00\x63\x00\x63\x00\x63\x00\x63\x00\x00\x00\x00\x00\x0f\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\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x00\x00\x63\x00\x63\x00\x63\x00\x63\x00\x63\x00\x63\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x00\x00\x00\x00\x00\x00\xeb\x00\x00\x00\x00\x00\x00\x00\xef\x00\x00\x00\x00\x00\x00\x00\xf6\x00\xef\x00\x00\x00\x00\x00\x00\x00\x0c\x01\xa7\x00\x00\x00\x00\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\xf1\x00\xf1\x00\x00\x00\x0c\x01\xf1\x00\xf1\x00\x00\x00\x0c\x01\xf1\x00\xf1\x00\x00\x00\xf0\x00\xef\x00\x00\x00\x00\x00\x00\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x0c\x01\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa5\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa8\x00\x14\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x74\x00\x23\x00\x57\x00\x57\x00\x57\x00\x58\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\x00\x00\x00\x00\xff\xff\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x00\x00\x00\x00\x10\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\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x00\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x00\x00\x00\x00\x00\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x0c\x01\xff\x00\x00\x00\x00\x00\x00\x00\xff\x00\xa2\x00\x00\x00\x00\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x01\x01\x01\x01\x00\x00\x0c\x01\x01\x01\x01\x01\x00\x00\xfb\x00\x01\x01\x01\x01\x00\x00\x0c\x01\xff\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x0c\x01\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa0\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa3\x00\x15\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x72\x00\x24\x00\x55\x00\x55\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xba\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xb6\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb0\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xaa\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xa5\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa0\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x96\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x97\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x8c\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x8d\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x88\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x83\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x7e\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x0f\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x11\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x12\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x13\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x14\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x15\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x17\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x16\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x19\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x18\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x1a\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x1b\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x1c\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x38\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\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\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\xff\xff\xff\xff\x33\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x36\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\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\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\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\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\x00\x00\x00\x00\xff\xff\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\x00\x00\x00\x00\xff\xff\xbd\x00\x0c\x01\x00\x00\x00\x00\x00\x00\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x01\x00\x00\x00\x00\x00\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\x00\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\x01\x01\x01\x01\x00\x00\xff\x00\x00\x00\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfb\x00\x00\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbd\x00\xbd\x00\x00\x00\x00\x00\xbd\x00\xbd\x00\x01\x01\x01\x01\x00\x00\x0c\x01\x00\x00\x00\x00\x00\x00\xbd\x00\x00\x00\x00\x00\x00\x00\xbd\x00\xff\x00\xbd\x00\x00\x00\xbd\x00\x00\x00\x7f\x00\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x38\x00\x33\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2e\x00\x32\x00\x31\x00\x31\x00\x31\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x62\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\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\xff\xff\xff\xff\x65\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\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\xff\xff\xff\xff\x67\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\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\xff\xff\xff\xff\x6c\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\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\xff\xff\xff\xff\x6b\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\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\xff\xff\xff\xff\x70\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\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\xff\xff\xff\xff\x6f\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\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\xff\xff\xff\xff\x72\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\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\xff\xff\xff\xff\x74\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\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\xff\xff\xff\xff\x76\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\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\xff\xff\xff\xff\x78\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\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\xff\xff\xff\xff\x7b\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\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\xff\xff\xff\xff\x7d\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\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\xff\xff\xff\xff\x81\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x86\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x89\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x92\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x93\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x9c\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x9d\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa3\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa8\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xae\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xb4\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xb8\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xbb\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\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\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\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\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\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\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\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\x00\x00\x00\x00\x00\x00\xff\x00\xbf\x00\x00\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\x0c\x01\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\x00\x00\x00\x00\x01\x01\x01\x01\xbf\x00\x0c\x01\x00\x00\x00\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x00\xbf\x00\x00\x00\x00\x00\xbf\x00\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x42\x00\xbf\x00\x00\x00\x84\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\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\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\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\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\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\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\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\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\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\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\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\x00\x00\x00\x00\x00\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\x00\x00\x00\x00\x06\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x0c\x01\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\x01\x01\x01\x01\x00\x00\x00\x01\x00\x00\xc1\x00\x00\x00\xc0\x00\x00\x00\x00\x00\xc1\x00\x00\x00\x0c\x01\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\x13\x01\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x13\x01\xc1\x00\x00\x00\xc0\x00\x00\x00\x13\x01\x00\x00\xc1\x00\xc0\x00\xc0\x00\x00\x00\x13\x01\xc0\x00\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x13\x01\xc0\x00\x42\x00\xc0\x00\xc1\x00\x8e\x00\x13\x01\x00\x00\x00\x00\xc1\x00\xc1\x00\x13\x01\x00\x00\xc1\x00\xc1\x00\x00\x00\x00\x00\x13\x01\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x00\x00\x00\x00\x00\x00\x00\xc1\x00\x00\x00\xc1\x00\x00\x00\xc1\x00\x00\x00\x8f\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\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\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\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\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\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\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\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x1a\x01\x00\x00\x00\x00\x00\x00\x00\x00\xc3\x00\x1a\x01\xc2\x00\x00\x00\x00\x00\xc3\x00\x1a\x01\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x1a\x01\x00\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x1a\x01\x00\x00\xc3\x00\x00\x00\xc2\x00\x00\x00\x1a\x01\x00\x00\xc3\x00\xc2\x00\xc2\x00\x1a\x01\x00\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x1a\x01\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\xc2\x00\x42\x00\xc2\x00\xc3\x00\x98\x00\x00\x00\x00\x00\x00\x00\xc3\x00\xc3\x00\x00\x00\x00\x00\xc3\x00\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc3\x00\x00\x00\x00\x00\x00\x00\xc3\x00\x00\x00\xc3\x00\x00\x00\xc3\x00\x00\x00\x99\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\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\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\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\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\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x00\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x0a\x00\x00\x00\x00\x00\x0a\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x0a\x00\x00\x00\x0a\x00\x00\x00\xa1\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\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\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\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\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x00\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x09\x00\x00\x00\x00\x00\x09\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x09\x00\x00\x00\x09\x00\x00\x00\xa6\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\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\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\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\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x16\x01\x00\x00\xc9\x00\xc9\x00\xc9\x00\xc9\x00\xc9\x00\xc9\x00\xc9\x00\xc9\x00\xc9\x00\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x05\x00\xc7\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\xc7\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x05\x00\x00\x00\x00\x00\x05\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x05\x00\x43\x00\x05\x00\x00\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x88\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x89\x00\x1a\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x67\x00\x29\x00\x4a\x00\x4a\x00\x4a\x00\x4b\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\x00\x00\x00\x00\xff\xff\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x00\x00\x00\x00\xff\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\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x00\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\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\xac\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xaa\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xae\x00\x13\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x76\x00\x22\x00\x59\x00\x59\x00\x59\x00\x5a\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\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\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\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x00\x00\x00\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x01\x00\x00\x00\x00\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x43\x00\x01\x00\x00\x00\xb1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x88\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x89\x00\x1a\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x67\x00\x29\x00\x4a\x00\x4a\x00\x4a\x00\x4b\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\x00\x00\xc4\x00\xff\xff\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x01\x00\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xc9\x00\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x00\x00\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc7\x00\x00\x00\x00\x00\x00\x00\xe4\x00\xe4\x00\x00\x00\xdb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xb0\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb4\x00\x12\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x78\x00\x21\x00\x5b\x00\x5b\x00\x5b\x00\x5c\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\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\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\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\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\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\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\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\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\x80\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7e\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x81\x00\x1c\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x62\x00\x2b\x00\x45\x00\x45\x00\x45\x00\x46\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\x00\x00\x00\x00\xff\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\xc0\x00\x00\x00\xd8\x00\x00\x00\x24\x01\xad\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\x85\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x83\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x86\x00\x1b\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x65\x00\x2a\x00\x48\x00\x48\x00\x48\x00\x49\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\x00\x00\x16\x01\xff\xff\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xc9\x00\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x01\xc7\x00\x00\x00\x00\x00\x00\x00\xc1\x00\x00\x00\x00\x00\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x00\x00\x00\x00\xcb\x00\x16\x01\x00\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xc7\x00\x00\x00\x00\x00\x00\x00\xe4\x00\xe4\x00\x00\x00\xdb\x00\x00\x00\x00\x00\x00\x00\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x00\x00\xf3\x00\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\xf7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc7\x00\x00\x00\x00\x00\x00\x00\xf5\x00\xf5\x00\x00\x00\xec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf7\x00\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x8c\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x92\x00\x18\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6b\x00\x28\x00\x4d\x00\x4d\x00\x4d\x00\x50\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\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x00\x00\x00\x00\x05\x01\x05\x01\x00\x00\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x91\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x8d\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x93\x00\x19\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x6c\x00\x27\x00\x4e\x00\x4e\x00\x4e\x00\x4f\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\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x01\x00\x00\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x1f\x01\x00\x00\x00\x00\x00\x00\x00\x00\xc3\x00\x00\x00\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x01\x00\x00\x00\x00\x00\x00\xc5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x00\x00\x00\x00\x05\x01\x05\x01\x00\x00\xfc\x00\x00\x00\x00\x00\x00\x00\xc5\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x07\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x96\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9c\x00\x16\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6f\x00\x26\x00\x51\x00\x51\x00\x51\x00\x54\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\x00\x00\x00\x00\xff\xff\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x1e\x01\xc7\x00\x12\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\xc7\x00\x12\x01\x12\x01\x00\x00\x00\x00\x00\x00\x00\x00\x12\x01\x12\x01\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x00\x00\xc7\x00\x12\x01\x00\x00\x00\x00\x14\x01\x14\x01\x00\x00\x12\x01\x00\x00\x00\x00\xc7\x00\x12\x01\x12\x01\x00\x00\x14\x01\x14\x01\x00\x00\x12\x01\x12\x01\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x9b\x00\x00\x00\x00\x00\x12\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x97\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9d\x00\x17\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x70\x00\x25\x00\x52\x00\x52\x00\x52\x00\x53\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xd7\x00\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\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\x12\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x00\x00\x00\x00\xca\x00\x12\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x00\x00\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x14\x01\x14\x01\x00\x00\x12\x01\xc7\x00\x12\x01\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x12\x01\x00\x00\x12\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\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\xc7\x00\x12\x01\x00\x00\x00\x00\x14\x01\x14\x01\x00\x00\x12\x01\x00\x00\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xb6\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb8\x00\x11\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7b\x00\x1f\x00\x5d\x00\x5d\x00\x5d\x00\x5e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xd6\x00\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\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\x19\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x01\x00\x00\x00\x00\x00\x00\x00\x00\x19\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\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\x19\x01\x00\x00\x00\x00\x1b\x01\x1b\x01\x00\x00\x19\x01\x00\x00\x00\x00\x00\x00\x00\x00\x19\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xba\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbb\x00\x0f\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7d\x00\x1d\x00\x5f\x00\x5f\x00\x5f\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x38\x00\x33\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2e\x00\x32\x00\x31\x00\x31\x00\x31\x00\x30\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\x00\x00\x00\x00\xff\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\xff\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x38\x00\x33\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2e\x00\x32\x00\x31\x00\x31\x00\x31\x00\x30\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\x00\x00\x00\x00\xff\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\x24\x01\x00\x00\x00\x00\x00\x00\x00\x00\xff\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x83\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x86\x00\x1b\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x65\x00\x2a\x00\x48\x00\x48\x00\x48\x00\x49\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#--alex_check :: AlexAddr-alex_check = AlexA# "\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x27\x00\x27\x00\x61\x00\x6d\x00\x67\x00\x65\x00\x61\x00\x72\x00\x64\x00\x6e\x00\x2e\x00\x74\x00\x0a\x00\x4c\x00\x6c\x00\x6c\x00\x4c\x00\x4c\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x55\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x6c\x00\x5d\x00\x5e\x00\x5f\x00\x75\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\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x0a\x00\x09\x00\x3d\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x69\x00\x6a\x00\x69\x00\x6a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x2d\x00\x20\x00\x3d\x00\xff\xff\x20\x00\x4c\x00\x27\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x3d\x00\xff\xff\x3d\x00\x3d\x00\x3e\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x6c\x00\x55\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x2b\x00\x3d\x00\x2d\x00\x2b\x00\x5c\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x75\x00\x26\x00\x3d\x00\xff\xff\x69\x00\x3d\x00\x3d\x00\x2b\x00\x3d\x00\x2d\x00\xff\xff\x70\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3c\x00\x3d\x00\x3d\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\x22\x00\xff\xff\x0d\x00\xff\xff\x4c\x00\x27\x00\x3d\x00\x3e\x00\xff\xff\x3d\x00\xff\xff\xff\xff\xff\xff\x55\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x4c\x00\x55\x00\xff\xff\x55\x00\xff\xff\x55\x00\x27\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\x45\x00\x6c\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x75\x00\x6c\x00\xff\xff\x6c\x00\xff\xff\xff\xff\x55\x00\xff\xff\x4c\x00\x6c\x00\x75\x00\x4c\x00\x75\x00\x5c\x00\x75\x00\xff\xff\xff\xff\x4c\x00\x61\x00\x62\x00\x55\x00\x4c\x00\x65\x00\x66\x00\x4c\x00\x4c\x00\x55\x00\x7c\x00\xff\xff\xff\xff\x55\x00\x6e\x00\x55\x00\x55\x00\x55\x00\x72\x00\x5c\x00\x74\x00\x75\x00\x76\x00\x6c\x00\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x75\x00\x69\x00\x6a\x00\x6c\x00\x6c\x00\x6c\x00\x75\x00\xff\xff\xff\xff\xff\xff\x75\x00\xff\xff\x75\x00\x75\x00\x75\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\x4c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x5c\x00\x55\x00\x55\x00\xff\xff\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x6c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x75\x00\x75\x00\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x55\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x4c\x00\xff\xff\xff\xff\x4c\x00\x4c\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x55\x00\xff\xff\xff\xff\x55\x00\x55\x00\x5c\x00\xff\xff\x6c\x00\x55\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x75\x00\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\x6c\x00\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x75\x00\xff\xff\xff\xff\x75\x00\x75\x00\xff\xff\xff\xff\xff\xff\x75\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x09\x00\x0a\x00\xff\xff\x2e\x00\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x22\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x5c\x00\x55\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x75\x00\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\xff\xff\x22\x00\xff\xff\xff\xff\x4c\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x5c\x00\x55\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x75\x00\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x4c\x00\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x55\x00\xff\xff\xff\xff\xff\xff\x55\x00\x5c\x00\xff\xff\xff\xff\x55\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x75\x00\xff\xff\xff\xff\xff\xff\x75\x00\xff\xff\xff\xff\xff\xff\x75\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x27\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\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x55\x00\xff\xff\xff\xff\xff\xff\x55\x00\x5c\x00\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x75\x00\xff\xff\xff\xff\xff\xff\x75\x00\xff\xff\xff\xff\xff\xff\x75\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x27\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\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x55\x00\xff\xff\xff\xff\xff\xff\x55\x00\x5c\x00\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x75\x00\xff\xff\xff\xff\xff\xff\x75\x00\xff\xff\xff\xff\xff\xff\x75\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\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\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\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\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x27\x00\x22\x00\x4c\x00\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x3f\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\x75\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\x75\x00\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\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\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\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\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\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\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\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\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x27\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x55\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\x45\x00\x6c\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x75\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\x75\x00\x76\x00\xff\xff\x78\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\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\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\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\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\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\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\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\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\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\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\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\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\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\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\x55\x00\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\x22\x00\xff\xff\x3f\x00\xff\xff\xff\xff\x27\x00\xff\xff\x75\x00\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x46\x00\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x3f\x00\xff\xff\x5c\x00\xff\xff\x51\x00\xff\xff\x45\x00\x61\x00\x62\x00\xff\xff\x57\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\x66\x00\x74\x00\x75\x00\x76\x00\x5c\x00\x78\x00\x6c\x00\xff\xff\xff\xff\x61\x00\x62\x00\x71\x00\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\x77\x00\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\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\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\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\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\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\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\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\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x4c\x00\x3f\x00\xff\xff\xff\xff\x27\x00\x51\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x57\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\x66\x00\xff\xff\x3f\x00\xff\xff\x5c\x00\xff\xff\x6c\x00\xff\xff\x45\x00\x61\x00\x62\x00\x71\x00\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\x77\x00\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\x75\x00\x76\x00\x5c\x00\x78\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\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\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\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\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\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\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\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\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\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\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\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\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\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\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\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\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x22\x00\x45\x00\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\x65\x00\xff\xff\x45\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\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\x75\x00\x76\x00\xff\xff\x78\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x27\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\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\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\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\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\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\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\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\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\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x0a\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\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\x75\x00\x76\x00\xff\xff\x78\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\x2e\x00\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x75\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\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\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\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\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\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\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\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\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\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\x24\x00\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\x5c\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\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\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\x22\x00\xff\xff\x24\x00\xff\xff\x22\x00\x27\x00\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\x5c\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\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\x2e\x00\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x45\x00\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\x58\x00\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x65\x00\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x75\x00\xff\xff\x4c\x00\x78\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\x55\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\x65\x00\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x75\x00\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x75\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\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\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\xff\xff\xff\xff\x70\x00\xff\xff\xff\xff\xff\xff\x5c\x00\x75\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\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\x45\x00\x46\x00\x51\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\x57\x00\xff\xff\xff\xff\xff\xff\x51\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x57\x00\xff\xff\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\xff\xff\x65\x00\x66\x00\x71\x00\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x77\x00\xff\xff\xff\xff\xff\xff\x71\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\x77\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\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\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\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x51\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\x57\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x45\x00\x46\x00\xff\xff\xff\xff\x71\x00\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\x77\x00\xff\xff\x51\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x57\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\x65\x00\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x77\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\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\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x51\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x57\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\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x77\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\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x70\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\x5c\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\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\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\x27\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\x5c\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\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\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\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\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\x5c\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\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00"#--alex_deflt :: AlexAddr-alex_deflt = AlexA# "\xff\xff\x09\x00\x09\x00\x09\x00\x09\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x09\x00\x0a\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\x39\x00\x39\x00\x2f\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x3c\x00\xff\xff\x3c\x00\x3c\x00\xff\xff\xff\xff\x3c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x61\x00\xff\xff\x64\x00\x64\x00\x66\x00\x66\x00\xff\xff\x6a\x00\x69\x00\x69\x00\x6a\x00\x6e\x00\x6d\x00\x6d\x00\x6e\x00\x71\x00\x71\x00\x73\x00\x73\x00\x75\x00\x75\x00\x77\x00\x77\x00\x7a\x00\x7a\x00\x7c\x00\x7c\x00\x82\x00\x82\x00\xff\xff\x87\x00\x87\x00\x8a\x00\x8a\x00\xff\xff\x95\x00\x94\x00\x94\x00\x95\x00\x9f\x00\x9e\x00\x9e\x00\x9f\x00\xa4\x00\xa4\x00\xa9\x00\xa9\x00\xaf\x00\xaf\x00\xb5\x00\xb5\x00\xff\xff\xb9\x00\xb9\x00\xbc\x00\xbc\x00\xbd\x00\xff\xff\xff\xff\xbd\x00\xbd\x00\xbf\x00\xff\xff\xff\xff\xbf\x00\xbf\x00\x0c\x00\x0c\x00\x0c\x00\xff\xff\xc0\x00\xc1\x00\xff\xff\xff\xff\xff\xff\xff\xff\xc0\x00\xc1\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xff\xff\xff\xff\xff\xff\xff\xff\xc2\x00\xc3\x00\xc2\x00\xc3\x00\x0a\x00\xff\xff\xff\xff\x0a\x00\x0a\x00\x09\x00\xff\xff\xff\xff\x09\x00\x09\x00\x05\x00\xff\xff\x0c\x00\x05\x00\x05\x00\x05\x00\x01\x00\xff\xff\x0c\x00\x01\x00\x01\x00\x01\x00\xcd\x00\xff\xff\xcd\x00\xcd\x00\xce\x00\xce\x00\xce\x00\xbd\x00\xff\xff\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xcd\x00\xce\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\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\x3c\x00\xff\xff\x3c\x00\xff\xff\xff\xff\xbf\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"#--alex_accept = listArray (0::Int,338) [AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccSkip,AlexAcc (alex_action_1),AlexAccSkip,AlexAccSkip,AlexAcc (alex_action_4),AlexAcc (alex_action_4),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_6),AlexAcc (alex_action_6),AlexAcc (alex_action_6),AlexAcc (alex_action_6),AlexAcc (alex_action_6),AlexAcc (alex_action_6),AlexAcc (alex_action_6),AlexAcc (alex_action_6),AlexAcc (alex_action_6),AlexAcc (alex_action_6),AlexAcc (alex_action_6),AlexAcc (alex_action_6),AlexAcc (alex_action_6),AlexAcc (alex_action_6),AlexAcc (alex_action_6),AlexAcc (alex_action_6),AlexAcc (alex_action_7),AlexAcc (alex_action_7),AlexAcc (alex_action_7),AlexAcc (alex_action_7),AlexAcc (alex_action_7),AlexAcc (alex_action_7),AlexAcc (alex_action_7),AlexAcc (alex_action_7),AlexAcc (alex_action_7),AlexAcc (alex_action_7),AlexAcc (alex_action_7),AlexAcc (alex_action_7),AlexAcc (alex_action_7),AlexAcc (alex_action_7),AlexAcc (alex_action_7),AlexAcc (alex_action_7),AlexAcc (alex_action_7),AlexAcc (alex_action_8),AlexAcc (alex_action_9),AlexAcc (alex_action_10),AlexAcc (alex_action_11),AlexAcc (alex_action_12),AlexAcc (alex_action_13),AlexAcc (alex_action_14),AlexAcc (alex_action_14),AlexAcc (alex_action_14),AlexAcc (alex_action_14),AlexAcc (alex_action_14),AlexAcc (alex_action_14),AlexAcc (alex_action_14),AlexAcc (alex_action_15),AlexAcc (alex_action_15),AlexAcc (alex_action_15),AlexAcc (alex_action_15),AlexAcc (alex_action_16),AlexAcc (alex_action_17),AlexAcc (alex_action_17),AlexAcc (alex_action_18),AlexAcc (alex_action_18),AlexAcc (alex_action_19),AlexAcc (alex_action_20),AlexAcc (alex_action_21),AlexAcc (alex_action_22),AlexAcc (alex_action_23),AlexAcc (alex_action_24),AlexAcc (alex_action_25),AlexAcc (alex_action_26),AlexAcc (alex_action_27),AlexAcc (alex_action_28),AlexAcc (alex_action_29),AlexAcc (alex_action_30),AlexAcc (alex_action_31),AlexAcc (alex_action_32),AlexAcc (alex_action_33),AlexAcc (alex_action_34),AlexAcc (alex_action_35),AlexAcc (alex_action_36),AlexAcc (alex_action_37),AlexAcc (alex_action_38),AlexAcc (alex_action_39),AlexAcc (alex_action_40),AlexAcc (alex_action_41),AlexAcc (alex_action_42),AlexAcc (alex_action_43),AlexAcc (alex_action_44),AlexAcc (alex_action_45),AlexAcc (alex_action_46),AlexAcc (alex_action_47),AlexAcc (alex_action_48),AlexAcc (alex_action_49),AlexAcc (alex_action_50),AlexAcc (alex_action_51),AlexAcc (alex_action_52),AlexAcc (alex_action_53),AlexAcc (alex_action_54),AlexAcc (alex_action_55),AlexAcc (alex_action_56),AlexAcc (alex_action_57),AlexAcc (alex_action_58),AlexAcc (alex_action_59),AlexAcc (alex_action_60),AlexAcc (alex_action_61),AlexAcc (alex_action_62),AlexAcc (alex_action_63),AlexAcc (alex_action_64),AlexAcc (alex_action_65),AlexAcc (alex_action_66),AlexAcc (alex_action_67)]-{-# LINE 262 "src/Language/C/Parser/Lexer.x" #-}---- Fix the 'octal' lexing of '0'-readCOctal :: String -> Either String CInteger-readCOctal s@('0':r) =-    case r of-        (c:_) | isDigit c -> readCInteger OctalRepr r-        _                 -> readCInteger DecRepr s-readCOctal _ = error "ReadOctal: string does not start with `0'"---- We use the odd looking list of string patterns here rather than normal--- string literals since GHC converts the latter into a sequence of string--- comparisons (ie a linear search) but it translates the former using its--- effecient pattern matching which gives us the expected radix-style search.--- This change makes a significant performance difference [chak]------ To make this a little more maintainable, we autogenerate it from this list,--- using the script GenerateKeywords.hs (in /scripts)-{--alignas _Alignas, alignof _Alignof __alignof alignof __alignof__, asm @__, atomic _Atomic, auto-break, bool _Bool,-case, char, const @__, continue, complex _Complex __complex__-default, do, double,-else, enum, extern,-float, for, goto,-if, inline @__, int, __int128, long, noreturn _Noreturn,-float, for,-generic _Generic, goto,-if, inline @__, int, int128 __int128, long,-noreturn _Noreturn,  _Nullable __nullable, _Nonnull __nonnull,-register, restrict @__, return-short, signed @__, sizeof, static, staticAssert _Static_assert, struct, switch,-typedef, typeof @__, thread __thread _Thread_local-union, unsigned, void, volatile @__,-while,-label __label__-(CTokGnuC GnuCAttrTok) __attribute __attribute__-(CTokGnuC GnuCExtTok) __extension__-(CTokGnuC GnuCComplexReal) __real __real__-(CTokGnuC GnuCComplexImag) __imag __imag__-(CTokGnuC GnuCVaArg) __builtin_va_arg-(CTokGnuC GnuCOffsetof) __builtin_offsetof-(CTokGnuC GnuCTyCompat) __builtin_types_compatible_p-(CTokClangC ClangBuiltinConvertVector) __builtin_convertvector--}--- Tokens: _Alignas _Alignof __alignof alignof __alignof__ __asm asm __asm__ _Atomic auto break _Bool case char __const const __const__ continue _Complex __complex__ default do double else enum extern float __float128 _Float128 for _Generic goto if __inline inline __inline__ int __int128 long _Noreturn  _Nullable __nullable _Nonnull __nonnull register __restrict restrict __restrict__ return short __signed signed __signed__ sizeof static _Static_assert struct switch typedef __typeof typeof __typeof__ __thread _Thread_local union unsigned void __volatile volatile __volatile__ while __label__ __attribute __attribute__ __extension__ __real __real__ __imag __imag__ __builtin_va_arg __builtin_offsetof __builtin_types_compatible_p  __builtin_convertvector-idkwtok ('_' : 'A' : 'l' : 'i' : 'g' : 'n' : 'a' : 's' : []) = tok 8 CTokAlignas-idkwtok ('_' : 'A' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : []) = tok 8 CTokAlignof-idkwtok ('_' : 'A' : 't' : 'o' : 'm' : 'i' : 'c' : []) = tok 7 CTokAtomic-idkwtok ('_' : 'B' : 'o' : 'o' : 'l' : []) = tok 5 CTokBool-idkwtok ('_' : 'C' : 'o' : 'm' : 'p' : 'l' : 'e' : 'x' : []) = tok 8 CTokComplex-idkwtok ('_' : 'N' : 'o' : 'n' : 'n' : 'u' : 'l' : 'l' : []) = tok 8 CTokNonnull-idkwtok ('_' : 'G' : 'e' : 'n' : 'e' : 'r' : 'i' : 'c' : []) = tok 8 CTokGeneric-idkwtok ('_' : 'N' : 'o' : 'r' : 'e' : 't' : 'u' : 'r' : 'n' : []) = tok 9 CTokNoreturn-idkwtok ('_' : 'N' : 'u' : 'l' : 'l' : 'a' : 'b' : 'l' : 'e' : []) = tok 9 CTokNullable-idkwtok ('_' : 'S' : 't' : 'a' : 't' : 'i' : 'c' : '_' : 'a' : 's' : 's' : 'e' : 'r' : 't' : []) = tok 14 CTokStaticAssert-idkwtok ('_' : 'T' : 'h' : 'r' : 'e' : 'a' : 'd' : '_' : 'l' : 'o' : 'c' : 'a' : 'l' : []) = tok 13 CTokThread-idkwtok ('_' : '_' : 'a' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : []) = tok 9 CTokAlignof-idkwtok ('a' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : []) = tok 7 CTokAlignof-idkwtok ('_' : '_' : 'a' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : '_' : '_' : []) = tok 11 CTokAlignof-idkwtok ('_' : '_' : 'a' : 's' : 'm' : []) = tok 5 CTokAsm-idkwtok ('a' : 's' : 'm' : []) = tok 3 CTokAsm-idkwtok ('_' : '_' : 'a' : 's' : 'm' : '_' : '_' : []) = tok 7 CTokAsm-idkwtok ('_' : '_' : 'a' : 't' : 't' : 'r' : 'i' : 'b' : 'u' : 't' : 'e' : []) = tok 11 (CTokGnuC GnuCAttrTok)-idkwtok ('_' : '_' : 'a' : 't' : 't' : 'r' : 'i' : 'b' : 'u' : 't' : 'e' : '_' : '_' : []) = tok 13 (CTokGnuC GnuCAttrTok)-idkwtok ('a' : 'u' : 't' : 'o' : []) = tok 4 CTokAuto-idkwtok ('b' : 'r' : 'e' : 'a' : 'k' : []) = tok 5 CTokBreak-idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 'o' : 'f' : 'f' : 's' : 'e' : 't' : 'o' : 'f' : []) = tok 18 (CTokGnuC GnuCOffsetof)-idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 't' : 'y' : 'p' : 'e' : 's' : '_' : 'c' : 'o' : 'm' : 'p' : 'a' : 't' : 'i' : 'b' : 'l' : 'e' : '_' : 'p' : []) = tok 28 (CTokGnuC GnuCTyCompat)-idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 'v' : 'a' : '_' : 'a' : 'r' : 'g' : []) = tok 16 (CTokGnuC GnuCVaArg)-idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 'c' : 'o' : 'n' : 'v' : 'e' : 'r' : 't' : 'v' : 'e' : 'c' : 't' : 'o' : 'r' : []) = tok 23 (flip CTokClangC ClangBuiltinConvertVector)-idkwtok ('c' : 'a' : 's' : 'e' : []) = tok 4 CTokCase-idkwtok ('c' : 'h' : 'a' : 'r' : []) = tok 4 CTokChar-idkwtok ('_' : '_' : 'c' : 'o' : 'm' : 'p' : 'l' : 'e' : 'x' : '_' : '_' : []) = tok 11 CTokComplex-idkwtok ('_' : '_' : 'c' : 'o' : 'n' : 's' : 't' : []) = tok 7 CTokConst-idkwtok ('c' : 'o' : 'n' : 's' : 't' : []) = tok 5 CTokConst-idkwtok ('_' : '_' : 'c' : 'o' : 'n' : 's' : 't' : '_' : '_' : []) = tok 9 CTokConst-idkwtok ('c' : 'o' : 'n' : 't' : 'i' : 'n' : 'u' : 'e' : []) = tok 8 CTokContinue-idkwtok ('d' : 'e' : 'f' : 'a' : 'u' : 'l' : 't' : []) = tok 7 CTokDefault-idkwtok ('d' : 'o' : []) = tok 2 CTokDo-idkwtok ('d' : 'o' : 'u' : 'b' : 'l' : 'e' : []) = tok 6 CTokDouble-idkwtok ('e' : 'l' : 's' : 'e' : []) = tok 4 CTokElse-idkwtok ('e' : 'n' : 'u' : 'm' : []) = tok 4 CTokEnum-idkwtok ('_' : '_' : 'e' : 'x' : 't' : 'e' : 'n' : 's' : 'i' : 'o' : 'n' : '_' : '_' : []) = tok 13 (CTokGnuC GnuCExtTok)-idkwtok ('e' : 'x' : 't' : 'e' : 'r' : 'n' : []) = tok 6 CTokExtern-idkwtok ('f' : 'l' : 'o' : 'a' : 't' : []) = tok 5 CTokFloat-idkwtok ('_' : '_' : 'f' : 'l' : 'o' : 'a' : 't' : '1' : '2' : '8' : []) = tok 10 CTokFloat128-idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '1' : '2' : '8' : []) = tok 9 CTokFloat128-idkwtok ('f' : 'o' : 'r' : []) = tok 3 CTokFor-idkwtok ('g' : 'o' : 't' : 'o' : []) = tok 4 CTokGoto-idkwtok ('i' : 'f' : []) = tok 2 CTokIf-idkwtok ('_' : '_' : 'i' : 'm' : 'a' : 'g' : []) = tok 6 (CTokGnuC GnuCComplexImag)-idkwtok ('_' : '_' : 'i' : 'm' : 'a' : 'g' : '_' : '_' : []) = tok 8 (CTokGnuC GnuCComplexImag)-idkwtok ('_' : '_' : 'i' : 'n' : 'l' : 'i' : 'n' : 'e' : []) = tok 8 CTokInline-idkwtok ('i' : 'n' : 'l' : 'i' : 'n' : 'e' : []) = tok 6 CTokInline-idkwtok ('_' : '_' : 'i' : 'n' : 'l' : 'i' : 'n' : 'e' : '_' : '_' : []) = tok 10 CTokInline-idkwtok ('i' : 'n' : 't' : []) = tok 3 CTokInt-idkwtok ('_' : '_' : 'i' : 'n' : 't' : '1' : '2' : '8' : []) = tok 8 CTokInt128-idkwtok ('_' : '_' : 'l' : 'a' : 'b' : 'e' : 'l' : '_' : '_' : []) = tok 9 CTokLabel-idkwtok ('l' : 'o' : 'n' : 'g' : []) = tok 4 CTokLong-idkwtok ('_' : '_' : 'n' : 'o' : 'n' : 'n' : 'u' : 'l' : 'l' : []) = tok 9 CTokNonnull-idkwtok ('_' : '_' : 'n' : 'u' : 'l' : 'l' : 'a' : 'b' : 'l' : 'e' : []) = tok 10 CTokNullable-idkwtok ('_' : '_' : 'r' : 'e' : 'a' : 'l' : []) = tok 6 (CTokGnuC GnuCComplexReal)-idkwtok ('_' : '_' : 'r' : 'e' : 'a' : 'l' : '_' : '_' : []) = tok 8 (CTokGnuC GnuCComplexReal)-idkwtok ('r' : 'e' : 'g' : 'i' : 's' : 't' : 'e' : 'r' : []) = tok 8 CTokRegister-idkwtok ('_' : '_' : 'r' : 'e' : 's' : 't' : 'r' : 'i' : 'c' : 't' : []) = tok 10 CTokRestrict-idkwtok ('r' : 'e' : 's' : 't' : 'r' : 'i' : 'c' : 't' : []) = tok 8 CTokRestrict-idkwtok ('_' : '_' : 'r' : 'e' : 's' : 't' : 'r' : 'i' : 'c' : 't' : '_' : '_' : []) = tok 12 CTokRestrict-idkwtok ('r' : 'e' : 't' : 'u' : 'r' : 'n' : []) = tok 6 CTokReturn-idkwtok ('s' : 'h' : 'o' : 'r' : 't' : []) = tok 5 CTokShort-idkwtok ('_' : '_' : 's' : 'i' : 'g' : 'n' : 'e' : 'd' : []) = tok 8 CTokSigned-idkwtok ('s' : 'i' : 'g' : 'n' : 'e' : 'd' : []) = tok 6 CTokSigned-idkwtok ('_' : '_' : 's' : 'i' : 'g' : 'n' : 'e' : 'd' : '_' : '_' : []) = tok 10 CTokSigned-idkwtok ('s' : 'i' : 'z' : 'e' : 'o' : 'f' : []) = tok 6 CTokSizeof-idkwtok ('s' : 't' : 'a' : 't' : 'i' : 'c' : []) = tok 6 CTokStatic-idkwtok ('s' : 't' : 'r' : 'u' : 'c' : 't' : []) = tok 6 CTokStruct-idkwtok ('s' : 'w' : 'i' : 't' : 'c' : 'h' : []) = tok 6 CTokSwitch-idkwtok ('_' : '_' : 't' : 'h' : 'r' : 'e' : 'a' : 'd' : []) = tok 8 CTokThread-idkwtok ('t' : 'y' : 'p' : 'e' : 'd' : 'e' : 'f' : []) = tok 7 CTokTypedef-idkwtok ('_' : '_' : 't' : 'y' : 'p' : 'e' : 'o' : 'f' : []) = tok 8 CTokTypeof-idkwtok ('t' : 'y' : 'p' : 'e' : 'o' : 'f' : []) = tok 6 CTokTypeof-idkwtok ('_' : '_' : 't' : 'y' : 'p' : 'e' : 'o' : 'f' : '_' : '_' : []) = tok 10 CTokTypeof-idkwtok ('u' : 'n' : 'i' : 'o' : 'n' : []) = tok 5 CTokUnion-idkwtok ('u' : 'n' : 's' : 'i' : 'g' : 'n' : 'e' : 'd' : []) = tok 8 CTokUnsigned-idkwtok ('v' : 'o' : 'i' : 'd' : []) = tok 4 CTokVoid-idkwtok ('_' : '_' : 'v' : 'o' : 'l' : 'a' : 't' : 'i' : 'l' : 'e' : []) = tok 10 CTokVolatile-idkwtok ('v' : 'o' : 'l' : 'a' : 't' : 'i' : 'l' : 'e' : []) = tok 8 CTokVolatile-idkwtok ('_' : '_' : 'v' : 'o' : 'l' : 'a' : 't' : 'i' : 'l' : 'e' : '_' : '_' : []) = tok 12 CTokVolatile-idkwtok ('w' : 'h' : 'i' : 'l' : 'e' : []) = tok 5 CTokWhile--idkwtok cs = \pos -> do-  name <- getNewName-  let len = case length cs of l -> l-  let ident = mkIdent pos cs name-  tyident <- isTypeIdent ident-  if tyident-    then return (CTokTyIdent (pos,len) ident)-    else return (CTokIdent   (pos,len) ident)--ignoreAttribute :: P ()-ignoreAttribute = skipTokens (0::Int)-  where skipTokens :: Int -> P ()-        skipTokens n = do-          ntok <- lexToken' False-          case ntok of-            CTokRParen _ | n == 1    -> return ()-                         | otherwise -> skipTokens (n-1)-            CTokLParen _             -> skipTokens (n+1)-            _                        -> skipTokens n--tok :: Int -> (PosLength -> CToken) -> Position -> P CToken-tok len tc pos = return (tc (pos,len))--adjustLineDirective :: Int -> String -> Position -> Position-adjustLineDirective pragmaLen str pos =-    offs' `seq` fname' `seq` row' `seq` parent' `seq` (position offs' fname' row' 1 parent')-    where-    -- offset changes by length of #line pragma-    offs'           = (posOffset pos) + pragmaLen-    str'            = dropWhite . drop 1 $ str-    (rowStr, str'') = span isDigit str'-    -- row changes to the first number in the line pragma-    row'      = read rowStr-    str'''      = dropWhite str''-    (fnameStr,str'''') = span (/= '"') . drop 1 $ str'''-    fname = posFile pos-    no_fn = null str''' || (head str''' /= '"') || (head str'''' /= '"')-    -- filename changes to new filename, if specified-    fname' | no_fn = fname-           -- try and get more sharing of file name strings-           | fnameStr == fname     = fname-           | otherwise             = fnameStr-    -- analye flags-    min_flag = find_min_flag (5 :: Int) (drop 1 str'''')-    find_min_flag cur_min = select_min . span isDigit . dropWhile (not . isDigit)-      where-        select_min (numStr, fstr') | null numStr = cur_min-                                   | otherwise = find_min_flag (read numStr `min` cur_min) fstr'-    parent = posParent pos-    parent' = case min_flag of-                1 -> Just pos -- push-                2 -> case parent >>= posParent of-                         Nothing -> Nothing          -- pop/underflow-                         Just gp -> gp `seq` Just gp -- pop-                3 -> parent   -- unchanged stack, system header info-                4 -> parent   -- unchanged stack, extern C info-                _ -> Nothing-    ---    dropWhite = dropWhile (\c -> c == ' ' || c == '\t')---- special utility for the lexer-unescapeMultiChars :: String -> [Char]-unescapeMultiChars cs@(_ : _ : _) = case unescapeChar cs of (c,cs') -> c : unescapeMultiChars cs'-unescapeMultiChars ('\'' : []) = []-unescapeMultiChars _ = error "Unexpected end of multi-char constant"--{-# INLINE token_ #-}--- token that ignores the string-token_ :: Int -> (PosLength -> CToken) -> Position -> Int -> InputStream -> P CToken-token_ len mkTok pos _ _ = return (mkTok (pos,len))--{-# INLINE token_fail #-}--- error token-token_fail :: String -> Position ->-              Int -> InputStream -> P CToken-token_fail errmsg pos _ _ =   failP pos [ "Lexical Error !", errmsg ]---{-# INLINE token #-}--- token that uses the string-token :: (PosLength -> a -> CToken) -> (String -> a)-      -> Position -> Int -> InputStream -> P CToken-token mkTok fromStr pos len str = return (mkTok (pos,len) (fromStr $ takeChars len str))--{-# INLINE token_plus #-}--- token that may fail-token_plus :: (PosLength -> a -> CToken) -> (String -> Either String a)-      -> Position -> Int -> InputStream -> P CToken-token_plus mkTok fromStr pos len str =-  case fromStr (takeChars len str) of Left err -> failP pos [ "Lexical error ! ", err ]-                                      Right ok -> return $! mkTok (pos,len) ok---- -------------------------------------------------------------------------------- The input type--type AlexInput = (Position,   -- current position,-                  InputStream)     -- current input string--alexInputPrevChar :: AlexInput -> Char-alexInputPrevChar _ = error "alexInputPrevChar not used"---- for alex-3.0-alexGetByte :: AlexInput -> Maybe (Word8, AlexInput)-alexGetByte (p,is) | inputStreamEmpty is = Nothing-                   | otherwise  = let (b,s) = takeByte is in-                                  -- this is safe for latin-1, but ugly-                                  let p' = alexMove p (chr (fromIntegral b)) in p' `seq`-                                  Just (b, (p', s))--alexGetChar :: AlexInput -> Maybe (Char,AlexInput)-alexGetChar (p,is) | inputStreamEmpty is = Nothing-                   | otherwise  = let (c,s) = takeChar is in-                                  let p' = alexMove p c in p' `seq`-                                  Just (c, (p', s))--alexMove :: Position -> Char -> Position-alexMove pos ' '  = incPos pos 1-alexMove pos '\n' = retPos pos-alexMove pos '\r' = incOffset pos 1-alexMove pos _    = incPos pos 1--lexicalError :: P a-lexicalError = do-  pos <- getPos-  (c,_) <- liftM takeChar getInput-  failP pos-        ["Lexical error !",-         "The character " ++ show c ++ " does not fit here."]--parseError :: P a-parseError = do-  lastTok <- getLastToken-  failP (posOf lastTok)-        ["Syntax error !",-         "The symbol `" ++ show lastTok ++ "' does not fit here."]---- there is a problem with ignored tokens here (that aren't skipped)--- consider--- 1 > int x;--- 2 > LINE "ex.c" 4--- 4 > int y;--- when we get to LINE, we have [int (1,1),x (1,4)] in the token cache.--- Now we run--- > action  (pos 2,0) 14 "LINE \"ex.c\" 3\n"--- which in turn adjusts the position and then calls lexToken again--- we get `int (pos 4,0)', and have [x (1,4), int (4,1) ] in the token cache (fine)--- but then, we again call setLastToken when returning and get [int (4,1),int (4,1)] in the token cache (bad)--- to resolve this, recursive calls invoke lexToken' False.-lexToken :: P CToken-lexToken = lexToken' True--lexToken' :: Bool -> P CToken-lexToken' modifyCache = do-  pos <- getPos-  inp <- getInput-  case alexScan (pos, inp) 0 of-    AlexEOF -> do-        handleEofToken-        return CTokEof-    AlexError _inp -> lexicalError-    AlexSkip  (pos', inp') _len -> do-        setPos pos'-        setInput inp'-        lexToken' modifyCache-    AlexToken (pos', inp') len action -> do-        setPos pos'-        setInput inp'-        nextTok <- action pos len inp-        when modifyCache $ setLastToken nextTok-        return nextTok--lexC :: (CToken -> P a) -> P a-lexC cont = do-  nextTok <- lexToken-  cont nextTok--alex_action_1 =  \pos len str -> setPos (adjustLineDirective len (takeChars len str) pos) >> lexToken' False -alex_action_4 =  \pos len str -> idkwtok (takeChars len str) pos -alex_action_5 =  token_plus CTokILit readCOctal -alex_action_6 =  token_plus CTokILit (readCInteger DecRepr) -alex_action_7 =  token_plus CTokILit (readCInteger HexRepr . drop 2) -alex_action_8 =  token_fail "Invalid integer constant suffix" -alex_action_9 =  token CTokCLit (cChar . fst . unescapeChar . tail) -alex_action_10 =  token CTokCLit (cChar_w . fst . unescapeChar . tail . tail) -alex_action_11 =  token CTokCLit (flip cChars False . unescapeMultiChars .tail) -alex_action_12 =  token CTokCLit (flip cChars True . unescapeMultiChars . tail . tail) -alex_action_13 =  token (\pos -> CTokClangC pos . ClangCVersionTok) readClangCVersion -alex_action_14 =  token CTokFLit readCFloat -alex_action_15 =  token CTokFLit readCFloat -alex_action_16 =  token_fail "Hexadecimal floating constant requires an exponent" -alex_action_17 =  token CTokSLit (cString . unescapeString . init . tail) -alex_action_18 =  token CTokSLit (cString_w . unescapeString . init . tail . tail) -alex_action_19 =  token_fail "Universal character names are unsupported" -alex_action_20 =  token_fail "Invalid escape sequence" -alex_action_21 =  token_fail "Universal character names in string literals are unsupported"-alex_action_22 =  token_ 1 CTokLParen -alex_action_23 =  token_ 1 CTokRParen  -alex_action_24 =  token_ 1 CTokLBracket -alex_action_25 =  token_ 1 CTokRBracket -alex_action_26 =  token_ 2 CTokArrow -alex_action_27 =  token_ 1 CTokDot -alex_action_28 =  token_ 1 CTokExclam -alex_action_29 =  token_ 1 CTokTilde -alex_action_30 =  token_ 2 CTokInc -alex_action_31 =  token_ 2 CTokDec -alex_action_32 =  token_ 1 CTokPlus -alex_action_33 =  token_ 1 CTokMinus -alex_action_34 =  token_ 1 CTokStar -alex_action_35 =  token_ 1 CTokSlash -alex_action_36 =  token_ 1 CTokPercent -alex_action_37 =  token_ 1 CTokAmper -alex_action_38 =  token_ 2 CTokShiftL -alex_action_39 =  token_ 2 CTokShiftR -alex_action_40 =  token_ 1 CTokLess -alex_action_41 =  token_ 2 CTokLessEq -alex_action_42 =  token_ 1 CTokHigh -alex_action_43 =  token_ 2 CTokHighEq -alex_action_44 =  token_ 2 CTokEqual -alex_action_45 =  token_ 2 CTokUnequal -alex_action_46 =  token_ 1 CTokHat -alex_action_47 =  token_ 1 CTokBar -alex_action_48 =  token_ 2 CTokAnd -alex_action_49 =  token_ 2 CTokOr -alex_action_50 =  token_ 1 CTokQuest -alex_action_51 =  token_ 1 CTokColon -alex_action_52 =  token_ 1 CTokAssign -alex_action_53 =  token_ 2 CTokPlusAss -alex_action_54 =  token_ 2 CTokMinusAss -alex_action_55 =  token_ 2 CTokStarAss -alex_action_56 =  token_ 2 CTokSlashAss -alex_action_57 =  token_ 2 CTokPercAss -alex_action_58 =  token_ 2 CTokAmpAss -alex_action_59 =  token_ 2 CTokHatAss -alex_action_60 =  token_ 2 CTokBarAss -alex_action_61 =  token_ 3 CTokSLAss -alex_action_62 =  token_ 3 CTokSRAss -alex_action_63 =  token_ 1 CTokComma -alex_action_64 =  token_ 1 CTokSemic -alex_action_65 =  token_ 1 CTokLBrace -alex_action_66 =  token_ 1 CTokRBrace -alex_action_67 =  token_ 3 CTokEllipsis -{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "<built-in>" #-}-{-# LINE 1 "<command-line>" #-}-{-# LINE 8 "<command-line>" #-}-# 1 "/usr/include/stdc-predef.h" 1 3 4--# 17 "/usr/include/stdc-predef.h" 3 4--------------------------------------------{-# LINE 8 "<command-line>" #-}-{-# LINE 1 "/usr/lib/ghc-7.10.3/include/ghcversion.h" #-}------------------{-# LINE 8 "<command-line>" #-}-{-# LINE 1 "templates/GenericTemplate.hs" #-}--- -------------------------------------------------------------------------------- ALEX TEMPLATE------ This code is in the PUBLIC DOMAIN; you may copy it freely and use--- it for any purpose whatsoever.---- -------------------------------------------------------------------------------- INTERNALS and main scanner engine--{-# LINE 21 "templates/GenericTemplate.hs" #-}-------- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.-#if __GLASGOW_HASKELL__ > 706-#define GTE(n,m) (tagToEnum# (n >=# m))-#define EQ(n,m) (tagToEnum# (n ==# m))-#else-#define GTE(n,m) (n >=# m)-#define EQ(n,m) (n ==# m)-#endif-{-# LINE 51 "templates/GenericTemplate.hs" #-}---data AlexAddr = AlexA# Addr#--- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.-#if __GLASGOW_HASKELL__ < 503-uncheckedShiftL# = shiftL#-#endif--{-# INLINE alexIndexInt16OffAddr #-}-alexIndexInt16OffAddr (AlexA# arr) off =-#ifdef WORDS_BIGENDIAN-  narrow16Int# i-  where-        i    = word2Int# ((high `uncheckedShiftL#` 8#) `or#` low)-        high = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))-        low  = int2Word# (ord# (indexCharOffAddr# arr off'))-        off' = off *# 2#-#else-  indexInt16OffAddr# arr off-#endif------{-# INLINE alexIndexInt32OffAddr #-}-alexIndexInt32OffAddr (AlexA# arr) off = -#ifdef WORDS_BIGENDIAN-  narrow32Int# i-  where-   i    = word2Int# ((b3 `uncheckedShiftL#` 24#) `or#`-                     (b2 `uncheckedShiftL#` 16#) `or#`-                     (b1 `uncheckedShiftL#` 8#) `or#` b0)-   b3   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 3#)))-   b2   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 2#)))-   b1   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))-   b0   = int2Word# (ord# (indexCharOffAddr# arr off'))-   off' = off *# 4#-#else-  indexInt32OffAddr# arr off-#endif-------#if __GLASGOW_HASKELL__ < 503-quickIndex arr i = arr ! i-#else--- GHC >= 503, unsafeAt is available from Data.Array.Base.-quickIndex = unsafeAt-#endif------- -------------------------------------------------------------------------------- Main lexing routines--data AlexReturn a-  = AlexEOF-  | AlexError  !AlexInput-  | AlexSkip   !AlexInput !Int-  | AlexToken  !AlexInput !Int a---- alexScan :: AlexInput -> StartCode -> AlexReturn a-alexScan input (I# (sc))-  = alexScanUser undefined input (I# (sc))--alexScanUser user input (I# (sc))-  = case alex_scan_tkn user input 0# input sc AlexNone of-        (AlexNone, input') ->-                case alexGetByte input of-                        Nothing -> ----                                   AlexEOF-                        Just _ ->----                                   AlexError input'--        (AlexLastSkip input'' len, _) ->----                AlexSkip input'' len--        (AlexLastAcc k input''' len, _) ->----                AlexToken input''' len k----- Push the input through the DFA, remembering the most recent accepting--- state it encountered.--alex_scan_tkn user orig_input len input s last_acc =-  input `seq` -- strict in the input-  let -        new_acc = (check_accs (alex_accept `quickIndex` (I# (s))))-  in-  new_acc `seq`-  case alexGetByte input of-     Nothing -> (new_acc, input)-     Just (c, new_input) -> ----      case fromIntegral c of { (I# (ord_c)) ->-        let-                base   = alexIndexInt32OffAddr alex_base s-                offset = (base +# ord_c)-                check  = alexIndexInt16OffAddr alex_check offset-                -                new_s = if GTE(offset,0#) && EQ(check,ord_c)-                          then alexIndexInt16OffAddr alex_table offset-                          else alexIndexInt16OffAddr alex_deflt s-        in-        case new_s of-            -1# -> (new_acc, input)-                -- on an error, we want to keep the input *before* the-                -- character that failed, not after.-            _ -> alex_scan_tkn user orig_input (if c < 0x80 || c >= 0xC0 then (len +# 1#) else len)-                                                -- note that the length is increased ONLY if this is the 1st byte in a char encoding)-                        new_input new_s new_acc-      }-  where-        check_accs (AlexAccNone) = last_acc-        check_accs (AlexAcc a  ) = AlexLastAcc a input (I# (len))-        check_accs (AlexAccSkip) = AlexLastSkip  input (I# (len))-{-# LINE 198 "templates/GenericTemplate.hs" #-}--data AlexLastAcc a-  = AlexNone-  | AlexLastAcc a !AlexInput !Int-  | AlexLastSkip  !AlexInput !Int--instance Functor AlexLastAcc where-    fmap _ AlexNone = AlexNone-    fmap f (AlexLastAcc x y z) = AlexLastAcc (f x) y z-    fmap _ (AlexLastSkip x y) = AlexLastSkip x y--data AlexAcc a user-  = AlexAccNone-  | AlexAcc a-  | AlexAccSkip
− dist/build/Language/C/Parser/Parser.hs
@@ -1,6710 +0,0 @@-{-# OPTIONS_GHC -w #-}-{-# OPTIONS -fglasgow-exts -cpp #-}-module Language.C.Parser.Parser (-  -- * Parse a C translation unit-  parseC,-  -- * Exposed Parsers-  translUnitP, extDeclP, statementP, expressionP-) where---- Relevant C99 sections:------ 6.5 Expressions .1 - .17 and 6.6 (almost literally)---  Supported GNU extensions:---     - Allow a compound statement as an expression---     - Various __builtin_* forms that take type parameters---     - `alignof' expression or type---     - `__extension__' to suppress warnings about extensions---     - Allow taking address of a label with: && label---     - Omitting the `then' part of conditional expressions---     - complex numbers------ 6.7 C Declarations .1 -.8---  Supported GNU extensions:---     - '__thread' thread local storage (6.7.1)------ 6.8 Statements .1 - .8---  Supported GNU extensions:---    - case ranges (C99 6.8.1)---    - '__label__ ident;' declarations (C99 6.8.2)---    - computed gotos (C99 6.8.6)------ 6.9 Translation unit---  Supported GNU extensions:---     - allow empty translation_unit---     - allow redundant ';'---     - allow extension keyword before external declaration---     - asm definitions------  Since some of the grammar productions are quite difficult to read,---  (especially those involved with the decleration syntax) we document them---  with an extended syntax that allows a more consise representation:------  Ordinary rules------   foo      named terminal or non-terminal------   'c'      terminal, literal character token------   A B      concatenation------   A | B    alternation------   (A)      grouping------  Extended rules------   A?       optional, short hand for (A|) or [A]{ 0==A || 1==A }------   ...      stands for some part of the grammar omitted for clarity------   {A}      represents sequences, 0 or more.------   <permute> modifier which states that any permutation of the immediate subterms is valid---------- TODO ----------------------------------------------------------------------------  !* We ignore C11 _Atomic type annotations---  !* We ignore the C99 static keyword (see C99 6.7.5.3)---  !* We do not distinguish in the AST between incomplete array types and---      complete variable length arrays ([ '*' ] means the latter). (see C99 6.7.5.2)---  !* The AST doesn't allow recording __attribute__ of unnamed struct field---     (see , struct_default_declaring_list, struct_identifier_declarator)---  !* see `We're being far to liberal here' (... struct definition within structs)---  * Documentation isn't complete and consistent yet.--import Prelude    hiding (reverse)-import qualified Data.List as List-import Control.Monad (mplus)-import Language.C.Parser.Builtin   (builtinTypeNames)-import Language.C.Parser.Lexer     (lexC, parseError)-import Language.C.Parser.Tokens    (CToken(..), GnuCTok(..), ClangCTok (..), posLenOfTok)-import Language.C.Parser.ParserMonad (P, failP, execParser, getNewName, addTypedef, shadowTypedef, getCurrentPosition,-                                      enterScope, leaveScope, getLastToken, getSavedToken, ParseError(..))--import Language.C.Data.RList-import Language.C.Data.InputStream-import Language.C.Data.Ident-import Language.C.Data.Name-import Language.C.Data.Node-import Language.C.Data.Position-import Language.C.Syntax-import qualified Data.Array as Happy_Data_Array-import qualified GHC.Exts as Happy_GHC_Exts-import Control.Applicative(Applicative(..))---- parser produced by Happy Version 1.19.4--newtype HappyAbsSyn  = HappyAbsSyn HappyAny-#if __GLASGOW_HASKELL__ >= 607-type HappyAny = Happy_GHC_Exts.Any-#else-type HappyAny = forall a . a-#endif-happyIn7 :: (CTranslUnit) -> (HappyAbsSyn )-happyIn7 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn7 #-}-happyOut7 :: (HappyAbsSyn ) -> (CTranslUnit)-happyOut7 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut7 #-}-happyIn8 :: (Reversed [CExtDecl]) -> (HappyAbsSyn )-happyIn8 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn8 #-}-happyOut8 :: (HappyAbsSyn ) -> (Reversed [CExtDecl])-happyOut8 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut8 #-}-happyIn9 :: (CExtDecl) -> (HappyAbsSyn )-happyIn9 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn9 #-}-happyOut9 :: (HappyAbsSyn ) -> (CExtDecl)-happyOut9 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut9 #-}-happyIn10 :: (CFunDef) -> (HappyAbsSyn )-happyIn10 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn10 #-}-happyOut10 :: (HappyAbsSyn ) -> (CFunDef)-happyOut10 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut10 #-}-happyIn11 :: (CDeclr) -> (HappyAbsSyn )-happyIn11 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn11 #-}-happyOut11 :: (HappyAbsSyn ) -> (CDeclr)-happyOut11 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut11 #-}-happyIn12 :: (CStat) -> (HappyAbsSyn )-happyIn12 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn12 #-}-happyOut12 :: (HappyAbsSyn ) -> (CStat)-happyOut12 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut12 #-}-happyIn13 :: (CStat) -> (HappyAbsSyn )-happyIn13 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn13 #-}-happyOut13 :: (HappyAbsSyn ) -> (CStat)-happyOut13 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut13 #-}-happyIn14 :: (CStat) -> (HappyAbsSyn )-happyIn14 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn14 #-}-happyOut14 :: (HappyAbsSyn ) -> (CStat)-happyOut14 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut14 #-}-happyIn15 :: (()) -> (HappyAbsSyn )-happyIn15 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn15 #-}-happyOut15 :: (HappyAbsSyn ) -> (())-happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut15 #-}-happyIn16 :: (()) -> (HappyAbsSyn )-happyIn16 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn16 #-}-happyOut16 :: (HappyAbsSyn ) -> (())-happyOut16 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut16 #-}-happyIn17 :: (Reversed [CBlockItem]) -> (HappyAbsSyn )-happyIn17 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn17 #-}-happyOut17 :: (HappyAbsSyn ) -> (Reversed [CBlockItem])-happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut17 #-}-happyIn18 :: (CBlockItem) -> (HappyAbsSyn )-happyIn18 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn18 #-}-happyOut18 :: (HappyAbsSyn ) -> (CBlockItem)-happyOut18 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut18 #-}-happyIn19 :: (CBlockItem) -> (HappyAbsSyn )-happyIn19 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn19 #-}-happyOut19 :: (HappyAbsSyn ) -> (CBlockItem)-happyOut19 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut19 #-}-happyIn20 :: (CFunDef) -> (HappyAbsSyn )-happyIn20 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn20 #-}-happyOut20 :: (HappyAbsSyn ) -> (CFunDef)-happyOut20 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut20 #-}-happyIn21 :: (Reversed [Ident]) -> (HappyAbsSyn )-happyIn21 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn21 #-}-happyOut21 :: (HappyAbsSyn ) -> (Reversed [Ident])-happyOut21 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut21 #-}-happyIn22 :: (CStat) -> (HappyAbsSyn )-happyIn22 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn22 #-}-happyOut22 :: (HappyAbsSyn ) -> (CStat)-happyOut22 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut22 #-}-happyIn23 :: (CStat) -> (HappyAbsSyn )-happyIn23 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn23 #-}-happyOut23 :: (HappyAbsSyn ) -> (CStat)-happyOut23 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut23 #-}-happyIn24 :: (CStat) -> (HappyAbsSyn )-happyIn24 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn24 #-}-happyOut24 :: (HappyAbsSyn ) -> (CStat)-happyOut24 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut24 #-}-happyIn25 :: (CStat) -> (HappyAbsSyn )-happyIn25 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn25 #-}-happyOut25 :: (HappyAbsSyn ) -> (CStat)-happyOut25 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut25 #-}-happyIn26 :: (CAsmStmt) -> (HappyAbsSyn )-happyIn26 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn26 #-}-happyOut26 :: (HappyAbsSyn ) -> (CAsmStmt)-happyOut26 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut26 #-}-happyIn27 :: (Maybe CTypeQual) -> (HappyAbsSyn )-happyIn27 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn27 #-}-happyOut27 :: (HappyAbsSyn ) -> (Maybe CTypeQual)-happyOut27 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut27 #-}-happyIn28 :: ([CAsmOperand]) -> (HappyAbsSyn )-happyIn28 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn28 #-}-happyOut28 :: (HappyAbsSyn ) -> ([CAsmOperand])-happyOut28 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut28 #-}-happyIn29 :: (Reversed [CAsmOperand]) -> (HappyAbsSyn )-happyIn29 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn29 #-}-happyOut29 :: (HappyAbsSyn ) -> (Reversed [CAsmOperand])-happyOut29 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut29 #-}-happyIn30 :: (CAsmOperand) -> (HappyAbsSyn )-happyIn30 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn30 #-}-happyOut30 :: (HappyAbsSyn ) -> (CAsmOperand)-happyOut30 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut30 #-}-happyIn31 :: (Reversed [CStrLit]) -> (HappyAbsSyn )-happyIn31 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn31 #-}-happyOut31 :: (HappyAbsSyn ) -> (Reversed [CStrLit])-happyOut31 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut31 #-}-happyIn32 :: (CDecl) -> (HappyAbsSyn )-happyIn32 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn32 #-}-happyOut32 :: (HappyAbsSyn ) -> (CDecl)-happyOut32 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut32 #-}-happyIn33 :: (Reversed [CDecl]) -> (HappyAbsSyn )-happyIn33 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn33 #-}-happyOut33 :: (HappyAbsSyn ) -> (Reversed [CDecl])-happyOut33 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut33 #-}-happyIn34 :: (CDecl) -> (HappyAbsSyn )-happyIn34 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn34 #-}-happyOut34 :: (HappyAbsSyn ) -> (CDecl)-happyOut34 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut34 #-}-happyIn35 :: ((Maybe CStrLit, [CAttr])) -> (HappyAbsSyn )-happyIn35 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn35 #-}-happyOut35 :: (HappyAbsSyn ) -> ((Maybe CStrLit, [CAttr]))-happyOut35 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut35 #-}-happyIn36 :: (CDecl) -> (HappyAbsSyn )-happyIn36 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn36 #-}-happyOut36 :: (HappyAbsSyn ) -> (CDecl)-happyOut36 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut36 #-}-happyIn37 :: ([CDeclSpec]) -> (HappyAbsSyn )-happyIn37 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn37 #-}-happyOut37 :: (HappyAbsSyn ) -> ([CDeclSpec])-happyOut37 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut37 #-}-happyIn38 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )-happyIn38 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn38 #-}-happyOut38 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])-happyOut38 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut38 #-}-happyIn39 :: (CDeclSpec) -> (HappyAbsSyn )-happyIn39 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn39 #-}-happyOut39 :: (HappyAbsSyn ) -> (CDeclSpec)-happyOut39 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut39 #-}-happyIn40 :: (CDeclSpec) -> (HappyAbsSyn )-happyIn40 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn40 #-}-happyOut40 :: (HappyAbsSyn ) -> (CDeclSpec)-happyOut40 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut40 #-}-happyIn41 :: (CStorageSpec) -> (HappyAbsSyn )-happyIn41 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn41 #-}-happyOut41 :: (HappyAbsSyn ) -> (CStorageSpec)-happyOut41 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut41 #-}-happyIn42 :: (CFunSpec) -> (HappyAbsSyn )-happyIn42 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn42 #-}-happyOut42 :: (HappyAbsSyn ) -> (CFunSpec)-happyOut42 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut42 #-}-happyIn43 :: (CAlignSpec) -> (HappyAbsSyn )-happyIn43 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn43 #-}-happyOut43 :: (HappyAbsSyn ) -> (CAlignSpec)-happyOut43 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut43 #-}-happyIn44 :: ([CDeclSpec]) -> (HappyAbsSyn )-happyIn44 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn44 #-}-happyOut44 :: (HappyAbsSyn ) -> ([CDeclSpec])-happyOut44 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut44 #-}-happyIn45 :: (CTypeSpec) -> (HappyAbsSyn )-happyIn45 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn45 #-}-happyOut45 :: (HappyAbsSyn ) -> (CTypeSpec)-happyOut45 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut45 #-}-happyIn46 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )-happyIn46 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn46 #-}-happyOut46 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])-happyOut46 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut46 #-}-happyIn47 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )-happyIn47 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn47 #-}-happyOut47 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])-happyOut47 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut47 #-}-happyIn48 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )-happyIn48 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn48 #-}-happyOut48 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])-happyOut48 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut48 #-}-happyIn49 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )-happyIn49 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn49 #-}-happyOut49 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])-happyOut49 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut49 #-}-happyIn50 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )-happyIn50 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn50 #-}-happyOut50 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])-happyOut50 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut50 #-}-happyIn51 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )-happyIn51 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn51 #-}-happyOut51 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])-happyOut51 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut51 #-}-happyIn52 :: (CTypeSpec) -> (HappyAbsSyn )-happyIn52 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn52 #-}-happyOut52 :: (HappyAbsSyn ) -> (CTypeSpec)-happyOut52 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut52 #-}-happyIn53 :: (CStructUnion) -> (HappyAbsSyn )-happyIn53 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn53 #-}-happyOut53 :: (HappyAbsSyn ) -> (CStructUnion)-happyOut53 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut53 #-}-happyIn54 :: (Located CStructTag) -> (HappyAbsSyn )-happyIn54 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn54 #-}-happyOut54 :: (HappyAbsSyn ) -> (Located CStructTag)-happyOut54 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut54 #-}-happyIn55 :: (Reversed [CDecl]) -> (HappyAbsSyn )-happyIn55 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn55 #-}-happyOut55 :: (HappyAbsSyn ) -> (Reversed [CDecl])-happyOut55 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut55 #-}-happyIn56 :: (CDecl) -> (HappyAbsSyn )-happyIn56 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn56 #-}-happyOut56 :: (HappyAbsSyn ) -> (CDecl)-happyOut56 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut56 #-}-happyIn57 :: (CDecl) -> (HappyAbsSyn )-happyIn57 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn57 #-}-happyOut57 :: (HappyAbsSyn ) -> (CDecl)-happyOut57 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut57 #-}-happyIn58 :: (CDecl) -> (HappyAbsSyn )-happyIn58 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn58 #-}-happyOut58 :: (HappyAbsSyn ) -> (CDecl)-happyOut58 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut58 #-}-happyIn59 :: ((Maybe CDeclr, Maybe CExpr)) -> (HappyAbsSyn )-happyIn59 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn59 #-}-happyOut59 :: (HappyAbsSyn ) -> ((Maybe CDeclr, Maybe CExpr))-happyOut59 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut59 #-}-happyIn60 :: ((Maybe CDeclr, Maybe CExpr)) -> (HappyAbsSyn )-happyIn60 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn60 #-}-happyOut60 :: (HappyAbsSyn ) -> ((Maybe CDeclr, Maybe CExpr))-happyOut60 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut60 #-}-happyIn61 :: (CEnum) -> (HappyAbsSyn )-happyIn61 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn61 #-}-happyOut61 :: (HappyAbsSyn ) -> (CEnum)-happyOut61 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut61 #-}-happyIn62 :: (Reversed [(Ident, Maybe CExpr)]) -> (HappyAbsSyn )-happyIn62 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn62 #-}-happyOut62 :: (HappyAbsSyn ) -> (Reversed [(Ident, Maybe CExpr)])-happyOut62 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut62 #-}-happyIn63 :: ((Ident, Maybe CExpr)) -> (HappyAbsSyn )-happyIn63 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn63 #-}-happyOut63 :: (HappyAbsSyn ) -> ((Ident, Maybe CExpr))-happyOut63 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut63 #-}-happyIn64 :: (CTypeQual) -> (HappyAbsSyn )-happyIn64 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn64 #-}-happyOut64 :: (HappyAbsSyn ) -> (CTypeQual)-happyOut64 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut64 #-}-happyIn65 :: (Reversed [CTypeQual]) -> (HappyAbsSyn )-happyIn65 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn65 #-}-happyOut65 :: (HappyAbsSyn ) -> (Reversed [CTypeQual])-happyOut65 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut65 #-}-happyIn66 :: (CDeclrR) -> (HappyAbsSyn )-happyIn66 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn66 #-}-happyOut66 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut66 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut66 #-}-happyIn67 :: (Maybe CStrLit) -> (HappyAbsSyn )-happyIn67 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn67 #-}-happyOut67 :: (HappyAbsSyn ) -> (Maybe CStrLit)-happyOut67 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut67 #-}-happyIn68 :: (CDeclrR) -> (HappyAbsSyn )-happyIn68 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn68 #-}-happyOut68 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut68 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut68 #-}-happyIn69 :: (CDeclrR) -> (HappyAbsSyn )-happyIn69 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn69 #-}-happyOut69 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut69 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut69 #-}-happyIn70 :: (CDeclrR) -> (HappyAbsSyn )-happyIn70 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn70 #-}-happyOut70 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut70 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut70 #-}-happyIn71 :: (CDeclrR) -> (HappyAbsSyn )-happyIn71 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn71 #-}-happyOut71 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut71 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut71 #-}-happyIn72 :: (CDeclrR) -> (HappyAbsSyn )-happyIn72 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn72 #-}-happyOut72 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut72 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut72 #-}-happyIn73 :: (CDeclrR) -> (HappyAbsSyn )-happyIn73 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn73 #-}-happyOut73 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut73 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut73 #-}-happyIn74 :: (CDeclrR) -> (HappyAbsSyn )-happyIn74 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn74 #-}-happyOut74 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut74 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut74 #-}-happyIn75 :: (CDeclrR) -> (HappyAbsSyn )-happyIn75 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn75 #-}-happyOut75 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut75 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut75 #-}-happyIn76 :: (CDeclrR) -> (HappyAbsSyn )-happyIn76 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn76 #-}-happyOut76 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut76 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut76 #-}-happyIn77 :: (CDeclrR) -> (HappyAbsSyn )-happyIn77 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn77 #-}-happyOut77 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut77 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut77 #-}-happyIn78 :: (CDeclrR) -> (HappyAbsSyn )-happyIn78 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn78 #-}-happyOut78 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut78 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut78 #-}-happyIn79 :: (CDeclr) -> (HappyAbsSyn )-happyIn79 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn79 #-}-happyOut79 :: (HappyAbsSyn ) -> (CDeclr)-happyOut79 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut79 #-}-happyIn80 :: (CDeclrR) -> (HappyAbsSyn )-happyIn80 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn80 #-}-happyOut80 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut80 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut80 #-}-happyIn81 :: (CDeclrR) -> (HappyAbsSyn )-happyIn81 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn81 #-}-happyOut81 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut81 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut81 #-}-happyIn82 :: (([CDecl], Bool)) -> (HappyAbsSyn )-happyIn82 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn82 #-}-happyOut82 :: (HappyAbsSyn ) -> (([CDecl], Bool))-happyOut82 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut82 #-}-happyIn83 :: (Reversed [CDecl]) -> (HappyAbsSyn )-happyIn83 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn83 #-}-happyOut83 :: (HappyAbsSyn ) -> (Reversed [CDecl])-happyOut83 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut83 #-}-happyIn84 :: (CDecl) -> (HappyAbsSyn )-happyIn84 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn84 #-}-happyOut84 :: (HappyAbsSyn ) -> (CDecl)-happyOut84 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut84 #-}-happyIn85 :: (Reversed [Ident]) -> (HappyAbsSyn )-happyIn85 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn85 #-}-happyOut85 :: (HappyAbsSyn ) -> (Reversed [Ident])-happyOut85 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut85 #-}-happyIn86 :: (CDecl) -> (HappyAbsSyn )-happyIn86 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn86 #-}-happyOut86 :: (HappyAbsSyn ) -> (CDecl)-happyOut86 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut86 #-}-happyIn87 :: (CDeclrR) -> (HappyAbsSyn )-happyIn87 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn87 #-}-happyOut87 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut87 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut87 #-}-happyIn88 :: (CDeclrR -> CDeclrR) -> (HappyAbsSyn )-happyIn88 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn88 #-}-happyOut88 :: (HappyAbsSyn ) -> (CDeclrR -> CDeclrR)-happyOut88 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut88 #-}-happyIn89 :: (CDeclrR -> CDeclrR) -> (HappyAbsSyn )-happyIn89 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn89 #-}-happyOut89 :: (HappyAbsSyn ) -> (CDeclrR -> CDeclrR)-happyOut89 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut89 #-}-happyIn90 :: (CDeclrR -> CDeclrR) -> (HappyAbsSyn )-happyIn90 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn90 #-}-happyOut90 :: (HappyAbsSyn ) -> (CDeclrR -> CDeclrR)-happyOut90 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut90 #-}-happyIn91 :: (CDeclrR) -> (HappyAbsSyn )-happyIn91 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn91 #-}-happyOut91 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut91 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut91 #-}-happyIn92 :: (CDeclrR) -> (HappyAbsSyn )-happyIn92 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn92 #-}-happyOut92 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut92 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut92 #-}-happyIn93 :: (CInit) -> (HappyAbsSyn )-happyIn93 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn93 #-}-happyOut93 :: (HappyAbsSyn ) -> (CInit)-happyOut93 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut93 #-}-happyIn94 :: (Maybe CInit) -> (HappyAbsSyn )-happyIn94 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn94 #-}-happyOut94 :: (HappyAbsSyn ) -> (Maybe CInit)-happyOut94 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut94 #-}-happyIn95 :: (Reversed CInitList) -> (HappyAbsSyn )-happyIn95 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn95 #-}-happyOut95 :: (HappyAbsSyn ) -> (Reversed CInitList)-happyOut95 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut95 #-}-happyIn96 :: ([CDesignator]) -> (HappyAbsSyn )-happyIn96 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn96 #-}-happyOut96 :: (HappyAbsSyn ) -> ([CDesignator])-happyOut96 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut96 #-}-happyIn97 :: (Reversed [CDesignator]) -> (HappyAbsSyn )-happyIn97 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn97 #-}-happyOut97 :: (HappyAbsSyn ) -> (Reversed [CDesignator])-happyOut97 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut97 #-}-happyIn98 :: (CDesignator) -> (HappyAbsSyn )-happyIn98 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn98 #-}-happyOut98 :: (HappyAbsSyn ) -> (CDesignator)-happyOut98 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut98 #-}-happyIn99 :: (CDesignator) -> (HappyAbsSyn )-happyIn99 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn99 #-}-happyOut99 :: (HappyAbsSyn ) -> (CDesignator)-happyOut99 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut99 #-}-happyIn100 :: (CExpr) -> (HappyAbsSyn )-happyIn100 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn100 #-}-happyOut100 :: (HappyAbsSyn ) -> (CExpr)-happyOut100 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut100 #-}-happyIn101 :: (Reversed [(Maybe CDecl, CExpr)]) -> (HappyAbsSyn )-happyIn101 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn101 #-}-happyOut101 :: (HappyAbsSyn ) -> (Reversed [(Maybe CDecl, CExpr)])-happyOut101 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut101 #-}-happyIn102 :: ((Maybe CDecl, CExpr)) -> (HappyAbsSyn )-happyIn102 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn102 #-}-happyOut102 :: (HappyAbsSyn ) -> ((Maybe CDecl, CExpr))-happyOut102 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut102 #-}-happyIn103 :: (Reversed [CDesignator]) -> (HappyAbsSyn )-happyIn103 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn103 #-}-happyOut103 :: (HappyAbsSyn ) -> (Reversed [CDesignator])-happyOut103 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut103 #-}-happyIn104 :: (CExpr) -> (HappyAbsSyn )-happyIn104 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn104 #-}-happyOut104 :: (HappyAbsSyn ) -> (CExpr)-happyOut104 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut104 #-}-happyIn105 :: (Reversed [CExpr]) -> (HappyAbsSyn )-happyIn105 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn105 #-}-happyOut105 :: (HappyAbsSyn ) -> (Reversed [CExpr])-happyOut105 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut105 #-}-happyIn106 :: (CExpr) -> (HappyAbsSyn )-happyIn106 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn106 #-}-happyOut106 :: (HappyAbsSyn ) -> (CExpr)-happyOut106 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut106 #-}-happyIn107 :: (Located CUnaryOp) -> (HappyAbsSyn )-happyIn107 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn107 #-}-happyOut107 :: (HappyAbsSyn ) -> (Located CUnaryOp)-happyOut107 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut107 #-}-happyIn108 :: (CExpr) -> (HappyAbsSyn )-happyIn108 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn108 #-}-happyOut108 :: (HappyAbsSyn ) -> (CExpr)-happyOut108 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut108 #-}-happyIn109 :: (CExpr) -> (HappyAbsSyn )-happyIn109 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn109 #-}-happyOut109 :: (HappyAbsSyn ) -> (CExpr)-happyOut109 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut109 #-}-happyIn110 :: (CExpr) -> (HappyAbsSyn )-happyIn110 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn110 #-}-happyOut110 :: (HappyAbsSyn ) -> (CExpr)-happyOut110 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut110 #-}-happyIn111 :: (CExpr) -> (HappyAbsSyn )-happyIn111 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn111 #-}-happyOut111 :: (HappyAbsSyn ) -> (CExpr)-happyOut111 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut111 #-}-happyIn112 :: (CExpr) -> (HappyAbsSyn )-happyIn112 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn112 #-}-happyOut112 :: (HappyAbsSyn ) -> (CExpr)-happyOut112 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut112 #-}-happyIn113 :: (CExpr) -> (HappyAbsSyn )-happyIn113 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn113 #-}-happyOut113 :: (HappyAbsSyn ) -> (CExpr)-happyOut113 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut113 #-}-happyIn114 :: (CExpr) -> (HappyAbsSyn )-happyIn114 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn114 #-}-happyOut114 :: (HappyAbsSyn ) -> (CExpr)-happyOut114 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut114 #-}-happyIn115 :: (CExpr) -> (HappyAbsSyn )-happyIn115 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn115 #-}-happyOut115 :: (HappyAbsSyn ) -> (CExpr)-happyOut115 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut115 #-}-happyIn116 :: (CExpr) -> (HappyAbsSyn )-happyIn116 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn116 #-}-happyOut116 :: (HappyAbsSyn ) -> (CExpr)-happyOut116 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut116 #-}-happyIn117 :: (CExpr) -> (HappyAbsSyn )-happyIn117 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn117 #-}-happyOut117 :: (HappyAbsSyn ) -> (CExpr)-happyOut117 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut117 #-}-happyIn118 :: (CExpr) -> (HappyAbsSyn )-happyIn118 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn118 #-}-happyOut118 :: (HappyAbsSyn ) -> (CExpr)-happyOut118 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut118 #-}-happyIn119 :: (CExpr) -> (HappyAbsSyn )-happyIn119 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn119 #-}-happyOut119 :: (HappyAbsSyn ) -> (CExpr)-happyOut119 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut119 #-}-happyIn120 :: (CExpr) -> (HappyAbsSyn )-happyIn120 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn120 #-}-happyOut120 :: (HappyAbsSyn ) -> (CExpr)-happyOut120 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut120 #-}-happyIn121 :: (Located CAssignOp) -> (HappyAbsSyn )-happyIn121 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn121 #-}-happyOut121 :: (HappyAbsSyn ) -> (Located CAssignOp)-happyOut121 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut121 #-}-happyIn122 :: (CExpr) -> (HappyAbsSyn )-happyIn122 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn122 #-}-happyOut122 :: (HappyAbsSyn ) -> (CExpr)-happyOut122 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut122 #-}-happyIn123 :: (Reversed [CExpr]) -> (HappyAbsSyn )-happyIn123 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn123 #-}-happyOut123 :: (HappyAbsSyn ) -> (Reversed [CExpr])-happyOut123 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut123 #-}-happyIn124 :: (Maybe CExpr) -> (HappyAbsSyn )-happyIn124 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn124 #-}-happyOut124 :: (HappyAbsSyn ) -> (Maybe CExpr)-happyOut124 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut124 #-}-happyIn125 :: (Maybe CExpr) -> (HappyAbsSyn )-happyIn125 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn125 #-}-happyOut125 :: (HappyAbsSyn ) -> (Maybe CExpr)-happyOut125 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut125 #-}-happyIn126 :: (CExpr) -> (HappyAbsSyn )-happyIn126 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn126 #-}-happyOut126 :: (HappyAbsSyn ) -> (CExpr)-happyOut126 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut126 #-}-happyIn127 :: (CConst) -> (HappyAbsSyn )-happyIn127 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn127 #-}-happyOut127 :: (HappyAbsSyn ) -> (CConst)-happyOut127 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut127 #-}-happyIn128 :: (CStrLit) -> (HappyAbsSyn )-happyIn128 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn128 #-}-happyOut128 :: (HappyAbsSyn ) -> (CStrLit)-happyOut128 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut128 #-}-happyIn129 :: (Reversed [CString]) -> (HappyAbsSyn )-happyIn129 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn129 #-}-happyOut129 :: (HappyAbsSyn ) -> (Reversed [CString])-happyOut129 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut129 #-}-happyIn130 :: (ClangCVersion) -> (HappyAbsSyn )-happyIn130 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn130 #-}-happyOut130 :: (HappyAbsSyn ) -> (ClangCVersion)-happyOut130 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut130 #-}-happyIn131 :: (Ident) -> (HappyAbsSyn )-happyIn131 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn131 #-}-happyOut131 :: (HappyAbsSyn ) -> (Ident)-happyOut131 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut131 #-}-happyIn132 :: ([CAttr]) -> (HappyAbsSyn )-happyIn132 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn132 #-}-happyOut132 :: (HappyAbsSyn ) -> ([CAttr])-happyOut132 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut132 #-}-happyIn133 :: ([CAttr]) -> (HappyAbsSyn )-happyIn133 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn133 #-}-happyOut133 :: (HappyAbsSyn ) -> ([CAttr])-happyOut133 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut133 #-}-happyIn134 :: ([CAttr]) -> (HappyAbsSyn )-happyIn134 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn134 #-}-happyOut134 :: (HappyAbsSyn ) -> ([CAttr])-happyOut134 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut134 #-}-happyIn135 :: (Reversed [CAttr]) -> (HappyAbsSyn )-happyIn135 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn135 #-}-happyOut135 :: (HappyAbsSyn ) -> (Reversed [CAttr])-happyOut135 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut135 #-}-happyIn136 :: (Maybe CAttr) -> (HappyAbsSyn )-happyIn136 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn136 #-}-happyOut136 :: (HappyAbsSyn ) -> (Maybe CAttr)-happyOut136 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut136 #-}-happyIn137 :: (Reversed [CExpr]) -> (HappyAbsSyn )-happyIn137 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn137 #-}-happyOut137 :: (HappyAbsSyn ) -> (Reversed [CExpr])-happyOut137 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut137 #-}-happyInTok :: (CToken) -> (HappyAbsSyn )-happyInTok x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyInTok #-}-happyOutTok :: (HappyAbsSyn ) -> (CToken)-happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOutTok #-}---happyActOffsets :: HappyAddr-happyActOffsets = HappyA# "\x00\x00\xa9\x0a\x16\x0a\x9c\x0f\x00\x00\x42\x07\x00\x00\x76\x04\xe0\x25\x9c\x0f\x00\x00\xe0\x09\xdd\x05\xad\x05\xa9\x03\x5f\x05\xc8\x08\xbe\x08\xb5\x08\xb3\x08\xf4\x04\x00\x00\x91\x08\x42\x08\x00\x00\x00\x00\x38\x09\x00\x00\x00\x00\x70\x0f\x70\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x9e\x04\x2d\x0f\xab\x08\x01\x0f\x00\x00\x00\x00\x00\x00\x41\x08\x00\x00\xbe\x0e\x92\x0e\x92\x0e\xa0\x08\x9f\x08\x9d\x08\x97\x08\x25\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x08\x75\x08\x00\x00\x00\x00\xa8\x09\x65\x08\x4f\x0e\x63\x08\x6e\x08\x16\x0a\x84\x08\x26\x00\x82\x08\x4f\x0e\x81\x08\x78\x08\x60\x08\x00\x00\x06\x08\x00\x00\x44\x08\x00\x00\xae\x04\x7d\x04\xad\x01\x39\x13\x00\x00\x00\x00\x00\x00\x00\x00\xad\x01\x00\x00\xd6\x1c\x63\x1d\x0b\x1b\x1e\x1b\x39\x1d\x74\x1e\x00\x00\x00\x00\x01\x08\x00\x00\xff\x12\x00\x00\x00\x00\x00\x00\x49\x02\x00\x00\x00\x00\x00\x00\xa8\x09\x87\x0b\x00\x00\x4f\x01\x4f\x01\x67\x08\x5f\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf7\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x08\x00\x00\x00\x00\x28\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x08\xa9\x0a\x9c\x07\x00\x00\xfb\x07\xa7\x09\x4f\x0e\x61\x01\x9a\x07\x94\x07\xa7\x09\x10\x15\x00\x00\x00\x00\x07\x01\xef\x07\xd0\x09\xee\x07\x07\x01\xbf\x07\x00\x00\x00\x00\x00\x00\xe2\xff\x00\x00\x00\x00\xe2\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x1b\x00\x00\xde\x07\x00\x00\xbc\x1b\x35\x0b\xb4\x07\x00\x00\x00\x00\x00\x00\x00\x00\xe2\xff\x00\x00\xc5\x12\xd8\x07\x00\x00\x39\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\xac\x07\xa1\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x07\x00\x00\xfc\x00\xd7\x00\x37\x02\x9b\x07\x00\x00\x00\x00\x00\x00\xe2\xff\x00\x00\x00\x00\xc4\x07\x00\x00\x96\x07\x91\x07\x00\x00\x57\x07\x00\x00\x57\x07\x00\x00\x00\x00\x4f\x0e\x4f\x0e\x00\x00\x90\x07\x4f\x0e\x8f\x07\x4f\x0e\x00\x00\x5a\x08\x53\x07\x16\x0a\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\x92\x07\x00\x00\x4b\x07\x29\x07\x00\x00\x4f\x0e\x51\x1f\x51\x1f\x4f\x0e\x00\x00\x38\x09\x00\x00\x00\x00\x24\x07\x00\x00\x00\x00\x38\x09\x4f\x0e\x00\x00\x38\x09\x00\x00\x00\x00\x00\x00\x8e\x07\xfd\x02\x5f\x1e\x7a\x0a\x7a\x0a\x4d\x14\x8c\x07\x85\x07\x25\x1f\x4f\x0e\x4f\x0e\x23\x0e\x4f\x0e\x4f\x0e\x4f\x0e\x4f\x0e\x4f\x0e\x4f\x0e\x4f\x0e\x4f\x0e\x4f\x0e\x4f\x0e\x4f\x0e\x4f\x0e\x4f\x0e\x4f\x0e\x4f\x0e\x4f\x0e\x4f\x0e\x00\x00\x4f\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x0d\x4f\x0e\x0e\x04\x0e\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x07\x41\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x09\xb1\x09\x96\x04\x96\x04\x34\x04\x34\x04\x34\x04\x34\x04\xa9\x03\xa9\x03\x28\x04\x70\x07\x65\x07\x63\x07\x5d\x07\x4f\x0e\x5f\x07\x00\x00\x4e\x07\x00\x00\xb4\x0d\x00\x00\x00\x00\x00\x00\x0e\x07\x2b\x1e\xf7\x1d\x8b\x12\x05\x15\x00\x00\x00\x00\x71\x07\x47\x07\x6c\x07\x00\x00\x69\x07\x3f\x07\x2f\x07\x2d\x07\x2c\x07\x16\x0a\xeb\x07\xf5\x06\xd4\x06\xcc\x06\x16\x0a\x4f\x0e\x00\x00\x27\x07\x9d\x1c\xfb\x06\xfa\x06\x00\x00\x20\x07\x00\x00\x1b\x07\x0b\x07\x17\x01\xa4\x01\x4d\x1b\xeb\x06\xa3\x06\x06\x07\x00\x00\xa7\x09\x4d\x1b\xe7\x06\x00\x00\x00\x00\x67\x1c\x9c\x14\x00\x00\x00\x00\xc7\x00\xaa\x00\x02\x07\x01\x07\x37\x02\xd2\x00\xaa\x00\x00\x00\x4d\x1b\xd0\x06\x00\x00\xbf\x06\x00\x00\xa7\x09\xbd\x06\x00\x00\x00\x00\x00\x00\x00\x00\xe2\xff\x00\x00\xe3\x06\x00\x00\x4d\x1b\xc3\x06\x00\x00\xc6\x0a\x00\x00\xdd\x06\xa4\x0b\x2b\x00\x76\x06\x34\x01\xdb\x10\x34\x01\x39\x1d\x74\x1e\x87\x10\xd7\x06\xb3\x06\x00\x00\xe4\x00\x08\x1d\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x01\x37\x12\xa4\x01\xfd\x11\x18\x0b\xa7\x09\x4d\x1b\xaa\x06\x00\x00\xc1\x06\xba\x09\xc2\x00\xc2\x00\x37\x02\x00\x00\x37\x02\x00\x00\x37\x02\x00\x00\x00\x00\xe4\x14\xc0\x06\xb7\x06\xb5\x06\x8a\x06\xcf\x03\x84\x06\xb1\x06\x9a\x06\xd0\xff\xdc\x00\x00\x00\x00\x00\x93\x06\x00\x00\x00\x00\x19\x06\x53\x03\x00\x00\xe8\xff\xcf\x03\x59\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe4\x14\x7d\x09\x00\x00\x37\x02\x00\x00\x6e\x0d\x00\x00\x73\x06\x71\x06\x40\x06\x40\x06\xc3\x11\x00\x00\x8a\x00\x4e\x00\x40\x06\x00\x00\x09\x06\x83\x1b\x00\x00\x02\x06\x00\x00\x2e\x1c\xf5\x1b\x33\x10\x92\x14\x02\x06\x02\x06\x00\x00\xdf\x0f\x0f\x0e\x02\x06\x00\x00\x02\x06\x02\x06\x00\x00\x7a\x0a\x13\x0c\x56\x06\x54\x06\x2b\x00\x00\x00\x53\x06\xea\x05\x57\x0a\x2b\x00\x00\x00\x00\x00\xa7\x09\x4d\x1b\x18\x06\x00\x00\x34\x06\x2e\x06\xd1\x1a\x00\x00\x00\x00\x00\x00\xda\x08\x2c\x06\x4a\x00\x0c\x00\x2b\x06\x37\x02\x37\x02\x6b\x08\x00\x00\x00\x00\x00\x00\x76\x14\x08\x00\x00\x00\x00\x00\x28\x06\x13\x06\xaa\x05\x00\x00\x00\x00\x00\x00\xf3\x05\xf3\x05\x16\x0a\x16\x0a\x16\x0a\x00\x00\x4f\x0e\x4f\x0e\x4f\x0e\xe6\x05\x00\x00\xea\x01\x81\x03\xeb\x07\xa0\x05\x00\x00\xd6\x05\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x01\x89\x11\xa4\x01\x4f\x11\xe2\x05\xc9\x08\x00\x00\xf9\x1e\xf9\x1e\x36\x03\xf9\x1e\xcf\x05\xcf\x05\xcd\x1e\xcf\x05\xc8\x14\x00\x00\xbf\x14\xe9\x05\xe3\x05\x0f\x00\x15\x14\x00\x00\x00\x00\xb9\x0c\x4f\x0e\x00\x00\x4f\x0e\x00\x00\x4f\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x03\x6e\x0d\x37\x03\x00\x00\x06\x03\x00\x00\xbf\x05\x4f\x0e\x36\x03\xb9\x0c\xe0\x05\xcb\x05\x0e\x00\x00\x00\x37\x02\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x0a\xa9\x05\xd5\x00\x00\x00\x9d\x05\xb4\x05\x01\x03\x00\x00\xa4\x05\x9e\x05\x00\x00\x65\x05\x15\x11\x65\x05\x65\x05\x65\x05\x00\x00\x34\x03\x5d\x05\x00\x00\x4e\x05\x49\x00\x16\x0a\x71\x05\x43\x05\x21\x05\x20\x05\x00\x00\x00\x00\x1f\x05\x1f\x05\x2c\x05\x00\x00\x00\x00\x5b\x08\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\x10\x37\x02\x00\x00\x9c\x1a\x8a\x03\x00\x00\xfe\x02\xb7\x02\xc3\x1d\x87\x07\x00\x00\x00\x00\x98\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x28\x05\xfe\x04\x24\x05\x12\x05\x2b\x00\xb4\x04\x00\x00\xec\x04\x00\x00\x00\x00\xe8\x04\x4f\x0e\x00\x00\x00\x00\x00\x00\x4d\x04\x0a\x01\xd1\x13\x00\x00\x00\x00\x47\x10\x5c\x0f\x8d\x13\x00\x00\x00\x00\x00\x00\x00\x00\xed\x0e\x05\x00\x05\x00\xb0\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9d\x02\xe5\xff\x4f\x0e\xa6\x01\x00\x00\xde\x04\x43\x0d\xc5\x04\xd0\xff\x00\x00\x00\x00\xe0\x25\x00\x00\xd4\x00\x00\x00\x98\x04\x00\x00\x00\x00\x00\x00\x4f\x0e\x6a\x01\x00\x00\x05\x00\xbb\x14\x7e\x0e\xbd\x04\x00\x00\x00\x00\x4f\x0e\xb8\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x04\x7f\x04\x4f\x0e\x12\x00\x8f\x1d\x31\x04\x00\x00\x31\x04\x00\x00\x31\x04\x65\x04\x4f\x0e\x00\x00\x00\x00\x7e\x0e\xfd\x07\x00\x00\x00\x00\x00\x00\x00\x00\x16\x0a\x4f\x0e\x4f\x0e\x5e\x04\x00\x00\xc2\x01\x57\x04\x00\x00\x7c\x04\x2b\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x04\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x0e\x25\x02\x00\x00\x4f\x0e\x00\x00\xcd\x1e\x4f\x0e\x00\x00\x00\x00\x37\x02\x00\x00\x3e\x02\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9e\x0c\x00\x00\x00\x00\x28\x0d\x00\x00\x00\x00\x4f\x0e\x2f\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x04\x00\x00\x5c\x04\x58\x04\x4f\x0e\x49\x00\x2a\x04\x49\x00\x00\x00\x2f\x04\x1f\x04\x00\x00\x00\x00\x00\x00\x4f\x0e\x00\x00\x12\x00\x8a\x03\xa4\x03\x00\x00\x4f\x0e\x00\x00\x00\x00\x06\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x0e\xa5\x07\x00\x00\x00\x00\x00\x00\xe0\x25\x00\x00\x00\x00\x00\x00\x8b\x03\x8b\x03\x00\x00\x16\x0a\x16\x0a\x7a\x01\x00\x00\x00\x00\xed\x03\x85\x03\x85\x03\x00\x00\x00\x00\xe4\x03\x00\x00\x00\x00\xe5\x03\xda\x03\x00\x00\xab\x03\x5e\x03\x00\x00\x00\x00\x00\x00\xa5\x07\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\x00\x00\x4f\x0e\x4f\x0e\xbe\x03\xb6\x03\x86\x03\x3a\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#--happyGotoOffsets :: HappyAddr-happyGotoOffsets = HappyA# "\x10\x02\x77\x00\xab\x06\x19\x22\x97\x03\x3b\x00\x00\x00\x00\x00\x1d\x03\xb0\x0d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x03\x00\x00\x00\x00\xe6\x0a\xc0\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x27\x03\x2a\x0a\x00\x00\xc7\x09\x00\x00\x00\x00\x00\x00\x13\x03\x00\x00\x92\x0d\x7d\x08\x0e\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x03\x02\x00\x00\x00\x3f\x24\x00\x00\x00\x00\x67\x06\x00\x00\xe8\x02\x00\x00\xbb\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x03\x00\x00\x00\x00\x00\x00\x86\x09\x03\x01\x00\x00\x00\x00\x00\x00\x00\x00\x63\x02\x00\x00\x64\x02\x96\x01\x45\x03\x1e\x01\x00\x03\xac\x00\x00\x00\x00\x00\x6a\x07\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x8b\x07\x21\x03\x00\x00\x00\x00\xcf\x02\x30\x01\x00\x00\x95\x04\xc0\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\xa7\x18\x26\x24\xb8\x02\xb3\x02\x94\x02\x02\x19\x60\x03\x00\x00\x00\x00\xeb\x01\x00\x00\x51\x07\x00\x00\xd4\x01\xff\x02\x00\x00\x00\x00\x00\x00\xad\x02\xe5\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x05\x00\x00\xa8\x02\x00\x00\x30\x16\xfa\x19\xe4\x02\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x02\xbf\x02\xd6\x00\x00\x00\x00\x00\x59\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x02\x57\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8c\x02\x7d\x18\xbe\x0d\xf3\x06\x98\x02\x00\x00\x00\x00\x00\x00\x33\x02\x7d\x02\x00\x00\x00\x00\x00\x00\x7e\x02\x11\x02\x69\x02\xb9\x06\x00\x00\xb0\x06\x00\x00\x00\x00\x00\x22\xe7\x21\x00\x00\x00\x00\xce\x21\x00\x00\xb5\x21\x00\x00\xf7\x06\x00\x00\x3c\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x00\xac\x06\x00\x00\x0d\x24\x99\x19\x86\x19\xf4\x23\x00\x00\x64\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x03\xdb\x23\x00\x00\xae\x02\x00\x00\x00\x00\x00\x00\x00\x00\x34\x09\x3a\x01\xd6\xff\xd3\xff\xa3\x19\x00\x00\x00\x00\xb1\x02\x9c\x21\x8a\x24\x83\x21\xa3\x24\xbc\x24\xd5\x24\xee\x24\x15\x25\xfc\x24\x3b\x25\x2e\x25\x22\x25\xea\x14\x88\x19\x8c\x17\x77\x0e\x3e\x0d\xdd\x0c\x02\x0c\xc5\x0b\x00\x00\xc2\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x21\x51\x21\xf1\x01\xe5\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\x71\x24\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x07\x00\x00\x00\x00\x00\x00\xde\x01\x1b\x04\x00\x00\xf8\x15\x66\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x06\x53\x02\x5f\x02\x0d\x02\xd5\x01\xf8\x05\xa9\x23\x00\x00\x00\x00\x5c\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x03\xb7\x25\xd0\x04\xc6\x01\xa2\x06\x00\x00\x00\x00\x81\x18\xa7\x04\xc0\x01\x00\x00\x00\x00\x65\x16\xee\x09\x00\x00\x00\x00\x6b\x04\xfc\x17\x00\x00\x00\x00\xaf\x06\x00\x05\xea\x15\x00\x00\x69\x04\xb2\x01\x00\x00\x00\x00\xbd\x01\x26\x18\xbe\x01\x00\x00\x00\x00\x00\x00\x00\x00\xfa\x01\x8c\x01\x00\x00\x00\x00\x40\x04\x9d\x01\x00\x00\xc2\x19\x00\x00\x00\x00\x3a\x20\x68\x06\x2e\x01\x82\x25\xb1\x16\x6a\x25\x8f\x02\x6f\x00\x0b\x17\x00\x00\x00\x00\x00\x00\x00\x00\x8c\x03\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x25\xda\x16\x9d\x25\x05\x17\x82\x17\x00\x18\xd9\x03\x8f\x01\x00\x00\x00\x00\x74\x06\x4f\x02\x03\x06\x6e\x06\x00\x00\x45\x06\x00\x00\x2a\x06\x00\x00\x00\x00\xd0\x03\x00\x00\x00\x00\x00\x00\x00\x00\xde\x00\x00\x00\x00\x00\x00\x00\x59\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x01\x00\x00\x00\x00\x10\x00\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd4\x03\x2a\x06\x00\x00\x78\x05\x00\x00\x21\x20\x00\x00\x00\x00\x00\x00\xbc\x01\xb6\x01\x7c\x17\x00\x00\x90\x15\x97\x0c\x32\x01\x00\x00\x00\x00\x98\x16\x00\x00\xd3\x05\x00\x00\x1c\x07\x00\x00\xc0\x15\x47\x1a\xc7\x05\xbc\x05\x00\x00\x76\x15\x40\x1a\x94\x05\x00\x00\x8f\x05\x62\x05\x00\x00\x09\x00\x49\x1a\x00\x00\x00\x00\x25\x05\x00\x00\x00\x00\x00\x00\x46\x13\xa4\x04\x00\x00\x00\x00\xa5\x17\x23\x03\x64\x01\x00\x00\x00\x00\x00\x00\x2c\x09\x6e\x01\x00\x00\x00\x00\x4c\x05\x00\x00\xf4\x03\x2d\x0e\x00\x00\x32\x05\x09\x05\xff\x04\x00\x00\x00\x00\x00\x00\xd9\x04\x6e\x12\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x01\x00\x00\x00\x00\x00\x00\xf7\x00\x6e\x00\xb3\x05\x89\x05\x6b\x05\x00\x00\xa2\x20\x89\x20\x38\x21\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x01\x2d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x10\x90\x01\xb5\x0f\x5d\x01\x00\x00\xcf\x06\x00\x00\x73\x19\x60\x19\x0c\x01\xb4\x17\x00\x00\x00\x00\x15\x19\x00\x00\xae\x0b\x00\x00\xf9\x08\x00\x00\x00\x00\xea\x00\xbe\x0c\x00\x00\x00\x00\x89\x1f\x90\x23\x00\x00\x58\x24\x00\x00\x77\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x20\x33\x01\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x23\xd3\x00\x64\x1f\x00\x00\x00\x00\x8b\x00\x00\x00\xf0\x04\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x01\x63\x01\x2f\x01\x25\x01\x12\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\x01\x44\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x00\xa4\x00\x00\x00\x00\x00\x00\x00\xb6\x04\x00\x00\x00\x00\xfb\x13\x00\x00\x00\x00\x00\x00\x00\x00\x08\x0c\x53\x04\x00\x00\xbd\x08\x63\x16\x00\x00\x00\x00\x00\x00\x3b\x09\x3b\x0d\x00\x00\x00\x00\x4e\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x03\xc5\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x23\x00\x00\x00\x00\x00\x00\xc9\x19\x42\x05\x40\x17\x00\x00\x00\x00\xfe\x19\xe7\x14\x46\x17\x00\x00\x00\x00\x00\x00\x00\x00\x59\x0a\xb7\x13\x70\x0c\xfb\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x00\x2c\x23\x51\x00\x00\x00\x00\x00\xc7\x1f\x00\x00\x72\x00\x00\x00\x00\x00\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x23\x51\x00\x00\x00\x49\x0c\xd0\x03\x1c\x03\x00\x00\x00\x00\x00\x00\xfa\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x00\x00\x00\xe1\x22\x88\x07\x1b\x04\xa0\x03\x00\x00\x93\x03\x00\x00\x5b\x03\x00\x00\xc8\x22\x00\x00\x00\x00\x1c\x03\x43\x03\x00\x00\x00\x00\x00\x00\x00\x00\xfc\x04\x70\x20\x57\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x21\x46\x00\x00\x00\xaf\x22\x00\x00\x28\x19\x96\x22\x00\x00\x00\x00\x32\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xad\x1f\x00\x00\x00\x00\xe7\x1f\x00\x00\x00\x00\x7d\x22\xad\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x21\x33\x00\x00\x00\xcb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x22\x00\x00\x72\x07\x65\x12\x2a\x00\x00\x00\x4b\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x22\xd8\x06\x00\x00\x00\x00\x00\x00\xce\xff\x00\x00\x00\x00\x00\x00\x4d\x00\xd4\xff\x00\x00\x89\x02\xbb\x01\x00\x00\x00\x00\x00\x00\x00\x00\xc1\xff\xa2\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x00\x29\x00\x00\x00\x00\x00\xdb\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xed\x20\xd4\x20\x00\x00\x00\x00\x00\x00\x8c\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#--happyDefActions :: HappyAddr-happyDefActions = HappyA# "\xfa\xff\x25\xfe\x00\x00\x00\x00\x00\x00\x25\xfe\x84\xfe\x78\xfe\x66\xfe\x00\x00\x64\xfe\x60\xfe\x5d\xfe\x5a\xfe\x55\xfe\x52\xfe\x50\xfe\x4e\xfe\x4c\xfe\x4a\xfe\x48\xfe\x45\xfe\x38\xfe\x00\x00\x94\xfe\x93\xfe\x25\xfe\x67\xfe\x68\xfe\x00\x00\x00\x00\x6a\xfe\x69\xfe\x6b\xfe\x6c\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x2e\xfe\x2f\xfe\x2d\xfe\x2c\xfe\x95\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe4\xff\xe3\xff\xe2\xff\xe1\xff\xe0\xff\xdf\xff\xde\xff\x00\x00\x00\x00\xc7\xff\xd7\xff\xb5\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\xfe\x00\x00\x00\x00\x95\xfe\x26\xfe\x00\x00\xf7\xff\x00\x00\xf6\xff\x00\x00\x00\x00\x00\x00\x00\x00\x97\xff\x8d\xff\x8c\xff\x8b\xff\x00\x00\x6a\xff\x9a\xff\x80\xff\x99\xff\x7f\xff\x98\xff\x7e\xff\x5f\xff\x45\xff\x25\xfe\x44\xff\x00\x00\xe5\xff\xf9\xfe\xf7\xfe\xf8\xfe\xa5\xff\xea\xfe\xe9\xfe\x00\x00\x24\xfe\x23\xfe\x00\x00\x25\xfe\x00\x00\x00\x00\x87\xff\x74\xff\x7c\xff\x73\xff\x77\xff\x25\xfe\x89\xff\x78\xff\x71\xff\x70\xff\x84\xff\x7a\xff\x72\xff\x79\xff\x83\xff\x86\xff\x7b\xff\x76\xff\x88\xff\x00\x00\x40\xff\x8a\xff\x00\x00\x85\xff\x3f\xff\x75\xff\x7d\xff\xed\xfe\x53\xff\x00\x00\x25\xfe\x00\x00\xf5\xff\x00\x00\x25\xfe\x00\x00\x00\x00\x24\xfe\x00\x00\x25\xfe\x00\x00\xf6\xfe\xe8\xfe\x24\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96\xff\x69\xff\x5e\xff\x15\xff\xa5\xff\x22\xfe\x00\x00\x4d\xff\x1a\xff\x1b\xff\x20\xff\x1d\xff\x1c\xff\x1e\xff\x1f\xff\x25\xfe\xf2\xfe\xc6\xfe\xc4\xfe\xe3\xfe\x32\xfe\x00\x00\x95\xff\x68\xff\x5d\xff\x19\xff\x15\xff\xa5\xff\x00\x00\x00\x00\x50\xff\x00\x00\x59\xff\x47\xff\x46\xff\x55\xff\x91\xff\x8f\xff\x8e\xff\x90\xff\x54\xff\x62\xff\x5b\xff\x5a\xff\xa9\xff\x61\xff\x60\xff\xaa\xff\x6e\xff\x65\xff\x66\xff\x64\xff\x6d\xff\x6c\xff\x6b\xff\x00\x00\x15\xff\x16\xff\x12\xff\x0f\xff\x0e\xff\x13\xff\x05\xff\x17\xff\xa5\xff\x00\x00\x25\xfe\x11\xff\x00\x00\x93\xff\x6f\xff\x63\xff\x15\xff\xa5\xff\x92\xff\x00\x00\x58\xff\x00\x00\x15\xff\xa5\xff\x25\xfe\xa8\xff\x25\xfe\xa7\xff\xf3\xff\x00\x00\x00\x00\x33\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x27\xfe\x34\xfe\x00\x00\x00\x00\xbc\xff\x66\xfe\x30\xfe\x00\x00\xbb\xff\x00\x00\xb4\xff\xd5\xff\x25\xfe\xc6\xff\x00\x00\x25\xfe\x25\xfe\x00\x00\x6e\xfe\x25\xfe\x6f\xfe\x75\xfe\x2b\xfe\x2a\xfe\x73\xfe\x25\xfe\x00\x00\x71\xfe\x25\xfe\x6d\xfe\x76\xfe\x77\xfe\x00\x00\xcd\xfe\x80\xff\x7f\xff\x7e\xff\x00\x00\x00\x00\x00\x00\x24\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\xfe\x00\x00\x43\xfe\x3f\xfe\x3e\xfe\x42\xfe\x41\xfe\x40\xfe\x3b\xfe\x3a\xfe\x39\xfe\x3d\xfe\x3c\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x7e\xfe\x7d\xfe\xf8\xff\xf9\xff\x80\xfe\x7f\xfe\x00\x00\x00\x00\x7a\xfe\x82\xfe\x44\xfe\x61\xfe\x62\xfe\x63\xfe\x5e\xfe\x5f\xfe\x5b\xfe\x5c\xfe\x56\xfe\x58\xfe\x57\xfe\x59\xfe\x53\xfe\x54\xfe\x51\xfe\x4f\xfe\x4d\xfe\x4b\xfe\x00\x00\x00\x00\x49\xfe\x36\xfe\x37\xfe\x92\xfe\x00\x00\xca\xfe\xc7\xfe\xc9\xfe\xc8\xfe\x00\x00\xcb\xfe\xe3\xfe\xb7\xfe\xcc\xfe\x90\xfe\x00\x00\x00\x00\x00\x00\x29\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\xff\xd5\xff\x00\x00\x00\x00\x00\x00\x00\x00\xdb\xff\x00\x00\x25\xfe\x00\x00\x00\x00\xbe\xff\x00\x00\xba\xff\x00\x00\x00\x00\x00\x00\x00\x00\x25\xfe\xa5\xfe\x25\xfe\x00\x00\xf1\xff\x25\xfe\x25\xfe\xa5\xfe\xef\xff\x10\xff\xe3\xfe\x00\x00\x0d\xff\x01\xff\x24\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfb\xfe\x25\xfe\xa5\xfe\xf0\xff\x41\xff\x3e\xff\x25\xfe\x00\x00\x94\xff\x67\xff\x5c\xff\x18\xff\x15\xff\xa5\xff\x00\x00\x4a\xff\x25\xfe\xa5\xfe\xee\xff\x32\xfe\x31\xfe\x00\x00\x32\xfe\x6b\xfe\x25\xfe\xde\xfe\xda\xfe\xd7\xfe\x99\xff\x7f\xff\xd3\xfe\x00\x00\xe2\xfe\xe0\xfe\x00\x00\x24\xfe\xcf\xfe\xc3\xfe\xec\xff\xa4\xff\x00\x00\x00\x00\x00\x00\x00\x00\x24\xfe\x25\xfe\x25\xfe\xa5\xfe\xf2\xff\x00\x00\x00\x00\x00\x00\x25\xfe\xe5\xfe\xec\xfe\xf1\xfe\xf5\xfe\xf8\xfe\xf4\xfe\xe7\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x27\xff\x00\x00\x00\x00\x00\x00\x00\x00\x1e\xfe\x00\x00\x20\xfe\x1c\xfe\x1d\xfe\x52\xff\x51\xff\x00\x00\x00\x00\x26\xff\x24\xff\x00\x00\x00\x00\x81\xff\x82\xff\xf3\xfe\xf0\xfe\xe4\xfe\x00\x00\x00\x00\xeb\xfe\xef\xfe\xa0\xff\x00\x00\xeb\xff\x00\x00\x00\x00\x15\xff\x15\xff\x00\x00\x17\xff\x00\x00\x25\xfe\x15\xff\xe6\xfe\x00\x00\x25\xfe\xc5\xfe\x25\xfe\xd1\xfe\x00\x00\xd2\xfe\xe3\xfe\xb7\xfe\x25\xfe\x25\xfe\xd6\xfe\xe3\xfe\xb7\xfe\x25\xfe\xd9\xfe\x25\xfe\x25\xfe\xdd\xfe\x25\xfe\x00\x00\x00\x00\x00\x00\x6b\xfe\xc2\xfe\x00\x00\x00\x00\x32\xfe\x6b\xfe\xa2\xff\xe7\xff\x25\xfe\x25\xfe\xa5\xfe\xed\xff\x00\x00\x00\x00\x25\xfe\x3e\xff\x9c\xff\xe9\xff\x00\x00\x00\x00\x00\x00\x25\xfe\x00\x00\xfe\xfe\x09\xff\x00\x00\x0c\xff\x0b\xff\x00\xff\x00\x00\x00\x00\xa3\xff\xe8\xff\x00\x00\x00\x00\x00\x00\x9e\xff\x9d\xff\xea\xff\x15\xff\x15\xff\x00\x00\x00\x00\x00\x00\xbd\xff\x34\xfe\x34\xfe\x00\x00\x00\x00\xdc\xff\x00\x00\x00\x00\xd6\xff\x00\x00\xd3\xff\x00\x00\xd4\xff\xd2\xff\xd0\xff\xd1\xff\x00\x00\x00\x00\x00\x00\x00\x00\x53\xff\x25\xfe\xdd\xff\x25\xfe\x25\xfe\x00\x00\x25\xfe\x00\x00\x72\xfe\x25\xfe\x70\xfe\x25\xfe\xb5\xfe\xb3\xfe\x00\x00\x00\x00\x00\x00\x24\xfe\xa9\xfe\x65\xfe\xa3\xfe\x00\x00\x46\xfe\x00\x00\x81\xfe\x00\x00\x83\xfe\x79\xfe\x47\xfe\x35\xfe\xa2\xfe\x00\x00\x00\x00\x00\x00\x9b\xfe\x9c\xfe\xa8\xfe\x00\x00\x00\x00\x00\x00\xa3\xfe\x00\x00\x00\x00\x00\x00\xb0\xfe\xb1\xfe\xaf\xfe\xb2\xfe\xb4\xfe\xb6\xfe\x24\xfe\x00\x00\x00\x00\x8a\xfe\x00\x00\x00\x00\x00\x00\x87\xfe\x00\x00\x00\x00\xcf\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\xff\x00\x00\x00\x00\xc9\xff\x00\x00\xb3\xff\x00\x00\x00\x00\x00\x00\x00\x00\xc5\xff\xc3\xff\xc2\xff\xa5\xfe\xa5\xfe\x00\x00\x57\xff\x56\xff\x00\x00\x0a\xff\xff\xfe\x00\x00\x04\xff\x08\xff\xfc\xfe\xfd\xfe\x00\x00\x07\xff\xfa\xfe\x25\xfe\x33\xff\x3c\xff\x00\x00\x00\x00\x25\xfe\x24\xfe\x3d\xff\x42\xff\x25\xfe\x4f\xff\x4e\xff\xa1\xff\xe6\xff\x00\x00\x00\x00\x00\x00\x00\x00\x6b\xfe\x25\xfe\xc0\xfe\x00\x00\xc1\xfe\xbb\xfe\x00\x00\x00\x00\xdc\xfe\xdb\xfe\xd8\xfe\x25\xfe\xb3\xfe\x24\xfe\xd5\xfe\xd4\xfe\x25\xfe\xb3\xfe\x24\xfe\xd0\xfe\xdf\xfe\xe1\xfe\xce\xfe\x00\x00\x00\x00\x00\x00\x15\xff\x4c\xff\x4b\xff\xa4\xfe\xee\xfe\xf4\xff\x00\x00\x23\xff\x00\x00\x00\x00\x2b\xff\x00\x00\x00\x00\x00\x00\x1e\xfe\x1f\xfe\x21\xfe\x66\xfe\x19\xfe\x00\x00\x1a\xfe\x00\x00\x25\xff\x2a\xff\x21\xff\x00\x00\x00\x00\x29\xff\x00\x00\x24\xfe\x24\xfe\x00\x00\xbe\xfe\xba\xfe\x00\x00\x00\x00\xbf\xfe\xb9\xfe\x49\xff\x48\xff\x39\xff\x37\xff\x2f\xff\x00\x00\x00\x00\x24\xfe\x25\xfe\x3b\xff\x25\xfe\x3a\xff\x25\xfe\x32\xff\x00\x00\x43\xff\x06\xff\x00\x00\x00\x00\x03\xff\x14\xff\x9b\xff\x9f\xff\x00\x00\x34\xfe\x34\xfe\x00\x00\xda\xff\x00\x00\xb2\xff\xb1\xff\x00\x00\x00\x00\xb9\xff\xd8\xff\xc8\xff\xce\xff\xcc\xff\xcd\xff\x00\x00\xcb\xff\x8c\xfe\x8d\xfe\x8e\xfe\x00\x00\x00\x00\x8f\xfe\x00\x00\x91\xfe\x25\xfe\x00\x00\xae\xfe\xac\xfe\xad\xfe\xab\xfe\x00\x00\x98\xfe\x00\x00\x9d\xfe\x9a\xfe\x97\xfe\x9e\xfe\xa1\xfe\x00\x00\x7c\xfe\xa0\xfe\x00\x00\x7b\xfe\x99\xfe\x00\x00\x00\x00\xa7\xfe\xaa\xfe\x89\xfe\x8b\xfe\x88\xfe\x86\xfe\x00\x00\xca\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\xff\xc1\xff\x00\x00\x00\x00\xc4\xff\x02\xff\x31\xff\x00\x00\x35\xff\x00\x00\x00\x00\x38\xff\x2e\xff\x00\x00\x2c\xff\xb8\xfe\x00\x00\xbd\xfe\x28\xff\x22\xff\xa6\xff\x1b\xfe\x00\x00\x00\x00\x17\xfe\x18\xfe\x28\xfe\x66\xfe\x16\xfe\xbc\xfe\x2d\xff\x25\xfe\x36\xff\x30\xff\x00\x00\x00\x00\x00\x00\xb8\xff\xb0\xff\x00\x00\x00\x00\x00\x00\x85\xfe\xa6\xfe\x00\x00\x9f\xfe\x96\xfe\x00\x00\x00\x00\xaf\xff\x00\x00\x00\x00\xd6\xff\xc0\xff\x34\xff\x00\x00\x15\xfe\x14\xfe\xbf\xff\x00\x00\xac\xff\xb7\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\xff\xb6\xff\xad\xff\xae\xff"#--happyCheck :: HappyAddr-happyCheck = HappyA# "\xff\xff\x02\x00\x03\x00\x04\x00\x1f\x00\x79\x00\x01\x00\x1f\x00\x38\x00\x01\x00\x04\x00\x39\x00\x39\x00\x01\x00\x2c\x00\x39\x00\x02\x00\x02\x00\x0d\x00\x01\x00\x32\x00\x0d\x00\x14\x00\x1c\x00\x19\x00\x0d\x00\x1b\x00\x79\x00\x1d\x00\x1e\x00\x1f\x00\x0d\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x04\x00\x1e\x00\x1e\x00\x09\x00\x0d\x00\x2e\x00\x36\x00\x66\x00\x3c\x00\x0a\x00\x3a\x00\x79\x00\x39\x00\x0e\x00\x02\x00\x03\x00\x04\x00\x72\x00\x2e\x00\x39\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x17\x00\x01\x00\x03\x00\x68\x00\x18\x00\x01\x00\x68\x00\x7f\x00\x7f\x00\x7f\x00\x19\x00\x7f\x00\x1b\x00\x0d\x00\x1d\x00\x1e\x00\x1f\x00\x0d\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x66\x00\x67\x00\x68\x00\x66\x00\x67\x00\x68\x00\x36\x00\x66\x00\x67\x00\x68\x00\x3a\x00\x68\x00\x68\x00\x66\x00\x02\x00\x03\x00\x04\x00\x7d\x00\x7e\x00\x7f\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x7d\x00\x7e\x00\x7f\x00\x38\x00\x1c\x00\x01\x00\x66\x00\x67\x00\x7e\x00\x7f\x00\x19\x00\x22\x00\x1b\x00\x68\x00\x1d\x00\x1e\x00\x1f\x00\x0d\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x04\x00\x39\x00\x7f\x00\x3c\x00\x01\x00\x79\x00\x36\x00\x65\x00\x79\x00\x66\x00\x3a\x00\x68\x00\x02\x00\x66\x00\x67\x00\x68\x00\x0d\x00\x7d\x00\x7e\x00\x7f\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x7c\x00\x01\x00\x21\x00\x22\x00\x23\x00\x24\x00\x01\x00\x26\x00\x7d\x00\x7e\x00\x7f\x00\x7c\x00\x22\x00\x0d\x00\x2d\x00\x2e\x00\x2f\x00\x01\x00\x0d\x00\x07\x00\x02\x00\x02\x00\x01\x00\x36\x00\x04\x00\x2a\x00\x39\x00\x7f\x00\x02\x00\x0d\x00\x15\x00\x16\x00\x17\x00\x72\x00\x0d\x00\x39\x00\x02\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x7f\x00\x7f\x00\x66\x00\x67\x00\x68\x00\x81\x00\x7d\x00\x7e\x00\x7f\x00\x21\x00\x22\x00\x23\x00\x24\x00\x57\x00\x26\x00\x01\x00\x2a\x00\x2a\x00\x37\x00\x38\x00\x57\x00\x2d\x00\x2e\x00\x2f\x00\x2a\x00\x04\x00\x01\x00\x0d\x00\x7f\x00\x01\x00\x36\x00\x03\x00\x2a\x00\x39\x00\x66\x00\x67\x00\x68\x00\x1c\x00\x0d\x00\x37\x00\x38\x00\x0d\x00\x01\x00\x07\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x7e\x00\x7f\x00\x20\x00\x0d\x00\x22\x00\x23\x00\x24\x00\x66\x00\x26\x00\x68\x00\x7f\x00\x07\x00\x66\x00\x67\x00\x68\x00\x2d\x00\x2e\x00\x2f\x00\x3c\x00\x04\x00\x01\x00\x07\x00\x03\x00\x66\x00\x36\x00\x68\x00\x31\x00\x39\x00\x66\x00\x67\x00\x68\x00\x22\x00\x0d\x00\x38\x00\x02\x00\x79\x00\x7c\x00\x07\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x1c\x00\x7c\x00\x01\x00\x21\x00\x22\x00\x23\x00\x24\x00\x7f\x00\x26\x00\x39\x00\x4e\x00\x4f\x00\x7c\x00\x51\x00\x0d\x00\x2d\x00\x2e\x00\x2f\x00\x26\x00\x04\x00\x66\x00\x67\x00\x68\x00\x2c\x00\x36\x00\x04\x00\x3a\x00\x7f\x00\x60\x00\x2a\x00\x60\x00\x66\x00\x3c\x00\x68\x00\x66\x00\x67\x00\x68\x00\x39\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4e\x00\x02\x00\x66\x00\x21\x00\x22\x00\x23\x00\x24\x00\x7f\x00\x26\x00\x21\x00\x22\x00\x23\x00\x24\x00\x7c\x00\x26\x00\x2d\x00\x2e\x00\x2f\x00\x2c\x00\x5b\x00\x5c\x00\x2d\x00\x2e\x00\x2f\x00\x36\x00\x04\x00\x79\x00\x39\x00\x2d\x00\x1e\x00\x36\x00\x66\x00\x67\x00\x39\x00\x7f\x00\x30\x00\x66\x00\x67\x00\x44\x00\x45\x00\x46\x00\x47\x00\x01\x00\x1a\x00\x44\x00\x45\x00\x46\x00\x47\x00\x7d\x00\x7e\x00\x7f\x00\x01\x00\x7f\x00\x20\x00\x0d\x00\x22\x00\x23\x00\x24\x00\x66\x00\x26\x00\x68\x00\x22\x00\x7f\x00\x0d\x00\x57\x00\x26\x00\x2d\x00\x2e\x00\x2f\x00\x05\x00\x06\x00\x07\x00\x79\x00\x02\x00\x07\x00\x36\x00\x66\x00\x67\x00\x39\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x39\x00\x66\x00\x67\x00\x1c\x00\x2d\x00\x44\x00\x45\x00\x46\x00\x47\x00\x1c\x00\x80\x00\x81\x00\x7e\x00\x7f\x00\x05\x00\x06\x00\x07\x00\x1e\x00\x09\x00\x7f\x00\x0b\x00\x0c\x00\x0d\x00\x57\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x02\x00\x30\x00\x15\x00\x16\x00\x17\x00\x19\x00\x3c\x00\x1b\x00\x57\x00\x1d\x00\x1e\x00\x1f\x00\x3c\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x1e\x00\x57\x00\x66\x00\x67\x00\x66\x00\x67\x00\x36\x00\x7f\x00\x00\x00\x01\x00\x3a\x00\x66\x00\x67\x00\x7f\x00\x1c\x00\x57\x00\x5d\x00\x45\x00\x46\x00\x47\x00\x61\x00\x57\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\x71\x00\x1c\x00\x73\x00\x44\x00\x45\x00\x46\x00\x47\x00\x78\x00\x79\x00\x5d\x00\x3c\x00\x7c\x00\x01\x00\x61\x00\x03\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\x71\x00\x01\x00\x73\x00\x03\x00\x3c\x00\x79\x00\x1c\x00\x78\x00\x79\x00\x79\x00\x7f\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x05\x00\x06\x00\x07\x00\x4e\x00\x09\x00\x7f\x00\x0b\x00\x0c\x00\x0d\x00\x7c\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x04\x00\x2a\x00\x0a\x00\x7f\x00\x2d\x00\x19\x00\x7c\x00\x1b\x00\x3c\x00\x1d\x00\x1e\x00\x1f\x00\x1c\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x1a\x00\x20\x00\x07\x00\x22\x00\x23\x00\x24\x00\x36\x00\x26\x00\x66\x00\x67\x00\x3a\x00\x05\x00\x06\x00\x07\x00\x66\x00\x67\x00\x3c\x00\x45\x00\x46\x00\x47\x00\x1a\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x39\x00\x3b\x00\x07\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x1a\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x07\x00\x20\x00\x5d\x00\x22\x00\x23\x00\x24\x00\x61\x00\x07\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\x71\x00\x1c\x00\x73\x00\x2a\x00\x39\x00\x1c\x00\x2d\x00\x78\x00\x79\x00\x7e\x00\x7f\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x25\x00\x26\x00\x7c\x00\x28\x00\x26\x00\x2a\x00\x1a\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x2d\x00\x2e\x00\x2f\x00\x2a\x00\x2b\x00\x7f\x00\x36\x00\x3c\x00\x5d\x00\x36\x00\x3a\x00\x3c\x00\x61\x00\x07\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\x71\x00\x53\x00\x73\x00\x4f\x00\x01\x00\x1a\x00\x03\x00\x78\x00\x79\x00\x02\x00\x03\x00\x7c\x00\x07\x00\x06\x00\x39\x00\x03\x00\x0d\x00\x5d\x00\x06\x00\x79\x00\x7f\x00\x61\x00\x07\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\x71\x00\x20\x00\x73\x00\x22\x00\x23\x00\x24\x00\x1f\x00\x78\x00\x79\x00\x2a\x00\x2b\x00\x07\x00\x7d\x00\x7e\x00\x7f\x00\x25\x00\x26\x00\x7f\x00\x28\x00\x7f\x00\x2a\x00\x7c\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x39\x00\x03\x00\x1a\x00\x19\x00\x06\x00\x1b\x00\x36\x00\x1d\x00\x1e\x00\x1f\x00\x3a\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x07\x00\x2a\x00\x39\x00\x1f\x00\x2d\x00\x4f\x00\x36\x00\x3e\x00\x3f\x00\x40\x00\x3a\x00\x2a\x00\x2b\x00\x44\x00\x45\x00\x46\x00\x47\x00\x7c\x00\x20\x00\x5d\x00\x22\x00\x23\x00\x24\x00\x61\x00\x07\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\x71\x00\x08\x00\x73\x00\x2a\x00\x39\x00\x7f\x00\x2d\x00\x78\x00\x79\x00\x51\x00\x52\x00\x53\x00\x7d\x00\x7e\x00\x7f\x00\x25\x00\x26\x00\x01\x00\x28\x00\x7a\x00\x2a\x00\x72\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x51\x00\x52\x00\x53\x00\x0d\x00\x01\x00\x39\x00\x36\x00\x7f\x00\x66\x00\x67\x00\x3a\x00\x65\x00\x7d\x00\x7e\x00\x7f\x00\x7c\x00\x44\x00\x45\x00\x46\x00\x47\x00\x1e\x00\x49\x00\x4a\x00\x2a\x00\x2b\x00\x21\x00\x22\x00\x23\x00\x24\x00\x2b\x00\x26\x00\x4f\x00\x44\x00\x45\x00\x46\x00\x47\x00\x02\x00\x2d\x00\x2e\x00\x2f\x00\x13\x00\x14\x00\x15\x00\x16\x00\x02\x00\x5d\x00\x36\x00\x65\x00\x7f\x00\x61\x00\x07\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\x71\x00\x2b\x00\x73\x00\x7d\x00\x7e\x00\x7f\x00\x01\x00\x78\x00\x79\x00\x7e\x00\x7f\x00\x07\x00\x7d\x00\x7e\x00\x7f\x00\x25\x00\x26\x00\x01\x00\x28\x00\x04\x00\x2a\x00\x65\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x02\x00\x66\x00\x67\x00\x19\x00\x68\x00\x1b\x00\x36\x00\x1d\x00\x1e\x00\x1f\x00\x3a\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x39\x00\x04\x00\x7f\x00\x68\x00\x39\x00\x4f\x00\x36\x00\x7d\x00\x7e\x00\x7f\x00\x3a\x00\x44\x00\x45\x00\x46\x00\x47\x00\x44\x00\x45\x00\x46\x00\x47\x00\x5d\x00\x7d\x00\x7e\x00\x7f\x00\x61\x00\x02\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\x71\x00\x02\x00\x73\x00\x3f\x00\x40\x00\x66\x00\x67\x00\x78\x00\x79\x00\x45\x00\x46\x00\x47\x00\x7d\x00\x7e\x00\x7f\x00\x17\x00\x18\x00\x26\x00\x7d\x00\x7e\x00\x7f\x00\x11\x00\x12\x00\x07\x00\x2d\x00\x2e\x00\x2f\x00\x7d\x00\x7e\x00\x7f\x00\x01\x00\x7f\x00\x03\x00\x36\x00\x7e\x00\x7f\x00\x39\x00\x2b\x00\x7d\x00\x7e\x00\x7f\x00\x19\x00\x0d\x00\x1b\x00\x04\x00\x1d\x00\x1e\x00\x1f\x00\x04\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x07\x00\x04\x00\x7e\x00\x7f\x00\x66\x00\x67\x00\x36\x00\x01\x00\x2c\x00\x03\x00\x3a\x00\x05\x00\x06\x00\x01\x00\x31\x00\x09\x00\x0a\x00\x2a\x00\x19\x00\x1e\x00\x1b\x00\x38\x00\x1d\x00\x1e\x00\x1f\x00\x2b\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x68\x00\x7f\x00\x4e\x00\x4f\x00\x1e\x00\x51\x00\x36\x00\x3a\x00\x0b\x00\x0c\x00\x3a\x00\x51\x00\x52\x00\x53\x00\x2a\x00\x2b\x00\x3e\x00\x3f\x00\x40\x00\x68\x00\x60\x00\x07\x00\x44\x00\x45\x00\x46\x00\x47\x00\x66\x00\x67\x00\x68\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x04\x00\x7d\x00\x7e\x00\x7f\x00\x19\x00\x04\x00\x1b\x00\x2b\x00\x1d\x00\x1e\x00\x1f\x00\x02\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x07\x00\x2a\x00\x2b\x00\x45\x00\x46\x00\x47\x00\x36\x00\x49\x00\x4a\x00\x02\x00\x3a\x00\x32\x00\x7d\x00\x7e\x00\x7f\x00\x7d\x00\x7e\x00\x7f\x00\x19\x00\x7f\x00\x1b\x00\x04\x00\x1d\x00\x1e\x00\x1f\x00\x04\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x02\x00\x05\x00\x06\x00\x07\x00\x66\x00\x67\x00\x36\x00\x51\x00\x52\x00\x53\x00\x3a\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x1c\x00\x1d\x00\x39\x00\x7e\x00\x7f\x00\x07\x00\x04\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x68\x00\x44\x00\x45\x00\x46\x00\x47\x00\x7d\x00\x7e\x00\x7f\x00\x7d\x00\x7e\x00\x7f\x00\x19\x00\x04\x00\x1b\x00\x02\x00\x1d\x00\x1e\x00\x1f\x00\x02\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x1f\x00\x3f\x00\x40\x00\x51\x00\x52\x00\x53\x00\x36\x00\x45\x00\x46\x00\x47\x00\x3a\x00\x05\x00\x06\x00\x07\x00\x2b\x00\x7d\x00\x7e\x00\x7f\x00\x51\x00\x52\x00\x53\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x7f\x00\x5d\x00\x51\x00\x52\x00\x53\x00\x61\x00\x3e\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\x71\x00\x2b\x00\x73\x00\x05\x00\x06\x00\x07\x00\x02\x00\x78\x00\x79\x00\x17\x00\x18\x00\x7c\x00\x2b\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x7f\x00\x3e\x00\x3f\x00\x40\x00\x51\x00\x52\x00\x53\x00\x44\x00\x45\x00\x46\x00\x47\x00\x2d\x00\x7d\x00\x7e\x00\x7f\x00\x05\x00\x06\x00\x07\x00\x2c\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x51\x00\x52\x00\x53\x00\x02\x00\x5d\x00\x7d\x00\x7e\x00\x7f\x00\x61\x00\x02\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\x71\x00\x02\x00\x73\x00\x05\x00\x06\x00\x07\x00\x1e\x00\x78\x00\x79\x00\x11\x00\x12\x00\x7c\x00\x7f\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x1e\x00\x5d\x00\x51\x00\x52\x00\x53\x00\x61\x00\x02\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\x71\x00\x1e\x00\x73\x00\x7d\x00\x7e\x00\x7f\x00\x02\x00\x78\x00\x79\x00\x02\x00\x5d\x00\x7c\x00\x0b\x00\x0c\x00\x61\x00\x02\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\x71\x00\x2c\x00\x73\x00\x05\x00\x06\x00\x07\x00\x1e\x00\x78\x00\x79\x00\x2d\x00\x1e\x00\x7c\x00\x66\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x7d\x00\x7e\x00\x7f\x00\x65\x00\x5d\x00\x7d\x00\x7e\x00\x7f\x00\x61\x00\x02\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\x71\x00\x32\x00\x73\x00\x05\x00\x06\x00\x07\x00\x02\x00\x78\x00\x79\x00\x02\x00\x02\x00\x7c\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x02\x00\x1f\x00\x5d\x00\x7d\x00\x7e\x00\x7f\x00\x61\x00\x3a\x00\x63\x00\x64\x00\x56\x00\x05\x00\x06\x00\x07\x00\x7d\x00\x7e\x00\x7f\x00\x44\x00\x45\x00\x46\x00\x47\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x7d\x00\x7e\x00\x7f\x00\x78\x00\x79\x00\x5d\x00\x7b\x00\x04\x00\x04\x00\x61\x00\x04\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\x71\x00\x68\x00\x73\x00\x05\x00\x06\x00\x07\x00\x66\x00\x78\x00\x79\x00\x32\x00\x02\x00\x7c\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x51\x00\x52\x00\x53\x00\x65\x00\x5d\x00\x7d\x00\x7e\x00\x7f\x00\x61\x00\x2b\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\x71\x00\x01\x00\x73\x00\x51\x00\x52\x00\x53\x00\x5d\x00\x78\x00\x79\x00\x02\x00\x61\x00\x7c\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\x71\x00\x2a\x00\x73\x00\x05\x00\x06\x00\x07\x00\x02\x00\x78\x00\x79\x00\x2c\x00\x02\x00\x7c\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x51\x00\x52\x00\x53\x00\x02\x00\x02\x00\x5d\x00\x51\x00\x52\x00\x53\x00\x61\x00\x1f\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\x71\x00\x02\x00\x73\x00\x0c\x00\x0d\x00\x2a\x00\x68\x00\x78\x00\x79\x00\x04\x00\x1f\x00\x7c\x00\x01\x00\x7d\x00\x7e\x00\x7f\x00\x19\x00\x2c\x00\x1b\x00\x2c\x00\x1d\x00\x1e\x00\x1f\x00\x1f\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x08\x00\x51\x00\x52\x00\x53\x00\x02\x00\x02\x00\x36\x00\x1f\x00\x01\x00\x5d\x00\x3a\x00\x1f\x00\x68\x00\x61\x00\x02\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\x71\x00\x02\x00\x73\x00\x7d\x00\x7e\x00\x7f\x00\x02\x00\x78\x00\x79\x00\x2b\x00\x2b\x00\x7c\x00\x01\x00\x7d\x00\x7e\x00\x7f\x00\x5d\x00\x7d\x00\x7e\x00\x7f\x00\x61\x00\x65\x00\x63\x00\x64\x00\x65\x00\x5d\x00\x7d\x00\x7e\x00\x7f\x00\x61\x00\x66\x00\x63\x00\x64\x00\x21\x00\x22\x00\x23\x00\x24\x00\x4c\x00\x26\x00\x01\x00\x51\x00\x52\x00\x53\x00\x78\x00\x79\x00\x2d\x00\x2e\x00\x2f\x00\x7d\x00\x7e\x00\x7f\x00\x0d\x00\x78\x00\x79\x00\x36\x00\x7b\x00\x5d\x00\x39\x00\x2a\x00\x2a\x00\x61\x00\x2a\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\x71\x00\x2a\x00\x73\x00\x02\x00\x75\x00\x2b\x00\x02\x00\x78\x00\x79\x00\x2a\x00\x30\x00\x02\x00\x32\x00\x33\x00\x68\x00\x35\x00\x2a\x00\x37\x00\x1b\x00\x1e\x00\x3a\x00\x1a\x00\x19\x00\x3d\x00\x10\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x04\x00\x02\x00\x01\x00\x65\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x02\x00\x4d\x00\x02\x00\x68\x00\x50\x00\x01\x00\x0d\x00\x53\x00\x54\x00\x4c\x00\x56\x00\x57\x00\x58\x00\x7f\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x51\x00\x52\x00\x53\x00\x1e\x00\x01\x00\x35\x00\x66\x00\x67\x00\x68\x00\x69\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x71\x00\x61\x00\x10\x00\x44\x00\x45\x00\x46\x00\x47\x00\x2b\x00\x2b\x00\x35\x00\x35\x00\x37\x00\x68\x00\x1b\x00\x3a\x00\x2c\x00\x32\x00\x3d\x00\x01\x00\x3f\x00\x2c\x00\x41\x00\x42\x00\x43\x00\x2c\x00\x44\x00\x45\x00\x46\x00\x47\x00\x49\x00\x4a\x00\x4b\x00\x32\x00\x2f\x00\x7d\x00\x7e\x00\x7f\x00\x2c\x00\x01\x00\x53\x00\x54\x00\x51\x00\x52\x00\x53\x00\x58\x00\x2c\x00\x03\x00\x5b\x00\x01\x00\x5d\x00\x5e\x00\x5f\x00\x7d\x00\x7e\x00\x7f\x00\x45\x00\x2c\x00\x01\x00\x66\x00\x67\x00\x68\x00\x02\x00\x02\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x65\x00\x55\x00\x10\x00\x01\x00\x5d\x00\x01\x00\x02\x00\x03\x00\x61\x00\x68\x00\x63\x00\x64\x00\x65\x00\x1b\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x01\x00\x71\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x2b\x00\x2c\x00\x78\x00\x79\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x01\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x01\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\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\x01\x00\x01\x00\x02\x00\x03\x00\x68\x00\x01\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x01\x00\x68\x00\x10\x00\x5d\x00\x01\x00\x02\x00\x03\x00\x61\x00\x2c\x00\x63\x00\x64\x00\x25\x00\x26\x00\x1b\x00\x28\x00\x71\x00\x2a\x00\x01\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x1e\x00\x31\x00\x32\x00\x33\x00\x01\x00\x01\x00\x36\x00\x01\x00\x78\x00\x79\x00\x3a\x00\x2f\x00\x30\x00\x31\x00\x1e\x00\x33\x00\x2b\x00\x35\x00\x2b\x00\x37\x00\x38\x00\x1e\x00\x3a\x00\x2b\x00\x71\x00\x3d\x00\x01\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x01\x00\x45\x00\x01\x00\x01\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x65\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x01\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x71\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x2a\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\x01\x00\x7d\x00\x7e\x00\x7f\x00\x1b\x00\x1a\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x19\x00\x10\x00\x10\x00\x5d\x00\x01\x00\x02\x00\x03\x00\x61\x00\xff\xff\x63\x00\x64\x00\x25\x00\x26\x00\x1b\x00\x28\x00\xff\xff\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\x31\x00\x32\x00\x33\x00\xff\xff\xff\xff\x36\x00\xff\xff\x78\x00\x79\x00\x3a\x00\x2f\x00\x30\x00\xff\xff\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\xff\xff\xff\xff\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\x01\x00\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\x25\x00\x26\x00\x1b\x00\x28\x00\xff\xff\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\x31\x00\x32\x00\x33\x00\xff\xff\x26\x00\x36\x00\xff\xff\x2c\x00\xff\xff\x3a\x00\x2f\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\x36\x00\x3a\x00\xff\xff\x39\x00\x3d\x00\xff\xff\x3f\x00\x7f\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\x01\x00\x02\x00\x03\x00\x49\x00\x4a\x00\x4b\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x04\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\x58\x00\xff\xff\xff\xff\x5b\x00\xff\xff\x5d\x00\x5e\x00\x5f\x00\xff\xff\xff\xff\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\x01\x00\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x7d\x00\x7e\x00\x7f\x00\x01\x00\x02\x00\x03\x00\x0d\x00\x0e\x00\x0f\x00\x3b\x00\x1b\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x2f\x00\xff\xff\xff\xff\x31\x00\xff\xff\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\x38\x00\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\x0d\x00\x0e\x00\x0f\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\xff\xff\x4e\x00\x4f\x00\xff\xff\x51\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\x58\x00\xff\xff\xff\xff\x5b\x00\xff\xff\x5d\x00\x5e\x00\x5f\x00\xff\xff\x60\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\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x5d\x00\xff\xff\x10\x00\x39\x00\x61\x00\xff\xff\x63\x00\x64\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x1b\x00\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\x49\x00\x4a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\x2f\x00\xff\xff\xff\xff\x32\x00\xff\xff\x34\x00\xff\xff\x36\x00\xff\xff\xff\xff\x39\x00\xff\xff\x3b\x00\x3c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x52\x00\xff\xff\xff\xff\x55\x00\x7e\x00\x7f\x00\xff\xff\x59\x00\xff\xff\xff\xff\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\xff\xff\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x2f\x00\x5d\x00\x31\x00\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x38\x00\xff\xff\xff\xff\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x45\x00\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\x78\x00\x79\x00\xff\xff\x4e\x00\x4f\x00\xff\xff\x51\x00\xff\xff\x01\x00\x31\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\xff\xff\x0d\x00\x60\x00\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\x4e\x00\x4f\x00\xff\xff\x51\x00\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x7e\x00\x7f\x00\x30\x00\x60\x00\x32\x00\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x1b\x00\x68\x00\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\x2f\x00\x4d\x00\x31\x00\xff\xff\x50\x00\xff\xff\xff\xff\x53\x00\x54\x00\x38\x00\x56\x00\x57\x00\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\x69\x00\xff\xff\x4e\x00\x4f\x00\xff\xff\x51\x00\xff\xff\x01\x00\xff\xff\x55\x00\x56\x00\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x0d\x00\x60\x00\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\xff\xff\x78\x00\x79\x00\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x5d\x00\xff\xff\x10\x00\xff\xff\x61\x00\x30\x00\x63\x00\x64\x00\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x1b\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\x78\x00\x79\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x2f\x00\x4d\x00\x31\x00\xff\xff\x50\x00\xff\xff\xff\xff\x53\x00\x54\x00\x38\x00\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\xff\xff\xff\xff\x4e\x00\x4f\x00\xff\xff\x51\x00\xff\xff\x01\x00\xff\xff\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0d\x00\x60\x00\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\xff\xff\x30\x00\xff\xff\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x1b\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\x2f\x00\x4d\x00\x31\x00\xff\xff\x50\x00\xff\xff\xff\xff\x53\x00\x54\x00\x38\x00\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x39\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\xff\xff\xff\xff\x4e\x00\x4f\x00\xff\xff\x51\x00\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x60\x00\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x5d\x00\x10\x00\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x7d\x00\x7e\x00\x7f\x00\x1b\x00\xff\xff\x01\x00\xff\xff\x03\x00\xff\xff\xff\xff\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x78\x00\x79\x00\x10\x00\xff\xff\x39\x00\x2f\x00\xff\xff\x31\x00\xff\xff\x3e\x00\x3f\x00\x40\x00\xff\xff\x1b\x00\x38\x00\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\x2c\x00\x2d\x00\xff\xff\x2f\x00\x5d\x00\xff\xff\x4e\x00\x4f\x00\x61\x00\x51\x00\x63\x00\x64\x00\x65\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x60\x00\x45\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x78\x00\x79\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\xff\xff\x55\x00\xff\xff\x7e\x00\x7f\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\xff\xff\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\xff\xff\x03\x00\xff\xff\xff\xff\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\xff\xff\x1b\x00\x01\x00\xff\xff\x03\x00\xff\xff\xff\xff\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x7e\x00\x7f\x00\x10\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\x1b\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\x21\x00\x22\x00\x23\x00\x24\x00\x45\x00\x26\x00\x2c\x00\xff\xff\xff\xff\x2f\x00\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\x55\x00\x36\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\xff\xff\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x55\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\xff\xff\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x5d\x00\xff\xff\xff\xff\x7f\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x1b\x00\x01\x00\x02\x00\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x2c\x00\x78\x00\x79\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1b\x00\xff\xff\xff\xff\x26\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\x45\x00\xff\xff\x01\x00\x35\x00\x36\x00\x2f\x00\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x55\x00\x10\x00\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\x1b\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x55\x00\xff\xff\x2c\x00\x5d\x00\xff\xff\x2f\x00\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x45\x00\xff\xff\x01\x00\x78\x00\x79\x00\xff\xff\xff\xff\x7f\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x55\x00\x10\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1b\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\xff\xff\xff\xff\x2c\x00\x01\x00\x02\x00\x2f\x00\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x5d\x00\x10\x00\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x3a\x00\x45\x00\xff\xff\x1b\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\x49\x00\x4a\x00\x55\x00\x78\x00\x79\x00\xff\xff\x5d\x00\xff\xff\x2f\x00\x01\x00\x61\x00\x03\x00\x63\x00\x64\x00\x65\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x0d\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\x45\x00\xff\xff\xff\xff\x78\x00\x79\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\x1b\x00\xff\xff\x31\x00\x1e\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x38\x00\xff\xff\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x4e\x00\x4f\x00\x10\x00\x51\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3a\x00\x45\x00\xff\xff\x1b\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\x60\x00\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\x66\x00\x67\x00\x68\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2f\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x0d\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\x1b\x00\xff\xff\x31\x00\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x38\x00\xff\xff\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x4e\x00\x4f\x00\x10\x00\x51\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\xff\xff\x45\x00\x61\x00\x1b\x00\x63\x00\x64\x00\x65\x00\x66\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2f\x00\x01\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x0d\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1b\x00\xff\xff\x31\x00\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x38\x00\xff\xff\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x4e\x00\x4f\x00\x10\x00\x51\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2f\x00\x01\x00\xff\xff\x03\x00\xff\xff\xff\xff\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x0d\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1b\x00\xff\xff\x31\x00\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x38\x00\xff\xff\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x4e\x00\x4f\x00\x10\x00\x51\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\x1b\x00\xff\xff\x04\x00\xff\xff\xff\xff\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\xff\xff\x68\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\x45\x00\x03\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\x3b\x00\x55\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x04\x00\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\x01\x00\x56\x00\x03\x00\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\x01\x00\xff\xff\x03\x00\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x0d\x00\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\x31\x00\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\x38\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\x01\x00\x56\x00\x03\x00\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x0d\x00\x4e\x00\x4f\x00\xff\xff\x51\x00\x66\x00\x67\x00\x68\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x60\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\xff\xff\x68\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\x31\x00\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\x38\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\x01\x00\x56\x00\x03\x00\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x0d\x00\x4e\x00\x4f\x00\xff\xff\x51\x00\x66\x00\x67\x00\x68\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3a\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\x49\x00\x4a\x00\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\x01\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\x0d\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\x66\x00\x67\x00\x68\x00\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\x01\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\x0d\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\x01\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\x0d\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\x01\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\x0d\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\x01\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\x0d\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\x01\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\x0d\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\x01\x00\x56\x00\x03\x00\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x0d\x00\x34\x00\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\xff\xff\x49\x00\x4a\x00\xff\xff\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\x01\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\x0d\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x67\x00\x68\x00\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\x01\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\x0d\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\x01\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\x0d\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\x39\x00\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\x01\x00\x56\x00\x03\x00\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\xff\xff\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\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\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x76\x00\x30\x00\x78\x00\x79\x00\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x7f\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\x01\x00\xff\xff\x03\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\xff\xff\xff\xff\x50\x00\x0d\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\x30\x00\xff\xff\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\x01\x00\xff\xff\x03\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\xff\xff\xff\xff\x50\x00\x0d\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x7e\x00\x7f\x00\x66\x00\x67\x00\x68\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\x30\x00\xff\xff\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\x01\x00\x3a\x00\x03\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\x0d\x00\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\xff\xff\xff\xff\x01\x00\xff\xff\x7e\x00\x7f\x00\xff\xff\x67\x00\x68\x00\x31\x00\xff\xff\xff\xff\xff\xff\x35\x00\x0d\x00\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\x01\x00\xff\xff\x03\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\x4f\x00\x01\x00\x51\x00\x0d\x00\x53\x00\x54\x00\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\x31\x00\x5b\x00\x0d\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x67\x00\x68\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\x03\x00\x31\x00\x4e\x00\x4f\x00\xff\xff\x51\x00\x0d\x00\x01\x00\x38\x00\x03\x00\x0d\x00\x31\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x38\x00\x0d\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\xff\xff\x4e\x00\x4f\x00\xff\xff\x51\x00\xff\xff\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x00\x4f\x00\x31\x00\x51\x00\xff\xff\xff\xff\x31\x00\x0d\x00\x60\x00\x38\x00\xff\xff\xff\xff\xff\xff\x38\x00\x66\x00\x31\x00\x68\x00\xff\xff\x60\x00\xff\xff\xff\xff\xff\xff\x38\x00\xff\xff\x66\x00\x67\x00\x68\x00\xff\xff\x01\x00\xff\xff\x03\x00\x4e\x00\x4f\x00\xff\xff\x51\x00\x4e\x00\x4f\x00\xff\xff\x51\x00\x01\x00\x0d\x00\xff\xff\xff\xff\x31\x00\x4e\x00\x4f\x00\xff\xff\x51\x00\xff\xff\x60\x00\x38\x00\x0d\x00\xff\xff\x60\x00\xff\xff\x66\x00\xff\xff\x68\x00\xff\xff\xff\xff\xff\xff\x68\x00\x60\x00\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\x68\x00\xff\xff\x4e\x00\x4f\x00\xff\xff\x51\x00\x31\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x38\x00\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\xff\xff\x60\x00\xff\xff\xff\xff\x5d\x00\x38\x00\xff\xff\x66\x00\x61\x00\x68\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x4e\x00\x4f\x00\xff\xff\x51\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x00\x4f\x00\xff\xff\x51\x00\x78\x00\x79\x00\xff\xff\x60\x00\x7f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x68\x00\xff\xff\xff\xff\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\x19\x00\x66\x00\x1b\x00\x68\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\x1e\x00\x1f\x00\x3a\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\x4b\x00\x4c\x00\x4d\x00\xff\xff\xff\xff\xff\xff\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\x1e\x00\x1f\x00\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\x36\x00\xff\xff\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\x4b\x00\x4c\x00\x4d\x00\x7e\x00\x7f\x00\xff\xff\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x1e\x00\x1f\x00\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x36\x00\x45\x00\x46\x00\x47\x00\x3a\x00\x49\x00\x4a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\x4b\x00\x4c\x00\x4d\x00\xff\xff\xff\xff\xff\xff\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x1e\x00\x1f\x00\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\x7e\x00\x7f\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\x4b\x00\x4c\x00\x4d\x00\x4e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1e\x00\x1f\x00\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\x34\x00\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\x3b\x00\x3a\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\x4b\x00\x4c\x00\x4d\x00\xff\xff\xff\xff\xff\xff\x1e\x00\x1f\x00\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\x20\x00\x3a\x00\x22\x00\x23\x00\x24\x00\xff\xff\x26\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\x7d\x00\x7e\x00\x7f\x00\x4d\x00\xff\xff\x36\x00\xff\xff\xff\xff\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\x20\x00\xff\xff\x22\x00\x23\x00\x24\x00\xff\xff\x26\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\x39\x00\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\xff\xff\x26\x00\x21\x00\x22\x00\x23\x00\x24\x00\x7f\x00\x26\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x36\x00\xff\xff\xff\xff\x39\x00\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7f\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x21\x00\x22\x00\x23\x00\x24\x00\xff\xff\x26\x00\x21\x00\x22\x00\x23\x00\x24\x00\xff\xff\x26\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x36\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\x3f\x00\x40\x00\xff\xff\xff\xff\x7e\x00\x7f\x00\x45\x00\x46\x00\x47\x00\xff\xff\x7e\x00\x7f\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\xff\xff\x26\x00\x21\x00\x22\x00\x23\x00\x24\x00\xff\xff\x26\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x36\x00\xff\xff\xff\xff\x39\x00\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7f\x00\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\x7f\x00\x44\x00\x45\x00\x46\x00\x47\x00\x25\x00\x26\x00\xff\xff\x28\x00\xff\xff\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x25\x00\x26\x00\x36\x00\x28\x00\xff\xff\x2a\x00\x3a\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x36\x00\xff\xff\xff\xff\x61\x00\x3a\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x4f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7f\x00\x5d\x00\x4f\x00\x78\x00\x79\x00\x61\x00\xff\xff\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\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\x25\x00\x26\x00\xff\xff\x28\x00\xff\xff\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\xff\xff\x3a\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\xff\xff\x49\x00\x4a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x25\x00\x26\x00\xff\xff\x28\x00\x4f\x00\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x5d\x00\xff\xff\xff\xff\x3a\x00\x61\x00\xff\xff\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\x71\x00\xff\xff\x73\x00\xff\xff\x4f\x00\xff\xff\xff\xff\x78\x00\x79\x00\x7e\x00\x7f\x00\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\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\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\x25\x00\x26\x00\xff\xff\x28\x00\xff\xff\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\xff\xff\x3a\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\xff\xff\x49\x00\x4a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x25\x00\x26\x00\xff\xff\x28\x00\x4f\x00\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x5d\x00\xff\xff\xff\xff\x3a\x00\x61\x00\xff\xff\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\x71\x00\xff\xff\x73\x00\xff\xff\x4f\x00\xff\xff\xff\xff\x78\x00\x79\x00\x7e\x00\x7f\x00\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\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\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\x25\x00\x26\x00\xff\xff\x28\x00\xff\xff\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\x25\x00\x26\x00\x3a\x00\x28\x00\xff\xff\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\x25\x00\x26\x00\x3a\x00\x28\x00\x4f\x00\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x5d\x00\xff\xff\xff\xff\x3a\x00\x61\x00\x4f\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\x5e\x00\x5f\x00\xff\xff\xff\xff\x4f\x00\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\x25\x00\x26\x00\x5f\x00\x28\x00\xff\xff\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\x36\x00\xff\xff\x25\x00\x26\x00\x3a\x00\x28\x00\xff\xff\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\x36\x00\xff\xff\x25\x00\x26\x00\x3a\x00\x28\x00\x4f\x00\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\x25\x00\x26\x00\x3a\x00\x28\x00\x4f\x00\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x26\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x2d\x00\x2e\x00\x2f\x00\x3a\x00\xff\xff\x4f\x00\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\x39\x00\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\xff\xff\x4f\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x7d\x00\x7e\x00\x7f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\x39\x00\x7d\x00\x7e\x00\x7f\x00\xff\xff\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x5d\x00\xff\xff\x7e\x00\x7f\x00\x61\x00\xff\xff\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\x71\x00\x3a\x00\xff\xff\xff\xff\x39\x00\x76\x00\xff\xff\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\x44\x00\x45\x00\x46\x00\x47\x00\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\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\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x76\x00\xff\xff\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\x3a\x00\x7d\x00\x7e\x00\x7f\x00\x3e\x00\x3f\x00\x40\x00\x3a\x00\x39\x00\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\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\x71\x00\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\x78\x00\x79\x00\xff\xff\x7d\x00\x7e\x00\x7f\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x53\x00\x54\x00\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\xff\xff\x5b\x00\xff\xff\x5d\x00\x5e\x00\x5f\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x67\x00\x68\x00\x69\x00\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x53\x00\x54\x00\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\xff\xff\x5b\x00\xff\xff\x5d\x00\x5e\x00\x5f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2b\x00\xff\xff\x67\x00\x68\x00\x69\x00\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2b\x00\xff\xff\x40\x00\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\x33\x00\xff\xff\x48\x00\xff\xff\xff\xff\x38\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x40\x00\xff\xff\xff\xff\x56\x00\xff\xff\xff\xff\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\x60\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\xff\xff\xff\xff\x68\x00\x56\x00\xff\xff\xff\xff\xff\xff\x5a\x00\x2c\x00\x5c\x00\xff\xff\xff\xff\x30\x00\x60\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\x68\x00\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\x57\x00\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x67\x00\x68\x00\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x67\x00\x68\x00\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x67\x00\x68\x00\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x67\x00\x68\x00\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x67\x00\x68\x00\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\x57\x00\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x67\x00\x68\x00\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\xff\xff\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\xff\xff\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\xff\xff\x30\x00\xff\xff\xff\xff\x33\x00\xff\xff\x35\x00\x68\x00\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\xff\xff\x67\x00\x68\x00\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x40\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\xff\xff\xff\xff\xff\xff\x56\x00\xff\xff\xff\xff\xff\xff\x5a\x00\x31\x00\x5c\x00\x33\x00\xff\xff\x35\x00\x60\x00\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\x68\x00\xff\xff\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\xff\xff\xff\xff\x5a\x00\xff\xff\x5c\x00\x31\x00\x5e\x00\x5f\x00\x60\x00\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\x68\x00\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\x4f\x00\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\xff\xff\x5b\x00\xff\xff\x5d\x00\x5e\x00\x5f\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\x67\x00\x68\x00\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\x4f\x00\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\xff\xff\x5b\x00\xff\xff\x5d\x00\x5e\x00\x5f\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\x67\x00\x68\x00\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\x4f\x00\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\xff\xff\x5b\x00\xff\xff\x5d\x00\x5e\x00\x5f\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\x67\x00\x68\x00\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\x4f\x00\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\xff\xff\x5b\x00\xff\xff\x5d\x00\x5e\x00\x5f\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\x67\x00\x68\x00\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\x31\x00\xff\xff\x33\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x38\x00\x4e\x00\x4f\x00\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x40\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\x60\x00\xff\xff\xff\xff\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x68\x00\xff\xff\xff\xff\x56\x00\xff\xff\xff\xff\x35\x00\x5a\x00\x37\x00\x5c\x00\xff\xff\x3a\x00\xff\xff\x60\x00\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x68\x00\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x53\x00\x54\x00\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\xff\xff\x5b\x00\xff\xff\x5d\x00\x5e\x00\x5f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x67\x00\x68\x00\x69\x00\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x53\x00\x54\x00\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\xff\xff\x5b\x00\xff\xff\x5d\x00\x5e\x00\x5f\x00\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\x67\x00\x68\x00\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x53\x00\x54\x00\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\xff\xff\x5b\x00\xff\xff\x5d\x00\x5e\x00\x5f\x00\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\x67\x00\x68\x00\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x53\x00\x54\x00\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\xff\xff\x5b\x00\xff\xff\x5d\x00\x5e\x00\x5f\x00\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\x67\x00\x68\x00\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x53\x00\x54\x00\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\xff\xff\x5b\x00\xff\xff\x5d\x00\x5e\x00\x5f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x67\x00\x68\x00\x56\x00\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\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\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\xff\xff\x56\x00\x7c\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\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\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\x56\x00\xff\xff\x7c\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\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\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x78\x00\x79\x00\xff\xff\x61\x00\x7c\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x56\x00\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\x82\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\x71\x00\xff\xff\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\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\x71\x00\xff\xff\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\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\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\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\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x76\x00\xff\xff\x78\x00\x79\x00\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\x7f\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\x71\x00\xff\xff\x73\x00\xff\xff\x75\x00\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\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\x71\x00\xff\xff\x73\x00\xff\xff\x75\x00\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\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\x71\x00\xff\xff\x73\x00\xff\xff\x75\x00\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\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\x71\x00\xff\xff\x73\x00\xff\xff\x75\x00\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\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\x71\x00\xff\xff\x73\x00\xff\xff\x75\x00\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\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\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\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\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\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\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\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\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\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\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\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\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\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\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\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\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\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\x71\x00\xff\xff\xff\xff\x74\x00\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\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\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\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\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\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\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\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\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\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\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\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\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\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\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\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\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\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\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\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\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\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\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\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\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\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\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\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\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\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\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\xff\xff\xff\xff\x78\x00\x79\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\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\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\x94\x00\x4e\x00\x4f\x00\x11\x03\xb5\x03\xf7\x02\x00\x03\xf6\x01\xad\x01\x62\x03\xb8\x01\xc6\x00\x41\x02\xe5\xff\xcf\x00\x52\x03\x99\x02\x13\x02\xe1\x01\x9c\x01\xe8\x00\x0a\x01\x36\x02\x50\x00\x42\x02\x51\x00\xa0\x03\x52\x00\x53\x00\x54\x00\xe2\x01\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\x25\xfe\x23\x03\x8b\x01\xab\x03\x01\x01\x63\x03\x64\x00\xf7\x01\x9a\x01\x86\x01\x65\x00\xa1\x03\x0b\x01\x87\x01\x51\x01\x4e\x00\x4f\x00\xa8\x03\x8c\x01\xbe\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x97\x03\x41\x02\x3e\x03\x92\x00\xac\x03\xf6\x02\x92\x00\xaa\x00\xc7\x00\x7f\x03\x50\x00\xd0\x00\x51\x00\x42\x02\x52\x00\x53\x00\x54\x00\x13\x02\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\x90\x00\xae\x01\x92\x00\x90\x00\xae\x01\x92\x00\x64\x00\x90\x00\xe9\x00\x92\x00\x65\x00\x92\x00\x92\x00\x90\x00\x4d\x00\x4e\x00\x4f\x00\x6d\x00\x6e\x00\x6f\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xe4\x02\x9e\x02\x6f\x00\x0d\x03\xbb\x02\xf7\x02\x02\x01\x4d\x00\xfe\x02\x6f\x00\x50\x00\xce\x00\x51\x00\x92\x00\x52\x00\x53\x00\x54\x00\x13\x02\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\xba\x00\xcf\x00\x7f\x03\x9a\x01\xad\x01\x3c\x03\x64\x00\x2b\x00\xad\x03\x90\x00\x65\x00\x92\x00\xb4\x03\x90\x00\xe9\x00\x92\x00\xe8\x00\x6d\x00\x6e\x00\x6f\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x69\x03\xe1\x01\xbb\x00\x56\x00\x57\x00\x58\x00\x41\x02\xbc\x00\xa7\x03\x99\x00\x6f\x00\xfc\x01\xc5\x00\xe2\x01\xbd\x00\x62\x00\x63\x00\x41\x02\x42\x02\x6b\x03\x87\x03\x4e\x03\xa8\x01\x64\x00\xb4\x01\xb5\x03\xbe\x00\x7f\x03\x05\x03\x42\x02\x95\x03\x3a\x03\x3b\x03\x88\x03\xe8\x00\xc6\x00\x15\x02\xbf\x00\x67\x00\x68\x00\x69\x00\xc0\x00\x6b\x00\x6c\x00\xd0\x00\xaa\x00\x90\x00\xae\x01\x92\x00\x06\x03\x6d\x00\x6e\x00\x6f\x00\xb5\x01\x56\x00\x57\x00\x58\x00\x32\x03\xb6\x01\xad\x01\x88\x03\x4f\x03\xfd\x02\xfb\x01\x33\x03\xb7\x01\x62\x00\x63\x00\x06\x03\xe9\x00\xe1\x01\xe8\x00\x7e\x02\x22\x02\x64\x00\xba\x00\x16\x02\xb8\x01\x90\x00\xae\x01\x92\x00\xbc\x02\xe2\x01\xfa\x01\xfb\x01\x23\x02\xe1\x01\x41\x03\xb9\x01\x67\x00\x68\x00\x69\x00\xba\x01\x6b\x00\x6c\x00\xc1\x00\x6f\x00\xea\x00\xe2\x01\xc9\x00\xca\x00\xcb\x00\x90\x00\xeb\x00\x92\x00\xc7\x00\x42\x03\x90\x00\xe9\x00\x92\x00\xec\x00\x62\x00\x63\x00\x9a\x01\xa4\x00\x22\x02\x43\x03\xba\x00\x90\x00\x64\x00\x92\x00\x24\xfe\xcc\x00\x90\x00\xe9\x00\x92\x00\xce\x00\x23\x02\x24\xfe\x85\x02\x3c\x03\xfc\x01\x45\x03\xed\x00\x67\x00\x68\x00\x69\x00\xee\x00\x6b\x00\x6c\x00\x9f\x01\x55\x03\x71\x00\xa5\x00\x56\x00\x57\x00\x58\x00\xaa\x00\xa6\x00\xcf\x00\x24\xfe\x24\xfe\xfc\x01\x24\xfe\x72\x00\xa7\x00\x62\x00\x63\x00\xd6\x00\xa9\x02\x90\x00\xae\x01\x92\x00\xb3\x01\x64\x00\x44\x03\x28\x02\x7e\x02\x24\xfe\x86\x02\xa4\x02\x90\x00\x9a\x01\x92\x00\x90\x00\xe9\x00\x92\x00\xd7\x00\xa8\x00\x67\x00\x68\x00\x69\x00\xa9\x00\x6b\x00\x6c\x00\xaf\x02\xa4\x03\x90\x00\xbb\x00\x56\x00\x57\x00\x58\x00\xef\x00\xbc\x00\xb5\x01\x56\x00\x57\x00\x58\x00\xa5\x02\xb6\x01\xbd\x00\x62\x00\x63\x00\xef\x01\x58\x03\x59\x03\xb7\x01\x62\x00\x63\x00\x64\x00\xac\x02\xbd\x02\xbe\x00\x84\x03\xa5\x03\x64\x00\x90\x00\xe9\x00\xb8\x01\xd0\x00\xcb\x02\x02\x01\x4d\x00\xbf\x00\x67\x00\x68\x00\xe6\x01\x12\x02\x35\x02\xb9\x01\x67\x00\x68\x00\xe6\x01\x29\x02\x99\x00\x6f\x00\xe7\x00\xaa\x00\xea\x00\x13\x02\xc9\x00\xca\x00\xcb\x00\x90\x00\xeb\x00\x92\x00\xd5\x00\xd8\x00\xe8\x00\xd7\x02\xd6\x00\xec\x00\x62\x00\x63\x00\xa5\x03\x34\x00\x35\x00\x02\x03\x71\x03\x37\x02\x64\x00\x02\x01\x4d\x00\xcc\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xd7\x00\x02\x01\x4d\x00\xbe\x01\x0f\x03\xed\x00\x67\x00\x68\x00\xe6\x01\xdc\x01\xf3\x01\xf4\x01\xaa\x02\x6f\x00\x62\x02\x34\x00\x35\x00\x72\x03\xb0\x02\xaa\x00\x64\x02\x65\x02\x66\x02\x08\x02\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xb3\x02\x3a\x02\x39\x03\x3a\x03\x3b\x03\x67\x02\x9a\x01\x51\x00\x32\x02\x52\x00\x68\x02\x69\x02\x9a\x01\x55\x00\x56\x00\x57\x00\x58\x00\x6a\x02\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\xb4\x02\x3c\x02\x90\x00\xe9\x00\x02\x01\x4d\x00\x64\x00\xef\x00\x93\x00\x05\x00\x6b\x02\x90\x00\xe9\x00\xd8\x00\x36\x02\x4b\x02\x06\x00\xde\x01\x68\x00\xdf\x01\x07\x00\x51\x02\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x99\x01\x3b\x00\xe5\x01\x67\x00\x68\x00\xe6\x01\x18\x00\x19\x00\x06\x00\x9a\x01\x3c\x00\xa3\x01\x07\x00\xba\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xb9\x00\x3b\x00\xba\x00\x9a\x01\x5e\x02\x9f\x01\x18\x00\x19\x00\x3c\x03\xaa\x00\x3c\x00\x6d\x00\xd9\x01\x6f\x00\x62\x02\x34\x00\x35\x00\x5f\x02\x63\x02\x7e\x02\x64\x02\x65\x02\x66\x02\x53\x01\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xdc\x00\x64\x03\x60\x02\xaa\x00\x65\x03\x67\x02\x54\x01\x51\x00\x9a\x01\x52\x00\x68\x02\x69\x02\xaf\x01\x55\x00\x56\x00\x57\x00\x58\x00\x6a\x02\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x98\x01\xd9\x00\x9c\x01\xc9\x00\xca\x00\xcb\x00\x64\x00\xda\x00\x02\x01\x4d\x00\x6b\x02\xa6\x03\x34\x00\x35\x00\x6d\x03\x6e\x03\x9a\x01\xa0\x00\x68\x00\x05\x02\x9e\x01\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xcc\x00\xdd\x00\xa0\x01\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xae\x01\xe4\x00\x67\x00\x68\x00\x69\x00\xe5\x00\x6b\x00\x6c\x00\xb0\x01\xd2\x00\x06\x00\xc9\x00\xca\x00\xcb\x00\x07\x00\x21\x01\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xbe\x01\x3b\x00\x12\x03\xcc\x00\xdc\x01\x13\x03\x18\x00\x19\x00\xa3\x00\x6f\x00\x3c\x00\x6d\x00\xd9\x01\x6f\x00\x22\x01\x5a\x00\xb1\x01\x23\x01\xa6\x00\x24\x01\xbd\x01\x25\x01\x61\x00\x62\x00\x63\x00\xa7\x00\x62\x00\x63\x00\x26\x03\x27\x03\xdb\x00\x64\x00\x9a\x01\x06\x00\x64\x00\x26\x01\x9a\x01\x07\x00\xbf\x01\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xd2\x01\x3b\x00\x7c\x01\x79\x01\xdb\x01\xba\x00\x18\x00\x19\x00\x49\x03\x4a\x03\x3c\x00\xdd\x01\x4b\x03\xad\x00\x97\xfe\x7a\x01\x06\x00\x97\xfe\xec\x01\xd3\x00\x07\x00\x21\x01\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xc8\x00\x28\x01\xc9\x00\xca\x00\xcb\x00\x97\xfe\x18\x00\x19\x00\x28\x03\x29\x03\xd8\x02\x6d\x00\x29\x01\x6f\x00\x22\x01\x5a\x00\xaa\x00\x23\x01\xaa\x00\x24\x01\xed\x01\x25\x01\x61\x00\x62\x00\x63\x00\xcc\x00\x93\x02\xb4\x00\xd4\x01\x94\x02\x51\x00\x64\x00\x52\x00\xd5\x01\xd6\x01\x26\x01\x55\x00\x56\x00\x57\x00\x58\x00\xd7\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\xf9\x00\x5d\x03\xb8\x01\x5b\x03\x5e\x03\x7e\x01\x64\x00\xc1\x02\xe0\x00\xe1\x00\xd8\x01\x16\x02\x41\x03\x01\x02\x67\x00\x68\x00\xe6\x01\xff\x00\xd2\x00\x06\x00\xc9\x00\xca\x00\xcb\x00\x07\x00\x21\x01\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0c\x01\x28\x01\x01\x03\xcc\x00\xcd\x00\x02\x03\x18\x00\x19\x00\x65\x03\xb6\x00\xb7\x00\x6d\x00\x29\x01\x6f\x00\x22\x01\x5a\x00\x12\x02\x23\x01\x17\x01\x24\x01\x3f\x01\x25\x01\x61\x00\x62\x00\x63\x00\x42\x02\xb6\x00\xb7\x00\x13\x02\x05\x00\xbe\x00\x64\x00\xaa\x00\x02\x01\x4d\x00\x26\x01\x2b\x00\x6d\x00\xd9\x01\x6f\x00\x1e\x01\xe7\x01\x67\x00\x68\x00\x69\x00\x2c\x03\xe8\x01\x6c\x00\x16\x02\xb2\x02\xa5\x00\x56\x00\x57\x00\x58\x00\xb7\x03\xa6\x00\x80\x01\x54\x02\x67\x00\x68\x00\xe6\x01\xb8\x03\xa7\x00\x62\x00\x63\x00\x34\x01\x35\x01\x36\x01\x37\x01\xb9\x03\x06\x00\x64\x00\x2b\x00\xd3\x00\x07\x00\x21\x01\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xaf\x03\x28\x01\x79\x03\x99\x00\x6f\x00\xb0\x03\x18\x00\x19\x00\xe9\x01\x6f\x00\x0a\x02\x6d\x00\x29\x01\x6f\x00\x22\x01\x5a\x00\xb1\x03\x23\x01\xa0\x03\x24\x01\x2b\x00\x25\x01\x61\x00\x62\x00\x63\x00\xa3\x03\x90\x00\xe9\x00\xd4\x01\x92\x00\x51\x00\x64\x00\x52\x00\xd5\x01\xd6\x01\x26\x01\x55\x00\x56\x00\x57\x00\x58\x00\xd7\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\xb8\x01\x8f\x03\xaa\x00\x92\x00\xbe\x00\x27\x01\x64\x00\x7a\x03\x99\x00\x6f\x00\xd8\x01\x01\x02\x67\x00\x68\x00\xe6\x01\xe7\x01\x67\x00\x68\x00\xe6\x01\x06\x00\x7b\x03\x99\x00\x6f\x00\x07\x00\x94\x03\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x95\x03\x28\x01\xa8\x01\xe1\x00\x02\x01\x4d\x00\x18\x00\x19\x00\xa0\x00\x68\x00\x05\x02\x6d\x00\x29\x01\x6f\x00\x32\x01\x33\x01\xb6\x01\x19\x03\x99\x00\x6f\x00\x38\x01\x39\x01\x33\x02\xb7\x01\x62\x00\x63\x00\x1a\x03\x99\x00\x6f\x00\x22\x02\xaa\x00\xba\x00\x64\x00\xe9\x01\x6f\x00\xb8\x01\x97\x03\x6d\x00\xd9\x01\x6f\x00\xd4\x01\x23\x02\x51\x00\x9a\x03\x52\x00\xd5\x01\xd6\x01\x9b\x03\x55\x00\x56\x00\x57\x00\x58\x00\xd7\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x3d\x02\x9c\x03\xab\x01\x6f\x00\x02\x01\x4d\x00\x64\x00\x4c\x01\x3f\x00\x4d\x01\xd8\x01\x4e\x01\x4f\x01\x6f\x03\xaf\x00\x50\x01\x51\x01\x70\x03\xd4\x01\x79\x03\x51\x00\xb0\x00\x52\x00\xd5\x01\xd6\x01\x73\x03\x55\x00\x56\x00\x57\x00\x58\x00\xd7\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x92\x00\xaa\x00\xb1\x00\xb2\x00\x7f\x03\xb3\x00\x64\x00\x77\x02\x3a\x01\x3b\x01\xd8\x01\x2d\x03\xb6\x00\xb7\x00\xf6\x00\xf7\x00\x46\x02\xe0\x00\xe1\x00\x92\x00\xb4\x00\x4c\x02\xe5\x01\x67\x00\x68\x00\xe6\x01\x90\x00\xe9\x00\x92\x00\x78\x02\x73\x01\xb6\x00\xb7\x00\x74\x01\x75\x01\x81\x03\x6d\x00\xd9\x01\x6f\x00\xd4\x01\x83\x03\x51\x00\x86\x03\x52\x00\xd5\x01\xd6\x01\x08\x03\x55\x00\x56\x00\x57\x00\x58\x00\xd7\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x52\x02\xf8\x00\xf9\x00\xa0\x00\x68\x00\xa1\x00\x64\x00\xa2\x00\x6c\x00\x0d\x03\xd8\x01\x9c\x01\x6d\x00\x79\x02\x6f\x00\x6d\x00\xd9\x01\x6f\x00\xd4\x01\xaa\x00\x51\x00\x18\x03\x52\x00\xd5\x01\xd6\x01\x19\x03\x55\x00\x56\x00\x57\x00\x58\x00\xd7\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x1e\x03\x75\x03\x34\x00\x35\x00\x02\x01\x4d\x00\x64\x00\x42\x02\xb6\x00\xb7\x00\xd8\x01\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x2c\x01\x2d\x01\xb8\x01\xa3\x00\x6f\x00\xd3\x01\x1c\x03\xc1\x02\xe0\x00\xe1\x00\xc2\x02\xe3\x00\x92\x00\x01\x02\x67\x00\x68\x00\xe6\x01\xdb\x02\x99\x00\x6f\x00\x6d\x00\xd9\x01\x6f\x00\xd4\x01\x1d\x03\x51\x00\x1f\x03\x52\x00\xd5\x01\xd6\x01\x32\x03\x55\x00\x56\x00\x57\x00\x58\x00\xd7\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x0a\x02\x3f\x02\xe1\x00\x50\x03\xb6\x00\xb7\x00\x64\x00\xde\x01\x68\x00\xdf\x01\xd8\x01\x38\x03\x34\x00\x35\x00\x36\x03\x6d\x00\xd9\x01\x6f\x00\x42\x02\xb6\x00\xb7\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xaa\x00\x06\x00\xc5\x02\xb6\x00\xb7\x00\x07\x00\x35\x03\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x37\x03\x3b\x00\xb8\x02\x34\x00\x35\x00\x38\x03\x18\x00\x19\x00\x32\x01\x33\x01\x3c\x00\x3f\x03\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xaa\x00\x46\x02\xe0\x00\xe1\x00\xc6\x02\xb6\x00\xb7\x00\xe5\x01\x67\x00\x68\x00\xe6\x01\x40\x03\x6d\x00\xd9\x01\x6f\x00\xb9\x02\x34\x00\x35\x00\x3f\x00\x9b\x02\x73\x01\xb6\x00\xb7\x00\x74\x01\x75\x01\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x42\x02\xb6\x00\xb7\x00\x47\x03\x06\x00\xe0\x02\x99\x00\x6f\x00\x07\x00\x48\x03\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x4c\x03\x3b\x00\xba\x02\x34\x00\x35\x00\x4d\x03\x18\x00\x19\x00\x38\x01\x39\x01\x3c\x00\xaa\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x50\x03\x06\x00\xfb\x02\xb6\x00\xb7\x00\x07\x00\x53\x03\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x58\x03\x3b\x00\xe5\x02\x99\x00\x6f\x00\x54\x03\x18\x00\x19\x00\x9a\x02\x06\x00\x3c\x00\x3a\x01\x3b\x01\x07\x00\x9b\x02\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x81\x02\x3b\x00\x5d\x02\x34\x00\x35\x00\x26\xfe\x18\x00\x19\x00\xaf\x02\xb5\x02\x3c\x00\xd2\x01\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xe6\x02\x99\x00\x6f\x00\x2b\x00\x06\x00\xe7\x02\x99\x00\x6f\x00\x07\x00\xbf\x02\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x9c\x01\x3b\x00\x6e\x02\x34\x00\x35\x00\xc0\x02\x18\x00\x19\x00\xc8\x02\xca\x02\x3c\x00\xd6\x02\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xd7\x02\x0a\x02\x06\x00\xeb\x02\x99\x00\x6f\x00\x07\x00\x04\x02\xa9\x03\x09\x00\xdf\x02\x8c\x01\x34\x00\x35\x00\xec\x02\x99\x00\x6f\x00\x9d\x00\x67\x00\x68\x00\xe6\x01\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xf0\x02\x99\x00\x6f\x00\x18\x00\x19\x00\x06\x00\xaa\x03\xe0\x02\xe2\x02\x07\x00\xe3\x02\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x92\x00\x3b\x00\x03\x01\x34\x00\x35\x00\xf4\x02\x18\x00\x19\x00\x9c\x01\xf9\x02\x3c\x00\xfa\x02\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xb5\x00\xb6\x00\xb7\x00\x2b\x00\x06\x00\x6d\x00\x9f\x00\x6f\x00\x07\x00\xfd\x02\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x04\x03\x3b\x00\x02\x02\xb6\x00\xb7\x00\x06\x00\x18\x00\x19\x00\xf8\x01\x07\x00\x3c\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xfa\x01\x3b\x00\x33\x00\x34\x00\x35\x00\xf9\x01\x18\x00\x19\x00\xfe\x01\xff\x01\x3c\x00\x00\x02\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x03\x02\xb6\x00\xb7\x00\x01\x02\x08\x02\x06\x00\xb5\x00\xb6\x00\xb7\x00\x07\x00\x0a\x02\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x18\x02\x3b\x00\xa8\x02\x66\x02\x17\x02\x92\x00\x18\x00\x19\x00\x2e\x02\x0a\x02\x3c\x00\x35\x02\x2a\x02\x99\x00\x6f\x00\x67\x02\x3f\x00\x51\x00\x3c\x02\x52\x00\x68\x02\x69\x02\x0a\x02\x55\x00\x56\x00\x57\x00\x58\x00\x6a\x02\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x8e\x01\x42\x02\xb6\x00\xb7\x00\x44\x02\x45\x02\x64\x00\x0a\x02\x50\x02\x06\x00\x6b\x02\x0a\x02\x92\x00\x07\x00\x56\x02\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x57\x02\x3b\x00\x50\x02\x99\x00\x6f\x00\x58\x02\x18\x00\x19\x00\x59\x02\x5a\x02\x3c\x00\x5c\x02\x85\x01\x99\x00\x6f\x00\x06\x00\x96\x01\x99\x00\x6f\x00\x07\x00\x2b\x00\x06\x01\x09\x00\x16\x01\x06\x00\x97\x01\x99\x00\x6f\x00\x07\x00\xd2\x01\x89\x03\x09\x00\xb5\x01\x56\x00\x57\x00\x58\x00\x62\x02\xb6\x01\x71\x00\xa1\x01\xb6\x00\xb7\x00\x18\x00\x19\x00\xb7\x01\x62\x00\x63\x00\x6d\x00\xd9\x01\x6f\x00\x72\x00\x18\x00\x19\x00\x64\x00\x8a\x03\x06\x00\xb8\x01\x70\x02\x71\x02\x07\x00\x72\x02\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x73\x02\xfc\x00\x74\x02\x8f\x01\x53\x01\x75\x02\x18\x00\x19\x00\x76\x02\x73\x00\x77\x02\x74\x00\x75\x00\x92\x00\x76\x00\x82\x02\x77\x00\x2e\x01\x84\x02\x78\x00\x2f\x01\x30\x01\x79\x00\x31\x01\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x87\x02\x71\x01\xe1\x01\x80\x01\x7f\x00\x80\x00\x81\x00\x82\x00\x72\x01\x83\x00\x7c\x01\x92\x00\x84\x00\x8a\x01\xe2\x01\x85\x00\x86\x00\x89\x01\x87\x00\x88\x00\x89\x00\xaa\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\xb5\x00\xb6\x00\xb7\x00\x23\x03\x15\x01\x91\x03\x90\x00\x91\x00\x92\x00\x93\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\xfb\xff\x8e\x01\x23\x00\x21\x03\x67\x00\x68\x00\xe6\x01\x92\x01\x94\x01\x76\x00\x7c\x03\x77\x00\x92\x00\x24\x00\x78\x00\x3f\x00\x9c\x01\x79\x00\x9e\x01\x7a\x00\x3f\x00\x7c\x00\x7d\x00\x7e\x00\xe5\xff\x21\x03\x67\x00\x68\x00\xe6\x01\x80\x00\x81\x00\x82\x00\x9c\x01\x25\x00\x98\x00\x99\x00\x6f\x00\x3f\x00\xb4\x01\x85\x00\x86\x00\xb5\x00\xb6\x00\xb7\x00\x89\x00\x3f\x00\xba\x00\xac\x00\xdb\x01\x8d\x00\x8e\x00\x8f\x00\xc4\x00\x99\x00\x6f\x00\x26\x00\x3f\x00\x1b\x00\x90\x00\xad\x00\x92\x00\xe3\x01\xe5\x01\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x2b\x00\x27\x00\x23\x00\xf3\x01\x06\x00\xa3\x01\x77\x03\xba\x00\x07\x00\x92\x00\x06\x01\x09\x00\x7f\x02\x24\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x96\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x8c\x03\x3e\x00\x3f\x00\x18\x00\x19\x00\x25\x00\x73\x00\x25\xfe\x40\x00\x75\x00\x41\x00\x76\x00\x42\x00\x77\x00\x25\xfe\x43\x00\x78\x00\x44\x00\x45\x00\x79\x00\x97\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x46\x00\x26\x00\x47\x00\x48\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x98\x00\x83\x00\x25\xfe\x25\xfe\x84\x00\x25\xfe\x49\x00\x85\x00\x86\x00\x27\x00\x87\x00\x88\x00\x89\x00\x4a\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x25\xfe\x4b\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x4c\x00\x6d\x02\x92\x00\x6e\x02\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\xa3\x01\x31\x03\xba\x00\x92\x00\x9b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x9c\x00\x92\x00\x23\x00\x06\x00\xa3\x01\xc5\x02\xba\x00\x07\x00\x3f\x00\x13\x01\x09\x00\xcc\x02\x5a\x00\x24\x00\x23\x01\xff\xff\x24\x01\xfb\x00\x25\x01\x61\x00\x62\x00\x63\x00\x27\xfe\x1f\x03\xce\x02\xcf\x02\xfc\x00\xff\x00\x64\x00\x03\x01\x18\x00\x19\x00\xd0\x02\x25\x00\xd7\xff\xd7\xff\x05\x01\xd7\xff\x06\x01\xd7\xff\x0a\x01\xd7\xff\xd7\xff\x0e\x01\xd7\xff\x0f\x01\xff\xff\xd7\xff\x10\x01\xd7\xff\xd7\xff\xd7\xff\xd7\xff\xd7\xff\x11\x01\x26\x00\x12\x01\x13\x01\xd7\xff\xd7\xff\xd7\xff\xd7\xff\x19\x01\xd7\xff\xd7\xff\xd7\xff\xd7\xff\xd7\xff\x1c\x01\xd7\xff\xd7\xff\x27\x00\xd7\xff\xd7\xff\xd7\xff\xff\xff\xd7\xff\xd7\xff\xd7\xff\xd7\xff\xd7\xff\xd7\xff\xd7\xff\x2b\x01\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\xd7\xff\xd7\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\x6d\x00\xd1\x02\x6f\x00\x2e\x01\x2f\x01\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x30\x01\x31\x01\x23\x00\x06\x00\xa3\x01\xcb\x02\xba\x00\x07\x00\x00\x00\x15\x01\x09\x00\xcc\x02\x5a\x00\x24\x00\x23\x01\x00\x00\x24\x01\x00\x00\x25\x01\x61\x00\x62\x00\x63\x00\x00\x00\xcd\x02\xce\x02\xcf\x02\x00\x00\x00\x00\x64\x00\x00\x00\x18\x00\x19\x00\xd0\x02\x25\x00\x73\x00\x00\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x26\x00\x00\x00\x00\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\x00\x00\x00\x00\x84\x00\x00\x00\x00\x00\x85\x00\x86\x00\x27\x00\x87\x00\x88\x00\x89\x00\x00\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x91\x00\x92\x00\x6e\x02\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\x6d\x00\xd1\x02\x6f\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x9b\x02\x73\x01\xb6\x00\xb7\x00\x74\x01\x75\x01\x00\x00\x00\x00\xcc\x02\x5a\x00\x24\x00\x23\x01\x00\x00\x24\x01\x00\x00\x25\x01\x61\x00\x62\x00\x63\x00\x00\x00\xcd\x02\xce\x02\xcf\x02\x00\x00\xbc\x00\x64\x00\x00\x00\x3f\x00\x00\x00\xd0\x02\x25\x00\xbd\x00\x62\x00\x63\x00\x00\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x64\x00\x78\x00\x00\x00\xbe\x00\x79\x00\x00\x00\x7a\x00\xaa\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x26\x00\xa3\x01\xe4\x01\xba\x00\x80\x00\x81\x00\x82\x00\x7a\x01\x73\x01\xb6\x00\xb7\x00\x74\x01\x75\x01\xf2\x00\x85\x00\x86\x00\x27\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\x8b\x00\x00\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x91\x00\x92\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\x6d\x00\xd1\x02\x6f\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x23\x03\x24\x03\x6f\x00\xa3\x01\x07\x02\xba\x00\x3c\x01\x3d\x01\x3e\x01\xf3\x00\x24\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\x00\x00\xe4\x00\x67\x00\x68\x00\x69\x00\xf4\x00\x6b\x00\x6c\x00\xb9\x00\xe4\x01\xba\x00\x00\x00\x00\x00\x25\x00\x00\x00\x00\x00\xaf\x00\x00\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\xb0\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x26\x00\x3c\x01\x3d\x01\x3e\x01\x80\x00\x81\x00\x82\x00\x00\x00\x00\x00\x00\x00\xb1\x00\xb2\x00\x00\x00\xb3\x00\x85\x00\x86\x00\x27\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\x8b\x00\x00\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\xb4\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x91\x00\x92\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x06\x00\x00\x00\x23\x00\xbe\x00\x07\x00\x00\x00\x19\x01\x09\x00\x47\x02\xe0\x00\xe1\x00\x48\x02\xe3\x00\x24\x00\xe7\x01\x67\x00\x68\x00\x69\x00\x00\x00\xe8\x01\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x3e\x00\x3f\x00\x00\x00\x00\x00\x25\x00\x00\x00\x00\x00\x40\x00\x00\x00\x41\x00\x00\x00\x42\x00\x00\x00\x00\x00\x43\x00\x00\x00\x44\x00\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x46\x00\x26\x00\x47\x00\x48\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\xde\x02\x00\x00\x00\x00\x23\x00\x49\x00\x00\x00\x00\x00\x27\x00\x49\x02\x6f\x00\x00\x00\x4a\x00\x00\x00\x00\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x4c\x00\x4d\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x25\x00\x06\x00\xaf\x00\x00\x00\x00\x00\x07\x00\x00\x00\x1c\x01\x09\x00\xb0\x00\x00\x00\x00\x00\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x02\xe0\x00\xe1\x00\x48\x02\xe3\x00\x26\x00\xe7\x01\x67\x00\x68\x00\xe6\x01\x00\x00\x18\x00\x19\x00\x00\x00\xb1\x00\xb2\x00\x00\x00\xb3\x00\x00\x00\x71\x00\xaf\x00\x27\x00\x24\xfe\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x72\x00\xb4\x00\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x92\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\xb1\x00\xb2\x00\x00\x00\xb3\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x32\x02\x00\x00\x00\x00\x23\x00\x49\x02\x6f\x00\x73\x00\xb4\x00\x74\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x24\x00\x92\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x25\x00\x83\x00\xaf\x00\x00\x00\x84\x00\x00\x00\x00\x00\x85\x00\x86\x00\xb0\x00\x87\x00\x88\x00\x89\x00\x00\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\x00\x00\x26\x00\x00\x00\x00\x00\x00\x00\x90\x00\x91\x00\x92\x00\x93\x00\x00\x00\xb1\x00\xb2\x00\x00\x00\xb3\x00\x00\x00\xe1\x01\x00\x00\x27\x00\x25\xfe\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x1f\x01\x09\x00\xe2\x01\xb4\x00\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x92\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\xc5\x01\x06\x00\x00\x00\x23\x00\x00\x00\x07\x00\x73\x00\x20\x01\x09\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x24\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x18\x00\x19\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x25\x00\x83\x00\x25\xfe\x00\x00\x84\x00\x00\x00\x00\x00\x85\x00\x86\x00\x25\xfe\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\xac\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\x00\x00\x26\x00\x00\x00\x00\x00\x00\x00\x90\x00\xad\x00\x92\x00\x00\x00\x00\x00\x25\xfe\x25\xfe\x00\x00\x25\xfe\x00\x00\x71\x00\x00\x00\x27\x00\xc6\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x72\x00\x25\xfe\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x92\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x2d\x02\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x73\x00\x00\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x24\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x25\x00\x83\x00\x24\xfe\x00\x00\x84\x00\x00\x00\x00\x00\x85\x00\x86\x00\x24\xfe\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\xac\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\xbe\x00\x00\x00\x26\x00\x00\x00\x00\x00\x00\x00\x90\x00\xad\x00\x92\x00\x00\x00\x00\x00\x24\xfe\x24\xfe\x00\x00\x24\xfe\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9c\x02\x73\x01\xb6\x00\xb7\x00\x74\x01\x75\x01\x24\xfe\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x92\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x06\x00\x23\x00\x00\x00\x00\x00\x07\x00\x00\x00\x06\x01\x09\x00\x5a\x01\x9d\x02\x9e\x02\x6f\x00\x24\x00\x00\x00\x1b\x00\x00\x00\x93\x02\x00\x00\x00\x00\x94\x02\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x18\x00\x19\x00\x23\x00\x00\x00\xbe\x00\x25\x00\x00\x00\xaf\x00\x00\x00\x47\x02\xe0\x00\xe1\x00\x00\x00\x24\x00\xb0\x00\xe7\x01\x67\x00\x68\x00\xe6\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x00\x00\x00\x00\x95\x02\x9d\x03\x00\x00\x25\x00\x06\x00\x00\x00\xb1\x00\xb2\x00\x07\x00\xb3\x00\x06\x01\x09\x00\x5b\x01\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x00\x26\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x18\x00\x19\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x00\x00\x27\x00\x00\x00\x2e\x03\x6f\x00\xa8\x01\xe1\x00\xa9\x01\xe3\x00\xc0\x02\x00\x00\xa0\x00\x68\x00\x05\x02\x28\x00\x29\x00\x2a\x00\x2b\x00\x4c\x00\x4d\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\x00\x00\x93\x02\x00\x00\x00\x00\x94\x02\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\xa8\x01\xe1\x00\xa9\x01\xe3\x00\x3e\x02\x00\x00\xa0\x00\x68\x00\x05\x02\x00\x00\x24\x00\x1b\x00\x00\x00\x93\x02\x00\x00\x00\x00\x94\x02\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\xab\x01\x6f\x00\x23\x00\x95\x02\x61\x03\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\xf4\x02\x00\x00\x00\x00\x24\x00\xa4\x01\xe0\x00\xe1\x00\xa5\x01\xe3\x00\x00\x00\x9d\x00\x67\x00\x68\x00\xe6\x01\xa5\x00\x56\x00\x57\x00\x58\x00\x26\x00\xa6\x00\x95\x02\x00\x00\x00\x00\x25\x00\x00\x00\x00\x00\xa7\x00\x62\x00\x63\x00\xab\x01\x6f\x00\x00\x00\x00\x00\x00\x00\x27\x00\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x4c\x00\x4d\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x27\x00\x95\x02\xb6\x00\xb7\x00\x96\x02\x97\x02\x6d\x00\xa6\x01\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x4c\x00\x4d\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x06\x00\x00\x00\x00\x00\xaa\x00\x07\x00\x00\x00\x06\x01\x09\x00\x5c\x01\x24\x00\x1b\x00\x0c\x03\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x95\x02\x18\x00\x19\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x00\x00\x00\x00\x00\xa6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x00\x62\x00\x63\x00\x00\x00\x00\x00\x26\x00\x00\x00\x1b\x00\x20\x03\x64\x00\x25\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x27\x00\x23\x00\x21\x03\x67\x00\x68\x00\xe6\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x24\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x27\x00\x00\x00\x95\x02\x06\x00\x00\x00\x25\x00\x00\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x5d\x01\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x26\x00\x00\x00\x1b\x00\x18\x00\x19\x00\x00\x00\x00\x00\xaa\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x27\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x00\x00\x00\x00\x81\x02\x1b\x00\x59\x01\x25\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x06\x00\x23\x00\x00\x00\x00\x00\x07\x00\x00\x00\x06\x01\x09\x00\x16\x01\xa3\x01\x26\x00\x00\x00\x24\x00\xa4\x01\xe0\x00\xe1\x00\xa5\x01\xe3\x00\x00\x00\x9d\x00\x67\x00\x68\x00\x69\x00\x00\x00\x9e\x00\x6c\x00\x27\x00\x18\x00\x19\x00\x00\x00\x06\x00\x00\x00\x25\x00\x22\x02\x07\x00\xba\x00\x06\x01\x09\x00\x3e\x01\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x23\x02\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\x26\x00\x00\x00\x00\x00\x18\x00\x19\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x00\xa6\x01\x6f\x00\x24\x00\x00\x00\x25\xfe\x6d\x01\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x25\xfe\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x25\xfe\x25\xfe\x23\x00\x25\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x02\x26\x00\x00\x00\x24\x00\xa4\x01\xe0\x00\xe1\x00\x00\x00\x25\xfe\x00\x00\x9d\x00\x67\x00\x68\x00\xe6\x01\x90\x00\xe9\x00\x92\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x42\x02\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x15\x01\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x00\xa6\x01\x6f\x00\x24\x00\x00\x00\xaf\x00\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\xb0\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\xb1\x00\xb2\x00\x23\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x26\x00\x07\x00\x24\x00\x06\x01\x09\x00\x0a\x00\x5e\x01\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\xe9\x00\x92\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x14\x03\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x13\x02\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x01\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x00\x00\x00\xaf\x00\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\xb0\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1e\x01\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\xb1\x00\xb2\x00\x23\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x00\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\xe9\x00\x92\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x1d\x02\x00\x00\xba\x00\x00\x00\x00\x00\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x1e\x02\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x15\x01\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x00\x00\x00\x24\xfe\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x24\xfe\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x24\xfe\x24\xfe\x23\x00\x24\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x00\x00\x24\x00\x00\x00\xab\x02\x00\x00\x00\x00\x24\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\x92\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x22\x02\x26\x00\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\x02\x00\x00\x00\x00\x00\x00\xdd\x00\x27\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\x00\x00\xe4\x00\x67\x00\x68\x00\xe6\x01\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x00\x00\x00\x00\x00\x00\x73\x00\x25\xfe\x00\x00\x75\x00\x00\x00\x76\x00\xad\x02\x77\x00\x25\xfe\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\x25\xfe\x25\xfe\x84\x00\x25\xfe\x00\x00\x85\x00\x86\x00\x1d\x02\x87\x00\xba\x00\x89\x00\x00\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x25\xfe\x1e\x02\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\x91\x00\x92\x00\x1d\x02\x00\x00\xba\x00\x00\x00\xf3\x00\x00\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\x1e\x02\xe4\x00\x67\x00\x68\x00\xe6\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\x25\xfe\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x25\xfe\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\xaf\x00\x00\x00\x00\x00\x7f\x00\x80\x00\x81\x00\x82\x00\xb0\x00\x83\x00\x25\xfe\x25\xfe\x84\x00\x25\xfe\x00\x00\x85\x00\x86\x00\x1d\x02\x87\x00\xba\x00\x89\x00\x00\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x25\xfe\x1e\x02\xb1\x00\xb2\x00\x00\x00\xb3\x00\x90\x00\x91\x00\x92\x00\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x00\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\x92\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\xaf\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb0\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\xaf\x00\x00\x00\x00\x00\x7f\x00\x80\x00\x81\x00\x82\x00\xb0\x00\x83\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x1d\x02\x87\x00\xba\x00\x89\x00\x00\x00\x8a\x00\xc3\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\xb4\x00\x1e\x02\xb1\x00\xb2\x00\x00\x00\xb3\x00\x90\x00\xc4\x00\x92\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9c\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\xe9\x00\x92\x00\x9d\x00\x67\x00\x68\x00\x69\x00\x00\x00\x9e\x00\x6c\x00\x73\x00\xaf\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb0\x00\x00\x00\x78\x00\xe1\x01\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\xe2\x01\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\xf1\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\xb4\x00\x00\x00\x6d\x00\x9f\x00\x6f\x00\x00\x00\x90\x00\xf2\x00\x92\x00\x00\x00\x73\x00\xaf\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb0\x00\x00\x00\x78\x00\xe1\x01\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\xe2\x01\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\xbc\x01\x8c\x00\x8d\x00\x8e\x00\x8f\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\xbd\x01\x92\x00\x00\x00\x73\x00\xaf\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb0\x00\x00\x00\x78\x00\xe1\x01\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\xe2\x01\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\xc3\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\xc4\x00\x92\x00\x00\x00\x73\x00\xaf\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb0\x00\x00\x00\x78\x00\xe1\x01\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\xe2\x01\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\xf1\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\xf2\x00\x92\x00\x00\x00\x73\x00\xaf\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb0\x00\x00\x00\x78\x00\xe1\x01\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\xe2\x01\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\xbc\x01\x8c\x00\x8d\x00\x8e\x00\x8f\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\xbd\x01\x92\x00\x00\x00\x73\x00\xaf\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb0\x00\x00\x00\x78\x00\xe1\x01\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\xe2\x01\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\xc3\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\xc4\x00\x92\x00\x00\x00\x73\x00\xaf\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb0\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x79\x01\x87\x00\xba\x00\x89\x00\x00\x00\x8a\x00\xf1\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\xb4\x00\x7a\x01\x90\x03\x00\x00\x00\x00\x00\x00\x90\x00\xf2\x00\x92\x00\x2a\x03\x00\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\x00\x00\x10\x02\x67\x00\x68\x00\xe6\x01\xa8\x01\xe1\x00\xa9\x01\xe3\x00\xc0\x02\x00\x00\xa0\x00\x68\x00\xa1\x00\x00\x00\xa2\x00\x6c\x00\x00\x00\x00\x00\x73\x00\x25\xfe\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x25\xfe\x00\x00\x78\x00\x71\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x72\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\x25\xfe\x25\xfe\x84\x00\x25\xfe\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x25\xfe\xab\x01\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x91\x00\x92\x00\x00\x00\x73\x00\xaf\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb0\x00\x00\x00\x78\x00\x71\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x72\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\xbc\x01\x8c\x00\x8d\x00\x8e\x00\x8f\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\xbd\x01\x92\x00\x00\x00\x73\x00\xaf\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb0\x00\x00\x00\x78\x00\x71\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x72\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\xc3\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\xc4\x00\x92\x00\x00\x00\x73\x00\xaf\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb0\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\xb8\x01\x00\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x1d\x02\x87\x00\xba\x00\x89\x00\x00\x00\x8a\x00\xf1\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\xb4\x00\x1e\x02\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\xf2\x00\x92\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\xc1\x01\x00\x00\x00\x00\x00\x00\x00\x00\xdc\x02\x73\x00\x18\x00\x19\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xaa\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x22\x02\x00\x00\xba\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\x00\x00\x00\x00\x84\x00\x23\x02\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\xac\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\xad\x00\x92\x00\xa8\x01\xe1\x00\xa9\x01\xe3\x00\x45\x02\x00\x00\xa0\x00\x68\x00\x05\x02\x00\x00\x00\x00\x73\x00\x00\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x79\x01\x00\x00\xba\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\x00\x00\x00\x00\x84\x00\x7a\x01\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\xac\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x01\x6f\x00\x90\x00\xad\x00\x92\x00\xa8\x01\xe1\x00\xa9\x01\xe3\x00\x2f\x03\x00\x00\xa0\x00\x68\x00\x05\x02\x00\x00\x00\x00\x73\x00\x00\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x79\x01\x78\x00\xba\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\x00\x00\x00\x00\x84\x00\x00\x00\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\xac\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\x00\x00\xc4\x02\x00\x00\xab\x01\x6f\x00\x00\x00\xad\x00\x92\x00\xaf\x00\x00\x00\x00\x00\x00\x00\x76\x00\x13\x02\x77\x00\xb0\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x1d\x02\x00\x00\xba\x00\x80\x00\x81\x00\x82\x00\x00\x00\x00\x00\xb1\x00\xb2\x00\x4b\x02\xb3\x00\x1e\x02\x85\x00\x86\x00\x00\x00\x00\x00\x00\x00\x89\x00\x00\x00\xaf\x00\xc3\x00\xe8\x00\x8d\x00\x8e\x00\x8f\x00\xb4\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x00\x92\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1\x01\x00\x00\x00\x00\x00\x00\x79\x01\x00\x00\xba\x00\x25\xfe\xb1\x00\xb2\x00\x00\x00\xb3\x00\xe2\x01\x79\x01\x25\xfe\xba\x00\x7a\x01\xaf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x7a\x01\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\xe9\x00\x92\x00\x00\x00\x25\xfe\x25\xfe\x00\x00\x25\xfe\x00\x00\xe1\x01\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\xb2\x00\xaf\x00\xb3\x00\x00\x00\x00\x00\x24\xfe\xe2\x01\x25\xfe\xb0\x00\x00\x00\x00\x00\x00\x00\x24\xfe\x90\x00\xaf\x00\x92\x00\x00\x00\xb4\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00\x90\x00\xe9\x00\x92\x00\x00\x00\x79\x01\x00\x00\xba\x00\xb1\x00\xb2\x00\x00\x00\xb3\x00\x24\xfe\x24\xfe\x00\x00\x24\xfe\x71\x00\x7a\x01\x00\x00\x00\x00\xaf\x00\xb1\x00\xb2\x00\x00\x00\xb3\x00\x00\x00\xb4\x00\xb0\x00\x72\x00\x00\x00\x24\xfe\x00\x00\x90\x00\x00\x00\x92\x00\x00\x00\x00\x00\x00\x00\x92\x00\xb4\x00\x00\x00\x00\x00\xe5\x01\x67\x00\x68\x00\xe6\x01\x00\x00\x92\x00\x00\x00\xb1\x00\xb2\x00\x00\x00\xb3\x00\x25\xfe\x9b\x02\x73\x01\xb6\x00\xb7\x00\x74\x01\x75\x01\x25\xfe\x00\x00\x00\x00\x00\x00\xaf\x00\x00\x00\x00\x00\xb4\x00\x00\x00\x00\x00\x06\x00\xb0\x00\x00\x00\x90\x00\x07\x00\x92\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x61\x01\x25\xfe\x25\xfe\x00\x00\x25\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\xb2\x00\x00\x00\xb3\x00\x18\x00\x19\x00\x00\x00\x25\xfe\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x92\x00\x00\x00\x00\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x02\x90\x00\x51\x00\x92\x00\x52\x00\xd5\x01\xd6\x01\x00\x00\x55\x00\x56\x00\x57\x00\x58\x00\xd7\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\xc6\x01\xc7\x01\xd8\x01\x55\x00\x56\x00\x57\x00\x58\x00\xc8\x01\x5a\x00\x5b\x00\x5c\x00\xc9\x01\xca\x01\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\x00\x00\xcb\x01\x00\x00\x00\x00\x00\x00\x00\x00\xa8\x01\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x68\x00\x05\x02\x00\x00\x00\x00\x00\x00\xcc\x01\xcd\x01\xce\x01\x00\x00\x00\x00\x00\x00\x7a\x02\xb6\x00\xb7\x00\x7b\x02\x7c\x02\x00\x00\x00\x00\x00\x00\xa8\x01\xe1\x00\xa9\x01\xe3\x00\xaa\x01\x00\x00\xa0\x00\x68\x00\x05\x02\x00\x00\x6d\x00\xd9\x01\x6f\x00\x00\x00\x00\x00\xc6\x01\xc7\x01\x00\x00\x55\x00\x56\x00\x57\x00\x58\x00\xc8\x01\x5a\x00\x5b\x00\x5c\x00\xc9\x01\xca\x01\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x6d\x00\xea\x02\x6f\x00\x64\x00\x00\x00\x00\x00\x00\x00\xcb\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x68\x00\x05\x02\x00\x00\x00\x00\x00\x00\xcc\x01\xcd\x01\xce\x01\xab\x01\x6f\x00\x00\x00\x7a\x02\xb6\x00\xb7\x00\x7b\x02\x7c\x02\xc6\x01\xc7\x01\x00\x00\x55\x00\x56\x00\x57\x00\x58\x00\xc8\x01\x5a\x00\x5b\x00\x5c\x00\xc9\x01\xca\x01\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x00\x00\xa8\x01\xe1\x00\xa9\x01\xe3\x00\x3e\x02\x64\x00\xa0\x00\x68\x00\xa1\x00\xcb\x01\xa2\x00\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x00\xef\x02\x6f\x00\x00\x00\x00\x00\x00\x00\xcc\x01\xcd\x01\xce\x01\x00\x00\x00\x00\x00\x00\x7a\x02\xb6\x00\xb7\x00\x7b\x02\x7c\x02\xc6\x01\xc7\x01\x00\x00\x55\x00\x56\x00\x57\x00\x58\x00\xc8\x01\x5a\x00\x5b\x00\x5c\x00\xc9\x01\xca\x01\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\xab\x01\x6f\x00\xcb\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x7d\x02\x6f\x00\x00\x00\x00\x00\x00\x00\xcc\x01\xcd\x01\xce\x01\xcf\x01\x00\x00\x00\x00\x00\x00\x00\x00\xc6\x01\xc7\x01\x00\x00\x55\x00\x56\x00\x57\x00\x58\x00\xc8\x01\x5a\x00\x5b\x00\x5c\x00\xc9\x01\xca\x01\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x29\x03\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\x2a\x03\xcb\x01\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\x00\x00\x10\x02\x67\x00\x68\x00\xe6\x01\x00\x00\x00\x00\x6d\x00\xd0\x01\x6f\x00\xcc\x01\xcd\x01\xce\x01\x00\x00\x00\x00\x00\x00\xc6\x01\xc7\x01\x00\x00\x55\x00\x56\x00\x57\x00\x58\x00\xc8\x01\x5a\x00\x5b\x00\x5c\x00\xc9\x01\xca\x01\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\xea\x00\xcb\x01\xc9\x00\xca\x00\xcb\x00\x00\x00\xeb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xec\x00\x62\x00\x63\x00\x00\x00\x6d\x00\xd0\x01\x6f\x00\xf1\x02\x00\x00\x64\x00\x00\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\x02\x67\x00\x68\x00\xe6\x01\x00\x00\xea\x00\x00\x00\xc9\x00\xca\x00\xcb\x00\x00\x00\xeb\x00\x24\x02\x73\x01\xb6\x00\xb7\x00\x74\x01\x75\x01\xec\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\xcc\x00\x00\x00\x6d\x00\xd0\x01\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x02\x67\x00\x68\x00\xe6\x01\x00\x00\x00\x00\x00\x00\x00\x00\xbb\x00\x56\x00\x57\x00\x58\x00\x00\x00\xbc\x00\xbb\x00\x56\x00\x57\x00\x58\x00\xef\x00\xbc\x00\xbd\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\xbd\x00\x62\x00\x63\x00\x64\x00\x00\x00\x00\x00\xbe\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x02\x67\x00\x68\x00\xe6\x01\x00\x00\x00\x00\x18\x02\x67\x00\x68\x00\xe6\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xef\x00\x00\x00\x19\x02\x73\x01\xb6\x00\xb7\x00\x74\x01\x75\x01\xa5\x00\x56\x00\x57\x00\x58\x00\x00\x00\xa6\x00\xa5\x00\x56\x00\x57\x00\x58\x00\x00\x00\xa6\x00\xa7\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\xa7\x00\x62\x00\x63\x00\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\x3f\x02\xe1\x00\x00\x00\x00\x00\x0f\x02\x6f\x00\xde\x01\x68\x00\xdf\x01\x00\x00\x1a\x02\x1b\x02\xde\x01\x68\x00\xdf\x01\x00\x00\x00\x00\x00\x00\x95\x02\xb6\x00\xb7\x00\x96\x02\x97\x02\x00\x00\x95\x02\xb6\x00\xb7\x00\x96\x02\x97\x02\x00\x00\xb5\x01\x56\x00\x57\x00\x58\x00\x00\x00\xb6\x01\xa5\x00\x56\x00\x57\x00\x58\x00\x00\x00\xa6\x00\xb7\x01\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\xa7\x00\x62\x00\x63\x00\x64\x00\x00\x00\x00\x00\xb8\x01\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x00\xf7\x02\x67\x00\x68\x00\xe6\x01\x00\x00\xaa\x00\x0d\x02\x67\x00\x68\x00\xe6\x01\x22\x01\x5a\x00\x00\x00\x23\x01\x00\x00\x24\x01\x00\x00\x25\x01\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x01\x5a\x00\x64\x00\x23\x01\x00\x00\x24\x01\x26\x01\x25\x01\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x64\x00\x00\x00\x00\x00\x07\x00\x26\x01\x06\x01\x09\x00\x0a\x00\x0b\x00\x5f\x01\xd9\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x00\x06\x00\xa3\x02\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\xda\x02\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x29\x01\x6f\x00\x22\x01\x5a\x00\x00\x00\x23\x01\x00\x00\x24\x01\x00\x00\x25\x01\x61\x00\x62\x00\x63\x00\x00\x00\x6d\x00\x29\x01\x6f\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\x00\x00\x26\x01\xa8\x01\xe1\x00\xa9\x01\xe3\x00\x45\x02\x00\x00\xa0\x00\x68\x00\xa1\x00\x00\x00\xa2\x00\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x01\x5a\x00\x00\x00\x23\x01\x0b\x02\x24\x01\x00\x00\x25\x01\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x06\x00\x00\x00\x00\x00\x26\x01\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x0c\x02\x00\x00\x38\x02\x00\x00\x00\x00\x18\x00\x19\x00\xab\x01\x6f\x00\x00\x00\x6d\x00\x29\x01\x6f\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x39\x02\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x29\x01\x6f\x00\x22\x01\x5a\x00\x00\x00\x23\x01\x00\x00\x24\x01\x00\x00\x25\x01\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\x00\x00\x26\x01\xa8\x01\xe1\x00\xa9\x01\xe3\x00\xaa\x01\x00\x00\xa0\x00\x68\x00\xa1\x00\x00\x00\xa2\x00\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x01\x5a\x00\x00\x00\x23\x01\x4d\x02\x24\x01\x00\x00\x25\x01\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x06\x00\x00\x00\x00\x00\x26\x01\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x4e\x02\x00\x00\xf0\x01\x00\x00\x00\x00\x18\x00\x19\x00\xab\x01\x6f\x00\x00\x00\x6d\x00\x29\x01\x6f\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\xf1\x01\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x29\x01\x6f\x00\x22\x01\x5a\x00\x00\x00\x23\x01\x00\x00\x24\x01\x00\x00\x25\x01\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x22\x01\x5a\x00\x26\x01\x23\x01\x00\x00\x24\x01\x00\x00\x25\x01\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x22\x01\x5a\x00\x26\x01\x23\x01\xea\x01\x24\x01\x00\x00\x25\x01\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x06\x00\x00\x00\x00\x00\x26\x01\x07\x00\x9f\x02\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x07\x01\xa0\x02\xa1\x02\x00\x00\x00\x00\x9f\x02\x00\x00\xeb\x01\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x29\x01\x6f\x00\x00\x00\x00\x00\x00\x00\x22\x01\x5a\x00\x67\x03\x23\x01\x00\x00\x24\x01\x00\x00\x25\x01\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x6d\x00\x29\x01\x6f\x00\x00\x00\x64\x00\x00\x00\x22\x01\x5a\x00\x26\x01\x23\x01\x00\x00\x24\x01\x00\x00\x25\x01\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x6d\x00\x29\x01\x6f\x00\x00\x00\x64\x00\x00\x00\x22\x01\x5a\x00\x26\x01\x23\x01\xa6\x02\x24\x01\x00\x00\x25\x01\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x22\x01\x5a\x00\x26\x01\x23\x01\xa7\x02\x24\x01\x00\x00\x25\x01\x61\x00\x62\x00\x63\x00\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\xbd\x00\x62\x00\x63\x00\x26\x01\x00\x00\x82\x01\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\xbe\x00\x6d\x00\x29\x01\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x83\x01\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x60\x01\x6d\x00\x29\x01\x6f\x00\x72\x01\x73\x01\xb6\x00\xb7\x00\x74\x01\x75\x01\x00\x00\x00\x00\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\xbe\x00\x6d\x00\x29\x01\x6f\x00\x00\x00\x47\x02\xe0\x00\xe1\x00\x00\x00\x00\x00\x00\x00\xe7\x01\x67\x00\x68\x00\xe6\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x29\x01\x6f\x00\x9c\x02\x73\x01\xb6\x00\xb7\x00\x74\x01\x75\x01\x06\x00\x00\x00\x76\x01\x77\x01\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\xc1\x01\xc0\x01\x00\x00\x00\x00\xbe\x00\x2e\x02\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x2f\x02\x30\x02\x6f\x00\xe7\x01\x67\x00\x68\x00\xe6\x01\x9d\x02\x15\x03\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9c\x02\x73\x01\xb6\x00\xb7\x00\x74\x01\x75\x01\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\xc1\x01\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x01\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x6d\x00\xc3\x01\x6f\x00\xe8\x02\x9d\x02\x14\x03\x6f\x00\xa4\x01\xe0\x00\xe1\x00\xed\x02\xad\x00\x00\x00\x9d\x00\x67\x00\x68\x00\xe6\x01\x00\x00\x00\x00\x00\x00\x9d\x00\x67\x00\x68\x00\xe6\x01\x00\x00\x78\x02\x73\x01\xb6\x00\xb7\x00\x74\x01\x75\x01\x00\x00\x78\x02\x73\x01\xb6\x00\xb7\x00\x74\x01\x75\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\xe3\x02\x00\x00\x00\x00\x6d\x00\xe9\x02\x6f\x00\x00\x00\x18\x00\x19\x00\x00\x00\x6d\x00\xee\x02\x6f\x00\xd3\x02\x00\x00\x2d\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x81\x00\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\x00\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\x8b\x00\x00\x00\x8d\x00\x8e\x00\x8f\x00\xd3\x02\x00\x00\xd4\x02\x00\x00\x00\x00\x00\x00\x00\x00\x91\x00\x92\x00\xd5\x02\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x81\x00\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\x00\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\x8b\x00\x00\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd5\x00\x00\x00\x91\x00\x92\x00\xd5\x02\x73\x00\xaf\x00\x00\x00\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\x00\x00\x00\x7b\x00\x00\x00\x00\x00\x00\x00\xaf\x00\x00\x00\x75\x00\x00\x00\x7f\x00\x00\x00\x00\x00\xb0\x00\x00\x00\x83\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x7b\x00\x00\x00\x00\x00\x87\x00\x00\x00\x00\x00\x00\x00\x8a\x00\x00\x00\x8c\x00\x00\x00\x00\x00\x00\x00\xb4\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x92\x00\x87\x00\x00\x00\x00\x00\x00\x00\x8a\x00\x3f\x00\x8c\x00\x00\x00\x00\x00\x73\x00\xb4\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x92\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\x00\x00\x00\x00\x84\x00\x00\x00\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x88\x00\x89\x00\x00\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf3\x02\x00\x00\x73\x00\x91\x00\x92\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\x00\x00\x00\x00\x84\x00\x00\x00\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x91\x00\x92\x00\x73\x00\x25\xfe\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x25\xfe\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\x25\xfe\x25\xfe\x84\x00\x25\xfe\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x25\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\x01\x91\x00\x92\x00\x23\xfe\x23\xfe\x00\x00\x23\xfe\x00\x00\x23\xfe\x00\x00\x23\xfe\x23\xfe\x00\x00\x23\xfe\x00\x00\x00\x00\x23\xfe\x00\x00\x23\xfe\x23\xfe\x23\xfe\x23\xfe\x23\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x23\xfe\x23\xfe\x23\xfe\x23\xfe\x00\x00\x23\xfe\x23\xfe\x23\xfe\x23\xfe\x23\xfe\x00\x00\x23\xfe\x23\xfe\x00\x00\x23\xfe\x00\x00\x23\xfe\x00\x00\x23\xfe\x23\xfe\x23\xfe\x23\xfe\x23\xfe\x23\xfe\x23\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\xfe\x23\xfe\x73\x00\xaf\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb0\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\xbc\x01\x8c\x00\x8d\x00\x8e\x00\x8f\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbd\x01\x92\x00\x73\x00\x25\xfe\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x25\xfe\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\x25\xfe\x25\xfe\x84\x00\x25\xfe\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x25\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\x91\x00\x92\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\x00\x00\x00\x00\x84\x00\x00\x00\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x88\x00\x89\x00\x00\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x91\x00\x92\x00\x73\x00\xaf\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb0\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x00\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x00\x00\x00\x00\x8a\x00\x00\x00\x8c\x00\x00\x00\x8e\x00\x8f\x00\xb4\x00\x00\x00\x73\x00\x00\x00\x00\x00\x75\x00\x00\x00\x76\x00\x92\x00\x77\x00\x00\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\x00\x00\x00\x00\x84\x00\x00\x00\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\xac\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\x73\x00\xaf\x00\x00\x00\x75\x00\x00\x00\x00\x00\xad\x00\x92\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x87\x00\x00\x00\x00\x00\x00\x00\x8a\x00\xaf\x00\x8c\x00\x75\x00\x00\x00\x76\x00\xb4\x00\x77\x00\xb0\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x92\x00\x00\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x81\x00\x82\x00\x00\x00\x00\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x00\x00\x00\x00\x8a\x00\x00\x00\x8c\x00\xaf\x00\x8e\x00\x8f\x00\xb4\x00\x76\x00\x00\x00\x77\x00\xb0\x00\x00\x00\x78\x00\x00\x00\x92\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x81\x00\x82\x00\x00\x00\x00\x00\xb1\x00\xb2\x00\x00\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x00\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\xbc\x01\x00\x00\x8d\x00\x8e\x00\x8f\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaf\x00\x00\x00\xbd\x01\x92\x00\x76\x00\x00\x00\x77\x00\xb0\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x81\x00\x82\x00\x00\x00\x00\x00\xb1\x00\xb2\x00\x00\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x00\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\xc3\x00\x00\x00\x8d\x00\x8e\x00\x8f\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\xfe\x00\x00\xc4\x00\x92\x00\x23\xfe\x00\x00\x23\xfe\x23\xfe\x00\x00\x23\xfe\x00\x00\x00\x00\x23\xfe\x00\x00\x23\xfe\x00\x00\x23\xfe\x23\xfe\x23\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\xfe\x23\xfe\x23\xfe\x00\x00\x00\x00\x23\xfe\x23\xfe\x00\x00\x23\xfe\x00\x00\x23\xfe\x23\xfe\x00\x00\x00\x00\x00\x00\x23\xfe\x00\x00\x00\x00\x23\xfe\x00\x00\x23\xfe\x23\xfe\x23\xfe\x23\xfe\x00\x00\x00\x00\x00\x00\x00\x00\xaf\x00\x00\x00\x23\xfe\x23\xfe\x76\x00\x00\x00\x77\x00\xb0\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x81\x00\x82\x00\x00\x00\x00\x00\xb1\x00\xb2\x00\x00\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x00\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\xbc\x01\x00\x00\x8d\x00\x8e\x00\x8f\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaf\x00\x00\x00\xbd\x01\x92\x00\x76\x00\x00\x00\x77\x00\xb0\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\xaf\x00\x00\x00\x75\x00\x80\x00\x81\x00\x82\x00\x00\x00\xb0\x00\xb1\x00\xb2\x00\x00\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8e\x00\x8f\x00\xb4\x00\x00\x00\x00\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x92\x00\x00\x00\x00\x00\x87\x00\x00\x00\x00\x00\x76\x00\x8a\x00\x77\x00\x8c\x00\x00\x00\x78\x00\x00\x00\xb4\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x92\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x81\x00\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\x00\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\x8b\x00\x00\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x91\x00\x92\x00\xd5\x02\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\xa3\x02\x00\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x81\x00\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\x00\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\x8b\x00\x00\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\x91\x00\x92\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x81\x00\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\x00\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\x8b\x00\x00\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\x91\x00\x92\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x81\x00\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\x00\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\xac\x00\x00\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\xad\x00\x92\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x81\x00\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\x00\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\x8b\x00\x00\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x91\x00\x92\x00\x8a\x02\x00\x00\x54\x03\x8c\x02\x8d\x02\x8e\x02\x8f\x02\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x90\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x00\x00\x8a\x02\x91\x02\x8b\x02\x8c\x02\x8d\x02\x8e\x02\x8f\x02\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x90\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x5e\x03\x00\x00\x91\x02\x5f\x03\x8d\x02\x8e\x02\x8f\x02\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x90\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x18\x00\x19\x00\x00\x00\x07\x00\x91\x02\x08\x03\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9e\x03\x09\x03\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x0a\x03\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x90\x02\x00\x00\x5b\x03\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x90\x02\x00\x00\xfa\x02\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x90\x02\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\xc1\x01\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x02\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\xaa\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\xfc\x00\x00\x00\x73\x03\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\xfc\x00\x00\x00\x74\x03\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\xfc\x00\x00\x00\xb6\x02\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\xfc\x00\x00\x00\xb7\x02\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\xfc\x00\x00\x00\xfd\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\xb1\x03\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\xb2\x03\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x98\x03\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x6a\x03\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\xb5\x02\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x55\x01\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x56\x01\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x57\x01\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x6b\x01\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x6e\x01\x00\x00\x00\x00\x6f\x01\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x90\x01\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x92\x01\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x94\x01\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x95\x01\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x17\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x8c\x03\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x8d\x03\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x8f\x03\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x92\x03\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x9d\x03\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x66\x03\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x68\x03\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x77\x03\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x7d\x03\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x81\x03\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x84\x03\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x0f\x03\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x03\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x56\x03\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x87\x02\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x89\x02\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x5c\x02\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x59\x01\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x7d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x81\x01\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x84\x01\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\xef\x01\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x08\x01\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x88\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x82\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x6d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x6a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x69\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x68\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x67\x01\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x65\x01\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x66\x01\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x62\x01\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x63\x01\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x64\x01\x00\x00\x00\x00\x18\x00\x19\x00\x1e\x02\xe0\x00\xe1\x00\x00\x00\x00\x00\x00\x00\x1f\x02\x67\x00\x68\x00\xe6\x01\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x02\x73\x01\xb6\x00\xb7\x00\x74\x01\x75\x01\x25\x02\xe0\x00\xe1\x00\x00\x00\x00\x00\x00\x00\x26\x02\x67\x00\x68\x00\xe6\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x02\x73\x01\xb6\x00\xb7\x00\x74\x01\x75\x01\xdd\x00\x00\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\x00\x00\x10\x02\x67\x00\x68\x00\xe6\x01\xf3\x00\x00\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\x00\x00\x10\x02\x67\x00\x68\x00\xe6\x01\x53\x02\x00\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\x00\x00\x10\x02\x67\x00\x68\x00\xe6\x01\x41\x01\x42\x01\x43\x01\x44\x01\x45\x01\x46\x01\x47\x01\x48\x01\x49\x01\x4a\x01\x4b\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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 = Happy_Data_Array.array (4, 491) [-	(4 , happyReduce_4),-	(5 , happyReduce_5),-	(6 , happyReduce_6),-	(7 , happyReduce_7),-	(8 , happyReduce_8),-	(9 , happyReduce_9),-	(10 , happyReduce_10),-	(11 , happyReduce_11),-	(12 , happyReduce_12),-	(13 , happyReduce_13),-	(14 , happyReduce_14),-	(15 , happyReduce_15),-	(16 , happyReduce_16),-	(17 , happyReduce_17),-	(18 , happyReduce_18),-	(19 , happyReduce_19),-	(20 , happyReduce_20),-	(21 , happyReduce_21),-	(22 , happyReduce_22),-	(23 , happyReduce_23),-	(24 , happyReduce_24),-	(25 , happyReduce_25),-	(26 , happyReduce_26),-	(27 , happyReduce_27),-	(28 , happyReduce_28),-	(29 , happyReduce_29),-	(30 , happyReduce_30),-	(31 , happyReduce_31),-	(32 , happyReduce_32),-	(33 , happyReduce_33),-	(34 , happyReduce_34),-	(35 , happyReduce_35),-	(36 , happyReduce_36),-	(37 , happyReduce_37),-	(38 , happyReduce_38),-	(39 , happyReduce_39),-	(40 , happyReduce_40),-	(41 , happyReduce_41),-	(42 , happyReduce_42),-	(43 , happyReduce_43),-	(44 , happyReduce_44),-	(45 , happyReduce_45),-	(46 , happyReduce_46),-	(47 , happyReduce_47),-	(48 , happyReduce_48),-	(49 , happyReduce_49),-	(50 , happyReduce_50),-	(51 , happyReduce_51),-	(52 , happyReduce_52),-	(53 , happyReduce_53),-	(54 , happyReduce_54),-	(55 , happyReduce_55),-	(56 , happyReduce_56),-	(57 , happyReduce_57),-	(58 , happyReduce_58),-	(59 , happyReduce_59),-	(60 , happyReduce_60),-	(61 , happyReduce_61),-	(62 , happyReduce_62),-	(63 , happyReduce_63),-	(64 , happyReduce_64),-	(65 , happyReduce_65),-	(66 , happyReduce_66),-	(67 , happyReduce_67),-	(68 , happyReduce_68),-	(69 , happyReduce_69),-	(70 , happyReduce_70),-	(71 , happyReduce_71),-	(72 , happyReduce_72),-	(73 , happyReduce_73),-	(74 , happyReduce_74),-	(75 , happyReduce_75),-	(76 , happyReduce_76),-	(77 , happyReduce_77),-	(78 , happyReduce_78),-	(79 , happyReduce_79),-	(80 , happyReduce_80),-	(81 , happyReduce_81),-	(82 , happyReduce_82),-	(83 , happyReduce_83),-	(84 , happyReduce_84),-	(85 , happyReduce_85),-	(86 , happyReduce_86),-	(87 , happyReduce_87),-	(88 , happyReduce_88),-	(89 , happyReduce_89),-	(90 , happyReduce_90),-	(91 , happyReduce_91),-	(92 , happyReduce_92),-	(93 , happyReduce_93),-	(94 , happyReduce_94),-	(95 , happyReduce_95),-	(96 , happyReduce_96),-	(97 , happyReduce_97),-	(98 , happyReduce_98),-	(99 , happyReduce_99),-	(100 , happyReduce_100),-	(101 , happyReduce_101),-	(102 , happyReduce_102),-	(103 , happyReduce_103),-	(104 , happyReduce_104),-	(105 , happyReduce_105),-	(106 , happyReduce_106),-	(107 , happyReduce_107),-	(108 , happyReduce_108),-	(109 , happyReduce_109),-	(110 , happyReduce_110),-	(111 , happyReduce_111),-	(112 , happyReduce_112),-	(113 , happyReduce_113),-	(114 , happyReduce_114),-	(115 , happyReduce_115),-	(116 , happyReduce_116),-	(117 , happyReduce_117),-	(118 , happyReduce_118),-	(119 , happyReduce_119),-	(120 , happyReduce_120),-	(121 , happyReduce_121),-	(122 , happyReduce_122),-	(123 , happyReduce_123),-	(124 , happyReduce_124),-	(125 , happyReduce_125),-	(126 , happyReduce_126),-	(127 , happyReduce_127),-	(128 , happyReduce_128),-	(129 , happyReduce_129),-	(130 , happyReduce_130),-	(131 , happyReduce_131),-	(132 , happyReduce_132),-	(133 , happyReduce_133),-	(134 , happyReduce_134),-	(135 , happyReduce_135),-	(136 , happyReduce_136),-	(137 , happyReduce_137),-	(138 , happyReduce_138),-	(139 , happyReduce_139),-	(140 , happyReduce_140),-	(141 , happyReduce_141),-	(142 , happyReduce_142),-	(143 , happyReduce_143),-	(144 , happyReduce_144),-	(145 , happyReduce_145),-	(146 , happyReduce_146),-	(147 , happyReduce_147),-	(148 , happyReduce_148),-	(149 , happyReduce_149),-	(150 , happyReduce_150),-	(151 , happyReduce_151),-	(152 , happyReduce_152),-	(153 , happyReduce_153),-	(154 , happyReduce_154),-	(155 , happyReduce_155),-	(156 , happyReduce_156),-	(157 , happyReduce_157),-	(158 , happyReduce_158),-	(159 , happyReduce_159),-	(160 , happyReduce_160),-	(161 , happyReduce_161),-	(162 , happyReduce_162),-	(163 , happyReduce_163),-	(164 , happyReduce_164),-	(165 , happyReduce_165),-	(166 , happyReduce_166),-	(167 , happyReduce_167),-	(168 , happyReduce_168),-	(169 , happyReduce_169),-	(170 , happyReduce_170),-	(171 , happyReduce_171),-	(172 , happyReduce_172),-	(173 , happyReduce_173),-	(174 , happyReduce_174),-	(175 , happyReduce_175),-	(176 , happyReduce_176),-	(177 , happyReduce_177),-	(178 , happyReduce_178),-	(179 , happyReduce_179),-	(180 , happyReduce_180),-	(181 , happyReduce_181),-	(182 , happyReduce_182),-	(183 , happyReduce_183),-	(184 , happyReduce_184),-	(185 , happyReduce_185),-	(186 , happyReduce_186),-	(187 , happyReduce_187),-	(188 , happyReduce_188),-	(189 , happyReduce_189),-	(190 , happyReduce_190),-	(191 , happyReduce_191),-	(192 , happyReduce_192),-	(193 , happyReduce_193),-	(194 , happyReduce_194),-	(195 , happyReduce_195),-	(196 , happyReduce_196),-	(197 , happyReduce_197),-	(198 , happyReduce_198),-	(199 , happyReduce_199),-	(200 , happyReduce_200),-	(201 , happyReduce_201),-	(202 , happyReduce_202),-	(203 , happyReduce_203),-	(204 , happyReduce_204),-	(205 , happyReduce_205),-	(206 , happyReduce_206),-	(207 , happyReduce_207),-	(208 , happyReduce_208),-	(209 , happyReduce_209),-	(210 , happyReduce_210),-	(211 , happyReduce_211),-	(212 , happyReduce_212),-	(213 , happyReduce_213),-	(214 , happyReduce_214),-	(215 , happyReduce_215),-	(216 , happyReduce_216),-	(217 , happyReduce_217),-	(218 , happyReduce_218),-	(219 , happyReduce_219),-	(220 , happyReduce_220),-	(221 , happyReduce_221),-	(222 , happyReduce_222),-	(223 , happyReduce_223),-	(224 , happyReduce_224),-	(225 , happyReduce_225),-	(226 , happyReduce_226),-	(227 , happyReduce_227),-	(228 , happyReduce_228),-	(229 , happyReduce_229),-	(230 , happyReduce_230),-	(231 , happyReduce_231),-	(232 , happyReduce_232),-	(233 , happyReduce_233),-	(234 , happyReduce_234),-	(235 , happyReduce_235),-	(236 , happyReduce_236),-	(237 , happyReduce_237),-	(238 , happyReduce_238),-	(239 , happyReduce_239),-	(240 , happyReduce_240),-	(241 , happyReduce_241),-	(242 , happyReduce_242),-	(243 , happyReduce_243),-	(244 , happyReduce_244),-	(245 , happyReduce_245),-	(246 , happyReduce_246),-	(247 , happyReduce_247),-	(248 , happyReduce_248),-	(249 , happyReduce_249),-	(250 , happyReduce_250),-	(251 , happyReduce_251),-	(252 , happyReduce_252),-	(253 , happyReduce_253),-	(254 , happyReduce_254),-	(255 , happyReduce_255),-	(256 , happyReduce_256),-	(257 , happyReduce_257),-	(258 , happyReduce_258),-	(259 , happyReduce_259),-	(260 , happyReduce_260),-	(261 , happyReduce_261),-	(262 , happyReduce_262),-	(263 , happyReduce_263),-	(264 , happyReduce_264),-	(265 , happyReduce_265),-	(266 , happyReduce_266),-	(267 , happyReduce_267),-	(268 , happyReduce_268),-	(269 , happyReduce_269),-	(270 , happyReduce_270),-	(271 , happyReduce_271),-	(272 , happyReduce_272),-	(273 , happyReduce_273),-	(274 , happyReduce_274),-	(275 , happyReduce_275),-	(276 , happyReduce_276),-	(277 , happyReduce_277),-	(278 , happyReduce_278),-	(279 , happyReduce_279),-	(280 , happyReduce_280),-	(281 , happyReduce_281),-	(282 , happyReduce_282),-	(283 , happyReduce_283),-	(284 , happyReduce_284),-	(285 , happyReduce_285),-	(286 , happyReduce_286),-	(287 , happyReduce_287),-	(288 , happyReduce_288),-	(289 , happyReduce_289),-	(290 , happyReduce_290),-	(291 , happyReduce_291),-	(292 , happyReduce_292),-	(293 , happyReduce_293),-	(294 , happyReduce_294),-	(295 , happyReduce_295),-	(296 , happyReduce_296),-	(297 , happyReduce_297),-	(298 , happyReduce_298),-	(299 , happyReduce_299),-	(300 , happyReduce_300),-	(301 , happyReduce_301),-	(302 , happyReduce_302),-	(303 , happyReduce_303),-	(304 , happyReduce_304),-	(305 , happyReduce_305),-	(306 , happyReduce_306),-	(307 , happyReduce_307),-	(308 , happyReduce_308),-	(309 , happyReduce_309),-	(310 , happyReduce_310),-	(311 , happyReduce_311),-	(312 , happyReduce_312),-	(313 , happyReduce_313),-	(314 , happyReduce_314),-	(315 , happyReduce_315),-	(316 , happyReduce_316),-	(317 , happyReduce_317),-	(318 , happyReduce_318),-	(319 , happyReduce_319),-	(320 , happyReduce_320),-	(321 , happyReduce_321),-	(322 , happyReduce_322),-	(323 , happyReduce_323),-	(324 , happyReduce_324),-	(325 , happyReduce_325),-	(326 , happyReduce_326),-	(327 , happyReduce_327),-	(328 , happyReduce_328),-	(329 , happyReduce_329),-	(330 , happyReduce_330),-	(331 , happyReduce_331),-	(332 , happyReduce_332),-	(333 , happyReduce_333),-	(334 , happyReduce_334),-	(335 , happyReduce_335),-	(336 , happyReduce_336),-	(337 , happyReduce_337),-	(338 , happyReduce_338),-	(339 , happyReduce_339),-	(340 , happyReduce_340),-	(341 , happyReduce_341),-	(342 , happyReduce_342),-	(343 , happyReduce_343),-	(344 , happyReduce_344),-	(345 , happyReduce_345),-	(346 , happyReduce_346),-	(347 , happyReduce_347),-	(348 , happyReduce_348),-	(349 , happyReduce_349),-	(350 , happyReduce_350),-	(351 , happyReduce_351),-	(352 , happyReduce_352),-	(353 , happyReduce_353),-	(354 , happyReduce_354),-	(355 , happyReduce_355),-	(356 , happyReduce_356),-	(357 , happyReduce_357),-	(358 , happyReduce_358),-	(359 , happyReduce_359),-	(360 , happyReduce_360),-	(361 , happyReduce_361),-	(362 , happyReduce_362),-	(363 , happyReduce_363),-	(364 , happyReduce_364),-	(365 , happyReduce_365),-	(366 , happyReduce_366),-	(367 , happyReduce_367),-	(368 , happyReduce_368),-	(369 , happyReduce_369),-	(370 , happyReduce_370),-	(371 , happyReduce_371),-	(372 , happyReduce_372),-	(373 , happyReduce_373),-	(374 , happyReduce_374),-	(375 , happyReduce_375),-	(376 , happyReduce_376),-	(377 , happyReduce_377),-	(378 , happyReduce_378),-	(379 , happyReduce_379),-	(380 , happyReduce_380),-	(381 , happyReduce_381),-	(382 , happyReduce_382),-	(383 , happyReduce_383),-	(384 , happyReduce_384),-	(385 , happyReduce_385),-	(386 , happyReduce_386),-	(387 , happyReduce_387),-	(388 , happyReduce_388),-	(389 , happyReduce_389),-	(390 , happyReduce_390),-	(391 , happyReduce_391),-	(392 , happyReduce_392),-	(393 , happyReduce_393),-	(394 , happyReduce_394),-	(395 , happyReduce_395),-	(396 , happyReduce_396),-	(397 , happyReduce_397),-	(398 , happyReduce_398),-	(399 , happyReduce_399),-	(400 , happyReduce_400),-	(401 , happyReduce_401),-	(402 , happyReduce_402),-	(403 , happyReduce_403),-	(404 , happyReduce_404),-	(405 , happyReduce_405),-	(406 , happyReduce_406),-	(407 , happyReduce_407),-	(408 , happyReduce_408),-	(409 , happyReduce_409),-	(410 , happyReduce_410),-	(411 , happyReduce_411),-	(412 , happyReduce_412),-	(413 , happyReduce_413),-	(414 , happyReduce_414),-	(415 , happyReduce_415),-	(416 , happyReduce_416),-	(417 , happyReduce_417),-	(418 , happyReduce_418),-	(419 , happyReduce_419),-	(420 , happyReduce_420),-	(421 , happyReduce_421),-	(422 , happyReduce_422),-	(423 , happyReduce_423),-	(424 , happyReduce_424),-	(425 , happyReduce_425),-	(426 , happyReduce_426),-	(427 , happyReduce_427),-	(428 , happyReduce_428),-	(429 , happyReduce_429),-	(430 , happyReduce_430),-	(431 , happyReduce_431),-	(432 , happyReduce_432),-	(433 , happyReduce_433),-	(434 , happyReduce_434),-	(435 , happyReduce_435),-	(436 , happyReduce_436),-	(437 , happyReduce_437),-	(438 , happyReduce_438),-	(439 , happyReduce_439),-	(440 , happyReduce_440),-	(441 , happyReduce_441),-	(442 , happyReduce_442),-	(443 , happyReduce_443),-	(444 , happyReduce_444),-	(445 , happyReduce_445),-	(446 , happyReduce_446),-	(447 , happyReduce_447),-	(448 , happyReduce_448),-	(449 , happyReduce_449),-	(450 , happyReduce_450),-	(451 , happyReduce_451),-	(452 , happyReduce_452),-	(453 , happyReduce_453),-	(454 , happyReduce_454),-	(455 , happyReduce_455),-	(456 , happyReduce_456),-	(457 , happyReduce_457),-	(458 , happyReduce_458),-	(459 , happyReduce_459),-	(460 , happyReduce_460),-	(461 , happyReduce_461),-	(462 , happyReduce_462),-	(463 , happyReduce_463),-	(464 , happyReduce_464),-	(465 , happyReduce_465),-	(466 , happyReduce_466),-	(467 , happyReduce_467),-	(468 , happyReduce_468),-	(469 , happyReduce_469),-	(470 , happyReduce_470),-	(471 , happyReduce_471),-	(472 , happyReduce_472),-	(473 , happyReduce_473),-	(474 , happyReduce_474),-	(475 , happyReduce_475),-	(476 , happyReduce_476),-	(477 , happyReduce_477),-	(478 , happyReduce_478),-	(479 , happyReduce_479),-	(480 , happyReduce_480),-	(481 , happyReduce_481),-	(482 , happyReduce_482),-	(483 , happyReduce_483),-	(484 , happyReduce_484),-	(485 , happyReduce_485),-	(486 , happyReduce_486),-	(487 , happyReduce_487),-	(488 , happyReduce_488),-	(489 , happyReduce_489),-	(490 , happyReduce_490),-	(491 , happyReduce_491)-	]--happy_n_terms = 114 :: Int-happy_n_nonterms = 131 :: Int--happyReduce_4 = happyMonadReduce 1# 0# happyReduction_4-happyReduction_4 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut8 happy_x_1 of { happy_var_1 -> -	( let decls = reverse happy_var_1 in-                       case decls of-                           []     -> do{ n <- getNewName; p <- getCurrentPosition; return $ CTranslUnit decls (mkNodeInfo' p (p,0) n) }-                           (d:ds) -> withNodeInfo d $ CTranslUnit decls)}-	) (\r -> happyReturn (happyIn7 r))--happyReduce_5 = happySpecReduce_0  1# happyReduction_5-happyReduction_5  =  happyIn8-		 (empty-	)--happyReduce_6 = happySpecReduce_2  1# happyReduction_6-happyReduction_6 happy_x_2-	happy_x_1-	 =  case happyOut8 happy_x_1 of { happy_var_1 -> -	happyIn8-		 (happy_var_1-	)}--happyReduce_7 = happySpecReduce_2  1# happyReduction_7-happyReduction_7 happy_x_2-	happy_x_1-	 =  case happyOut8 happy_x_1 of { happy_var_1 -> -	case happyOut9 happy_x_2 of { happy_var_2 -> -	happyIn8-		 (happy_var_1 `snoc` happy_var_2-	)}}--happyReduce_8 = happySpecReduce_1  2# happyReduction_8-happyReduction_8 happy_x_1-	 =  case happyOut10 happy_x_1 of { happy_var_1 -> -	happyIn9-		 (CFDefExt happy_var_1-	)}--happyReduce_9 = happySpecReduce_1  2# happyReduction_9-happyReduction_9 happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	happyIn9-		 (CDeclExt happy_var_1-	)}--happyReduce_10 = happySpecReduce_2  2# happyReduction_10-happyReduction_10 happy_x_2-	happy_x_1-	 =  case happyOut9 happy_x_2 of { happy_var_2 -> -	happyIn9-		 (happy_var_2-	)}--happyReduce_11 = happyMonadReduce 5# 2# happyReduction_11-happyReduction_11 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut128 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CAsmExt happy_var_3)}}-	) (\r -> happyReturn (happyIn9 r))--happyReduce_12 = happyMonadReduce 2# 3# happyReduction_12-happyReduction_12 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut11 happy_x_1 of { happy_var_1 -> -	case happyOut14 happy_x_2 of { happy_var_2 -> -	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef [] happy_var_1 [] happy_var_2))}}-	) (\r -> happyReturn (happyIn10 r))--happyReduce_13 = happyMonadReduce 3# 3# happyReduction_13-happyReduction_13 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut133 happy_x_1 of { happy_var_1 -> -	case happyOut11 happy_x_2 of { happy_var_2 -> -	case happyOut14 happy_x_3 of { happy_var_3 -> -	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (liftCAttrs happy_var_1) happy_var_2 [] happy_var_3))}}}-	) (\r -> happyReturn (happyIn10 r))--happyReduce_14 = happyMonadReduce 3# 3# happyReduction_14-happyReduction_14 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> -	case happyOut11 happy_x_2 of { happy_var_2 -> -	case happyOut14 happy_x_3 of { happy_var_3 -> -	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 [] happy_var_3))}}}-	) (\r -> happyReturn (happyIn10 r))--happyReduce_15 = happyMonadReduce 3# 3# happyReduction_15-happyReduction_15 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut44 happy_x_1 of { happy_var_1 -> -	case happyOut11 happy_x_2 of { happy_var_2 -> -	case happyOut14 happy_x_3 of { happy_var_3 -> -	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 [] happy_var_3))}}}-	) (\r -> happyReturn (happyIn10 r))--happyReduce_16 = happyMonadReduce 3# 3# happyReduction_16-happyReduction_16 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> -	case happyOut11 happy_x_2 of { happy_var_2 -> -	case happyOut14 happy_x_3 of { happy_var_3 -> -	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (reverse happy_var_1) happy_var_2 [] happy_var_3))}}}-	) (\r -> happyReturn (happyIn10 r))--happyReduce_17 = happyMonadReduce 3# 3# happyReduction_17-happyReduction_17 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> -	case happyOut11 happy_x_2 of { happy_var_2 -> -	case happyOut14 happy_x_3 of { happy_var_3 -> -	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (liftTypeQuals happy_var_1) happy_var_2 [] happy_var_3))}}}-	) (\r -> happyReturn (happyIn10 r))--happyReduce_18 = happyMonadReduce 4# 3# happyReduction_18-happyReduction_18 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> -	case happyOut133 happy_x_2 of { happy_var_2 -> -	case happyOut11 happy_x_3 of { happy_var_3 -> -	case happyOut14 happy_x_4 of { happy_var_4 -> -	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) happy_var_3 [] happy_var_4))}}}}-	) (\r -> happyReturn (happyIn10 r))--happyReduce_19 = happyMonadReduce 3# 3# happyReduction_19-happyReduction_19 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut79 happy_x_1 of { happy_var_1 -> -	case happyOut33 happy_x_2 of { happy_var_2 -> -	case happyOut14 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CFunDef [] happy_var_1 (reverse happy_var_2) happy_var_3)}}}-	) (\r -> happyReturn (happyIn10 r))--happyReduce_20 = happyMonadReduce 4# 3# happyReduction_20-happyReduction_20 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut133 happy_x_1 of { happy_var_1 -> -	case happyOut79 happy_x_2 of { happy_var_2 -> -	case happyOut33 happy_x_3 of { happy_var_3 -> -	case happyOut14 happy_x_4 of { happy_var_4 -> -	( withNodeInfo happy_var_2 $ CFunDef (liftCAttrs happy_var_1) happy_var_2 (reverse happy_var_3) happy_var_4)}}}}-	) (\r -> happyReturn (happyIn10 r))--happyReduce_21 = happyMonadReduce 4# 3# happyReduction_21-happyReduction_21 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> -	case happyOut79 happy_x_2 of { happy_var_2 -> -	case happyOut33 happy_x_3 of { happy_var_3 -> -	case happyOut14 happy_x_4 of { happy_var_4 -> -	( withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 (reverse happy_var_3) happy_var_4)}}}}-	) (\r -> happyReturn (happyIn10 r))--happyReduce_22 = happyMonadReduce 4# 3# happyReduction_22-happyReduction_22 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut44 happy_x_1 of { happy_var_1 -> -	case happyOut79 happy_x_2 of { happy_var_2 -> -	case happyOut33 happy_x_3 of { happy_var_3 -> -	case happyOut14 happy_x_4 of { happy_var_4 -> -	( withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 (reverse happy_var_3) happy_var_4)}}}}-	) (\r -> happyReturn (happyIn10 r))--happyReduce_23 = happyMonadReduce 4# 3# happyReduction_23-happyReduction_23 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> -	case happyOut79 happy_x_2 of { happy_var_2 -> -	case happyOut33 happy_x_3 of { happy_var_3 -> -	case happyOut14 happy_x_4 of { happy_var_4 -> -	( withNodeInfo happy_var_1 $ CFunDef (reverse happy_var_1) happy_var_2 (reverse happy_var_3) happy_var_4)}}}}-	) (\r -> happyReturn (happyIn10 r))--happyReduce_24 = happyMonadReduce 4# 3# happyReduction_24-happyReduction_24 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> -	case happyOut79 happy_x_2 of { happy_var_2 -> -	case happyOut33 happy_x_3 of { happy_var_3 -> -	case happyOut14 happy_x_4 of { happy_var_4 -> -	( withNodeInfo happy_var_1 $ CFunDef (liftTypeQuals happy_var_1) happy_var_2 (reverse happy_var_3) happy_var_4)}}}}-	) (\r -> happyReturn (happyIn10 r))--happyReduce_25 = happyMonadReduce 5# 3# happyReduction_25-happyReduction_25 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> -	case happyOut133 happy_x_2 of { happy_var_2 -> -	case happyOut79 happy_x_3 of { happy_var_3 -> -	case happyOut33 happy_x_4 of { happy_var_4 -> -	case happyOut14 happy_x_5 of { happy_var_5 -> -	( withNodeInfo happy_var_1 $ CFunDef (liftTypeQuals happy_var_1  ++ liftCAttrs happy_var_2) happy_var_3 (reverse happy_var_4) happy_var_5)}}}}}-	) (\r -> happyReturn (happyIn10 r))--happyReduce_26 = happyMonadReduce 1# 4# happyReduction_26-happyReduction_26 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut75 happy_x_1 of { happy_var_1 -> -	( let declr = reverseDeclr happy_var_1 in-  	   enterScope >> doFuncParamDeclIdent declr >> return declr)}-	) (\r -> happyReturn (happyIn11 r))--happyReduce_27 = happySpecReduce_1  5# happyReduction_27-happyReduction_27 happy_x_1-	 =  case happyOut13 happy_x_1 of { happy_var_1 -> -	happyIn12-		 (happy_var_1-	)}--happyReduce_28 = happySpecReduce_1  5# happyReduction_28-happyReduction_28 happy_x_1-	 =  case happyOut14 happy_x_1 of { happy_var_1 -> -	happyIn12-		 (happy_var_1-	)}--happyReduce_29 = happySpecReduce_1  5# happyReduction_29-happyReduction_29 happy_x_1-	 =  case happyOut22 happy_x_1 of { happy_var_1 -> -	happyIn12-		 (happy_var_1-	)}--happyReduce_30 = happySpecReduce_1  5# happyReduction_30-happyReduction_30 happy_x_1-	 =  case happyOut23 happy_x_1 of { happy_var_1 -> -	happyIn12-		 (happy_var_1-	)}--happyReduce_31 = happySpecReduce_1  5# happyReduction_31-happyReduction_31 happy_x_1-	 =  case happyOut24 happy_x_1 of { happy_var_1 -> -	happyIn12-		 (happy_var_1-	)}--happyReduce_32 = happySpecReduce_1  5# happyReduction_32-happyReduction_32 happy_x_1-	 =  case happyOut25 happy_x_1 of { happy_var_1 -> -	happyIn12-		 (happy_var_1-	)}--happyReduce_33 = happyMonadReduce 1# 5# happyReduction_33-happyReduction_33 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut26 happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 (CAsm happy_var_1))}-	) (\r -> happyReturn (happyIn12 r))--happyReduce_34 = happyMonadReduce 4# 6# happyReduction_34-happyReduction_34 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut131 happy_x_1 of { happy_var_1 -> -	case happyOut132 happy_x_3 of { happy_var_3 -> -	case happyOut12 happy_x_4 of { happy_var_4 -> -	( withNodeInfo happy_var_1 $ CLabel happy_var_1 happy_var_4 happy_var_3)}}}-	) (\r -> happyReturn (happyIn13 r))--happyReduce_35 = happyMonadReduce 4# 6# happyReduction_35-happyReduction_35 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut126 happy_x_2 of { happy_var_2 -> -	case happyOut12 happy_x_4 of { happy_var_4 -> -	( withNodeInfo happy_var_1 $ CCase happy_var_2 happy_var_4)}}}-	) (\r -> happyReturn (happyIn13 r))--happyReduce_36 = happyMonadReduce 3# 6# happyReduction_36-happyReduction_36 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut12 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CDefault happy_var_3)}}-	) (\r -> happyReturn (happyIn13 r))--happyReduce_37 = happyMonadReduce 6# 6# happyReduction_37-happyReduction_37 (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) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut126 happy_x_2 of { happy_var_2 -> -	case happyOut126 happy_x_4 of { happy_var_4 -> -	case happyOut12 happy_x_6 of { happy_var_6 -> -	( withNodeInfo happy_var_1 $ CCases happy_var_2 happy_var_4 happy_var_6)}}}}-	) (\r -> happyReturn (happyIn13 r))--happyReduce_38 = happyMonadReduce 5# 7# happyReduction_38-happyReduction_38 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut17 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CCompound [] (reverse happy_var_3))}}-	) (\r -> happyReturn (happyIn14 r))--happyReduce_39 = happyMonadReduce 6# 7# happyReduction_39-happyReduction_39 (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) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut21 happy_x_3 of { happy_var_3 -> -	case happyOut17 happy_x_4 of { happy_var_4 -> -	( withNodeInfo happy_var_1 $ CCompound (reverse happy_var_3) (reverse happy_var_4))}}}-	) (\r -> happyReturn (happyIn14 r))--happyReduce_40 = happyMonadReduce 0# 8# happyReduction_40-happyReduction_40 (happyRest) tk-	 = happyThen (( enterScope)-	) (\r -> happyReturn (happyIn15 r))--happyReduce_41 = happyMonadReduce 0# 9# happyReduction_41-happyReduction_41 (happyRest) tk-	 = happyThen (( leaveScope)-	) (\r -> happyReturn (happyIn16 r))--happyReduce_42 = happySpecReduce_0  10# happyReduction_42-happyReduction_42  =  happyIn17-		 (empty-	)--happyReduce_43 = happySpecReduce_2  10# happyReduction_43-happyReduction_43 happy_x_2-	happy_x_1-	 =  case happyOut17 happy_x_1 of { happy_var_1 -> -	case happyOut18 happy_x_2 of { happy_var_2 -> -	happyIn17-		 (happy_var_1 `snoc` happy_var_2-	)}}--happyReduce_44 = happySpecReduce_1  11# happyReduction_44-happyReduction_44 happy_x_1-	 =  case happyOut12 happy_x_1 of { happy_var_1 -> -	happyIn18-		 (CBlockStmt happy_var_1-	)}--happyReduce_45 = happySpecReduce_1  11# happyReduction_45-happyReduction_45 happy_x_1-	 =  case happyOut19 happy_x_1 of { happy_var_1 -> -	happyIn18-		 (happy_var_1-	)}--happyReduce_46 = happySpecReduce_1  12# happyReduction_46-happyReduction_46 happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	happyIn19-		 (CBlockDecl happy_var_1-	)}--happyReduce_47 = happySpecReduce_1  12# happyReduction_47-happyReduction_47 happy_x_1-	 =  case happyOut20 happy_x_1 of { happy_var_1 -> -	happyIn19-		 (CNestedFunDef happy_var_1-	)}--happyReduce_48 = happySpecReduce_2  12# happyReduction_48-happyReduction_48 happy_x_2-	happy_x_1-	 =  case happyOut19 happy_x_2 of { happy_var_2 -> -	happyIn19-		 (happy_var_2-	)}--happyReduce_49 = happyMonadReduce 3# 13# happyReduction_49-happyReduction_49 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> -	case happyOut11 happy_x_2 of { happy_var_2 -> -	case happyOut14 happy_x_3 of { happy_var_3 -> -	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 [] happy_var_3))}}}-	) (\r -> happyReturn (happyIn20 r))--happyReduce_50 = happyMonadReduce 3# 13# happyReduction_50-happyReduction_50 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut44 happy_x_1 of { happy_var_1 -> -	case happyOut11 happy_x_2 of { happy_var_2 -> -	case happyOut14 happy_x_3 of { happy_var_3 -> -	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 [] happy_var_3))}}}-	) (\r -> happyReturn (happyIn20 r))--happyReduce_51 = happyMonadReduce 3# 13# happyReduction_51-happyReduction_51 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> -	case happyOut11 happy_x_2 of { happy_var_2 -> -	case happyOut14 happy_x_3 of { happy_var_3 -> -	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (reverse happy_var_1) happy_var_2 [] happy_var_3))}}}-	) (\r -> happyReturn (happyIn20 r))--happyReduce_52 = happyMonadReduce 3# 13# happyReduction_52-happyReduction_52 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> -	case happyOut11 happy_x_2 of { happy_var_2 -> -	case happyOut14 happy_x_3 of { happy_var_3 -> -	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (liftTypeQuals happy_var_1) happy_var_2 [] happy_var_3))}}}-	) (\r -> happyReturn (happyIn20 r))--happyReduce_53 = happyMonadReduce 4# 13# happyReduction_53-happyReduction_53 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> -	case happyOut133 happy_x_2 of { happy_var_2 -> -	case happyOut11 happy_x_3 of { happy_var_3 -> -	case happyOut14 happy_x_4 of { happy_var_4 -> -	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) happy_var_3 [] happy_var_4))}}}}-	) (\r -> happyReturn (happyIn20 r))--happyReduce_54 = happySpecReduce_3  14# happyReduction_54-happyReduction_54 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut85 happy_x_2 of { happy_var_2 -> -	happyIn21-		 (happy_var_2-	)}--happyReduce_55 = happyReduce 4# 14# happyReduction_55-happyReduction_55 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut21 happy_x_1 of { happy_var_1 -> -	case happyOut85 happy_x_3 of { happy_var_3 -> -	happyIn21-		 (happy_var_1 `rappendr` happy_var_3-	) `HappyStk` happyRest}}--happyReduce_56 = happyMonadReduce 1# 15# happyReduction_56-happyReduction_56 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CExpr Nothing)}-	) (\r -> happyReturn (happyIn22 r))--happyReduce_57 = happyMonadReduce 2# 15# happyReduction_57-happyReduction_57 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut122 happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CExpr (Just happy_var_1))}-	) (\r -> happyReturn (happyIn22 r))--happyReduce_58 = happyMonadReduce 5# 16# happyReduction_58-happyReduction_58 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut122 happy_x_3 of { happy_var_3 -> -	case happyOut12 happy_x_5 of { happy_var_5 -> -	( withNodeInfo happy_var_1 $ CIf happy_var_3 happy_var_5 Nothing)}}}-	) (\r -> happyReturn (happyIn23 r))--happyReduce_59 = happyMonadReduce 7# 16# happyReduction_59-happyReduction_59 (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) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut122 happy_x_3 of { happy_var_3 -> -	case happyOut12 happy_x_5 of { happy_var_5 -> -	case happyOut12 happy_x_7 of { happy_var_7 -> -	( withNodeInfo happy_var_1 $ CIf happy_var_3 happy_var_5 (Just happy_var_7))}}}}-	) (\r -> happyReturn (happyIn23 r))--happyReduce_60 = happyMonadReduce 5# 16# happyReduction_60-happyReduction_60 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut122 happy_x_3 of { happy_var_3 -> -	case happyOut12 happy_x_5 of { happy_var_5 -> -	( withNodeInfo happy_var_1 $ CSwitch happy_var_3 happy_var_5)}}}-	) (\r -> happyReturn (happyIn23 r))--happyReduce_61 = happyMonadReduce 5# 17# happyReduction_61-happyReduction_61 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut122 happy_x_3 of { happy_var_3 -> -	case happyOut12 happy_x_5 of { happy_var_5 -> -	( withNodeInfo happy_var_1 $ CWhile happy_var_3 happy_var_5 False)}}}-	) (\r -> happyReturn (happyIn24 r))--happyReduce_62 = happyMonadReduce 7# 17# happyReduction_62-happyReduction_62 (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) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut12 happy_x_2 of { happy_var_2 -> -	case happyOut122 happy_x_5 of { happy_var_5 -> -	( withNodeInfo happy_var_1 $ CWhile happy_var_5 happy_var_2 True)}}}-	) (\r -> happyReturn (happyIn24 r))--happyReduce_63 = happyMonadReduce 9# 17# happyReduction_63-happyReduction_63 (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) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut124 happy_x_3 of { happy_var_3 -> -	case happyOut124 happy_x_5 of { happy_var_5 -> -	case happyOut124 happy_x_7 of { happy_var_7 -> -	case happyOut12 happy_x_9 of { happy_var_9 -> -	( withNodeInfo happy_var_1 $ CFor (Left happy_var_3) happy_var_5 happy_var_7 happy_var_9)}}}}}-	) (\r -> happyReturn (happyIn24 r))--happyReduce_64 = happyMonadReduce 10# 17# happyReduction_64-happyReduction_64 (happy_x_10 `HappyStk`-	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) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut32 happy_x_4 of { happy_var_4 -> -	case happyOut124 happy_x_5 of { happy_var_5 -> -	case happyOut124 happy_x_7 of { happy_var_7 -> -	case happyOut12 happy_x_9 of { happy_var_9 -> -	( withNodeInfo happy_var_1 $ CFor (Right happy_var_4) happy_var_5 happy_var_7 happy_var_9)}}}}}-	) (\r -> happyReturn (happyIn24 r))--happyReduce_65 = happyMonadReduce 3# 18# happyReduction_65-happyReduction_65 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut131 happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_1 $ CGoto happy_var_2)}}-	) (\r -> happyReturn (happyIn25 r))--happyReduce_66 = happyMonadReduce 4# 18# happyReduction_66-happyReduction_66 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut122 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CGotoPtr happy_var_3)}}-	) (\r -> happyReturn (happyIn25 r))--happyReduce_67 = happyMonadReduce 2# 18# happyReduction_67-happyReduction_67 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CCont)}-	) (\r -> happyReturn (happyIn25 r))--happyReduce_68 = happyMonadReduce 2# 18# happyReduction_68-happyReduction_68 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CBreak)}-	) (\r -> happyReturn (happyIn25 r))--happyReduce_69 = happyMonadReduce 3# 18# happyReduction_69-happyReduction_69 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut124 happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_1 $ CReturn happy_var_2)}}-	) (\r -> happyReturn (happyIn25 r))--happyReduce_70 = happyMonadReduce 6# 19# happyReduction_70-happyReduction_70 (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) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut27 happy_x_2 of { happy_var_2 -> -	case happyOut128 happy_x_4 of { happy_var_4 -> -	( withNodeInfo happy_var_1 $ CAsmStmt happy_var_2 happy_var_4 [] [] [])}}}-	) (\r -> happyReturn (happyIn26 r))--happyReduce_71 = happyMonadReduce 8# 19# happyReduction_71-happyReduction_71 (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) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut27 happy_x_2 of { happy_var_2 -> -	case happyOut128 happy_x_4 of { happy_var_4 -> -	case happyOut28 happy_x_6 of { happy_var_6 -> -	( withNodeInfo happy_var_1 $ CAsmStmt happy_var_2 happy_var_4 happy_var_6 [] [])}}}}-	) (\r -> happyReturn (happyIn26 r))--happyReduce_72 = happyMonadReduce 10# 19# happyReduction_72-happyReduction_72 (happy_x_10 `HappyStk`-	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) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut27 happy_x_2 of { happy_var_2 -> -	case happyOut128 happy_x_4 of { happy_var_4 -> -	case happyOut28 happy_x_6 of { happy_var_6 -> -	case happyOut28 happy_x_8 of { happy_var_8 -> -	( withNodeInfo happy_var_1 $ CAsmStmt happy_var_2 happy_var_4 happy_var_6 happy_var_8 [])}}}}}-	) (\r -> happyReturn (happyIn26 r))--happyReduce_73 = happyMonadReduce 12# 19# happyReduction_73-happyReduction_73 (happy_x_12 `HappyStk`-	happy_x_11 `HappyStk`-	happy_x_10 `HappyStk`-	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) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut27 happy_x_2 of { happy_var_2 -> -	case happyOut128 happy_x_4 of { happy_var_4 -> -	case happyOut28 happy_x_6 of { happy_var_6 -> -	case happyOut28 happy_x_8 of { happy_var_8 -> -	case happyOut31 happy_x_10 of { happy_var_10 -> -	( withNodeInfo happy_var_1 $ CAsmStmt happy_var_2 happy_var_4 happy_var_6 happy_var_8 (reverse happy_var_10))}}}}}}-	) (\r -> happyReturn (happyIn26 r))--happyReduce_74 = happySpecReduce_0  20# happyReduction_74-happyReduction_74  =  happyIn27-		 (Nothing-	)--happyReduce_75 = happySpecReduce_1  20# happyReduction_75-happyReduction_75 happy_x_1-	 =  case happyOut64 happy_x_1 of { happy_var_1 -> -	happyIn27-		 (Just happy_var_1-	)}--happyReduce_76 = happySpecReduce_0  21# happyReduction_76-happyReduction_76  =  happyIn28-		 ([]-	)--happyReduce_77 = happySpecReduce_1  21# happyReduction_77-happyReduction_77 happy_x_1-	 =  case happyOut29 happy_x_1 of { happy_var_1 -> -	happyIn28-		 (reverse happy_var_1-	)}--happyReduce_78 = happySpecReduce_1  22# happyReduction_78-happyReduction_78 happy_x_1-	 =  case happyOut30 happy_x_1 of { happy_var_1 -> -	happyIn29-		 (singleton happy_var_1-	)}--happyReduce_79 = happySpecReduce_3  22# happyReduction_79-happyReduction_79 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut29 happy_x_1 of { happy_var_1 -> -	case happyOut30 happy_x_3 of { happy_var_3 -> -	happyIn29-		 (happy_var_1 `snoc` happy_var_3-	)}}--happyReduce_80 = happyMonadReduce 4# 23# happyReduction_80-happyReduction_80 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut128 happy_x_1 of { happy_var_1 -> -	case happyOut122 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CAsmOperand Nothing happy_var_1 happy_var_3)}}-	) (\r -> happyReturn (happyIn30 r))--happyReduce_81 = happyMonadReduce 7# 23# happyReduction_81-happyReduction_81 (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) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { (CTokIdent  _ happy_var_2) -> -	case happyOut128 happy_x_4 of { happy_var_4 -> -	case happyOut122 happy_x_6 of { happy_var_6 -> -	( withNodeInfo happy_var_1 $ CAsmOperand (Just happy_var_2) happy_var_4 happy_var_6)}}}}-	) (\r -> happyReturn (happyIn30 r))--happyReduce_82 = happyMonadReduce 7# 23# happyReduction_82-happyReduction_82 (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) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { (CTokTyIdent _ happy_var_2) -> -	case happyOut128 happy_x_4 of { happy_var_4 -> -	case happyOut122 happy_x_6 of { happy_var_6 -> -	( withNodeInfo happy_var_1 $ CAsmOperand (Just happy_var_2) happy_var_4 happy_var_6)}}}}-	) (\r -> happyReturn (happyIn30 r))--happyReduce_83 = happySpecReduce_1  24# happyReduction_83-happyReduction_83 happy_x_1-	 =  case happyOut128 happy_x_1 of { happy_var_1 -> -	happyIn31-		 (singleton happy_var_1-	)}--happyReduce_84 = happySpecReduce_3  24# happyReduction_84-happyReduction_84 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut31 happy_x_1 of { happy_var_1 -> -	case happyOut128 happy_x_3 of { happy_var_3 -> -	happyIn31-		 (happy_var_1 `snoc` happy_var_3-	)}}--happyReduce_85 = happyMonadReduce 2# 25# happyReduction_85-happyReduction_85 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut48 happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CDecl (reverse happy_var_1) [])}-	) (\r -> happyReturn (happyIn32 r))--happyReduce_86 = happyMonadReduce 2# 25# happyReduction_86-happyReduction_86 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut49 happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CDecl (reverse happy_var_1) [])}-	) (\r -> happyReturn (happyIn32 r))--happyReduce_87 = happyMonadReduce 2# 25# happyReduction_87-happyReduction_87 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut36 happy_x_1 of { happy_var_1 -> -	( case happy_var_1 of CDecl declspecs dies at -> withLength at (CDecl declspecs (List.reverse dies)))}-	) (\r -> happyReturn (happyIn32 r))--happyReduce_88 = happyMonadReduce 2# 25# happyReduction_88-happyReduction_88 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut34 happy_x_1 of { happy_var_1 -> -	( case happy_var_1 of CDecl declspecs dies at -> withLength at (CDecl declspecs (List.reverse dies)))}-	) (\r -> happyReturn (happyIn32 r))--happyReduce_89 = happyMonadReduce 7# 25# happyReduction_89-happyReduction_89 (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) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut126 happy_x_3 of { happy_var_3 -> -	case happyOut128 happy_x_5 of { happy_var_5 -> -	( withNodeInfo happy_var_1 $ CStaticAssert happy_var_3 happy_var_5)}}}-	) (\r -> happyReturn (happyIn32 r))--happyReduce_90 = happySpecReduce_0  26# happyReduction_90-happyReduction_90  =  happyIn33-		 (empty-	)--happyReduce_91 = happySpecReduce_2  26# happyReduction_91-happyReduction_91 happy_x_2-	happy_x_1-	 =  case happyOut33 happy_x_1 of { happy_var_1 -> -	case happyOut32 happy_x_2 of { happy_var_2 -> -	happyIn33-		 (happy_var_1 `snoc` happy_var_2-	)}}--happyReduce_92 = happyMonadReduce 4# 27# happyReduction_92-happyReduction_92 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> -	case happyOut75 happy_x_2 of { happy_var_2 -> -	case happyOut35 happy_x_3 of { happy_var_3 -> -	case happyOut94 happy_x_4 of { happy_var_4 -> -	( let declspecs = reverse happy_var_1 in-  	   do{ declr <- withAsmNameAttrs happy_var_3 happy_var_2-           ; doDeclIdent declspecs declr-           ; withNodeInfo happy_var_1 $-                CDecl declspecs [(Just (reverseDeclr declr), happy_var_4, Nothing)] })}}}}-	) (\r -> happyReturn (happyIn34 r))--happyReduce_93 = happyMonadReduce 4# 27# happyReduction_93-happyReduction_93 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> -	case happyOut75 happy_x_2 of { happy_var_2 -> -	case happyOut35 happy_x_3 of { happy_var_3 -> -	case happyOut94 happy_x_4 of { happy_var_4 -> -	( let declspecs = liftTypeQuals happy_var_1 in-  	   do{ declr <- withAsmNameAttrs happy_var_3 happy_var_2-           ; doDeclIdent declspecs declr-           ; withNodeInfo happy_var_1 $ CDecl declspecs [(Just (reverseDeclr declr), happy_var_4, Nothing)] })}}}}-	) (\r -> happyReturn (happyIn34 r))--happyReduce_94 = happyMonadReduce 5# 27# happyReduction_94-happyReduction_94 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> -	case happyOut133 happy_x_2 of { happy_var_2 -> -	case happyOut75 happy_x_3 of { happy_var_3 -> -	case happyOut35 happy_x_4 of { happy_var_4 -> -	case happyOut94 happy_x_5 of { happy_var_5 -> -	( let declspecs = liftTypeQuals happy_var_1 in-  	   do{ declr <- withAsmNameAttrs happy_var_4 happy_var_3-           ; doDeclIdent declspecs declr-           ; withNodeInfo happy_var_1 $ CDecl (declspecs ++ liftCAttrs happy_var_2) [(Just (reverseDeclr declr), happy_var_5, Nothing)] })}}}}}-	) (\r -> happyReturn (happyIn34 r))--happyReduce_95 = happyMonadReduce 4# 27# happyReduction_95-happyReduction_95 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut133 happy_x_1 of { happy_var_1 -> -	case happyOut75 happy_x_2 of { happy_var_2 -> -	case happyOut35 happy_x_3 of { happy_var_3 -> -	case happyOut94 happy_x_4 of { happy_var_4 -> -	( let declspecs = liftCAttrs happy_var_1 in-       do{ declr <- withAsmNameAttrs happy_var_3 happy_var_2-           ; doDeclIdent declspecs declr-           ; withNodeInfo happy_var_1 $ CDecl declspecs [(Just (reverseDeclr declr), happy_var_4, Nothing)] })}}}}-	) (\r -> happyReturn (happyIn34 r))--happyReduce_96 = happyMonadReduce 6# 27# happyReduction_96-happyReduction_96 (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) tk-	 = happyThen (case happyOut34 happy_x_1 of { happy_var_1 -> -	case happyOut132 happy_x_3 of { happy_var_3 -> -	case happyOut75 happy_x_4 of { happy_var_4 -> -	case happyOut35 happy_x_5 of { happy_var_5 -> -	case happyOut94 happy_x_6 of { happy_var_6 -> -	( case happy_var_1 of-             CDecl declspecs dies at -> do-               declr <- withAsmNameAttrs (fst happy_var_5, snd happy_var_5 ++ happy_var_3) happy_var_4-               doDeclIdent declspecs declr-               withLength at $ CDecl declspecs ((Just (reverseDeclr declr), happy_var_6, Nothing) : dies))}}}}}-	) (\r -> happyReturn (happyIn34 r))--happyReduce_97 = happySpecReduce_2  28# happyReduction_97-happyReduction_97 happy_x_2-	happy_x_1-	 =  case happyOut67 happy_x_1 of { happy_var_1 -> -	case happyOut132 happy_x_2 of { happy_var_2 -> -	happyIn35-		 ((happy_var_1,happy_var_2)-	)}}--happyReduce_98 = happyMonadReduce 4# 29# happyReduction_98-happyReduction_98 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> -	case happyOut66 happy_x_2 of { happy_var_2 -> -	case happyOut35 happy_x_3 of { happy_var_3 -> -	case happyOut94 happy_x_4 of { happy_var_4 -> -	( do{-  	   declr <- withAsmNameAttrs happy_var_3 happy_var_2;-  	   doDeclIdent happy_var_1 declr;-       withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr declr), happy_var_4, Nothing)] })}}}}-	) (\r -> happyReturn (happyIn36 r))--happyReduce_99 = happyMonadReduce 4# 29# happyReduction_99-happyReduction_99 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut44 happy_x_1 of { happy_var_1 -> -	case happyOut66 happy_x_2 of { happy_var_2 -> -	case happyOut35 happy_x_3 of { happy_var_3 -> -	case happyOut94 happy_x_4 of { happy_var_4 -> -	( do{-  	   declr <- withAsmNameAttrs happy_var_3 happy_var_2;-  	   doDeclIdent happy_var_1 declr;-       withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr declr), happy_var_4, Nothing)] })}}}}-	) (\r -> happyReturn (happyIn36 r))--happyReduce_100 = happyMonadReduce 6# 29# happyReduction_100-happyReduction_100 (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) tk-	 = happyThen (case happyOut36 happy_x_1 of { happy_var_1 -> -	case happyOut132 happy_x_3 of { happy_var_3 -> -	case happyOut66 happy_x_4 of { happy_var_4 -> -	case happyOut35 happy_x_5 of { happy_var_5 -> -	case happyOut94 happy_x_6 of { happy_var_6 -> -	( case happy_var_1 of-             CDecl declspecs dies at -> do-               declr <- withAsmNameAttrs (fst happy_var_5, snd happy_var_5 ++ happy_var_3) happy_var_4-               doDeclIdent declspecs declr-               return (CDecl declspecs ((Just (reverseDeclr declr), happy_var_6, Nothing) : dies) at))}}}}}-	) (\r -> happyReturn (happyIn36 r))--happyReduce_101 = happySpecReduce_1  30# happyReduction_101-happyReduction_101 happy_x_1-	 =  case happyOut46 happy_x_1 of { happy_var_1 -> -	happyIn37-		 (reverse happy_var_1-	)}--happyReduce_102 = happySpecReduce_1  30# happyReduction_102-happyReduction_102 happy_x_1-	 =  case happyOut48 happy_x_1 of { happy_var_1 -> -	happyIn37-		 (reverse happy_var_1-	)}--happyReduce_103 = happySpecReduce_1  30# happyReduction_103-happyReduction_103 happy_x_1-	 =  case happyOut50 happy_x_1 of { happy_var_1 -> -	happyIn37-		 (reverse happy_var_1-	)}--happyReduce_104 = happySpecReduce_1  31# happyReduction_104-happyReduction_104 happy_x_1-	 =  case happyOut40 happy_x_1 of { happy_var_1 -> -	happyIn38-		 (singleton happy_var_1-	)}--happyReduce_105 = happySpecReduce_2  31# happyReduction_105-happyReduction_105 happy_x_2-	happy_x_1-	 =  case happyOut133 happy_x_1 of { happy_var_1 -> -	case happyOut40 happy_x_2 of { happy_var_2 -> -	happyIn38-		 (reverseList (liftCAttrs happy_var_1) `snoc` happy_var_2-	)}}--happyReduce_106 = happySpecReduce_2  31# happyReduction_106-happyReduction_106 happy_x_2-	happy_x_1-	 =  case happyOut65 happy_x_1 of { happy_var_1 -> -	case happyOut40 happy_x_2 of { happy_var_2 -> -	happyIn38-		 (rmap CTypeQual happy_var_1 `snoc` happy_var_2-	)}}--happyReduce_107 = happySpecReduce_3  31# happyReduction_107-happyReduction_107 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut65 happy_x_1 of { happy_var_1 -> -	case happyOut133 happy_x_2 of { happy_var_2 -> -	case happyOut40 happy_x_3 of { happy_var_3 -> -	happyIn38-		 ((rmap CTypeQual happy_var_1 `rappend` liftCAttrs happy_var_2) `snoc` happy_var_3-	)}}}--happyReduce_108 = happySpecReduce_2  31# happyReduction_108-happyReduction_108 happy_x_2-	happy_x_1-	 =  case happyOut38 happy_x_1 of { happy_var_1 -> -	case happyOut39 happy_x_2 of { happy_var_2 -> -	happyIn38-		 (happy_var_1 `snoc` happy_var_2-	)}}--happyReduce_109 = happySpecReduce_2  31# happyReduction_109-happyReduction_109 happy_x_2-	happy_x_1-	 =  case happyOut38 happy_x_1 of { happy_var_1 -> -	case happyOut134 happy_x_2 of { happy_var_2 -> -	happyIn38-		 (addTrailingAttrs happy_var_1 happy_var_2-	)}}--happyReduce_110 = happySpecReduce_1  32# happyReduction_110-happyReduction_110 happy_x_1-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> -	happyIn39-		 (CStorageSpec happy_var_1-	)}--happyReduce_111 = happySpecReduce_1  32# happyReduction_111-happyReduction_111 happy_x_1-	 =  case happyOut64 happy_x_1 of { happy_var_1 -> -	happyIn39-		 (CTypeQual happy_var_1-	)}--happyReduce_112 = happySpecReduce_1  32# happyReduction_112-happyReduction_112 happy_x_1-	 =  case happyOut42 happy_x_1 of { happy_var_1 -> -	happyIn39-		 (CFunSpec happy_var_1-	)}--happyReduce_113 = happySpecReduce_1  32# happyReduction_113-happyReduction_113 happy_x_1-	 =  case happyOut43 happy_x_1 of { happy_var_1 -> -	happyIn39-		 (CAlignSpec happy_var_1-	)}--happyReduce_114 = happySpecReduce_1  33# happyReduction_114-happyReduction_114 happy_x_1-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> -	happyIn40-		 (CStorageSpec happy_var_1-	)}--happyReduce_115 = happySpecReduce_1  33# happyReduction_115-happyReduction_115 happy_x_1-	 =  case happyOut42 happy_x_1 of { happy_var_1 -> -	happyIn40-		 (CFunSpec happy_var_1-	)}--happyReduce_116 = happySpecReduce_1  33# happyReduction_116-happyReduction_116 happy_x_1-	 =  case happyOut43 happy_x_1 of { happy_var_1 -> -	happyIn40-		 (CAlignSpec happy_var_1-	)}--happyReduce_117 = happyMonadReduce 1# 34# happyReduction_117-happyReduction_117 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CTypedef)}-	) (\r -> happyReturn (happyIn41 r))--happyReduce_118 = happyMonadReduce 1# 34# happyReduction_118-happyReduction_118 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CExtern)}-	) (\r -> happyReturn (happyIn41 r))--happyReduce_119 = happyMonadReduce 1# 34# happyReduction_119-happyReduction_119 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CStatic)}-	) (\r -> happyReturn (happyIn41 r))--happyReduce_120 = happyMonadReduce 1# 34# happyReduction_120-happyReduction_120 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CAuto)}-	) (\r -> happyReturn (happyIn41 r))--happyReduce_121 = happyMonadReduce 1# 34# happyReduction_121-happyReduction_121 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CRegister)}-	) (\r -> happyReturn (happyIn41 r))--happyReduce_122 = happyMonadReduce 1# 34# happyReduction_122-happyReduction_122 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CThread)}-	) (\r -> happyReturn (happyIn41 r))--happyReduce_123 = happyMonadReduce 1# 35# happyReduction_123-happyReduction_123 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CInlineQual)}-	) (\r -> happyReturn (happyIn42 r))--happyReduce_124 = happyMonadReduce 1# 35# happyReduction_124-happyReduction_124 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CNoreturnQual)}-	) (\r -> happyReturn (happyIn42 r))--happyReduce_125 = happyMonadReduce 4# 36# happyReduction_125-happyReduction_125 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut86 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CAlignAsType happy_var_3)}}-	) (\r -> happyReturn (happyIn43 r))--happyReduce_126 = happyMonadReduce 4# 36# happyReduction_126-happyReduction_126 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut126 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CAlignAsExpr happy_var_3)}}-	) (\r -> happyReturn (happyIn43 r))--happyReduce_127 = happySpecReduce_1  37# happyReduction_127-happyReduction_127 happy_x_1-	 =  case happyOut47 happy_x_1 of { happy_var_1 -> -	happyIn44-		 (reverse happy_var_1-	)}--happyReduce_128 = happySpecReduce_1  37# happyReduction_128-happyReduction_128 happy_x_1-	 =  case happyOut49 happy_x_1 of { happy_var_1 -> -	happyIn44-		 (reverse happy_var_1-	)}--happyReduce_129 = happySpecReduce_1  37# happyReduction_129-happyReduction_129 happy_x_1-	 =  case happyOut51 happy_x_1 of { happy_var_1 -> -	happyIn44-		 (reverse happy_var_1-	)}--happyReduce_130 = happyMonadReduce 1# 38# happyReduction_130-happyReduction_130 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CVoidType)}-	) (\r -> happyReturn (happyIn45 r))--happyReduce_131 = happyMonadReduce 1# 38# happyReduction_131-happyReduction_131 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CCharType)}-	) (\r -> happyReturn (happyIn45 r))--happyReduce_132 = happyMonadReduce 1# 38# happyReduction_132-happyReduction_132 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CShortType)}-	) (\r -> happyReturn (happyIn45 r))--happyReduce_133 = happyMonadReduce 1# 38# happyReduction_133-happyReduction_133 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CIntType)}-	) (\r -> happyReturn (happyIn45 r))--happyReduce_134 = happyMonadReduce 1# 38# happyReduction_134-happyReduction_134 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CLongType)}-	) (\r -> happyReturn (happyIn45 r))--happyReduce_135 = happyMonadReduce 1# 38# happyReduction_135-happyReduction_135 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CFloatType)}-	) (\r -> happyReturn (happyIn45 r))--happyReduce_136 = happyMonadReduce 1# 38# happyReduction_136-happyReduction_136 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CDoubleType)}-	) (\r -> happyReturn (happyIn45 r))--happyReduce_137 = happyMonadReduce 1# 38# happyReduction_137-happyReduction_137 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CSignedType)}-	) (\r -> happyReturn (happyIn45 r))--happyReduce_138 = happyMonadReduce 1# 38# happyReduction_138-happyReduction_138 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CUnsigType)}-	) (\r -> happyReturn (happyIn45 r))--happyReduce_139 = happyMonadReduce 1# 38# happyReduction_139-happyReduction_139 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CBoolType)}-	) (\r -> happyReturn (happyIn45 r))--happyReduce_140 = happyMonadReduce 1# 38# happyReduction_140-happyReduction_140 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CComplexType)}-	) (\r -> happyReturn (happyIn45 r))--happyReduce_141 = happyMonadReduce 1# 38# happyReduction_141-happyReduction_141 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CInt128Type)}-	) (\r -> happyReturn (happyIn45 r))--happyReduce_142 = happyMonadReduce 1# 38# happyReduction_142-happyReduction_142 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CFloat128Type)}-	) (\r -> happyReturn (happyIn45 r))--happyReduce_143 = happyMonadReduce 1# 38# happyReduction_143-happyReduction_143 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CFloat128Type)}-	) (\r -> happyReturn (happyIn45 r))--happyReduce_144 = happySpecReduce_2  39# happyReduction_144-happyReduction_144 happy_x_2-	happy_x_1-	 =  case happyOut38 happy_x_1 of { happy_var_1 -> -	case happyOut45 happy_x_2 of { happy_var_2 -> -	happyIn46-		 (happy_var_1 `snoc` CTypeSpec happy_var_2-	)}}--happyReduce_145 = happySpecReduce_2  39# happyReduction_145-happyReduction_145 happy_x_2-	happy_x_1-	 =  case happyOut47 happy_x_1 of { happy_var_1 -> -	case happyOut41 happy_x_2 of { happy_var_2 -> -	happyIn46-		 (happy_var_1 `snoc` CStorageSpec happy_var_2-	)}}--happyReduce_146 = happySpecReduce_2  39# happyReduction_146-happyReduction_146 happy_x_2-	happy_x_1-	 =  case happyOut46 happy_x_1 of { happy_var_1 -> -	case happyOut39 happy_x_2 of { happy_var_2 -> -	happyIn46-		 (happy_var_1 `snoc` happy_var_2-	)}}--happyReduce_147 = happySpecReduce_2  39# happyReduction_147-happyReduction_147 happy_x_2-	happy_x_1-	 =  case happyOut46 happy_x_1 of { happy_var_1 -> -	case happyOut45 happy_x_2 of { happy_var_2 -> -	happyIn46-		 (happy_var_1 `snoc` CTypeSpec happy_var_2-	)}}--happyReduce_148 = happySpecReduce_2  39# happyReduction_148-happyReduction_148 happy_x_2-	happy_x_1-	 =  case happyOut46 happy_x_1 of { happy_var_1 -> -	case happyOut134 happy_x_2 of { happy_var_2 -> -	happyIn46-		 (addTrailingAttrs happy_var_1 happy_var_2-	)}}--happyReduce_149 = happySpecReduce_1  40# happyReduction_149-happyReduction_149 happy_x_1-	 =  case happyOut45 happy_x_1 of { happy_var_1 -> -	happyIn47-		 (singleton (CTypeSpec happy_var_1)-	)}--happyReduce_150 = happySpecReduce_2  40# happyReduction_150-happyReduction_150 happy_x_2-	happy_x_1-	 =  case happyOut133 happy_x_1 of { happy_var_1 -> -	case happyOut45 happy_x_2 of { happy_var_2 -> -	happyIn47-		 ((reverseList $ liftCAttrs happy_var_1) `snoc` (CTypeSpec happy_var_2)-	)}}--happyReduce_151 = happySpecReduce_2  40# happyReduction_151-happyReduction_151 happy_x_2-	happy_x_1-	 =  case happyOut65 happy_x_1 of { happy_var_1 -> -	case happyOut45 happy_x_2 of { happy_var_2 -> -	happyIn47-		 (rmap CTypeQual happy_var_1 `snoc` CTypeSpec happy_var_2-	)}}--happyReduce_152 = happySpecReduce_3  40# happyReduction_152-happyReduction_152 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut65 happy_x_1 of { happy_var_1 -> -	case happyOut133 happy_x_2 of { happy_var_2 -> -	case happyOut45 happy_x_3 of { happy_var_3 -> -	happyIn47-		 (rmap CTypeQual happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec happy_var_3-	)}}}--happyReduce_153 = happySpecReduce_2  40# happyReduction_153-happyReduction_153 happy_x_2-	happy_x_1-	 =  case happyOut47 happy_x_1 of { happy_var_1 -> -	case happyOut64 happy_x_2 of { happy_var_2 -> -	happyIn47-		 (happy_var_1 `snoc` CTypeQual happy_var_2-	)}}--happyReduce_154 = happySpecReduce_2  40# happyReduction_154-happyReduction_154 happy_x_2-	happy_x_1-	 =  case happyOut47 happy_x_1 of { happy_var_1 -> -	case happyOut45 happy_x_2 of { happy_var_2 -> -	happyIn47-		 (happy_var_1 `snoc` CTypeSpec happy_var_2-	)}}--happyReduce_155 = happySpecReduce_2  40# happyReduction_155-happyReduction_155 happy_x_2-	happy_x_1-	 =  case happyOut47 happy_x_1 of { happy_var_1 -> -	case happyOut134 happy_x_2 of { happy_var_2 -> -	happyIn47-		 (addTrailingAttrs happy_var_1 happy_var_2-	)}}--happyReduce_156 = happySpecReduce_2  41# happyReduction_156-happyReduction_156 happy_x_2-	happy_x_1-	 =  case happyOut38 happy_x_1 of { happy_var_1 -> -	case happyOut52 happy_x_2 of { happy_var_2 -> -	happyIn48-		 (happy_var_1 `snoc` CTypeSpec happy_var_2-	)}}--happyReduce_157 = happySpecReduce_2  41# happyReduction_157-happyReduction_157 happy_x_2-	happy_x_1-	 =  case happyOut49 happy_x_1 of { happy_var_1 -> -	case happyOut41 happy_x_2 of { happy_var_2 -> -	happyIn48-		 (happy_var_1 `snoc` CStorageSpec happy_var_2-	)}}--happyReduce_158 = happySpecReduce_2  41# happyReduction_158-happyReduction_158 happy_x_2-	happy_x_1-	 =  case happyOut48 happy_x_1 of { happy_var_1 -> -	case happyOut39 happy_x_2 of { happy_var_2 -> -	happyIn48-		 (happy_var_1 `snoc` happy_var_2-	)}}--happyReduce_159 = happySpecReduce_2  41# happyReduction_159-happyReduction_159 happy_x_2-	happy_x_1-	 =  case happyOut48 happy_x_1 of { happy_var_1 -> -	case happyOut134 happy_x_2 of { happy_var_2 -> -	happyIn48-		 (addTrailingAttrs happy_var_1 happy_var_2-	)}}--happyReduce_160 = happySpecReduce_1  42# happyReduction_160-happyReduction_160 happy_x_1-	 =  case happyOut52 happy_x_1 of { happy_var_1 -> -	happyIn49-		 (singleton (CTypeSpec happy_var_1)-	)}--happyReduce_161 = happySpecReduce_2  42# happyReduction_161-happyReduction_161 happy_x_2-	happy_x_1-	 =  case happyOut133 happy_x_1 of { happy_var_1 -> -	case happyOut52 happy_x_2 of { happy_var_2 -> -	happyIn49-		 ((reverseList $ liftCAttrs happy_var_1) `snoc` (CTypeSpec happy_var_2)-	)}}--happyReduce_162 = happySpecReduce_2  42# happyReduction_162-happyReduction_162 happy_x_2-	happy_x_1-	 =  case happyOut65 happy_x_1 of { happy_var_1 -> -	case happyOut52 happy_x_2 of { happy_var_2 -> -	happyIn49-		 (rmap CTypeQual happy_var_1 `snoc` CTypeSpec happy_var_2-	)}}--happyReduce_163 = happySpecReduce_3  42# happyReduction_163-happyReduction_163 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut65 happy_x_1 of { happy_var_1 -> -	case happyOut133 happy_x_2 of { happy_var_2 -> -	case happyOut52 happy_x_3 of { happy_var_3 -> -	happyIn49-		 (rmap CTypeQual  happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec happy_var_3-	)}}}--happyReduce_164 = happySpecReduce_2  42# happyReduction_164-happyReduction_164 happy_x_2-	happy_x_1-	 =  case happyOut49 happy_x_1 of { happy_var_1 -> -	case happyOut64 happy_x_2 of { happy_var_2 -> -	happyIn49-		 (happy_var_1 `snoc` CTypeQual happy_var_2-	)}}--happyReduce_165 = happySpecReduce_2  42# happyReduction_165-happyReduction_165 happy_x_2-	happy_x_1-	 =  case happyOut49 happy_x_1 of { happy_var_1 -> -	case happyOut134 happy_x_2 of { happy_var_2 -> -	happyIn49-		 (addTrailingAttrs happy_var_1 happy_var_2-	)}}--happyReduce_166 = happySpecReduce_2  43# happyReduction_166-happyReduction_166 happy_x_2-	happy_x_1-	 =  case happyOut51 happy_x_1 of { happy_var_1 -> -	case happyOut41 happy_x_2 of { happy_var_2 -> -	happyIn50-		 (happy_var_1 `snoc` CStorageSpec happy_var_2-	)}}--happyReduce_167 = happyMonadReduce 2# 43# happyReduction_167-happyReduction_167 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { (CTokTyIdent _ happy_var_2) -> -	( withNodeInfo happy_var_2 $ \at -> happy_var_1 `snoc` CTypeSpec (CTypeDef happy_var_2 at))}}-	) (\r -> happyReturn (happyIn50 r))--happyReduce_168 = happyMonadReduce 5# 43# happyReduction_168-happyReduction_168 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 -> -	case happyOut122 happy_x_4 of { happy_var_4 -> -	( withNodeInfo happy_var_2 $ \at -> happy_var_1 `snoc` CTypeSpec (CTypeOfExpr happy_var_4 at))}}}-	) (\r -> happyReturn (happyIn50 r))--happyReduce_169 = happyMonadReduce 5# 43# happyReduction_169-happyReduction_169 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 -> -	case happyOut86 happy_x_4 of { happy_var_4 -> -	( withNodeInfo happy_var_2 $ \at -> happy_var_1 `snoc` CTypeSpec (CTypeOfType happy_var_4 at))}}}-	) (\r -> happyReturn (happyIn50 r))--happyReduce_170 = happySpecReduce_2  43# happyReduction_170-happyReduction_170 happy_x_2-	happy_x_1-	 =  case happyOut50 happy_x_1 of { happy_var_1 -> -	case happyOut39 happy_x_2 of { happy_var_2 -> -	happyIn50-		 (happy_var_1 `snoc` happy_var_2-	)}}--happyReduce_171 = happySpecReduce_2  43# happyReduction_171-happyReduction_171 happy_x_2-	happy_x_1-	 =  case happyOut50 happy_x_1 of { happy_var_1 -> -	case happyOut134 happy_x_2 of { happy_var_2 -> -	happyIn50-		 (addTrailingAttrs happy_var_1 happy_var_2-	)}}--happyReduce_172 = happyMonadReduce 1# 44# happyReduction_172-happyReduction_172 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { (CTokTyIdent _ happy_var_1) -> -	( withNodeInfo happy_var_1 $ \at -> singleton (CTypeSpec (CTypeDef happy_var_1 at)))}-	) (\r -> happyReturn (happyIn51 r))--happyReduce_173 = happyMonadReduce 4# 44# happyReduction_173-happyReduction_173 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut122 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ \at -> singleton (CTypeSpec (CTypeOfExpr happy_var_3 at)))}}-	) (\r -> happyReturn (happyIn51 r))--happyReduce_174 = happyMonadReduce 4# 44# happyReduction_174-happyReduction_174 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut86 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ \at -> singleton (CTypeSpec (CTypeOfType happy_var_3 at)))}}-	) (\r -> happyReturn (happyIn51 r))--happyReduce_175 = happyMonadReduce 2# 44# happyReduction_175-happyReduction_175 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { (CTokTyIdent _ happy_var_2) -> -	( withNodeInfo happy_var_2 $ \at -> rmap CTypeQual  happy_var_1 `snoc` CTypeSpec (CTypeDef happy_var_2 at))}}-	) (\r -> happyReturn (happyIn51 r))--happyReduce_176 = happyMonadReduce 5# 44# happyReduction_176-happyReduction_176 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 -> -	case happyOut122 happy_x_4 of { happy_var_4 -> -	( withNodeInfo happy_var_2 $ \at -> rmap CTypeQual  happy_var_1 `snoc` CTypeSpec (CTypeOfExpr happy_var_4 at))}}}-	) (\r -> happyReturn (happyIn51 r))--happyReduce_177 = happyMonadReduce 5# 44# happyReduction_177-happyReduction_177 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 -> -	case happyOut86 happy_x_4 of { happy_var_4 -> -	( withNodeInfo happy_var_2 $ \at -> rmap CTypeQual  happy_var_1 `snoc` CTypeSpec (CTypeOfType happy_var_4 at))}}}-	) (\r -> happyReturn (happyIn51 r))--happyReduce_178 = happyMonadReduce 2# 44# happyReduction_178-happyReduction_178 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut133 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { (CTokTyIdent _ happy_var_2) -> -	( withNodeInfo happy_var_2 $ \at -> reverseList (liftCAttrs happy_var_1) `snoc` (CTypeSpec (CTypeDef happy_var_2 at)))}}-	) (\r -> happyReturn (happyIn51 r))--happyReduce_179 = happyMonadReduce 5# 44# happyReduction_179-happyReduction_179 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut133 happy_x_1 of { happy_var_1 -> -	case happyOut122 happy_x_4 of { happy_var_4 -> -	( withNodeInfo happy_var_1 $ \at -> reverseList (liftCAttrs happy_var_1) `snoc`  (CTypeSpec (CTypeOfExpr happy_var_4 at)))}}-	) (\r -> happyReturn (happyIn51 r))--happyReduce_180 = happyMonadReduce 5# 44# happyReduction_180-happyReduction_180 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut133 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 -> -	case happyOut86 happy_x_4 of { happy_var_4 -> -	( withNodeInfo happy_var_2 $ \at -> reverseList (liftCAttrs happy_var_1) `snoc`  (CTypeSpec (CTypeOfType happy_var_4 at)))}}}-	) (\r -> happyReturn (happyIn51 r))--happyReduce_181 = happyMonadReduce 3# 44# happyReduction_181-happyReduction_181 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> -	case happyOut133 happy_x_2 of { happy_var_2 -> -	case happyOutTok happy_x_3 of { (CTokTyIdent _ happy_var_3) -> -	( withNodeInfo happy_var_3 $ \at -> rmap CTypeQual  happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec (CTypeDef happy_var_3 at))}}}-	) (\r -> happyReturn (happyIn51 r))--happyReduce_182 = happyMonadReduce 6# 44# happyReduction_182-happyReduction_182 (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) tk-	 = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> -	case happyOut133 happy_x_2 of { happy_var_2 -> -	case happyOutTok happy_x_3 of { happy_var_3 -> -	case happyOut122 happy_x_5 of { happy_var_5 -> -	( withNodeInfo happy_var_3 $ \at -> rmap CTypeQual  happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec (CTypeOfExpr happy_var_5 at))}}}}-	) (\r -> happyReturn (happyIn51 r))--happyReduce_183 = happyMonadReduce 6# 44# happyReduction_183-happyReduction_183 (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) tk-	 = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> -	case happyOut133 happy_x_2 of { happy_var_2 -> -	case happyOutTok happy_x_3 of { happy_var_3 -> -	case happyOut86 happy_x_5 of { happy_var_5 -> -	( withNodeInfo happy_var_3 $ \at -> rmap CTypeQual  happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec (CTypeOfType happy_var_5 at))}}}}-	) (\r -> happyReturn (happyIn51 r))--happyReduce_184 = happySpecReduce_2  44# happyReduction_184-happyReduction_184 happy_x_2-	happy_x_1-	 =  case happyOut51 happy_x_1 of { happy_var_1 -> -	case happyOut64 happy_x_2 of { happy_var_2 -> -	happyIn51-		 (happy_var_1 `snoc` CTypeQual happy_var_2-	)}}--happyReduce_185 = happySpecReduce_2  44# happyReduction_185-happyReduction_185 happy_x_2-	happy_x_1-	 =  case happyOut51 happy_x_1 of { happy_var_1 -> -	case happyOut134 happy_x_2 of { happy_var_2 -> -	happyIn51-		 (addTrailingAttrs happy_var_1 happy_var_2-	)}}--happyReduce_186 = happyMonadReduce 1# 45# happyReduction_186-happyReduction_186 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut53 happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CSUType happy_var_1)}-	) (\r -> happyReturn (happyIn52 r))--happyReduce_187 = happyMonadReduce 1# 45# happyReduction_187-happyReduction_187 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CEnumType happy_var_1)}-	) (\r -> happyReturn (happyIn52 r))--happyReduce_188 = happyMonadReduce 6# 46# happyReduction_188-happyReduction_188 (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) tk-	 = happyThen (case happyOut54 happy_x_1 of { happy_var_1 -> -	case happyOut132 happy_x_2 of { happy_var_2 -> -	case happyOut131 happy_x_3 of { happy_var_3 -> -	case happyOut55 happy_x_5 of { happy_var_5 -> -	( withNodeInfo happy_var_1 $ CStruct (unL happy_var_1) (Just happy_var_3) (Just$ reverse happy_var_5) happy_var_2)}}}}-	) (\r -> happyReturn (happyIn53 r))--happyReduce_189 = happyMonadReduce 5# 46# happyReduction_189-happyReduction_189 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut54 happy_x_1 of { happy_var_1 -> -	case happyOut132 happy_x_2 of { happy_var_2 -> -	case happyOut55 happy_x_4 of { happy_var_4 -> -	( withNodeInfo happy_var_1 $ CStruct (unL happy_var_1) Nothing   (Just$ reverse happy_var_4) happy_var_2)}}}-	) (\r -> happyReturn (happyIn53 r))--happyReduce_190 = happyMonadReduce 3# 46# happyReduction_190-happyReduction_190 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut54 happy_x_1 of { happy_var_1 -> -	case happyOut132 happy_x_2 of { happy_var_2 -> -	case happyOut131 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CStruct (unL happy_var_1) (Just happy_var_3) Nothing happy_var_2)}}}-	) (\r -> happyReturn (happyIn53 r))--happyReduce_191 = happySpecReduce_1  47# happyReduction_191-happyReduction_191 happy_x_1-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> -	happyIn54-		 (L CStructTag (posOf happy_var_1)-	)}--happyReduce_192 = happySpecReduce_1  47# happyReduction_192-happyReduction_192 happy_x_1-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> -	happyIn54-		 (L CUnionTag (posOf happy_var_1)-	)}--happyReduce_193 = happySpecReduce_0  48# happyReduction_193-happyReduction_193  =  happyIn55-		 (empty-	)--happyReduce_194 = happySpecReduce_2  48# happyReduction_194-happyReduction_194 happy_x_2-	happy_x_1-	 =  case happyOut55 happy_x_1 of { happy_var_1 -> -	happyIn55-		 (happy_var_1-	)}--happyReduce_195 = happySpecReduce_2  48# happyReduction_195-happyReduction_195 happy_x_2-	happy_x_1-	 =  case happyOut55 happy_x_1 of { happy_var_1 -> -	case happyOut56 happy_x_2 of { happy_var_2 -> -	happyIn55-		 (happy_var_1 `snoc` happy_var_2-	)}}--happyReduce_196 = happySpecReduce_2  49# happyReduction_196-happyReduction_196 happy_x_2-	happy_x_1-	 =  case happyOut58 happy_x_1 of { happy_var_1 -> -	happyIn56-		 (case happy_var_1 of CDecl declspecs dies at -> CDecl declspecs (List.reverse dies) at-	)}--happyReduce_197 = happySpecReduce_2  49# happyReduction_197-happyReduction_197 happy_x_2-	happy_x_1-	 =  case happyOut57 happy_x_1 of { happy_var_1 -> -	happyIn56-		 (case happy_var_1 of CDecl declspecs dies at -> CDecl declspecs (List.reverse dies) at-	)}--happyReduce_198 = happySpecReduce_2  49# happyReduction_198-happyReduction_198 happy_x_2-	happy_x_1-	 =  case happyOut56 happy_x_2 of { happy_var_2 -> -	happyIn56-		 (happy_var_2-	)}--happyReduce_199 = happyMonadReduce 3# 50# happyReduction_199-happyReduction_199 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> -	case happyOut132 happy_x_2 of { happy_var_2 -> -	case happyOut60 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ case happy_var_3 of (d,s) -> CDecl (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) [(d,Nothing,s)])}}}-	) (\r -> happyReturn (happyIn57 r))--happyReduce_200 = happyMonadReduce 2# 50# happyReduction_200-happyReduction_200 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut133 happy_x_1 of { happy_var_1 -> -	case happyOut60 happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_1 $ case happy_var_2 of (d,s) -> CDecl (liftCAttrs happy_var_1) [(d,Nothing,s)])}}-	) (\r -> happyReturn (happyIn57 r))--happyReduce_201 = happyReduce 4# 50# happyReduction_201-happyReduction_201 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut57 happy_x_1 of { happy_var_1 -> -	case happyOut132 happy_x_3 of { happy_var_3 -> -	case happyOut60 happy_x_4 of { happy_var_4 -> -	happyIn57-		 (case happy_var_1 of-            CDecl declspecs dies at ->-              case happy_var_4 of-                (Just d,s) -> CDecl declspecs ((Just $ appendObjAttrs happy_var_3 d,Nothing,s) : dies) at-                (Nothing,s) -> CDecl declspecs ((Nothing,Nothing,s) : dies) at-	) `HappyStk` happyRest}}}--happyReduce_202 = happyMonadReduce 3# 51# happyReduction_202-happyReduction_202 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut44 happy_x_1 of { happy_var_1 -> -	case happyOut59 happy_x_2 of { happy_var_2 -> -	case happyOut132 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ case happy_var_2 of { (Just d,s)  -> CDecl happy_var_1 [(Just $! appendObjAttrs happy_var_3 d,Nothing,s)]-                                    ; (Nothing,s) -> CDecl happy_var_1 [(Nothing,Nothing,s)]  })}}}-	) (\r -> happyReturn (happyIn58 r))--happyReduce_203 = happyReduce 5# 51# happyReduction_203-happyReduction_203 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut58 happy_x_1 of { happy_var_1 -> -	case happyOut132 happy_x_3 of { happy_var_3 -> -	case happyOut59 happy_x_4 of { happy_var_4 -> -	case happyOut132 happy_x_5 of { happy_var_5 -> -	happyIn58-		 (case happy_var_1 of-            CDecl declspecs dies attr ->-              case happy_var_4 of-                (Just d,s) -> CDecl declspecs ((Just$ appendObjAttrs (happy_var_3++happy_var_5) d,Nothing,s) : dies) attr-                (Nothing,s) -> CDecl declspecs ((Nothing,Nothing,s) : dies) attr-	) `HappyStk` happyRest}}}}--happyReduce_204 = happyMonadReduce 1# 51# happyReduction_204-happyReduction_204 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut44 happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [])}-	) (\r -> happyReturn (happyIn58 r))--happyReduce_205 = happySpecReduce_1  52# happyReduction_205-happyReduction_205 happy_x_1-	 =  case happyOut66 happy_x_1 of { happy_var_1 -> -	happyIn59-		 ((Just (reverseDeclr happy_var_1), Nothing)-	)}--happyReduce_206 = happySpecReduce_2  52# happyReduction_206-happyReduction_206 happy_x_2-	happy_x_1-	 =  case happyOut126 happy_x_2 of { happy_var_2 -> -	happyIn59-		 ((Nothing, Just happy_var_2)-	)}--happyReduce_207 = happySpecReduce_3  52# happyReduction_207-happyReduction_207 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut66 happy_x_1 of { happy_var_1 -> -	case happyOut126 happy_x_3 of { happy_var_3 -> -	happyIn59-		 ((Just (reverseDeclr happy_var_1), Just happy_var_3)-	)}}--happyReduce_208 = happySpecReduce_1  53# happyReduction_208-happyReduction_208 happy_x_1-	 =  case happyOut75 happy_x_1 of { happy_var_1 -> -	happyIn60-		 ((Just (reverseDeclr happy_var_1), Nothing)-	)}--happyReduce_209 = happySpecReduce_2  53# happyReduction_209-happyReduction_209 happy_x_2-	happy_x_1-	 =  case happyOut126 happy_x_2 of { happy_var_2 -> -	happyIn60-		 ((Nothing, Just happy_var_2)-	)}--happyReduce_210 = happySpecReduce_3  53# happyReduction_210-happyReduction_210 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut75 happy_x_1 of { happy_var_1 -> -	case happyOut126 happy_x_3 of { happy_var_3 -> -	happyIn60-		 ((Just (reverseDeclr happy_var_1), Just happy_var_3)-	)}}--happyReduce_211 = happySpecReduce_2  53# happyReduction_211-happyReduction_211 happy_x_2-	happy_x_1-	 =  case happyOut60 happy_x_1 of { happy_var_1 -> -	case happyOut134 happy_x_2 of { happy_var_2 -> -	happyIn60-		 (case happy_var_1 of {   (Nothing,expr) -> (Nothing,expr) {- FIXME -}-                    ; (Just (CDeclr name derived asmname attrs node), bsz) ->-                                        (Just (CDeclr name derived asmname (attrs++happy_var_2) node),bsz)-                  }-	)}}--happyReduce_212 = happyMonadReduce 5# 54# happyReduction_212-happyReduction_212 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut132 happy_x_2 of { happy_var_2 -> -	case happyOut62 happy_x_4 of { happy_var_4 -> -	( withNodeInfo happy_var_1 $ CEnum Nothing   (Just$ reverse happy_var_4) happy_var_2)}}}-	) (\r -> happyReturn (happyIn61 r))--happyReduce_213 = happyMonadReduce 6# 54# happyReduction_213-happyReduction_213 (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) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut132 happy_x_2 of { happy_var_2 -> -	case happyOut62 happy_x_4 of { happy_var_4 -> -	( withNodeInfo happy_var_1 $ CEnum Nothing   (Just$ reverse happy_var_4) happy_var_2)}}}-	) (\r -> happyReturn (happyIn61 r))--happyReduce_214 = happyMonadReduce 6# 54# happyReduction_214-happyReduction_214 (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) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut132 happy_x_2 of { happy_var_2 -> -	case happyOut131 happy_x_3 of { happy_var_3 -> -	case happyOut62 happy_x_5 of { happy_var_5 -> -	( withNodeInfo happy_var_1 $ CEnum (Just happy_var_3) (Just$ reverse happy_var_5) happy_var_2)}}}}-	) (\r -> happyReturn (happyIn61 r))--happyReduce_215 = happyMonadReduce 7# 54# happyReduction_215-happyReduction_215 (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) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut132 happy_x_2 of { happy_var_2 -> -	case happyOut131 happy_x_3 of { happy_var_3 -> -	case happyOut62 happy_x_5 of { happy_var_5 -> -	( withNodeInfo happy_var_1 $ CEnum (Just happy_var_3) (Just$ reverse happy_var_5) happy_var_2)}}}}-	) (\r -> happyReturn (happyIn61 r))--happyReduce_216 = happyMonadReduce 3# 54# happyReduction_216-happyReduction_216 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut132 happy_x_2 of { happy_var_2 -> -	case happyOut131 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CEnum (Just happy_var_3) Nothing happy_var_2)}}}-	) (\r -> happyReturn (happyIn61 r))--happyReduce_217 = happySpecReduce_1  55# happyReduction_217-happyReduction_217 happy_x_1-	 =  case happyOut63 happy_x_1 of { happy_var_1 -> -	happyIn62-		 (singleton happy_var_1-	)}--happyReduce_218 = happySpecReduce_3  55# happyReduction_218-happyReduction_218 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut62 happy_x_1 of { happy_var_1 -> -	case happyOut63 happy_x_3 of { happy_var_3 -> -	happyIn62-		 (happy_var_1 `snoc` happy_var_3-	)}}--happyReduce_219 = happySpecReduce_1  56# happyReduction_219-happyReduction_219 happy_x_1-	 =  case happyOut131 happy_x_1 of { happy_var_1 -> -	happyIn63-		 ((happy_var_1, Nothing)-	)}--happyReduce_220 = happySpecReduce_2  56# happyReduction_220-happyReduction_220 happy_x_2-	happy_x_1-	 =  case happyOut131 happy_x_1 of { happy_var_1 -> -	happyIn63-		 ((happy_var_1, Nothing)-	)}--happyReduce_221 = happyReduce 4# 56# happyReduction_221-happyReduction_221 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut131 happy_x_1 of { happy_var_1 -> -	case happyOut126 happy_x_4 of { happy_var_4 -> -	happyIn63-		 ((happy_var_1, Just happy_var_4)-	) `HappyStk` happyRest}}--happyReduce_222 = happySpecReduce_3  56# happyReduction_222-happyReduction_222 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut131 happy_x_1 of { happy_var_1 -> -	case happyOut126 happy_x_3 of { happy_var_3 -> -	happyIn63-		 ((happy_var_1, Just happy_var_3)-	)}}--happyReduce_223 = happyMonadReduce 1# 57# happyReduction_223-happyReduction_223 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CConstQual)}-	) (\r -> happyReturn (happyIn64 r))--happyReduce_224 = happyMonadReduce 1# 57# happyReduction_224-happyReduction_224 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CVolatQual)}-	) (\r -> happyReturn (happyIn64 r))--happyReduce_225 = happyMonadReduce 1# 57# happyReduction_225-happyReduction_225 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CRestrQual)}-	) (\r -> happyReturn (happyIn64 r))--happyReduce_226 = happyMonadReduce 1# 57# happyReduction_226-happyReduction_226 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CNullableQual)}-	) (\r -> happyReturn (happyIn64 r))--happyReduce_227 = happyMonadReduce 1# 57# happyReduction_227-happyReduction_227 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CNonnullQual)}-	) (\r -> happyReturn (happyIn64 r))--happyReduce_228 = happyMonadReduce 1# 57# happyReduction_228-happyReduction_228 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CAtomicQual)}-	) (\r -> happyReturn (happyIn64 r))--happyReduce_229 = happySpecReduce_2  58# happyReduction_229-happyReduction_229 happy_x_2-	happy_x_1-	 =  case happyOut132 happy_x_1 of { happy_var_1 -> -	case happyOut64 happy_x_2 of { happy_var_2 -> -	happyIn65-		 (reverseList (map CAttrQual happy_var_1) `snoc` happy_var_2-	)}}--happyReduce_230 = happySpecReduce_2  58# happyReduction_230-happyReduction_230 happy_x_2-	happy_x_1-	 =  case happyOut65 happy_x_1 of { happy_var_1 -> -	case happyOut64 happy_x_2 of { happy_var_2 -> -	happyIn65-		 (happy_var_1 `snoc` happy_var_2-	)}}--happyReduce_231 = happySpecReduce_3  58# happyReduction_231-happyReduction_231 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut65 happy_x_1 of { happy_var_1 -> -	case happyOut133 happy_x_2 of { happy_var_2 -> -	case happyOut64 happy_x_3 of { happy_var_3 -> -	happyIn65-		 ((happy_var_1 `rappend` map CAttrQual happy_var_2) `snoc` happy_var_3-	)}}}--happyReduce_232 = happySpecReduce_1  59# happyReduction_232-happyReduction_232 happy_x_1-	 =  case happyOut75 happy_x_1 of { happy_var_1 -> -	happyIn66-		 (happy_var_1-	)}--happyReduce_233 = happySpecReduce_1  59# happyReduction_233-happyReduction_233 happy_x_1-	 =  case happyOut68 happy_x_1 of { happy_var_1 -> -	happyIn66-		 (happy_var_1-	)}--happyReduce_234 = happySpecReduce_0  60# happyReduction_234-happyReduction_234  =  happyIn67-		 (Nothing-	)--happyReduce_235 = happyReduce 4# 60# happyReduction_235-happyReduction_235 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut128 happy_x_3 of { happy_var_3 -> -	happyIn67-		 (Just happy_var_3-	) `HappyStk` happyRest}--happyReduce_236 = happySpecReduce_1  61# happyReduction_236-happyReduction_236 happy_x_1-	 =  case happyOut72 happy_x_1 of { happy_var_1 -> -	happyIn68-		 (happy_var_1-	)}--happyReduce_237 = happySpecReduce_1  61# happyReduction_237-happyReduction_237 happy_x_1-	 =  case happyOut69 happy_x_1 of { happy_var_1 -> -	happyIn68-		 (happy_var_1-	)}--happyReduce_238 = happyMonadReduce 1# 62# happyReduction_238-happyReduction_238 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { (CTokTyIdent _ happy_var_1) -> -	( withNodeInfo happy_var_1 $ mkVarDeclr happy_var_1)}-	) (\r -> happyReturn (happyIn69 r))--happyReduce_239 = happyMonadReduce 2# 62# happyReduction_239-happyReduction_239 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { (CTokTyIdent _ happy_var_1) -> -	case happyOut88 happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_1 $ \at -> happy_var_2 (mkVarDeclr happy_var_1 at))}}-	) (\r -> happyReturn (happyIn69 r))--happyReduce_240 = happySpecReduce_1  62# happyReduction_240-happyReduction_240 happy_x_1-	 =  case happyOut70 happy_x_1 of { happy_var_1 -> -	happyIn69-		 (happy_var_1-	)}--happyReduce_241 = happySpecReduce_1  63# happyReduction_241-happyReduction_241 happy_x_1-	 =  case happyOut71 happy_x_1 of { happy_var_1 -> -	happyIn70-		 (happy_var_1-	)}--happyReduce_242 = happyMonadReduce 2# 63# happyReduction_242-happyReduction_242 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut69 happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}}-	) (\r -> happyReturn (happyIn70 r))--happyReduce_243 = happyMonadReduce 3# 63# happyReduction_243-happyReduction_243 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut133 happy_x_2 of { happy_var_2 -> -	case happyOut69 happy_x_3 of { happy_var_3 -> -	( withAttribute happy_var_1 happy_var_2 $ ptrDeclr happy_var_3 [])}}}-	) (\r -> happyReturn (happyIn70 r))--happyReduce_244 = happyMonadReduce 3# 63# happyReduction_244-happyReduction_244 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut65 happy_x_2 of { happy_var_2 -> -	case happyOut69 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}}-	) (\r -> happyReturn (happyIn70 r))--happyReduce_245 = happyMonadReduce 4# 63# happyReduction_245-happyReduction_245 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut65 happy_x_2 of { happy_var_2 -> -	case happyOut133 happy_x_3 of { happy_var_3 -> -	case happyOut69 happy_x_4 of { happy_var_4 -> -	( withAttribute happy_var_1 happy_var_3 $ ptrDeclr happy_var_4 (reverse happy_var_2))}}}}-	) (\r -> happyReturn (happyIn70 r))--happyReduce_246 = happySpecReduce_3  64# happyReduction_246-happyReduction_246 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut70 happy_x_2 of { happy_var_2 -> -	happyIn71-		 (happy_var_2-	)}--happyReduce_247 = happyReduce 4# 64# happyReduction_247-happyReduction_247 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut70 happy_x_2 of { happy_var_2 -> -	case happyOut88 happy_x_4 of { happy_var_4 -> -	happyIn71-		 (happy_var_4 happy_var_2-	) `HappyStk` happyRest}}--happyReduce_248 = happyReduce 4# 64# happyReduction_248-happyReduction_248 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut133 happy_x_2 of { happy_var_2 -> -	case happyOut70 happy_x_3 of { happy_var_3 -> -	happyIn71-		 (appendDeclrAttrs happy_var_2 happy_var_3-	) `HappyStk` happyRest}}--happyReduce_249 = happyReduce 5# 64# happyReduction_249-happyReduction_249 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut133 happy_x_2 of { happy_var_2 -> -	case happyOut70 happy_x_3 of { happy_var_3 -> -	case happyOut88 happy_x_5 of { happy_var_5 -> -	happyIn71-		 (appendDeclrAttrs happy_var_2 (happy_var_5 happy_var_3)-	) `HappyStk` happyRest}}}--happyReduce_250 = happySpecReduce_1  65# happyReduction_250-happyReduction_250 happy_x_1-	 =  case happyOut73 happy_x_1 of { happy_var_1 -> -	happyIn72-		 (happy_var_1-	)}--happyReduce_251 = happyMonadReduce 4# 65# happyReduction_251-happyReduction_251 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut74 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 [])}}-	) (\r -> happyReturn (happyIn72 r))--happyReduce_252 = happyMonadReduce 5# 65# happyReduction_252-happyReduction_252 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut65 happy_x_2 of { happy_var_2 -> -	case happyOut74 happy_x_4 of { happy_var_4 -> -	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_4 (reverse happy_var_2))}}}-	) (\r -> happyReturn (happyIn72 r))--happyReduce_253 = happyMonadReduce 6# 65# happyReduction_253-happyReduction_253 (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) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut65 happy_x_2 of { happy_var_2 -> -	case happyOut133 happy_x_3 of { happy_var_3 -> -	case happyOut74 happy_x_5 of { happy_var_5 -> -	( withAttribute happy_var_1 happy_var_3 $ ptrDeclr happy_var_5 (reverse happy_var_2))}}}}-	) (\r -> happyReturn (happyIn72 r))--happyReduce_254 = happyMonadReduce 2# 65# happyReduction_254-happyReduction_254 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut72 happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}}-	) (\r -> happyReturn (happyIn72 r))--happyReduce_255 = happyMonadReduce 3# 65# happyReduction_255-happyReduction_255 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut65 happy_x_2 of { happy_var_2 -> -	case happyOut72 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}}-	) (\r -> happyReturn (happyIn72 r))--happyReduce_256 = happyMonadReduce 4# 65# happyReduction_256-happyReduction_256 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut65 happy_x_2 of { happy_var_2 -> -	case happyOut133 happy_x_3 of { happy_var_3 -> -	case happyOut72 happy_x_4 of { happy_var_4 -> -	( withAttribute happy_var_1 happy_var_3 $ ptrDeclr happy_var_4 (reverse happy_var_2))}}}}-	) (\r -> happyReturn (happyIn72 r))--happyReduce_257 = happySpecReduce_3  66# happyReduction_257-happyReduction_257 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut72 happy_x_2 of { happy_var_2 -> -	happyIn73-		 (happy_var_2-	)}--happyReduce_258 = happyReduce 4# 66# happyReduction_258-happyReduction_258 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut74 happy_x_2 of { happy_var_2 -> -	case happyOut88 happy_x_3 of { happy_var_3 -> -	happyIn73-		 (happy_var_3 happy_var_2-	) `HappyStk` happyRest}}--happyReduce_259 = happyReduce 4# 66# happyReduction_259-happyReduction_259 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut72 happy_x_2 of { happy_var_2 -> -	case happyOut88 happy_x_4 of { happy_var_4 -> -	happyIn73-		 (happy_var_4 happy_var_2-	) `HappyStk` happyRest}}--happyReduce_260 = happyMonadReduce 1# 67# happyReduction_260-happyReduction_260 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { (CTokTyIdent _ happy_var_1) -> -	( withNodeInfo happy_var_1 $ mkVarDeclr happy_var_1)}-	) (\r -> happyReturn (happyIn74 r))--happyReduce_261 = happySpecReduce_3  67# happyReduction_261-happyReduction_261 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut74 happy_x_2 of { happy_var_2 -> -	happyIn74-		 (happy_var_2-	)}--happyReduce_262 = happySpecReduce_1  68# happyReduction_262-happyReduction_262 happy_x_1-	 =  case happyOut76 happy_x_1 of { happy_var_1 -> -	happyIn75-		 (happy_var_1-	)}--happyReduce_263 = happySpecReduce_1  68# happyReduction_263-happyReduction_263 happy_x_1-	 =  case happyOut78 happy_x_1 of { happy_var_1 -> -	happyIn75-		 (happy_var_1-	)}--happyReduce_264 = happySpecReduce_1  69# happyReduction_264-happyReduction_264 happy_x_1-	 =  case happyOut77 happy_x_1 of { happy_var_1 -> -	happyIn76-		 (happy_var_1-	)}--happyReduce_265 = happyMonadReduce 2# 69# happyReduction_265-happyReduction_265 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut75 happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}}-	) (\r -> happyReturn (happyIn76 r))--happyReduce_266 = happyMonadReduce 3# 69# happyReduction_266-happyReduction_266 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut133 happy_x_2 of { happy_var_2 -> -	case happyOut75 happy_x_3 of { happy_var_3 -> -	( withAttribute happy_var_1 happy_var_2 $ ptrDeclr happy_var_3 [])}}}-	) (\r -> happyReturn (happyIn76 r))--happyReduce_267 = happyMonadReduce 3# 69# happyReduction_267-happyReduction_267 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut65 happy_x_2 of { happy_var_2 -> -	case happyOut75 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}}-	) (\r -> happyReturn (happyIn76 r))--happyReduce_268 = happyMonadReduce 4# 69# happyReduction_268-happyReduction_268 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut65 happy_x_2 of { happy_var_2 -> -	case happyOut133 happy_x_3 of { happy_var_3 -> -	case happyOut75 happy_x_4 of { happy_var_4 -> -	( withAttribute happy_var_1 happy_var_3 $ ptrDeclr happy_var_4 (reverse happy_var_2))}}}}-	) (\r -> happyReturn (happyIn76 r))--happyReduce_269 = happySpecReduce_2  70# happyReduction_269-happyReduction_269 happy_x_2-	happy_x_1-	 =  case happyOut78 happy_x_1 of { happy_var_1 -> -	case happyOut88 happy_x_2 of { happy_var_2 -> -	happyIn77-		 (happy_var_2 happy_var_1-	)}}--happyReduce_270 = happySpecReduce_3  70# happyReduction_270-happyReduction_270 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut76 happy_x_2 of { happy_var_2 -> -	happyIn77-		 (happy_var_2-	)}--happyReduce_271 = happyReduce 4# 70# happyReduction_271-happyReduction_271 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut76 happy_x_2 of { happy_var_2 -> -	case happyOut88 happy_x_4 of { happy_var_4 -> -	happyIn77-		 (happy_var_4 happy_var_2-	) `HappyStk` happyRest}}--happyReduce_272 = happyReduce 4# 70# happyReduction_272-happyReduction_272 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut133 happy_x_2 of { happy_var_2 -> -	case happyOut76 happy_x_3 of { happy_var_3 -> -	happyIn77-		 (appendDeclrAttrs happy_var_2 happy_var_3-	) `HappyStk` happyRest}}--happyReduce_273 = happyReduce 5# 70# happyReduction_273-happyReduction_273 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut133 happy_x_2 of { happy_var_2 -> -	case happyOut76 happy_x_3 of { happy_var_3 -> -	case happyOut88 happy_x_5 of { happy_var_5 -> -	happyIn77-		 (appendDeclrAttrs happy_var_2 (happy_var_5 happy_var_3)-	) `HappyStk` happyRest}}}--happyReduce_274 = happyMonadReduce 1# 71# happyReduction_274-happyReduction_274 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { (CTokIdent  _ happy_var_1) -> -	( withNodeInfo happy_var_1 $ mkVarDeclr happy_var_1)}-	) (\r -> happyReturn (happyIn78 r))--happyReduce_275 = happySpecReduce_3  71# happyReduction_275-happyReduction_275 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut78 happy_x_2 of { happy_var_2 -> -	happyIn78-		 (happy_var_2-	)}--happyReduce_276 = happyReduce 4# 71# happyReduction_276-happyReduction_276 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut133 happy_x_2 of { happy_var_2 -> -	case happyOut78 happy_x_3 of { happy_var_3 -> -	happyIn78-		 (appendDeclrAttrs happy_var_2 happy_var_3-	) `HappyStk` happyRest}}--happyReduce_277 = happySpecReduce_1  72# happyReduction_277-happyReduction_277 happy_x_1-	 =  case happyOut80 happy_x_1 of { happy_var_1 -> -	happyIn79-		 (reverseDeclr happy_var_1-	)}--happyReduce_278 = happySpecReduce_1  73# happyReduction_278-happyReduction_278 happy_x_1-	 =  case happyOut81 happy_x_1 of { happy_var_1 -> -	happyIn80-		 (happy_var_1-	)}--happyReduce_279 = happyMonadReduce 2# 73# happyReduction_279-happyReduction_279 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut80 happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}}-	) (\r -> happyReturn (happyIn80 r))--happyReduce_280 = happyMonadReduce 3# 73# happyReduction_280-happyReduction_280 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut65 happy_x_2 of { happy_var_2 -> -	case happyOut80 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}}-	) (\r -> happyReturn (happyIn80 r))--happyReduce_281 = happyMonadReduce 4# 74# happyReduction_281-happyReduction_281 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut78 happy_x_1 of { happy_var_1 -> -	case happyOut85 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ funDeclr happy_var_1 (Left $ reverse happy_var_3) [])}}-	) (\r -> happyReturn (happyIn81 r))--happyReduce_282 = happySpecReduce_3  74# happyReduction_282-happyReduction_282 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut80 happy_x_2 of { happy_var_2 -> -	happyIn81-		 (happy_var_2-	)}--happyReduce_283 = happyReduce 4# 74# happyReduction_283-happyReduction_283 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut80 happy_x_2 of { happy_var_2 -> -	case happyOut88 happy_x_4 of { happy_var_4 -> -	happyIn81-		 (happy_var_4 happy_var_2-	) `HappyStk` happyRest}}--happyReduce_284 = happySpecReduce_0  75# happyReduction_284-happyReduction_284  =  happyIn82-		 (([], False)-	)--happyReduce_285 = happySpecReduce_1  75# happyReduction_285-happyReduction_285 happy_x_1-	 =  case happyOut83 happy_x_1 of { happy_var_1 -> -	happyIn82-		 ((reverse happy_var_1, False)-	)}--happyReduce_286 = happySpecReduce_3  75# happyReduction_286-happyReduction_286 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut83 happy_x_1 of { happy_var_1 -> -	happyIn82-		 ((reverse happy_var_1, True)-	)}--happyReduce_287 = happySpecReduce_1  76# happyReduction_287-happyReduction_287 happy_x_1-	 =  case happyOut84 happy_x_1 of { happy_var_1 -> -	happyIn83-		 (singleton happy_var_1-	)}--happyReduce_288 = happySpecReduce_3  76# happyReduction_288-happyReduction_288 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut83 happy_x_1 of { happy_var_1 -> -	case happyOut84 happy_x_3 of { happy_var_3 -> -	happyIn83-		 (happy_var_1 `snoc` happy_var_3-	)}}--happyReduce_289 = happyMonadReduce 1# 77# happyReduction_289-happyReduction_289 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [])}-	) (\r -> happyReturn (happyIn84 r))--happyReduce_290 = happyMonadReduce 2# 77# happyReduction_290-happyReduction_290 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> -	case happyOut87 happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}}-	) (\r -> happyReturn (happyIn84 r))--happyReduce_291 = happyMonadReduce 3# 77# happyReduction_291-happyReduction_291 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> -	case happyOut75 happy_x_2 of { happy_var_2 -> -	case happyOut132 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr $! appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}}-	) (\r -> happyReturn (happyIn84 r))--happyReduce_292 = happyMonadReduce 3# 77# happyReduction_292-happyReduction_292 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> -	case happyOut69 happy_x_2 of { happy_var_2 -> -	case happyOut132 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr $! appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}}-	) (\r -> happyReturn (happyIn84 r))--happyReduce_293 = happyMonadReduce 1# 77# happyReduction_293-happyReduction_293 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CDecl (reverse happy_var_1) [])}-	) (\r -> happyReturn (happyIn84 r))--happyReduce_294 = happyMonadReduce 2# 77# happyReduction_294-happyReduction_294 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> -	case happyOut87 happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_1 $ CDecl (reverse happy_var_1) [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}}-	) (\r -> happyReturn (happyIn84 r))--happyReduce_295 = happyMonadReduce 3# 77# happyReduction_295-happyReduction_295 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> -	case happyOut75 happy_x_2 of { happy_var_2 -> -	case happyOut132 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CDecl (reverse happy_var_1) [(Just (reverseDeclr $! appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}}-	) (\r -> happyReturn (happyIn84 r))--happyReduce_296 = happyMonadReduce 1# 77# happyReduction_296-happyReduction_296 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut44 happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [])}-	) (\r -> happyReturn (happyIn84 r))--happyReduce_297 = happyMonadReduce 2# 77# happyReduction_297-happyReduction_297 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut44 happy_x_1 of { happy_var_1 -> -	case happyOut87 happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}}-	) (\r -> happyReturn (happyIn84 r))--happyReduce_298 = happyMonadReduce 3# 77# happyReduction_298-happyReduction_298 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut44 happy_x_1 of { happy_var_1 -> -	case happyOut75 happy_x_2 of { happy_var_2 -> -	case happyOut132 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr $! appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}}-	) (\r -> happyReturn (happyIn84 r))--happyReduce_299 = happyMonadReduce 3# 77# happyReduction_299-happyReduction_299 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut44 happy_x_1 of { happy_var_1 -> -	case happyOut69 happy_x_2 of { happy_var_2 -> -	case happyOut132 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr $! appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}}-	) (\r -> happyReturn (happyIn84 r))--happyReduce_300 = happyMonadReduce 1# 77# happyReduction_300-happyReduction_300 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1) [])}-	) (\r -> happyReturn (happyIn84 r))--happyReduce_301 = happyMonadReduce 2# 77# happyReduction_301-happyReduction_301 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> -	case happyOut134 happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) [])}}-	) (\r -> happyReturn (happyIn84 r))--happyReduce_302 = happyMonadReduce 2# 77# happyReduction_302-happyReduction_302 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> -	case happyOut87 happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1) [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}}-	) (\r -> happyReturn (happyIn84 r))--happyReduce_303 = happyMonadReduce 3# 77# happyReduction_303-happyReduction_303 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> -	case happyOut75 happy_x_2 of { happy_var_2 -> -	case happyOut132 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1) [(Just (reverseDeclr$ appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}}-	) (\r -> happyReturn (happyIn84 r))--happyReduce_304 = happySpecReduce_1  78# happyReduction_304-happyReduction_304 happy_x_1-	 =  case happyOutTok happy_x_1 of { (CTokIdent  _ happy_var_1) -> -	happyIn85-		 (singleton happy_var_1-	)}--happyReduce_305 = happySpecReduce_3  78# happyReduction_305-happyReduction_305 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut85 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_3 of { (CTokIdent  _ happy_var_3) -> -	happyIn85-		 (happy_var_1 `snoc` happy_var_3-	)}}--happyReduce_306 = happyMonadReduce 1# 79# happyReduction_306-happyReduction_306 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut44 happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [])}-	) (\r -> happyReturn (happyIn86 r))--happyReduce_307 = happyMonadReduce 2# 79# happyReduction_307-happyReduction_307 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut44 happy_x_1 of { happy_var_1 -> -	case happyOut87 happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}}-	) (\r -> happyReturn (happyIn86 r))--happyReduce_308 = happyMonadReduce 2# 79# happyReduction_308-happyReduction_308 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> -	case happyOut134 happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) [])}}-	) (\r -> happyReturn (happyIn86 r))--happyReduce_309 = happyMonadReduce 2# 79# happyReduction_309-happyReduction_309 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> -	case happyOut87 happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1) [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}}-	) (\r -> happyReturn (happyIn86 r))--happyReduce_310 = happySpecReduce_1  80# happyReduction_310-happyReduction_310 happy_x_1-	 =  case happyOut91 happy_x_1 of { happy_var_1 -> -	happyIn87-		 (happy_var_1-	)}--happyReduce_311 = happySpecReduce_1  80# happyReduction_311-happyReduction_311 happy_x_1-	 =  case happyOut92 happy_x_1 of { happy_var_1 -> -	happyIn87-		 (happy_var_1-	)}--happyReduce_312 = happySpecReduce_1  80# happyReduction_312-happyReduction_312 happy_x_1-	 =  case happyOut88 happy_x_1 of { happy_var_1 -> -	happyIn87-		 (happy_var_1 emptyDeclr-	)}--happyReduce_313 = happySpecReduce_1  81# happyReduction_313-happyReduction_313 happy_x_1-	 =  case happyOut89 happy_x_1 of { happy_var_1 -> -	happyIn88-		 (happy_var_1-	)}--happyReduce_314 = happyMonadReduce 3# 81# happyReduction_314-happyReduction_314 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut82 happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_1 $ \at declr -> case happy_var_2 of-             (params, variadic) -> funDeclr declr (Right (params,variadic)) [] at)}}-	) (\r -> happyReturn (happyIn88 r))--happyReduce_315 = happySpecReduce_1  82# happyReduction_315-happyReduction_315 happy_x_1-	 =  case happyOut90 happy_x_1 of { happy_var_1 -> -	happyIn89-		 (happy_var_1-	)}--happyReduce_316 = happySpecReduce_2  82# happyReduction_316-happyReduction_316 happy_x_2-	happy_x_1-	 =  case happyOut89 happy_x_1 of { happy_var_1 -> -	case happyOut90 happy_x_2 of { happy_var_2 -> -	happyIn89-		 (\decl -> happy_var_2 (happy_var_1 decl)-	)}}--happyReduce_317 = happyMonadReduce 3# 83# happyReduction_317-happyReduction_317 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut125 happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_1 $ \at declr -> arrDeclr declr [] False False happy_var_2 at)}}-	) (\r -> happyReturn (happyIn90 r))--happyReduce_318 = happyMonadReduce 4# 83# happyReduction_318-happyReduction_318 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut133 happy_x_2 of { happy_var_2 -> -	case happyOut125 happy_x_3 of { happy_var_3 -> -	( withAttributePF happy_var_1 happy_var_2 $ \at declr -> arrDeclr declr [] False False happy_var_3 at)}}}-	) (\r -> happyReturn (happyIn90 r))--happyReduce_319 = happyMonadReduce 4# 83# happyReduction_319-happyReduction_319 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut65 happy_x_2 of { happy_var_2 -> -	case happyOut125 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ \at declr -> arrDeclr declr (reverse happy_var_2) False False happy_var_3 at)}}}-	) (\r -> happyReturn (happyIn90 r))--happyReduce_320 = happyMonadReduce 5# 83# happyReduction_320-happyReduction_320 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut65 happy_x_2 of { happy_var_2 -> -	case happyOut133 happy_x_3 of { happy_var_3 -> -	case happyOut125 happy_x_4 of { happy_var_4 -> -	( withAttributePF happy_var_1 happy_var_3 $ \at declr -> arrDeclr declr (reverse happy_var_2) False False happy_var_4 at)}}}}-	) (\r -> happyReturn (happyIn90 r))--happyReduce_321 = happyMonadReduce 5# 83# happyReduction_321-happyReduction_321 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut132 happy_x_3 of { happy_var_3 -> -	case happyOut120 happy_x_4 of { happy_var_4 -> -	( withAttributePF happy_var_1 happy_var_3 $ \at declr -> arrDeclr declr [] False True (Just happy_var_4) at)}}}-	) (\r -> happyReturn (happyIn90 r))--happyReduce_322 = happyMonadReduce 6# 83# happyReduction_322-happyReduction_322 (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) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut65 happy_x_3 of { happy_var_3 -> -	case happyOut132 happy_x_4 of { happy_var_4 -> -	case happyOut120 happy_x_5 of { happy_var_5 -> -	( withAttributePF happy_var_1 happy_var_4 $ \at declr -> arrDeclr declr (reverse happy_var_3) False True (Just happy_var_5) at)}}}}-	) (\r -> happyReturn (happyIn90 r))--happyReduce_323 = happyMonadReduce 7# 83# happyReduction_323-happyReduction_323 (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) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut65 happy_x_2 of { happy_var_2 -> -	case happyOut132 happy_x_3 of { happy_var_3 -> -	case happyOut132 happy_x_5 of { happy_var_5 -> -	case happyOut120 happy_x_6 of { happy_var_6 -> -	( withAttributePF happy_var_1 (happy_var_3 ++ happy_var_5) $ \at declr -> arrDeclr declr (reverse happy_var_2) False True  (Just happy_var_6) at)}}}}}-	) (\r -> happyReturn (happyIn90 r))--happyReduce_324 = happyMonadReduce 4# 83# happyReduction_324-happyReduction_324 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut132 happy_x_3 of { happy_var_3 -> -	( withAttributePF happy_var_1 happy_var_3 $ \at declr -> arrDeclr declr [] True False Nothing at)}}-	) (\r -> happyReturn (happyIn90 r))--happyReduce_325 = happyMonadReduce 5# 83# happyReduction_325-happyReduction_325 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut133 happy_x_2 of { happy_var_2 -> -	case happyOut132 happy_x_4 of { happy_var_4 -> -	( withAttributePF happy_var_1 (happy_var_2 ++ happy_var_4) $ \at declr -> arrDeclr declr [] True False Nothing at)}}}-	) (\r -> happyReturn (happyIn90 r))--happyReduce_326 = happyMonadReduce 5# 83# happyReduction_326-happyReduction_326 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut65 happy_x_2 of { happy_var_2 -> -	case happyOut132 happy_x_4 of { happy_var_4 -> -	( withAttributePF happy_var_1 happy_var_4 $ \at declr -> arrDeclr declr (reverse happy_var_2) True False Nothing at)}}}-	) (\r -> happyReturn (happyIn90 r))--happyReduce_327 = happyMonadReduce 6# 83# happyReduction_327-happyReduction_327 (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) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut65 happy_x_2 of { happy_var_2 -> -	case happyOut133 happy_x_3 of { happy_var_3 -> -	case happyOut132 happy_x_5 of { happy_var_5 -> -	( withAttributePF happy_var_1 (happy_var_3 ++ happy_var_5) $ \at declr -> arrDeclr declr (reverse happy_var_2) True False Nothing at)}}}}-	) (\r -> happyReturn (happyIn90 r))--happyReduce_328 = happyMonadReduce 1# 84# happyReduction_328-happyReduction_328 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ ptrDeclr emptyDeclr [])}-	) (\r -> happyReturn (happyIn91 r))--happyReduce_329 = happyMonadReduce 3# 84# happyReduction_329-happyReduction_329 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut65 happy_x_2 of { happy_var_2 -> -	case happyOut132 happy_x_3 of { happy_var_3 -> -	( withAttribute happy_var_1 happy_var_3 $ ptrDeclr emptyDeclr (reverse happy_var_2))}}}-	) (\r -> happyReturn (happyIn91 r))--happyReduce_330 = happyMonadReduce 2# 84# happyReduction_330-happyReduction_330 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut87 happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}}-	) (\r -> happyReturn (happyIn91 r))--happyReduce_331 = happyMonadReduce 3# 84# happyReduction_331-happyReduction_331 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut65 happy_x_2 of { happy_var_2 -> -	case happyOut87 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}}-	) (\r -> happyReturn (happyIn91 r))--happyReduce_332 = happyMonadReduce 2# 84# happyReduction_332-happyReduction_332 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut133 happy_x_2 of { happy_var_2 -> -	( withAttribute happy_var_1 happy_var_2 $ ptrDeclr emptyDeclr [])}}-	) (\r -> happyReturn (happyIn91 r))--happyReduce_333 = happyMonadReduce 3# 84# happyReduction_333-happyReduction_333 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut133 happy_x_2 of { happy_var_2 -> -	case happyOut87 happy_x_3 of { happy_var_3 -> -	( withAttribute happy_var_1 happy_var_2 $ ptrDeclr happy_var_3 [])}}}-	) (\r -> happyReturn (happyIn91 r))--happyReduce_334 = happySpecReduce_3  85# happyReduction_334-happyReduction_334 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut91 happy_x_2 of { happy_var_2 -> -	happyIn92-		 (happy_var_2-	)}--happyReduce_335 = happySpecReduce_3  85# happyReduction_335-happyReduction_335 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut92 happy_x_2 of { happy_var_2 -> -	happyIn92-		 (happy_var_2-	)}--happyReduce_336 = happySpecReduce_3  85# happyReduction_336-happyReduction_336 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut88 happy_x_2 of { happy_var_2 -> -	happyIn92-		 (happy_var_2 emptyDeclr-	)}--happyReduce_337 = happyReduce 4# 85# happyReduction_337-happyReduction_337 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut91 happy_x_2 of { happy_var_2 -> -	case happyOut88 happy_x_4 of { happy_var_4 -> -	happyIn92-		 (happy_var_4 happy_var_2-	) `HappyStk` happyRest}}--happyReduce_338 = happyReduce 4# 85# happyReduction_338-happyReduction_338 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut133 happy_x_2 of { happy_var_2 -> -	case happyOut91 happy_x_3 of { happy_var_3 -> -	happyIn92-		 (appendDeclrAttrs happy_var_2 happy_var_3-	) `HappyStk` happyRest}}--happyReduce_339 = happyReduce 4# 85# happyReduction_339-happyReduction_339 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut133 happy_x_2 of { happy_var_2 -> -	case happyOut92 happy_x_3 of { happy_var_3 -> -	happyIn92-		 (appendDeclrAttrs happy_var_2 happy_var_3-	) `HappyStk` happyRest}}--happyReduce_340 = happyReduce 4# 85# happyReduction_340-happyReduction_340 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut133 happy_x_2 of { happy_var_2 -> -	case happyOut88 happy_x_3 of { happy_var_3 -> -	happyIn92-		 (appendDeclrAttrs happy_var_2 (happy_var_3 emptyDeclr)-	) `HappyStk` happyRest}}--happyReduce_341 = happyReduce 5# 85# happyReduction_341-happyReduction_341 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut133 happy_x_2 of { happy_var_2 -> -	case happyOut91 happy_x_3 of { happy_var_3 -> -	case happyOut88 happy_x_5 of { happy_var_5 -> -	happyIn92-		 (appendDeclrAttrs happy_var_2 (happy_var_5 happy_var_3)-	) `HappyStk` happyRest}}}--happyReduce_342 = happySpecReduce_2  85# happyReduction_342-happyReduction_342 happy_x_2-	happy_x_1-	 =  case happyOut92 happy_x_1 of { happy_var_1 -> -	case happyOut134 happy_x_2 of { happy_var_2 -> -	happyIn92-		 (appendDeclrAttrs happy_var_2 happy_var_1-	)}}--happyReduce_343 = happyMonadReduce 1# 86# happyReduction_343-happyReduction_343 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut120 happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CInitExpr happy_var_1)}-	) (\r -> happyReturn (happyIn93 r))--happyReduce_344 = happyMonadReduce 3# 86# happyReduction_344-happyReduction_344 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut95 happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_1 $ CInitList (reverse happy_var_2))}}-	) (\r -> happyReturn (happyIn93 r))--happyReduce_345 = happyMonadReduce 4# 86# happyReduction_345-happyReduction_345 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut95 happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_1 $ CInitList (reverse happy_var_2))}}-	) (\r -> happyReturn (happyIn93 r))--happyReduce_346 = happySpecReduce_0  87# happyReduction_346-happyReduction_346  =  happyIn94-		 (Nothing-	)--happyReduce_347 = happySpecReduce_2  87# happyReduction_347-happyReduction_347 happy_x_2-	happy_x_1-	 =  case happyOut93 happy_x_2 of { happy_var_2 -> -	happyIn94-		 (Just happy_var_2-	)}--happyReduce_348 = happySpecReduce_0  88# happyReduction_348-happyReduction_348  =  happyIn95-		 (empty-	)--happyReduce_349 = happySpecReduce_1  88# happyReduction_349-happyReduction_349 happy_x_1-	 =  case happyOut93 happy_x_1 of { happy_var_1 -> -	happyIn95-		 (singleton ([],happy_var_1)-	)}--happyReduce_350 = happySpecReduce_2  88# happyReduction_350-happyReduction_350 happy_x_2-	happy_x_1-	 =  case happyOut96 happy_x_1 of { happy_var_1 -> -	case happyOut93 happy_x_2 of { happy_var_2 -> -	happyIn95-		 (singleton (happy_var_1,happy_var_2)-	)}}--happyReduce_351 = happySpecReduce_3  88# happyReduction_351-happyReduction_351 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut95 happy_x_1 of { happy_var_1 -> -	case happyOut93 happy_x_3 of { happy_var_3 -> -	happyIn95-		 (happy_var_1 `snoc` ([],happy_var_3)-	)}}--happyReduce_352 = happyReduce 4# 88# happyReduction_352-happyReduction_352 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut95 happy_x_1 of { happy_var_1 -> -	case happyOut96 happy_x_3 of { happy_var_3 -> -	case happyOut93 happy_x_4 of { happy_var_4 -> -	happyIn95-		 (happy_var_1 `snoc` (happy_var_3,happy_var_4)-	) `HappyStk` happyRest}}}--happyReduce_353 = happySpecReduce_2  89# happyReduction_353-happyReduction_353 happy_x_2-	happy_x_1-	 =  case happyOut97 happy_x_1 of { happy_var_1 -> -	happyIn96-		 (reverse happy_var_1-	)}--happyReduce_354 = happyMonadReduce 2# 89# happyReduction_354-happyReduction_354 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut131 happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ \at -> [CMemberDesig happy_var_1 at])}-	) (\r -> happyReturn (happyIn96 r))--happyReduce_355 = happySpecReduce_1  89# happyReduction_355-happyReduction_355 happy_x_1-	 =  case happyOut99 happy_x_1 of { happy_var_1 -> -	happyIn96-		 ([happy_var_1]-	)}--happyReduce_356 = happySpecReduce_1  90# happyReduction_356-happyReduction_356 happy_x_1-	 =  case happyOut98 happy_x_1 of { happy_var_1 -> -	happyIn97-		 (singleton happy_var_1-	)}--happyReduce_357 = happySpecReduce_2  90# happyReduction_357-happyReduction_357 happy_x_2-	happy_x_1-	 =  case happyOut97 happy_x_1 of { happy_var_1 -> -	case happyOut98 happy_x_2 of { happy_var_2 -> -	happyIn97-		 (happy_var_1 `snoc` happy_var_2-	)}}--happyReduce_358 = happyMonadReduce 3# 91# happyReduction_358-happyReduction_358 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut126 happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_1 $ CArrDesig happy_var_2)}}-	) (\r -> happyReturn (happyIn98 r))--happyReduce_359 = happyMonadReduce 2# 91# happyReduction_359-happyReduction_359 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut131 happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_1 $ CMemberDesig happy_var_2)}}-	) (\r -> happyReturn (happyIn98 r))--happyReduce_360 = happySpecReduce_1  91# happyReduction_360-happyReduction_360 happy_x_1-	 =  case happyOut99 happy_x_1 of { happy_var_1 -> -	happyIn98-		 (happy_var_1-	)}--happyReduce_361 = happyMonadReduce 5# 92# happyReduction_361-happyReduction_361 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut126 happy_x_2 of { happy_var_2 -> -	case happyOut126 happy_x_4 of { happy_var_4 -> -	( withNodeInfo happy_var_1 $ CRangeDesig happy_var_2 happy_var_4)}}}-	) (\r -> happyReturn (happyIn99 r))--happyReduce_362 = happyMonadReduce 1# 93# happyReduction_362-happyReduction_362 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { (CTokIdent  _ happy_var_1) -> -	( withNodeInfo happy_var_1 $ CVar happy_var_1)}-	) (\r -> happyReturn (happyIn100 r))--happyReduce_363 = happySpecReduce_1  93# happyReduction_363-happyReduction_363 happy_x_1-	 =  case happyOut127 happy_x_1 of { happy_var_1 -> -	happyIn100-		 (CConst happy_var_1-	)}--happyReduce_364 = happySpecReduce_1  93# happyReduction_364-happyReduction_364 happy_x_1-	 =  case happyOut128 happy_x_1 of { happy_var_1 -> -	happyIn100-		 (CConst (liftStrLit happy_var_1)-	)}--happyReduce_365 = happySpecReduce_3  93# happyReduction_365-happyReduction_365 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut122 happy_x_2 of { happy_var_2 -> -	happyIn100-		 (happy_var_2-	)}--happyReduce_366 = happyMonadReduce 6# 93# happyReduction_366-happyReduction_366 (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) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut120 happy_x_3 of { happy_var_3 -> -	case happyOut101 happy_x_5 of { happy_var_5 -> -	( withNodeInfo happy_var_1 $ CGenericSelection happy_var_3 (reverse happy_var_5))}}}-	) (\r -> happyReturn (happyIn100 r))--happyReduce_367 = happyMonadReduce 3# 93# happyReduction_367-happyReduction_367 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut14 happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_1 $ CStatExpr happy_var_2)}}-	) (\r -> happyReturn (happyIn100 r))--happyReduce_368 = happyMonadReduce 6# 93# happyReduction_368-happyReduction_368 (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) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut120 happy_x_3 of { happy_var_3 -> -	case happyOut86 happy_x_5 of { happy_var_5 -> -	( withNodeInfo happy_var_1 $ CBuiltinExpr . CBuiltinVaArg happy_var_3 happy_var_5)}}}-	) (\r -> happyReturn (happyIn100 r))--happyReduce_369 = happyMonadReduce 6# 93# happyReduction_369-happyReduction_369 (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) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut86 happy_x_3 of { happy_var_3 -> -	case happyOut103 happy_x_5 of { happy_var_5 -> -	( withNodeInfo happy_var_1 $ CBuiltinExpr . CBuiltinOffsetOf happy_var_3 (reverse happy_var_5))}}}-	) (\r -> happyReturn (happyIn100 r))--happyReduce_370 = happyMonadReduce 6# 93# happyReduction_370-happyReduction_370 (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) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut86 happy_x_3 of { happy_var_3 -> -	case happyOut86 happy_x_5 of { happy_var_5 -> -	( withNodeInfo happy_var_1 $ CBuiltinExpr . CBuiltinTypesCompatible happy_var_3 happy_var_5)}}}-	) (\r -> happyReturn (happyIn100 r))--happyReduce_371 = happyMonadReduce 6# 93# happyReduction_371-happyReduction_371 (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) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut120 happy_x_3 of { happy_var_3 -> -	case happyOut86 happy_x_5 of { happy_var_5 -> -	( withNodeInfo happy_var_1 $ CBuiltinExpr . CBuiltinConvertVector happy_var_3 happy_var_5)}}}-	) (\r -> happyReturn (happyIn100 r))--happyReduce_372 = happySpecReduce_3  94# happyReduction_372-happyReduction_372 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut101 happy_x_1 of { happy_var_1 -> -	case happyOut102 happy_x_3 of { happy_var_3 -> -	happyIn101-		 (happy_var_1 `snoc` happy_var_3-	)}}--happyReduce_373 = happySpecReduce_1  94# happyReduction_373-happyReduction_373 happy_x_1-	 =  case happyOut102 happy_x_1 of { happy_var_1 -> -	happyIn101-		 (singleton happy_var_1-	)}--happyReduce_374 = happySpecReduce_3  95# happyReduction_374-happyReduction_374 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut86 happy_x_1 of { happy_var_1 -> -	case happyOut120 happy_x_3 of { happy_var_3 -> -	happyIn102-		 ((Just happy_var_1, happy_var_3)-	)}}--happyReduce_375 = happySpecReduce_3  95# happyReduction_375-happyReduction_375 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut120 happy_x_3 of { happy_var_3 -> -	happyIn102-		 ((Nothing, happy_var_3)-	)}--happyReduce_376 = happyMonadReduce 1# 96# happyReduction_376-happyReduction_376 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut131 happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ singleton . CMemberDesig happy_var_1)}-	) (\r -> happyReturn (happyIn103 r))--happyReduce_377 = happyMonadReduce 3# 96# happyReduction_377-happyReduction_377 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut103 happy_x_1 of { happy_var_1 -> -	case happyOut131 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_3 $ (happy_var_1 `snoc`) . CMemberDesig happy_var_3)}}-	) (\r -> happyReturn (happyIn103 r))--happyReduce_378 = happyMonadReduce 4# 96# happyReduction_378-happyReduction_378 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut103 happy_x_1 of { happy_var_1 -> -	case happyOut122 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_3 $ (happy_var_1 `snoc`) . CArrDesig happy_var_3)}}-	) (\r -> happyReturn (happyIn103 r))--happyReduce_379 = happySpecReduce_1  97# happyReduction_379-happyReduction_379 happy_x_1-	 =  case happyOut100 happy_x_1 of { happy_var_1 -> -	happyIn104-		 (happy_var_1-	)}--happyReduce_380 = happyMonadReduce 4# 97# happyReduction_380-happyReduction_380 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut104 happy_x_1 of { happy_var_1 -> -	case happyOut122 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CIndex happy_var_1 happy_var_3)}}-	) (\r -> happyReturn (happyIn104 r))--happyReduce_381 = happyMonadReduce 3# 97# happyReduction_381-happyReduction_381 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut104 happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CCall happy_var_1 [])}-	) (\r -> happyReturn (happyIn104 r))--happyReduce_382 = happyMonadReduce 4# 97# happyReduction_382-happyReduction_382 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut104 happy_x_1 of { happy_var_1 -> -	case happyOut105 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CCall happy_var_1 (reverse happy_var_3))}}-	) (\r -> happyReturn (happyIn104 r))--happyReduce_383 = happyMonadReduce 3# 97# happyReduction_383-happyReduction_383 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut104 happy_x_1 of { happy_var_1 -> -	case happyOut131 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CMember happy_var_1 happy_var_3 False)}}-	) (\r -> happyReturn (happyIn104 r))--happyReduce_384 = happyMonadReduce 3# 97# happyReduction_384-happyReduction_384 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut104 happy_x_1 of { happy_var_1 -> -	case happyOut131 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CMember happy_var_1 happy_var_3 True)}}-	) (\r -> happyReturn (happyIn104 r))--happyReduce_385 = happyMonadReduce 2# 97# happyReduction_385-happyReduction_385 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut104 happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CUnary CPostIncOp happy_var_1)}-	) (\r -> happyReturn (happyIn104 r))--happyReduce_386 = happyMonadReduce 2# 97# happyReduction_386-happyReduction_386 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut104 happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CUnary CPostDecOp happy_var_1)}-	) (\r -> happyReturn (happyIn104 r))--happyReduce_387 = happyMonadReduce 6# 97# happyReduction_387-happyReduction_387 (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) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut86 happy_x_2 of { happy_var_2 -> -	case happyOut95 happy_x_5 of { happy_var_5 -> -	( withNodeInfo happy_var_1 $ CCompoundLit happy_var_2 (reverse happy_var_5))}}}-	) (\r -> happyReturn (happyIn104 r))--happyReduce_388 = happyMonadReduce 7# 97# happyReduction_388-happyReduction_388 (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) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut86 happy_x_2 of { happy_var_2 -> -	case happyOut95 happy_x_5 of { happy_var_5 -> -	( withNodeInfo happy_var_1 $ CCompoundLit happy_var_2 (reverse happy_var_5))}}}-	) (\r -> happyReturn (happyIn104 r))--happyReduce_389 = happySpecReduce_1  98# happyReduction_389-happyReduction_389 happy_x_1-	 =  case happyOut120 happy_x_1 of { happy_var_1 -> -	happyIn105-		 (singleton happy_var_1-	)}--happyReduce_390 = happySpecReduce_3  98# happyReduction_390-happyReduction_390 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut105 happy_x_1 of { happy_var_1 -> -	case happyOut120 happy_x_3 of { happy_var_3 -> -	happyIn105-		 (happy_var_1 `snoc` happy_var_3-	)}}--happyReduce_391 = happySpecReduce_1  99# happyReduction_391-happyReduction_391 happy_x_1-	 =  case happyOut104 happy_x_1 of { happy_var_1 -> -	happyIn106-		 (happy_var_1-	)}--happyReduce_392 = happyMonadReduce 2# 99# happyReduction_392-happyReduction_392 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut106 happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_1 $ CUnary CPreIncOp happy_var_2)}}-	) (\r -> happyReturn (happyIn106 r))--happyReduce_393 = happyMonadReduce 2# 99# happyReduction_393-happyReduction_393 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut106 happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_1 $ CUnary CPreDecOp happy_var_2)}}-	) (\r -> happyReturn (happyIn106 r))--happyReduce_394 = happySpecReduce_2  99# happyReduction_394-happyReduction_394 happy_x_2-	happy_x_1-	 =  case happyOut108 happy_x_2 of { happy_var_2 -> -	happyIn106-		 (happy_var_2-	)}--happyReduce_395 = happyMonadReduce 2# 99# happyReduction_395-happyReduction_395 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut107 happy_x_1 of { happy_var_1 -> -	case happyOut108 happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_1 $ CUnary (unL happy_var_1) happy_var_2)}}-	) (\r -> happyReturn (happyIn106 r))--happyReduce_396 = happyMonadReduce 2# 99# happyReduction_396-happyReduction_396 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut106 happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_1 $ CSizeofExpr happy_var_2)}}-	) (\r -> happyReturn (happyIn106 r))--happyReduce_397 = happyMonadReduce 4# 99# happyReduction_397-happyReduction_397 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut86 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CSizeofType happy_var_3)}}-	) (\r -> happyReturn (happyIn106 r))--happyReduce_398 = happyMonadReduce 2# 99# happyReduction_398-happyReduction_398 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut106 happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_1 $ CAlignofExpr happy_var_2)}}-	) (\r -> happyReturn (happyIn106 r))--happyReduce_399 = happyMonadReduce 4# 99# happyReduction_399-happyReduction_399 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut86 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CAlignofType happy_var_3)}}-	) (\r -> happyReturn (happyIn106 r))--happyReduce_400 = happyMonadReduce 2# 99# happyReduction_400-happyReduction_400 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut106 happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_1 $ CComplexReal happy_var_2)}}-	) (\r -> happyReturn (happyIn106 r))--happyReduce_401 = happyMonadReduce 2# 99# happyReduction_401-happyReduction_401 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut106 happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_1 $ CComplexImag happy_var_2)}}-	) (\r -> happyReturn (happyIn106 r))--happyReduce_402 = happyMonadReduce 2# 99# happyReduction_402-happyReduction_402 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut131 happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_1 $ CLabAddrExpr happy_var_2)}}-	) (\r -> happyReturn (happyIn106 r))--happyReduce_403 = happySpecReduce_1  100# happyReduction_403-happyReduction_403 happy_x_1-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> -	happyIn107-		 (L CAdrOp  (posOf happy_var_1)-	)}--happyReduce_404 = happySpecReduce_1  100# happyReduction_404-happyReduction_404 happy_x_1-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> -	happyIn107-		 (L CIndOp  (posOf happy_var_1)-	)}--happyReduce_405 = happySpecReduce_1  100# happyReduction_405-happyReduction_405 happy_x_1-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> -	happyIn107-		 (L CPlusOp (posOf happy_var_1)-	)}--happyReduce_406 = happySpecReduce_1  100# happyReduction_406-happyReduction_406 happy_x_1-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> -	happyIn107-		 (L CMinOp  (posOf happy_var_1)-	)}--happyReduce_407 = happySpecReduce_1  100# happyReduction_407-happyReduction_407 happy_x_1-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> -	happyIn107-		 (L CCompOp (posOf happy_var_1)-	)}--happyReduce_408 = happySpecReduce_1  100# happyReduction_408-happyReduction_408 happy_x_1-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> -	happyIn107-		 (L CNegOp  (posOf happy_var_1)-	)}--happyReduce_409 = happySpecReduce_1  101# happyReduction_409-happyReduction_409 happy_x_1-	 =  case happyOut106 happy_x_1 of { happy_var_1 -> -	happyIn108-		 (happy_var_1-	)}--happyReduce_410 = happyMonadReduce 4# 101# happyReduction_410-happyReduction_410 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut86 happy_x_2 of { happy_var_2 -> -	case happyOut108 happy_x_4 of { happy_var_4 -> -	( withNodeInfo happy_var_1 $ CCast happy_var_2 happy_var_4)}}}-	) (\r -> happyReturn (happyIn108 r))--happyReduce_411 = happySpecReduce_1  102# happyReduction_411-happyReduction_411 happy_x_1-	 =  case happyOut108 happy_x_1 of { happy_var_1 -> -	happyIn109-		 (happy_var_1-	)}--happyReduce_412 = happyMonadReduce 3# 102# happyReduction_412-happyReduction_412 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut109 happy_x_1 of { happy_var_1 -> -	case happyOut108 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CBinary CMulOp happy_var_1 happy_var_3)}}-	) (\r -> happyReturn (happyIn109 r))--happyReduce_413 = happyMonadReduce 3# 102# happyReduction_413-happyReduction_413 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut109 happy_x_1 of { happy_var_1 -> -	case happyOut108 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CBinary CDivOp happy_var_1 happy_var_3)}}-	) (\r -> happyReturn (happyIn109 r))--happyReduce_414 = happyMonadReduce 3# 102# happyReduction_414-happyReduction_414 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut109 happy_x_1 of { happy_var_1 -> -	case happyOut108 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CBinary CRmdOp happy_var_1 happy_var_3)}}-	) (\r -> happyReturn (happyIn109 r))--happyReduce_415 = happySpecReduce_1  103# happyReduction_415-happyReduction_415 happy_x_1-	 =  case happyOut109 happy_x_1 of { happy_var_1 -> -	happyIn110-		 (happy_var_1-	)}--happyReduce_416 = happyMonadReduce 3# 103# happyReduction_416-happyReduction_416 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut110 happy_x_1 of { happy_var_1 -> -	case happyOut109 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CBinary CAddOp happy_var_1 happy_var_3)}}-	) (\r -> happyReturn (happyIn110 r))--happyReduce_417 = happyMonadReduce 3# 103# happyReduction_417-happyReduction_417 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut110 happy_x_1 of { happy_var_1 -> -	case happyOut109 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CBinary CSubOp happy_var_1 happy_var_3)}}-	) (\r -> happyReturn (happyIn110 r))--happyReduce_418 = happySpecReduce_1  104# happyReduction_418-happyReduction_418 happy_x_1-	 =  case happyOut110 happy_x_1 of { happy_var_1 -> -	happyIn111-		 (happy_var_1-	)}--happyReduce_419 = happyMonadReduce 3# 104# happyReduction_419-happyReduction_419 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut111 happy_x_1 of { happy_var_1 -> -	case happyOut110 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CBinary CShlOp happy_var_1 happy_var_3)}}-	) (\r -> happyReturn (happyIn111 r))--happyReduce_420 = happyMonadReduce 3# 104# happyReduction_420-happyReduction_420 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut111 happy_x_1 of { happy_var_1 -> -	case happyOut110 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CBinary CShrOp happy_var_1 happy_var_3)}}-	) (\r -> happyReturn (happyIn111 r))--happyReduce_421 = happySpecReduce_1  105# happyReduction_421-happyReduction_421 happy_x_1-	 =  case happyOut111 happy_x_1 of { happy_var_1 -> -	happyIn112-		 (happy_var_1-	)}--happyReduce_422 = happyMonadReduce 3# 105# happyReduction_422-happyReduction_422 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut112 happy_x_1 of { happy_var_1 -> -	case happyOut111 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CBinary CLeOp happy_var_1 happy_var_3)}}-	) (\r -> happyReturn (happyIn112 r))--happyReduce_423 = happyMonadReduce 3# 105# happyReduction_423-happyReduction_423 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut112 happy_x_1 of { happy_var_1 -> -	case happyOut111 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CBinary CGrOp happy_var_1 happy_var_3)}}-	) (\r -> happyReturn (happyIn112 r))--happyReduce_424 = happyMonadReduce 3# 105# happyReduction_424-happyReduction_424 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut112 happy_x_1 of { happy_var_1 -> -	case happyOut111 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CBinary CLeqOp happy_var_1 happy_var_3)}}-	) (\r -> happyReturn (happyIn112 r))--happyReduce_425 = happyMonadReduce 3# 105# happyReduction_425-happyReduction_425 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut112 happy_x_1 of { happy_var_1 -> -	case happyOut111 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CBinary CGeqOp happy_var_1 happy_var_3)}}-	) (\r -> happyReturn (happyIn112 r))--happyReduce_426 = happySpecReduce_1  106# happyReduction_426-happyReduction_426 happy_x_1-	 =  case happyOut112 happy_x_1 of { happy_var_1 -> -	happyIn113-		 (happy_var_1-	)}--happyReduce_427 = happyMonadReduce 3# 106# happyReduction_427-happyReduction_427 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut113 happy_x_1 of { happy_var_1 -> -	case happyOut112 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CBinary CEqOp  happy_var_1 happy_var_3)}}-	) (\r -> happyReturn (happyIn113 r))--happyReduce_428 = happyMonadReduce 3# 106# happyReduction_428-happyReduction_428 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut113 happy_x_1 of { happy_var_1 -> -	case happyOut112 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CBinary CNeqOp happy_var_1 happy_var_3)}}-	) (\r -> happyReturn (happyIn113 r))--happyReduce_429 = happySpecReduce_1  107# happyReduction_429-happyReduction_429 happy_x_1-	 =  case happyOut113 happy_x_1 of { happy_var_1 -> -	happyIn114-		 (happy_var_1-	)}--happyReduce_430 = happyMonadReduce 3# 107# happyReduction_430-happyReduction_430 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut114 happy_x_1 of { happy_var_1 -> -	case happyOut113 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CBinary CAndOp happy_var_1 happy_var_3)}}-	) (\r -> happyReturn (happyIn114 r))--happyReduce_431 = happySpecReduce_1  108# happyReduction_431-happyReduction_431 happy_x_1-	 =  case happyOut114 happy_x_1 of { happy_var_1 -> -	happyIn115-		 (happy_var_1-	)}--happyReduce_432 = happyMonadReduce 3# 108# happyReduction_432-happyReduction_432 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut115 happy_x_1 of { happy_var_1 -> -	case happyOut114 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CBinary CXorOp happy_var_1 happy_var_3)}}-	) (\r -> happyReturn (happyIn115 r))--happyReduce_433 = happySpecReduce_1  109# happyReduction_433-happyReduction_433 happy_x_1-	 =  case happyOut115 happy_x_1 of { happy_var_1 -> -	happyIn116-		 (happy_var_1-	)}--happyReduce_434 = happyMonadReduce 3# 109# happyReduction_434-happyReduction_434 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut116 happy_x_1 of { happy_var_1 -> -	case happyOut115 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CBinary COrOp happy_var_1 happy_var_3)}}-	) (\r -> happyReturn (happyIn116 r))--happyReduce_435 = happySpecReduce_1  110# happyReduction_435-happyReduction_435 happy_x_1-	 =  case happyOut116 happy_x_1 of { happy_var_1 -> -	happyIn117-		 (happy_var_1-	)}--happyReduce_436 = happyMonadReduce 3# 110# happyReduction_436-happyReduction_436 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut117 happy_x_1 of { happy_var_1 -> -	case happyOut116 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CBinary CLndOp happy_var_1 happy_var_3)}}-	) (\r -> happyReturn (happyIn117 r))--happyReduce_437 = happySpecReduce_1  111# happyReduction_437-happyReduction_437 happy_x_1-	 =  case happyOut117 happy_x_1 of { happy_var_1 -> -	happyIn118-		 (happy_var_1-	)}--happyReduce_438 = happyMonadReduce 3# 111# happyReduction_438-happyReduction_438 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut118 happy_x_1 of { happy_var_1 -> -	case happyOut117 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CBinary CLorOp happy_var_1 happy_var_3)}}-	) (\r -> happyReturn (happyIn118 r))--happyReduce_439 = happySpecReduce_1  112# happyReduction_439-happyReduction_439 happy_x_1-	 =  case happyOut118 happy_x_1 of { happy_var_1 -> -	happyIn119-		 (happy_var_1-	)}--happyReduce_440 = happyMonadReduce 5# 112# happyReduction_440-happyReduction_440 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut118 happy_x_1 of { happy_var_1 -> -	case happyOut122 happy_x_3 of { happy_var_3 -> -	case happyOut119 happy_x_5 of { happy_var_5 -> -	( withNodeInfo happy_var_1 $ CCond happy_var_1 (Just happy_var_3) happy_var_5)}}}-	) (\r -> happyReturn (happyIn119 r))--happyReduce_441 = happyMonadReduce 4# 112# happyReduction_441-happyReduction_441 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut118 happy_x_1 of { happy_var_1 -> -	case happyOut119 happy_x_4 of { happy_var_4 -> -	( withNodeInfo happy_var_1 $ CCond happy_var_1 Nothing happy_var_4)}}-	) (\r -> happyReturn (happyIn119 r))--happyReduce_442 = happySpecReduce_1  113# happyReduction_442-happyReduction_442 happy_x_1-	 =  case happyOut119 happy_x_1 of { happy_var_1 -> -	happyIn120-		 (happy_var_1-	)}--happyReduce_443 = happyMonadReduce 3# 113# happyReduction_443-happyReduction_443 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut106 happy_x_1 of { happy_var_1 -> -	case happyOut121 happy_x_2 of { happy_var_2 -> -	case happyOut120 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ CAssign (unL happy_var_2) happy_var_1 happy_var_3)}}}-	) (\r -> happyReturn (happyIn120 r))--happyReduce_444 = happySpecReduce_1  114# happyReduction_444-happyReduction_444 happy_x_1-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> -	happyIn121-		 (L CAssignOp (posOf happy_var_1)-	)}--happyReduce_445 = happySpecReduce_1  114# happyReduction_445-happyReduction_445 happy_x_1-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> -	happyIn121-		 (L CMulAssOp (posOf happy_var_1)-	)}--happyReduce_446 = happySpecReduce_1  114# happyReduction_446-happyReduction_446 happy_x_1-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> -	happyIn121-		 (L CDivAssOp (posOf happy_var_1)-	)}--happyReduce_447 = happySpecReduce_1  114# happyReduction_447-happyReduction_447 happy_x_1-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> -	happyIn121-		 (L CRmdAssOp (posOf happy_var_1)-	)}--happyReduce_448 = happySpecReduce_1  114# happyReduction_448-happyReduction_448 happy_x_1-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> -	happyIn121-		 (L CAddAssOp (posOf happy_var_1)-	)}--happyReduce_449 = happySpecReduce_1  114# happyReduction_449-happyReduction_449 happy_x_1-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> -	happyIn121-		 (L CSubAssOp (posOf happy_var_1)-	)}--happyReduce_450 = happySpecReduce_1  114# happyReduction_450-happyReduction_450 happy_x_1-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> -	happyIn121-		 (L CShlAssOp (posOf happy_var_1)-	)}--happyReduce_451 = happySpecReduce_1  114# happyReduction_451-happyReduction_451 happy_x_1-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> -	happyIn121-		 (L CShrAssOp (posOf happy_var_1)-	)}--happyReduce_452 = happySpecReduce_1  114# happyReduction_452-happyReduction_452 happy_x_1-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> -	happyIn121-		 (L CAndAssOp (posOf happy_var_1)-	)}--happyReduce_453 = happySpecReduce_1  114# happyReduction_453-happyReduction_453 happy_x_1-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> -	happyIn121-		 (L CXorAssOp (posOf happy_var_1)-	)}--happyReduce_454 = happySpecReduce_1  114# happyReduction_454-happyReduction_454 happy_x_1-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> -	happyIn121-		 (L COrAssOp  (posOf happy_var_1)-	)}--happyReduce_455 = happySpecReduce_1  115# happyReduction_455-happyReduction_455 happy_x_1-	 =  case happyOut120 happy_x_1 of { happy_var_1 -> -	happyIn122-		 (happy_var_1-	)}--happyReduce_456 = happyMonadReduce 3# 115# happyReduction_456-happyReduction_456 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut120 happy_x_1 of { happy_var_1 -> -	case happyOut123 happy_x_3 of { happy_var_3 -> -	( let es = reverse happy_var_3 in withNodeInfo es $ CComma (happy_var_1:es))}}-	) (\r -> happyReturn (happyIn122 r))--happyReduce_457 = happySpecReduce_1  116# happyReduction_457-happyReduction_457 happy_x_1-	 =  case happyOut120 happy_x_1 of { happy_var_1 -> -	happyIn123-		 (singleton happy_var_1-	)}--happyReduce_458 = happySpecReduce_3  116# happyReduction_458-happyReduction_458 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut123 happy_x_1 of { happy_var_1 -> -	case happyOut120 happy_x_3 of { happy_var_3 -> -	happyIn123-		 (happy_var_1 `snoc` happy_var_3-	)}}--happyReduce_459 = happySpecReduce_0  117# happyReduction_459-happyReduction_459  =  happyIn124-		 (Nothing-	)--happyReduce_460 = happySpecReduce_1  117# happyReduction_460-happyReduction_460 happy_x_1-	 =  case happyOut122 happy_x_1 of { happy_var_1 -> -	happyIn124-		 (Just happy_var_1-	)}--happyReduce_461 = happySpecReduce_0  118# happyReduction_461-happyReduction_461  =  happyIn125-		 (Nothing-	)--happyReduce_462 = happySpecReduce_1  118# happyReduction_462-happyReduction_462 happy_x_1-	 =  case happyOut120 happy_x_1 of { happy_var_1 -> -	happyIn125-		 (Just happy_var_1-	)}--happyReduce_463 = happySpecReduce_1  119# happyReduction_463-happyReduction_463 happy_x_1-	 =  case happyOut119 happy_x_1 of { happy_var_1 -> -	happyIn126-		 (happy_var_1-	)}--happyReduce_464 = happyMonadReduce 1# 120# happyReduction_464-happyReduction_464 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ case happy_var_1 of CTokILit _ i -> CIntConst i)}-	) (\r -> happyReturn (happyIn127 r))--happyReduce_465 = happyMonadReduce 1# 120# happyReduction_465-happyReduction_465 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ case happy_var_1 of CTokCLit _ c -> CCharConst c)}-	) (\r -> happyReturn (happyIn127 r))--happyReduce_466 = happyMonadReduce 1# 120# happyReduction_466-happyReduction_466 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ case happy_var_1 of CTokFLit _ f -> CFloatConst f)}-	) (\r -> happyReturn (happyIn127 r))--happyReduce_467 = happyMonadReduce 1# 121# happyReduction_467-happyReduction_467 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ case happy_var_1 of CTokSLit _ s -> CStrLit s)}-	) (\r -> happyReturn (happyIn128 r))--happyReduce_468 = happyMonadReduce 2# 121# happyReduction_468-happyReduction_468 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	case happyOut129 happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_1 $ case happy_var_1 of CTokSLit _ s -> CStrLit (concatCStrings (s : reverse happy_var_2)))}}-	) (\r -> happyReturn (happyIn128 r))--happyReduce_469 = happySpecReduce_1  122# happyReduction_469-happyReduction_469 happy_x_1-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> -	happyIn129-		 (case happy_var_1 of CTokSLit _ s -> singleton s-	)}--happyReduce_470 = happySpecReduce_2  122# happyReduction_470-happyReduction_470 happy_x_2-	happy_x_1-	 =  case happyOut129 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 -> -	happyIn129-		 (case happy_var_2 of CTokSLit _ s -> happy_var_1 `snoc` s-	)}}--happyReduce_471 = happySpecReduce_1  123# happyReduction_471-happyReduction_471 happy_x_1-	 =  case happyOutTok happy_x_1 of { (CTokClangC _ (ClangCVersionTok happy_var_1)) -> -	happyIn130-		 (happy_var_1-	)}--happyReduce_472 = happySpecReduce_1  124# happyReduction_472-happyReduction_472 happy_x_1-	 =  case happyOutTok happy_x_1 of { (CTokIdent  _ happy_var_1) -> -	happyIn131-		 (happy_var_1-	)}--happyReduce_473 = happySpecReduce_1  124# happyReduction_473-happyReduction_473 happy_x_1-	 =  case happyOutTok happy_x_1 of { (CTokTyIdent _ happy_var_1) -> -	happyIn131-		 (happy_var_1-	)}--happyReduce_474 = happySpecReduce_0  125# happyReduction_474-happyReduction_474  =  happyIn132-		 ([]-	)--happyReduce_475 = happySpecReduce_1  125# happyReduction_475-happyReduction_475 happy_x_1-	 =  case happyOut133 happy_x_1 of { happy_var_1 -> -	happyIn132-		 (happy_var_1-	)}--happyReduce_476 = happySpecReduce_1  126# happyReduction_476-happyReduction_476 happy_x_1-	 =  case happyOut134 happy_x_1 of { happy_var_1 -> -	happyIn133-		 (happy_var_1-	)}--happyReduce_477 = happySpecReduce_2  126# happyReduction_477-happyReduction_477 happy_x_2-	happy_x_1-	 =  case happyOut133 happy_x_1 of { happy_var_1 -> -	case happyOut134 happy_x_2 of { happy_var_2 -> -	happyIn133-		 (happy_var_1 ++ happy_var_2-	)}}--happyReduce_478 = happyReduce 6# 127# happyReduction_478-happyReduction_478 (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 happyOut135 happy_x_4 of { happy_var_4 -> -	happyIn134-		 (reverse happy_var_4-	) `HappyStk` happyRest}--happyReduce_479 = happySpecReduce_1  128# happyReduction_479-happyReduction_479 happy_x_1-	 =  case happyOut136 happy_x_1 of { happy_var_1 -> -	happyIn135-		 (case happy_var_1 of Nothing -> empty; Just attr -> singleton attr-	)}--happyReduce_480 = happySpecReduce_3  128# happyReduction_480-happyReduction_480 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut135 happy_x_1 of { happy_var_1 -> -	case happyOut136 happy_x_3 of { happy_var_3 -> -	happyIn135-		 ((maybe id (flip snoc) happy_var_3) happy_var_1-	)}}--happyReduce_481 = happySpecReduce_0  129# happyReduction_481-happyReduction_481  =  happyIn136-		 (Nothing-	)--happyReduce_482 = happyMonadReduce 1# 129# happyReduction_482-happyReduction_482 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { (CTokIdent  _ happy_var_1) -> -	( withNodeInfo happy_var_1 $ Just . CAttr happy_var_1  [])}-	) (\r -> happyReturn (happyIn136 r))--happyReduce_483 = happyMonadReduce 1# 129# happyReduction_483-happyReduction_483 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ Just . CAttr (internalIdent "const") [])}-	) (\r -> happyReturn (happyIn136 r))--happyReduce_484 = happyMonadReduce 4# 129# happyReduction_484-happyReduction_484 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { (CTokIdent  _ happy_var_1) -> -	case happyOut137 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_1 $ Just . CAttr happy_var_1 (reverse happy_var_3))}}-	) (\r -> happyReturn (happyIn136 r))--happyReduce_485 = happyMonadReduce 3# 129# happyReduction_485-happyReduction_485 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { (CTokIdent  _ happy_var_1) -> -	( withNodeInfo happy_var_1 $ Just . CAttr happy_var_1 [])}-	) (\r -> happyReturn (happyIn136 r))--happyReduce_486 = happySpecReduce_1  130# happyReduction_486-happyReduction_486 happy_x_1-	 =  case happyOut126 happy_x_1 of { happy_var_1 -> -	happyIn137-		 (singleton happy_var_1-	)}--happyReduce_487 = happySpecReduce_3  130# happyReduction_487-happyReduction_487 happy_x_3-	happy_x_2-	happy_x_1-	 =  happyIn137-		 (Reversed []-	)--happyReduce_488 = happySpecReduce_3  130# happyReduction_488-happyReduction_488 happy_x_3-	happy_x_2-	happy_x_1-	 =  happyIn137-		 (Reversed []-	)--happyReduce_489 = happySpecReduce_3  130# happyReduction_489-happyReduction_489 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut137 happy_x_1 of { happy_var_1 -> -	case happyOut126 happy_x_3 of { happy_var_3 -> -	happyIn137-		 (happy_var_1 `snoc` happy_var_3-	)}}--happyReduce_490 = happyReduce 5# 130# happyReduction_490-happyReduction_490 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut137 happy_x_1 of { happy_var_1 -> -	happyIn137-		 (happy_var_1-	) `HappyStk` happyRest}--happyReduce_491 = happyReduce 5# 130# happyReduction_491-happyReduction_491 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut137 happy_x_1 of { happy_var_1 -> -	happyIn137-		 (happy_var_1-	) `HappyStk` happyRest}--happyNewToken action sts stk-	= lexC(\tk -> -	let cont i = happyDoAction i tk action sts stk in-	case tk of {-	CTokEof -> happyDoAction 113# tk action sts stk;-	CTokLParen	_ -> cont 1#;-	CTokRParen	_ -> cont 2#;-	CTokLBracket	_ -> cont 3#;-	CTokRBracket	_ -> cont 4#;-	CTokArrow	_ -> cont 5#;-	CTokDot	_ -> cont 6#;-	CTokExclam	_ -> cont 7#;-	CTokTilde	_ -> cont 8#;-	CTokInc	_ -> cont 9#;-	CTokDec	_ -> cont 10#;-	CTokPlus	_ -> cont 11#;-	CTokMinus	_ -> cont 12#;-	CTokStar	_ -> cont 13#;-	CTokSlash	_ -> cont 14#;-	CTokPercent	_ -> cont 15#;-	CTokAmper	_ -> cont 16#;-	CTokShiftL	_ -> cont 17#;-	CTokShiftR	_ -> cont 18#;-	CTokLess	_ -> cont 19#;-	CTokLessEq	_ -> cont 20#;-	CTokHigh	_ -> cont 21#;-	CTokHighEq	_ -> cont 22#;-	CTokEqual	_ -> cont 23#;-	CTokUnequal	_ -> cont 24#;-	CTokHat	_ -> cont 25#;-	CTokBar	_ -> cont 26#;-	CTokAnd	_ -> cont 27#;-	CTokOr	_ -> cont 28#;-	CTokQuest	_ -> cont 29#;-	CTokColon	_ -> cont 30#;-	CTokAssign	_ -> cont 31#;-	CTokPlusAss	_ -> cont 32#;-	CTokMinusAss	_ -> cont 33#;-	CTokStarAss	_ -> cont 34#;-	CTokSlashAss	_ -> cont 35#;-	CTokPercAss	_ -> cont 36#;-	CTokAmpAss	_ -> cont 37#;-	CTokHatAss	_ -> cont 38#;-	CTokBarAss	_ -> cont 39#;-	CTokSLAss	_ -> cont 40#;-	CTokSRAss	_ -> cont 41#;-	CTokComma	_ -> cont 42#;-	CTokSemic	_ -> cont 43#;-	CTokLBrace	_ -> cont 44#;-	CTokRBrace	_ -> cont 45#;-	CTokEllipsis	_ -> cont 46#;-	CTokAlignof	_ -> cont 47#;-	CTokAlignas   _ -> cont 48#;-	CTokAtomic    _ -> cont 49#;-	CTokAsm	_ -> cont 50#;-	CTokAuto	_ -> cont 51#;-	CTokBreak	_ -> cont 52#;-	CTokBool	_ -> cont 53#;-	CTokCase	_ -> cont 54#;-	CTokChar	_ -> cont 55#;-	CTokConst	_ -> cont 56#;-	CTokContinue	_ -> cont 57#;-	CTokComplex	_ -> cont 58#;-	CTokDefault	_ -> cont 59#;-	CTokDo	_ -> cont 60#;-	CTokDouble	_ -> cont 61#;-	CTokElse	_ -> cont 62#;-	CTokEnum	_ -> cont 63#;-	CTokExtern	_ -> cont 64#;-	CTokFloat	_ -> cont 65#;-	CTokFloat128	_ -> cont 66#;-	CTokFloat128	_ -> cont 67#;-	CTokFor	_ -> cont 68#;-	CTokGeneric   _ -> cont 69#;-	CTokGoto	_ -> cont 70#;-	CTokIf	_ -> cont 71#;-	CTokInline	_ -> cont 72#;-	CTokInt	_ -> cont 73#;-	CTokInt128    _ -> cont 74#;-	CTokLong	_ -> cont 75#;-	CTokLabel	_ -> cont 76#;-	CTokNoreturn  _ -> cont 77#;-	CTokNullable  _ -> cont 78#;-	CTokNonnull   _ -> cont 79#;-	CTokRegister	_ -> cont 80#;-	CTokRestrict	_ -> cont 81#;-	CTokReturn	_ -> cont 82#;-	CTokShort	_ -> cont 83#;-	CTokSigned	_ -> cont 84#;-	CTokSizeof	_ -> cont 85#;-	CTokStatic	_ -> cont 86#;-	CTokStaticAssert _ -> cont 87#;-	CTokStruct	_ -> cont 88#;-	CTokSwitch	_ -> cont 89#;-	CTokTypedef	_ -> cont 90#;-	CTokTypeof	_ -> cont 91#;-	CTokThread	_ -> cont 92#;-	CTokUnion	_ -> cont 93#;-	CTokUnsigned	_ -> cont 94#;-	CTokVoid	_ -> cont 95#;-	CTokVolatile	_ -> cont 96#;-	CTokWhile	_ -> cont 97#;-	CTokCLit   _ _ -> cont 98#;-	CTokILit   _ _ -> cont 99#;-	CTokFLit   _ _ -> cont 100#;-	CTokSLit   _ _ -> cont 101#;-	CTokIdent  _ happy_dollar_dollar -> cont 102#;-	CTokTyIdent _ happy_dollar_dollar -> cont 103#;-	CTokGnuC GnuCAttrTok _ -> cont 104#;-	CTokGnuC GnuCExtTok  _ -> cont 105#;-	CTokGnuC GnuCComplexReal _ -> cont 106#;-	CTokGnuC GnuCComplexImag _ -> cont 107#;-	CTokGnuC GnuCVaArg    _ -> cont 108#;-	CTokGnuC GnuCOffsetof _ -> cont 109#;-	CTokGnuC GnuCTyCompat _ -> cont 110#;-	CTokClangC _ ClangBuiltinConvertVector -> cont 111#;-	CTokClangC _ (ClangCVersionTok happy_dollar_dollar) -> cont 112#;-	_ -> happyError' tk-	})--happyError_ 113# tk = happyError' tk-happyError_ _ tk = happyError' tk--happyThen :: () => P a -> (a -> P b) -> P b-happyThen = (>>=)-happyReturn :: () => a -> P a-happyReturn = (return)-happyThen1 = happyThen-happyReturn1 :: () => a -> P a-happyReturn1 = happyReturn-happyError' :: () => (CToken) -> P a-happyError' tk = (\token -> happyError) tk--translation_unit = happySomeParser where-  happySomeParser = happyThen (happyParse 0#) (\x -> happyReturn (happyOut7 x))--external_declaration = happySomeParser where-  happySomeParser = happyThen (happyParse 1#) (\x -> happyReturn (happyOut9 x))--statement = happySomeParser where-  happySomeParser = happyThen (happyParse 2#) (\x -> happyReturn (happyOut12 x))--expression = happySomeParser where-  happySomeParser = happyThen (happyParse 3#) (\x -> happyReturn (happyOut122 x))--happySeq = happyDontSeq-----  sometimes it is neccessary to reverse an unreversed list-reverseList :: [a] -> Reversed [a]-reverseList = Reversed . List.reverse---- We occasionally need things to have a location when they don't naturally--- have one built in as tokens and most AST elements do.----data Located a = L !a !Position--unL :: Located a -> a-unL (L a pos) = a--instance Pos (Located a) where-  posOf (L _ pos) = pos---- FIXME: the next 3 inlines here increase the object file size by  70%--- Check whether the speed win is worth it-{-# INLINE withNodeInfo #-}-withNodeInfo :: Pos node => node -> (NodeInfo -> a) -> P a-withNodeInfo node mkAttrNode = do-  name <- getNewName-  lastTok <- getSavedToken-  let firstPos = posOf node-  let attrs = mkNodeInfo' firstPos (posLenOfTok $! lastTok) name-  attrs `seq` return (mkAttrNode attrs)--{-# INLINE withLength #-}-withLength :: NodeInfo -> (NodeInfo -> a) -> P a-withLength nodeinfo mkAttrNode = do-  lastTok <- getSavedToken-  let firstPos = posOfNode nodeinfo-  let attrs = mkNodeInfo' firstPos (posLenOfTok $! lastTok)-              (maybe (error "nameOfNode") id (nameOfNode nodeinfo))-  attrs `seq` return (mkAttrNode attrs)--data CDeclrR = CDeclrR (Maybe Ident) (Reversed [CDerivedDeclr]) (Maybe CStrLit) [CAttr] NodeInfo-reverseDeclr :: CDeclrR -> CDeclr-reverseDeclr (CDeclrR ide reversedDDs asmname cattrs at)-    = CDeclr ide (reverse reversedDDs) asmname cattrs at-instance CNode (CDeclrR) where-    nodeInfo (CDeclrR _ _ _ _ n) = n-instance Pos (CDeclrR) where-    posOf (CDeclrR _ _ _ _ n) = posOf n--{-# INLINE withAttribute #-}-withAttribute :: Pos node => node -> [CAttr] -> (NodeInfo -> CDeclrR) -> P CDeclrR-withAttribute node cattrs mkDeclrNode = do-  name <- getNewName-  let attrs = mkNodeInfo (posOf node) name-  let newDeclr = appendDeclrAttrs cattrs $ mkDeclrNode attrs-  attrs `seq` newDeclr `seq` return newDeclr---- postfixing variant-{-# INLINE withAttributePF #-}-withAttributePF :: Pos node => node -> [CAttr] -> (NodeInfo -> CDeclrR -> CDeclrR) -> P (CDeclrR -> CDeclrR)-withAttributePF node cattrs mkDeclrCtor = do-  name <- getNewName-  let attrs = mkNodeInfo (posOf node) name-  let newDeclr = appendDeclrAttrs cattrs . mkDeclrCtor attrs-  attrs `seq` newDeclr `seq` return newDeclr---- add top level attributes for a declarator.------ In the following example------ > int declr1, __attribute__((a1)) * __attribute__((a2)) y() __asm__("$" "y") __attribute__((a3));------ the attributes `a1' and `a3' are top-level attributes for y.--- The (pseudo)-AST for the second declarator is------ > CDeclr "y"--- >        [CFunDeclr ..., CPtrDeclr __attribute__((a2)) ... ]--- >        (asm "$y")--- >        [__attribute__((a1)), __attribute__((a3)) ]------ So assembler names and preceeding and trailing attributes are recorded in object declarator.----appendObjAttrs :: [CAttr] -> CDeclr -> CDeclr-appendObjAttrs newAttrs (CDeclr ident indirections asmname cAttrs at)-    = CDeclr ident indirections asmname (cAttrs ++ newAttrs) at-appendObjAttrsR :: [CAttr] -> CDeclrR -> CDeclrR-appendObjAttrsR newAttrs (CDeclrR ident indirections asmname cAttrs at)-    = CDeclrR ident indirections asmname (cAttrs ++ newAttrs) at--setAsmName :: Maybe CStrLit  -> CDeclrR -> P CDeclrR-setAsmName mAsmName (CDeclrR ident indirections oldName cattrs at) =-    case combineName mAsmName oldName of-        Left (n1,n2)       -> failP (posOf n2) ["Duplicate assembler name: ",showName n1,showName n2]-        Right newName      -> return $ CDeclrR ident indirections newName cattrs at-  where-  combineName Nothing Nothing = Right Nothing-  combineName Nothing oldname@(Just _)  = Right oldname-  combineName newname@(Just _) Nothing  = Right newname-  combineName (Just n1) (Just n2) = Left (n1,n2)-  showName (CStrLit cstr _) = show cstr--withAsmNameAttrs :: (Maybe CStrLit, [CAttr]) -> CDeclrR -> P CDeclrR-withAsmNameAttrs (mAsmName, newAttrs) declr = setAsmName mAsmName (appendObjAttrsR newAttrs declr)--appendDeclrAttrs :: [CAttr] -> CDeclrR -> CDeclrR-appendDeclrAttrs newAttrs (CDeclrR ident (Reversed []) asmname cattrs at)-    = CDeclrR ident empty asmname (cattrs ++ newAttrs) at-appendDeclrAttrs newAttrs (CDeclrR ident (Reversed (x:xs)) asmname cattrs at)-    = CDeclrR ident (Reversed (appendAttrs x : xs)) asmname cattrs at where-    appendAttrs (CPtrDeclr typeQuals at)           = CPtrDeclr (typeQuals ++ map CAttrQual newAttrs) at-    appendAttrs (CArrDeclr typeQuals arraySize at) = CArrDeclr (typeQuals ++ map CAttrQual newAttrs) arraySize at-    appendAttrs (CFunDeclr parameters cattrs at)   = CFunDeclr parameters (cattrs ++ newAttrs) at--ptrDeclr :: CDeclrR -> [CTypeQual] -> NodeInfo -> CDeclrR-ptrDeclr (CDeclrR ident derivedDeclrs asmname cattrs dat) tyquals at-    = CDeclrR ident (derivedDeclrs `snoc` CPtrDeclr tyquals at) asmname cattrs dat-funDeclr :: CDeclrR -> (Either [Ident] ([CDecl],Bool)) -> [CAttr] -> NodeInfo -> CDeclrR-funDeclr (CDeclrR ident derivedDeclrs asmname dcattrs dat) params cattrs at-    = CDeclrR ident (derivedDeclrs `snoc` CFunDeclr params cattrs at) asmname dcattrs dat-arrDeclr :: CDeclrR -> [CTypeQual] -> Bool -> Bool -> Maybe CExpr -> NodeInfo -> CDeclrR-arrDeclr (CDeclrR ident derivedDeclrs asmname cattrs dat) tyquals var_sized static_size size_expr_opt at-    = arr_sz `seq` ( CDeclrR ident (derivedDeclrs `snoc` CArrDeclr tyquals arr_sz at) asmname cattrs dat )-    where-    arr_sz = case size_expr_opt of-                 Just e  -> CArrSize static_size e-                 Nothing -> CNoArrSize var_sized--liftTypeQuals :: Reversed [CTypeQual] -> [CDeclSpec]-liftTypeQuals = map CTypeQual . reverse---- lift CAttrs to DeclSpecs----liftCAttrs :: [CAttr] -> [CDeclSpec]-liftCAttrs = map (CTypeQual . CAttrQual)---- when we parsed (decl_spec_1,...,decl_spec_n,attrs), add the __attributes__s to the declspec list--- needs special care when @decl_spec_n@ is a SUE definition-addTrailingAttrs :: Reversed [CDeclSpec] -> [CAttr] -> Reversed [CDeclSpec]-addTrailingAttrs declspecs new_attrs =-    case viewr declspecs of-        (specs_init, CTypeSpec (CSUType (CStruct tag name (Just def) def_attrs su_node) node))-            -> (specs_init `snoc` CTypeSpec (CSUType (CStruct tag name (Just def) (def_attrs ++ new_attrs) su_node) node))-        (specs_init, CTypeSpec (CEnumType (CEnum name (Just def) def_attrs e_node) node))-            -> (specs_init `snoc` CTypeSpec (CEnumType (CEnum name (Just def) (def_attrs ++ new_attrs) e_node) node))-        _ -> declspecs `rappend` (liftCAttrs new_attrs)---- convenient instance, the position of a list of things is the position of--- the first thing in the list----instance Pos a => Pos [a] where-  posOf (x:_) = posOf x--instance Pos a => Pos (Reversed a) where-  posOf (Reversed x) = posOf x--emptyDeclr :: CDeclrR-emptyDeclr       = CDeclrR Nothing empty Nothing [] undefNode-mkVarDeclr :: Ident -> NodeInfo -> CDeclrR-mkVarDeclr ident = CDeclrR (Just ident) empty Nothing []---- Take the identifiers and use them to update the typedef'ed identifier set--- if the decl is defining a typedef then we add it to the set,--- if it's a var decl then that shadows typedefed identifiers----doDeclIdent :: [CDeclSpec] -> CDeclrR -> P ()-doDeclIdent declspecs (CDeclrR mIdent _ _ _ _) =-  case mIdent of-    Nothing -> return ()-    Just ident | any iypedef declspecs -> addTypedef ident-               | otherwise             -> shadowTypedef ident--  where iypedef (CStorageSpec (CTypedef _)) = True-        iypedef _                           = False--doFuncParamDeclIdent :: CDeclr -> P ()-doFuncParamDeclIdent (CDeclr _ (CFunDeclr params _ _ : _) _ _ _) =-  sequence_-    [ case getCDeclrIdent declr of-        Nothing -> return ()-        Just ident -> shadowTypedef ident-    | CDecl _ dle _  <- either (const []) fst params-    , (Just declr, _, _) <- dle ]-doFuncParamDeclIdent _ = return ()---- extract all identifiers-getCDeclrIdent :: CDeclr -> Maybe Ident-getCDeclrIdent (CDeclr mIdent _ _ _ _) = mIdent--happyError :: P a-happyError = parseError---- * public interface---- | @parseC input initialPos@ parses the given preprocessed C-source input and returns the AST or a list of parse errors.-parseC :: InputStream -> Position -> Either ParseError CTranslUnit-parseC input initialPosition =-  fmap fst $ execParser translUnitP input initialPosition builtinTypeNames (namesStartingFrom 0)---- | @translUnitP@ provides a parser for a complete C translation unit, i.e. a list of external declarations.-translUnitP :: P CTranslUnit-translUnitP = translation_unit--- | @extDeclP@ provides a parser for an external (file-scope) declaration-extDeclP :: P CExtDecl-extDeclP = external_declaration--- | @statementP@ provides a parser for C statements-statementP :: P CStat-statementP = statement--- | @expressionP@ provides a parser for C expressions-expressionP :: P CExpr-expressionP = expression-{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "<built-in>" #-}-{-# LINE 1 "<command-line>" #-}-{-# LINE 8 "<command-line>" #-}-# 1 "/usr/include/stdc-predef.h" 1 3 4--# 17 "/usr/include/stdc-predef.h" 3 4-------------------------------------------{-# LINE 8 "<command-line>" #-}-{-# LINE 1 "templates/GenericTemplate.hs" #-}--- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp --{-# LINE 13 "templates/GenericTemplate.hs" #-}-------- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.-#if __GLASGOW_HASKELL__ > 706-#define LT(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.<# m)) :: Bool)-#define GTE(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.>=# m)) :: Bool)-#define EQ(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.==# m)) :: Bool)-#else-#define LT(n,m) (n Happy_GHC_Exts.<# m)-#define GTE(n,m) (n Happy_GHC_Exts.>=# m)-#define EQ(n,m) (n Happy_GHC_Exts.==# m)-#endif-{-# LINE 46 "templates/GenericTemplate.hs" #-}---data Happy_IntList = HappyCons Happy_GHC_Exts.Int# Happy_IntList------{-# LINE 67 "templates/GenericTemplate.hs" #-}--{-# LINE 77 "templates/GenericTemplate.hs" #-}--{-# LINE 86 "templates/GenericTemplate.hs" #-}--infixr 9 `HappyStk`-data HappyStk a = HappyStk a (HappyStk a)---------------------------------------------------------------------------------- starting the parse--happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll---------------------------------------------------------------------------------- Accepting the parse---- If the current token is 0#, it means we've just accepted a partial--- parse (a %partial parser).  We must ignore the saved token on the top of--- the stack in this case.-happyAccept 0# tk st sts (_ `HappyStk` ans `HappyStk` _) =-        happyReturn1 ans-happyAccept j tk st sts (HappyStk ans _) = -        (happyTcHack j (happyTcHack st)) (happyReturn1 ans)---------------------------------------------------------------------------------- Arrays only: do the next action----happyDoAction i tk st-        = {- nothing -}---          case action of-                0#           -> {- nothing -}-                                     happyFail i tk st-                -1#          -> {- nothing -}-                                     happyAccept i tk st-                n | LT(n,(0# :: Happy_GHC_Exts.Int#)) -> {- nothing -}--                                                   (happyReduceArr Happy_Data_Array.! rule) i tk st-                                                   where rule = (Happy_GHC_Exts.I# ((Happy_GHC_Exts.negateInt# ((n Happy_GHC_Exts.+# (1# :: Happy_GHC_Exts.Int#))))))-                n                 -> {- nothing -}---                                     happyShift new_state i tk st-                                     where new_state = (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#))-   where off    = indexShortOffAddr happyActOffsets st-         off_i  = (off Happy_GHC_Exts.+# i)-         check  = if GTE(off_i,(0# :: Happy_GHC_Exts.Int#))-                  then EQ(indexShortOffAddr happyCheck off_i, i)-                  else False-         action-          | check     = indexShortOffAddr happyTable off_i-          | otherwise = indexShortOffAddr happyDefActions st---indexShortOffAddr (HappyA# arr) off =-        Happy_GHC_Exts.narrow16Int# i-  where-        i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.uncheckedShiftL# high 8#) low)-        high = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr (off' Happy_GHC_Exts.+# 1#)))-        low  = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr off'))-        off' = off Happy_GHC_Exts.*# 2#------data HappyAddr = HappyA# Happy_GHC_Exts.Addr#------------------------------------------------------------------------------------- HappyState data type (not arrays)--{-# LINE 170 "templates/GenericTemplate.hs" #-}---------------------------------------------------------------------------------- Shifting a token--happyShift new_state 0# tk st sts stk@(x `HappyStk` _) =-     let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in---     trace "shifting the error token" $-     happyDoAction i tk new_state (HappyCons (st) (sts)) (stk)--happyShift new_state i tk st sts stk =-     happyNewToken new_state (HappyCons (st) (sts)) ((happyInTok (tk))`HappyStk`stk)---- happyReduce is specialised for the common cases.--happySpecReduce_0 i fn 0# tk st sts stk-     = happyFail 0# tk st sts stk-happySpecReduce_0 nt fn j tk st@((action)) sts stk-     = happyGoto nt j tk st (HappyCons (st) (sts)) (fn `HappyStk` stk)--happySpecReduce_1 i fn 0# tk st sts stk-     = happyFail 0# tk st sts stk-happySpecReduce_1 nt fn j tk _ sts@((HappyCons (st@(action)) (_))) (v1`HappyStk`stk')-     = let r = fn v1 in-       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))--happySpecReduce_2 i fn 0# tk st sts stk-     = happyFail 0# tk st sts stk-happySpecReduce_2 nt fn j tk _ (HappyCons (_) (sts@((HappyCons (st@(action)) (_))))) (v1`HappyStk`v2`HappyStk`stk')-     = let r = fn v1 v2 in-       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))--happySpecReduce_3 i fn 0# tk st sts stk-     = happyFail 0# tk st sts stk-happySpecReduce_3 nt fn j tk _ (HappyCons (_) ((HappyCons (_) (sts@((HappyCons (st@(action)) (_))))))) (v1`HappyStk`v2`HappyStk`v3`HappyStk`stk')-     = let r = fn v1 v2 v3 in-       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))--happyReduce k i fn 0# tk st sts stk-     = happyFail 0# tk st sts stk-happyReduce k nt fn j tk st sts stk-     = case happyDrop (k Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) sts of-         sts1@((HappyCons (st1@(action)) (_))) ->-                let r = fn stk in  -- it doesn't hurt to always seq here...-                happyDoSeq r (happyGoto nt j tk st1 sts1 r)--happyMonadReduce k nt fn 0# tk st sts stk-     = happyFail 0# tk st sts stk-happyMonadReduce k nt fn j tk st sts stk =-      case happyDrop k (HappyCons (st) (sts)) of-        sts1@((HappyCons (st1@(action)) (_))) ->-          let drop_stk = happyDropStk k stk in-          happyThen1 (fn stk tk) (\r -> happyGoto nt j tk st1 sts1 (r `HappyStk` drop_stk))--happyMonad2Reduce k nt fn 0# tk st sts stk-     = happyFail 0# tk st sts stk-happyMonad2Reduce k nt fn j tk st sts stk =-      case happyDrop k (HappyCons (st) (sts)) of-        sts1@((HappyCons (st1@(action)) (_))) ->-         let drop_stk = happyDropStk k stk--             off = indexShortOffAddr happyGotoOffsets st1-             off_i = (off Happy_GHC_Exts.+# nt)-             new_state = indexShortOffAddr happyTable off_i----          in-          happyThen1 (fn stk tk) (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk))--happyDrop 0# l = l-happyDrop n (HappyCons (_) (t)) = happyDrop (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) t--happyDropStk 0# l = l-happyDropStk n (x `HappyStk` xs) = happyDropStk (n Happy_GHC_Exts.-# (1#::Happy_GHC_Exts.Int#)) xs---------------------------------------------------------------------------------- Moving to a new state after a reduction---happyGoto nt j tk st = -   {- nothing -}-   happyDoAction j tk new_state-   where off = indexShortOffAddr happyGotoOffsets st-         off_i = (off Happy_GHC_Exts.+# nt)-         new_state = indexShortOffAddr happyTable off_i------------------------------------------------------------------------------------- Error recovery (0# is the error token)---- parse error if we are in recovery and we fail again-happyFail 0# tk old_st _ stk@(x `HappyStk` _) =-     let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in---      trace "failing" $ -        happyError_ i tk--{-  We don't need state discarding for our restricted implementation of-    "error".  In fact, it can cause some bogus parses, so I've disabled it-    for now --SDM---- discard a state-happyFail  0# tk old_st (HappyCons ((action)) (sts)) -                                                (saved_tok `HappyStk` _ `HappyStk` stk) =---      trace ("discarding state, depth " ++ show (length stk))  $-        happyDoAction 0# tk action sts ((saved_tok`HappyStk`stk))--}---- Enter error recovery: generate an error token,---                       save the old token and carry on.-happyFail  i tk (action) sts stk =---      trace "entering error recovery" $-        happyDoAction 0# tk action sts ( (Happy_GHC_Exts.unsafeCoerce# (Happy_GHC_Exts.I# (i))) `HappyStk` stk)---- Internal happy errors:--notHappyAtAll :: a-notHappyAtAll = error "Internal Happy error\n"---------------------------------------------------------------------------------- Hack to get the typechecker to accept our action functions---happyTcHack :: Happy_GHC_Exts.Int# -> a -> a-happyTcHack x y = y-{-# INLINE happyTcHack #-}----------------------------------------------------------------------------------- Seq-ing.  If the --strict flag is given, then Happy emits ---      happySeq = happyDoSeq--- otherwise it emits---      happySeq = happyDontSeq--happyDoSeq, happyDontSeq :: a -> b -> b-happyDoSeq   a b = a `seq` b-happyDontSeq a b = b---------------------------------------------------------------------------------- Don't inline any functions from the template.  GHC has a nasty habit--- of deciding to inline happyGoto everywhere, which increases the size of--- the generated parser quite a bit.---{-# NOINLINE happyDoAction #-}-{-# NOINLINE happyTable #-}-{-# NOINLINE happyCheck #-}-{-# NOINLINE happyActOffsets #-}-{-# NOINLINE happyGotoOffsets #-}-{-# NOINLINE happyDefActions #-}--{-# NOINLINE happyShift #-}-{-# NOINLINE happySpecReduce_0 #-}-{-# NOINLINE happySpecReduce_1 #-}-{-# NOINLINE happySpecReduce_2 #-}-{-# NOINLINE happySpecReduce_3 #-}-{-# NOINLINE happyReduce #-}-{-# NOINLINE happyMonadReduce #-}-{-# NOINLINE happyGoto #-}-{-# NOINLINE happyFail #-}---- end of Happy Template.
language-c.cabal view
@@ -1,121 +1,121 @@-Name:           language-c-Version:        0.7.1-Cabal-Version:  >= 1.8-Build-Type:     Simple-License:        BSD3-License-File:   LICENSE-Copyright:      LICENSE-Author:         AUTHORS-Maintainer:     benedikt.huber@gmail.com-Stability:      experimental-Homepage:       http://visq.github.io/language-c/-Bug-reports:    https://github.com/visq/language-c/issues/--Synopsis:       Analysis and generation of C code-Description:    Language C is a haskell library for the analysis and generation of C code.-                It features a complete, well tested parser and pretty printer for all of C99 and a large-                set of C11 and clang/GNU extensions.-Category:       Language-Tested-With:    GHC == 7.8.*, GHC == 7.10.*, GHC == 8.0.*, GHC == 8.2.1--Extra-Source-Files: AUTHORS AUTHORS.c2hs ChangeLog README-                    src/Language/C/Parser/Lexer.x-                    src/Language/C/Parser/Parser.y--Source-Repository head-  type:     git-  location: https://github.com/visq/language-c.git--Flag splitBase-    Description: Choose the new smaller, split-up base package.-Flag useByteStrings-    Description: Use ByteString as InputStream datatype-    Default: True-Flag separateSYB-  description: Data.Generics available in separate package.-Flag allWarnings-    Description: Turn on all warnings for building (development)-    Default: False-Library-    Extensions: CPP, DeriveDataTypeable, PatternGuards, BangPatterns, ExistentialQuantification, GeneralizedNewtypeDeriving, ScopedTypeVariables-    Build-Depends:  filepath-    if flag(allWarnings)-        if impl(ghc >= 8.0)-          ghc-options:     -Wall -Wno-redundant-constraints-        else-          ghc-options:     -Wall-    if flag(splitBase)-        Build-Depends: base >= 3 && < 5, process, directory, array, containers, pretty--        If flag(separateSYB)-          Build-Depends:-            base >=4 && <5,-            syb-        Else-          Build-Depends:-            base <4-    else-        Build-Depends: base < 3--    if flag(useByteStrings)-        Build-Depends: bytestring >= 0.9.0-    else-        cpp-options: -DNO_BYTESTRING-    Build-Tools:    happy, alex--    Hs-Source-Dirs: src-    Exposed-Modules:-                      -- top-level-                      Language.C-                      -- data-                      Language.C.Data-                      Language.C.Data.Position-                      Language.C.Data.Ident-                      Language.C.Data.Error-                      Language.C.Data.Name-                      Language.C.Data.Node-                      Language.C.Data.InputStream-                      -- syntax-                      Language.C.Syntax-                      Language.C.Syntax.AST-                      Language.C.Syntax.Constants-                      Language.C.Syntax.Ops-                      Language.C.Syntax.Utils-                      -- parser-                      Language.C.Parser-                      -- pretty printer-                      Language.C.Pretty-                      -- system-                      Language.C.System.Preprocess-                      Language.C.System.GCC-                      -- analysis [experimental]-                      Language.C.Analysis-                      Language.C.Analysis.ConstEval-                      Language.C.Analysis.Builtins-                      Language.C.Analysis.SemError-                      Language.C.Analysis.SemRep-                      Language.C.Analysis.DefTable-                      Language.C.Analysis.TravMonad-                      Language.C.Analysis.AstAnalysis-                      Language.C.Analysis.DeclAnalysis-                      Language.C.Analysis.Debug-                      Language.C.Analysis.TypeCheck-                      Language.C.Analysis.TypeConversions-                      Language.C.Analysis.TypeUtils-                      Language.C.Analysis.NameSpaceMap-                      -- semrep -> code [alpha]-                      Language.C.Analysis.Export-    Other-Modules:-                      Language.C.Data.RList-                      -- parser implementation-                      Language.C.Parser.Builtin-                      Language.C.Parser.Lexer-                      Language.C.Parser.ParserMonad-                      Language.C.Parser.Tokens-                      Language.C.Parser.Parser---- test description-Test-Suite language-c-harness-    type:       exitcode-stdio-1.0-    main-is:    test/harness/run-harness.hs+Name:           language-c
+Version:        0.7.2
+Cabal-Version:  >= 1.8
+Build-Type:     Simple
+License:        BSD3
+License-File:   LICENSE
+Copyright:      LICENSE
+Author:         AUTHORS
+Maintainer:     benedikt.huber@gmail.com
+Stability:      experimental
+Homepage:       http://visq.github.io/language-c/
+Bug-reports:    https://github.com/visq/language-c/issues/
+
+Synopsis:       Analysis and generation of C code
+Description:    Language C is a haskell library for the analysis and generation of C code.
+                It features a complete, well tested parser and pretty printer for all of C99 and a large
+                set of C11 and clang/GNU extensions.
+Category:       Language
+Tested-With:    GHC == 7.8.*, GHC == 7.10.*, GHC == 8.0.*, GHC == 8.2.1
+
+Extra-Source-Files: AUTHORS AUTHORS.c2hs ChangeLog README
+                    src/Language/C/Parser/Lexer.x
+                    src/Language/C/Parser/Parser.y
+
+Source-Repository head
+  type:     git
+  location: https://github.com/visq/language-c.git
+
+Flag splitBase
+    Description: Choose the new smaller, split-up base package.
+Flag useByteStrings
+    Description: Use ByteString as InputStream datatype
+    Default: True
+Flag separateSYB
+  description: Data.Generics available in separate package.
+Flag allWarnings
+    Description: Turn on all warnings for building (development)
+    Default: False
+Library
+    Extensions: CPP, DeriveDataTypeable, PatternGuards, BangPatterns, ExistentialQuantification, GeneralizedNewtypeDeriving, ScopedTypeVariables
+    Build-Depends:  filepath
+    if flag(allWarnings)
+        if impl(ghc >= 8.0)
+          ghc-options:     -Wall -Wno-redundant-constraints
+        else
+          ghc-options:     -Wall
+    if flag(splitBase)
+        Build-Depends: base >= 3 && < 5, process, directory, array, containers, pretty < 1.2.0
+
+        If flag(separateSYB)
+          Build-Depends:
+            base >=4 && <5,
+            syb
+        Else
+          Build-Depends:
+            base <4
+    else
+        Build-Depends: base < 3
+
+    if flag(useByteStrings)
+        Build-Depends: bytestring >= 0.9.0
+    else
+        cpp-options: -DNO_BYTESTRING
+    Build-Tools:    happy, alex
+
+    Hs-Source-Dirs: src
+    Exposed-Modules:
+                      -- top-level
+                      Language.C
+                      -- data
+                      Language.C.Data
+                      Language.C.Data.Position
+                      Language.C.Data.Ident
+                      Language.C.Data.Error
+                      Language.C.Data.Name
+                      Language.C.Data.Node
+                      Language.C.Data.InputStream
+                      -- syntax
+                      Language.C.Syntax
+                      Language.C.Syntax.AST
+                      Language.C.Syntax.Constants
+                      Language.C.Syntax.Ops
+                      Language.C.Syntax.Utils
+                      -- parser
+                      Language.C.Parser
+                      -- pretty printer
+                      Language.C.Pretty
+                      -- system
+                      Language.C.System.Preprocess
+                      Language.C.System.GCC
+                      -- analysis [experimental]
+                      Language.C.Analysis
+                      Language.C.Analysis.ConstEval
+                      Language.C.Analysis.Builtins
+                      Language.C.Analysis.SemError
+                      Language.C.Analysis.SemRep
+                      Language.C.Analysis.DefTable
+                      Language.C.Analysis.TravMonad
+                      Language.C.Analysis.AstAnalysis
+                      Language.C.Analysis.DeclAnalysis
+                      Language.C.Analysis.Debug
+                      Language.C.Analysis.TypeCheck
+                      Language.C.Analysis.TypeConversions
+                      Language.C.Analysis.TypeUtils
+                      Language.C.Analysis.NameSpaceMap
+                      -- semrep -> code [alpha]
+                      Language.C.Analysis.Export
+    Other-Modules:
+                      Language.C.Data.RList
+                      -- parser implementation
+                      Language.C.Parser.Builtin
+                      Language.C.Parser.Lexer
+                      Language.C.Parser.ParserMonad
+                      Language.C.Parser.Tokens
+                      Language.C.Parser.Parser
+
+-- test description
+Test-Suite language-c-harness
+    type:       exitcode-stdio-1.0
+    main-is:    test/harness/run-harness.hs
     build-depends: base, language-c, directory, process, filepath
src/Language/C.hs view
@@ -1,53 +1,53 @@--------------------------------------------------------------------------------- |--- Module      :  Language.C--- Copyright   :  (c) 2008 Benedikt Huber---                [1995..2007]---                   Manuel M. T. Chakravarty---                   Duncan Coutts---                   Betram Felgenhauer--- License     :  BSD-style--- Maintainer  : benedikt.huber@gmail.com--- Stability   : experimental--- Portability : ghc------ Library for analysing and generating C code.------ See <http://www.sivity.net/projects/language.c>-------------------------------------------------------------------------------module Language.C (-    parseCFile, parseCFilePre, -- maybe change ?-    module Language.C.Data,-    module Language.C.Syntax,-    module Language.C.Pretty,-    module Language.C.Parser,-)-where-import Language.C.Data-import Language.C.Syntax-import Language.C.Pretty-import Language.C.Parser-import Language.C.System.Preprocess---- | preprocess (if necessary) and parse a C source file------   > Synopsis: parseCFile preprocesssor tmp-dir? cpp-opts file---   > Example:  parseCFile (newGCC "gcc") Nothing ["-I/usr/include/gtk-2.0"] my-gtk-exts.c-parseCFile :: (Preprocessor cpp) => cpp -> Maybe FilePath -> [String] -> FilePath -> IO (Either ParseError CTranslUnit)-parseCFile cpp tmp_dir_opt args input_file = do-    input_stream <- if not (isPreprocessed input_file)-                        then  let cpp_args = (rawCppArgs args input_file) { cppTmpDir = tmp_dir_opt }-                              in  runPreprocessor cpp cpp_args >>= handleCppError-                        else  readInputStream input_file-    return$ parseC input_stream (initPos input_file)-    where-    handleCppError (Left exitCode) = fail $ "Preprocessor failed with " ++ show exitCode-    handleCppError (Right ok)      = return ok---- | parse an already preprocessed C file------   > Synopsis: parseCFilePre file.i-parseCFilePre :: FilePath -> IO (Either ParseError CTranslUnit)-parseCFilePre file = do-    input_stream <- readInputStream file-    return $ parseC input_stream (initPos file)+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C
+-- Copyright   :  (c) 2008 Benedikt Huber
+--                [1995..2007]
+--                   Manuel M. T. Chakravarty
+--                   Duncan Coutts
+--                   Betram Felgenhauer
+-- License     :  BSD-style
+-- Maintainer  : benedikt.huber@gmail.com
+-- Stability   : experimental
+-- Portability : ghc
+--
+-- Library for analysing and generating C code.
+--
+-- See <http://www.sivity.net/projects/language.c>
+-----------------------------------------------------------------------------
+module Language.C (
+    parseCFile, parseCFilePre, -- maybe change ?
+    module Language.C.Data,
+    module Language.C.Syntax,
+    module Language.C.Pretty,
+    module Language.C.Parser,
+)
+where
+import Language.C.Data
+import Language.C.Syntax
+import Language.C.Pretty
+import Language.C.Parser
+import Language.C.System.Preprocess
+
+-- | preprocess (if necessary) and parse a C source file
+--
+--   > Synopsis: parseCFile preprocesssor tmp-dir? cpp-opts file
+--   > Example:  parseCFile (newGCC "gcc") Nothing ["-I/usr/include/gtk-2.0"] my-gtk-exts.c
+parseCFile :: (Preprocessor cpp) => cpp -> Maybe FilePath -> [String] -> FilePath -> IO (Either ParseError CTranslUnit)
+parseCFile cpp tmp_dir_opt args input_file = do
+    input_stream <- if not (isPreprocessed input_file)
+                        then  let cpp_args = (rawCppArgs args input_file) { cppTmpDir = tmp_dir_opt }
+                              in  runPreprocessor cpp cpp_args >>= handleCppError
+                        else  readInputStream input_file
+    return$ parseC input_stream (initPos input_file)
+    where
+    handleCppError (Left exitCode) = fail $ "Preprocessor failed with " ++ show exitCode
+    handleCppError (Right ok)      = return ok
+
+-- | parse an already preprocessed C file
+--
+--   > Synopsis: parseCFilePre file.i
+parseCFilePre :: FilePath -> IO (Either ParseError CTranslUnit)
+parseCFilePre file = do
+    input_stream <- readInputStream file
+    return $ parseC input_stream (initPos file)
src/Language/C/Analysis.hs view
@@ -1,69 +1,69 @@--------------------------------------------------------------------------------- |--- Module      :  Language.C.Analysis--- Copyright   :  (c) 2008 Benedikt Huber--- License     :  BSD-style--- Maintainer  :  benedikt.huber@gmail.com--- Stability   :  alpha--- Portability :  ghc------ Analysis of the AST.------ Currently, we provide a monad for analysis and analyze declarations and types.--- Especially note that there is no direct support for analyzing function bodies and--- constant expressions.------ /NOTE/ This is an experimental interface, and therefore the API will change in the--- future.------ DONE:------  * Name analysis framework------  * File-scope analysis------  * Declaration analysis------ TODO:------  * Type checking expressions------  * Constant expression evaluation (CEE)------  * Typed representation of attributes (depends on CEE)------  * Normalized representation of initializers------  * Support for analyzing function bodies (depends on CEE)------  * Normalizing expressions and statements------  * Formal rules how to link back to the AST using NodeInfo fields------  * Typed assembler representation--------------------------------------------------------------------------------module Language.C.Analysis (-    -- * Semantic representation-    module Language.C.Analysis.SemRep,-    -- * Error datatypes for the analysis-    module Language.C.Analysis.SemError,-    -- * Traversal monad-    module Language.C.Analysis.TravMonad,-    -- * Top level analysis-    module Language.C.Analysis.AstAnalysis,-    -- * Analyzing declarations-    module Language.C.Analysis.DeclAnalysis,-    -- * Debug print-    module Language.C.Analysis.Debug,-)-where-import Language.C.Analysis.SemError-import Language.C.Analysis.SemRep--import Language.C.Analysis.TravMonad--import Language.C.Analysis.AstAnalysis-import Language.C.Analysis.DeclAnalysis--import Language.C.Analysis.Debug+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Analysis
+-- Copyright   :  (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  alpha
+-- Portability :  ghc
+--
+-- Analysis of the AST.
+--
+-- Currently, we provide a monad for analysis and analyze declarations and types.
+-- Especially note that there is no direct support for analyzing function bodies and
+-- constant expressions.
+--
+-- /NOTE/ This is an experimental interface, and therefore the API will change in the
+-- future.
+--
+-- DONE:
+--
+--  * Name analysis framework
+--
+--  * File-scope analysis
+--
+--  * Declaration analysis
+--
+-- TODO:
+--
+--  * Type checking expressions
+--
+--  * Constant expression evaluation (CEE)
+--
+--  * Typed representation of attributes (depends on CEE)
+--
+--  * Normalized representation of initializers
+--
+--  * Support for analyzing function bodies (depends on CEE)
+--
+--  * Normalizing expressions and statements
+--
+--  * Formal rules how to link back to the AST using NodeInfo fields
+--
+--  * Typed assembler representation
+
+-----------------------------------------------------------------------------
+module Language.C.Analysis (
+    -- * Semantic representation
+    module Language.C.Analysis.SemRep,
+    -- * Error datatypes for the analysis
+    module Language.C.Analysis.SemError,
+    -- * Traversal monad
+    module Language.C.Analysis.TravMonad,
+    -- * Top level analysis
+    module Language.C.Analysis.AstAnalysis,
+    -- * Analyzing declarations
+    module Language.C.Analysis.DeclAnalysis,
+    -- * Debug print
+    module Language.C.Analysis.Debug,
+)
+where
+import Language.C.Analysis.SemError
+import Language.C.Analysis.SemRep
+
+import Language.C.Analysis.TravMonad
+
+import Language.C.Analysis.AstAnalysis
+import Language.C.Analysis.DeclAnalysis
+
+import Language.C.Analysis.Debug
src/Language/C/Analysis/AstAnalysis.hs view
@@ -1,777 +1,777 @@-{-# LANGUAGE ScopedTypeVariables, PatternGuards #-}--------------------------------------------------------------------------------- |--- Module      :  Language.C.Parser.Translation--- Copyright   :  (c) 2008 Benedikt Huber--- License     :  BSD-style--- Maintainer  :  benedikt.huber@gmail.com--- Stability   :  alpha--- Portability :  ghc------ Analyse the parse tree------ Traverses the AST, analyses declarations and invokes handlers.-------------------------------------------------------------------------------module Language.C.Analysis.AstAnalysis (-    -- * Top-level analysis-    analyseAST,-    analyseExt,analyseFunDef,analyseDecl,-    -- * Building blocks for additional analyses-    analyseFunctionBody,-    defineParams,-    -- * Type checking-    tExpr, ExprSide(..),-    tStmt, StmtCtx(..),-    tDesignator,-    defaultMD-)-where-import Language.C.Analysis.SemError-import Language.C.Analysis.SemRep-import Language.C.Analysis.TravMonad-import Language.C.Analysis.ConstEval-import Language.C.Analysis.DefTable (globalDefs, defineLabel, inFileScope,-                                     lookupLabel, insertType, lookupType)-import Language.C.Analysis.DeclAnalysis-import Language.C.Analysis.TypeUtils-import Language.C.Analysis.TypeCheck--import Language.C.Data-import Language.C.Pretty-import Language.C.Syntax.AST-import Language.C.Syntax.Constants-import Language.C.Syntax.Ops-import Language.C.Syntax.Utils-import Text.PrettyPrint.HughesPJ---import Prelude hiding (mapM, mapM_, reverse)-import Control.Monad hiding (mapM, mapM_)-import qualified Data.Map as Map-import Data.Maybe-import Data.Traversable (mapM)-import Data.Foldable (mapM_)---- * analysis---- | Analyse the given AST------ @analyseAST ast@ results in global declaration dictionaries.--- If you want to perform specific actions on declarations or definitions, you may provide--- callbacks in the @MonadTrav@ @m@.------ Returns the set of global declarations and definitions which where successfully translated.--- It is the users responsibility to check whether any hard errors occurred (@runTrav@ does this for you).-analyseAST :: (MonadTrav m) => CTranslUnit -> m GlobalDecls-analyseAST (CTranslUnit decls _file_node) = do-    -- analyse all declarations, but recover from errors-    mapRecoverM_ analyseExt decls-    -- check we are in global scope afterwards-    getDefTable >>= \dt -> unless (inFileScope dt) $-        error "Internal Error: Not in filescope after analysis"-    -- get the global definition table (XXX: remove ?)-    liftM globalDefs getDefTable-    where-    mapRecoverM_ f = mapM_ (handleTravError . f)---- | Analyse an top-level declaration-analyseExt :: (MonadTrav m) => CExtDecl -> m ()-analyseExt (CAsmExt asm _)-    = handleAsmBlock asm-analyseExt (CFDefExt fundef)-    = analyseFunDef fundef-analyseExt (CDeclExt decl)-    = analyseDecl False decl---- | Analyse a function definition-analyseFunDef :: (MonadTrav m) => CFunDef -> m ()-analyseFunDef (CFunDef declspecs declr oldstyle_decls stmt node_info) = do-    -- analyse the declarator-    var_decl_info <- analyseVarDecl' True declspecs declr oldstyle_decls Nothing-    let (VarDeclInfo name fun_spec storage_spec attrs ty _declr_node) = var_decl_info-    when (isNoName name) $ astError node_info "NoName in analyseFunDef"-    let ident = identOfVarName name-    -- improve incomplete type-    ty' <- improveFunDefType ty-    -- compute storage-    fun_storage <- computeFunDefStorage ident storage_spec-    let var_decl = VarDecl name (DeclAttrs fun_spec fun_storage attrs) ty'-    -- callback for declaration-    handleVarDecl False (Decl var_decl node_info)-    -- process body-    stmt' <- analyseFunctionBody node_info var_decl stmt-    -- callback for definition-    handleFunDef ident (FunDef var_decl stmt' node_info)-    where-    improveFunDefType (FunctionType (FunTypeIncomplete return_ty) attrs) =-      return $ FunctionType (FunType return_ty [] False) attrs-    improveFunDefType ty = return ty--voidM :: Monad m => m a -> m ()-voidM m = m >> return ()---- | Analyse a declaration other than a function definition------   Note: static assertions are not analysed-analyseDecl :: (MonadTrav m) => Bool -> CDecl -> m ()-analyseDecl _is_local (CStaticAssert _expr _strlit _annot) = return () -- TODO-analyseDecl is_local decl@(CDecl declspecs declrs node)-    | null declrs =-        case typedef_spec of Just _  -> astError node "bad typedef declaration: missing declarator"-                             Nothing -> voidM$ analyseTypeDecl decl-    | (Just declspecs') <- typedef_spec = mapM_ (uncurry (analyseTyDef declspecs')) declr_list-    | otherwise   = do let (storage_specs, attrs, typequals, typespecs, funspecs, _alignspecs) =-                             partitionDeclSpecs declspecs-                       canonTySpecs <- canonicalTypeSpec typespecs-                       -- TODO: alignspecs not yet processed-                       let specs =-                             (storage_specs, attrs, typequals, canonTySpecs, funspecs)-                       mapM_ (uncurry (analyseVarDeclr specs)) declr_list-    where-    declr_list = zip (True : repeat False) declrs-    typedef_spec = hasTypeDef declspecs--    analyseTyDef declspecs' handle_sue_def declr =-        case declr of-            (Just tydeclr, Nothing , Nothing) -> analyseTypeDef handle_sue_def declspecs' tydeclr node-            _ -> astError node "bad typdef declaration: bitfieldsize or initializer present"--    analyseVarDeclr specs handle_sue_def (Just declr, init_opt, Nothing) = do-        -- analyse the declarator-        let (storage_specs, attrs, typequals, canonTySpecs, inline) = specs-        vardeclInfo@(VarDeclInfo _ _ _ _ typ _) <--          analyseVarDecl handle_sue_def storage_specs attrs typequals canonTySpecs inline-                         declr [] Nothing-        -- declare / define the object-        if isFunctionType typ-            then extFunProto vardeclInfo-            else (if is_local then localVarDecl else extVarDecl)-                 -- XXX: if Initializer becomes different from CInit, this-                 -- will have to change.-                 vardeclInfo init_opt-        _init_opt' <- mapMaybeM init_opt (tInit typ)-        return ()-    analyseVarDeclr _ _ (Nothing,_,_)         = astError node "abstract declarator in object declaration"-    analyseVarDeclr _ _ (_,_,Just _bitfieldSz) = astError node "bitfield size in object declaration"---- | Analyse a typedef-analyseTypeDef :: (MonadTrav m) => Bool -> [CDeclSpec] -> CDeclr -> NodeInfo -> m ()-analyseTypeDef handle_sue_def declspecs declr node_info = do-    -- analyse the declarator-    (VarDeclInfo name fun_attrs storage_spec attrs ty _node) <- analyseVarDecl' handle_sue_def declspecs declr [] Nothing-    checkValidTypeDef fun_attrs storage_spec attrs-    when (isNoName name) $ astError node_info "NoName in analyseTypeDef"-    let ident = identOfVarName name-    handleTypeDef (TypeDef ident ty attrs node_info)-    where-    checkValidTypeDef fun_attrs  _ _ | fun_attrs /= noFunctionAttrs =-                                         astError node_info "inline specifier for typeDef"-    checkValidTypeDef _ NoStorageSpec _ = return ()-    checkValidTypeDef _ bad_storage _ = astError node_info $ "storage specified for typeDef: " ++ show bad_storage---- | compute storage of a function definition------ a function definition has static storage with internal linkage if specified `static`,--- the previously declared linkage if any if 'extern' or no specifier are present. (See C99 6.2.2, clause 5)------ This function won't raise an Trav error if the declaration is incompatible with the existing one,--- this case is handled in 'handleFunDef'.-computeFunDefStorage :: (MonadTrav m) => Ident -> StorageSpec -> m Storage-computeFunDefStorage _ (StaticSpec _)  = return$ FunLinkage InternalLinkage-computeFunDefStorage ident other_spec  = do-  obj_opt <- lookupObject ident-  let defaultSpec = FunLinkage ExternalLinkage-  case other_spec of-    NoStorageSpec  -> return$ maybe defaultSpec declStorage obj_opt-    (ExternSpec False) -> return$ maybe defaultSpec declStorage obj_opt-    bad_spec -> throwTravError $ badSpecifierError (nodeInfo ident)-                  $ "unexpected function storage specifier (only static or extern is allowed)" ++ show bad_spec---- (private) Get parameters of a function type-getParams :: Type -> Maybe [ParamDecl]-getParams (FunctionType (FunType _ params _) _) = Just params-getParams _ = Nothing---- | handle a function prototype-extFunProto :: (MonadTrav m) => VarDeclInfo -> m ()-extFunProto (VarDeclInfo var_name fun_spec storage_spec attrs ty node_info) =-    do  when (isNoName var_name) $ astError node_info "NoName in extFunProto"-        old_fun <- lookupObject (identOfVarName var_name)-        checkValidSpecs-        let decl = VarDecl var_name (DeclAttrs fun_spec (funDeclLinkage old_fun) attrs) ty-        handleVarDecl False (Decl decl node_info)-        -- XXX: structs should be handled in 'function prototype scope' too-        enterPrototypeScope-        maybe (return ()) (mapM_ handleParamDecl) (getParams ty)-        leavePrototypeScope-    where-    funDeclLinkage old_fun =-        case storage_spec of-            NoStorageSpec    -> FunLinkage ExternalLinkage -- prototype declaration / external linkage-            StaticSpec False -> FunLinkage InternalLinkage -- prototype declaration / internal linkage-            ExternSpec False -> case old_fun of-                                    Nothing -> FunLinkage ExternalLinkage-                                    Just f  -> declStorage f-            _ -> error $ "funDeclLinkage: " ++ show storage_spec-    checkValidSpecs-        | hasThreadLocalSpec storage_spec = astError node_info "thread local storage specified for function"-        | RegSpec <- storage_spec         = astError node_info "invalid `register' storage specified for function"-        | otherwise                       = return ()---- | handle a object declaration \/ definition------ We have to check the storage specifiers here, as they determine wheter we're dealing with decalartions--- or definitions--- see [http://www.sivity.net/projects/language.c/wiki/ExternalDefinitions]-extVarDecl :: (MonadTrav m) => VarDeclInfo -> Maybe Initializer -> m ()-extVarDecl (VarDeclInfo var_name fun_spec storage_spec attrs typ node_info) init_opt =-    do when (isNoName var_name) $ astError node_info "NoName in extVarDecl"-       (storage,is_def) <- globalStorage storage_spec-       let vardecl = VarDecl var_name (DeclAttrs fun_spec storage attrs) typ-       if is_def-           then handleObjectDef False ident $ ObjDef vardecl init_opt node_info-           else handleVarDecl False $ Decl vardecl node_info-    where-       ident = identOfVarName var_name-       globalStorage _ | fun_spec /= noFunctionAttrs =-                           astError node_info "invalid function specifier for external variable"-       globalStorage AutoSpec      = astError node_info "file-scope declaration specifies storage `auto'"-       globalStorage RegSpec       =-         do when (isJust init_opt) $ astError node_info "initializer given for global register variable"-            case var_name of-              NoName -> astError node_info "global register variable has no name"-              VarName _ Nothing -> astError node_info "no register specified for global register variable"-              _ -> return ()-            dt <- getDefTable-            when (hasFunDef dt) $ astError node_info "global register variable appears after a function definition"-            return (Static InternalLinkage False, False)-       -- tentative if there is no initializer, external-       globalStorage NoStorageSpec = return (Static ExternalLinkage False, True)-       globalStorage ThreadSpec    = return (Static ExternalLinkage True, True)-       -- tentative if there is no initializer, internal-       globalStorage (StaticSpec thread_local) = return (Static InternalLinkage thread_local, True)-       globalStorage (ExternSpec thread_local) =-           case init_opt of-               -- declaration with either external or old storage-               Nothing -> do old_decl <- lookupObject ident-                             return (maybe (Static ExternalLinkage thread_local) declStorage old_decl,False)-               -- warning, external definition-               Just _  -> do warn $ badSpecifierError node_info "Both initializer and `extern` specifier given - treating as definition"-                             return (Static ExternalLinkage thread_local, True)-       hasFunDef dt = any (isFuncDef . snd) (Map.toList $ gObjs $ globalDefs dt)-       isFuncDef (FunctionDef fd) = not $ (isInline . functionAttrs) fd-       isFuncDef _ = False---- | handle a function-scope object declaration \/ definition--- see [http://www.sivity.net/projects/language.c/wiki/LocalDefinitions]-localVarDecl :: (MonadTrav m) => VarDeclInfo -> Maybe Initializer -> m ()-localVarDecl (VarDeclInfo var_name fun_attrs storage_spec attrs typ node_info) init_opt =-    do when (isNoName var_name) $ astError node_info "NoName in localVarDecl"-       (storage,is_def) <- localStorage storage_spec-       let vardecl = VarDecl var_name (DeclAttrs fun_attrs storage attrs) typ-       if is_def-           then handleObjectDef True ident (ObjDef vardecl init_opt node_info)-           else handleVarDecl True (Decl vardecl node_info)-    where-    ident = identOfVarName var_name-    localStorage NoStorageSpec = return (Auto False,True)-    localStorage ThreadSpec    = return (Auto True,True)-    localStorage RegSpec = return (Auto True,True)-    -- static no linkage-    localStorage (StaticSpec thread_local) =-      return (Static NoLinkage thread_local,True)-    localStorage (ExternSpec thread_local)-      | isJust init_opt = astError node_info "extern keyword and initializer for local"-      | otherwise =-          do old_decl <- lookupObject ident-             return (maybe (Static ExternalLinkage thread_local) declStorage old_decl,False)-    localStorage _ = astError node_info "bad storage specifier for local"--defineParams :: MonadTrav m => NodeInfo -> VarDecl -> m ()-defineParams ni decl =-  case getParams (declType decl) of-    Nothing -> astError ni-               "expecting complete function type in function definition"-    Just params -> mapM_ handleParamDecl params--analyseFunctionBody :: (MonadTrav m) => NodeInfo -> VarDecl -> CStat -> m Stmt-analyseFunctionBody node_info decl s@(CCompound localLabels items _) =-  do enterFunctionScope-     mapM_ (withDefTable . defineLabel) (localLabels ++ getLabels s)-     defineParams node_info decl-     -- record parameters-     mapM_ (tBlockItem [FunCtx decl]) items-     leaveFunctionScope-     return s -- XXX: bogus--analyseFunctionBody _ _ s = astError (nodeInfo s) "Function body is no compound statement"--data StmtCtx = FunCtx VarDecl-             | LoopCtx-             | SwitchCtx---- | Given a context, determine the type declaration for the enclosing---   function, if possible, given a context.-enclosingFunctionType :: [StmtCtx] -> Maybe Type-enclosingFunctionType [] = Nothing-enclosingFunctionType (FunCtx vd : _) = Just $ declType vd-enclosingFunctionType (_ : cs) = enclosingFunctionType cs--inLoop :: [StmtCtx] -> Bool-inLoop c = any isLoop c-  where isLoop LoopCtx = True-        isLoop _ = False--inSwitch :: [StmtCtx] -> Bool-inSwitch c = any isSwitch c-  where isSwitch SwitchCtx = True-        isSwitch _ = False--data ExprSide = LValue | RValue-                deriving (Eq, Show)---- | Typecheck a statement, given a statement context. The type of a---   statement is usually @void@, but expression statements and blocks---   can sometimes have other types.-tStmt :: MonadTrav m => [StmtCtx] -> CStat -> m Type-tStmt c (CLabel _ s _ _)         = tStmt c s-tStmt c (CExpr e _)              =-  maybe (return voidType) (tExpr c RValue) e-tStmt c (CCompound ls body _)    =-  do enterBlockScope-     mapM_ (withDefTable . defineLabel) ls-     t <- foldM (const $ tBlockItem c) voidType body-     leaveBlockScope-     return t-tStmt c (CIf e sthen selse _)    =-  checkGuard c e >> tStmt c sthen-                 >> maybe (return ()) (voidM . tStmt c) selse-                 >> return voidType-tStmt c (CSwitch e s ni)         =-  tExpr c RValue e >>= checkIntegral' ni >>-  tStmt (SwitchCtx : c) s-tStmt c (CWhile e s _ _)         =-  checkGuard c e >> tStmt (LoopCtx : c) s-tStmt _ (CGoto l ni)             =-  do dt <- getDefTable-     case lookupLabel l dt of-       Just _ -> return voidType-       Nothing -> typeError ni $ "undefined label in goto: " ++ identToString l-tStmt c (CCont ni)               =-  do unless (inLoop c) $ astError ni "continue statement outside of loop"-     return voidType-tStmt c (CBreak ni)              =-  do unless (inLoop c || inSwitch c) $-            astError ni "break statement outside of loop or switch statement"-     return voidType-tStmt c (CReturn (Just e) ni)    =-  do t <- tExpr c RValue e-     rt <- case enclosingFunctionType c of-             Just (FunctionType (FunType rt _ _) _) -> return rt-             Just (FunctionType (FunTypeIncomplete rt) _) -> return rt-             Just ft -> astError ni $ "bad function type: " ++ pType ft-             Nothing -> astError ni "return statement outside function"-     case (rt, t) of-       -- apparently it's ok to return void from a void function?-       (DirectType TyVoid _ _, DirectType TyVoid _ _) -> return ()-       _ -> assignCompatible' ni CAssignOp rt t-     return voidType-tStmt _ (CReturn Nothing _)      = return voidType--- XXX: anything to do for assembly?-tStmt _ (CAsm _ _)               = return voidType-tStmt c (CCase e s ni)           =-  do unless (inSwitch c) $-            astError ni "case statement outside of switch statement"-     tExpr c RValue e >>= checkIntegral' ni-     tStmt c s-tStmt c (CCases e1 e2 s ni)      =-  do unless (inSwitch c) $-            astError ni "case statement outside of switch statement"-     tExpr c RValue e1 >>= checkIntegral' ni-     tExpr c RValue e2 >>= checkIntegral' ni-     tStmt c s-tStmt c (CDefault s ni)          =-  do unless (inSwitch c) $-            astError ni "default statement outside of switch statement"-     tStmt c s-tStmt c (CFor i g inc s _)       =-  do enterBlockScope-     either (maybe (return ()) checkExpr) (analyseDecl True) i-     maybe (return ()) (checkGuard c) g-     maybe (return ()) checkExpr inc-     _ <- tStmt (LoopCtx : c) s-     leaveBlockScope-     return voidType-  where checkExpr e = voidM$ tExpr c RValue e-tStmt c (CGotoPtr e ni)          =-  do t <- tExpr c RValue e-     case t of-       (PtrType _ _ _) -> return voidType-       _               -> typeError ni "can't goto non-pointer"---- | Typecheck a block item. When statement expressions are blocks,---   they have the type of their last expression statement, so this---   needs to return a type.-tBlockItem :: MonadTrav m => [StmtCtx] -> CBlockItem -> m Type-tBlockItem c (CBlockStmt s) = tStmt c s-tBlockItem _ (CBlockDecl d) = analyseDecl True d >> return voidType--- TODO: fixup analyseFunDef to handle nested functions-tBlockItem _ (CNestedFunDef fd) = analyseFunDef fd >> return voidType--checkGuard :: MonadTrav m => [StmtCtx] -> CExpr -> m ()-checkGuard c e = tExpr c RValue e >>= checkScalar' (nodeInfo e)---- XXX: this is bogus, correct only for IA32. We should eventually--- have a collection of these and allow people to choose one.-defaultMD :: MachineDesc-defaultMD =-  MachineDesc-  { iSize = \it ->-            case it of-              TyBool    -> 1-              TyChar    -> 1-              TySChar   -> 1-              TyUChar   -> 1-              TyShort   -> 2-              TyUShort  -> 2-              TyInt     -> 4-              TyUInt    -> 4-              TyLong    -> 4-              TyULong   -> 4-              TyLLong   -> 8-              TyULLong  -> 8-              TyInt128  -> 16-              TyUInt128 -> 16-  , fSize = \ft ->-            case ft of-              TyFloat   -> 4-              TyDouble  -> 8-              TyLDouble -> 16-  , builtinSize = \bt ->-                  case bt of-                    TyVaList -> 4-                    TyAny    -> 4-  , ptrSize = 4-  , voidSize = 1-  , iAlign = \it ->-             case it of-               TyBool    -> 1-               TyChar    -> 1-               TySChar   -> 1-               TyUChar   -> 1-               TyShort   -> 2-               TyUShort  -> 2-               TyInt     -> 4-               TyUInt    -> 4-               TyLong    -> 4-               TyULong   -> 4-               TyLLong   -> 8-               TyULLong  -> 8-               TyInt128  -> 16-               TyUInt128 -> 16-  , fAlign = \ft ->-             case ft of-               TyFloat   -> 4-               TyDouble  -> 8-               TyLDouble -> 16-  , builtinAlign = \bt ->-                   case bt of-                     TyVaList -> 4-                     TyAny    -> 4-  , ptrAlign = 4-  , voidAlign = 1-  }--tExpr :: MonadTrav m => [StmtCtx] -> ExprSide -> CExpr -> m Type-tExpr c side e =-  case nameOfNode (nodeInfo e) of-    Just n ->-      do dt <- getDefTable-         case lookupType dt n of-           Just t -> return t-           Nothing ->-             do t <- tExpr' c side e-                withDefTable (\dt' -> (t, insertType dt' n t))-    Nothing -> tExpr' c side e---- | Typecheck an expression, with information about whether it---   appears as an lvalue or an rvalue.-tExpr' :: MonadTrav m => [StmtCtx] -> ExprSide -> CExpr -> m Type-tExpr' c side (CBinary op le re ni)    =-  do when (side == LValue) $ typeError ni "binary operator as lvalue"-     lt <- tExpr c RValue le-     rt <- tExpr c RValue re-     binopType' ni op lt rt-tExpr' c side (CUnary CAdrOp e ni)     =-  do when (side == LValue) $-          typeError ni "address-of operator as lvalue"-     case e of-       CCompoundLit _ _ _ -> simplePtr `liftM` tExpr c RValue e-       CVar i _ -> lookupObject i >>=-                   typeErrorOnLeft ni . maybe (notFound i) varAddrType-       _        -> simplePtr `liftM` tExpr c LValue e-tExpr' c _ (CUnary CIndOp e ni)     =-  tExpr c RValue e >>= (typeErrorOnLeft ni . derefType)-tExpr' c _ (CUnary CCompOp e ni)    =-  do t <- tExpr c RValue e-     checkIntegral' ni t-     return t-tExpr' c side (CUnary CNegOp e ni)      =-  do when (side == LValue) $-          typeError ni "logical negation used as lvalue"-     tExpr c RValue e >>= checkScalar' ni-     return boolType-tExpr' c side (CUnary op e _)          =-  tExpr c (if isEffectfulOp op then LValue else side) e-tExpr' c _ (CIndex b i ni)             =-  do bt <- tExpr c RValue b-     it <- tExpr c RValue i-     addrTy <- binopType' ni CAddOp bt it-     typeErrorOnLeft ni $ derefType addrTy-tExpr' c side (CCond e1 me2 e3 ni)     =-  do t1 <- tExpr c RValue e1-     checkScalar' (nodeInfo e1) t1-     t3 <- tExpr c side e3-     case me2 of-       Just e2 ->-         do t2 <- tExpr c side e2-            conditionalType' ni t2 t3-       Nothing -> conditionalType' ni t1 t3-tExpr' c _ (CMember e m deref ni)   =-  do t <- tExpr c RValue e-     bt <- if deref then typeErrorOnLeft ni (derefType t) else return t-     fieldType ni m bt-tExpr' c side (CComma es _)            =-  mapM (tExpr c side) es >>= return . last-tExpr' c side (CCast d e ni)           =-  do dt <- analyseTypeDecl d-     et <- tExpr c side e-     typeErrorOnLeft ni $ castCompatible dt et-     return dt-tExpr' c side (CSizeofExpr e ni)       =-  do when (side == LValue) $ typeError ni "sizeof as lvalue"-     _ <- tExpr c RValue e-     return size_tType-tExpr' c side (CAlignofExpr e ni)      =-  do when (side == LValue) $ typeError ni "alignof as lvalue"-     _ <- tExpr c RValue e-     return size_tType-tExpr' c side (CComplexReal e ni)      = complexBaseType ni c side e-tExpr' c side (CComplexImag e ni)      = complexBaseType ni c side e-tExpr' _ side (CLabAddrExpr _ ni)      =-  do when (side == LValue) $ typeError ni "label address as lvalue"-     return $ PtrType voidType noTypeQuals []-tExpr' _ side (CCompoundLit d initList ni) =-  do when (side == LValue) $ typeError ni "compound literal as lvalue"-     lt <- analyseTypeDecl d-     tInitList ni (canonicalType lt) initList-     return lt-tExpr' _ RValue (CAlignofType _ _)     = return size_tType-tExpr' _ RValue (CSizeofType _ _)      = return size_tType-tExpr' _ LValue (CAlignofType _ ni)    =-  typeError ni "alignoftype as lvalue"-tExpr' _ LValue (CSizeofType _ ni)     =-  typeError ni "sizeoftype as lvalue"-tExpr' ctx side (CGenericSelection expr list ni) = do-  ty_sel <- tExpr ctx side expr-  ty_list <- mapM analyseAssoc list-  def_expr_ty <--    case dropWhile (isJust . fst) ty_list of-      [(Nothing,tExpr'')] -> return (Just tExpr'')-      [] -> return Nothing-      _ -> astError ni "more than one default clause in generic selection"-  case dropWhile (maybe True (not . typesMatch ty_sel) . fst) ty_list of-    ((_,expr_ty) : _ ) -> return expr_ty-    [] -> case def_expr_ty of-      (Just expr_ty) -> return expr_ty-      Nothing -> astError ni ("no clause matches for generic selection (not fully supported) - selector type is " ++ show (pretty ty_sel) ++-                              ", available types are " ++ show (map (pretty.fromJust.fst) (filter (isJust.fst) ty_list)))-  where-    analyseAssoc (mdecl,expr') = do-      tDecl <- mapM analyseTypeDecl mdecl-      tExpr'' <- tExpr ctx side expr'-      return (tDecl, tExpr'')-    typesMatch (DirectType tn1 _ _) (DirectType tn2 _ _) = directTypesMatch tn1 tn2-    typesMatch _ _ = False -- not fully supported-    directTypesMatch TyVoid TyVoid = True-    directTypesMatch (TyIntegral t1) (TyIntegral t2) = t1 == t2-    directTypesMatch (TyFloating t1) (TyFloating t2) = t1 == t2-    directTypesMatch (TyComplex t1) (TyComplex t2) = t1 == t2-    directTypesMatch _ _ = False -- TODO: not fully supported-tExpr' _ _ (CVar i ni)              =-  lookupObject i >>=-  maybe (typeErrorOnLeft ni $ notFound i) (return . declType)-tExpr' _ _ (CConst c)                  = constType c-tExpr' _ _ (CBuiltinExpr b)            = builtinType b-tExpr' c side (CCall (CVar i _) args ni)-  | identToString i == "__builtin_choose_expr" =-    case args of-      [g, e1, e2] ->-        -- XXX: the MachineDesc parameter below should be configurable-        do b <- constEval defaultMD Map.empty g-           case boolValue b of-             Just True -> tExpr c side e1-             Just False -> tExpr c side e2-             Nothing ->-               astError ni "non-constant argument to __builtin_choose_expr"-      _ -> astError ni "wrong number of arguments to __builtin_choose_expr"-tExpr' c _ (CCall fe args ni)          =-  do let defType = FunctionType-                   (FunTypeIncomplete-                    (DirectType (TyIntegral TyInt) noTypeQuals noAttributes))-                   noAttributes-         fallback i = do warn $ invalidAST ni $-                                "unknown function: " ++ identToString i-                         return defType-     t <- case fe of-            CVar i _ -> lookupObject i >>=-                        maybe (fallback i) (const $ tExpr c RValue fe)-            _ -> tExpr c RValue fe-     atys <- mapM (tExpr c RValue) args-     -- XXX: we don't actually want to return the canonical return type here-     case canonicalType t of-       PtrType (FunctionType (FunType rt pdecls varargs) _) _ _ ->-         do let ptys = map declType pdecls-            mapM_ checkArg $ zip3 ptys atys args-            unless varargs $ when (length atys /= length ptys) $-                   typeError ni "incorrect number of arguments"-            return $ canonicalType rt-       PtrType (FunctionType (FunTypeIncomplete rt) _) _ _ ->-         do -- warn $ invalidAST ni "incomplete function type"-            return $ canonicalType rt-       _  -> typeError ni $ "attempt to call non-function of type " ++ pType t-  where checkArg (pty, aty, arg) =-          do attrs <- deepTypeAttrs pty-             if isTransparentUnion attrs-               then-                 case canonicalType pty of-                   DirectType (TyComp ctr) _ _ ->-                     do td <- lookupSUE (nodeInfo arg) (sueRef ctr)-                        _ms <- tagMembers (nodeInfo arg) td-                        {--                        when (null $ rights $ matches ms) $-                             astError (nodeInfo arg) $-                             "argument matches none of the elements " ++-                             "of transparent union"-                        -}-                        return ()-                     -- where matches =-                     --         map (\d -> assignCompatible-                     --                    CAssignOp-                     --                    (snd d)-                     --                    aty-                     --             )-                   _ -> astError (nodeInfo arg)-                        "non-composite has __transparent_union__ attribute"-               else-                 assignCompatible' (nodeInfo arg) CAssignOp pty aty-        isTransparentUnion =-          any (\(Attr n _ _) -> identToString n == "__transparent_union__")-tExpr' c _ (CAssign op le re ni)       =-  do lt <- tExpr c LValue le-     rt <- tExpr c RValue re-     when (constant $ typeQuals lt) $-          typeError ni $ "assignment to lvalue with `constant' qualifier: "-                         ++ (render . pretty) le-     case (canonicalType lt, re) of-       (lt', CConst (CIntConst i _))-         | isPointerType lt' && getCInteger i == 0 -> return ()-       (_, _) -> assignCompatible' ni op lt rt-     return lt-tExpr' c _ (CStatExpr s _)             =-  do enterBlockScope-     mapM_ (withDefTable . defineLabel) (getLabels s)-     t <- tStmt c s-     leaveBlockScope-     return t--tInitList :: MonadTrav m => NodeInfo -> Type -> CInitList -> m ()-tInitList _ (ArrayType (DirectType (TyIntegral TyChar) _ _) _ _ _)-              [([], CInitExpr e@(CConst (CStrConst _ _)) _)] =-  tExpr [] RValue e >> return ()-tInitList ni t@(ArrayType _ _ _ _) initList =-  do let default_ds =-           repeat (CArrDesig (CConst (CIntConst (cInteger 0) ni)) ni)-     checkInits t default_ds initList-tInitList ni t@(DirectType (TyComp ctr) _ _) initList =-  do td <- lookupSUE ni (sueRef ctr)-     ms <- tagMembers ni td-     let default_ds = map (\m -> CMemberDesig (fst m) ni) ms-     checkInits t default_ds initList-tInitList _ (PtrType (DirectType TyVoid _ _) _ _ ) _ =-          return () -- XXX: more checking-tInitList _ t [([], i)] = voidM$ tInit t i-tInitList ni t _ = typeError ni $ "initializer list for type: " ++ pType t--checkInits :: MonadTrav m => Type -> [CDesignator] -> CInitList -> m ()-checkInits _ _ [] = return ()-checkInits t dds ((ds, i) : is) =-  do (dds', ds') <- case (dds, ds) of-                      ([], []) ->-                        typeError (nodeInfo i) "excess elements in initializer"-                      (dd' : rest, []) -> return (rest, [dd'])-                      (_, d : _) -> return (advanceDesigList dds d, ds)-     t' <- tDesignator t ds'-     _ <- tInit t' i-     checkInits t dds' is--advanceDesigList :: [CDesignator] -> CDesignator -> [CDesignator]-advanceDesigList ds d = drop 1 $ dropWhile (not . matchDesignator d) ds--matchDesignator :: CDesignator -> CDesignator -> Bool-matchDesignator (CMemberDesig m1 _) (CMemberDesig m2 _) = m1 == m2-matchDesignator _ _ = True -- XXX: for now, array ranges aren't checked--tDesignator :: MonadTrav m => Type -> [CDesignator] -> m Type--- XXX: check that initializers are within array size-tDesignator (ArrayType bt _ _ _) (CArrDesig e ni : ds) =-  do tExpr [] RValue e >>= checkIntegral' ni-     tDesignator bt ds-tDesignator (ArrayType bt _ _ _) (CRangeDesig e1 e2 ni : ds) =-  do tExpr [] RValue e1 >>= checkIntegral' ni-     tExpr [] RValue e2 >>= checkIntegral' ni-     tDesignator bt ds-tDesignator (ArrayType _ _ _ _) (d : _) =-  typeError (nodeInfo d) "member designator in array initializer"-tDesignator t@(DirectType (TyComp _) _ _) (CMemberDesig m ni : ds) =-  do mt <- fieldType ni m t-     tDesignator (canonicalType mt) ds-tDesignator (DirectType (TyComp _) _ _) (d : _) =-  typeError (nodeInfo d) "array designator in compound initializer"-tDesignator t [] = return t-tDesignator _t _ =-  error "unepxected type with designator"--tInit :: MonadTrav m => Type -> CInit -> m Initializer-tInit t i@(CInitExpr e ni) =-  do it <- tExpr [] RValue e-     assignCompatible' ni CAssignOp t it-     return i-tInit t i@(CInitList initList ni) =-  tInitList ni (canonicalType t) initList >> return i--complexBaseType :: MonadTrav m => NodeInfo -> [StmtCtx] -> ExprSide -> CExpr -> m Type-complexBaseType ni c side e =-  do t <- tExpr c side e-     case canonicalType t of-       DirectType (TyComplex ft) quals attrs ->-         return $ DirectType (TyFloating ft) quals attrs-       _ -> typeError ni $ "expected complex type, got: " ++ pType t----- | Return the type of a builtin.-builtinType :: MonadTrav m => CBuiltin -> m Type-builtinType (CBuiltinVaArg _ d _)           = analyseTypeDecl d-builtinType (CBuiltinOffsetOf _ _ _)        = return size_tType-builtinType (CBuiltinTypesCompatible _ _ _) = return boolType-builtinType (CBuiltinConvertVector _expr ty _) = analyseTypeDecl ty---- return @Just declspecs@ without @CTypedef@ if the declaration specifier contain @typedef@-hasTypeDef :: [CDeclSpec] -> Maybe [CDeclSpec]-hasTypeDef declspecs =-    case foldr hasTypeDefSpec (False,[]) declspecs of-        (True,specs') -> Just specs'-        (False,_)     -> Nothing-    where-    hasTypeDefSpec (CStorageSpec (CTypedef _)) (_,specs) = (True, specs)-    hasTypeDefSpec spec (b,specs) = (b,spec:specs)+{-# LANGUAGE ScopedTypeVariables, PatternGuards #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Parser.Translation
+-- Copyright   :  (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  alpha
+-- Portability :  ghc
+--
+-- Analyse the parse tree
+--
+-- Traverses the AST, analyses declarations and invokes handlers.
+-----------------------------------------------------------------------------
+module Language.C.Analysis.AstAnalysis (
+    -- * Top-level analysis
+    analyseAST,
+    analyseExt,analyseFunDef,analyseDecl,
+    -- * Building blocks for additional analyses
+    analyseFunctionBody,
+    defineParams,
+    -- * Type checking
+    tExpr, ExprSide(..),
+    tStmt, StmtCtx(..),
+    tDesignator,
+    defaultMD
+)
+where
+import Language.C.Analysis.SemError
+import Language.C.Analysis.SemRep
+import Language.C.Analysis.TravMonad
+import Language.C.Analysis.ConstEval
+import Language.C.Analysis.DefTable (globalDefs, defineLabel, inFileScope,
+                                     lookupLabel, insertType, lookupType)
+import Language.C.Analysis.DeclAnalysis
+import Language.C.Analysis.TypeUtils
+import Language.C.Analysis.TypeCheck
+
+import Language.C.Data
+import Language.C.Pretty
+import Language.C.Syntax.AST
+import Language.C.Syntax.Constants
+import Language.C.Syntax.Ops
+import Language.C.Syntax.Utils
+import Text.PrettyPrint.HughesPJ
+
+
+import Prelude hiding (mapM, mapM_, reverse)
+import Control.Monad hiding (mapM, mapM_)
+import qualified Data.Map as Map
+import Data.Maybe
+import Data.Traversable (mapM)
+import Data.Foldable (mapM_)
+
+-- * analysis
+
+-- | Analyse the given AST
+--
+-- @analyseAST ast@ results in global declaration dictionaries.
+-- If you want to perform specific actions on declarations or definitions, you may provide
+-- callbacks in the @MonadTrav@ @m@.
+--
+-- Returns the set of global declarations and definitions which where successfully translated.
+-- It is the users responsibility to check whether any hard errors occurred (@runTrav@ does this for you).
+analyseAST :: (MonadTrav m) => CTranslUnit -> m GlobalDecls
+analyseAST (CTranslUnit decls _file_node) = do
+    -- analyse all declarations, but recover from errors
+    mapRecoverM_ analyseExt decls
+    -- check we are in global scope afterwards
+    getDefTable >>= \dt -> unless (inFileScope dt) $
+        error "Internal Error: Not in filescope after analysis"
+    -- get the global definition table (XXX: remove ?)
+    liftM globalDefs getDefTable
+    where
+    mapRecoverM_ f = mapM_ (handleTravError . f)
+
+-- | Analyse an top-level declaration
+analyseExt :: (MonadTrav m) => CExtDecl -> m ()
+analyseExt (CAsmExt asm _)
+    = handleAsmBlock asm
+analyseExt (CFDefExt fundef)
+    = analyseFunDef fundef
+analyseExt (CDeclExt decl)
+    = analyseDecl False decl
+
+-- | Analyse a function definition
+analyseFunDef :: (MonadTrav m) => CFunDef -> m ()
+analyseFunDef (CFunDef declspecs declr oldstyle_decls stmt node_info) = do
+    -- analyse the declarator
+    var_decl_info <- analyseVarDecl' True declspecs declr oldstyle_decls Nothing
+    let (VarDeclInfo name fun_spec storage_spec attrs ty _declr_node) = var_decl_info
+    when (isNoName name) $ astError node_info "NoName in analyseFunDef"
+    let ident = identOfVarName name
+    -- improve incomplete type
+    ty' <- improveFunDefType ty
+    -- compute storage
+    fun_storage <- computeFunDefStorage ident storage_spec
+    let var_decl = VarDecl name (DeclAttrs fun_spec fun_storage attrs) ty'
+    -- callback for declaration
+    handleVarDecl False (Decl var_decl node_info)
+    -- process body
+    stmt' <- analyseFunctionBody node_info var_decl stmt
+    -- callback for definition
+    handleFunDef ident (FunDef var_decl stmt' node_info)
+    where
+    improveFunDefType (FunctionType (FunTypeIncomplete return_ty) attrs) =
+      return $ FunctionType (FunType return_ty [] False) attrs
+    improveFunDefType ty = return ty
+
+voidM :: Monad m => m a -> m ()
+voidM m = m >> return ()
+
+-- | Analyse a declaration other than a function definition
+--
+--   Note: static assertions are not analysed
+analyseDecl :: (MonadTrav m) => Bool -> CDecl -> m ()
+analyseDecl _is_local (CStaticAssert _expr _strlit _annot) = return () -- TODO
+analyseDecl is_local decl@(CDecl declspecs declrs node)
+    | null declrs =
+        case typedef_spec of Just _  -> astError node "bad typedef declaration: missing declarator"
+                             Nothing -> voidM$ analyseTypeDecl decl
+    | (Just declspecs') <- typedef_spec = mapM_ (uncurry (analyseTyDef declspecs')) declr_list
+    | otherwise   = do let (storage_specs, attrs, typequals, typespecs, funspecs, _alignspecs) =
+                             partitionDeclSpecs declspecs
+                       canonTySpecs <- canonicalTypeSpec typespecs
+                       -- TODO: alignspecs not yet processed
+                       let specs =
+                             (storage_specs, attrs, typequals, canonTySpecs, funspecs)
+                       mapM_ (uncurry (analyseVarDeclr specs)) declr_list
+    where
+    declr_list = zip (True : repeat False) declrs
+    typedef_spec = hasTypeDef declspecs
+
+    analyseTyDef declspecs' handle_sue_def declr =
+        case declr of
+            (Just tydeclr, Nothing , Nothing) -> analyseTypeDef handle_sue_def declspecs' tydeclr node
+            _ -> astError node "bad typdef declaration: bitfieldsize or initializer present"
+
+    analyseVarDeclr specs handle_sue_def (Just declr, init_opt, Nothing) = do
+        -- analyse the declarator
+        let (storage_specs, attrs, typequals, canonTySpecs, inline) = specs
+        vardeclInfo@(VarDeclInfo _ _ _ _ typ _) <-
+          analyseVarDecl handle_sue_def storage_specs attrs typequals canonTySpecs inline
+                         declr [] Nothing
+        -- declare / define the object
+        if isFunctionType typ
+            then extFunProto vardeclInfo
+            else (if is_local then localVarDecl else extVarDecl)
+                 -- XXX: if Initializer becomes different from CInit, this
+                 -- will have to change.
+                 vardeclInfo init_opt
+        _init_opt' <- mapMaybeM init_opt (tInit typ)
+        return ()
+    analyseVarDeclr _ _ (Nothing,_,_)         = astError node "abstract declarator in object declaration"
+    analyseVarDeclr _ _ (_,_,Just _bitfieldSz) = astError node "bitfield size in object declaration"
+
+-- | Analyse a typedef
+analyseTypeDef :: (MonadTrav m) => Bool -> [CDeclSpec] -> CDeclr -> NodeInfo -> m ()
+analyseTypeDef handle_sue_def declspecs declr node_info = do
+    -- analyse the declarator
+    (VarDeclInfo name fun_attrs storage_spec attrs ty _node) <- analyseVarDecl' handle_sue_def declspecs declr [] Nothing
+    checkValidTypeDef fun_attrs storage_spec attrs
+    when (isNoName name) $ astError node_info "NoName in analyseTypeDef"
+    let ident = identOfVarName name
+    handleTypeDef (TypeDef ident ty attrs node_info)
+    where
+    checkValidTypeDef fun_attrs  _ _ | fun_attrs /= noFunctionAttrs =
+                                         astError node_info "inline specifier for typeDef"
+    checkValidTypeDef _ NoStorageSpec _ = return ()
+    checkValidTypeDef _ bad_storage _ = astError node_info $ "storage specified for typeDef: " ++ show bad_storage
+
+-- | compute storage of a function definition
+--
+-- a function definition has static storage with internal linkage if specified `static`,
+-- the previously declared linkage if any if 'extern' or no specifier are present. (See C99 6.2.2, clause 5)
+--
+-- This function won't raise an Trav error if the declaration is incompatible with the existing one,
+-- this case is handled in 'handleFunDef'.
+computeFunDefStorage :: (MonadTrav m) => Ident -> StorageSpec -> m Storage
+computeFunDefStorage _ (StaticSpec _)  = return$ FunLinkage InternalLinkage
+computeFunDefStorage ident other_spec  = do
+  obj_opt <- lookupObject ident
+  let defaultSpec = FunLinkage ExternalLinkage
+  case other_spec of
+    NoStorageSpec  -> return$ maybe defaultSpec declStorage obj_opt
+    (ExternSpec False) -> return$ maybe defaultSpec declStorage obj_opt
+    bad_spec -> throwTravError $ badSpecifierError (nodeInfo ident)
+                  $ "unexpected function storage specifier (only static or extern is allowed)" ++ show bad_spec
+
+-- (private) Get parameters of a function type
+getParams :: Type -> Maybe [ParamDecl]
+getParams (FunctionType (FunType _ params _) _) = Just params
+getParams _ = Nothing
+
+-- | handle a function prototype
+extFunProto :: (MonadTrav m) => VarDeclInfo -> m ()
+extFunProto (VarDeclInfo var_name fun_spec storage_spec attrs ty node_info) =
+    do  when (isNoName var_name) $ astError node_info "NoName in extFunProto"
+        old_fun <- lookupObject (identOfVarName var_name)
+        checkValidSpecs
+        let decl = VarDecl var_name (DeclAttrs fun_spec (funDeclLinkage old_fun) attrs) ty
+        handleVarDecl False (Decl decl node_info)
+        -- XXX: structs should be handled in 'function prototype scope' too
+        enterPrototypeScope
+        maybe (return ()) (mapM_ handleParamDecl) (getParams ty)
+        leavePrototypeScope
+    where
+    funDeclLinkage old_fun =
+        case storage_spec of
+            NoStorageSpec    -> FunLinkage ExternalLinkage -- prototype declaration / external linkage
+            StaticSpec False -> FunLinkage InternalLinkage -- prototype declaration / internal linkage
+            ExternSpec False -> case old_fun of
+                                    Nothing -> FunLinkage ExternalLinkage
+                                    Just f  -> declStorage f
+            _ -> error $ "funDeclLinkage: " ++ show storage_spec
+    checkValidSpecs
+        | hasThreadLocalSpec storage_spec = astError node_info "thread local storage specified for function"
+        | RegSpec <- storage_spec         = astError node_info "invalid `register' storage specified for function"
+        | otherwise                       = return ()
+
+-- | handle a object declaration \/ definition
+--
+-- We have to check the storage specifiers here, as they determine wheter we're dealing with decalartions
+-- or definitions
+-- see [http://www.sivity.net/projects/language.c/wiki/ExternalDefinitions]
+extVarDecl :: (MonadTrav m) => VarDeclInfo -> Maybe Initializer -> m ()
+extVarDecl (VarDeclInfo var_name fun_spec storage_spec attrs typ node_info) init_opt =
+    do when (isNoName var_name) $ astError node_info "NoName in extVarDecl"
+       (storage,is_def) <- globalStorage storage_spec
+       let vardecl = VarDecl var_name (DeclAttrs fun_spec storage attrs) typ
+       if is_def
+           then handleObjectDef False ident $ ObjDef vardecl init_opt node_info
+           else handleVarDecl False $ Decl vardecl node_info
+    where
+       ident = identOfVarName var_name
+       globalStorage _ | fun_spec /= noFunctionAttrs =
+                           astError node_info "invalid function specifier for external variable"
+       globalStorage AutoSpec      = astError node_info "file-scope declaration specifies storage `auto'"
+       globalStorage RegSpec       =
+         do when (isJust init_opt) $ astError node_info "initializer given for global register variable"
+            case var_name of
+              NoName -> astError node_info "global register variable has no name"
+              VarName _ Nothing -> astError node_info "no register specified for global register variable"
+              _ -> return ()
+            dt <- getDefTable
+            when (hasFunDef dt) $ astError node_info "global register variable appears after a function definition"
+            return (Static InternalLinkage False, False)
+       -- tentative if there is no initializer, external
+       globalStorage NoStorageSpec = return (Static ExternalLinkage False, True)
+       globalStorage ThreadSpec    = return (Static ExternalLinkage True, True)
+       -- tentative if there is no initializer, internal
+       globalStorage (StaticSpec thread_local) = return (Static InternalLinkage thread_local, True)
+       globalStorage (ExternSpec thread_local) =
+           case init_opt of
+               -- declaration with either external or old storage
+               Nothing -> do old_decl <- lookupObject ident
+                             return (maybe (Static ExternalLinkage thread_local) declStorage old_decl,False)
+               -- warning, external definition
+               Just _  -> do warn $ badSpecifierError node_info "Both initializer and `extern` specifier given - treating as definition"
+                             return (Static ExternalLinkage thread_local, True)
+       hasFunDef dt = any (isFuncDef . snd) (Map.toList $ gObjs $ globalDefs dt)
+       isFuncDef (FunctionDef fd) = not $ (isInline . functionAttrs) fd
+       isFuncDef _ = False
+
+-- | handle a function-scope object declaration \/ definition
+-- see [http://www.sivity.net/projects/language.c/wiki/LocalDefinitions]
+localVarDecl :: (MonadTrav m) => VarDeclInfo -> Maybe Initializer -> m ()
+localVarDecl (VarDeclInfo var_name fun_attrs storage_spec attrs typ node_info) init_opt =
+    do when (isNoName var_name) $ astError node_info "NoName in localVarDecl"
+       (storage,is_def) <- localStorage storage_spec
+       let vardecl = VarDecl var_name (DeclAttrs fun_attrs storage attrs) typ
+       if is_def
+           then handleObjectDef True ident (ObjDef vardecl init_opt node_info)
+           else handleVarDecl True (Decl vardecl node_info)
+    where
+    ident = identOfVarName var_name
+    localStorage NoStorageSpec = return (Auto False,True)
+    localStorage ThreadSpec    = return (Auto True,True)
+    localStorage RegSpec = return (Auto True,True)
+    -- static no linkage
+    localStorage (StaticSpec thread_local) =
+      return (Static NoLinkage thread_local,True)
+    localStorage (ExternSpec thread_local)
+      | isJust init_opt = astError node_info "extern keyword and initializer for local"
+      | otherwise =
+          do old_decl <- lookupObject ident
+             return (maybe (Static ExternalLinkage thread_local) declStorage old_decl,False)
+    localStorage _ = astError node_info "bad storage specifier for local"
+
+defineParams :: MonadTrav m => NodeInfo -> VarDecl -> m ()
+defineParams ni decl =
+  case getParams (declType decl) of
+    Nothing -> astError ni
+               "expecting complete function type in function definition"
+    Just params -> mapM_ handleParamDecl params
+
+analyseFunctionBody :: (MonadTrav m) => NodeInfo -> VarDecl -> CStat -> m Stmt
+analyseFunctionBody node_info decl s@(CCompound localLabels items _) =
+  do enterFunctionScope
+     mapM_ (withDefTable . defineLabel) (localLabels ++ getLabels s)
+     defineParams node_info decl
+     -- record parameters
+     mapM_ (tBlockItem [FunCtx decl]) items
+     leaveFunctionScope
+     return s -- XXX: bogus
+
+analyseFunctionBody _ _ s = astError (nodeInfo s) "Function body is no compound statement"
+
+data StmtCtx = FunCtx VarDecl
+             | LoopCtx
+             | SwitchCtx
+
+-- | Given a context, determine the type declaration for the enclosing
+--   function, if possible, given a context.
+enclosingFunctionType :: [StmtCtx] -> Maybe Type
+enclosingFunctionType [] = Nothing
+enclosingFunctionType (FunCtx vd : _) = Just $ declType vd
+enclosingFunctionType (_ : cs) = enclosingFunctionType cs
+
+inLoop :: [StmtCtx] -> Bool
+inLoop c = any isLoop c
+  where isLoop LoopCtx = True
+        isLoop _ = False
+
+inSwitch :: [StmtCtx] -> Bool
+inSwitch c = any isSwitch c
+  where isSwitch SwitchCtx = True
+        isSwitch _ = False
+
+data ExprSide = LValue | RValue
+                deriving (Eq, Show)
+
+-- | Typecheck a statement, given a statement context. The type of a
+--   statement is usually @void@, but expression statements and blocks
+--   can sometimes have other types.
+tStmt :: MonadTrav m => [StmtCtx] -> CStat -> m Type
+tStmt c (CLabel _ s _ _)         = tStmt c s
+tStmt c (CExpr e _)              =
+  maybe (return voidType) (tExpr c RValue) e
+tStmt c (CCompound ls body _)    =
+  do enterBlockScope
+     mapM_ (withDefTable . defineLabel) ls
+     t <- foldM (const $ tBlockItem c) voidType body
+     leaveBlockScope
+     return t
+tStmt c (CIf e sthen selse _)    =
+  checkGuard c e >> tStmt c sthen
+                 >> maybe (return ()) (voidM . tStmt c) selse
+                 >> return voidType
+tStmt c (CSwitch e s ni)         =
+  tExpr c RValue e >>= checkIntegral' ni >>
+  tStmt (SwitchCtx : c) s
+tStmt c (CWhile e s _ _)         =
+  checkGuard c e >> tStmt (LoopCtx : c) s
+tStmt _ (CGoto l ni)             =
+  do dt <- getDefTable
+     case lookupLabel l dt of
+       Just _ -> return voidType
+       Nothing -> typeError ni $ "undefined label in goto: " ++ identToString l
+tStmt c (CCont ni)               =
+  do unless (inLoop c) $ astError ni "continue statement outside of loop"
+     return voidType
+tStmt c (CBreak ni)              =
+  do unless (inLoop c || inSwitch c) $
+            astError ni "break statement outside of loop or switch statement"
+     return voidType
+tStmt c (CReturn (Just e) ni)    =
+  do t <- tExpr c RValue e
+     rt <- case enclosingFunctionType c of
+             Just (FunctionType (FunType rt _ _) _) -> return rt
+             Just (FunctionType (FunTypeIncomplete rt) _) -> return rt
+             Just ft -> astError ni $ "bad function type: " ++ pType ft
+             Nothing -> astError ni "return statement outside function"
+     case (rt, t) of
+       -- apparently it's ok to return void from a void function?
+       (DirectType TyVoid _ _, DirectType TyVoid _ _) -> return ()
+       _ -> assignCompatible' ni CAssignOp rt t
+     return voidType
+tStmt _ (CReturn Nothing _)      = return voidType
+-- XXX: anything to do for assembly?
+tStmt _ (CAsm _ _)               = return voidType
+tStmt c (CCase e s ni)           =
+  do unless (inSwitch c) $
+            astError ni "case statement outside of switch statement"
+     tExpr c RValue e >>= checkIntegral' ni
+     tStmt c s
+tStmt c (CCases e1 e2 s ni)      =
+  do unless (inSwitch c) $
+            astError ni "case statement outside of switch statement"
+     tExpr c RValue e1 >>= checkIntegral' ni
+     tExpr c RValue e2 >>= checkIntegral' ni
+     tStmt c s
+tStmt c (CDefault s ni)          =
+  do unless (inSwitch c) $
+            astError ni "default statement outside of switch statement"
+     tStmt c s
+tStmt c (CFor i g inc s _)       =
+  do enterBlockScope
+     either (maybe (return ()) checkExpr) (analyseDecl True) i
+     maybe (return ()) (checkGuard c) g
+     maybe (return ()) checkExpr inc
+     _ <- tStmt (LoopCtx : c) s
+     leaveBlockScope
+     return voidType
+  where checkExpr e = voidM$ tExpr c RValue e
+tStmt c (CGotoPtr e ni)          =
+  do t <- tExpr c RValue e
+     case t of
+       (PtrType _ _ _) -> return voidType
+       _               -> typeError ni "can't goto non-pointer"
+
+-- | Typecheck a block item. When statement expressions are blocks,
+--   they have the type of their last expression statement, so this
+--   needs to return a type.
+tBlockItem :: MonadTrav m => [StmtCtx] -> CBlockItem -> m Type
+tBlockItem c (CBlockStmt s) = tStmt c s
+tBlockItem _ (CBlockDecl d) = analyseDecl True d >> return voidType
+-- TODO: fixup analyseFunDef to handle nested functions
+tBlockItem _ (CNestedFunDef fd) = analyseFunDef fd >> return voidType
+
+checkGuard :: MonadTrav m => [StmtCtx] -> CExpr -> m ()
+checkGuard c e = tExpr c RValue e >>= checkScalar' (nodeInfo e)
+
+-- XXX: this is bogus, correct only for IA32. We should eventually
+-- have a collection of these and allow people to choose one.
+defaultMD :: MachineDesc
+defaultMD =
+  MachineDesc
+  { iSize = \it ->
+            case it of
+              TyBool    -> 1
+              TyChar    -> 1
+              TySChar   -> 1
+              TyUChar   -> 1
+              TyShort   -> 2
+              TyUShort  -> 2
+              TyInt     -> 4
+              TyUInt    -> 4
+              TyLong    -> 4
+              TyULong   -> 4
+              TyLLong   -> 8
+              TyULLong  -> 8
+              TyInt128  -> 16
+              TyUInt128 -> 16
+  , fSize = \ft ->
+            case ft of
+              TyFloat   -> 4
+              TyDouble  -> 8
+              TyLDouble -> 16
+  , builtinSize = \bt ->
+                  case bt of
+                    TyVaList -> 4
+                    TyAny    -> 4
+  , ptrSize = 4
+  , voidSize = 1
+  , iAlign = \it ->
+             case it of
+               TyBool    -> 1
+               TyChar    -> 1
+               TySChar   -> 1
+               TyUChar   -> 1
+               TyShort   -> 2
+               TyUShort  -> 2
+               TyInt     -> 4
+               TyUInt    -> 4
+               TyLong    -> 4
+               TyULong   -> 4
+               TyLLong   -> 8
+               TyULLong  -> 8
+               TyInt128  -> 16
+               TyUInt128 -> 16
+  , fAlign = \ft ->
+             case ft of
+               TyFloat   -> 4
+               TyDouble  -> 8
+               TyLDouble -> 16
+  , builtinAlign = \bt ->
+                   case bt of
+                     TyVaList -> 4
+                     TyAny    -> 4
+  , ptrAlign = 4
+  , voidAlign = 1
+  }
+
+tExpr :: MonadTrav m => [StmtCtx] -> ExprSide -> CExpr -> m Type
+tExpr c side e =
+  case nameOfNode (nodeInfo e) of
+    Just n ->
+      do dt <- getDefTable
+         case lookupType dt n of
+           Just t -> return t
+           Nothing ->
+             do t <- tExpr' c side e
+                withDefTable (\dt' -> (t, insertType dt' n t))
+    Nothing -> tExpr' c side e
+
+-- | Typecheck an expression, with information about whether it
+--   appears as an lvalue or an rvalue.
+tExpr' :: MonadTrav m => [StmtCtx] -> ExprSide -> CExpr -> m Type
+tExpr' c side (CBinary op le re ni)    =
+  do when (side == LValue) $ typeError ni "binary operator as lvalue"
+     lt <- tExpr c RValue le
+     rt <- tExpr c RValue re
+     binopType' ni op lt rt
+tExpr' c side (CUnary CAdrOp e ni)     =
+  do when (side == LValue) $
+          typeError ni "address-of operator as lvalue"
+     case e of
+       CCompoundLit _ _ _ -> simplePtr `liftM` tExpr c RValue e
+       CVar i _ -> lookupObject i >>=
+                   typeErrorOnLeft ni . maybe (notFound i) varAddrType
+       _        -> simplePtr `liftM` tExpr c LValue e
+tExpr' c _ (CUnary CIndOp e ni)     =
+  tExpr c RValue e >>= (typeErrorOnLeft ni . derefType)
+tExpr' c _ (CUnary CCompOp e ni)    =
+  do t <- tExpr c RValue e
+     checkIntegral' ni t
+     return t
+tExpr' c side (CUnary CNegOp e ni)      =
+  do when (side == LValue) $
+          typeError ni "logical negation used as lvalue"
+     tExpr c RValue e >>= checkScalar' ni
+     return boolType
+tExpr' c side (CUnary op e _)          =
+  tExpr c (if isEffectfulOp op then LValue else side) e
+tExpr' c _ (CIndex b i ni)             =
+  do bt <- tExpr c RValue b
+     it <- tExpr c RValue i
+     addrTy <- binopType' ni CAddOp bt it
+     typeErrorOnLeft ni $ derefType addrTy
+tExpr' c side (CCond e1 me2 e3 ni)     =
+  do t1 <- tExpr c RValue e1
+     checkScalar' (nodeInfo e1) t1
+     t3 <- tExpr c side e3
+     case me2 of
+       Just e2 ->
+         do t2 <- tExpr c side e2
+            conditionalType' ni t2 t3
+       Nothing -> conditionalType' ni t1 t3
+tExpr' c _ (CMember e m deref ni)   =
+  do t <- tExpr c RValue e
+     bt <- if deref then typeErrorOnLeft ni (derefType t) else return t
+     fieldType ni m bt
+tExpr' c side (CComma es _)            =
+  mapM (tExpr c side) es >>= return . last
+tExpr' c side (CCast d e ni)           =
+  do dt <- analyseTypeDecl d
+     et <- tExpr c side e
+     typeErrorOnLeft ni $ castCompatible dt et
+     return dt
+tExpr' c side (CSizeofExpr e ni)       =
+  do when (side == LValue) $ typeError ni "sizeof as lvalue"
+     _ <- tExpr c RValue e
+     return size_tType
+tExpr' c side (CAlignofExpr e ni)      =
+  do when (side == LValue) $ typeError ni "alignof as lvalue"
+     _ <- tExpr c RValue e
+     return size_tType
+tExpr' c side (CComplexReal e ni)      = complexBaseType ni c side e
+tExpr' c side (CComplexImag e ni)      = complexBaseType ni c side e
+tExpr' _ side (CLabAddrExpr _ ni)      =
+  do when (side == LValue) $ typeError ni "label address as lvalue"
+     return $ PtrType voidType noTypeQuals []
+tExpr' _ side (CCompoundLit d initList ni) =
+  do when (side == LValue) $ typeError ni "compound literal as lvalue"
+     lt <- analyseTypeDecl d
+     tInitList ni (canonicalType lt) initList
+     return lt
+tExpr' _ RValue (CAlignofType _ _)     = return size_tType
+tExpr' _ RValue (CSizeofType _ _)      = return size_tType
+tExpr' _ LValue (CAlignofType _ ni)    =
+  typeError ni "alignoftype as lvalue"
+tExpr' _ LValue (CSizeofType _ ni)     =
+  typeError ni "sizeoftype as lvalue"
+tExpr' ctx side (CGenericSelection expr list ni) = do
+  ty_sel <- tExpr ctx side expr
+  ty_list <- mapM analyseAssoc list
+  def_expr_ty <-
+    case dropWhile (isJust . fst) ty_list of
+      [(Nothing,tExpr'')] -> return (Just tExpr'')
+      [] -> return Nothing
+      _ -> astError ni "more than one default clause in generic selection"
+  case dropWhile (maybe True (not . typesMatch ty_sel) . fst) ty_list of
+    ((_,expr_ty) : _ ) -> return expr_ty
+    [] -> case def_expr_ty of
+      (Just expr_ty) -> return expr_ty
+      Nothing -> astError ni ("no clause matches for generic selection (not fully supported) - selector type is " ++ show (pretty ty_sel) ++
+                              ", available types are " ++ show (map (pretty.fromJust.fst) (filter (isJust.fst) ty_list)))
+  where
+    analyseAssoc (mdecl,expr') = do
+      tDecl <- mapM analyseTypeDecl mdecl
+      tExpr'' <- tExpr ctx side expr'
+      return (tDecl, tExpr'')
+    typesMatch (DirectType tn1 _ _) (DirectType tn2 _ _) = directTypesMatch tn1 tn2
+    typesMatch _ _ = False -- not fully supported
+    directTypesMatch TyVoid TyVoid = True
+    directTypesMatch (TyIntegral t1) (TyIntegral t2) = t1 == t2
+    directTypesMatch (TyFloating t1) (TyFloating t2) = t1 == t2
+    directTypesMatch (TyComplex t1) (TyComplex t2) = t1 == t2
+    directTypesMatch _ _ = False -- TODO: not fully supported
+tExpr' _ _ (CVar i ni)              =
+  lookupObject i >>=
+  maybe (typeErrorOnLeft ni $ notFound i) (return . declType)
+tExpr' _ _ (CConst c)                  = constType c
+tExpr' _ _ (CBuiltinExpr b)            = builtinType b
+tExpr' c side (CCall (CVar i _) args ni)
+  | identToString i == "__builtin_choose_expr" =
+    case args of
+      [g, e1, e2] ->
+        -- XXX: the MachineDesc parameter below should be configurable
+        do b <- constEval defaultMD Map.empty g
+           case boolValue b of
+             Just True -> tExpr c side e1
+             Just False -> tExpr c side e2
+             Nothing ->
+               astError ni "non-constant argument to __builtin_choose_expr"
+      _ -> astError ni "wrong number of arguments to __builtin_choose_expr"
+tExpr' c _ (CCall fe args ni)          =
+  do let defType = FunctionType
+                   (FunTypeIncomplete
+                    (DirectType (TyIntegral TyInt) noTypeQuals noAttributes))
+                   noAttributes
+         fallback i = do warn $ invalidAST ni $
+                                "unknown function: " ++ identToString i
+                         return defType
+     t <- case fe of
+            CVar i _ -> lookupObject i >>=
+                        maybe (fallback i) (const $ tExpr c RValue fe)
+            _ -> tExpr c RValue fe
+     atys <- mapM (tExpr c RValue) args
+     -- XXX: we don't actually want to return the canonical return type here
+     case canonicalType t of
+       PtrType (FunctionType (FunType rt pdecls varargs) _) _ _ ->
+         do let ptys = map declType pdecls
+            mapM_ checkArg $ zip3 ptys atys args
+            unless varargs $ when (length atys /= length ptys) $
+                   typeError ni "incorrect number of arguments"
+            return $ canonicalType rt
+       PtrType (FunctionType (FunTypeIncomplete rt) _) _ _ ->
+         do -- warn $ invalidAST ni "incomplete function type"
+            return $ canonicalType rt
+       _  -> typeError ni $ "attempt to call non-function of type " ++ pType t
+  where checkArg (pty, aty, arg) =
+          do attrs <- deepTypeAttrs pty
+             if isTransparentUnion attrs
+               then
+                 case canonicalType pty of
+                   DirectType (TyComp ctr) _ _ ->
+                     do td <- lookupSUE (nodeInfo arg) (sueRef ctr)
+                        _ms <- tagMembers (nodeInfo arg) td
+                        {-
+                        when (null $ rights $ matches ms) $
+                             astError (nodeInfo arg) $
+                             "argument matches none of the elements " ++
+                             "of transparent union"
+                        -}
+                        return ()
+                     -- where matches =
+                     --         map (\d -> assignCompatible
+                     --                    CAssignOp
+                     --                    (snd d)
+                     --                    aty
+                     --             )
+                   _ -> astError (nodeInfo arg)
+                        "non-composite has __transparent_union__ attribute"
+               else
+                 assignCompatible' (nodeInfo arg) CAssignOp pty aty
+        isTransparentUnion =
+          any (\(Attr n _ _) -> identToString n == "__transparent_union__")
+tExpr' c _ (CAssign op le re ni)       =
+  do lt <- tExpr c LValue le
+     rt <- tExpr c RValue re
+     when (constant $ typeQuals lt) $
+          typeError ni $ "assignment to lvalue with `constant' qualifier: "
+                         ++ (render . pretty) le
+     case (canonicalType lt, re) of
+       (lt', CConst (CIntConst i _))
+         | isPointerType lt' && getCInteger i == 0 -> return ()
+       (_, _) -> assignCompatible' ni op lt rt
+     return lt
+tExpr' c _ (CStatExpr s _)             =
+  do enterBlockScope
+     mapM_ (withDefTable . defineLabel) (getLabels s)
+     t <- tStmt c s
+     leaveBlockScope
+     return t
+
+tInitList :: MonadTrav m => NodeInfo -> Type -> CInitList -> m ()
+tInitList _ (ArrayType (DirectType (TyIntegral TyChar) _ _) _ _ _)
+              [([], CInitExpr e@(CConst (CStrConst _ _)) _)] =
+  tExpr [] RValue e >> return ()
+tInitList ni t@(ArrayType _ _ _ _) initList =
+  do let default_ds =
+           repeat (CArrDesig (CConst (CIntConst (cInteger 0) ni)) ni)
+     checkInits t default_ds initList
+tInitList ni t@(DirectType (TyComp ctr) _ _) initList =
+  do td <- lookupSUE ni (sueRef ctr)
+     ms <- tagMembers ni td
+     let default_ds = map (\m -> CMemberDesig (fst m) ni) ms
+     checkInits t default_ds initList
+tInitList _ (PtrType (DirectType TyVoid _ _) _ _ ) _ =
+          return () -- XXX: more checking
+tInitList _ t [([], i)] = voidM$ tInit t i
+tInitList ni t _ = typeError ni $ "initializer list for type: " ++ pType t
+
+checkInits :: MonadTrav m => Type -> [CDesignator] -> CInitList -> m ()
+checkInits _ _ [] = return ()
+checkInits t dds ((ds, i) : is) =
+  do (dds', ds') <- case (dds, ds) of
+                      ([], []) ->
+                        typeError (nodeInfo i) "excess elements in initializer"
+                      (dd' : rest, []) -> return (rest, [dd'])
+                      (_, d : _) -> return (advanceDesigList dds d, ds)
+     t' <- tDesignator t ds'
+     _ <- tInit t' i
+     checkInits t dds' is
+
+advanceDesigList :: [CDesignator] -> CDesignator -> [CDesignator]
+advanceDesigList ds d = drop 1 $ dropWhile (not . matchDesignator d) ds
+
+matchDesignator :: CDesignator -> CDesignator -> Bool
+matchDesignator (CMemberDesig m1 _) (CMemberDesig m2 _) = m1 == m2
+matchDesignator _ _ = True -- XXX: for now, array ranges aren't checked
+
+tDesignator :: MonadTrav m => Type -> [CDesignator] -> m Type
+-- XXX: check that initializers are within array size
+tDesignator (ArrayType bt _ _ _) (CArrDesig e ni : ds) =
+  do tExpr [] RValue e >>= checkIntegral' ni
+     tDesignator bt ds
+tDesignator (ArrayType bt _ _ _) (CRangeDesig e1 e2 ni : ds) =
+  do tExpr [] RValue e1 >>= checkIntegral' ni
+     tExpr [] RValue e2 >>= checkIntegral' ni
+     tDesignator bt ds
+tDesignator (ArrayType _ _ _ _) (d : _) =
+  typeError (nodeInfo d) "member designator in array initializer"
+tDesignator t@(DirectType (TyComp _) _ _) (CMemberDesig m ni : ds) =
+  do mt <- fieldType ni m t
+     tDesignator (canonicalType mt) ds
+tDesignator (DirectType (TyComp _) _ _) (d : _) =
+  typeError (nodeInfo d) "array designator in compound initializer"
+tDesignator t [] = return t
+tDesignator _t _ =
+  error "unepxected type with designator"
+
+tInit :: MonadTrav m => Type -> CInit -> m Initializer
+tInit t i@(CInitExpr e ni) =
+  do it <- tExpr [] RValue e
+     assignCompatible' ni CAssignOp t it
+     return i
+tInit t i@(CInitList initList ni) =
+  tInitList ni (canonicalType t) initList >> return i
+
+complexBaseType :: MonadTrav m => NodeInfo -> [StmtCtx] -> ExprSide -> CExpr -> m Type
+complexBaseType ni c side e =
+  do t <- tExpr c side e
+     case canonicalType t of
+       DirectType (TyComplex ft) quals attrs ->
+         return $ DirectType (TyFloating ft) quals attrs
+       _ -> typeError ni $ "expected complex type, got: " ++ pType t
+
+
+-- | Return the type of a builtin.
+builtinType :: MonadTrav m => CBuiltin -> m Type
+builtinType (CBuiltinVaArg _ d _)           = analyseTypeDecl d
+builtinType (CBuiltinOffsetOf _ _ _)        = return size_tType
+builtinType (CBuiltinTypesCompatible _ _ _) = return boolType
+builtinType (CBuiltinConvertVector _expr ty _) = analyseTypeDecl ty
+
+-- return @Just declspecs@ without @CTypedef@ if the declaration specifier contain @typedef@
+hasTypeDef :: [CDeclSpec] -> Maybe [CDeclSpec]
+hasTypeDef declspecs =
+    case foldr hasTypeDefSpec (False,[]) declspecs of
+        (True,specs') -> Just specs'
+        (False,_)     -> Nothing
+    where
+    hasTypeDefSpec (CStorageSpec (CTypedef _)) (_,specs) = (True, specs)
+    hasTypeDefSpec spec (b,specs) = (b,spec:specs)
src/Language/C/Analysis/AstAnalysis.hs-boot view
@@ -1,13 +1,13 @@-module Language.C.Analysis.AstAnalysis where--import Language.C.Analysis.SemRep-import Language.C.Analysis.TravMonad-import Language.C.Syntax.AST--data StmtCtx = FunCtx VarDecl-             | LoopCtx-             | SwitchCtx--data ExprSide = LValue | RValue--tExpr :: MonadTrav m => [StmtCtx] -> ExprSide -> CExpr -> m Type+module Language.C.Analysis.AstAnalysis where
+
+import Language.C.Analysis.SemRep
+import Language.C.Analysis.TravMonad
+import Language.C.Syntax.AST
+
+data StmtCtx = FunCtx VarDecl
+             | LoopCtx
+             | SwitchCtx
+
+data ExprSide = LValue | RValue
+
+tExpr :: MonadTrav m => [StmtCtx] -> ExprSide -> CExpr -> m Type
src/Language/C/Analysis/Builtins.hs view
@@ -1,226 +1,226 @@-module Language.C.Analysis.Builtins (builtins) where--import Language.C.Analysis.DefTable-import Language.C.Analysis.SemRep-import Language.C.Analysis.TypeUtils-import Language.C.Data.Ident-import Language.C.Data.Node--builtins :: DefTable-builtins = foldr doIdent (foldr doTypeDef emptyDefTable typedefs) idents-  where doTypeDef d = snd . defineTypeDef (identOfTypeDef d) d-        doIdent   d = snd . defineGlobalIdent (declIdent d) d-        dName     s = VarName (builtinIdent s) Nothing-        param ty    = ParamDecl (VarDecl-                                 NoName-                                 (DeclAttrs noFunctionAttrs (Auto False) [])-                                 ty) undefNode-        fnAttrs     = DeclAttrs noFunctionAttrs (FunLinkage ExternalLinkage) []-        varAttrs    = DeclAttrs noFunctionAttrs (Static InternalLinkage False) []-        fnType r as = FunctionType (FunType r (map param as) False) noAttributes-        fnType' r as = FunctionType (FunType r (map param as) True) noAttributes-        func n r as = Declaration-                      (Decl-                       (VarDecl (dName n) fnAttrs (fnType r as))-                       undefNode)-        func' n r as = Declaration-                       (Decl-                        (VarDecl (dName n) fnAttrs (fnType' r as))-                        undefNode)-        var n t     = Declaration-                      (Decl (VarDecl (dName n) varAttrs t) undefNode)-        typedef n t = TypeDef (builtinIdent n) t [] undefNode-        typedefs    = [ typedef "__builtin_va_list"-                                valistType-                      ]-        idents      = [ func "__builtin_expect"-                             (integral TyLong)-                             [integral TyLong, integral TyLong]-                      , func "__builtin_bswap16"-                             uint16_tType-                             [uint16_tType]-                      , func "__builtin_bswap32"-                             uint32_tType-                             [uint32_tType]-                      , func "__builtin_bswap64"-                             uint64_tType-                             [uint64_tType]-                      , func "__builtin_fabs"-                             (floating TyDouble)-                             [floating TyDouble]-                      , func "__builtin_fabsf"-                             (floating TyFloat)-                             [floating TyFloat]-                      , func "__builtin_fabsl"-                             (floating TyLDouble)-                             [floating TyLDouble]-                      , func "__builtin_inf" (floating TyDouble) []-                      , func "__builtin_inff" (floating TyFloat) []-                      , func "__builtin_infl" (floating TyLDouble) []-                      , func "__builtin_huge_val" (floating TyDouble) []-                      , func "__builtin_huge_valf" (floating TyFloat) []-                      , func "__builtin_huge_vall" (floating TyLDouble) []-                      , func "__builtin_copysign"-                             (floating TyDouble)-                             [ floating TyDouble, floating TyDouble ]-                      , func "__builtin_va_start"-                             voidType-                             [ valistType , voidPtr ]-                      , func "__builtin_va_end"-                             voidType-                             [valistType]-                      , func "__builtin_va_copy"-                             voidType-                             [ valistType, valistType ]-                      , func "__builtin_va_arg_pack" (integral TyInt) []-                      , func "__builtin_va_arg_pack_len" (integral TyInt) []-                      , func "__builtin_alloca"-                             voidPtr-                             [ size_tType ]-                      , func "__builtin_memcpy"-                             voidPtr-                             [ voidPtr-                             , constVoidPtr-                             , size_tType-                             ]-                      , func "__builtin_strspn"-                             size_tType-                             [ constCharPtr, constCharPtr ]-                      , func "__builtin_strcspn"-                             size_tType-                             [ constCharPtr, constCharPtr ]-                      , func "__builtin_strchr"-                             charPtr-                             [ constCharPtr, integral TyInt]-                      , func "__builtin_strncpy"-                             charPtr-                             [ constCharPtr -- XXX: restrict-                             , constCharPtr -- XXX: restrict-                             , size_tType-                             ]-                      , func "__builtin_strncat"-                             charPtr-                             [ constCharPtr -- XXX: restrict-                             , constCharPtr -- XXX: restrict-                             , size_tType-                             ]-                      , func "__builtin_strcmp"-                             (integral TyInt)-                             [ constCharPtr, constCharPtr ]-                      , func "__builtin_strpbrk"-                             charPtr-                             [ constCharPtr, constCharPtr ]-                      , func "__builtin_bzero"-                             voidType-                             [ voidPtr, size_tType ]-                      , func "__builtin_clz"-                             (integral TyInt)-                             [ integral TyUInt ]-                      , func "__builtin_constant_p"-                             (integral TyInt)-                             [DirectType (TyBuiltin TyAny) noTypeQuals noAttributes]-                      -- XXX: I don't know if the following has the-                      -- correct type. It doesn't seem to be-                      -- documented.-                      , func "__builtin_extract_return_addr"-                             voidPtr-                             [ voidPtr ]-                      , func "__builtin_return_address"-                             voidPtr-                             [ integral TyUInt ]-                      , func "__builtin_frame_address"-                             voidPtr-                             [ integral TyUInt ]-                      , func "__builtin_expect"-                             (integral TyLong)-                             [ integral TyLong, integral TyLong ]-                      , func "__builtin_prefetch"-                             voidType-                             [ constVoidPtr ]-                      , var "__func__"-                            stringType-                      , var "__PRETTY_FUNCTION__"-                            stringType-                      , var "__FUNCTION__"-                            stringType-                      -- Builtin GCC error checking functions-                      , func "__builtin_object_size"-                             size_tType-                             [ voidPtr, integral TyInt ]-                      , func "__builtin___memcpy_chk"-                             voidPtr-                             [ voidPtr, constVoidPtr, size_tType, size_tType ]-                      , func "__builtin___mempcpy_chk"-                             voidPtr-                             [ voidPtr, constVoidPtr, size_tType, size_tType ]-                      , func "__builtin___memmove_chk"-                             voidPtr-                             [ voidPtr, constVoidPtr, size_tType, size_tType ]-                      , func "__builtin___memset_chk"-                             voidPtr-                             [ voidPtr, integral TyInt, size_tType, size_tType ]-                      , func "__builtin___strcpy_chk"-                             charPtr-                             [ constCharPtr -- XXX: restrict-                             , constCharPtr -- XXX: restrict-                             , size_tType-                             ]-                      , func "__builtin___stpcpy_chk"-                             charPtr-                             [ constCharPtr -- XXX: restrict-                             , constCharPtr -- XXX: restrict-                             , size_tType-                             ]-                      , func "__builtin___strncpy_chk"-                             charPtr-                             [ constCharPtr -- XXX: restrict-                             , constCharPtr -- XXX: restrict-                             , size_tType-                             , size_tType-                             ]-                      , func "__builtin___strcat_chk"-                             charPtr-                             [ constCharPtr -- XXX: restrict-                             , constCharPtr -- XXX: restrict-                             , size_tType-                             ]-                      , func "__builtin___strncat_chk"-                             charPtr-                             [ constCharPtr -- XXX: restrict-                             , constCharPtr -- XXX: restrict-                             , size_tType-                             , size_tType-                             ]-                      , func' "__builtin___sprintf_chk"-                             (integral TyInt)-                             [ charPtr-                             , integral TyInt-                             , size_tType-                             , constCharPtr-                             ]-                      , func' "__builtin___snprintf_chk"-                             (integral TyInt)-                             [ charPtr-                             , size_tType-                             , integral TyInt-                             , size_tType-                             , constCharPtr-                             ]-                      , func "__builtin___vsprintf_chk"-                             (integral TyInt)-                             [ charPtr-                             , integral TyInt-                             , size_tType-                             , constCharPtr-                             , valistType-                             ]-                      , func "__builtin___vsnprintf_chk"-                             (integral TyInt)-                             [ charPtr-                             , size_tType-                             , integral TyInt-                             , size_tType-                             , constCharPtr-                             , valistType-                             ]-                      ]+module Language.C.Analysis.Builtins (builtins) where
+
+import Language.C.Analysis.DefTable
+import Language.C.Analysis.SemRep
+import Language.C.Analysis.TypeUtils
+import Language.C.Data.Ident
+import Language.C.Data.Node
+
+builtins :: DefTable
+builtins = foldr doIdent (foldr doTypeDef emptyDefTable typedefs) idents
+  where doTypeDef d = snd . defineTypeDef (identOfTypeDef d) d
+        doIdent   d = snd . defineGlobalIdent (declIdent d) d
+        dName     s = VarName (builtinIdent s) Nothing
+        param ty    = ParamDecl (VarDecl
+                                 NoName
+                                 (DeclAttrs noFunctionAttrs (Auto False) [])
+                                 ty) undefNode
+        fnAttrs     = DeclAttrs noFunctionAttrs (FunLinkage ExternalLinkage) []
+        varAttrs    = DeclAttrs noFunctionAttrs (Static InternalLinkage False) []
+        fnType r as = FunctionType (FunType r (map param as) False) noAttributes
+        fnType' r as = FunctionType (FunType r (map param as) True) noAttributes
+        func n r as = Declaration
+                      (Decl
+                       (VarDecl (dName n) fnAttrs (fnType r as))
+                       undefNode)
+        func' n r as = Declaration
+                       (Decl
+                        (VarDecl (dName n) fnAttrs (fnType' r as))
+                        undefNode)
+        var n t     = Declaration
+                      (Decl (VarDecl (dName n) varAttrs t) undefNode)
+        typedef n t = TypeDef (builtinIdent n) t [] undefNode
+        typedefs    = [ typedef "__builtin_va_list"
+                                valistType
+                      ]
+        idents      = [ func "__builtin_expect"
+                             (integral TyLong)
+                             [integral TyLong, integral TyLong]
+                      , func "__builtin_bswap16"
+                             uint16_tType
+                             [uint16_tType]
+                      , func "__builtin_bswap32"
+                             uint32_tType
+                             [uint32_tType]
+                      , func "__builtin_bswap64"
+                             uint64_tType
+                             [uint64_tType]
+                      , func "__builtin_fabs"
+                             (floating TyDouble)
+                             [floating TyDouble]
+                      , func "__builtin_fabsf"
+                             (floating TyFloat)
+                             [floating TyFloat]
+                      , func "__builtin_fabsl"
+                             (floating TyLDouble)
+                             [floating TyLDouble]
+                      , func "__builtin_inf" (floating TyDouble) []
+                      , func "__builtin_inff" (floating TyFloat) []
+                      , func "__builtin_infl" (floating TyLDouble) []
+                      , func "__builtin_huge_val" (floating TyDouble) []
+                      , func "__builtin_huge_valf" (floating TyFloat) []
+                      , func "__builtin_huge_vall" (floating TyLDouble) []
+                      , func "__builtin_copysign"
+                             (floating TyDouble)
+                             [ floating TyDouble, floating TyDouble ]
+                      , func "__builtin_va_start"
+                             voidType
+                             [ valistType , voidPtr ]
+                      , func "__builtin_va_end"
+                             voidType
+                             [valistType]
+                      , func "__builtin_va_copy"
+                             voidType
+                             [ valistType, valistType ]
+                      , func "__builtin_va_arg_pack" (integral TyInt) []
+                      , func "__builtin_va_arg_pack_len" (integral TyInt) []
+                      , func "__builtin_alloca"
+                             voidPtr
+                             [ size_tType ]
+                      , func "__builtin_memcpy"
+                             voidPtr
+                             [ voidPtr
+                             , constVoidPtr
+                             , size_tType
+                             ]
+                      , func "__builtin_strspn"
+                             size_tType
+                             [ constCharPtr, constCharPtr ]
+                      , func "__builtin_strcspn"
+                             size_tType
+                             [ constCharPtr, constCharPtr ]
+                      , func "__builtin_strchr"
+                             charPtr
+                             [ constCharPtr, integral TyInt]
+                      , func "__builtin_strncpy"
+                             charPtr
+                             [ constCharPtr -- XXX: restrict
+                             , constCharPtr -- XXX: restrict
+                             , size_tType
+                             ]
+                      , func "__builtin_strncat"
+                             charPtr
+                             [ constCharPtr -- XXX: restrict
+                             , constCharPtr -- XXX: restrict
+                             , size_tType
+                             ]
+                      , func "__builtin_strcmp"
+                             (integral TyInt)
+                             [ constCharPtr, constCharPtr ]
+                      , func "__builtin_strpbrk"
+                             charPtr
+                             [ constCharPtr, constCharPtr ]
+                      , func "__builtin_bzero"
+                             voidType
+                             [ voidPtr, size_tType ]
+                      , func "__builtin_clz"
+                             (integral TyInt)
+                             [ integral TyUInt ]
+                      , func "__builtin_constant_p"
+                             (integral TyInt)
+                             [DirectType (TyBuiltin TyAny) noTypeQuals noAttributes]
+                      -- XXX: I don't know if the following has the
+                      -- correct type. It doesn't seem to be
+                      -- documented.
+                      , func "__builtin_extract_return_addr"
+                             voidPtr
+                             [ voidPtr ]
+                      , func "__builtin_return_address"
+                             voidPtr
+                             [ integral TyUInt ]
+                      , func "__builtin_frame_address"
+                             voidPtr
+                             [ integral TyUInt ]
+                      , func "__builtin_expect"
+                             (integral TyLong)
+                             [ integral TyLong, integral TyLong ]
+                      , func "__builtin_prefetch"
+                             voidType
+                             [ constVoidPtr ]
+                      , var "__func__"
+                            stringType
+                      , var "__PRETTY_FUNCTION__"
+                            stringType
+                      , var "__FUNCTION__"
+                            stringType
+                      -- Builtin GCC error checking functions
+                      , func "__builtin_object_size"
+                             size_tType
+                             [ voidPtr, integral TyInt ]
+                      , func "__builtin___memcpy_chk"
+                             voidPtr
+                             [ voidPtr, constVoidPtr, size_tType, size_tType ]
+                      , func "__builtin___mempcpy_chk"
+                             voidPtr
+                             [ voidPtr, constVoidPtr, size_tType, size_tType ]
+                      , func "__builtin___memmove_chk"
+                             voidPtr
+                             [ voidPtr, constVoidPtr, size_tType, size_tType ]
+                      , func "__builtin___memset_chk"
+                             voidPtr
+                             [ voidPtr, integral TyInt, size_tType, size_tType ]
+                      , func "__builtin___strcpy_chk"
+                             charPtr
+                             [ constCharPtr -- XXX: restrict
+                             , constCharPtr -- XXX: restrict
+                             , size_tType
+                             ]
+                      , func "__builtin___stpcpy_chk"
+                             charPtr
+                             [ constCharPtr -- XXX: restrict
+                             , constCharPtr -- XXX: restrict
+                             , size_tType
+                             ]
+                      , func "__builtin___strncpy_chk"
+                             charPtr
+                             [ constCharPtr -- XXX: restrict
+                             , constCharPtr -- XXX: restrict
+                             , size_tType
+                             , size_tType
+                             ]
+                      , func "__builtin___strcat_chk"
+                             charPtr
+                             [ constCharPtr -- XXX: restrict
+                             , constCharPtr -- XXX: restrict
+                             , size_tType
+                             ]
+                      , func "__builtin___strncat_chk"
+                             charPtr
+                             [ constCharPtr -- XXX: restrict
+                             , constCharPtr -- XXX: restrict
+                             , size_tType
+                             , size_tType
+                             ]
+                      , func' "__builtin___sprintf_chk"
+                             (integral TyInt)
+                             [ charPtr
+                             , integral TyInt
+                             , size_tType
+                             , constCharPtr
+                             ]
+                      , func' "__builtin___snprintf_chk"
+                             (integral TyInt)
+                             [ charPtr
+                             , size_tType
+                             , integral TyInt
+                             , size_tType
+                             , constCharPtr
+                             ]
+                      , func "__builtin___vsprintf_chk"
+                             (integral TyInt)
+                             [ charPtr
+                             , integral TyInt
+                             , size_tType
+                             , constCharPtr
+                             , valistType
+                             ]
+                      , func "__builtin___vsnprintf_chk"
+                             (integral TyInt)
+                             [ charPtr
+                             , size_tType
+                             , integral TyInt
+                             , size_tType
+                             , constCharPtr
+                             , valistType
+                             ]
+                      ]
src/Language/C/Analysis/ConstEval.hs view
@@ -1,209 +1,209 @@-{-# LANGUAGE RelaxedPolyRec #-}-module Language.C.Analysis.ConstEval where--import Control.Monad-import Data.Bits-import Data.Maybe-import qualified Data.Map as Map-import Language.C.Syntax.AST-import Language.C.Syntax.Constants-import {-# SOURCE #-} Language.C.Analysis.AstAnalysis (tExpr, ExprSide(..))-import Language.C.Analysis.Debug ()-import Language.C.Analysis.DeclAnalysis-import Language.C.Analysis.DefTable-import Language.C.Data-import Language.C.Pretty-import Language.C.Analysis.SemRep-import Language.C.Analysis.TravMonad-import Language.C.Analysis.TypeUtils-import Text.PrettyPrint.HughesPJ--data MachineDesc =-  MachineDesc-  { iSize        :: IntType -> Integer-  , fSize        :: FloatType -> Integer-  , builtinSize  :: BuiltinType -> Integer-  , ptrSize      :: Integer-  , voidSize     :: Integer-  , iAlign       :: IntType -> Integer-  , fAlign       :: FloatType -> Integer-  , builtinAlign :: BuiltinType -> Integer-  , ptrAlign     :: Integer-  , voidAlign    :: Integer-  }--intExpr :: (Pos n, MonadName m) => n -> Integer -> m CExpr-intExpr n i =-  genName >>= \name ->-    return $ CConst $ CIntConst (cInteger i) (mkNodeInfo (posOf n) name)--sizeofType :: (MonadTrav m, CNode n) => MachineDesc -> n -> Type -> m Integer-sizeofType md _ (DirectType TyVoid _ _) = return $ voidSize md-sizeofType md _ (DirectType (TyIntegral it) _ _) = return $ iSize md it-sizeofType md _ (DirectType (TyFloating ft) _ _) = return $ fSize md ft-sizeofType md _ (DirectType (TyComplex ft) _ _) = return $ 2 * fSize md ft-sizeofType md _ (DirectType (TyComp ctr) _ _) = compSize md ctr-sizeofType md _ (DirectType (TyEnum _) _ _) = return $ iSize md TyInt-sizeofType md _ (DirectType (TyBuiltin b) _ _) = return $ builtinSize md b-sizeofType md _ (PtrType _ _ _)  = return $ ptrSize md-sizeofType md _ (ArrayType _ (UnknownArraySize _) _ _) = return $ ptrSize md-sizeofType md n (ArrayType bt (ArraySize _ sz) _ _) =-  do sz' <- constEval md Map.empty sz-     case sz' of-       CConst (CIntConst i _) ->-         do s <- sizeofType md n bt-            return $ getCInteger i * s-       _ -> return $ ptrSize md-            {--            astError (nodeInfo sz) $-            "array size is not a constant: " ++ (render . pretty) sz-            -}-sizeofType md n (TypeDefType (TypeDefRef _ t _) _ _) = sizeofType md n t-sizeofType md _ (FunctionType _ _) = return $ ptrSize md--alignofType :: (MonadTrav m, CNode n) => MachineDesc -> n -> Type -> m Integer-alignofType md _ (DirectType TyVoid _ _) = return $ voidAlign md-alignofType md _ (DirectType (TyIntegral it) _ _) = return $ iAlign md it-alignofType md _ (DirectType (TyFloating ft) _ _) = return $ fAlign md ft-alignofType md _ (DirectType (TyComplex ft) _ _) = return $ fAlign md ft-alignofType md _ (DirectType (TyEnum _) _ _) = return $ iAlign md TyInt-alignofType md _ (DirectType (TyBuiltin b) _ _) = return $ builtinAlign md b-alignofType md _ (PtrType _ _ _)  = return $ ptrAlign md-alignofType md _ (ArrayType _ (UnknownArraySize _) _ _) = return $ ptrAlign md-alignofType md n (ArrayType bt (ArraySize _ _) _ _) = alignofType md n bt-alignofType md n (TypeDefType (TypeDefRef _ t _) _ _) = alignofType md n t-alignofType _ n t = astError (nodeInfo n) $-                 "can't find alignment of type: " ++ (render . pretty) t--compSize :: MonadTrav m => MachineDesc -> CompTypeRef -> m Integer-compSize md ctr =-  do dt <- getDefTable-     case lookupTag (sueRef ctr) dt of-       Just (Left _)   -> astError (nodeInfo ctr)-                          "composite declared but not defined"-       Just (Right (CompDef (CompType _ tag ms _ ni))) ->-         do let ts = map declType ms-            sizes <- mapM (sizeofType md ni) ts-            -- XXX: handle padding-            case tag of-              StructTag -> return $ sum sizes-              UnionTag  -> return $ maximum sizes-       Just (Right (EnumDef _)) -> return $ iSize md TyInt-       Nothing         -> astError (nodeInfo ctr) "unknown composite"---{- Expression evaluation -}---- Use the withWordBytes function to wrap the results around to the--- correct word size-intOp :: CBinaryOp -> Integer -> Integer -> Integer-intOp CAddOp i1 i2 = i1 + i2-intOp CSubOp i1 i2 = i1 - i2-intOp CMulOp i1 i2 = i1 * i2-intOp CDivOp i1 i2 = i1 `div` i2-intOp CRmdOp i1 i2 = i1 `mod` i2-intOp CShlOp i1 i2 = i1 `shiftL` fromInteger i2-intOp CShrOp i1 i2 = i1 `shiftR` fromInteger i2-intOp CLeOp  i1 i2 = toInteger $ fromEnum $ i1 < i2-intOp CGrOp  i1 i2 = toInteger $ fromEnum $ i1 > i2-intOp CLeqOp i1 i2 = toInteger $ fromEnum $ i1 <= i2-intOp CGeqOp i1 i2 = toInteger $ fromEnum $ i1 >= i2-intOp CEqOp  i1 i2 = toInteger $ fromEnum $ i1 == i2-intOp CNeqOp i1 i2 = toInteger $ fromEnum $ i1 /= i2-intOp CAndOp i1 i2 = i1 .&. i2-intOp CXorOp i1 i2 = i1 `xor` i2-intOp COrOp  i1 i2 = i1 .|. i2-intOp CLndOp i1 i2 = toInteger $ fromEnum $ (i1 /= 0) && (i2 /= 0)-intOp CLorOp i1 i2 = toInteger $ fromEnum $ (i1 /= 0) || (i2 /= 0)---- Use the withWordBytes function to wrap the results around to the--- correct word size-intUnOp :: CUnaryOp -> Integer -> Maybe Integer-intUnOp CPlusOp i = Just i-intUnOp CMinOp  i = Just $ -i-intUnOp CCompOp i = Just $ complement i-intUnOp CNegOp  i = Just $ toInteger $ fromEnum $ i == 0-intUnOp _       _ = Nothing--withWordBytes :: Int -> Integer -> Integer-withWordBytes bytes n = n `rem` (1 `shiftL` (bytes `shiftL` 3))--boolValue :: CExpr -> Maybe Bool-boolValue (CConst (CIntConst i _))  = Just $ getCInteger i /= 0-boolValue (CConst (CCharConst c _)) = Just $ getCCharAsInt c /= 0-boolValue (CConst (CStrConst _ _))  = Just True-boolValue _                         = Nothing--intValue :: CExpr -> Maybe Integer-intValue (CConst (CIntConst i _))  = Just $ getCInteger i-intValue (CConst (CCharConst c _)) = Just $ getCCharAsInt c-intValue _                         = Nothing--constEval :: (MonadTrav m) =>-             MachineDesc -> Map.Map Ident CExpr -> CExpr -> m CExpr-constEval md env (CCond e1 me2 e3 ni) =-  do e1'  <- constEval md env e1-     me2' <- maybe (return Nothing) (\e -> Just `liftM` constEval md env e) me2-     e3'  <- constEval md env e3-     case boolValue e1' of-       Just True  -> return $ fromMaybe e1' me2'-       Just False -> return e3'-       Nothing    -> return $ CCond e1' me2' e3' ni-constEval md env e@(CBinary op e1 e2 ni) =-  do e1' <- constEval md env e1-     e2' <- constEval md env e2-     t <- tExpr [] RValue e-     bytes <- fromIntegral `liftM` sizeofType md e t-     case (intValue e1', intValue e2') of-       (Just i1, Just i2) -> intExpr ni (withWordBytes bytes (intOp op i1 i2))-       (_, _)             -> return $ CBinary op e1' e2' ni-constEval md env (CUnary op e ni) =-  do e' <- constEval md env e-     t <- tExpr [] RValue e-     bytes <- fromIntegral `liftM` sizeofType md e t-     case intValue e' of-       Just i  -> case intUnOp op i of-                    Just i' -> intExpr ni (withWordBytes bytes i')-                    Nothing -> astError ni-                               "invalid unary operator applied to constant"-       Nothing -> return $ CUnary op e' ni-constEval md env (CCast d e ni) =-  do e' <- constEval md env e-     t <- analyseTypeDecl d-     bytes <- fromIntegral `liftM` sizeofType md d t-     case intValue e' of-       Just i -> intExpr ni (withWordBytes bytes i)-       Nothing -> return $ CCast d e' ni-constEval md _ (CSizeofExpr e ni) =-  do t <- tExpr [] RValue e-     sz <- sizeofType md e t-     intExpr ni sz-constEval md _ (CSizeofType d ni) =-  do t <- analyseTypeDecl d-     sz <- sizeofType md d t-     intExpr ni sz-constEval md _ (CAlignofExpr e ni) =-  do t <- tExpr [] RValue e-     sz <- alignofType md e t-     intExpr ni sz-constEval md _ (CAlignofType d ni) =-  do t <- analyseTypeDecl d-     sz <- alignofType md d t-     intExpr ni sz-constEval _ env e@(CVar i _) | Map.member i env =-  return $ fromMaybe e $ Map.lookup i env-constEval md env e@(CVar i _) =-  do t <- tExpr [] RValue e-     case derefTypeDef t of-       DirectType (TyEnum etr) _ _ ->-         do dt <- getDefTable-            case lookupTag (sueRef etr) dt of-              Just (Right (EnumDef (EnumType _ es _ _))) ->-                do env' <- foldM enumConst env es-                   return $ fromMaybe e $ Map.lookup i env'-              _ -> return e-       _ -> return e-  where enumConst env' (Enumerator n e' _ _) =-          do c <- constEval md env' e'-             return $ Map.insert n c env'-constEval _ _ e = return e+{-# LANGUAGE RelaxedPolyRec #-}
+module Language.C.Analysis.ConstEval where
+
+import Control.Monad
+import Data.Bits
+import Data.Maybe
+import qualified Data.Map as Map
+import Language.C.Syntax.AST
+import Language.C.Syntax.Constants
+import {-# SOURCE #-} Language.C.Analysis.AstAnalysis (tExpr, ExprSide(..))
+import Language.C.Analysis.Debug ()
+import Language.C.Analysis.DeclAnalysis
+import Language.C.Analysis.DefTable
+import Language.C.Data
+import Language.C.Pretty
+import Language.C.Analysis.SemRep
+import Language.C.Analysis.TravMonad
+import Language.C.Analysis.TypeUtils
+import Text.PrettyPrint.HughesPJ
+
+data MachineDesc =
+  MachineDesc
+  { iSize        :: IntType -> Integer
+  , fSize        :: FloatType -> Integer
+  , builtinSize  :: BuiltinType -> Integer
+  , ptrSize      :: Integer
+  , voidSize     :: Integer
+  , iAlign       :: IntType -> Integer
+  , fAlign       :: FloatType -> Integer
+  , builtinAlign :: BuiltinType -> Integer
+  , ptrAlign     :: Integer
+  , voidAlign    :: Integer
+  }
+
+intExpr :: (Pos n, MonadName m) => n -> Integer -> m CExpr
+intExpr n i =
+  genName >>= \name ->
+    return $ CConst $ CIntConst (cInteger i) (mkNodeInfo (posOf n) name)
+
+sizeofType :: (MonadTrav m, CNode n) => MachineDesc -> n -> Type -> m Integer
+sizeofType md _ (DirectType TyVoid _ _) = return $ voidSize md
+sizeofType md _ (DirectType (TyIntegral it) _ _) = return $ iSize md it
+sizeofType md _ (DirectType (TyFloating ft) _ _) = return $ fSize md ft
+sizeofType md _ (DirectType (TyComplex ft) _ _) = return $ 2 * fSize md ft
+sizeofType md _ (DirectType (TyComp ctr) _ _) = compSize md ctr
+sizeofType md _ (DirectType (TyEnum _) _ _) = return $ iSize md TyInt
+sizeofType md _ (DirectType (TyBuiltin b) _ _) = return $ builtinSize md b
+sizeofType md _ (PtrType _ _ _)  = return $ ptrSize md
+sizeofType md _ (ArrayType _ (UnknownArraySize _) _ _) = return $ ptrSize md
+sizeofType md n (ArrayType bt (ArraySize _ sz) _ _) =
+  do sz' <- constEval md Map.empty sz
+     case sz' of
+       CConst (CIntConst i _) ->
+         do s <- sizeofType md n bt
+            return $ getCInteger i * s
+       _ -> return $ ptrSize md
+            {-
+            astError (nodeInfo sz) $
+            "array size is not a constant: " ++ (render . pretty) sz
+            -}
+sizeofType md n (TypeDefType (TypeDefRef _ t _) _ _) = sizeofType md n t
+sizeofType md _ (FunctionType _ _) = return $ ptrSize md
+
+alignofType :: (MonadTrav m, CNode n) => MachineDesc -> n -> Type -> m Integer
+alignofType md _ (DirectType TyVoid _ _) = return $ voidAlign md
+alignofType md _ (DirectType (TyIntegral it) _ _) = return $ iAlign md it
+alignofType md _ (DirectType (TyFloating ft) _ _) = return $ fAlign md ft
+alignofType md _ (DirectType (TyComplex ft) _ _) = return $ fAlign md ft
+alignofType md _ (DirectType (TyEnum _) _ _) = return $ iAlign md TyInt
+alignofType md _ (DirectType (TyBuiltin b) _ _) = return $ builtinAlign md b
+alignofType md _ (PtrType _ _ _)  = return $ ptrAlign md
+alignofType md _ (ArrayType _ (UnknownArraySize _) _ _) = return $ ptrAlign md
+alignofType md n (ArrayType bt (ArraySize _ _) _ _) = alignofType md n bt
+alignofType md n (TypeDefType (TypeDefRef _ t _) _ _) = alignofType md n t
+alignofType _ n t = astError (nodeInfo n) $
+                 "can't find alignment of type: " ++ (render . pretty) t
+
+compSize :: MonadTrav m => MachineDesc -> CompTypeRef -> m Integer
+compSize md ctr =
+  do dt <- getDefTable
+     case lookupTag (sueRef ctr) dt of
+       Just (Left _)   -> astError (nodeInfo ctr)
+                          "composite declared but not defined"
+       Just (Right (CompDef (CompType _ tag ms _ ni))) ->
+         do let ts = map declType ms
+            sizes <- mapM (sizeofType md ni) ts
+            -- XXX: handle padding
+            case tag of
+              StructTag -> return $ sum sizes
+              UnionTag  -> return $ maximum sizes
+       Just (Right (EnumDef _)) -> return $ iSize md TyInt
+       Nothing         -> astError (nodeInfo ctr) "unknown composite"
+
+
+{- Expression evaluation -}
+
+-- Use the withWordBytes function to wrap the results around to the
+-- correct word size
+intOp :: CBinaryOp -> Integer -> Integer -> Integer
+intOp CAddOp i1 i2 = i1 + i2
+intOp CSubOp i1 i2 = i1 - i2
+intOp CMulOp i1 i2 = i1 * i2
+intOp CDivOp i1 i2 = i1 `div` i2
+intOp CRmdOp i1 i2 = i1 `mod` i2
+intOp CShlOp i1 i2 = i1 `shiftL` fromInteger i2
+intOp CShrOp i1 i2 = i1 `shiftR` fromInteger i2
+intOp CLeOp  i1 i2 = toInteger $ fromEnum $ i1 < i2
+intOp CGrOp  i1 i2 = toInteger $ fromEnum $ i1 > i2
+intOp CLeqOp i1 i2 = toInteger $ fromEnum $ i1 <= i2
+intOp CGeqOp i1 i2 = toInteger $ fromEnum $ i1 >= i2
+intOp CEqOp  i1 i2 = toInteger $ fromEnum $ i1 == i2
+intOp CNeqOp i1 i2 = toInteger $ fromEnum $ i1 /= i2
+intOp CAndOp i1 i2 = i1 .&. i2
+intOp CXorOp i1 i2 = i1 `xor` i2
+intOp COrOp  i1 i2 = i1 .|. i2
+intOp CLndOp i1 i2 = toInteger $ fromEnum $ (i1 /= 0) && (i2 /= 0)
+intOp CLorOp i1 i2 = toInteger $ fromEnum $ (i1 /= 0) || (i2 /= 0)
+
+-- Use the withWordBytes function to wrap the results around to the
+-- correct word size
+intUnOp :: CUnaryOp -> Integer -> Maybe Integer
+intUnOp CPlusOp i = Just i
+intUnOp CMinOp  i = Just $ -i
+intUnOp CCompOp i = Just $ complement i
+intUnOp CNegOp  i = Just $ toInteger $ fromEnum $ i == 0
+intUnOp _       _ = Nothing
+
+withWordBytes :: Int -> Integer -> Integer
+withWordBytes bytes n = n `rem` (1 `shiftL` (bytes `shiftL` 3))
+
+boolValue :: CExpr -> Maybe Bool
+boolValue (CConst (CIntConst i _))  = Just $ getCInteger i /= 0
+boolValue (CConst (CCharConst c _)) = Just $ getCCharAsInt c /= 0
+boolValue (CConst (CStrConst _ _))  = Just True
+boolValue _                         = Nothing
+
+intValue :: CExpr -> Maybe Integer
+intValue (CConst (CIntConst i _))  = Just $ getCInteger i
+intValue (CConst (CCharConst c _)) = Just $ getCCharAsInt c
+intValue _                         = Nothing
+
+constEval :: (MonadTrav m) =>
+             MachineDesc -> Map.Map Ident CExpr -> CExpr -> m CExpr
+constEval md env (CCond e1 me2 e3 ni) =
+  do e1'  <- constEval md env e1
+     me2' <- maybe (return Nothing) (\e -> Just `liftM` constEval md env e) me2
+     e3'  <- constEval md env e3
+     case boolValue e1' of
+       Just True  -> return $ fromMaybe e1' me2'
+       Just False -> return e3'
+       Nothing    -> return $ CCond e1' me2' e3' ni
+constEval md env e@(CBinary op e1 e2 ni) =
+  do e1' <- constEval md env e1
+     e2' <- constEval md env e2
+     t <- tExpr [] RValue e
+     bytes <- fromIntegral `liftM` sizeofType md e t
+     case (intValue e1', intValue e2') of
+       (Just i1, Just i2) -> intExpr ni (withWordBytes bytes (intOp op i1 i2))
+       (_, _)             -> return $ CBinary op e1' e2' ni
+constEval md env (CUnary op e ni) =
+  do e' <- constEval md env e
+     t <- tExpr [] RValue e
+     bytes <- fromIntegral `liftM` sizeofType md e t
+     case intValue e' of
+       Just i  -> case intUnOp op i of
+                    Just i' -> intExpr ni (withWordBytes bytes i')
+                    Nothing -> astError ni
+                               "invalid unary operator applied to constant"
+       Nothing -> return $ CUnary op e' ni
+constEval md env (CCast d e ni) =
+  do e' <- constEval md env e
+     t <- analyseTypeDecl d
+     bytes <- fromIntegral `liftM` sizeofType md d t
+     case intValue e' of
+       Just i -> intExpr ni (withWordBytes bytes i)
+       Nothing -> return $ CCast d e' ni
+constEval md _ (CSizeofExpr e ni) =
+  do t <- tExpr [] RValue e
+     sz <- sizeofType md e t
+     intExpr ni sz
+constEval md _ (CSizeofType d ni) =
+  do t <- analyseTypeDecl d
+     sz <- sizeofType md d t
+     intExpr ni sz
+constEval md _ (CAlignofExpr e ni) =
+  do t <- tExpr [] RValue e
+     sz <- alignofType md e t
+     intExpr ni sz
+constEval md _ (CAlignofType d ni) =
+  do t <- analyseTypeDecl d
+     sz <- alignofType md d t
+     intExpr ni sz
+constEval _ env e@(CVar i _) | Map.member i env =
+  return $ fromMaybe e $ Map.lookup i env
+constEval md env e@(CVar i _) =
+  do t <- tExpr [] RValue e
+     case derefTypeDef t of
+       DirectType (TyEnum etr) _ _ ->
+         do dt <- getDefTable
+            case lookupTag (sueRef etr) dt of
+              Just (Right (EnumDef (EnumType _ es _ _))) ->
+                do env' <- foldM enumConst env es
+                   return $ fromMaybe e $ Map.lookup i env'
+              _ -> return e
+       _ -> return e
+  where enumConst env' (Enumerator n e' _ _) =
+          do c <- constEval md env' e'
+             return $ Map.insert n c env'
+constEval _ _ e = return e
src/Language/C/Analysis/Debug.hs view
@@ -1,191 +1,192 @@-{-# LANGUAGE FlexibleInstances, TypeSynonymInstances #-}-{-# OPTIONS -fno-warn-orphans #-}--------------------------------------------------------------------------------- |--- Module      :  Language.C.Analysis.Debug--- Copyright   :  (c) 2008 Benedikt Huber--- License     :  BSD-style--- Maintainer  :  benedikt.huber@gmail.com--- Stability   :  prototype--- Portability :  ghc------ Pretty printing the semantic analysis representation.--- This is currently only intended for debugging purposes.-------------------------------------------------------------------------------module Language.C.Analysis.Debug (-globalDeclStats,-prettyAssocs, prettyAssocsWith,--- and many pretty instances-)-where-import Language.C.Analysis.SemRep-import Language.C.Analysis.Export-import Language.C.Analysis.DefTable-import Language.C.Analysis.NameSpaceMap--import Language.C.Data-import Language.C.Pretty--import Text.PrettyPrint.HughesPJ-import Data.Map (Map) ; import qualified Data.Map as Map--prettyAssocs :: (Pretty k, Pretty v) => String -> [(k,v)] -> Doc-prettyAssocs label = prettyAssocsWith label pretty pretty-prettyAssocsWith :: String -> (k -> Doc) -> (v -> Doc) -> [(k,v)] -> Doc-prettyAssocsWith label prettyKey prettyVal theMap =-    text label $$ nest 8 (vcat $ map prettyEntry theMap)-    where-    prettyEntry (k,v) = prettyKey k <+> text " ~> " <+> prettyVal v--instance Pretty DefTable where-    pretty dt = text "DefTable" $$ nest 4 (vcat defMaps)-        where-        defMaps = [ prettyNSMap "idents" identDecls-                  , prettyNSMap "tags" tagDecls-                  , prettyNSMap "labels" labelDefs-                  , prettyNSMap "members" memberDecls-                  ]-        prettyNSMap label f = prettyAssocs label . nsMapToList $ f dt--instance Pretty GlobalDecls where-    pretty gd = text "Global Declarations" $$ (nest 4 $ vcat declMaps)-        where-        declMaps = [ prettyMap "enumerators" theEnums, prettyMap "declarations" theDecls,-                     prettyMap "objects" theObjs,  prettyMap "functions" theFuns,-                     prettyMap "tags"    $ gTags gd,  prettyMap "typeDefs"  $ gTypeDefs gd ]-        prettyMap :: (Pretty t, Pretty k) => String -> Map k t -> Doc-        prettyMap label = prettyAssocs label . Map.assocs-        (theDecls, (theEnums, theObjs, theFuns)) = splitIdentDecls False (gObjs gd)--globalDeclStats :: (FilePath -> Bool) -> GlobalDecls -> [(String,Int)]-globalDeclStats file_filter gmap =-    [ ("Enumeration Constants",Map.size enumerators),-      ("Total Object/Function Declarations",Map.size all_decls),-      ("Object definitions", Map.size objDefs),-      ("Function Definitions", Map.size funDefs),-      ("Tag definitions", Map.size tagDefs),-      ("TypeDefs", Map.size typeDefs)-    ]-    where-    gmap' = filterGlobalDecls filterFile gmap-    (all_decls,(enumerators,objDefs,funDefs)) = splitIdentDecls True (gObjs gmap')-    (tagDefs,typeDefs) = (gTags gmap', gTypeDefs gmap')-    filterFile :: (CNode n) => n -> Bool-    filterFile = maybe True file_filter . fileOfNode . nodeInfo--instance (Pretty a, Pretty b) => Pretty (Either a b) where-    pretty = either pretty pretty-instance Pretty TagFwdDecl where-    pretty (CompDecl ct) = pretty ct-    pretty (EnumDecl et) = pretty et-instance Pretty CompTyKind where-    pretty StructTag = text "struct"-    pretty UnionTag = text "union"-instance Pretty CompTypeRef where-    pretty (CompTypeRef sue kind _) = pretty kind <+> pretty sue-instance Pretty EnumTypeRef where-    pretty (EnumTypeRef sue _ ) = text "enum" <+> pretty sue-instance Pretty Ident where-    pretty = text . identToString-instance Pretty SUERef where-    pretty (AnonymousRef name) = text $ "$" ++ show (nameId name)-    pretty (NamedRef ident) = pretty ident-instance Pretty TagDef where-    pretty (CompDef compty) = pretty compty-    pretty (EnumDef enumty) = pretty enumty-instance Pretty IdentDecl where-    pretty (Declaration decl) = pretty decl-    pretty (ObjectDef odef) = pretty odef-    pretty (FunctionDef fdef) = pretty fdef-    pretty (EnumeratorDef enumerator) = pretty enumerator-instance Pretty Decl where-    pretty (Decl vardecl _) =-        text "declaration" <+>-        pretty vardecl-instance Pretty TypeDef where-    pretty (TypeDef ident ty attrs _) =-        text "typedef" <+> pretty ident <+> text "as"  <+>-        pretty attrs <+> pretty ty-instance Pretty ObjDef where-    pretty (ObjDef vardecl init_opt _) =-        text "object" <+>-        pretty vardecl <+> maybe empty (((text "=") <+>) . pretty) init_opt-instance Pretty FunDef where-    pretty (FunDef vardecl _stmt _) =-        text "function" <+>-        pretty vardecl-instance Pretty VarDecl where-    pretty (VarDecl name attrs ty) =-        ((hsep . punctuate (text " |")) [pretty name, pretty attrs, pretty ty])-instance Pretty ParamDecl where-    pretty (ParamDecl (VarDecl name declattrs ty) _) =-        pretty declattrs <+> pretty name <+> text "::" <+> pretty ty-    pretty (AbstractParamDecl (VarDecl name declattrs ty) _) =-        text "abstract" <+> pretty declattrs <+> pretty name <+>-             text "::" <+> pretty ty-instance Pretty DeclAttrs where-    pretty (DeclAttrs fun_attrs storage attrs) =-        hsep [ pretty fun_attrs, pretty storage, pretty attrs]--instance Pretty Type where-  pretty ty = pretty (exportTypeDecl ty)-instance Pretty TypeQuals where-    pretty tyQuals = hsep $ map showAttr [ ("const",constant),("volatile",volatile),("restrict",restrict) ]-        where showAttr (str,select) | select tyQuals = text str-                                    | otherwise      = empty--instance Pretty CompType where-    pretty (CompType sue_ref tag members attrs _node) =-        (text.show) tag <+> pretty sue_ref <+>-        braces (terminateSemi members) <+>-        pretty attrs--instance Pretty MemberDecl where-    pretty (MemberDecl (VarDecl name declattrs ty) bitfield _) =-        pretty declattrs <+> pretty name <+> text "::" <+> pretty ty <+>-        (maybe empty (\bf -> text ":" <+> pretty bf) bitfield)-    pretty (AnonBitField ty bitfield_sz _) =-        pretty ty <+> text ":" <+> pretty bitfield_sz--instance Pretty EnumType where-    pretty (EnumType sue_ref enumerators attrs _) =-      text "enum" <+> pretty sue_ref <+> braces (terminateSemi_ $ map prettyEnr enumerators) <+> pretty attrs-      where-      prettyEnr (Enumerator ident expr _enumty _) = pretty ident <+> text " = " <+> pretty expr--instance Pretty Enumerator where-    pretty (Enumerator ident expr enumty _) = text "<" <> text "econst" <+> pretty (sueRef enumty) <> text ">" <+>-                                              pretty ident <+> text " = " <+> pretty expr--instance Pretty FunctionAttrs where-    pretty fattrs = hsep [pIf isInline "inline", pIf isNoreturn "_Noreturn"]-      where-        pIf isMatch txt = if isMatch fattrs then text txt else empty--instance Pretty Storage where-    pretty NoStorage = empty-    pretty (Auto reg) = text$ if reg then "auto/register" else "auto"-    pretty (Static linkage thread_local) =-        (hcat . punctuate (text "/") $ [ text "static",pretty linkage ])-        <+> (if thread_local then text ", __thread" else empty)-    pretty (FunLinkage linkage) = text "function/" <> pretty linkage-instance Pretty Linkage where-    pretty InternalLinkage = text "internal"-    pretty ExternalLinkage = text "external"-    pretty NoLinkage       = text "local"-instance Pretty VarName where-    pretty NoName = text "<anonymous>"-    pretty (VarName ident asmname_opt) = pretty ident <+> (maybe empty pAsmName asmname_opt)-        where pAsmName asmname = text "" <+> parens (text "asmname" <+> pretty asmname)-instance Pretty Attributes where-    pretty = joinComma-instance Pretty Attr where-    pretty (Attr ident es _) = pretty ident <+> (if null es then empty else text "(...)")--joinComma :: (Pretty a) => [a] -> Doc-joinComma = hsep . punctuate comma . map pretty-terminateSemi :: (Pretty a) => [a] -> Doc-terminateSemi = terminateSemi_ . map pretty-terminateSemi_ :: [Doc] -> Doc-terminateSemi_ = hsep . map (<> semi)-+{-# LANGUAGE FlexibleInstances, TypeSynonymInstances #-}
+{-# OPTIONS -fno-warn-orphans #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Analysis.Debug
+-- Copyright   :  (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  prototype
+-- Portability :  ghc
+--
+-- Pretty printing the semantic analysis representation.
+-- This is currently only intended for debugging purposes.
+-----------------------------------------------------------------------------
+module Language.C.Analysis.Debug (
+globalDeclStats,
+prettyAssocs, prettyAssocsWith,
+-- and many pretty instances
+)
+where
+import Language.C.Analysis.SemRep
+import Language.C.Analysis.Export
+import Language.C.Analysis.DefTable
+import Language.C.Analysis.NameSpaceMap
+
+import Language.C.Data
+import Language.C.Pretty
+
+import Prelude hiding ((<>))
+import Text.PrettyPrint.HughesPJ
+import Data.Map (Map) ; import qualified Data.Map as Map
+
+prettyAssocs :: (Pretty k, Pretty v) => String -> [(k,v)] -> Doc
+prettyAssocs label = prettyAssocsWith label pretty pretty
+prettyAssocsWith :: String -> (k -> Doc) -> (v -> Doc) -> [(k,v)] -> Doc
+prettyAssocsWith label prettyKey prettyVal theMap =
+    text label $$ nest 8 (vcat $ map prettyEntry theMap)
+    where
+    prettyEntry (k,v) = prettyKey k <+> text " ~> " <+> prettyVal v
+
+instance Pretty DefTable where
+    pretty dt = text "DefTable" $$ nest 4 (vcat defMaps)
+        where
+        defMaps = [ prettyNSMap "idents" identDecls
+                  , prettyNSMap "tags" tagDecls
+                  , prettyNSMap "labels" labelDefs
+                  , prettyNSMap "members" memberDecls
+                  ]
+        prettyNSMap label f = prettyAssocs label . nsMapToList $ f dt
+
+instance Pretty GlobalDecls where
+    pretty gd = text "Global Declarations" $$ (nest 4 $ vcat declMaps)
+        where
+        declMaps = [ prettyMap "enumerators" theEnums, prettyMap "declarations" theDecls,
+                     prettyMap "objects" theObjs,  prettyMap "functions" theFuns,
+                     prettyMap "tags"    $ gTags gd,  prettyMap "typeDefs"  $ gTypeDefs gd ]
+        prettyMap :: (Pretty t, Pretty k) => String -> Map k t -> Doc
+        prettyMap label = prettyAssocs label . Map.assocs
+        (theDecls, (theEnums, theObjs, theFuns)) = splitIdentDecls False (gObjs gd)
+
+globalDeclStats :: (FilePath -> Bool) -> GlobalDecls -> [(String,Int)]
+globalDeclStats file_filter gmap =
+    [ ("Enumeration Constants",Map.size enumerators),
+      ("Total Object/Function Declarations",Map.size all_decls),
+      ("Object definitions", Map.size objDefs),
+      ("Function Definitions", Map.size funDefs),
+      ("Tag definitions", Map.size tagDefs),
+      ("TypeDefs", Map.size typeDefs)
+    ]
+    where
+    gmap' = filterGlobalDecls filterFile gmap
+    (all_decls,(enumerators,objDefs,funDefs)) = splitIdentDecls True (gObjs gmap')
+    (tagDefs,typeDefs) = (gTags gmap', gTypeDefs gmap')
+    filterFile :: (CNode n) => n -> Bool
+    filterFile = maybe True file_filter . fileOfNode . nodeInfo
+
+instance (Pretty a, Pretty b) => Pretty (Either a b) where
+    pretty = either pretty pretty
+instance Pretty TagFwdDecl where
+    pretty (CompDecl ct) = pretty ct
+    pretty (EnumDecl et) = pretty et
+instance Pretty CompTyKind where
+    pretty StructTag = text "struct"
+    pretty UnionTag = text "union"
+instance Pretty CompTypeRef where
+    pretty (CompTypeRef sue kind _) = pretty kind <+> pretty sue
+instance Pretty EnumTypeRef where
+    pretty (EnumTypeRef sue _ ) = text "enum" <+> pretty sue
+instance Pretty Ident where
+    pretty = text . identToString
+instance Pretty SUERef where
+    pretty (AnonymousRef name) = text $ "$" ++ show (nameId name)
+    pretty (NamedRef ident) = pretty ident
+instance Pretty TagDef where
+    pretty (CompDef compty) = pretty compty
+    pretty (EnumDef enumty) = pretty enumty
+instance Pretty IdentDecl where
+    pretty (Declaration decl) = pretty decl
+    pretty (ObjectDef odef) = pretty odef
+    pretty (FunctionDef fdef) = pretty fdef
+    pretty (EnumeratorDef enumerator) = pretty enumerator
+instance Pretty Decl where
+    pretty (Decl vardecl _) =
+        text "declaration" <+>
+        pretty vardecl
+instance Pretty TypeDef where
+    pretty (TypeDef ident ty attrs _) =
+        text "typedef" <+> pretty ident <+> text "as"  <+>
+        pretty attrs <+> pretty ty
+instance Pretty ObjDef where
+    pretty (ObjDef vardecl init_opt _) =
+        text "object" <+>
+        pretty vardecl <+> maybe empty (((text "=") <+>) . pretty) init_opt
+instance Pretty FunDef where
+    pretty (FunDef vardecl _stmt _) =
+        text "function" <+>
+        pretty vardecl
+instance Pretty VarDecl where
+    pretty (VarDecl name attrs ty) =
+        ((hsep . punctuate (text " |")) [pretty name, pretty attrs, pretty ty])
+instance Pretty ParamDecl where
+    pretty (ParamDecl (VarDecl name declattrs ty) _) =
+        pretty declattrs <+> pretty name <+> text "::" <+> pretty ty
+    pretty (AbstractParamDecl (VarDecl name declattrs ty) _) =
+        text "abstract" <+> pretty declattrs <+> pretty name <+>
+             text "::" <+> pretty ty
+instance Pretty DeclAttrs where
+    pretty (DeclAttrs fun_attrs storage attrs) =
+        hsep [ pretty fun_attrs, pretty storage, pretty attrs]
+
+instance Pretty Type where
+  pretty ty = pretty (exportTypeDecl ty)
+instance Pretty TypeQuals where
+    pretty tyQuals = hsep $ map showAttr [ ("const",constant),("volatile",volatile),("restrict",restrict) ]
+        where showAttr (str,select) | select tyQuals = text str
+                                    | otherwise      = empty
+
+instance Pretty CompType where
+    pretty (CompType sue_ref tag members attrs _node) =
+        (text.show) tag <+> pretty sue_ref <+>
+        braces (terminateSemi members) <+>
+        pretty attrs
+
+instance Pretty MemberDecl where
+    pretty (MemberDecl (VarDecl name declattrs ty) bitfield _) =
+        pretty declattrs <+> pretty name <+> text "::" <+> pretty ty <+>
+        (maybe empty (\bf -> text ":" <+> pretty bf) bitfield)
+    pretty (AnonBitField ty bitfield_sz _) =
+        pretty ty <+> text ":" <+> pretty bitfield_sz
+
+instance Pretty EnumType where
+    pretty (EnumType sue_ref enumerators attrs _) =
+      text "enum" <+> pretty sue_ref <+> braces (terminateSemi_ $ map prettyEnr enumerators) <+> pretty attrs
+      where
+      prettyEnr (Enumerator ident expr _enumty _) = pretty ident <+> text " = " <+> pretty expr
+
+instance Pretty Enumerator where
+    pretty (Enumerator ident expr enumty _) = text "<" <> text "econst" <+> pretty (sueRef enumty) <> text ">" <+>
+                                              pretty ident <+> text " = " <+> pretty expr
+
+instance Pretty FunctionAttrs where
+    pretty fattrs = hsep [pIf isInline "inline", pIf isNoreturn "_Noreturn"]
+      where
+        pIf isMatch txt = if isMatch fattrs then text txt else empty
+
+instance Pretty Storage where
+    pretty NoStorage = empty
+    pretty (Auto reg) = text$ if reg then "auto/register" else "auto"
+    pretty (Static linkage thread_local) =
+        (hcat . punctuate (text "/") $ [ text "static",pretty linkage ])
+        <+> (if thread_local then text ", __thread" else empty)
+    pretty (FunLinkage linkage) = text "function/" <> pretty linkage
+instance Pretty Linkage where
+    pretty InternalLinkage = text "internal"
+    pretty ExternalLinkage = text "external"
+    pretty NoLinkage       = text "local"
+instance Pretty VarName where
+    pretty NoName = text "<anonymous>"
+    pretty (VarName ident asmname_opt) = pretty ident <+> (maybe empty pAsmName asmname_opt)
+        where pAsmName asmname = text "" <+> parens (text "asmname" <+> pretty asmname)
+instance Pretty Attributes where
+    pretty = joinComma
+instance Pretty Attr where
+    pretty (Attr ident es _) = pretty ident <+> (if null es then empty else text "(...)")
+
+joinComma :: (Pretty a) => [a] -> Doc
+joinComma = hsep . punctuate comma . map pretty
+terminateSemi :: (Pretty a) => [a] -> Doc
+terminateSemi = terminateSemi_ . map pretty
+terminateSemi_ :: [Doc] -> Doc
+terminateSemi_ = hsep . map (<> semi)
+
src/Language/C/Analysis/DeclAnalysis.hs view
@@ -1,586 +1,589 @@-{-# LANGUAGE PatternGuards, FlexibleContexts #-}--------------------------------------------------------------------------------- |--- Module      :  Language.C.Analysis.DeclAnalysis--- Copyright   :  (c) 2008 Benedikt Huber--- License     :  BSD-style--- Maintainer  :  benedikt.huber@gmail.com--- Stability   :  alpha--- Portability :  ghc------ This module performs the analysis of declarations and the translation of--- type specifications in the AST.-------------------------------------------------------------------------------module Language.C.Analysis.DeclAnalysis (-  -- * Translating types-  analyseTypeDecl,-  tType,tDirectType,tNumType,tArraySize,tTypeQuals,-  mergeOldStyle,-  -- * Dissecting type specs-  canonicalTypeSpec, NumBaseType(..),SignSpec(..),SizeMod(..),NumTypeSpec(..),TypeSpecAnalysis(..),-  canonicalStorageSpec, StorageSpec(..), hasThreadLocalSpec, isTypeDef,-  -- * Helpers-  VarDeclInfo(..),-  tAttr,mkVarName,getOnlyDeclr,nameOfDecl,analyseVarDecl,analyseVarDecl'-)-where-import Language.C.Data.Error-import Language.C.Data.Node-import Language.C.Data.Ident-import Language.C.Pretty-import Language.C.Syntax-import {-# SOURCE #-} Language.C.Analysis.AstAnalysis (tExpr, ExprSide(..))-import Language.C.Analysis.DefTable (TagFwdDecl(..), insertType)-import Language.C.Analysis.SemError-import Language.C.Analysis.SemRep-import Language.C.Analysis.TravMonad--import Data.Foldable as F (foldrM)-import Control.Monad (liftM,when,ap,unless,zipWithM)-import Data.List (intercalate, mapAccumL)-import qualified Data.Map as Map-import Text.PrettyPrint.HughesPJ----- * handling declarations---- | analyse and translate a parameter declaration--- Should be called in either prototype or block scope-tParamDecl :: (MonadTrav m) => CDecl -> m ParamDecl-tParamDecl (CStaticAssert _ _ node) =-  astError node "expected parameter, not static assertion"-tParamDecl (CDecl declspecs declrs node) =-  do declr <- getParamDeclr-     -- analyse the variable declaration-     (VarDeclInfo name fun_spec  storage_spec attrs ty declr_node) <- analyseVarDecl' True declspecs declr [] Nothing-     when (isInline fun_spec || isNoreturn fun_spec) $-       throwTravError (badSpecifierError node "parameter declaration with function specifier")-     -- compute storage of parameter (NoStorage, but might have a register specifier)-     storage <- throwOnLeft $ computeParamStorage node storage_spec-     let paramDecl = mkParamDecl name storage attrs ty declr_node-     -- XXX: we shouldn't modify the deftable here, just analyse and build representation-     return paramDecl-  where-  getParamDeclr =-      case declrs of-          [] -> return (emptyDeclr node)-          [(Just declr,Nothing,Nothing)] -> return declr-          _ -> astError node "bad parameter declaration: multiple decls / bitfield or initializer present"-  mkParamDecl name storage attrs ty declr_node =-    let vd = VarDecl name (DeclAttrs noFunctionAttrs storage attrs) ty in-    case name of-      NoName -> AbstractParamDecl vd declr_node-      _ -> ParamDecl vd declr_node---- | a parameter declaration has no linkage and either auto or register storage-computeParamStorage :: NodeInfo -> StorageSpec -> Either BadSpecifierError Storage-computeParamStorage _ NoStorageSpec = Right (Auto False)-computeParamStorage _ RegSpec       = Right (Auto True)-computeParamStorage node spec       = Left . badSpecifierError node $ "Bad storage specified for parameter: " ++ show spec---- | analyse and translate a member declaration-tMemberDecls :: (MonadTrav m) => CDecl -> m [MemberDecl]--- Anonymous struct or union members--- TODO storage specs, align specs and attributes are ignored-tMemberDecls (CStaticAssert _ _ node) =-  astError node "expected struct or union member, found static assertion"-tMemberDecls (CDecl declspecs [] node) =-  do let (_storage_specs, _attrs, typequals, typespecs, funspecs, _alignspecs) =-           partitionDeclSpecs declspecs-     unless (null funspecs) $ astError node "member declaration with function specifier"-     canonTySpecs <- canonicalTypeSpec typespecs-     ty <- tType True node typequals canonTySpecs [] []-     case ty of-       DirectType (TyComp _) _ _ ->-         return $ [MemberDecl-                   -- XXX: are these DeclAttrs correct?-                   (VarDecl NoName (DeclAttrs noFunctionAttrs NoStorage []) ty)-                   Nothing node]-       _ -> astError node "anonymous member has a non-composite type"--- Named members-tMemberDecls (CDecl declspecs declrs node) = zipWithM tMemberDecl (True:repeat False) declrs-    where-    tMemberDecl handle_sue_def (Just member_declr,Nothing,bit_field_size_opt) =-        -- TODO: use analyseVarDecl here, not analyseVarDecl'-        do var_decl <- analyseVarDecl' handle_sue_def declspecs member_declr [] Nothing-           let (VarDeclInfo name fun_spec storage_spec attrs ty _node_info) = var_decl-           ---           checkValidMemberSpec fun_spec storage_spec-           return $ MemberDecl (VarDecl name (DeclAttrs noFunctionAttrs NoStorage attrs) ty)-                               bit_field_size_opt node-    tMemberDecl handle_sue_def (Nothing,Nothing,Just bit_field_size) =-        do let (storage_specs, _attrs, typequals, typespecs, _funspecs, _alignspecs) = partitionDeclSpecs declspecs-           -- TODO: funspecs/alignspecs not yet processed-           _storage_spec  <- canonicalStorageSpec storage_specs-           -- TODO: storage_spec not used-           canonTySpecs  <- canonicalTypeSpec typespecs-           typ           <- tType handle_sue_def node typequals canonTySpecs [] []-           ---           return $ AnonBitField typ bit_field_size node-    tMemberDecl _ _ = astError node "Bad member declaration"-    checkValidMemberSpec fun_spec storage_spec =-        do  when (fun_spec /= noFunctionAttrs)   $ astError node "member declaration with inline specifier"-            when (storage_spec /= NoStorageSpec) $ astError node "storage specifier for member"-            return ()--data StorageSpec = NoStorageSpec | AutoSpec | RegSpec | ThreadSpec | StaticSpec Bool | ExternSpec Bool-                    deriving (Eq,Ord,Show,Read)--hasThreadLocalSpec :: StorageSpec -> Bool-hasThreadLocalSpec ThreadSpec = True-hasThreadLocalSpec (StaticSpec b) = b-hasThreadLocalSpec (ExternSpec b) = b-hasThreadLocalSpec _  = False--data VarDeclInfo = VarDeclInfo VarName FunctionAttrs StorageSpec Attributes Type NodeInfo--analyseVarDecl' :: (MonadTrav m) =>-                  Bool -> [CDeclSpec] ->-                  CDeclr -> [CDecl] -> Maybe CInit -> m VarDeclInfo-analyseVarDecl' handle_sue_def declspecs declr oldstyle init_opt =-  do let (storage_specs, attrs, type_quals, type_specs, funspecs, _alignspecs) =-           partitionDeclSpecs declspecs-     canonTySpecs <- canonicalTypeSpec type_specs-     -- TODO: alignspecs not yet processed-     analyseVarDecl handle_sue_def storage_specs attrs type_quals canonTySpecs funspecs-                    declr oldstyle init_opt---- | analyse declarators-analyseVarDecl :: (MonadTrav m) =>-                  Bool -> [CStorageSpec] -> [CAttr] -> [CTypeQual] ->-                  TypeSpecAnalysis -> [CFunSpec] ->-                  CDeclr -> [CDecl] -> Maybe CInit -> m VarDeclInfo-analyseVarDecl handle_sue_def storage_specs decl_attrs typequals canonTySpecs fun_specs-               (CDeclr name_opt derived_declrs asmname_opt declr_attrs node)-               oldstyle_params _init_opt-    = do -- analyse the storage specifiers-         storage_spec  <- canonicalStorageSpec storage_specs-         -- translate the type into semantic representation-         typ          <- tType handle_sue_def node typequals canonTySpecs derived_declrs oldstyle_params-         -- translate attributes-         attrs'       <- mapM tAttr (decl_attrs ++ declr_attrs)-         -- make name-         name         <- mkVarName node name_opt asmname_opt-         return $ VarDeclInfo name function_spec storage_spec attrs' typ node-    where-        updateFunSpec (CInlineQual _) f = f { isInline = True }-        updateFunSpec (CNoreturnQual _) f = f { isNoreturn = True }-        function_spec = foldr updateFunSpec noFunctionAttrs fun_specs---- return @True@ if the declarations is a type def-isTypeDef :: [CDeclSpec] -> Bool-isTypeDef declspecs = not $ null [ n | (CStorageSpec (CTypedef n)) <- declspecs ]---- * translation---- | get the type of a /type declaration/------ A type declaration @T@ may appear in thre forms:------  * @typeof(T)@------  * as abstract declarator in a function prototype, as in @f(int)@------  * in a declaration without declarators, as in @struct x { int a } ;@------ Currently, @analyseTypeDecl@ is exlusively used for analysing types for GNU's @typeof(T)@.------ We move attributes to the type, as they have no meaning for the abstract declarator-analyseTypeDecl :: (MonadTrav m) => CDecl -> m Type-analyseTypeDecl (CStaticAssert _ _ node) =-  astError node "Expected type declaration, found static assert"-analyseTypeDecl (CDecl declspecs declrs node)-    | [] <- declrs = analyseTyDeclr (emptyDeclr node)-    | [(Just declr,Nothing,Nothing)] <- declrs = analyseTyDeclr declr-    | otherwise = astError node "Bad declarator for type declaration"-    where-    analyseTyDeclr (CDeclr Nothing derived_declrs Nothing attrs _declrnode)-        | (not (null storagespec) || not (null funspecs) || not (null alignspecs)) =-            astError node "storage, function or alignment specifier for type declaration"-        | otherwise                          =-          do canonTySpecs <- canonicalTypeSpec typespecs-             t <- tType True node (map CAttrQual (attrs++attrs_decl) ++ typequals)-                   canonTySpecs derived_declrs []-             case nameOfNode node of-               Just n -> withDefTable (\dt -> (t, insertType dt n t))-               Nothing -> return t-        where-        (storagespec, attrs_decl, typequals, typespecs, funspecs, alignspecs) = partitionDeclSpecs declspecs-    analyseTyDeclr _ = astError node "Non-abstract declarator in type declaration"----- | translate a type-tType :: (MonadTrav m) => Bool -> NodeInfo -> [CTypeQual] -> TypeSpecAnalysis -> [CDerivedDeclr] -> [CDecl] -> m Type-tType handle_sue_def top_node typequals canonTySpecs derived_declrs oldstyle_params-    = mergeOldStyle top_node oldstyle_params derived_declrs >>= buildType-    where-    buildType [] =-        tDirectType handle_sue_def top_node typequals canonTySpecs-    buildType (CPtrDeclr ptrquals node : dds) =-        buildType dds >>= buildPointerType ptrquals node-    buildType (CArrDeclr arrquals size node : dds)-        = buildType dds >>= buildArrayType arrquals size node-    buildType (CFunDeclr (Right (params, isVariadic)) attrs node : dds)-        = buildType dds >>= (liftM  (uncurry FunctionType) . buildFunctionType params isVariadic attrs node)-    buildType (CFunDeclr (Left _) _ _ : _)-        -- /FIXME/: this is really an internal error, not an AST error.-        = astError top_node "old-style parameters remaining after mergeOldStyle"-    buildPointerType ptrquals _node inner_ty-        = liftM (\(quals,attrs) -> PtrType inner_ty quals attrs) (tTypeQuals ptrquals)-    buildArrayType arr_quals size _node inner_ty-        = do (quals,attrs) <- tTypeQuals arr_quals-             arr_sz        <- tArraySize size-             return$ ArrayType inner_ty arr_sz quals attrs-    -- We build functions in function prototype scope.-    -- When analyzing the  the function body, we push parameters in function body scope.-    buildFunctionType params is_variadic attrs _node return_ty-        = do enterPrototypeScope-             params' <- mapM tParamDecl params-             leavePrototypeScope-             attrs'  <- mapM tAttr attrs-             return $ (\t -> (t,attrs')) $-                case (map declType params',is_variadic) of-                    ([],False) -> FunTypeIncomplete return_ty  -- may be improved later on-                    ([DirectType TyVoid _ _],False) -> FunType return_ty [] False-                    _ -> FunType return_ty params' is_variadic---- | translate a type without (syntactic) indirections--- Due to the GNU @typeof@ extension and typeDefs, this can be an arbitrary type-tDirectType :: (MonadTrav m) =>-               Bool -> NodeInfo -> [CTypeQual] -> TypeSpecAnalysis -> m Type-tDirectType handle_sue_def node ty_quals canonTySpec = do-    (quals,attrs) <- tTypeQuals ty_quals-    let baseType ty_name = DirectType ty_name quals attrs-    case canonTySpec of-        TSNone -> return$ baseType (TyIntegral TyInt)-        TSVoid -> return$ baseType TyVoid-        TSBool -> return$ baseType (TyIntegral TyBool)-        TSNum tsnum -> do-            numType <- tNumType tsnum-            return . baseType $-                case numType of-                    Left (floatType,iscomplex) | iscomplex -> TyComplex floatType-                                               | otherwise -> TyFloating floatType-                    Right intType  -> TyIntegral intType-        TSTypeDef tdr -> return$ TypeDefType tdr quals attrs-        TSNonBasic (CSUType su _tnode)       -> liftM (baseType . TyComp) $ tCompTypeDecl handle_sue_def su-        TSNonBasic (CEnumType enum _tnode)   -> liftM (baseType . TyEnum) $ tEnumTypeDecl handle_sue_def enum-        TSType t                             ->  mergeTypeAttributes node quals attrs t-        TSNonBasic t -> astError node ("Unexpected typespec: " ++ show t)---- | Merge type attributes------ This handles for example the form------ > /* tyqual attr typeof(type) */--- > const typeof(char volatile) x;-mergeTypeAttributes :: (MonadCError m) => NodeInfo -> TypeQuals -> [Attr] -> Type -> m Type-mergeTypeAttributes node_info quals attrs typ =-    case typ of-        DirectType ty_name quals' attrs' -> merge quals' attrs' $ DirectType ty_name-        PtrType ty quals' attrs'  -> merge quals' attrs' $ PtrType ty-        ArrayType ty array_sz quals' attrs' -> merge quals' attrs' $ ArrayType ty array_sz-        FunctionType fty attrs'-             | quals /= noTypeQuals -> astError node_info "type qualifiers for function type"-             | otherwise            -> return$ FunctionType fty (attrs' ++ attrs)-        TypeDefType tdr quals' attrs'-            -> merge quals' attrs' $ TypeDefType tdr-    where-    merge quals' attrs' tyf = return $ tyf (mergeTypeQuals quals quals') (attrs' ++ attrs)--typeDefRef :: (MonadCError m, MonadSymtab m) => NodeInfo -> Ident -> m TypeDefRef-typeDefRef t_node name = lookupTypeDef name >>= \ty -> return (TypeDefRef name ty t_node)---- extract a struct\/union--- we emit @declStructUnion@ and @defStructUnion@ actions------ TODO: should attributes be part of declarartions too ?-tCompTypeDecl :: (MonadTrav m) => Bool -> CStructUnion -> m CompTypeRef-tCompTypeDecl handle_def (CStruct tag ident_opt member_decls_opt attrs node_info) = do-    -- create reference-    sue_ref <- createSUERef node_info ident_opt-    let tag' = tTag tag-    attrs' <- mapM tAttr attrs-    -- record tag name-    let decl = CompTypeRef sue_ref tag' node_info-    handleTagDecl (CompDecl decl)-    -- when handle_def is true, enter the definition-    when handle_def $-        maybeM member_decls_opt $ \decls ->-                tCompType sue_ref tag' decls attrs' node_info-            >>= (handleTagDef.CompDef)-    return decl--tTag :: CStructTag -> CompTyKind-tTag CStructTag = StructTag-tTag CUnionTag  = UnionTag--tCompType :: (MonadTrav m) => SUERef -> CompTyKind -> [CDecl] -> Attributes -> NodeInfo -> m CompType-tCompType tag sue_ref member_decls attrs node-    = return (CompType tag sue_ref) `ap`-        (concatMapM tMemberDecls member_decls) `ap`-        (return attrs) `ap`-        (return node)---- | translate a enum type decl------  > enum my_enum---  > enum your_enum { x, y=3 }----tEnumTypeDecl :: (MonadTrav m) => Bool -> CEnum -> m EnumTypeRef-tEnumTypeDecl handle_def (CEnum ident_opt enumerators_opt attrs node_info)-    | (Nothing, Nothing) <- (ident_opt, enumerators_opt) = astError node_info "both definition and name of enum missing"-    | Just [] <- enumerators_opt                         = astError node_info "empty enumerator list"-    | otherwise-        = do sue_ref <- createSUERef node_info ident_opt-             attrs' <- mapM tAttr attrs-             let decl = EnumTypeRef sue_ref node_info-             when handle_def $-                 maybeM enumerators_opt $ \enumerators ->-                         tEnumType sue_ref enumerators attrs' node_info-                    >>=  (handleTagDef . EnumDef)-             return decl---- | translate and analyse an enumeration type-tEnumType :: (MonadCError m, MonadSymtab m) =>-             SUERef -> [(Ident, Maybe CExpr)] -> Attributes -> NodeInfo -> m EnumType-tEnumType sue_ref enumerators attrs node = do-    mapM_ handleEnumeratorDef enumerators'-    return ty-    where-    ty = EnumType sue_ref enumerators' attrs node-    (_,enumerators') = mapAccumL nextEnumerator (Left 0) enumerators-    nextEnumerator memo (ident,e) =-      let (memo',expr) = nextEnrExpr memo e in-      (memo', Enumerator ident expr ty (nodeInfo ident))-    nextEnrExpr :: Either Integer (Expr,Integer) -> Maybe CExpr -> (Either Integer (Expr,Integer), CExpr)-    nextEnrExpr (Left i) Nothing = (Left (succ i), intExpr i)-    nextEnrExpr (Right (e,offs)) Nothing = (Right (e, succ offs), offsExpr e offs)-    nextEnrExpr _ (Just e) = (Right (e,1), e)-    intExpr i = CConst (CIntConst (cInteger i) undefNode)-    offsExpr e offs = CBinary CAddOp e (intExpr offs) undefNode---- | Mapping from num type specs to C types (C99 6.7.2-2), ignoring the complex qualifier.-tNumType :: (MonadCError m) => NumTypeSpec -> m (Either (FloatType,Bool) IntType)-tNumType (NumTypeSpec basetype sgn sz iscomplex) =-    case (basetype,sgn,sz) of-        (BaseChar,_,NoSizeMod)      | Signed <- sgn   -> intType TySChar-                                    | Unsigned <- sgn -> intType TyUChar-                                    | otherwise       -> intType TyChar-        (intbase, _, NoSizeMod)  | optBase BaseInt intbase ->-            intType$ case sgn of-                            Unsigned -> TyUInt-                            _        -> TyInt-        (intbase, _, NoSizeMod)  | optBase BaseInt128 intbase ->-            intType$ case sgn of-                            Unsigned -> TyUInt128-                            _        -> TyInt128-        (intbase, signed, sizemod)    | optBase BaseInt intbase, optSign Signed signed ->-            intType$ case sizemod of ShortMod    -> TyShort-                                     LongMod     -> TyLong-                                     LongLongMod -> TyLLong-                                     _ -> internalErr "numTypeMapping: unexpected pattern matching error"-        (intbase, Unsigned, sizemod) | optBase BaseInt intbase ->-            intType$ case sizemod of ShortMod    -> TyUShort-                                     LongMod     -> TyULong-                                     LongLongMod -> TyULLong-                                     _ -> internalErr "numTypeMapping: unexpected pattern matching error"-        (BaseFloat, NoSignSpec, NoSizeMod)  -> floatType TyFloat-        (BaseDouble, NoSignSpec, NoSizeMod) -> floatType TyDouble-        (BaseDouble, NoSignSpec, LongMod)   -> floatType TyLDouble-        -- TODO: error analysis-        (_,_,_)   -> error "Bad AST analysis"-    where-    optBase _ NoBaseType = True-    optBase expect baseTy = expect == baseTy-    optSign _ NoSignSpec = True-    optSign expect sign = expect == sign-    intType = return . Right-    floatType ft = return (Left (ft,iscomplex))---- TODO: currently bogus-tArraySize :: (MonadTrav m) => CArrSize -> m ArraySize-tArraySize (CNoArrSize False) = return (UnknownArraySize False)-tArraySize (CNoArrSize True) = return (UnknownArraySize True)-tArraySize (CArrSize static szexpr) = liftM (ArraySize static) (return szexpr)--tTypeQuals :: (MonadTrav m) => [CTypeQual] -> m (TypeQuals,Attributes)-tTypeQuals = foldrM go (noTypeQuals,[]) where-    go (CConstQual _) (tq,attrs) = return (tq { constant = True },attrs)-    go (CVolatQual _) (tq,attrs) = return (tq { volatile = True },attrs)-    go (CRestrQual _) (tq,attrs) = return (tq { restrict = True },attrs)-    go (CAtomicQual _) (tq,attrs) = return (tq { atomic = True },attrs)-    go (CAttrQual attr) (tq,attrs) = liftM (\attr' -> (tq,attr':attrs)) (tAttr attr)-    go (CNullableQual _) (tq,attrs) = return (tq { nullable = True }, attrs)-    go (CNonnullQual _) (tq,attrs) = return (tq { nonnull = True }, attrs)---- * analysis---{--To canoicalize type specifiers, we define a canonical form:-void | bool | (char|int|int128|float|double)? (signed|unsigned)? (long long?)? complex? | othertype--}-data NumBaseType = NoBaseType | BaseChar | BaseInt | BaseInt128 | BaseFloat | BaseDouble deriving (Eq,Ord)-data SignSpec    = NoSignSpec | Signed | Unsigned deriving (Eq,Ord)-data SizeMod     = NoSizeMod | ShortMod | LongMod | LongLongMod deriving (Eq,Ord)-data NumTypeSpec = NumTypeSpec { base :: NumBaseType, signSpec :: SignSpec, sizeMod :: SizeMod, isComplex :: Bool  }-emptyNumTypeSpec :: NumTypeSpec-emptyNumTypeSpec = NumTypeSpec { base = NoBaseType, signSpec = NoSignSpec, sizeMod = NoSizeMod, isComplex = False }-data TypeSpecAnalysis =-  TSNone | TSVoid | TSBool | TSNum NumTypeSpec |-  TSTypeDef TypeDefRef | TSType Type | TSNonBasic CTypeSpec--canonicalTypeSpec :: (MonadTrav m) => [CTypeSpec] -> m TypeSpecAnalysis-canonicalTypeSpec = foldrM go TSNone where-    getNTS TSNone = Just emptyNumTypeSpec-    getNTS (TSNum nts) = Just nts-    getNTS _ = Nothing-    updLongMod NoSizeMod = Just LongMod-    updLongMod LongMod   = Just LongLongMod-    updLongMod _         = Nothing-    go :: (MonadTrav m) => CTypeSpec -> TypeSpecAnalysis -> m TypeSpecAnalysis-    go (CVoidType _)    TSNone = return TSVoid-    go (CBoolType _)    TSNone = return TSBool-    go (CCharType _)    tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa-                            = return$  TSNum$ nts { base = BaseChar }-    go (CIntType _)     tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa-                            = return$  TSNum$ nts { base = BaseInt }-    go (CInt128Type _)  tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa-                            = return$  TSNum$ nts { base = BaseInt128 }-    go (CFloatType _)   tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa-                            = return$  TSNum$ nts { base = BaseFloat }-    go (CDoubleType _)  tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa-                            = return$  TSNum$ nts { base = BaseDouble }-    go (CShortType _)   tsa | (Just nts@(NumTypeSpec { sizeMod = NoSizeMod })) <- getNTS tsa-                            = return$  TSNum$nts { sizeMod = ShortMod }-    go (CLongType _)    tsa | (Just nts@(NumTypeSpec { sizeMod = szMod })) <- getNTS tsa,-                              (Just szMod') <- updLongMod szMod-                            = return$  TSNum$ nts { sizeMod = szMod' }-    go (CSignedType _)  tsa | (Just nts@(NumTypeSpec { signSpec = NoSignSpec })) <- getNTS tsa-                            = return$  TSNum$ nts { signSpec = Signed }-    go (CUnsigType _)   tsa | (Just nts@(NumTypeSpec { signSpec = NoSignSpec })) <- getNTS tsa-                            = return$  TSNum$ nts { signSpec = Unsigned }-    go (CComplexType _) tsa | (Just nts@(NumTypeSpec { isComplex = False })) <- getNTS tsa-                            = return$  TSNum$ nts { isComplex = True }-    go (CTypeDef i ni) TSNone = liftM TSTypeDef $ typeDefRef ni i-    go (CTypeOfType d _ni) TSNone = liftM TSType $ analyseTypeDecl d-    go (CTypeOfExpr e _) TSNone = liftM TSType $ tExpr [] RValue e-    -- todo: atomic qualifier discarded-    go (CAtomicType d _ni) TSNone = liftM TSType $ analyseTypeDecl d-    go otherType  TSNone    = return$  TSNonBasic otherType-    go ty _ts = astError (nodeInfo ty) "Invalid type specifier"---- compute storage given storage specifiers-canonicalStorageSpec :: (MonadCError m) =>[CStorageSpec] -> m StorageSpec-canonicalStorageSpec storagespecs = liftM elideAuto $ foldrM updStorage NoStorageSpec storagespecs where-        updStorage (CAuto _) NoStorageSpec     = return AutoSpec-        updStorage (CRegister _) NoStorageSpec = return RegSpec-        updStorage (CThread _) NoStorageSpec   = return ThreadSpec-        updStorage (CThread _) (StaticSpec _)  = return$ StaticSpec True-        updStorage (CThread _) (ExternSpec _)  = return$ ExternSpec True-        updStorage (CStatic _) NoStorageSpec   = return$ StaticSpec False-        updStorage (CExtern _) NoStorageSpec   = return$ ExternSpec False-        updStorage (CStatic _) ThreadSpec      = return$ StaticSpec True-        updStorage (CExtern _) ThreadSpec      = return$ ExternSpec True-        updStorage badSpec old-            = astError (nodeInfo badSpec) $ "Invalid storage specifier "++render (pretty badSpec)++" in combination with "++show old-        elideAuto AutoSpec = NoStorageSpec-        elideAuto spec = spec---- | convert old style parameters------ This requires matching parameter names and declarations, as in the following example:------ > int f(d,c,a,b)--- > char a,*b;--- > int c;--- > { }------ is converted to------ > int f(int d, int c, char a, char* b)------ TODO: This could be moved to syntax, as it operates on the AST only-mergeOldStyle :: (MonadCError m) => NodeInfo -> [CDecl] -> [CDerivedDeclr] -> m [CDerivedDeclr]-mergeOldStyle _node [] declrs = return declrs-mergeOldStyle node oldstyle_params (CFunDeclr params attrs fdnode : dds) =-    case params of-        Left list -> do-            -- FIXME: This translation doesn't work in the following example-            -- [| int f(b,a) struct x { }; int b,a; { struct x local; return local.x } |]-            oldstyle_params' <- liftM concat $ mapM splitCDecl oldstyle_params-            param_map <- liftM Map.fromList $ mapM attachNameOfDecl oldstyle_params'-            (newstyle_params,param_map') <- foldrM insertParamDecl ([],param_map) list-            unless (Map.null param_map') $-              astError node $ "declarations for parameter(s) "++ showParamMap param_map' ++" but no such parameter"-            return (CFunDeclr (Right (newstyle_params, False)) attrs fdnode : dds)-        Right _newstyle -> astError node "oldstyle parameter list, but newstyle function declaration"-    where-        attachNameOfDecl decl = nameOfDecl decl >>= \n -> return (n,decl)-        insertParamDecl param_name (ps, param_map)-            = case Map.lookup param_name param_map of-                Just p -> return (p:ps, Map.delete param_name param_map)-                Nothing -> return (implicitIntParam param_name : ps, param_map)-        implicitIntParam param_name =-            let nInfo = nodeInfo param_name in-            CDecl [CTypeSpec (CIntType nInfo)] [(Just (CDeclr (Just param_name) [] Nothing [] nInfo),Nothing,Nothing)] nInfo-        showParamMap = intercalate ", " . map identToString . Map.keys-mergeOldStyle node _ _ = astError node "oldstyle parameter list, but not function type"---- | split a CDecl into declarators, hereby eliding SUE defs from the second declarator on.------   There are several reasons why this isn't the preferred way for handling multiple-declarator declarations,---   but it can be convinient some times.------ > splitCDecl [d| struct x { int z; } a,*b; |]--- > [ [d| struct x { int z; } a, struct x *b; |] ]------ /TODO/: This could be moved to syntax, as it operates on the AST only-splitCDecl :: (MonadCError m) => CDecl -> m [CDecl]-splitCDecl decl@(CStaticAssert _ _ _) = return [decl]-splitCDecl decl@(CDecl declspecs declrs node) =-    case declrs of-        []      -> internalErr "splitCDecl applied to empty declaration"-        -- single declarator, not need to split-        [_declr] -> return [decl]-        -- more than one declarator-        (d1:ds) ->-            let declspecs' = map elideSUEDef declspecs in-            return$ (CDecl declspecs [d1] node) : [ CDecl declspecs' [declr] node | declr <- ds ]-    where-    elideSUEDef declspec@(CTypeSpec tyspec) =-        case tyspec of-            (CEnumType (CEnum name _def _attrs enum_node) node_info) ->-                CTypeSpec (CEnumType (CEnum name Nothing [] enum_node) node_info)-            (CSUType (CStruct tag name _def _attrs su_node) node_info) ->-                CTypeSpec (CSUType (CStruct tag name Nothing [] su_node) node_info)-            _ -> declspec-    elideSUEDef declspec = declspec----- | translate @__attribute__@ annotations--- TODO: This is a unwrap and wrap stub-tAttr :: (MonadCError m, MonadSymtab m) => CAttr -> m Attr-tAttr (CAttr name cexpr node) = return$ Attr name cexpr node----- | construct a name for a variable--- TODO: more or less bogus-mkVarName :: (MonadCError m, MonadSymtab m) =>-             NodeInfo -> Maybe Ident -> Maybe AsmName -> m VarName-mkVarName  _node Nothing _ = return NoName-mkVarName  _node (Just n) asm = return $ VarName n asm---- helpers-nameOfDecl :: (MonadCError m) => CDecl -> m Ident-nameOfDecl d = getOnlyDeclr d >>= \declr ->-    case declr of-        (CDeclr (Just name) _ _ _ _node) -> return name-        (CDeclr Nothing _ _ _ _node)     -> internalErr "nameOfDecl: abstract declarator"-emptyDeclr :: NodeInfo -> CDeclr-emptyDeclr node = CDeclr Nothing [] Nothing [] node-getOnlyDeclr :: (MonadCError m) => CDecl -> m CDeclr-getOnlyDeclr (CDecl _ [(Just declr,_,_)] _) = return declr-getOnlyDeclr (CDecl _ _ _node) = internalErr "getOnlyDeclr: declaration doesn't have a unique declarator"-getOnlyDeclr (CStaticAssert _ _ _) = internalErr "getOnlyDeclr: static assertion doesn't have a unique declarator"+{-# LANGUAGE PatternGuards, FlexibleContexts #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Analysis.DeclAnalysis
+-- Copyright   :  (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  alpha
+-- Portability :  ghc
+--
+-- This module performs the analysis of declarations and the translation of
+-- type specifications in the AST.
+-----------------------------------------------------------------------------
+module Language.C.Analysis.DeclAnalysis (
+  -- * Translating types
+  analyseTypeDecl,
+  tType,tDirectType,tNumType,tArraySize,tTypeQuals,
+  mergeOldStyle,
+  -- * Dissecting type specs
+  canonicalTypeSpec, NumBaseType(..),SignSpec(..),SizeMod(..),NumTypeSpec(..),TypeSpecAnalysis(..),
+  canonicalStorageSpec, StorageSpec(..), hasThreadLocalSpec, isTypeDef,
+  -- * Helpers
+  VarDeclInfo(..),
+  tAttr,mkVarName,getOnlyDeclr,nameOfDecl,analyseVarDecl,analyseVarDecl'
+)
+where
+import Language.C.Data.Error
+import Language.C.Data.Node
+import Language.C.Data.Ident
+import Language.C.Pretty
+import Language.C.Syntax
+import {-# SOURCE #-} Language.C.Analysis.AstAnalysis (tExpr, ExprSide(..))
+import Language.C.Analysis.DefTable (TagFwdDecl(..), insertType)
+import Language.C.Analysis.SemError
+import Language.C.Analysis.SemRep
+import Language.C.Analysis.TravMonad
+
+import Data.Foldable as F (foldrM)
+import Control.Monad (liftM,when,ap,unless,zipWithM)
+import Data.List (intercalate, mapAccumL)
+import qualified Data.Map as Map
+import Text.PrettyPrint.HughesPJ
+
+
+-- * handling declarations
+
+-- | analyse and translate a parameter declaration
+-- Should be called in either prototype or block scope
+tParamDecl :: (MonadTrav m) => CDecl -> m ParamDecl
+tParamDecl (CStaticAssert _ _ node) =
+  astError node "expected parameter, not static assertion"
+tParamDecl (CDecl declspecs declrs node) =
+  do declr <- getParamDeclr
+     -- analyse the variable declaration
+     (VarDeclInfo name fun_spec  storage_spec attrs ty declr_node) <- analyseVarDecl' True declspecs declr [] Nothing
+     when (isInline fun_spec || isNoreturn fun_spec) $
+       throwTravError (badSpecifierError node "parameter declaration with function specifier")
+     -- compute storage of parameter (NoStorage, but might have a register specifier)
+     storage <- throwOnLeft $ computeParamStorage node storage_spec
+     let paramDecl = mkParamDecl name storage attrs ty declr_node
+     -- XXX: we shouldn't modify the deftable here, just analyse and build representation
+     return paramDecl
+  where
+  getParamDeclr =
+      case declrs of
+          [] -> return (emptyDeclr node)
+          [(Just declr,Nothing,Nothing)] -> return declr
+          _ -> astError node "bad parameter declaration: multiple decls / bitfield or initializer present"
+  mkParamDecl name storage attrs ty declr_node =
+    let vd = VarDecl name (DeclAttrs noFunctionAttrs storage attrs) ty in
+    case name of
+      NoName -> AbstractParamDecl vd declr_node
+      _ -> ParamDecl vd declr_node
+
+-- | a parameter declaration has no linkage and either auto or register storage
+computeParamStorage :: NodeInfo -> StorageSpec -> Either BadSpecifierError Storage
+computeParamStorage _ NoStorageSpec = Right (Auto False)
+computeParamStorage _ RegSpec       = Right (Auto True)
+computeParamStorage node spec       = Left . badSpecifierError node $ "Bad storage specified for parameter: " ++ show spec
+
+-- | analyse and translate a member declaration
+tMemberDecls :: (MonadTrav m) => CDecl -> m [MemberDecl]
+-- Anonymous struct or union members
+-- TODO storage specs, align specs and attributes are ignored
+tMemberDecls (CStaticAssert _ _ node) =
+  astError node "expected struct or union member, found static assertion"
+tMemberDecls (CDecl declspecs [] node) =
+  do let (_storage_specs, _attrs, typequals, typespecs, funspecs, _alignspecs) =
+           partitionDeclSpecs declspecs
+     unless (null funspecs) $ astError node "member declaration with function specifier"
+     canonTySpecs <- canonicalTypeSpec typespecs
+     ty <- tType True node typequals canonTySpecs [] []
+     case ty of
+       DirectType (TyComp _) _ _ ->
+         return $ [MemberDecl
+                   -- XXX: are these DeclAttrs correct?
+                   (VarDecl NoName (DeclAttrs noFunctionAttrs NoStorage []) ty)
+                   Nothing node]
+       _ -> astError node "anonymous member has a non-composite type"
+-- Named members
+tMemberDecls (CDecl declspecs declrs node) = zipWithM tMemberDecl (True:repeat False) declrs
+    where
+    tMemberDecl handle_sue_def (Just member_declr,Nothing,bit_field_size_opt) =
+        -- TODO: use analyseVarDecl here, not analyseVarDecl'
+        do var_decl <- analyseVarDecl' handle_sue_def declspecs member_declr [] Nothing
+           let (VarDeclInfo name fun_spec storage_spec attrs ty _node_info) = var_decl
+           --
+           checkValidMemberSpec fun_spec storage_spec
+           return $ MemberDecl (VarDecl name (DeclAttrs noFunctionAttrs NoStorage attrs) ty)
+                               bit_field_size_opt node
+    tMemberDecl handle_sue_def (Nothing,Nothing,Just bit_field_size) =
+        do let (storage_specs, _attrs, typequals, typespecs, _funspecs, _alignspecs) = partitionDeclSpecs declspecs
+           -- TODO: funspecs/alignspecs not yet processed
+           _storage_spec  <- canonicalStorageSpec storage_specs
+           -- TODO: storage_spec not used
+           canonTySpecs  <- canonicalTypeSpec typespecs
+           typ           <- tType handle_sue_def node typequals canonTySpecs [] []
+           --
+           return $ AnonBitField typ bit_field_size node
+    tMemberDecl _ _ = astError node "Bad member declaration"
+    checkValidMemberSpec fun_spec storage_spec =
+        do  when (fun_spec /= noFunctionAttrs)   $ astError node "member declaration with inline specifier"
+            when (storage_spec /= NoStorageSpec) $ astError node "storage specifier for member"
+            return ()
+
+data StorageSpec = NoStorageSpec | AutoSpec | RegSpec | ThreadSpec | StaticSpec Bool | ExternSpec Bool
+                    deriving (Eq,Ord,Show,Read)
+
+hasThreadLocalSpec :: StorageSpec -> Bool
+hasThreadLocalSpec ThreadSpec = True
+hasThreadLocalSpec (StaticSpec b) = b
+hasThreadLocalSpec (ExternSpec b) = b
+hasThreadLocalSpec _  = False
+
+data VarDeclInfo = VarDeclInfo VarName FunctionAttrs StorageSpec Attributes Type NodeInfo
+
+analyseVarDecl' :: (MonadTrav m) =>
+                  Bool -> [CDeclSpec] ->
+                  CDeclr -> [CDecl] -> Maybe CInit -> m VarDeclInfo
+analyseVarDecl' handle_sue_def declspecs declr oldstyle init_opt =
+  do let (storage_specs, attrs, type_quals, type_specs, funspecs, _alignspecs) =
+           partitionDeclSpecs declspecs
+     canonTySpecs <- canonicalTypeSpec type_specs
+     -- TODO: alignspecs not yet processed
+     analyseVarDecl handle_sue_def storage_specs attrs type_quals canonTySpecs funspecs
+                    declr oldstyle init_opt
+
+-- | analyse declarators
+analyseVarDecl :: (MonadTrav m) =>
+                  Bool -> [CStorageSpec] -> [CAttr] -> [CTypeQual] ->
+                  TypeSpecAnalysis -> [CFunSpec] ->
+                  CDeclr -> [CDecl] -> Maybe CInit -> m VarDeclInfo
+analyseVarDecl handle_sue_def storage_specs decl_attrs typequals canonTySpecs fun_specs
+               (CDeclr name_opt derived_declrs asmname_opt declr_attrs node)
+               oldstyle_params _init_opt
+    = do -- analyse the storage specifiers
+         storage_spec  <- canonicalStorageSpec storage_specs
+         -- translate the type into semantic representation
+         typ          <- tType handle_sue_def node typequals canonTySpecs derived_declrs oldstyle_params
+         -- translate attributes
+         attrs'       <- mapM tAttr (decl_attrs ++ declr_attrs)
+         -- make name
+         name         <- mkVarName node name_opt asmname_opt
+         return $ VarDeclInfo name function_spec storage_spec attrs' typ node
+    where
+        updateFunSpec (CInlineQual _) f = f { isInline = True }
+        updateFunSpec (CNoreturnQual _) f = f { isNoreturn = True }
+        function_spec = foldr updateFunSpec noFunctionAttrs fun_specs
+
+-- return @True@ if the declarations is a type def
+isTypeDef :: [CDeclSpec] -> Bool
+isTypeDef declspecs = not $ null [ n | (CStorageSpec (CTypedef n)) <- declspecs ]
+
+-- * translation
+
+-- | get the type of a /type declaration/
+--
+-- A type declaration @T@ may appear in thre forms:
+--
+--  * @typeof(T)@
+--
+--  * as abstract declarator in a function prototype, as in @f(int)@
+--
+--  * in a declaration without declarators, as in @struct x { int a } ;@
+--
+-- Currently, @analyseTypeDecl@ is exlusively used for analysing types for GNU's @typeof(T)@.
+--
+-- We move attributes to the type, as they have no meaning for the abstract declarator
+analyseTypeDecl :: (MonadTrav m) => CDecl -> m Type
+analyseTypeDecl (CStaticAssert _ _ node) =
+  astError node "Expected type declaration, found static assert"
+analyseTypeDecl (CDecl declspecs declrs node)
+    | [] <- declrs = analyseTyDeclr (emptyDeclr node)
+    | [(Just declr,Nothing,Nothing)] <- declrs = analyseTyDeclr declr
+    | otherwise = astError node "Bad declarator for type declaration"
+    where
+    analyseTyDeclr (CDeclr Nothing derived_declrs Nothing attrs _declrnode)
+        | (not (null storagespec) || not (null funspecs) || not (null alignspecs)) =
+            astError node "storage, function or alignment specifier for type declaration"
+        | otherwise                          =
+          do canonTySpecs <- canonicalTypeSpec typespecs
+             t <- tType True node (map CAttrQual (attrs++attrs_decl) ++ typequals)
+                   canonTySpecs derived_declrs []
+             case nameOfNode node of
+               Just n -> withDefTable (\dt -> (t, insertType dt n t))
+               Nothing -> return t
+        where
+        (storagespec, attrs_decl, typequals, typespecs, funspecs, alignspecs) = partitionDeclSpecs declspecs
+    analyseTyDeclr _ = astError node "Non-abstract declarator in type declaration"
+
+
+-- | translate a type
+tType :: (MonadTrav m) => Bool -> NodeInfo -> [CTypeQual] -> TypeSpecAnalysis -> [CDerivedDeclr] -> [CDecl] -> m Type
+tType handle_sue_def top_node typequals canonTySpecs derived_declrs oldstyle_params
+    = mergeOldStyle top_node oldstyle_params derived_declrs >>= buildType
+    where
+    buildType [] =
+        tDirectType handle_sue_def top_node typequals canonTySpecs
+    buildType (CPtrDeclr ptrquals node : dds) =
+        buildType dds >>= buildPointerType ptrquals node
+    buildType (CArrDeclr arrquals size node : dds)
+        = buildType dds >>= buildArrayType arrquals size node
+    buildType (CFunDeclr (Right (params, isVariadic)) attrs node : dds)
+        = buildType dds >>= (liftM  (uncurry FunctionType) . buildFunctionType params isVariadic attrs node)
+    buildType (CFunDeclr (Left _) _ _ : _)
+        -- /FIXME/: this is really an internal error, not an AST error.
+        = astError top_node "old-style parameters remaining after mergeOldStyle"
+    buildPointerType ptrquals _node inner_ty
+        = liftM (\(quals,attrs) -> PtrType inner_ty quals attrs) (tTypeQuals ptrquals)
+    buildArrayType arr_quals size _node inner_ty
+        = do (quals,attrs) <- tTypeQuals arr_quals
+             arr_sz        <- tArraySize size
+             return$ ArrayType inner_ty arr_sz quals attrs
+    -- We build functions in function prototype scope.
+    -- When analyzing the  the function body, we push parameters in function body scope.
+    buildFunctionType params is_variadic attrs _node return_ty
+        = do enterPrototypeScope
+             params' <- mapM tParamDecl params
+             leavePrototypeScope
+             attrs'  <- mapM tAttr attrs
+             return $ (\t -> (t,attrs')) $
+                case (map declType params',is_variadic) of
+                    ([],False) -> FunTypeIncomplete return_ty  -- may be improved later on
+                    ([DirectType TyVoid _ _],False) -> FunType return_ty [] False
+                    _ -> FunType return_ty params' is_variadic
+
+-- | translate a type without (syntactic) indirections
+-- Due to the GNU @typeof@ extension and typeDefs, this can be an arbitrary type
+tDirectType :: (MonadTrav m) =>
+               Bool -> NodeInfo -> [CTypeQual] -> TypeSpecAnalysis -> m Type
+tDirectType handle_sue_def node ty_quals canonTySpec = do
+    (quals,attrs) <- tTypeQuals ty_quals
+    let baseType ty_name = DirectType ty_name quals attrs
+    case canonTySpec of
+        TSNone -> return$ baseType (TyIntegral TyInt)
+        TSVoid -> return$ baseType TyVoid
+        TSBool -> return$ baseType (TyIntegral TyBool)
+        TSNum tsnum -> do
+            numType <- tNumType tsnum
+            return . baseType $
+                case numType of
+                    Left (floatType,iscomplex) | iscomplex -> TyComplex floatType
+                                               | otherwise -> TyFloating floatType
+                    Right intType  -> TyIntegral intType
+        TSTypeDef tdr -> return$ TypeDefType tdr quals attrs
+        TSNonBasic (CSUType su _tnode)       -> liftM (baseType . TyComp) $ tCompTypeDecl handle_sue_def su
+        TSNonBasic (CEnumType enum _tnode)   -> liftM (baseType . TyEnum) $ tEnumTypeDecl handle_sue_def enum
+        TSType t                             ->  mergeTypeAttributes node quals attrs t
+        TSNonBasic t -> astError node ("Unexpected typespec: " ++ show t)
+
+-- | Merge type attributes
+--
+-- This handles for example the form
+--
+-- > /* tyqual attr typeof(type) */
+-- > const typeof(char volatile) x;
+mergeTypeAttributes :: (MonadCError m) => NodeInfo -> TypeQuals -> [Attr] -> Type -> m Type
+mergeTypeAttributes node_info quals attrs typ =
+    case typ of
+        DirectType ty_name quals' attrs' -> merge quals' attrs' $ DirectType ty_name
+        PtrType ty quals' attrs'  -> merge quals' attrs' $ PtrType ty
+        ArrayType ty array_sz quals' attrs' -> merge quals' attrs' $ ArrayType ty array_sz
+        FunctionType fty attrs'
+             | quals /= noTypeQuals -> astError node_info "type qualifiers for function type"
+             | otherwise            -> return$ FunctionType fty (attrs' ++ attrs)
+        TypeDefType tdr quals' attrs'
+            -> merge quals' attrs' $ TypeDefType tdr
+    where
+    merge quals' attrs' tyf = return $ tyf (mergeTypeQuals quals quals') (attrs' ++ attrs)
+
+typeDefRef :: (MonadCError m, MonadSymtab m) => NodeInfo -> Ident -> m TypeDefRef
+typeDefRef t_node name = lookupTypeDef name >>= \ty -> return (TypeDefRef name ty t_node)
+
+-- extract a struct\/union
+-- we emit @declStructUnion@ and @defStructUnion@ actions
+--
+-- TODO: should attributes be part of declarartions too ?
+tCompTypeDecl :: (MonadTrav m) => Bool -> CStructUnion -> m CompTypeRef
+tCompTypeDecl handle_def (CStruct tag ident_opt member_decls_opt attrs node_info) = do
+    -- create reference
+    sue_ref <- createSUERef node_info ident_opt
+    let tag' = tTag tag
+    attrs' <- mapM tAttr attrs
+    -- record tag name
+    let decl = CompTypeRef sue_ref tag' node_info
+    handleTagDecl (CompDecl decl)
+    -- when handle_def is true, enter the definition
+    when handle_def $
+        maybeM member_decls_opt $ \decls ->
+                tCompType sue_ref tag' decls attrs' node_info
+            >>= (handleTagDef.CompDef)
+    return decl
+
+tTag :: CStructTag -> CompTyKind
+tTag CStructTag = StructTag
+tTag CUnionTag  = UnionTag
+
+tCompType :: (MonadTrav m) => SUERef -> CompTyKind -> [CDecl] -> Attributes -> NodeInfo -> m CompType
+tCompType tag sue_ref member_decls attrs node
+    = return (CompType tag sue_ref) `ap`
+        (concatMapM tMemberDecls member_decls) `ap`
+        (return attrs) `ap`
+        (return node)
+
+-- | translate a enum type decl
+--
+--  > enum my_enum
+--  > enum your_enum { x, y=3 }
+--
+tEnumTypeDecl :: (MonadTrav m) => Bool -> CEnum -> m EnumTypeRef
+tEnumTypeDecl handle_def (CEnum ident_opt enumerators_opt attrs node_info)
+    | (Nothing, Nothing) <- (ident_opt, enumerators_opt) = astError node_info "both definition and name of enum missing"
+    | Just [] <- enumerators_opt                         = astError node_info "empty enumerator list"
+    | otherwise
+        = do sue_ref <- createSUERef node_info ident_opt
+             attrs' <- mapM tAttr attrs
+             let decl = EnumTypeRef sue_ref node_info
+             when handle_def $
+                 maybeM enumerators_opt $ \enumerators ->
+                         tEnumType sue_ref enumerators attrs' node_info
+                    >>=  (handleTagDef . EnumDef)
+             return decl
+
+-- | translate and analyse an enumeration type
+tEnumType :: (MonadCError m, MonadSymtab m) =>
+             SUERef -> [(Ident, Maybe CExpr)] -> Attributes -> NodeInfo -> m EnumType
+tEnumType sue_ref enumerators attrs node = do
+    mapM_ handleEnumeratorDef enumerators'
+    return ty
+    where
+    ty = EnumType sue_ref enumerators' attrs node
+    (_,enumerators') = mapAccumL nextEnumerator (Left 0) enumerators
+    nextEnumerator memo (ident,e) =
+      let (memo',expr) = nextEnrExpr memo e in
+      (memo', Enumerator ident expr ty (nodeInfo ident))
+    nextEnrExpr :: Either Integer (Expr,Integer) -> Maybe CExpr -> (Either Integer (Expr,Integer), CExpr)
+    nextEnrExpr (Left i) Nothing = (Left (succ i), intExpr i)
+    nextEnrExpr (Right (e,offs)) Nothing = (Right (e, succ offs), offsExpr e offs)
+    nextEnrExpr _ (Just e) = (Right (e,1), e)
+    intExpr i = CConst (CIntConst (cInteger i) undefNode)
+    offsExpr e offs = CBinary CAddOp e (intExpr offs) undefNode
+
+-- | Mapping from num type specs to C types (C99 6.7.2-2), ignoring the complex qualifier.
+tNumType :: (MonadCError m) => NumTypeSpec -> m (Either (FloatType,Bool) IntType)
+tNumType (NumTypeSpec basetype sgn sz iscomplex) =
+    case (basetype,sgn,sz) of
+        (BaseChar,_,NoSizeMod)      | Signed <- sgn   -> intType TySChar
+                                    | Unsigned <- sgn -> intType TyUChar
+                                    | otherwise       -> intType TyChar
+        (intbase, _, NoSizeMod)  | optBase BaseInt intbase ->
+            intType$ case sgn of
+                            Unsigned -> TyUInt
+                            _        -> TyInt
+        (intbase, _, NoSizeMod)  | optBase BaseInt128 intbase ->
+            intType$ case sgn of
+                            Unsigned -> TyUInt128
+                            _        -> TyInt128
+        (intbase, signed, sizemod)    | optBase BaseInt intbase, optSign Signed signed ->
+            intType$ case sizemod of ShortMod    -> TyShort
+                                     LongMod     -> TyLong
+                                     LongLongMod -> TyLLong
+                                     _ -> internalErr "numTypeMapping: unexpected pattern matching error"
+        (intbase, Unsigned, sizemod) | optBase BaseInt intbase ->
+            intType$ case sizemod of ShortMod    -> TyUShort
+                                     LongMod     -> TyULong
+                                     LongLongMod -> TyULLong
+                                     _ -> internalErr "numTypeMapping: unexpected pattern matching error"
+        (BaseFloat, NoSignSpec, NoSizeMod)  -> floatType TyFloat
+        (BaseDouble, NoSignSpec, NoSizeMod) -> floatType TyDouble
+        (BaseDouble, NoSignSpec, LongMod)   -> floatType TyLDouble
+        (BaseFloat128, NoSignSpec, NoSizeMod) -> floatType TyFloat128
+        -- TODO: error analysis
+        (_,_,_)   -> error "Bad AST analysis"
+    where
+    optBase _ NoBaseType = True
+    optBase expect baseTy = expect == baseTy
+    optSign _ NoSignSpec = True
+    optSign expect sign = expect == sign
+    intType = return . Right
+    floatType ft = return (Left (ft,iscomplex))
+
+-- TODO: currently bogus
+tArraySize :: (MonadTrav m) => CArrSize -> m ArraySize
+tArraySize (CNoArrSize False) = return (UnknownArraySize False)
+tArraySize (CNoArrSize True) = return (UnknownArraySize True)
+tArraySize (CArrSize static szexpr) = liftM (ArraySize static) (return szexpr)
+
+tTypeQuals :: (MonadTrav m) => [CTypeQual] -> m (TypeQuals,Attributes)
+tTypeQuals = foldrM go (noTypeQuals,[]) where
+    go (CConstQual _) (tq,attrs) = return (tq { constant = True },attrs)
+    go (CVolatQual _) (tq,attrs) = return (tq { volatile = True },attrs)
+    go (CRestrQual _) (tq,attrs) = return (tq { restrict = True },attrs)
+    go (CAtomicQual _) (tq,attrs) = return (tq { atomic = True },attrs)
+    go (CAttrQual attr) (tq,attrs) = liftM (\attr' -> (tq,attr':attrs)) (tAttr attr)
+    go (CNullableQual _) (tq,attrs) = return (tq { nullable = True }, attrs)
+    go (CNonnullQual _) (tq,attrs) = return (tq { nonnull = True }, attrs)
+
+-- * analysis
+
+
+{-
+To canoicalize type specifiers, we define a canonical form:
+void | bool | (char|int|int128|float|double|float128)? (signed|unsigned)? (long long?)? complex? | othertype
+-}
+data NumBaseType = NoBaseType | BaseChar | BaseInt | BaseInt128 | BaseFloat | BaseFloat128 | BaseDouble deriving (Eq,Ord)
+data SignSpec    = NoSignSpec | Signed | Unsigned deriving (Eq,Ord)
+data SizeMod     = NoSizeMod | ShortMod | LongMod | LongLongMod deriving (Eq,Ord)
+data NumTypeSpec = NumTypeSpec { base :: NumBaseType, signSpec :: SignSpec, sizeMod :: SizeMod, isComplex :: Bool  }
+emptyNumTypeSpec :: NumTypeSpec
+emptyNumTypeSpec = NumTypeSpec { base = NoBaseType, signSpec = NoSignSpec, sizeMod = NoSizeMod, isComplex = False }
+data TypeSpecAnalysis =
+  TSNone | TSVoid | TSBool | TSNum NumTypeSpec |
+  TSTypeDef TypeDefRef | TSType Type | TSNonBasic CTypeSpec
+
+canonicalTypeSpec :: (MonadTrav m) => [CTypeSpec] -> m TypeSpecAnalysis
+canonicalTypeSpec = foldrM go TSNone where
+    getNTS TSNone = Just emptyNumTypeSpec
+    getNTS (TSNum nts) = Just nts
+    getNTS _ = Nothing
+    updLongMod NoSizeMod = Just LongMod
+    updLongMod LongMod   = Just LongLongMod
+    updLongMod _         = Nothing
+    go :: (MonadTrav m) => CTypeSpec -> TypeSpecAnalysis -> m TypeSpecAnalysis
+    go (CVoidType _)    TSNone = return TSVoid
+    go (CBoolType _)    TSNone = return TSBool
+    go (CCharType _)    tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa
+                            = return$  TSNum$ nts { base = BaseChar }
+    go (CIntType _)     tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa
+                            = return$  TSNum$ nts { base = BaseInt }
+    go (CInt128Type _)  tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa
+                            = return$  TSNum$ nts { base = BaseInt128 }
+    go (CFloatType _)   tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa
+                            = return$  TSNum$ nts { base = BaseFloat }
+    go (CFloat128Type _) tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa
+                            = return$  TSNum$ nts { base = BaseFloat128 }
+    go (CDoubleType _)  tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa
+                            = return$  TSNum$ nts { base = BaseDouble }
+    go (CShortType _)   tsa | (Just nts@(NumTypeSpec { sizeMod = NoSizeMod })) <- getNTS tsa
+                            = return$  TSNum$nts { sizeMod = ShortMod }
+    go (CLongType _)    tsa | (Just nts@(NumTypeSpec { sizeMod = szMod })) <- getNTS tsa,
+                              (Just szMod') <- updLongMod szMod
+                            = return$  TSNum$ nts { sizeMod = szMod' }
+    go (CSignedType _)  tsa | (Just nts@(NumTypeSpec { signSpec = NoSignSpec })) <- getNTS tsa
+                            = return$  TSNum$ nts { signSpec = Signed }
+    go (CUnsigType _)   tsa | (Just nts@(NumTypeSpec { signSpec = NoSignSpec })) <- getNTS tsa
+                            = return$  TSNum$ nts { signSpec = Unsigned }
+    go (CComplexType _) tsa | (Just nts@(NumTypeSpec { isComplex = False })) <- getNTS tsa
+                            = return$  TSNum$ nts { isComplex = True }
+    go (CTypeDef i ni) TSNone = liftM TSTypeDef $ typeDefRef ni i
+    go (CTypeOfType d _ni) TSNone = liftM TSType $ analyseTypeDecl d
+    go (CTypeOfExpr e _) TSNone = liftM TSType $ tExpr [] RValue e
+    -- todo: atomic qualifier discarded
+    go (CAtomicType d _ni) TSNone = liftM TSType $ analyseTypeDecl d
+    go otherType  TSNone    = return$  TSNonBasic otherType
+    go ty _ts = astError (nodeInfo ty) "Invalid type specifier"
+
+-- compute storage given storage specifiers
+canonicalStorageSpec :: (MonadCError m) =>[CStorageSpec] -> m StorageSpec
+canonicalStorageSpec storagespecs = liftM elideAuto $ foldrM updStorage NoStorageSpec storagespecs where
+        updStorage (CAuto _) NoStorageSpec     = return AutoSpec
+        updStorage (CRegister _) NoStorageSpec = return RegSpec
+        updStorage (CThread _) NoStorageSpec   = return ThreadSpec
+        updStorage (CThread _) (StaticSpec _)  = return$ StaticSpec True
+        updStorage (CThread _) (ExternSpec _)  = return$ ExternSpec True
+        updStorage (CStatic _) NoStorageSpec   = return$ StaticSpec False
+        updStorage (CExtern _) NoStorageSpec   = return$ ExternSpec False
+        updStorage (CStatic _) ThreadSpec      = return$ StaticSpec True
+        updStorage (CExtern _) ThreadSpec      = return$ ExternSpec True
+        updStorage badSpec old
+            = astError (nodeInfo badSpec) $ "Invalid storage specifier "++render (pretty badSpec)++" in combination with "++show old
+        elideAuto AutoSpec = NoStorageSpec
+        elideAuto spec = spec
+
+-- | convert old style parameters
+--
+-- This requires matching parameter names and declarations, as in the following example:
+--
+-- > int f(d,c,a,b)
+-- > char a,*b;
+-- > int c;
+-- > { }
+--
+-- is converted to
+--
+-- > int f(int d, int c, char a, char* b)
+--
+-- TODO: This could be moved to syntax, as it operates on the AST only
+mergeOldStyle :: (MonadCError m) => NodeInfo -> [CDecl] -> [CDerivedDeclr] -> m [CDerivedDeclr]
+mergeOldStyle _node [] declrs = return declrs
+mergeOldStyle node oldstyle_params (CFunDeclr params attrs fdnode : dds) =
+    case params of
+        Left list -> do
+            -- FIXME: This translation doesn't work in the following example
+            -- [| int f(b,a) struct x { }; int b,a; { struct x local; return local.x } |]
+            oldstyle_params' <- liftM concat $ mapM splitCDecl oldstyle_params
+            param_map <- liftM Map.fromList $ mapM attachNameOfDecl oldstyle_params'
+            (newstyle_params,param_map') <- foldrM insertParamDecl ([],param_map) list
+            unless (Map.null param_map') $
+              astError node $ "declarations for parameter(s) "++ showParamMap param_map' ++" but no such parameter"
+            return (CFunDeclr (Right (newstyle_params, False)) attrs fdnode : dds)
+        Right _newstyle -> astError node "oldstyle parameter list, but newstyle function declaration"
+    where
+        attachNameOfDecl decl = nameOfDecl decl >>= \n -> return (n,decl)
+        insertParamDecl param_name (ps, param_map)
+            = case Map.lookup param_name param_map of
+                Just p -> return (p:ps, Map.delete param_name param_map)
+                Nothing -> return (implicitIntParam param_name : ps, param_map)
+        implicitIntParam param_name =
+            let nInfo = nodeInfo param_name in
+            CDecl [CTypeSpec (CIntType nInfo)] [(Just (CDeclr (Just param_name) [] Nothing [] nInfo),Nothing,Nothing)] nInfo
+        showParamMap = intercalate ", " . map identToString . Map.keys
+mergeOldStyle node _ _ = astError node "oldstyle parameter list, but not function type"
+
+-- | split a CDecl into declarators, hereby eliding SUE defs from the second declarator on.
+--
+--   There are several reasons why this isn't the preferred way for handling multiple-declarator declarations,
+--   but it can be convinient some times.
+--
+-- > splitCDecl [d| struct x { int z; } a,*b; |]
+-- > [ [d| struct x { int z; } a, struct x *b; |] ]
+--
+-- /TODO/: This could be moved to syntax, as it operates on the AST only
+splitCDecl :: (MonadCError m) => CDecl -> m [CDecl]
+splitCDecl decl@(CStaticAssert _ _ _) = return [decl]
+splitCDecl decl@(CDecl declspecs declrs node) =
+    case declrs of
+        []      -> internalErr "splitCDecl applied to empty declaration"
+        -- single declarator, not need to split
+        [_declr] -> return [decl]
+        -- more than one declarator
+        (d1:ds) ->
+            let declspecs' = map elideSUEDef declspecs in
+            return$ (CDecl declspecs [d1] node) : [ CDecl declspecs' [declr] node | declr <- ds ]
+    where
+    elideSUEDef declspec@(CTypeSpec tyspec) =
+        case tyspec of
+            (CEnumType (CEnum name _def _attrs enum_node) node_info) ->
+                CTypeSpec (CEnumType (CEnum name Nothing [] enum_node) node_info)
+            (CSUType (CStruct tag name _def _attrs su_node) node_info) ->
+                CTypeSpec (CSUType (CStruct tag name Nothing [] su_node) node_info)
+            _ -> declspec
+    elideSUEDef declspec = declspec
+
+
+-- | translate @__attribute__@ annotations
+-- TODO: This is a unwrap and wrap stub
+tAttr :: (MonadCError m, MonadSymtab m) => CAttr -> m Attr
+tAttr (CAttr name cexpr node) = return$ Attr name cexpr node
+
+
+-- | construct a name for a variable
+-- TODO: more or less bogus
+mkVarName :: (MonadCError m, MonadSymtab m) =>
+             NodeInfo -> Maybe Ident -> Maybe AsmName -> m VarName
+mkVarName  _node Nothing _ = return NoName
+mkVarName  _node (Just n) asm = return $ VarName n asm
+
+-- helpers
+nameOfDecl :: (MonadCError m) => CDecl -> m Ident
+nameOfDecl d = getOnlyDeclr d >>= \declr ->
+    case declr of
+        (CDeclr (Just name) _ _ _ _node) -> return name
+        (CDeclr Nothing _ _ _ _node)     -> internalErr "nameOfDecl: abstract declarator"
+emptyDeclr :: NodeInfo -> CDeclr
+emptyDeclr node = CDeclr Nothing [] Nothing [] node
+getOnlyDeclr :: (MonadCError m) => CDecl -> m CDeclr
+getOnlyDeclr (CDecl _ [(Just declr,_,_)] _) = return declr
+getOnlyDeclr (CDecl _ _ _node) = internalErr "getOnlyDeclr: declaration doesn't have a unique declarator"
+getOnlyDeclr (CStaticAssert _ _ _) = internalErr "getOnlyDeclr: static assertion doesn't have a unique declarator"
src/Language/C/Analysis/DefTable.hs view
@@ -1,331 +1,331 @@-{-# LANGUAGE PatternGuards, DeriveDataTypeable  #-}--------------------------------------------------------------------------------- |--- Module      :  Language.C.Analysis.DefTable--- Copyright   :  (c) 2008 Benedikt Huber---                  based on code from c2hs---                (c) [1999..2001] Manuel M. T. Chakravarty--- License     :  BSD-style--- Maintainer  :  benedikt.huber@gmail.com--- Stability   :  alpha--- Portability :  ghc------ This module manages symbols in local and global scopes.------ There are four different kind of identifiers: ordinary identifiers (henceforth--- simply called `identifier'), tag names (names of struct\/union\/enum types),--- labels and structure members.-------------------------------------------------------------------------------module Language.C.Analysis.DefTable (-    IdentEntry, identOfTyDecl,-    TagEntry, TagFwdDecl(..),-    DefTable(..),-    emptyDefTable,-    globalDefs,-    inFileScope,-    enterFunctionScope,leaveFunctionScope,enterBlockScope,leaveBlockScope,-    enterMemberDecl,leaveMemberDecl,-    DeclarationStatus(..),declStatusDescr,-    defineTypeDef, defineGlobalIdent, defineScopedIdent, defineScopedIdentWhen,-    declareTag,defineTag,defineLabel,lookupIdent,-    lookupTag,lookupLabel,lookupIdentInner,lookupTagInner,-    insertType, lookupType,-    mergeDefTable-)-where-import Language.C.Data-import Language.C.Analysis.NameSpaceMap-import Language.C.Analysis.SemRep--import qualified Data.Map as Map-import Data.IntMap (IntMap, union)-import qualified Data.IntMap as IntMap-import Data.Generics--{- Name spaces, scopes and contexts [Scopes]-- In C, there are 4 categories of identifiers:--  * labels-  * tag names (@(struct|union|enum) tag-name@), where /all/ tag names live in one namespace-  * members of structures and unions-  * ordinary identifiers, denoting objects, functions, typeDefs and enumeration constants-- There are 4 kind of scopes:--  * file scope: outside of parameter lists and blocks-  * function prototype scope-  * function scope: labels are visible within the entire function, and declared implicitely-  * block scope-- While function scope is irrelevant for variable declarations, they might also appear in member declarations.- Therefore, there are also 4 kinds of contexts where a variable might be declared:--  * File Scope Context: external declaration \/ definition-  * Block Scope Context: either external or local definition-  * Function prototype scope context-  * Member Declaration context-- See-   <http://www.embedded.com/design/206901036>-   C99 6--}---- | All ordinary identifiers map to 'IdenTyDecl': either a typedef or a object\/function\/enumerator-type IdentEntry = Either TypeDef IdentDecl--identOfTyDecl :: IdentEntry -> Ident-identOfTyDecl = either identOfTypeDef declIdent--data TagFwdDecl = CompDecl CompTypeRef-                | EnumDecl EnumTypeRef-instance HasSUERef TagFwdDecl where-  sueRef (CompDecl ctr) = sueRef ctr-  sueRef (EnumDecl etr) = sueRef etr-instance CNode TagFwdDecl where-  nodeInfo (CompDecl ctr) = nodeInfo ctr-  nodeInfo (EnumDecl etr) = nodeInfo etr---- | Tag names map to forward declarations or definitions of struct\/union\/enum types-type TagEntry = Either TagFwdDecl TagDef---- | Table holding current definitions-data DefTable = DefTable-    {-        identDecls   :: NameSpaceMap Ident IdentEntry,     -- ^ declared `ordinary identifiers'-        tagDecls   :: NameSpaceMap SUERef TagEntry,        -- ^ declared struct/union/enum  tags-        labelDefs  :: NameSpaceMap Ident Ident,            -- ^ defined labels-        memberDecls :: NameSpaceMap Ident MemberDecl,      -- ^ member declarations (only local)-        refTable   :: IntMap Name,                         -- ^ link names with definitions-        typeTable  :: IntMap Type-    }---- | empty definition table, with all name space maps in global scope-emptyDefTable :: DefTable-emptyDefTable = DefTable nameSpaceMap nameSpaceMap nameSpaceMap nameSpaceMap IntMap.empty IntMap.empty---- | get the globally defined entries of a definition table-globalDefs :: DefTable -> GlobalDecls-globalDefs deftbl = Map.foldWithKey insertDecl (GlobalDecls e gtags e) (globalNames $ identDecls deftbl)-    where-    e = Map.empty-    (_fwd_decls,gtags) = Map.mapEither id $ globalNames (tagDecls deftbl)-    insertDecl ident (Left tydef) ds = ds { gTypeDefs = Map.insert ident tydef (gTypeDefs ds)}-    insertDecl ident (Right obj) ds = ds { gObjs = Map.insert ident obj (gObjs ds) }--inFileScope :: DefTable -> Bool-inFileScope dt = not (hasLocalNames (identDecls dt) || hasLocalNames (labelDefs dt))--leaveScope_ :: (Ord k) => NameSpaceMap k a -> NameSpaceMap k a-leaveScope_ = fst . leaveScope--enterLocalScope :: DefTable -> DefTable-enterLocalScope deftbl = deftbl {-        identDecls = enterNewScope (identDecls deftbl),-        tagDecls = enterNewScope (tagDecls deftbl)-    }-leaveLocalScope :: DefTable -> DefTable-leaveLocalScope deftbl = deftbl {-                        identDecls = leaveScope_ (identDecls deftbl),-                        tagDecls = leaveScope_ (tagDecls deftbl)-                       }---- | Enter function scope (AND the corresponding block scope)-enterFunctionScope :: DefTable -> DefTable-enterFunctionScope deftbl = enterLocalScope  $ deftbl { labelDefs = enterNewScope (labelDefs deftbl) }---- | Leave function scope, and return the associated DefTable.---   Error if not in function scope.-leaveFunctionScope :: DefTable -> DefTable-leaveFunctionScope deftbl = leaveLocalScope $ deftbl { labelDefs = leaveScope_ (labelDefs deftbl) }---- | Enter new block scope-enterBlockScope :: DefTable -> DefTable-enterBlockScope deftbl = enterLocalScope $ deftbl { labelDefs = enterNewScope (labelDefs deftbl) }---- | Leave innermost block scope-leaveBlockScope :: DefTable -> DefTable-leaveBlockScope deftbl = leaveLocalScope $ deftbl { labelDefs = leaveScope_ (labelDefs deftbl) }---- | Enter new member declaration scope-enterMemberDecl :: DefTable -> DefTable-enterMemberDecl deftbl = deftbl { memberDecls = enterNewScope (memberDecls deftbl) }---- | Leave innermost member declaration scope-leaveMemberDecl :: DefTable -> ([MemberDecl], DefTable)-leaveMemberDecl deftbl =-    let (decls',members) = leaveScope (memberDecls deftbl)-    in (,) (map snd members)-           (deftbl { memberDecls = decls' })---- * declarations---- | Status of a declaration-data DeclarationStatus t =-      NewDecl         -- ^ new entry-    | Redeclared t    -- ^ old def was overwritten-    | KeepDef t       -- ^ new def was discarded-    | Shadowed t      -- ^ new def shadows one in outer scope-    | KindMismatch t  -- ^ kind mismatch-    deriving (Data,Typeable)-declStatusDescr :: DeclarationStatus t -> String-declStatusDescr NewDecl = "new"-declStatusDescr (Redeclared _) = "redeclared"-declStatusDescr (KeepDef _) = "keep old"-declStatusDescr (Shadowed _) = "shadowed"-declStatusDescr (KindMismatch _) = "kind mismatch"--compatIdentEntry :: IdentEntry -> IdentEntry -> Bool-compatIdentEntry (Left _tydef) = either (const True) (const False)-compatIdentEntry (Right def) = either (const False) $-  \other_def -> case (def,other_def) of-                  (EnumeratorDef _, EnumeratorDef _) -> True-                  (EnumeratorDef _, _) -> True-                  (_, EnumeratorDef _) -> True-                  (_,_) -> True--data TagEntryKind = CompKind CompTyKind | EnumKind-                    deriving (Eq,Ord)-instance Show TagEntryKind where-  show (CompKind ctk) = show ctk-  show EnumKind = "enum"---- | @sameTagKind ty1 ty2@ returns @True@ if @ty1,ty2@ are the same kind of tag (struct,union or enum)-tagKind :: TagEntry -> TagEntryKind-tagKind (Left (CompDecl cd)) = CompKind (compTag cd)-tagKind (Left (EnumDecl _)) = EnumKind-tagKind (Right (CompDef cd)) = CompKind (compTag cd)-tagKind (Right (EnumDef _)) =  EnumKind--compatTagEntry :: TagEntry -> TagEntry -> Bool-compatTagEntry  te1 te2 = tagKind te1 == tagKind te2--defRedeclStatus :: (t -> t -> Bool) -> t -> Maybe t -> DeclarationStatus t-defRedeclStatus sameKind def oldDecl =-    case oldDecl of-        Just def' | def `sameKind` def' -> Redeclared def'-                  | otherwise           -> KindMismatch def'-        Nothing                         -> NewDecl--defRedeclStatusLocal :: (Ord k) =>-                        (t -> t -> Bool) -> k -> t -> Maybe t -> NameSpaceMap k t -> DeclarationStatus t-defRedeclStatusLocal sameKind ident def oldDecl nsm =-    case defRedeclStatus sameKind def oldDecl of-        NewDecl -> case lookupName nsm ident of-                     Just shadowed -> Shadowed shadowed-                     Nothing       -> NewDecl-        redecl  -> redecl--defineTypeDef :: Ident -> TypeDef -> DefTable -> (DeclarationStatus IdentEntry, DefTable)-defineTypeDef ident tydef deftbl =-  (defRedeclStatus compatIdentEntry (Left tydef) oldDecl, deftbl { identDecls = decls' })-  where-  (decls', oldDecl) = defLocal (identDecls deftbl) ident (Left tydef)---- | declare\/define a global object\/function\/typeDef------  returns @Redeclared def@ if there is already an object\/function\/typeDef---  in global scope, or @DifferentKindRedec def@ if the old declaration is of a different kind.-defineGlobalIdent :: Ident -> IdentDecl -> DefTable -> (DeclarationStatus IdentEntry, DefTable)-defineGlobalIdent ident def deftbl =-    (defRedeclStatus compatIdentEntry (Right def) oldDecl, deftbl { identDecls = decls' })-    where-    (decls',oldDecl) = defGlobal (identDecls deftbl) ident (Right def)--- | declare\/define a object\/function\/typeDef with lexical scope------  returns @Redeclared def@ or @DifferentKindRedec def@  if there is already an object\/function\/typeDef---  in the same scope.-defineScopedIdent :: Ident -> IdentDecl -> DefTable -> (DeclarationStatus IdentEntry, DefTable)-defineScopedIdent = defineScopedIdentWhen (const True)---- | declare\/define a object\/function\/typeDef with lexical scope, if the given predicate holds on the old---   entry.------  returns @Keep old_def@ if the old definition shouldn't be overwritten, and otherwise @Redeclared def@ or---  @DifferentKindRedecl def@  if there is already an object\/function\/typeDef in the same scope.-defineScopedIdentWhen :: (IdentDecl -> Bool) -> Ident -> IdentDecl -> DefTable ->-                           (DeclarationStatus IdentEntry, DefTable)-defineScopedIdentWhen override_def ident def deftbl-    = (redecl_status, deftbl { identDecls = decls' })-    where-    new_def = Right def-    old_decls = identDecls deftbl-    old_decl_opt = lookupInnermostScope old_decls ident-    (decls',redecl_status)  | (Just old_decl) <- old_decl_opt, not (old_decl `compatIdentEntry` new_def)-                              = (new_decls, KindMismatch old_decl)-                            | maybe True doOverride old_decl_opt-                              = (new_decls, redeclStatus' old_decl_opt)-                            | otherwise-                              = (old_decls, maybe NewDecl KeepDef old_decl_opt)-    new_decls = fst (defLocal old_decls ident new_def)-    doOverride (Left _) = False-    doOverride (Right old_def) = override_def old_def-    redeclStatus' overriden_decl = defRedeclStatusLocal compatIdentEntry ident new_def overriden_decl old_decls---- | declare a tag (fwd decl in case the struct name isn't defined yet)-declareTag :: SUERef -> TagFwdDecl -> DefTable -> (DeclarationStatus TagEntry, DefTable)-declareTag sueref decl deftbl =-  case lookupTag sueref deftbl of-    Nothing -> (NewDecl, deftbl { tagDecls = fst $ defLocal (tagDecls deftbl) sueref (Left decl) })-    Just old_def | tagKind old_def == tagKind (Left decl) ->  (KeepDef old_def, deftbl)-                 | otherwise -> (KindMismatch old_def, deftbl)---- | define a tag-defineTag :: SUERef -> TagDef -> DefTable -> (DeclarationStatus TagEntry, DefTable)-defineTag sueref def deftbl =-    (redeclStatus, deftbl { tagDecls = decls'})-    where-    (decls',olddecl) = defLocal (tagDecls deftbl) sueref (Right def)-    redeclStatus =-      case olddecl of-        Just fwd_decl@(Left _) | tagKind fwd_decl == tagKind (Right def) -> NewDecl -- should be NewDef-                               | otherwise -> KindMismatch fwd_decl-        _ -> defRedeclStatusLocal compatTagEntry sueref (Right def) olddecl (tagDecls deftbl)---- | define a label--- Return the old label if it is already defined in this function's scope-defineLabel :: Ident -> DefTable -> (DeclarationStatus Ident, DefTable)-defineLabel ident deftbl =-    let (labels',old_label) = defLocal (labelDefs deftbl) ident ident-    in  (maybe NewDecl Redeclared old_label, deftbl { labelDefs = labels' })---- | lookup identifier (object, function, typeDef, enumerator)-lookupIdent :: Ident -> DefTable -> Maybe IdentEntry-lookupIdent ident deftbl = lookupName (identDecls deftbl) ident---- | lookup tag-lookupTag :: SUERef -> DefTable -> Maybe TagEntry-lookupTag sue_ref deftbl = lookupName (tagDecls deftbl) sue_ref---- | lookup label-lookupLabel :: Ident -> DefTable -> Maybe Ident-lookupLabel ident deftbl = lookupName (labelDefs deftbl) ident---- | lookup an object in the innermost scope-lookupIdentInner :: Ident -> DefTable -> Maybe IdentEntry-lookupIdentInner ident deftbl = lookupInnermostScope (identDecls deftbl) ident---- | lookup an identifier in the innermost scope-lookupTagInner :: SUERef -> DefTable -> Maybe TagEntry-lookupTagInner sue_ref deftbl = lookupInnermostScope (tagDecls deftbl) sue_ref---- | Record the type of a node.-insertType :: DefTable -> Name -> Type -> DefTable-insertType dt n t = dt { typeTable = IntMap.insert (nameId n) t (typeTable dt) }---- | Lookup the type of a node.-lookupType :: DefTable -> Name -> Maybe Type-lookupType dt n = IntMap.lookup (nameId n) (typeTable dt)---- | Merge two DefTables. If both tables contain an entry for a given---   key, they must agree on its value.-mergeDefTable :: DefTable -> DefTable -> DefTable-mergeDefTable (DefTable i1 t1 l1 m1 r1 tt1) (DefTable i2 t2 l2 m2 r2 tt2) =-  DefTable-  (mergeNameSpace i1 i2)-  (mergeNameSpace t1 t2)-  (mergeNameSpace l1 l2)-  (mergeNameSpace m1 m2)-  (union r1 r2)-  (union tt1 tt2)-+{-# LANGUAGE PatternGuards, DeriveDataTypeable  #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Analysis.DefTable
+-- Copyright   :  (c) 2008 Benedikt Huber
+--                  based on code from c2hs
+--                (c) [1999..2001] Manuel M. T. Chakravarty
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  alpha
+-- Portability :  ghc
+--
+-- This module manages symbols in local and global scopes.
+--
+-- There are four different kind of identifiers: ordinary identifiers (henceforth
+-- simply called `identifier'), tag names (names of struct\/union\/enum types),
+-- labels and structure members.
+-----------------------------------------------------------------------------
+module Language.C.Analysis.DefTable (
+    IdentEntry, identOfTyDecl,
+    TagEntry, TagFwdDecl(..),
+    DefTable(..),
+    emptyDefTable,
+    globalDefs,
+    inFileScope,
+    enterFunctionScope,leaveFunctionScope,enterBlockScope,leaveBlockScope,
+    enterMemberDecl,leaveMemberDecl,
+    DeclarationStatus(..),declStatusDescr,
+    defineTypeDef, defineGlobalIdent, defineScopedIdent, defineScopedIdentWhen,
+    declareTag,defineTag,defineLabel,lookupIdent,
+    lookupTag,lookupLabel,lookupIdentInner,lookupTagInner,
+    insertType, lookupType,
+    mergeDefTable
+)
+where
+import Language.C.Data
+import Language.C.Analysis.NameSpaceMap
+import Language.C.Analysis.SemRep
+
+import qualified Data.Map as Map
+import Data.IntMap (IntMap, union)
+import qualified Data.IntMap as IntMap
+import Data.Generics
+
+{- Name spaces, scopes and contexts [Scopes]
+
+ In C, there are 4 categories of identifiers:
+
+  * labels
+  * tag names (@(struct|union|enum) tag-name@), where /all/ tag names live in one namespace
+  * members of structures and unions
+  * ordinary identifiers, denoting objects, functions, typeDefs and enumeration constants
+
+ There are 4 kind of scopes:
+
+  * file scope: outside of parameter lists and blocks
+  * function prototype scope
+  * function scope: labels are visible within the entire function, and declared implicitely
+  * block scope
+
+ While function scope is irrelevant for variable declarations, they might also appear in member declarations.
+ Therefore, there are also 4 kinds of contexts where a variable might be declared:
+
+  * File Scope Context: external declaration \/ definition
+  * Block Scope Context: either external or local definition
+  * Function prototype scope context
+  * Member Declaration context
+
+ See
+   <http://www.embedded.com/design/206901036>
+   C99 6
+-}
+
+-- | All ordinary identifiers map to 'IdenTyDecl': either a typedef or a object\/function\/enumerator
+type IdentEntry = Either TypeDef IdentDecl
+
+identOfTyDecl :: IdentEntry -> Ident
+identOfTyDecl = either identOfTypeDef declIdent
+
+data TagFwdDecl = CompDecl CompTypeRef
+                | EnumDecl EnumTypeRef
+instance HasSUERef TagFwdDecl where
+  sueRef (CompDecl ctr) = sueRef ctr
+  sueRef (EnumDecl etr) = sueRef etr
+instance CNode TagFwdDecl where
+  nodeInfo (CompDecl ctr) = nodeInfo ctr
+  nodeInfo (EnumDecl etr) = nodeInfo etr
+
+-- | Tag names map to forward declarations or definitions of struct\/union\/enum types
+type TagEntry = Either TagFwdDecl TagDef
+
+-- | Table holding current definitions
+data DefTable = DefTable
+    {
+        identDecls   :: NameSpaceMap Ident IdentEntry,     -- ^ declared `ordinary identifiers'
+        tagDecls   :: NameSpaceMap SUERef TagEntry,        -- ^ declared struct/union/enum  tags
+        labelDefs  :: NameSpaceMap Ident Ident,            -- ^ defined labels
+        memberDecls :: NameSpaceMap Ident MemberDecl,      -- ^ member declarations (only local)
+        refTable   :: IntMap Name,                         -- ^ link names with definitions
+        typeTable  :: IntMap Type
+    }
+
+-- | empty definition table, with all name space maps in global scope
+emptyDefTable :: DefTable
+emptyDefTable = DefTable nameSpaceMap nameSpaceMap nameSpaceMap nameSpaceMap IntMap.empty IntMap.empty
+
+-- | get the globally defined entries of a definition table
+globalDefs :: DefTable -> GlobalDecls
+globalDefs deftbl = Map.foldWithKey insertDecl (GlobalDecls e gtags e) (globalNames $ identDecls deftbl)
+    where
+    e = Map.empty
+    (_fwd_decls,gtags) = Map.mapEither id $ globalNames (tagDecls deftbl)
+    insertDecl ident (Left tydef) ds = ds { gTypeDefs = Map.insert ident tydef (gTypeDefs ds)}
+    insertDecl ident (Right obj) ds = ds { gObjs = Map.insert ident obj (gObjs ds) }
+
+inFileScope :: DefTable -> Bool
+inFileScope dt = not (hasLocalNames (identDecls dt) || hasLocalNames (labelDefs dt))
+
+leaveScope_ :: (Ord k) => NameSpaceMap k a -> NameSpaceMap k a
+leaveScope_ = fst . leaveScope
+
+enterLocalScope :: DefTable -> DefTable
+enterLocalScope deftbl = deftbl {
+        identDecls = enterNewScope (identDecls deftbl),
+        tagDecls = enterNewScope (tagDecls deftbl)
+    }
+leaveLocalScope :: DefTable -> DefTable
+leaveLocalScope deftbl = deftbl {
+                        identDecls = leaveScope_ (identDecls deftbl),
+                        tagDecls = leaveScope_ (tagDecls deftbl)
+                       }
+
+-- | Enter function scope (AND the corresponding block scope)
+enterFunctionScope :: DefTable -> DefTable
+enterFunctionScope deftbl = enterLocalScope  $ deftbl { labelDefs = enterNewScope (labelDefs deftbl) }
+
+-- | Leave function scope, and return the associated DefTable.
+--   Error if not in function scope.
+leaveFunctionScope :: DefTable -> DefTable
+leaveFunctionScope deftbl = leaveLocalScope $ deftbl { labelDefs = leaveScope_ (labelDefs deftbl) }
+
+-- | Enter new block scope
+enterBlockScope :: DefTable -> DefTable
+enterBlockScope deftbl = enterLocalScope $ deftbl { labelDefs = enterNewScope (labelDefs deftbl) }
+
+-- | Leave innermost block scope
+leaveBlockScope :: DefTable -> DefTable
+leaveBlockScope deftbl = leaveLocalScope $ deftbl { labelDefs = leaveScope_ (labelDefs deftbl) }
+
+-- | Enter new member declaration scope
+enterMemberDecl :: DefTable -> DefTable
+enterMemberDecl deftbl = deftbl { memberDecls = enterNewScope (memberDecls deftbl) }
+
+-- | Leave innermost member declaration scope
+leaveMemberDecl :: DefTable -> ([MemberDecl], DefTable)
+leaveMemberDecl deftbl =
+    let (decls',members) = leaveScope (memberDecls deftbl)
+    in (,) (map snd members)
+           (deftbl { memberDecls = decls' })
+
+-- * declarations
+
+-- | Status of a declaration
+data DeclarationStatus t =
+      NewDecl         -- ^ new entry
+    | Redeclared t    -- ^ old def was overwritten
+    | KeepDef t       -- ^ new def was discarded
+    | Shadowed t      -- ^ new def shadows one in outer scope
+    | KindMismatch t  -- ^ kind mismatch
+    deriving (Data,Typeable)
+declStatusDescr :: DeclarationStatus t -> String
+declStatusDescr NewDecl = "new"
+declStatusDescr (Redeclared _) = "redeclared"
+declStatusDescr (KeepDef _) = "keep old"
+declStatusDescr (Shadowed _) = "shadowed"
+declStatusDescr (KindMismatch _) = "kind mismatch"
+
+compatIdentEntry :: IdentEntry -> IdentEntry -> Bool
+compatIdentEntry (Left _tydef) = either (const True) (const False)
+compatIdentEntry (Right def) = either (const False) $
+  \other_def -> case (def,other_def) of
+                  (EnumeratorDef _, EnumeratorDef _) -> True
+                  (EnumeratorDef _, _) -> True
+                  (_, EnumeratorDef _) -> True
+                  (_,_) -> True
+
+data TagEntryKind = CompKind CompTyKind | EnumKind
+                    deriving (Eq,Ord)
+instance Show TagEntryKind where
+  show (CompKind ctk) = show ctk
+  show EnumKind = "enum"
+
+-- | @sameTagKind ty1 ty2@ returns @True@ if @ty1,ty2@ are the same kind of tag (struct,union or enum)
+tagKind :: TagEntry -> TagEntryKind
+tagKind (Left (CompDecl cd)) = CompKind (compTag cd)
+tagKind (Left (EnumDecl _)) = EnumKind
+tagKind (Right (CompDef cd)) = CompKind (compTag cd)
+tagKind (Right (EnumDef _)) =  EnumKind
+
+compatTagEntry :: TagEntry -> TagEntry -> Bool
+compatTagEntry  te1 te2 = tagKind te1 == tagKind te2
+
+defRedeclStatus :: (t -> t -> Bool) -> t -> Maybe t -> DeclarationStatus t
+defRedeclStatus sameKind def oldDecl =
+    case oldDecl of
+        Just def' | def `sameKind` def' -> Redeclared def'
+                  | otherwise           -> KindMismatch def'
+        Nothing                         -> NewDecl
+
+defRedeclStatusLocal :: (Ord k) =>
+                        (t -> t -> Bool) -> k -> t -> Maybe t -> NameSpaceMap k t -> DeclarationStatus t
+defRedeclStatusLocal sameKind ident def oldDecl nsm =
+    case defRedeclStatus sameKind def oldDecl of
+        NewDecl -> case lookupName nsm ident of
+                     Just shadowed -> Shadowed shadowed
+                     Nothing       -> NewDecl
+        redecl  -> redecl
+
+defineTypeDef :: Ident -> TypeDef -> DefTable -> (DeclarationStatus IdentEntry, DefTable)
+defineTypeDef ident tydef deftbl =
+  (defRedeclStatus compatIdentEntry (Left tydef) oldDecl, deftbl { identDecls = decls' })
+  where
+  (decls', oldDecl) = defLocal (identDecls deftbl) ident (Left tydef)
+
+-- | declare\/define a global object\/function\/typeDef
+--
+--  returns @Redeclared def@ if there is already an object\/function\/typeDef
+--  in global scope, or @DifferentKindRedec def@ if the old declaration is of a different kind.
+defineGlobalIdent :: Ident -> IdentDecl -> DefTable -> (DeclarationStatus IdentEntry, DefTable)
+defineGlobalIdent ident def deftbl =
+    (defRedeclStatus compatIdentEntry (Right def) oldDecl, deftbl { identDecls = decls' })
+    where
+    (decls',oldDecl) = defGlobal (identDecls deftbl) ident (Right def)
+-- | declare\/define a object\/function\/typeDef with lexical scope
+--
+--  returns @Redeclared def@ or @DifferentKindRedec def@  if there is already an object\/function\/typeDef
+--  in the same scope.
+defineScopedIdent :: Ident -> IdentDecl -> DefTable -> (DeclarationStatus IdentEntry, DefTable)
+defineScopedIdent = defineScopedIdentWhen (const True)
+
+-- | declare\/define a object\/function\/typeDef with lexical scope, if the given predicate holds on the old
+--   entry.
+--
+--  returns @Keep old_def@ if the old definition shouldn't be overwritten, and otherwise @Redeclared def@ or
+--  @DifferentKindRedecl def@  if there is already an object\/function\/typeDef in the same scope.
+defineScopedIdentWhen :: (IdentDecl -> Bool) -> Ident -> IdentDecl -> DefTable ->
+                           (DeclarationStatus IdentEntry, DefTable)
+defineScopedIdentWhen override_def ident def deftbl
+    = (redecl_status, deftbl { identDecls = decls' })
+    where
+    new_def = Right def
+    old_decls = identDecls deftbl
+    old_decl_opt = lookupInnermostScope old_decls ident
+    (decls',redecl_status)  | (Just old_decl) <- old_decl_opt, not (old_decl `compatIdentEntry` new_def)
+                              = (new_decls, KindMismatch old_decl)
+                            | maybe True doOverride old_decl_opt
+                              = (new_decls, redeclStatus' old_decl_opt)
+                            | otherwise
+                              = (old_decls, maybe NewDecl KeepDef old_decl_opt)
+    new_decls = fst (defLocal old_decls ident new_def)
+    doOverride (Left _) = False
+    doOverride (Right old_def) = override_def old_def
+    redeclStatus' overriden_decl = defRedeclStatusLocal compatIdentEntry ident new_def overriden_decl old_decls
+
+-- | declare a tag (fwd decl in case the struct name isn't defined yet)
+declareTag :: SUERef -> TagFwdDecl -> DefTable -> (DeclarationStatus TagEntry, DefTable)
+declareTag sueref decl deftbl =
+  case lookupTag sueref deftbl of
+    Nothing -> (NewDecl, deftbl { tagDecls = fst $ defLocal (tagDecls deftbl) sueref (Left decl) })
+    Just old_def | tagKind old_def == tagKind (Left decl) ->  (KeepDef old_def, deftbl)
+                 | otherwise -> (KindMismatch old_def, deftbl)
+
+-- | define a tag
+defineTag :: SUERef -> TagDef -> DefTable -> (DeclarationStatus TagEntry, DefTable)
+defineTag sueref def deftbl =
+    (redeclStatus, deftbl { tagDecls = decls'})
+    where
+    (decls',olddecl) = defLocal (tagDecls deftbl) sueref (Right def)
+    redeclStatus =
+      case olddecl of
+        Just fwd_decl@(Left _) | tagKind fwd_decl == tagKind (Right def) -> NewDecl -- should be NewDef
+                               | otherwise -> KindMismatch fwd_decl
+        _ -> defRedeclStatusLocal compatTagEntry sueref (Right def) olddecl (tagDecls deftbl)
+
+-- | define a label
+-- Return the old label if it is already defined in this function's scope
+defineLabel :: Ident -> DefTable -> (DeclarationStatus Ident, DefTable)
+defineLabel ident deftbl =
+    let (labels',old_label) = defLocal (labelDefs deftbl) ident ident
+    in  (maybe NewDecl Redeclared old_label, deftbl { labelDefs = labels' })
+
+-- | lookup identifier (object, function, typeDef, enumerator)
+lookupIdent :: Ident -> DefTable -> Maybe IdentEntry
+lookupIdent ident deftbl = lookupName (identDecls deftbl) ident
+
+-- | lookup tag
+lookupTag :: SUERef -> DefTable -> Maybe TagEntry
+lookupTag sue_ref deftbl = lookupName (tagDecls deftbl) sue_ref
+
+-- | lookup label
+lookupLabel :: Ident -> DefTable -> Maybe Ident
+lookupLabel ident deftbl = lookupName (labelDefs deftbl) ident
+
+-- | lookup an object in the innermost scope
+lookupIdentInner :: Ident -> DefTable -> Maybe IdentEntry
+lookupIdentInner ident deftbl = lookupInnermostScope (identDecls deftbl) ident
+
+-- | lookup an identifier in the innermost scope
+lookupTagInner :: SUERef -> DefTable -> Maybe TagEntry
+lookupTagInner sue_ref deftbl = lookupInnermostScope (tagDecls deftbl) sue_ref
+
+-- | Record the type of a node.
+insertType :: DefTable -> Name -> Type -> DefTable
+insertType dt n t = dt { typeTable = IntMap.insert (nameId n) t (typeTable dt) }
+
+-- | Lookup the type of a node.
+lookupType :: DefTable -> Name -> Maybe Type
+lookupType dt n = IntMap.lookup (nameId n) (typeTable dt)
+
+-- | Merge two DefTables. If both tables contain an entry for a given
+--   key, they must agree on its value.
+mergeDefTable :: DefTable -> DefTable -> DefTable
+mergeDefTable (DefTable i1 t1 l1 m1 r1 tt1) (DefTable i2 t2 l2 m2 r2 tt2) =
+  DefTable
+  (mergeNameSpace i1 i2)
+  (mergeNameSpace t1 t2)
+  (mergeNameSpace l1 l2)
+  (mergeNameSpace m1 m2)
+  (union r1 r2)
+  (union tt1 tt2)
+
src/Language/C/Analysis/Export.hs view
@@ -1,232 +1,233 @@--------------------------------------------------------------------------------- |--- Module      :  Language.C.Analysis.Export--- Copyright   :  (c) 2008 Benedikt Huber--- License     :  BSD-style--- Maintainer  :  benedikt.huber@gmail.com--- Stability   :  prototype--- Portability :  ghc------ /WARNING/ : This is just an implementation sketch and not very well tested.------ Export 'SemRep' entities to 'AST' nodes.-------------------------------------------------------------------------------module Language.C.Analysis.Export (-exportDeclr,-exportType, exportTypeDecl, exportTypeSpec,-exportTypeDef,-exportCompType, exportCompTypeDecl, exportCompTypeRef,-exportEnumType, exportEnumTypeDecl, exportEnumTypeRef,-)-where-import Language.C.Data.Ident-import Language.C.Data.Name (nameId)-import Language.C.Data.Node-import Language.C.Syntax.AST-import Language.C.Analysis.SemRep-import Data.Maybe---- |Export Declarator------  Synopsis: @exportDeclr other_specs type attributes variable-name@-exportDeclr :: [CDeclSpec] -> Type -> Attributes -> VarName -> ([CDeclSpec],CDeclr)-exportDeclr other_specs ty attrs name =-    (other_specs ++ specs, CDeclr ident derived asmname (exportAttrs attrs) ni)-    where-    (specs,derived) = exportType ty-    (ident,asmname) = case name of (VarName vident asmname_opt) -> (Just vident, asmname_opt)-                                   _ -> (Nothing,Nothing)--exportTypeDecl :: Type -> CDecl-exportTypeDecl ty =-  CDecl declspecs declrs ni-  where-  (declspecs,derived) = exportType ty-  declrs | null derived = []-         | otherwise = [(Just $ CDeclr Nothing derived Nothing [] ni,Nothing,Nothing)]--exportTypeDef :: TypeDef -> CDecl-exportTypeDef (TypeDef ident ty attrs node_info) =-  CDecl (CStorageSpec (CTypedef ni) : declspecs) [declr] node_info-  where-  (declspecs,derived) = exportType ty-  declr = (Just $ CDeclr (Just ident) derived Nothing (exportAttrs attrs) ni, Nothing, Nothing)---- |Export a type to syntax-exportType :: Type -> ([CDeclSpec],[CDerivedDeclr])-exportType ty = exportTy [] ty-  where-    exportTy dd (PtrType ity tyquals attrs) =-        let ptr_declr = CPtrDeclr (exportTypeQualsAttrs tyquals attrs) ni-        in  exportTy (ptr_declr : dd) ity-    exportTy dd (ArrayType ity array_sz tyquals attrs) =-        let arr_declr = CArrDeclr (exportTypeQualsAttrs tyquals attrs) (exportArraySize array_sz) ni-        in  exportTy (arr_declr : dd) ity-    exportTy dd (FunctionType (FunType ity params variadic) attrs) =-        let fun_declr = CFunDeclr (Right (map exportParamDecl params,variadic)) (exportAttrs attrs) ni-        in  exportTy (fun_declr : dd) ity-    exportTy dd (FunctionType (FunTypeIncomplete ity) attrs) =-        let fun_declr = CFunDeclr (Right ([],False)) (exportAttrs attrs) ni-        in  exportTy (fun_declr : dd) ity-    exportTy dd (TypeDefType (TypeDefRef ty_ident _ node) quals attrs) =-        let declspecs =   CTypeSpec (CTypeDef ty_ident node)-                        : map CTypeQual (exportTypeQualsAttrs quals attrs)-        in (declspecs, reverse dd)-    exportTy dd (DirectType ity quals attrs) =-        let declspecs =    map CTypeQual (exportTypeQualsAttrs quals attrs)-                        ++ map CTypeSpec (exportTypeSpec ity)-        in (declspecs, reverse dd)--exportTypeQuals :: TypeQuals -> [CTypeQual]-exportTypeQuals quals = mapMaybe select [(constant,CConstQual ni),(volatile,CVolatQual ni),(restrict,CRestrQual ni)]-    where-    select (predicate,tyqual) | predicate quals = Just tyqual-                              | otherwise       = Nothing--exportTypeQualsAttrs :: TypeQuals -> Attributes -> [CTypeQual]-exportTypeQualsAttrs tyqs attrs = (exportTypeQuals tyqs ++ map CAttrQual (exportAttrs attrs))--exportArraySize :: ArraySize -> CArrSize-exportArraySize (ArraySize static e) = CArrSize static e-exportArraySize (UnknownArraySize complete) = CNoArrSize complete--exportTypeSpec :: TypeName -> [CTypeSpec]-exportTypeSpec tyname =-    case tyname of-        TyVoid -> [CVoidType ni]-        TyIntegral ity -> exportIntType ity-        TyFloating fty -> exportFloatType fty-        TyComplex fty -> exportComplexType fty-        TyComp comp -> exportCompTypeDecl comp-        TyEnum enum -> exportEnumTypeDecl enum-        TyBuiltin TyVaList -> [CTypeDef (internalIdent "va_list") ni]-        TyBuiltin TyAny -> [CTypeDef (internalIdent "__ty_any") ni]--exportIntType :: IntType -> [CTypeSpec]-exportIntType ty =-    case ty of-      TyBool    -> [CBoolType ni]-      TyChar    -> [CCharType ni]-      TySChar   -> [CSignedType ni,CCharType ni]-      TyUChar   -> [CUnsigType ni,CCharType ni]-      TyShort   -> [CShortType ni]-      TyUShort  -> [CUnsigType ni, CShortType ni]-      TyInt     -> [CIntType ni]-      TyUInt    -> [CUnsigType ni, CIntType ni]-      TyInt128  -> [CInt128Type ni]-      TyUInt128 -> [CUnsigType ni, CInt128Type ni]-      TyLong    -> [CLongType ni]-      TyULong   -> [CUnsigType ni,CLongType ni]-      TyLLong   -> [CLongType ni, CLongType ni]-      TyULLong  -> [CUnsigType ni, CLongType ni, CLongType ni]--exportFloatType :: FloatType -> [CTypeSpec]-exportFloatType ty =-    case ty of-      TyFloat   -> [CFloatType ni]-      TyDouble  -> [CDoubleType ni]-      TyLDouble -> [CLongType ni, CDoubleType ni]--exportComplexType :: FloatType -> [CTypeSpec]-exportComplexType ty = (CComplexType ni) : exportFloatType ty--exportCompTypeDecl :: CompTypeRef -> [CTypeSpec]-exportCompTypeDecl ty = [CSUType (exportComp ty) ni]-    where-    exportComp (CompTypeRef sue_ref comp_tag _n) =-        CStruct (if comp_tag == StructTag then CStructTag else CUnionTag)-                (exportSUERef sue_ref) Nothing [] ni--exportEnumTypeDecl :: EnumTypeRef -> [CTypeSpec]-exportEnumTypeDecl ty = [CEnumType (exportEnum ty) ni]-    where-    exportEnum (EnumTypeRef sue_ref _n) =-        CEnum (exportSUERef sue_ref) Nothing [] ni--exportCompType :: CompType -> [CTypeSpec]-exportCompType (CompType sue_ref comp_tag members attrs node_info) = [CSUType comp ni]-    where-    comp = CStruct (if comp_tag == StructTag then CStructTag else CUnionTag)-                   (exportSUERef sue_ref)-                   (Just (map exportMemberDecl members))-                   (exportAttrs attrs)-                   node_info-exportCompTypeRef :: CompType -> [CTypeSpec]-exportCompTypeRef (CompType sue_ref com_tag  _ _ node_info) = exportCompTypeDecl (CompTypeRef sue_ref com_tag node_info)--exportEnumType :: EnumType -> [CTypeSpec]-exportEnumType (EnumType sue_ref enumerators attrs node_info) = [CEnumType enum ni]-    where-    enum = CEnum (exportSUERef sue_ref)-                 (Just (map exportEnumerator enumerators))-                 (exportAttrs attrs)-                 node_info-    exportEnumerator (Enumerator ident val _ty _) = (ident,Just val)--exportEnumTypeRef :: EnumType -> [CTypeSpec]-exportEnumTypeRef (EnumType sue_ref _ _ node_info) = exportEnumTypeDecl (EnumTypeRef sue_ref node_info)---- XXX: relies on a the source program not having any $'s in it-exportSUERef :: SUERef -> Maybe Ident-exportSUERef (AnonymousRef name) = Just (internalIdent $ "$" ++ show (nameId name))-exportSUERef (NamedRef ident) = Just ident--exportMemberDecl :: MemberDecl -> CDecl-exportMemberDecl (AnonBitField ty expr node_info) =-    CDecl (map CTypeSpec $ exportTypeSpec $ fromDirectType ty) [(Nothing,Nothing,Just expr)] node_info-exportMemberDecl (MemberDecl vardecl bitfieldsz node_info) =-    let (specs,declarator) = exportVarDecl vardecl-    in  CDecl specs [(Just declarator, Nothing, bitfieldsz)] node_info-exportVarDecl :: VarDecl -> ([CDeclSpec],CDeclr)---- NOTE: that there is an ambiguity between two possible places for __attributes__ s here-exportVarDecl (VarDecl name attrs ty) = exportDeclr (exportDeclAttrs attrs) ty [] name-exportParamDecl :: ParamDecl -> CDecl-exportParamDecl paramdecl =-    let (specs,declr) = exportVarDecl (getVarDecl paramdecl)-    in CDecl specs [(Just declr, Nothing , Nothing) ] (nodeInfo paramdecl)--exportDeclAttrs :: DeclAttrs -> [CDeclSpec]-exportDeclAttrs (DeclAttrs fun_attrs storage attrs) =-       map CFunSpec (exportFunAttrs fun_attrs)-    ++ map CStorageSpec (exportStorage storage)-    ++ map (CTypeQual . CAttrQual) (exportAttrs attrs)---- | export function attributes to C function specifiers-exportFunAttrs :: FunctionAttrs -> [CFunSpec]-exportFunAttrs fattrs = catMaybes [inlQual, noretQual]-  where-    inlQual = if isInline fattrs then Just (CInlineQual ni) else Nothing-    noretQual = if isNoreturn fattrs then Just (CNoreturnQual ni) else Nothing---- | express storage in terms of storage specifiers.------ This isn't always possible and depends on the context the identifier is declared.--- Most importantly, if there is a /conflicting/ declaration in scope, export is impossible.--- Furthermore, automatic storage is impossible in file scope.--- If the storage can actually be specified, the export is correct.-exportStorage :: Storage -> [CStorageSpec]-exportStorage NoStorage = []-exportStorage (Auto reg) = if reg then [CRegister ni] else []-exportStorage (Static InternalLinkage thread_local) = threadLocal thread_local [CStatic ni]-exportStorage (Static ExternalLinkage thread_local) = threadLocal thread_local [CExtern ni]-exportStorage (Static NoLinkage _) = error "impossible storage: static without linkage"-exportStorage (FunLinkage InternalLinkage) = [CStatic ni]-exportStorage (FunLinkage ExternalLinkage) = []-exportStorage (FunLinkage NoLinkage) = error "impossible storage: function without linkage"--threadLocal :: Bool -> [CStorageSpec] -> [CStorageSpec]-threadLocal False = id-threadLocal True = ((CThread ni) :)--exportAttrs :: [Attr] -> [CAttr]-exportAttrs = map exportAttr where-    exportAttr (Attr ident es n) = CAttr ident es n--fromDirectType :: Type -> TypeName-fromDirectType (DirectType ty _ _) = ty-fromDirectType (TypeDefType (TypeDefRef _ ty _) _ _) = fromDirectType ty-fromDirectType _ = error "fromDirectType"--ni :: NodeInfo-ni = undefNode+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Analysis.Export
+-- Copyright   :  (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  prototype
+-- Portability :  ghc
+--
+-- /WARNING/ : This is just an implementation sketch and not very well tested.
+--
+-- Export 'SemRep' entities to 'AST' nodes.
+-----------------------------------------------------------------------------
+module Language.C.Analysis.Export (
+exportDeclr,
+exportType, exportTypeDecl, exportTypeSpec,
+exportTypeDef,
+exportCompType, exportCompTypeDecl, exportCompTypeRef,
+exportEnumType, exportEnumTypeDecl, exportEnumTypeRef,
+)
+where
+import Language.C.Data.Ident
+import Language.C.Data.Name (nameId)
+import Language.C.Data.Node
+import Language.C.Syntax.AST
+import Language.C.Analysis.SemRep
+import Data.Maybe
+
+-- |Export Declarator
+--
+--  Synopsis: @exportDeclr other_specs type attributes variable-name@
+exportDeclr :: [CDeclSpec] -> Type -> Attributes -> VarName -> ([CDeclSpec],CDeclr)
+exportDeclr other_specs ty attrs name =
+    (other_specs ++ specs, CDeclr ident derived asmname (exportAttrs attrs) ni)
+    where
+    (specs,derived) = exportType ty
+    (ident,asmname) = case name of (VarName vident asmname_opt) -> (Just vident, asmname_opt)
+                                   _ -> (Nothing,Nothing)
+
+exportTypeDecl :: Type -> CDecl
+exportTypeDecl ty =
+  CDecl declspecs declrs ni
+  where
+  (declspecs,derived) = exportType ty
+  declrs | null derived = []
+         | otherwise = [(Just $ CDeclr Nothing derived Nothing [] ni,Nothing,Nothing)]
+
+exportTypeDef :: TypeDef -> CDecl
+exportTypeDef (TypeDef ident ty attrs node_info) =
+  CDecl (CStorageSpec (CTypedef ni) : declspecs) [declr] node_info
+  where
+  (declspecs,derived) = exportType ty
+  declr = (Just $ CDeclr (Just ident) derived Nothing (exportAttrs attrs) ni, Nothing, Nothing)
+
+-- |Export a type to syntax
+exportType :: Type -> ([CDeclSpec],[CDerivedDeclr])
+exportType ty = exportTy [] ty
+  where
+    exportTy dd (PtrType ity tyquals attrs) =
+        let ptr_declr = CPtrDeclr (exportTypeQualsAttrs tyquals attrs) ni
+        in  exportTy (ptr_declr : dd) ity
+    exportTy dd (ArrayType ity array_sz tyquals attrs) =
+        let arr_declr = CArrDeclr (exportTypeQualsAttrs tyquals attrs) (exportArraySize array_sz) ni
+        in  exportTy (arr_declr : dd) ity
+    exportTy dd (FunctionType (FunType ity params variadic) attrs) =
+        let fun_declr = CFunDeclr (Right (map exportParamDecl params,variadic)) (exportAttrs attrs) ni
+        in  exportTy (fun_declr : dd) ity
+    exportTy dd (FunctionType (FunTypeIncomplete ity) attrs) =
+        let fun_declr = CFunDeclr (Right ([],False)) (exportAttrs attrs) ni
+        in  exportTy (fun_declr : dd) ity
+    exportTy dd (TypeDefType (TypeDefRef ty_ident _ node) quals attrs) =
+        let declspecs =   CTypeSpec (CTypeDef ty_ident node)
+                        : map CTypeQual (exportTypeQualsAttrs quals attrs)
+        in (declspecs, reverse dd)
+    exportTy dd (DirectType ity quals attrs) =
+        let declspecs =    map CTypeQual (exportTypeQualsAttrs quals attrs)
+                        ++ map CTypeSpec (exportTypeSpec ity)
+        in (declspecs, reverse dd)
+
+exportTypeQuals :: TypeQuals -> [CTypeQual]
+exportTypeQuals quals = mapMaybe select [(constant,CConstQual ni),(volatile,CVolatQual ni),(restrict,CRestrQual ni)]
+    where
+    select (predicate,tyqual) | predicate quals = Just tyqual
+                              | otherwise       = Nothing
+
+exportTypeQualsAttrs :: TypeQuals -> Attributes -> [CTypeQual]
+exportTypeQualsAttrs tyqs attrs = (exportTypeQuals tyqs ++ map CAttrQual (exportAttrs attrs))
+
+exportArraySize :: ArraySize -> CArrSize
+exportArraySize (ArraySize static e) = CArrSize static e
+exportArraySize (UnknownArraySize complete) = CNoArrSize complete
+
+exportTypeSpec :: TypeName -> [CTypeSpec]
+exportTypeSpec tyname =
+    case tyname of
+        TyVoid -> [CVoidType ni]
+        TyIntegral ity -> exportIntType ity
+        TyFloating fty -> exportFloatType fty
+        TyComplex fty -> exportComplexType fty
+        TyComp comp -> exportCompTypeDecl comp
+        TyEnum enum -> exportEnumTypeDecl enum
+        TyBuiltin TyVaList -> [CTypeDef (internalIdent "va_list") ni]
+        TyBuiltin TyAny -> [CTypeDef (internalIdent "__ty_any") ni]
+
+exportIntType :: IntType -> [CTypeSpec]
+exportIntType ty =
+    case ty of
+      TyBool    -> [CBoolType ni]
+      TyChar    -> [CCharType ni]
+      TySChar   -> [CSignedType ni,CCharType ni]
+      TyUChar   -> [CUnsigType ni,CCharType ni]
+      TyShort   -> [CShortType ni]
+      TyUShort  -> [CUnsigType ni, CShortType ni]
+      TyInt     -> [CIntType ni]
+      TyUInt    -> [CUnsigType ni, CIntType ni]
+      TyInt128  -> [CInt128Type ni]
+      TyUInt128 -> [CUnsigType ni, CInt128Type ni]
+      TyLong    -> [CLongType ni]
+      TyULong   -> [CUnsigType ni,CLongType ni]
+      TyLLong   -> [CLongType ni, CLongType ni]
+      TyULLong  -> [CUnsigType ni, CLongType ni, CLongType ni]
+
+exportFloatType :: FloatType -> [CTypeSpec]
+exportFloatType ty =
+    case ty of
+      TyFloat   -> [CFloatType ni]
+      TyDouble  -> [CDoubleType ni]
+      TyLDouble -> [CLongType ni, CDoubleType ni]
+      TyFloat128 -> [CFloat128Type ni]
+
+exportComplexType :: FloatType -> [CTypeSpec]
+exportComplexType ty = (CComplexType ni) : exportFloatType ty
+
+exportCompTypeDecl :: CompTypeRef -> [CTypeSpec]
+exportCompTypeDecl ty = [CSUType (exportComp ty) ni]
+    where
+    exportComp (CompTypeRef sue_ref comp_tag _n) =
+        CStruct (if comp_tag == StructTag then CStructTag else CUnionTag)
+                (exportSUERef sue_ref) Nothing [] ni
+
+exportEnumTypeDecl :: EnumTypeRef -> [CTypeSpec]
+exportEnumTypeDecl ty = [CEnumType (exportEnum ty) ni]
+    where
+    exportEnum (EnumTypeRef sue_ref _n) =
+        CEnum (exportSUERef sue_ref) Nothing [] ni
+
+exportCompType :: CompType -> [CTypeSpec]
+exportCompType (CompType sue_ref comp_tag members attrs node_info) = [CSUType comp ni]
+    where
+    comp = CStruct (if comp_tag == StructTag then CStructTag else CUnionTag)
+                   (exportSUERef sue_ref)
+                   (Just (map exportMemberDecl members))
+                   (exportAttrs attrs)
+                   node_info
+exportCompTypeRef :: CompType -> [CTypeSpec]
+exportCompTypeRef (CompType sue_ref com_tag  _ _ node_info) = exportCompTypeDecl (CompTypeRef sue_ref com_tag node_info)
+
+exportEnumType :: EnumType -> [CTypeSpec]
+exportEnumType (EnumType sue_ref enumerators attrs node_info) = [CEnumType enum ni]
+    where
+    enum = CEnum (exportSUERef sue_ref)
+                 (Just (map exportEnumerator enumerators))
+                 (exportAttrs attrs)
+                 node_info
+    exportEnumerator (Enumerator ident val _ty _) = (ident,Just val)
+
+exportEnumTypeRef :: EnumType -> [CTypeSpec]
+exportEnumTypeRef (EnumType sue_ref _ _ node_info) = exportEnumTypeDecl (EnumTypeRef sue_ref node_info)
+
+-- XXX: relies on a the source program not having any $'s in it
+exportSUERef :: SUERef -> Maybe Ident
+exportSUERef (AnonymousRef name) = Just (internalIdent $ "$" ++ show (nameId name))
+exportSUERef (NamedRef ident) = Just ident
+
+exportMemberDecl :: MemberDecl -> CDecl
+exportMemberDecl (AnonBitField ty expr node_info) =
+    CDecl (map CTypeSpec $ exportTypeSpec $ fromDirectType ty) [(Nothing,Nothing,Just expr)] node_info
+exportMemberDecl (MemberDecl vardecl bitfieldsz node_info) =
+    let (specs,declarator) = exportVarDecl vardecl
+    in  CDecl specs [(Just declarator, Nothing, bitfieldsz)] node_info
+exportVarDecl :: VarDecl -> ([CDeclSpec],CDeclr)
+
+-- NOTE: that there is an ambiguity between two possible places for __attributes__ s here
+exportVarDecl (VarDecl name attrs ty) = exportDeclr (exportDeclAttrs attrs) ty [] name
+exportParamDecl :: ParamDecl -> CDecl
+exportParamDecl paramdecl =
+    let (specs,declr) = exportVarDecl (getVarDecl paramdecl)
+    in CDecl specs [(Just declr, Nothing , Nothing) ] (nodeInfo paramdecl)
+
+exportDeclAttrs :: DeclAttrs -> [CDeclSpec]
+exportDeclAttrs (DeclAttrs fun_attrs storage attrs) =
+       map CFunSpec (exportFunAttrs fun_attrs)
+    ++ map CStorageSpec (exportStorage storage)
+    ++ map (CTypeQual . CAttrQual) (exportAttrs attrs)
+
+-- | export function attributes to C function specifiers
+exportFunAttrs :: FunctionAttrs -> [CFunSpec]
+exportFunAttrs fattrs = catMaybes [inlQual, noretQual]
+  where
+    inlQual = if isInline fattrs then Just (CInlineQual ni) else Nothing
+    noretQual = if isNoreturn fattrs then Just (CNoreturnQual ni) else Nothing
+
+-- | express storage in terms of storage specifiers.
+--
+-- This isn't always possible and depends on the context the identifier is declared.
+-- Most importantly, if there is a /conflicting/ declaration in scope, export is impossible.
+-- Furthermore, automatic storage is impossible in file scope.
+-- If the storage can actually be specified, the export is correct.
+exportStorage :: Storage -> [CStorageSpec]
+exportStorage NoStorage = []
+exportStorage (Auto reg) = if reg then [CRegister ni] else []
+exportStorage (Static InternalLinkage thread_local) = threadLocal thread_local [CStatic ni]
+exportStorage (Static ExternalLinkage thread_local) = threadLocal thread_local [CExtern ni]
+exportStorage (Static NoLinkage _) = error "impossible storage: static without linkage"
+exportStorage (FunLinkage InternalLinkage) = [CStatic ni]
+exportStorage (FunLinkage ExternalLinkage) = []
+exportStorage (FunLinkage NoLinkage) = error "impossible storage: function without linkage"
+
+threadLocal :: Bool -> [CStorageSpec] -> [CStorageSpec]
+threadLocal False = id
+threadLocal True = ((CThread ni) :)
+
+exportAttrs :: [Attr] -> [CAttr]
+exportAttrs = map exportAttr where
+    exportAttr (Attr ident es n) = CAttr ident es n
+
+fromDirectType :: Type -> TypeName
+fromDirectType (DirectType ty _ _) = ty
+fromDirectType (TypeDefType (TypeDefRef _ ty _) _ _) = fromDirectType ty
+fromDirectType _ = error "fromDirectType"
+
+ni :: NodeInfo
+ni = undefNode
src/Language/C/Analysis/NameSpaceMap.hs view
@@ -1,159 +1,159 @@--------------------------------------------------------------------------------- |--- Module      :  Language.C.Analysis.NameSpaceMap--- Copyright   :  (c) [1995..1999] Manuel M. T. Chakravarty---                (c) 2008 Benedikt Huber--- License     :  BSD-style--- Maintainer  :  benedikt.huber@gmail.com--- Stability   :  alpha--- Portability :  portable------ This module manages name spaces.------  * A name space map associates identifiers with their definition.------  * Each name space map is organized in a hierarchical way using the notion of---    scopes. A name space map, at any moment, always has a global scope and may---    have several local scopes. Definitions in inner scopes hide definitions---    of the same identifier in outer scopes.----module Language.C.Analysis.NameSpaceMap (-    -- * name space maps-    NameSpaceMap, nameSpaceMap, nsMapToList,-    globalNames,localNames,hasLocalNames,-    -- * scope modification-    defGlobal,-    enterNewScope, leaveScope,-    defLocal,-    lookupName,lookupGlobal,lookupInnermostScope,-    mergeNameSpace-    )-where-import Prelude hiding (lookup)-import qualified Prelude-import qualified Data.Map as Map (empty, insert, lookup, toList, union)-import qualified Data.List as List (unionBy)-import Data.Map   (Map)--{--C Namespaces and scopes:----}---- DevDocs:------ * the definitions in the global scope are stored in a finite map, because---   they tend to be a lot.------ * the definitions of the local scopes are stored in a single list, usually---   they are not very many and the definitions entered last are the most---   frequently accessed ones; the list structure naturally hides older---   definitions, i.e., definitions from outer scopes; adding new definitions---   is done in time proportinal to the current size of the scope; removing a---   scope is done in constant time (and the definitions of a scope can be---   returned as a result of leaving the scope); lookup is proportional to the---   number of definitions in the local scopes and the logarithm of the number---   of definitions in the global scope -- i.e., efficiency relies on a---   relatively low number of local definitions together with frequent lookup---   of the most recently defined local identifiers------- | @NameSpaceMap a@ is a Map from identifiers to @a@, which manages--- global and local name spaces.-data NameSpaceMap k v = NsMap (Map k v)  -- defs in global scope-                              [[(k, v)]] -- stack of local scopes-globalNames :: (Ord k) => NameSpaceMap k v -> Map k v-globalNames (NsMap g _) = g-hasLocalNames :: NameSpaceMap k v -> Bool-hasLocalNames (NsMap _ l) = not (null l)-localNames :: (Ord k) => NameSpaceMap k v -> [[(k,v)]]-localNames (NsMap _ l) = l---- | create a name space-nameSpaceMap :: (Ord k) => NameSpaceMap k v-nameSpaceMap  = NsMap Map.empty []------ | Add global definition------ @(ns',oldDef) = defGlobal ns ident def@---   adds a global definition @ident := def@ to the namespace.---   It returns the modified namespace @ns'@. If the identifier is---   already declared in the global namespace, the definition is overwritten---   and the old definition @oldDef@ is returned.-defGlobal :: (Ord k) => NameSpaceMap k a -> k -> a -> (NameSpaceMap k a, Maybe a)-defGlobal (NsMap gs lss) ident def-    = (NsMap (Map.insert ident def gs) lss, Map.lookup ident gs)---- | Enter new local scope------ @ns' = enterNewScope ns@ creates and enters a new local scope.-enterNewScope :: (Ord k) => NameSpaceMap k a -> NameSpaceMap k a-enterNewScope (NsMap gs lss)  = NsMap gs ([]:lss)---- | Leave innermost local scope------ @(ns',defs) = leaveScope ns@ pops leaves the innermost local scope.---  and returns its definitions-leaveScope :: (Ord k) => NameSpaceMap k a -> (NameSpaceMap k a, [(k, a)])-leaveScope (NsMap _ [])         = error "NsMaps.leaveScope: No local scope!"-leaveScope (NsMap gs (ls:lss))  = (NsMap gs lss, ls)---- | Add local definition------ @(ns',oldDef) = defLocal ns ident def@ adds the local definition---   @ident := def@ to the innermost local scope, if there is a local scope,---     and to the global scope otherwise.---   It returns the modified name space @ns'@ and the old  binding of---   the identifier @oldDef@, which is overwritten.-defLocal :: (Ord k) => NameSpaceMap k a -> k -> a -> (NameSpaceMap k a, Maybe a)-defLocal ns@(NsMap _ []) ident def = defGlobal ns ident def-defLocal (NsMap    gs (ls:lss)) ident def =-  (NsMap gs (((ident, def):ls):lss),-   Prelude.lookup ident ls)---- | Search for a definition------ @def = find ns ident@ returns the definition in some scope (inner to outer),--- if there is one.-lookupName :: (Ord k) => NameSpaceMap k a -> k -> Maybe a-lookupName ns@(NsMap _ localDefs) ident-    = case lookupLocal localDefs of-        Nothing  -> lookupGlobal ns ident-        Just def -> Just def-  where-    lookupLocal []       = Nothing-    lookupLocal (ls:lss) =-      case Prelude.lookup ident ls of-        Nothing  -> lookupLocal lss-        Just def -> Just def--lookupGlobal :: (Ord k) => NameSpaceMap k a -> k -> Maybe a-lookupGlobal (NsMap gs _) ident = Map.lookup ident gs--lookupInnermostScope :: (Ord k) => NameSpaceMap k a -> k -> Maybe a-lookupInnermostScope nsm@(NsMap _gs localDefs) ident  =-    case localDefs of-        (ls : _lss) -> Prelude.lookup ident ls-        [] -> lookupGlobal nsm ident---- | flatten a namespace into a assoc list------  @nameSpaceToList ns = (localDefInnermost ns ++ .. ++ localDefsOutermost ns) ++ globalDefs ns@-nsMapToList :: (Ord k) => NameSpaceMap k a -> [(k, a)]-nsMapToList (NsMap gs lss)  = concat lss ++ Map.toList gs---- | Merge two namespaces. If they disagree on the types of any---   variables, all bets are off.-mergeNameSpace :: (Ord k) =>-                  NameSpaceMap k a-               -> NameSpaceMap k a-               -> NameSpaceMap k a-mergeNameSpace (NsMap global1 local1) (NsMap global2 local2) =-  NsMap (Map.union global1 global2) (localUnion local1 local2)-  where localUnion (l1:ls1) (l2:ls2) =-          List.unionBy (\p1 p2 -> fst p1 == fst p2) l1 l2 : localUnion ls1 ls2-        localUnion [] ls2 = ls2-        localUnion ls1 [] = ls1+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Analysis.NameSpaceMap
+-- Copyright   :  (c) [1995..1999] Manuel M. T. Chakravarty
+--                (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  alpha
+-- Portability :  portable
+--
+-- This module manages name spaces.
+--
+--  * A name space map associates identifiers with their definition.
+--
+--  * Each name space map is organized in a hierarchical way using the notion of
+--    scopes. A name space map, at any moment, always has a global scope and may
+--    have several local scopes. Definitions in inner scopes hide definitions
+--    of the same identifier in outer scopes.
+--
+module Language.C.Analysis.NameSpaceMap (
+    -- * name space maps
+    NameSpaceMap, nameSpaceMap, nsMapToList,
+    globalNames,localNames,hasLocalNames,
+    -- * scope modification
+    defGlobal,
+    enterNewScope, leaveScope,
+    defLocal,
+    lookupName,lookupGlobal,lookupInnermostScope,
+    mergeNameSpace
+    )
+where
+import Prelude hiding (lookup)
+import qualified Prelude
+import qualified Data.Map as Map (empty, insert, lookup, toList, union)
+import qualified Data.List as List (unionBy)
+import Data.Map   (Map)
+
+{-
+C Namespaces and scopes:
+
+
+-}
+
+-- DevDocs:
+--
+-- * the definitions in the global scope are stored in a finite map, because
+--   they tend to be a lot.
+--
+-- * the definitions of the local scopes are stored in a single list, usually
+--   they are not very many and the definitions entered last are the most
+--   frequently accessed ones; the list structure naturally hides older
+--   definitions, i.e., definitions from outer scopes; adding new definitions
+--   is done in time proportinal to the current size of the scope; removing a
+--   scope is done in constant time (and the definitions of a scope can be
+--   returned as a result of leaving the scope); lookup is proportional to the
+--   number of definitions in the local scopes and the logarithm of the number
+--   of definitions in the global scope -- i.e., efficiency relies on a
+--   relatively low number of local definitions together with frequent lookup
+--   of the most recently defined local identifiers
+--
+
+-- | @NameSpaceMap a@ is a Map from identifiers to @a@, which manages
+-- global and local name spaces.
+data NameSpaceMap k v = NsMap (Map k v)  -- defs in global scope
+                              [[(k, v)]] -- stack of local scopes
+globalNames :: (Ord k) => NameSpaceMap k v -> Map k v
+globalNames (NsMap g _) = g
+hasLocalNames :: NameSpaceMap k v -> Bool
+hasLocalNames (NsMap _ l) = not (null l)
+localNames :: (Ord k) => NameSpaceMap k v -> [[(k,v)]]
+localNames (NsMap _ l) = l
+
+-- | create a name space
+nameSpaceMap :: (Ord k) => NameSpaceMap k v
+nameSpaceMap  = NsMap Map.empty []
+
+
+
+-- | Add global definition
+--
+-- @(ns',oldDef) = defGlobal ns ident def@
+--   adds a global definition @ident := def@ to the namespace.
+--   It returns the modified namespace @ns'@. If the identifier is
+--   already declared in the global namespace, the definition is overwritten
+--   and the old definition @oldDef@ is returned.
+defGlobal :: (Ord k) => NameSpaceMap k a -> k -> a -> (NameSpaceMap k a, Maybe a)
+defGlobal (NsMap gs lss) ident def
+    = (NsMap (Map.insert ident def gs) lss, Map.lookup ident gs)
+
+-- | Enter new local scope
+--
+-- @ns' = enterNewScope ns@ creates and enters a new local scope.
+enterNewScope :: (Ord k) => NameSpaceMap k a -> NameSpaceMap k a
+enterNewScope (NsMap gs lss)  = NsMap gs ([]:lss)
+
+-- | Leave innermost local scope
+--
+-- @(ns',defs) = leaveScope ns@ pops leaves the innermost local scope.
+--  and returns its definitions
+leaveScope :: (Ord k) => NameSpaceMap k a -> (NameSpaceMap k a, [(k, a)])
+leaveScope (NsMap _ [])         = error "NsMaps.leaveScope: No local scope!"
+leaveScope (NsMap gs (ls:lss))  = (NsMap gs lss, ls)
+
+-- | Add local definition
+--
+-- @(ns',oldDef) = defLocal ns ident def@ adds the local definition
+--   @ident := def@ to the innermost local scope, if there is a local scope,
+--     and to the global scope otherwise.
+--   It returns the modified name space @ns'@ and the old  binding of
+--   the identifier @oldDef@, which is overwritten.
+defLocal :: (Ord k) => NameSpaceMap k a -> k -> a -> (NameSpaceMap k a, Maybe a)
+defLocal ns@(NsMap _ []) ident def = defGlobal ns ident def
+defLocal (NsMap    gs (ls:lss)) ident def =
+  (NsMap gs (((ident, def):ls):lss),
+   Prelude.lookup ident ls)
+
+-- | Search for a definition
+--
+-- @def = find ns ident@ returns the definition in some scope (inner to outer),
+-- if there is one.
+lookupName :: (Ord k) => NameSpaceMap k a -> k -> Maybe a
+lookupName ns@(NsMap _ localDefs) ident
+    = case lookupLocal localDefs of
+        Nothing  -> lookupGlobal ns ident
+        Just def -> Just def
+  where
+    lookupLocal []       = Nothing
+    lookupLocal (ls:lss) =
+      case Prelude.lookup ident ls of
+        Nothing  -> lookupLocal lss
+        Just def -> Just def
+
+lookupGlobal :: (Ord k) => NameSpaceMap k a -> k -> Maybe a
+lookupGlobal (NsMap gs _) ident = Map.lookup ident gs
+
+lookupInnermostScope :: (Ord k) => NameSpaceMap k a -> k -> Maybe a
+lookupInnermostScope nsm@(NsMap _gs localDefs) ident  =
+    case localDefs of
+        (ls : _lss) -> Prelude.lookup ident ls
+        [] -> lookupGlobal nsm ident
+
+-- | flatten a namespace into a assoc list
+--
+--  @nameSpaceToList ns = (localDefInnermost ns ++ .. ++ localDefsOutermost ns) ++ globalDefs ns@
+nsMapToList :: (Ord k) => NameSpaceMap k a -> [(k, a)]
+nsMapToList (NsMap gs lss)  = concat lss ++ Map.toList gs
+
+-- | Merge two namespaces. If they disagree on the types of any
+--   variables, all bets are off.
+mergeNameSpace :: (Ord k) =>
+                  NameSpaceMap k a
+               -> NameSpaceMap k a
+               -> NameSpaceMap k a
+mergeNameSpace (NsMap global1 local1) (NsMap global2 local2) =
+  NsMap (Map.union global1 global2) (localUnion local1 local2)
+  where localUnion (l1:ls1) (l2:ls2) =
+          List.unionBy (\p1 p2 -> fst p1 == fst p2) l1 l2 : localUnion ls1 ls2
+        localUnion [] ls2 = ls2
+        localUnion ls1 [] = ls1
src/Language/C/Analysis/SemError.hs view
@@ -1,109 +1,109 @@-{-# LANGUAGE DeriveDataTypeable, GeneralizedNewtypeDeriving  #-}--------------------------------------------------------------------------------- |--- Module      :  Language.C.Analysis.SemError--- Copyright   :  (c) 2008 Benedikt Huber--- License     :  BSD-style--- Maintainer  :  benedikt.huber@gmail.com--- Stability   :  alpha--- Portability :  ghc------ Errors in the semantic analysis-------------------------------------------------------------------------------module Language.C.Analysis.SemError (-InvalidASTError(..), invalidAST,-BadSpecifierError(..), badSpecifierError,-TypeMismatch(..), typeMismatch,-RedefError(..), RedefInfo(..), RedefKind(..), redefinition,-)-where-import Data.Typeable---- this means we cannot use SemError in SemRep, but use rich types here-import Language.C.Analysis.SemRep--import Language.C.Data.Error-import Language.C.Data.Node---- here are the errors available---- | InvalidASTError is caused by the violation of an invariant in the AST-newtype InvalidASTError = InvalidAST ErrorInfo deriving (Typeable)--instance Error InvalidASTError where-    errorInfo (InvalidAST ei) = ei-    changeErrorLevel (InvalidAST ei) lvl' = InvalidAST (changeErrorLevel ei lvl')---- | BadSpecifierError is caused by an invalid combination of specifiers-newtype BadSpecifierError = BadSpecifierError ErrorInfo deriving (Typeable)--instance Error BadSpecifierError where-    errorInfo (BadSpecifierError ei) = ei-    changeErrorLevel (BadSpecifierError ei) lvl' = BadSpecifierError (changeErrorLevel ei lvl')---- | RedefError is caused by an invalid redefinition of the same identifier or type-data RedefError = RedefError ErrorLevel RedefInfo deriving Typeable--data RedefInfo = RedefInfo String RedefKind NodeInfo NodeInfo-data RedefKind = DuplicateDef | DiffKindRedecl | ShadowedDef | DisagreeLinkage |-                 NoLinkageOld-data TypeMismatch = TypeMismatch String (NodeInfo,Type) (NodeInfo,Type) deriving Typeable---- Invalid AST--- ~~~~~~~~~~~--instance Show InvalidASTError  where show = showError "AST invariant violated"--invalidAST :: NodeInfo -> String -> InvalidASTError-invalidAST node_info msg = InvalidAST (mkErrorInfo LevelError msg node_info)---- Bad specifier (e.g. static for a parameter, or extern when there is an initializer)--- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~--instance Show BadSpecifierError     where show = showError "Bad specifier"--badSpecifierError :: NodeInfo -> String -> BadSpecifierError-badSpecifierError node_info msg = BadSpecifierError (mkErrorInfo LevelError msg node_info)---- Type mismatch--- ~~~~~~~~~~~~~-typeMismatch :: String -> (NodeInfo, Type) -> (NodeInfo,Type) -> TypeMismatch-typeMismatch = TypeMismatch--instance Show TypeMismatch where-    show tm = showError "Type mismatch" (typeMismatchInfo tm)-instance Error TypeMismatch where-    errorInfo = typeMismatchInfo-typeMismatchInfo :: TypeMismatch -> ErrorInfo-typeMismatchInfo (TypeMismatch reason (node1,_ty2) _t2) =-    ErrorInfo LevelError (posOfNode node1) [reason]---- Redefinitions--- ~~~~~~~~~~~~~--instance Show RedefError  where-    show (RedefError lvl info) = showErrorInfo (redefErrLabel info) (redefErrorInfo lvl info)-instance Error RedefError where-    errorInfo (RedefError lvl info) = redefErrorInfo lvl info-    changeErrorLevel (RedefError _lvl info) lvl' = RedefError lvl' info--redefErrLabel :: RedefInfo -> String-redefErrLabel  (RedefInfo ident _ _ _) = ident ++ " redefined"--redefErrorInfo :: ErrorLevel -> RedefInfo -> ErrorInfo-redefErrorInfo lvl info@(RedefInfo _ _ node old_node) =-    ErrorInfo lvl (posOfNode node) ([redefErrReason info] ++ prevDeclMsg old_node)--redefErrReason :: RedefInfo -> String-redefErrReason (RedefInfo ident DuplicateDef _ _) = "duplicate definition of " ++ ident-redefErrReason (RedefInfo ident ShadowedDef _ _)   = "this declaration of " ++ ident ++ " shadows a previous one"-redefErrReason (RedefInfo ident DiffKindRedecl _ _) = ident ++ " previously declared as a different kind of symbol"-redefErrReason (RedefInfo ident DisagreeLinkage _ _) = ident ++ " previously declared with different linkage"-redefErrReason (RedefInfo ident NoLinkageOld _ _) = ident ++ " previously declared without linkage"--prevDeclMsg :: NodeInfo -> [String]-prevDeclMsg old_node = ["The previous declaration was here: ", show (posOfNode old_node)]--redefinition :: ErrorLevel -> String -> RedefKind -> NodeInfo -> NodeInfo -> RedefError-redefinition lvl ctx kind new old = RedefError lvl (RedefInfo ctx kind new old)-+{-# LANGUAGE DeriveDataTypeable, GeneralizedNewtypeDeriving  #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Analysis.SemError
+-- Copyright   :  (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  alpha
+-- Portability :  ghc
+--
+-- Errors in the semantic analysis
+-----------------------------------------------------------------------------
+module Language.C.Analysis.SemError (
+InvalidASTError(..), invalidAST,
+BadSpecifierError(..), badSpecifierError,
+TypeMismatch(..), typeMismatch,
+RedefError(..), RedefInfo(..), RedefKind(..), redefinition,
+)
+where
+import Data.Typeable
+
+-- this means we cannot use SemError in SemRep, but use rich types here
+import Language.C.Analysis.SemRep
+
+import Language.C.Data.Error
+import Language.C.Data.Node
+
+-- here are the errors available
+
+-- | InvalidASTError is caused by the violation of an invariant in the AST
+newtype InvalidASTError = InvalidAST ErrorInfo deriving (Typeable)
+
+instance Error InvalidASTError where
+    errorInfo (InvalidAST ei) = ei
+    changeErrorLevel (InvalidAST ei) lvl' = InvalidAST (changeErrorLevel ei lvl')
+
+-- | BadSpecifierError is caused by an invalid combination of specifiers
+newtype BadSpecifierError = BadSpecifierError ErrorInfo deriving (Typeable)
+
+instance Error BadSpecifierError where
+    errorInfo (BadSpecifierError ei) = ei
+    changeErrorLevel (BadSpecifierError ei) lvl' = BadSpecifierError (changeErrorLevel ei lvl')
+
+-- | RedefError is caused by an invalid redefinition of the same identifier or type
+data RedefError = RedefError ErrorLevel RedefInfo deriving Typeable
+
+data RedefInfo = RedefInfo String RedefKind NodeInfo NodeInfo
+data RedefKind = DuplicateDef | DiffKindRedecl | ShadowedDef | DisagreeLinkage |
+                 NoLinkageOld
+data TypeMismatch = TypeMismatch String (NodeInfo,Type) (NodeInfo,Type) deriving Typeable
+
+-- Invalid AST
+-- ~~~~~~~~~~~
+
+instance Show InvalidASTError  where show = showError "AST invariant violated"
+
+invalidAST :: NodeInfo -> String -> InvalidASTError
+invalidAST node_info msg = InvalidAST (mkErrorInfo LevelError msg node_info)
+
+-- Bad specifier (e.g. static for a parameter, or extern when there is an initializer)
+-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+instance Show BadSpecifierError     where show = showError "Bad specifier"
+
+badSpecifierError :: NodeInfo -> String -> BadSpecifierError
+badSpecifierError node_info msg = BadSpecifierError (mkErrorInfo LevelError msg node_info)
+
+-- Type mismatch
+-- ~~~~~~~~~~~~~
+typeMismatch :: String -> (NodeInfo, Type) -> (NodeInfo,Type) -> TypeMismatch
+typeMismatch = TypeMismatch
+
+instance Show TypeMismatch where
+    show tm = showError "Type mismatch" (typeMismatchInfo tm)
+instance Error TypeMismatch where
+    errorInfo = typeMismatchInfo
+typeMismatchInfo :: TypeMismatch -> ErrorInfo
+typeMismatchInfo (TypeMismatch reason (node1,_ty2) _t2) =
+    ErrorInfo LevelError (posOfNode node1) [reason]
+
+-- Redefinitions
+-- ~~~~~~~~~~~~~
+
+instance Show RedefError  where
+    show (RedefError lvl info) = showErrorInfo (redefErrLabel info) (redefErrorInfo lvl info)
+instance Error RedefError where
+    errorInfo (RedefError lvl info) = redefErrorInfo lvl info
+    changeErrorLevel (RedefError _lvl info) lvl' = RedefError lvl' info
+
+redefErrLabel :: RedefInfo -> String
+redefErrLabel  (RedefInfo ident _ _ _) = ident ++ " redefined"
+
+redefErrorInfo :: ErrorLevel -> RedefInfo -> ErrorInfo
+redefErrorInfo lvl info@(RedefInfo _ _ node old_node) =
+    ErrorInfo lvl (posOfNode node) ([redefErrReason info] ++ prevDeclMsg old_node)
+
+redefErrReason :: RedefInfo -> String
+redefErrReason (RedefInfo ident DuplicateDef _ _) = "duplicate definition of " ++ ident
+redefErrReason (RedefInfo ident ShadowedDef _ _)   = "this declaration of " ++ ident ++ " shadows a previous one"
+redefErrReason (RedefInfo ident DiffKindRedecl _ _) = ident ++ " previously declared as a different kind of symbol"
+redefErrReason (RedefInfo ident DisagreeLinkage _ _) = ident ++ " previously declared with different linkage"
+redefErrReason (RedefInfo ident NoLinkageOld _ _) = ident ++ " previously declared without linkage"
+
+prevDeclMsg :: NodeInfo -> [String]
+prevDeclMsg old_node = ["The previous declaration was here: ", show (posOfNode old_node)]
+
+redefinition :: ErrorLevel -> String -> RedefKind -> NodeInfo -> NodeInfo -> RedefError
+redefinition lvl ctx kind new old = RedefError lvl (RedefInfo ctx kind new old)
+
src/Language/C/Analysis/SemRep.hs view
@@ -1,680 +1,682 @@-{-# LANGUAGE DeriveDataTypeable  #-}--------------------------------------------------------------------------------- |--- Module      :  Language.C.Analysis.Syntax--- Copyright   :  (c) 2008 Benedikt Huber--- License     :  BSD-style--- Maintainer  :  benedikt.huber@gmail.com--- Stability   :  alpha--- Portability :  ghc------ This module contains definitions for representing C translation units.--- In contrast to 'Language.C.Syntax.AST', the representation tries to express the semantics of--- of a translation unit.-----------------------------------------------------------------------------------------------------module Language.C.Analysis.SemRep(--- * Sums of tags and identifiers-TagDef(..),typeOfTagDef,-Declaration(..),declIdent,declName,declType,declAttrs,-IdentDecl(..),objKindDescr, splitIdentDecls,--- * Global definitions-GlobalDecls(..),emptyGlobalDecls,filterGlobalDecls,mergeGlobalDecls,--- * Events for visitors-DeclEvent(..),--- * Declarations and definitions-Decl(..),-ObjDef(..),isTentative,-FunDef(..),-ParamDecl(..),MemberDecl(..),-TypeDef(..),identOfTypeDef,-VarDecl(..),--- * Declaration attributes-DeclAttrs(..),isExtDecl,-FunctionAttrs(..), functionAttrs, noFunctionAttrs,-Storage(..),declStorage,ThreadLocal,Register,-Linkage(..),hasLinkage,declLinkage,--- * Types-Type(..),-FunType(..),-ArraySize(..),-TypeDefRef(..),-TypeName(..),BuiltinType(..),-IntType(..),FloatType(..),-HasSUERef(..),HasCompTyKind(..),-CompTypeRef(..),CompType(..),typeOfCompDef,CompTyKind(..),-EnumTypeRef(..),EnumType(..),typeOfEnumDef,-Enumerator(..),-TypeQuals(..),noTypeQuals,mergeTypeQuals,--- * Variable names-VarName(..),identOfVarName,isNoName,AsmName,--- * Attributes (STUB, not yet analyzed)-Attr(..),Attributes,noAttributes,mergeAttributes,--- * Statements and Expressions (STUB, aliases to Syntax)-Stmt,Expr,Initializer,AsmBlock,-)-where-import Language.C.Data-import Language.C.Syntax-import Data.Map (Map)-import qualified Data.Map as Map-import Data.Maybe-import Data.Generics---- | accessor class : struct\/union\/enum names-class HasSUERef a where-    sueRef  :: a -> SUERef---- | accessor class : composite type tags (struct or union)-class HasCompTyKind a where-    compTag :: a -> CompTyKind---- | Composite type definitions (tags)-data TagDef =  CompDef CompType  --composite definition-             | EnumDef EnumType  --enum definition-               deriving (Typeable, Data {-! ,CNode !-})--instance HasSUERef TagDef where-    sueRef (CompDef ct) = sueRef ct-    sueRef (EnumDef et) = sueRef et---- | return the type corresponding to a tag definition-typeOfTagDef :: TagDef -> TypeName-typeOfTagDef (CompDef comptype) =  typeOfCompDef comptype-typeOfTagDef (EnumDef enumtype) =  typeOfEnumDef enumtype---- | All datatypes aggregating a declaration are instances of @Declaration@-class Declaration n where-    -- | get the name, type and declaration attributes of a declaration or definition-    getVarDecl :: n -> VarDecl---- | get the declaration corresponding to a definition-declOfDef :: (Declaration n, CNode n) => n -> Decl-declOfDef def = let vd = getVarDecl def in Decl vd (nodeInfo def)---- | get the variable identifier of a declaration (only safe if the---    the declaration is known to have a name)-declIdent :: (Declaration n) => n -> Ident-declIdent = identOfVarName . declName--- | get the variable name of a @Declaration@-declName ::  (Declaration n) => n -> VarName-declName = (\(VarDecl n _ _) -> n) . getVarDecl--- | get the type of a @Declaration@-declType ::  (Declaration n) => n -> Type-declType = (\(VarDecl _ _ ty) -> ty) . getVarDecl--- | get the declaration attributes of a @Declaration@-declAttrs :: (Declaration n) => n -> DeclAttrs-declAttrs = (\(VarDecl _ specs _) -> specs) . getVarDecl--instance (Declaration a, Declaration b) => Declaration (Either a b) where-    getVarDecl = either getVarDecl getVarDecl---- | identifiers, typedefs and enumeration constants (namespace sum)-data IdentDecl = Declaration Decl           -- ^ object or function declaration-                     | ObjectDef ObjDef           -- ^ object definition-                     | FunctionDef FunDef         -- ^ function definition-                     | EnumeratorDef Enumerator   -- ^ definition of an enumerator-               deriving (Typeable, Data {-! ,CNode !-})--instance Declaration IdentDecl where-  getVarDecl (Declaration decl) = getVarDecl decl-  getVarDecl (ObjectDef def) = getVarDecl def-  getVarDecl (FunctionDef def) = getVarDecl def-  getVarDecl (EnumeratorDef def) = getVarDecl def---- | textual description of the kind of an object-objKindDescr :: IdentDecl -> String-objKindDescr  (Declaration _ ) = "declaration"-objKindDescr (ObjectDef _) = "object definition"-objKindDescr (FunctionDef _) = "function definition"-objKindDescr (EnumeratorDef _) = "enumerator definition"---- | @splitIdentDecls includeAllDecls@ splits a map of object, function and enumerator declarations and definitions into one map--- holding declarations, and three maps for object definitions, enumerator definitions and function definitions.--- If @includeAllDecls@ is @True@ all declarations are present in the first map, otherwise only those where no corresponding definition--- is available.-splitIdentDecls :: Bool -> Map Ident IdentDecl -> (Map Ident Decl,-                                                ( Map Ident Enumerator,-                                                  Map Ident ObjDef,-                                                  Map Ident FunDef ) )-splitIdentDecls include_all = Map.foldWithKey (if include_all then deal else deal') (Map.empty,(Map.empty,Map.empty,Map.empty))-  where-  deal ident entry (decls,defs) = (Map.insert ident (declOfDef entry) decls, addDef ident entry defs)-  deal' ident (Declaration d) (decls,defs) = (Map.insert ident d decls,defs)-  deal' ident def (decls,defs) = (decls, addDef ident def defs)-  addDef ident entry (es,os,fs) =-    case entry of-        Declaration _   -> (es,os,fs)-        EnumeratorDef e -> (Map.insert ident e es,os,fs)-        ObjectDef o     -> (es,Map.insert ident o os,fs)-        FunctionDef f   -> (es, os,Map.insert ident f fs)----- | global declaration\/definition table returned by the analysis-data GlobalDecls = GlobalDecls {-                     gObjs     :: Map Ident IdentDecl,-                     gTags     :: Map SUERef TagDef,-                     gTypeDefs :: Map Ident TypeDef-                   }---- | empty global declaration table-emptyGlobalDecls :: GlobalDecls-emptyGlobalDecls = GlobalDecls Map.empty Map.empty Map.empty---- | filter global declarations-filterGlobalDecls :: (DeclEvent -> Bool) -> GlobalDecls -> GlobalDecls-filterGlobalDecls decl_filter gmap = GlobalDecls-    {-        gObjs  = Map.filter (decl_filter . DeclEvent) (gObjs gmap),-        gTags  = Map.filter (decl_filter . TagEvent) (gTags gmap),-        gTypeDefs = Map.filter (decl_filter . TypeDefEvent) (gTypeDefs gmap)-    }--- | merge global declarations-mergeGlobalDecls :: GlobalDecls -> GlobalDecls -> GlobalDecls-mergeGlobalDecls gmap1 gmap2 = GlobalDecls-    {-        gObjs  = Map.union (gObjs gmap1) (gObjs gmap2),-        gTags  = Map.union  (gTags gmap1) (gTags gmap2),-        gTypeDefs = Map.union (gTypeDefs gmap1) (gTypeDefs gmap2)-    }----- * Events---- | Declaration events------ Those events are reported to callbacks, which are executed during the traversal.-data DeclEvent =-       TagEvent  TagDef-       -- ^ file-scope struct\/union\/enum event-     | DeclEvent IdentDecl-       -- ^ file-scope declaration or definition-     | ParamEvent ParamDecl-       -- ^ parameter declaration-     | LocalEvent IdentDecl-       -- ^ local variable declaration or definition-     | TypeDefEvent TypeDef-       -- ^ a type definition-     | AsmEvent AsmBlock-       -- ^ assembler block-     deriving ({-! CNode !-})---- * Declarations and definitions---- | Declarations, which aren't definitions-data Decl = Decl VarDecl NodeInfo-            deriving (Typeable, Data {-! ,CNode !-})--instance Declaration Decl where-    getVarDecl   (Decl vd _) =  vd---- | Object Definitions------ An object definition is a declaration together with an initializer.------ If the initializer is missing, it is a tentative definition, i.e. a--- definition which might be overriden later on.-data ObjDef = ObjDef VarDecl (Maybe Initializer) NodeInfo-             deriving (Typeable, Data {-! ,CNode !-})-instance Declaration ObjDef where-    getVarDecl  (ObjDef vd _ _) =  vd---- | Returns @True@ if the given object definition is tentative.-isTentative :: ObjDef -> Bool-isTentative (ObjDef decl init_opt _) | isExtDecl decl = isNothing init_opt-                                     | otherwise = False---- | Function definitions------ A function definition is a declaration together with a statement (the function body).-data FunDef = FunDef VarDecl Stmt NodeInfo-             deriving (Typeable, Data {-! ,CNode !-})-instance Declaration FunDef where-    getVarDecl (FunDef vd _ _) = vd----- | Parameter declaration-data ParamDecl = ParamDecl VarDecl NodeInfo-               | AbstractParamDecl VarDecl NodeInfo-    deriving (Typeable, Data {-! ,CNode !-} )--instance Declaration ParamDecl where-  getVarDecl (ParamDecl vd _) = vd-  getVarDecl (AbstractParamDecl vd _) = vd---- | Struct\/Union member declaration-data MemberDecl = MemberDecl VarDecl (Maybe Expr) NodeInfo-                  -- ^ @MemberDecl vardecl bitfieldsize node@-                | AnonBitField Type Expr NodeInfo-                  -- ^ @AnonBitField typ size@-    deriving (Typeable, Data {-! ,CNode !-} )--instance Declaration MemberDecl where-  getVarDecl (MemberDecl vd _ _) = vd-  getVarDecl (AnonBitField ty _ _) = VarDecl NoName (DeclAttrs noFunctionAttrs NoStorage []) ty---- | @typedef@ definitions.------ The identifier is a new name for the given type.-data TypeDef = TypeDef Ident Type Attributes NodeInfo-               deriving (Typeable, Data {-! ,CNode !-} )---- | return the idenitifier of a @typedef@-identOfTypeDef :: TypeDef -> Ident-identOfTypeDef (TypeDef ide _ _ _) = ide---- | Generic variable declarations-data VarDecl = VarDecl VarName DeclAttrs Type-              deriving (Typeable, Data)--instance Declaration VarDecl where-  getVarDecl = id---- @isExtDecl d@ returns true if the declaration has /linkage/-isExtDecl :: (Declaration n) => n -> Bool-isExtDecl = hasLinkage . declStorage---- | Declaration attributes of the form @DeclAttrs isInlineFunction storage linkage attrs@------ They specify the storage and linkage of a declared object.-data DeclAttrs = DeclAttrs FunctionAttrs Storage Attributes-                 -- ^ @DeclAttrs fspecs storage attrs@-               deriving (Typeable, Data)---- | get the 'Storage' of a declaration-declStorage :: (Declaration d) => d -> Storage-declStorage d = case declAttrs d of (DeclAttrs _ st _) -> st---- | get the `function attributes' of a declaration-functionAttrs :: (Declaration d) => d -> FunctionAttrs-functionAttrs d = case declAttrs d of (DeclAttrs fa _ _) -> fa---- Function attributes (inline, noreturn)-data FunctionAttrs = FunctionAttrs { isInline :: Bool, isNoreturn :: Bool }-  deriving (Eq, Ord, Typeable, Data)--noFunctionAttrs :: FunctionAttrs-noFunctionAttrs = FunctionAttrs { isInline = False, isNoreturn = False }----- In C we have---  Identifiers can either have internal, external or no linkage---  (same object everywhere, same object within the translation unit, unique).---  * top-level identifiers---      static : internal linkage (objects and function defs)---      extern : linkage of prior declaration (if specified), external linkage otherwise---      no-spec: external linkage---  * storage duration---      * static storage duration: objects with external or internal linkage, or local ones with the static keyword---      * automatic storage duration: otherwise (register)--- See http://publications.gbdirect.co.uk/c_book/chapter8/declarations_and_definitions.html, Table 8.1, 8.2---- | Storage duration and linkage of a variable-data Storage  =  NoStorage                  -- ^ no storage-               | Auto Register              -- ^ automatic storage (optional: register)-               | Static Linkage ThreadLocal -- ^ static storage, linkage spec and thread local specifier (gnu c)-               | FunLinkage Linkage         -- ^ function, either internal or external linkage-               deriving (Typeable, Data, Show, Eq, Ord)--type ThreadLocal = Bool-type Register    = Bool---- | Linkage: Either no linkage, internal to the translation unit or external-data Linkage = NoLinkage | InternalLinkage | ExternalLinkage-               deriving (Typeable, Data, Show, Eq, Ord)---- | return @True@ if the object has linkage-hasLinkage :: Storage -> Bool-hasLinkage (Auto _) = False-hasLinkage (Static NoLinkage _) = False-hasLinkage _ = True---- | Get the linkage of a definition-declLinkage :: (Declaration d) => d -> Linkage-declLinkage decl =-    case declStorage decl of-        NoStorage -> undefined-        Auto _ -> NoLinkage-        Static linkage _ -> linkage-        FunLinkage linkage -> linkage----- * types---- | types of C objects-data Type =-       DirectType TypeName TypeQuals Attributes-     -- ^ a non-derived type-     | PtrType Type TypeQuals Attributes-     -- ^ pointer type-     | ArrayType Type ArraySize TypeQuals Attributes-     -- ^ array type-     | FunctionType FunType Attributes-     -- ^ function type-     | TypeDefType TypeDefRef TypeQuals Attributes-     -- ^ a defined type-     deriving (Typeable, Data)---- | Function types are of the form @FunType return-type params isVariadic@.------ If the parameter types aren't yet known, the function has type @FunTypeIncomplete type attrs@.-data FunType = FunType Type [ParamDecl] Bool-            |  FunTypeIncomplete Type-               deriving (Typeable, Data)---- | An array type may either have unknown size or a specified array size, the latter either variable or constant.--- Furthermore, when used as a function parameters, the size may be qualified as /static/.--- In a function prototype, the size may be `Unspecified variable size' (@[*]@).-data ArraySize =  UnknownArraySize Bool-                -- ^ @UnknownArraySize is-starred@-                | ArraySize Bool Expr-                -- ^ @FixedSizeArray is-static size-expr@-               deriving (Typeable, Data)---- | normalized type representation-data TypeName =-      TyVoid-    | TyIntegral IntType-    | TyFloating FloatType-    | TyComplex  FloatType-    | TyComp CompTypeRef-    | TyEnum EnumTypeRef-    | TyBuiltin BuiltinType-    deriving (Typeable, Data)---- | Builtin type (va_list, anything)-data BuiltinType = TyVaList-                 | TyAny-                   deriving (Typeable, Data)---- | typdef references--- If the actual type is known, it is attached for convenience-data TypeDefRef = TypeDefRef Ident Type NodeInfo-               deriving (Typeable, Data {-! ,CNode !-})---- | integral types (C99 6.7.2.2)-data IntType =-      TyBool-    | TyChar-    | TySChar-    | TyUChar-    | TyShort-    | TyUShort-    | TyInt-    | TyUInt-    | TyInt128-    | TyUInt128-    | TyLong-    | TyULong-    | TyLLong-    | TyULLong-    deriving (Typeable, Data, Eq, Ord)--instance Show IntType where-    show TyBool = "_Bool"-    show TyChar = "char"-    show TySChar = "signed char"-    show TyUChar = "unsigned char"-    show TyShort = "short"-    show TyUShort = "unsigned short"-    show TyInt = "int"-    show TyUInt = "unsigned int"-    show TyInt128 = "__int128"-    show TyUInt128 = "unsigned __int128"-    show TyLong = "long"-    show TyULong = "unsigned long"-    show TyLLong = "long long"-    show TyULLong = "unsigned long long"---- | floating point type (C99 6.7.2.2)-data FloatType =-      TyFloat-    | TyDouble-    | TyLDouble-    deriving (Typeable, Data, Eq, Ord)--instance Show FloatType where-    show TyFloat = "float"-    show TyDouble = "double"-    show TyLDouble = "long double"---- | composite type declarations-data CompTypeRef = CompTypeRef SUERef CompTyKind NodeInfo-                    deriving (Typeable, Data {-! ,CNode !-})--instance HasSUERef  CompTypeRef where sueRef  (CompTypeRef ref _ _) = ref-instance HasCompTyKind CompTypeRef where compTag (CompTypeRef _ tag _)  = tag--data EnumTypeRef = EnumTypeRef SUERef NodeInfo-    deriving (Typeable, Data {-! ,CNode !-})-instance HasSUERef  EnumTypeRef where sueRef  (EnumTypeRef ref _) = ref---- | Composite type (struct or union).-data CompType =  CompType SUERef CompTyKind [MemberDecl] Attributes NodeInfo-                 deriving (Typeable, Data {-! ,CNode !-} )-instance HasSUERef  CompType where sueRef  (CompType ref _ _ _ _) = ref-instance HasCompTyKind CompType where compTag (CompType _ tag _ _ _) = tag---- | return the type of a composite type definition-typeOfCompDef :: CompType -> TypeName-typeOfCompDef (CompType ref tag _ _ _) = TyComp (CompTypeRef ref tag undefNode)---- | a tag to determine wheter we refer to a @struct@ or @union@, see 'CompType'.-data CompTyKind =  StructTag-                 | UnionTag-    deriving (Eq,Ord,Typeable,Data)--instance Show CompTyKind where-    show StructTag = "struct"-    show UnionTag  = "union"---- | Representation of C enumeration types-data EnumType = EnumType SUERef [Enumerator] Attributes NodeInfo-                 -- ^ @EnumType name enumeration-constants attrs node@-                 deriving (Typeable, Data {-! ,CNode !-} )--instance HasSUERef EnumType where sueRef  (EnumType ref _ _ _) = ref---- | return the type of an enum definition-typeOfEnumDef :: EnumType -> TypeName-typeOfEnumDef (EnumType ref _ _ _) = TyEnum (EnumTypeRef ref undefNode)---- | An Enumerator consists of an identifier, a constant expressions and the link to its type-data Enumerator = Enumerator Ident Expr EnumType NodeInfo-                  deriving (Typeable, Data {-! ,CNode !-})-instance Declaration Enumerator where-  getVarDecl (Enumerator ide _ enumty _) =-    VarDecl-      (VarName ide Nothing)-      (DeclAttrs noFunctionAttrs NoStorage [])-      (DirectType (typeOfEnumDef enumty) noTypeQuals noAttributes)---- | Type qualifiers: constant, volatile and restrict-data TypeQuals = TypeQuals { constant :: Bool, volatile :: Bool,-                             restrict :: Bool, atomic :: Bool,-                             nullable :: Bool, nonnull  :: Bool }-    deriving (Typeable, Data)--instance Eq TypeQuals where- (==) (TypeQuals c1 v1 r1 a1 n1 nn1) (TypeQuals c2 v2 r2 a2 n2 nn2) =-    c1 == c2 && v1 == v2 && r1 == r2 && a1 == a2 && n1 == n2 && nn1 == nn2--instance Ord TypeQuals where-  (<=) (TypeQuals c1 v1 r1 a1 n1 nn1) (TypeQuals c2 v2 r2 a2 n2 nn2) =-    c1 <= c2 && v1 <= v2 && r1 <= r2 && a1 <= a2 && n1 <= n2 && nn1 <= nn2----- | no type qualifiers-noTypeQuals :: TypeQuals-noTypeQuals = TypeQuals False False False False False False---- | merge (/&&/) two type qualifier sets-mergeTypeQuals :: TypeQuals -> TypeQuals -> TypeQuals-mergeTypeQuals (TypeQuals c1 v1 r1 a1 n1 nn1) (TypeQuals c2 v2 r2 a2 n2 nn2) =-  TypeQuals (c1 && c2) (v1 && v2) (r1 && r2) (a1 && a2) (n1 && n2) (nn1 && nn2)---- * initializers---- | 'Initializer' is currently an alias for 'CInit'.------ We're planning a normalized representation, but this depends on the implementation of--- constant expression evaluation-type Initializer = CInit---- | Normalized C Initializers--- * If the expression has scalar type, the initializer is an expression--- * If the expression has struct type, the initializer is a map from designators to initializers--- * If the expression has array type, the initializer is a list of values--- Not implemented yet, as it depends on constant expression evaluation----- * names and attributes---- | @VarName name assembler-name@ is a name of an declared object-data VarName =  VarName Ident (Maybe AsmName)-              | NoName-               deriving (Typeable, Data)-identOfVarName :: VarName -> Ident-identOfVarName NoName            = error "identOfVarName: NoName"-identOfVarName (VarName ident _) = ident--isNoName :: VarName -> Bool-isNoName NoName = True-isNoName _ = False---- | Top level assembler block (alias for @CStrLit@)-type AsmBlock = CStrLit---- | Assembler name (alias for @CStrLit@)-type AsmName = CStrLit---- | @__attribute__@ annotations------ Those are of the form @Attr attribute-name attribute-parameters@,--- and serve as generic properties of some syntax tree elements.------ Some examples:------ * labels can be attributed with /unused/ to indicate that their not used------ * struct definitions can be attributed with /packed/ to tell the compiler to use the most compact representation------ * declarations can be attributed with /deprecated/------ * function declarations can be attributes with /noreturn/ to tell the compiler that the function will never return,------ * or with /const/ to indicate that it is a pure function------ /TODO/: ultimatively, we want to parse attributes and represent them in a typed way-data Attr = Attr Ident [Expr] NodeInfo-            deriving (Typeable, Data {-! ,CNode !-})--type Attributes = [Attr]---- |Empty attribute list-noAttributes :: Attributes-noAttributes = []---- |Merge attribute lists--- /TODO/: currently does not remove duplicates-mergeAttributes :: Attributes -> Attributes -> Attributes-mergeAttributes = (++)---- * statements and expressions (Type aliases)---- | 'Stmt' is an alias for 'CStat' (Syntax)-type Stmt = CStat--- | 'Expr' is currently an alias for 'CExpr' (Syntax)-type Expr = CExpr--- GENERATED START--instance CNode TagDef where-        nodeInfo (CompDef d) = nodeInfo d-        nodeInfo (EnumDef d) = nodeInfo d-instance Pos TagDef where-        posOf x = posOf (nodeInfo x)--instance CNode IdentDecl where-        nodeInfo (Declaration d) = nodeInfo d-        nodeInfo (ObjectDef d) = nodeInfo d-        nodeInfo (FunctionDef d) = nodeInfo d-        nodeInfo (EnumeratorDef d) = nodeInfo d-instance Pos IdentDecl where-        posOf x = posOf (nodeInfo x)--instance CNode DeclEvent where-        nodeInfo (TagEvent d) = nodeInfo d-        nodeInfo (DeclEvent d) = nodeInfo d-        nodeInfo (ParamEvent d) = nodeInfo d-        nodeInfo (LocalEvent d) = nodeInfo d-        nodeInfo (TypeDefEvent d) = nodeInfo d-        nodeInfo (AsmEvent d) = nodeInfo d-instance Pos DeclEvent where-        posOf x = posOf (nodeInfo x)--instance CNode Decl where-        nodeInfo (Decl _ n) = n-instance Pos Decl where-        posOf x = posOf (nodeInfo x)--instance CNode ObjDef where-        nodeInfo (ObjDef _ _ n) = n-instance Pos ObjDef where-        posOf x = posOf (nodeInfo x)--instance CNode FunDef where-        nodeInfo (FunDef _ _ n) = n-instance Pos FunDef where-        posOf x = posOf (nodeInfo x)--instance CNode ParamDecl where-        nodeInfo (ParamDecl _ n) = n-        nodeInfo (AbstractParamDecl _ n) = n-instance Pos ParamDecl where-        posOf x = posOf (nodeInfo x)--instance CNode MemberDecl where-        nodeInfo (MemberDecl _ _ n) = n-        nodeInfo (AnonBitField _ _ n) = n-instance Pos MemberDecl where-        posOf x = posOf (nodeInfo x)--instance CNode TypeDef where-        nodeInfo (TypeDef _ _ _ n) = n-instance Pos TypeDef where-        posOf x = posOf (nodeInfo x)--instance CNode TypeDefRef where-        nodeInfo (TypeDefRef _ _ n) = n-instance Pos TypeDefRef where-        posOf x = posOf (nodeInfo x)--instance CNode CompTypeRef where-        nodeInfo (CompTypeRef _ _ n) = n-instance Pos CompTypeRef where-        posOf x = posOf (nodeInfo x)--instance CNode EnumTypeRef where-        nodeInfo (EnumTypeRef _ n) = n-instance Pos EnumTypeRef where-        posOf x = posOf (nodeInfo x)--instance CNode CompType where-        nodeInfo (CompType _ _ _ _ n) = n-instance Pos CompType where-        posOf x = posOf (nodeInfo x)--instance CNode EnumType where-        nodeInfo (EnumType _ _ _ n) = n-instance Pos EnumType where-        posOf x = posOf (nodeInfo x)--instance CNode Enumerator where-        nodeInfo (Enumerator _ _ _ n) = n-instance Pos Enumerator where-        posOf x = posOf (nodeInfo x)--instance CNode Attr where-        nodeInfo (Attr _ _ n) = n-instance Pos Attr where-        posOf x = posOf (nodeInfo x)--- GENERATED STOP+{-# LANGUAGE DeriveDataTypeable  #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Analysis.Syntax
+-- Copyright   :  (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  alpha
+-- Portability :  ghc
+--
+-- This module contains definitions for representing C translation units.
+-- In contrast to 'Language.C.Syntax.AST', the representation tries to express the semantics of
+-- of a translation unit.
+---------------------------------------------------------------------------------------------------
+module Language.C.Analysis.SemRep(
+-- * Sums of tags and identifiers
+TagDef(..),typeOfTagDef,
+Declaration(..),declIdent,declName,declType,declAttrs,
+IdentDecl(..),objKindDescr, splitIdentDecls,
+-- * Global definitions
+GlobalDecls(..),emptyGlobalDecls,filterGlobalDecls,mergeGlobalDecls,
+-- * Events for visitors
+DeclEvent(..),
+-- * Declarations and definitions
+Decl(..),
+ObjDef(..),isTentative,
+FunDef(..),
+ParamDecl(..),MemberDecl(..),
+TypeDef(..),identOfTypeDef,
+VarDecl(..),
+-- * Declaration attributes
+DeclAttrs(..),isExtDecl,
+FunctionAttrs(..), functionAttrs, noFunctionAttrs,
+Storage(..),declStorage,ThreadLocal,Register,
+Linkage(..),hasLinkage,declLinkage,
+-- * Types
+Type(..),
+FunType(..),
+ArraySize(..),
+TypeDefRef(..),
+TypeName(..),BuiltinType(..),
+IntType(..),FloatType(..),
+HasSUERef(..),HasCompTyKind(..),
+CompTypeRef(..),CompType(..),typeOfCompDef,CompTyKind(..),
+EnumTypeRef(..),EnumType(..),typeOfEnumDef,
+Enumerator(..),
+TypeQuals(..),noTypeQuals,mergeTypeQuals,
+-- * Variable names
+VarName(..),identOfVarName,isNoName,AsmName,
+-- * Attributes (STUB, not yet analyzed)
+Attr(..),Attributes,noAttributes,mergeAttributes,
+-- * Statements and Expressions (STUB, aliases to Syntax)
+Stmt,Expr,Initializer,AsmBlock,
+)
+where
+import Language.C.Data
+import Language.C.Syntax
+import Data.Map (Map)
+import qualified Data.Map as Map
+import Data.Maybe
+import Data.Generics
+
+-- | accessor class : struct\/union\/enum names
+class HasSUERef a where
+    sueRef  :: a -> SUERef
+
+-- | accessor class : composite type tags (struct or union)
+class HasCompTyKind a where
+    compTag :: a -> CompTyKind
+
+-- | Composite type definitions (tags)
+data TagDef =  CompDef CompType  --composite definition
+             | EnumDef EnumType  --enum definition
+               deriving (Typeable, Data {-! ,CNode !-})
+
+instance HasSUERef TagDef where
+    sueRef (CompDef ct) = sueRef ct
+    sueRef (EnumDef et) = sueRef et
+
+-- | return the type corresponding to a tag definition
+typeOfTagDef :: TagDef -> TypeName
+typeOfTagDef (CompDef comptype) =  typeOfCompDef comptype
+typeOfTagDef (EnumDef enumtype) =  typeOfEnumDef enumtype
+
+-- | All datatypes aggregating a declaration are instances of @Declaration@
+class Declaration n where
+    -- | get the name, type and declaration attributes of a declaration or definition
+    getVarDecl :: n -> VarDecl
+
+-- | get the declaration corresponding to a definition
+declOfDef :: (Declaration n, CNode n) => n -> Decl
+declOfDef def = let vd = getVarDecl def in Decl vd (nodeInfo def)
+
+-- | get the variable identifier of a declaration (only safe if the
+--    the declaration is known to have a name)
+declIdent :: (Declaration n) => n -> Ident
+declIdent = identOfVarName . declName
+-- | get the variable name of a @Declaration@
+declName ::  (Declaration n) => n -> VarName
+declName = (\(VarDecl n _ _) -> n) . getVarDecl
+-- | get the type of a @Declaration@
+declType ::  (Declaration n) => n -> Type
+declType = (\(VarDecl _ _ ty) -> ty) . getVarDecl
+-- | get the declaration attributes of a @Declaration@
+declAttrs :: (Declaration n) => n -> DeclAttrs
+declAttrs = (\(VarDecl _ specs _) -> specs) . getVarDecl
+
+instance (Declaration a, Declaration b) => Declaration (Either a b) where
+    getVarDecl = either getVarDecl getVarDecl
+
+-- | identifiers, typedefs and enumeration constants (namespace sum)
+data IdentDecl = Declaration Decl           -- ^ object or function declaration
+                     | ObjectDef ObjDef           -- ^ object definition
+                     | FunctionDef FunDef         -- ^ function definition
+                     | EnumeratorDef Enumerator   -- ^ definition of an enumerator
+               deriving (Typeable, Data {-! ,CNode !-})
+
+instance Declaration IdentDecl where
+  getVarDecl (Declaration decl) = getVarDecl decl
+  getVarDecl (ObjectDef def) = getVarDecl def
+  getVarDecl (FunctionDef def) = getVarDecl def
+  getVarDecl (EnumeratorDef def) = getVarDecl def
+
+-- | textual description of the kind of an object
+objKindDescr :: IdentDecl -> String
+objKindDescr  (Declaration _ ) = "declaration"
+objKindDescr (ObjectDef _) = "object definition"
+objKindDescr (FunctionDef _) = "function definition"
+objKindDescr (EnumeratorDef _) = "enumerator definition"
+
+-- | @splitIdentDecls includeAllDecls@ splits a map of object, function and enumerator declarations and definitions into one map
+-- holding declarations, and three maps for object definitions, enumerator definitions and function definitions.
+-- If @includeAllDecls@ is @True@ all declarations are present in the first map, otherwise only those where no corresponding definition
+-- is available.
+splitIdentDecls :: Bool -> Map Ident IdentDecl -> (Map Ident Decl,
+                                                ( Map Ident Enumerator,
+                                                  Map Ident ObjDef,
+                                                  Map Ident FunDef ) )
+splitIdentDecls include_all = Map.foldWithKey (if include_all then deal else deal') (Map.empty,(Map.empty,Map.empty,Map.empty))
+  where
+  deal ident entry (decls,defs) = (Map.insert ident (declOfDef entry) decls, addDef ident entry defs)
+  deal' ident (Declaration d) (decls,defs) = (Map.insert ident d decls,defs)
+  deal' ident def (decls,defs) = (decls, addDef ident def defs)
+  addDef ident entry (es,os,fs) =
+    case entry of
+        Declaration _   -> (es,os,fs)
+        EnumeratorDef e -> (Map.insert ident e es,os,fs)
+        ObjectDef o     -> (es,Map.insert ident o os,fs)
+        FunctionDef f   -> (es, os,Map.insert ident f fs)
+
+
+-- | global declaration\/definition table returned by the analysis
+data GlobalDecls = GlobalDecls {
+                     gObjs     :: Map Ident IdentDecl,
+                     gTags     :: Map SUERef TagDef,
+                     gTypeDefs :: Map Ident TypeDef
+                   }
+
+-- | empty global declaration table
+emptyGlobalDecls :: GlobalDecls
+emptyGlobalDecls = GlobalDecls Map.empty Map.empty Map.empty
+
+-- | filter global declarations
+filterGlobalDecls :: (DeclEvent -> Bool) -> GlobalDecls -> GlobalDecls
+filterGlobalDecls decl_filter gmap = GlobalDecls
+    {
+        gObjs  = Map.filter (decl_filter . DeclEvent) (gObjs gmap),
+        gTags  = Map.filter (decl_filter . TagEvent) (gTags gmap),
+        gTypeDefs = Map.filter (decl_filter . TypeDefEvent) (gTypeDefs gmap)
+    }
+-- | merge global declarations
+mergeGlobalDecls :: GlobalDecls -> GlobalDecls -> GlobalDecls
+mergeGlobalDecls gmap1 gmap2 = GlobalDecls
+    {
+        gObjs  = Map.union (gObjs gmap1) (gObjs gmap2),
+        gTags  = Map.union  (gTags gmap1) (gTags gmap2),
+        gTypeDefs = Map.union (gTypeDefs gmap1) (gTypeDefs gmap2)
+    }
+
+
+-- * Events
+
+-- | Declaration events
+--
+-- Those events are reported to callbacks, which are executed during the traversal.
+data DeclEvent =
+       TagEvent  TagDef
+       -- ^ file-scope struct\/union\/enum event
+     | DeclEvent IdentDecl
+       -- ^ file-scope declaration or definition
+     | ParamEvent ParamDecl
+       -- ^ parameter declaration
+     | LocalEvent IdentDecl
+       -- ^ local variable declaration or definition
+     | TypeDefEvent TypeDef
+       -- ^ a type definition
+     | AsmEvent AsmBlock
+       -- ^ assembler block
+     deriving ({-! CNode !-})
+
+-- * Declarations and definitions
+
+-- | Declarations, which aren't definitions
+data Decl = Decl VarDecl NodeInfo
+            deriving (Typeable, Data {-! ,CNode !-})
+
+instance Declaration Decl where
+    getVarDecl   (Decl vd _) =  vd
+
+-- | Object Definitions
+--
+-- An object definition is a declaration together with an initializer.
+--
+-- If the initializer is missing, it is a tentative definition, i.e. a
+-- definition which might be overriden later on.
+data ObjDef = ObjDef VarDecl (Maybe Initializer) NodeInfo
+             deriving (Typeable, Data {-! ,CNode !-})
+instance Declaration ObjDef where
+    getVarDecl  (ObjDef vd _ _) =  vd
+
+-- | Returns @True@ if the given object definition is tentative.
+isTentative :: ObjDef -> Bool
+isTentative (ObjDef decl init_opt _) | isExtDecl decl = isNothing init_opt
+                                     | otherwise = False
+
+-- | Function definitions
+--
+-- A function definition is a declaration together with a statement (the function body).
+data FunDef = FunDef VarDecl Stmt NodeInfo
+             deriving (Typeable, Data {-! ,CNode !-})
+instance Declaration FunDef where
+    getVarDecl (FunDef vd _ _) = vd
+
+
+-- | Parameter declaration
+data ParamDecl = ParamDecl VarDecl NodeInfo
+               | AbstractParamDecl VarDecl NodeInfo
+    deriving (Typeable, Data {-! ,CNode !-} )
+
+instance Declaration ParamDecl where
+  getVarDecl (ParamDecl vd _) = vd
+  getVarDecl (AbstractParamDecl vd _) = vd
+
+-- | Struct\/Union member declaration
+data MemberDecl = MemberDecl VarDecl (Maybe Expr) NodeInfo
+                  -- ^ @MemberDecl vardecl bitfieldsize node@
+                | AnonBitField Type Expr NodeInfo
+                  -- ^ @AnonBitField typ size@
+    deriving (Typeable, Data {-! ,CNode !-} )
+
+instance Declaration MemberDecl where
+  getVarDecl (MemberDecl vd _ _) = vd
+  getVarDecl (AnonBitField ty _ _) = VarDecl NoName (DeclAttrs noFunctionAttrs NoStorage []) ty
+
+-- | @typedef@ definitions.
+--
+-- The identifier is a new name for the given type.
+data TypeDef = TypeDef Ident Type Attributes NodeInfo
+               deriving (Typeable, Data {-! ,CNode !-} )
+
+-- | return the idenitifier of a @typedef@
+identOfTypeDef :: TypeDef -> Ident
+identOfTypeDef (TypeDef ide _ _ _) = ide
+
+-- | Generic variable declarations
+data VarDecl = VarDecl VarName DeclAttrs Type
+              deriving (Typeable, Data)
+
+instance Declaration VarDecl where
+  getVarDecl = id
+
+-- @isExtDecl d@ returns true if the declaration has /linkage/
+isExtDecl :: (Declaration n) => n -> Bool
+isExtDecl = hasLinkage . declStorage
+
+-- | Declaration attributes of the form @DeclAttrs isInlineFunction storage linkage attrs@
+--
+-- They specify the storage and linkage of a declared object.
+data DeclAttrs = DeclAttrs FunctionAttrs Storage Attributes
+                 -- ^ @DeclAttrs fspecs storage attrs@
+               deriving (Typeable, Data)
+
+-- | get the 'Storage' of a declaration
+declStorage :: (Declaration d) => d -> Storage
+declStorage d = case declAttrs d of (DeclAttrs _ st _) -> st
+
+-- | get the `function attributes' of a declaration
+functionAttrs :: (Declaration d) => d -> FunctionAttrs
+functionAttrs d = case declAttrs d of (DeclAttrs fa _ _) -> fa
+
+-- Function attributes (inline, noreturn)
+data FunctionAttrs = FunctionAttrs { isInline :: Bool, isNoreturn :: Bool }
+  deriving (Eq, Ord, Typeable, Data)
+
+noFunctionAttrs :: FunctionAttrs
+noFunctionAttrs = FunctionAttrs { isInline = False, isNoreturn = False }
+
+
+-- In C we have
+--  Identifiers can either have internal, external or no linkage
+--  (same object everywhere, same object within the translation unit, unique).
+--  * top-level identifiers
+--      static : internal linkage (objects and function defs)
+--      extern : linkage of prior declaration (if specified), external linkage otherwise
+--      no-spec: external linkage
+--  * storage duration
+--      * static storage duration: objects with external or internal linkage, or local ones with the static keyword
+--      * automatic storage duration: otherwise (register)
+-- See http://publications.gbdirect.co.uk/c_book/chapter8/declarations_and_definitions.html, Table 8.1, 8.2
+
+-- | Storage duration and linkage of a variable
+data Storage  =  NoStorage                  -- ^ no storage
+               | Auto Register              -- ^ automatic storage (optional: register)
+               | Static Linkage ThreadLocal -- ^ static storage, linkage spec and thread local specifier (gnu c)
+               | FunLinkage Linkage         -- ^ function, either internal or external linkage
+               deriving (Typeable, Data, Show, Eq, Ord)
+
+type ThreadLocal = Bool
+type Register    = Bool
+
+-- | Linkage: Either no linkage, internal to the translation unit or external
+data Linkage = NoLinkage | InternalLinkage | ExternalLinkage
+               deriving (Typeable, Data, Show, Eq, Ord)
+
+-- | return @True@ if the object has linkage
+hasLinkage :: Storage -> Bool
+hasLinkage (Auto _) = False
+hasLinkage (Static NoLinkage _) = False
+hasLinkage _ = True
+
+-- | Get the linkage of a definition
+declLinkage :: (Declaration d) => d -> Linkage
+declLinkage decl =
+    case declStorage decl of
+        NoStorage -> undefined
+        Auto _ -> NoLinkage
+        Static linkage _ -> linkage
+        FunLinkage linkage -> linkage
+
+
+-- * types
+
+-- | types of C objects
+data Type =
+       DirectType TypeName TypeQuals Attributes
+     -- ^ a non-derived type
+     | PtrType Type TypeQuals Attributes
+     -- ^ pointer type
+     | ArrayType Type ArraySize TypeQuals Attributes
+     -- ^ array type
+     | FunctionType FunType Attributes
+     -- ^ function type
+     | TypeDefType TypeDefRef TypeQuals Attributes
+     -- ^ a defined type
+     deriving (Typeable, Data)
+
+-- | Function types are of the form @FunType return-type params isVariadic@.
+--
+-- If the parameter types aren't yet known, the function has type @FunTypeIncomplete type attrs@.
+data FunType = FunType Type [ParamDecl] Bool
+            |  FunTypeIncomplete Type
+               deriving (Typeable, Data)
+
+-- | An array type may either have unknown size or a specified array size, the latter either variable or constant.
+-- Furthermore, when used as a function parameters, the size may be qualified as /static/.
+-- In a function prototype, the size may be `Unspecified variable size' (@[*]@).
+data ArraySize =  UnknownArraySize Bool
+                -- ^ @UnknownArraySize is-starred@
+                | ArraySize Bool Expr
+                -- ^ @FixedSizeArray is-static size-expr@
+               deriving (Typeable, Data)
+
+-- | normalized type representation
+data TypeName =
+      TyVoid
+    | TyIntegral IntType
+    | TyFloating FloatType
+    | TyComplex  FloatType
+    | TyComp CompTypeRef
+    | TyEnum EnumTypeRef
+    | TyBuiltin BuiltinType
+    deriving (Typeable, Data)
+
+-- | Builtin type (va_list, anything)
+data BuiltinType = TyVaList
+                 | TyAny
+                   deriving (Typeable, Data)
+
+-- | typdef references
+-- If the actual type is known, it is attached for convenience
+data TypeDefRef = TypeDefRef Ident Type NodeInfo
+               deriving (Typeable, Data {-! ,CNode !-})
+
+-- | integral types (C99 6.7.2.2)
+data IntType =
+      TyBool
+    | TyChar
+    | TySChar
+    | TyUChar
+    | TyShort
+    | TyUShort
+    | TyInt
+    | TyUInt
+    | TyInt128
+    | TyUInt128
+    | TyLong
+    | TyULong
+    | TyLLong
+    | TyULLong
+    deriving (Typeable, Data, Eq, Ord)
+
+instance Show IntType where
+    show TyBool = "_Bool"
+    show TyChar = "char"
+    show TySChar = "signed char"
+    show TyUChar = "unsigned char"
+    show TyShort = "short"
+    show TyUShort = "unsigned short"
+    show TyInt = "int"
+    show TyUInt = "unsigned int"
+    show TyInt128 = "__int128"
+    show TyUInt128 = "unsigned __int128"
+    show TyLong = "long"
+    show TyULong = "unsigned long"
+    show TyLLong = "long long"
+    show TyULLong = "unsigned long long"
+
+-- | floating point type (C99 6.7.2.2)
+data FloatType =
+      TyFloat
+    | TyDouble
+    | TyLDouble
+    | TyFloat128
+    deriving (Typeable, Data, Eq, Ord)
+
+instance Show FloatType where
+    show TyFloat = "float"
+    show TyDouble = "double"
+    show TyLDouble = "long double"
+    show TyFloat128 = "__float128"
+
+-- | composite type declarations
+data CompTypeRef = CompTypeRef SUERef CompTyKind NodeInfo
+                    deriving (Typeable, Data {-! ,CNode !-})
+
+instance HasSUERef  CompTypeRef where sueRef  (CompTypeRef ref _ _) = ref
+instance HasCompTyKind CompTypeRef where compTag (CompTypeRef _ tag _)  = tag
+
+data EnumTypeRef = EnumTypeRef SUERef NodeInfo
+    deriving (Typeable, Data {-! ,CNode !-})
+instance HasSUERef  EnumTypeRef where sueRef  (EnumTypeRef ref _) = ref
+
+-- | Composite type (struct or union).
+data CompType =  CompType SUERef CompTyKind [MemberDecl] Attributes NodeInfo
+                 deriving (Typeable, Data {-! ,CNode !-} )
+instance HasSUERef  CompType where sueRef  (CompType ref _ _ _ _) = ref
+instance HasCompTyKind CompType where compTag (CompType _ tag _ _ _) = tag
+
+-- | return the type of a composite type definition
+typeOfCompDef :: CompType -> TypeName
+typeOfCompDef (CompType ref tag _ _ _) = TyComp (CompTypeRef ref tag undefNode)
+
+-- | a tag to determine wheter we refer to a @struct@ or @union@, see 'CompType'.
+data CompTyKind =  StructTag
+                 | UnionTag
+    deriving (Eq,Ord,Typeable,Data)
+
+instance Show CompTyKind where
+    show StructTag = "struct"
+    show UnionTag  = "union"
+
+-- | Representation of C enumeration types
+data EnumType = EnumType SUERef [Enumerator] Attributes NodeInfo
+                 -- ^ @EnumType name enumeration-constants attrs node@
+                 deriving (Typeable, Data {-! ,CNode !-} )
+
+instance HasSUERef EnumType where sueRef  (EnumType ref _ _ _) = ref
+
+-- | return the type of an enum definition
+typeOfEnumDef :: EnumType -> TypeName
+typeOfEnumDef (EnumType ref _ _ _) = TyEnum (EnumTypeRef ref undefNode)
+
+-- | An Enumerator consists of an identifier, a constant expressions and the link to its type
+data Enumerator = Enumerator Ident Expr EnumType NodeInfo
+                  deriving (Typeable, Data {-! ,CNode !-})
+instance Declaration Enumerator where
+  getVarDecl (Enumerator ide _ enumty _) =
+    VarDecl
+      (VarName ide Nothing)
+      (DeclAttrs noFunctionAttrs NoStorage [])
+      (DirectType (typeOfEnumDef enumty) noTypeQuals noAttributes)
+
+-- | Type qualifiers: constant, volatile and restrict
+data TypeQuals = TypeQuals { constant :: Bool, volatile :: Bool,
+                             restrict :: Bool, atomic :: Bool,
+                             nullable :: Bool, nonnull  :: Bool }
+    deriving (Typeable, Data)
+
+instance Eq TypeQuals where
+ (==) (TypeQuals c1 v1 r1 a1 n1 nn1) (TypeQuals c2 v2 r2 a2 n2 nn2) =
+    c1 == c2 && v1 == v2 && r1 == r2 && a1 == a2 && n1 == n2 && nn1 == nn2
+
+instance Ord TypeQuals where
+  (<=) (TypeQuals c1 v1 r1 a1 n1 nn1) (TypeQuals c2 v2 r2 a2 n2 nn2) =
+    c1 <= c2 && v1 <= v2 && r1 <= r2 && a1 <= a2 && n1 <= n2 && nn1 <= nn2
+
+
+-- | no type qualifiers
+noTypeQuals :: TypeQuals
+noTypeQuals = TypeQuals False False False False False False
+
+-- | merge (/&&/) two type qualifier sets
+mergeTypeQuals :: TypeQuals -> TypeQuals -> TypeQuals
+mergeTypeQuals (TypeQuals c1 v1 r1 a1 n1 nn1) (TypeQuals c2 v2 r2 a2 n2 nn2) =
+  TypeQuals (c1 && c2) (v1 && v2) (r1 && r2) (a1 && a2) (n1 && n2) (nn1 && nn2)
+
+-- * initializers
+
+-- | 'Initializer' is currently an alias for 'CInit'.
+--
+-- We're planning a normalized representation, but this depends on the implementation of
+-- constant expression evaluation
+type Initializer = CInit
+
+-- | Normalized C Initializers
+-- * If the expression has scalar type, the initializer is an expression
+-- * If the expression has struct type, the initializer is a map from designators to initializers
+-- * If the expression has array type, the initializer is a list of values
+-- Not implemented yet, as it depends on constant expression evaluation
+
+
+-- * names and attributes
+
+-- | @VarName name assembler-name@ is a name of an declared object
+data VarName =  VarName Ident (Maybe AsmName)
+              | NoName
+               deriving (Typeable, Data)
+identOfVarName :: VarName -> Ident
+identOfVarName NoName            = error "identOfVarName: NoName"
+identOfVarName (VarName ident _) = ident
+
+isNoName :: VarName -> Bool
+isNoName NoName = True
+isNoName _ = False
+
+-- | Top level assembler block (alias for @CStrLit@)
+type AsmBlock = CStrLit
+
+-- | Assembler name (alias for @CStrLit@)
+type AsmName = CStrLit
+
+-- | @__attribute__@ annotations
+--
+-- Those are of the form @Attr attribute-name attribute-parameters@,
+-- and serve as generic properties of some syntax tree elements.
+--
+-- Some examples:
+--
+-- * labels can be attributed with /unused/ to indicate that their not used
+--
+-- * struct definitions can be attributed with /packed/ to tell the compiler to use the most compact representation
+--
+-- * declarations can be attributed with /deprecated/
+--
+-- * function declarations can be attributes with /noreturn/ to tell the compiler that the function will never return,
+--
+-- * or with /const/ to indicate that it is a pure function
+--
+-- /TODO/: ultimatively, we want to parse attributes and represent them in a typed way
+data Attr = Attr Ident [Expr] NodeInfo
+            deriving (Typeable, Data {-! ,CNode !-})
+
+type Attributes = [Attr]
+
+-- |Empty attribute list
+noAttributes :: Attributes
+noAttributes = []
+
+-- |Merge attribute lists
+-- /TODO/: currently does not remove duplicates
+mergeAttributes :: Attributes -> Attributes -> Attributes
+mergeAttributes = (++)
+
+-- * statements and expressions (Type aliases)
+
+-- | 'Stmt' is an alias for 'CStat' (Syntax)
+type Stmt = CStat
+-- | 'Expr' is currently an alias for 'CExpr' (Syntax)
+type Expr = CExpr
+-- GENERATED START
+
+instance CNode TagDef where
+        nodeInfo (CompDef d) = nodeInfo d
+        nodeInfo (EnumDef d) = nodeInfo d
+instance Pos TagDef where
+        posOf x = posOf (nodeInfo x)
+
+instance CNode IdentDecl where
+        nodeInfo (Declaration d) = nodeInfo d
+        nodeInfo (ObjectDef d) = nodeInfo d
+        nodeInfo (FunctionDef d) = nodeInfo d
+        nodeInfo (EnumeratorDef d) = nodeInfo d
+instance Pos IdentDecl where
+        posOf x = posOf (nodeInfo x)
+
+instance CNode DeclEvent where
+        nodeInfo (TagEvent d) = nodeInfo d
+        nodeInfo (DeclEvent d) = nodeInfo d
+        nodeInfo (ParamEvent d) = nodeInfo d
+        nodeInfo (LocalEvent d) = nodeInfo d
+        nodeInfo (TypeDefEvent d) = nodeInfo d
+        nodeInfo (AsmEvent d) = nodeInfo d
+instance Pos DeclEvent where
+        posOf x = posOf (nodeInfo x)
+
+instance CNode Decl where
+        nodeInfo (Decl _ n) = n
+instance Pos Decl where
+        posOf x = posOf (nodeInfo x)
+
+instance CNode ObjDef where
+        nodeInfo (ObjDef _ _ n) = n
+instance Pos ObjDef where
+        posOf x = posOf (nodeInfo x)
+
+instance CNode FunDef where
+        nodeInfo (FunDef _ _ n) = n
+instance Pos FunDef where
+        posOf x = posOf (nodeInfo x)
+
+instance CNode ParamDecl where
+        nodeInfo (ParamDecl _ n) = n
+        nodeInfo (AbstractParamDecl _ n) = n
+instance Pos ParamDecl where
+        posOf x = posOf (nodeInfo x)
+
+instance CNode MemberDecl where
+        nodeInfo (MemberDecl _ _ n) = n
+        nodeInfo (AnonBitField _ _ n) = n
+instance Pos MemberDecl where
+        posOf x = posOf (nodeInfo x)
+
+instance CNode TypeDef where
+        nodeInfo (TypeDef _ _ _ n) = n
+instance Pos TypeDef where
+        posOf x = posOf (nodeInfo x)
+
+instance CNode TypeDefRef where
+        nodeInfo (TypeDefRef _ _ n) = n
+instance Pos TypeDefRef where
+        posOf x = posOf (nodeInfo x)
+
+instance CNode CompTypeRef where
+        nodeInfo (CompTypeRef _ _ n) = n
+instance Pos CompTypeRef where
+        posOf x = posOf (nodeInfo x)
+
+instance CNode EnumTypeRef where
+        nodeInfo (EnumTypeRef _ n) = n
+instance Pos EnumTypeRef where
+        posOf x = posOf (nodeInfo x)
+
+instance CNode CompType where
+        nodeInfo (CompType _ _ _ _ n) = n
+instance Pos CompType where
+        posOf x = posOf (nodeInfo x)
+
+instance CNode EnumType where
+        nodeInfo (EnumType _ _ _ n) = n
+instance Pos EnumType where
+        posOf x = posOf (nodeInfo x)
+
+instance CNode Enumerator where
+        nodeInfo (Enumerator _ _ _ n) = n
+instance Pos Enumerator where
+        posOf x = posOf (nodeInfo x)
+
+instance CNode Attr where
+        nodeInfo (Attr _ _ n) = n
+instance Pos Attr where
+        posOf x = posOf (nodeInfo x)
+-- GENERATED STOP
src/Language/C/Analysis/TravMonad.hs view
@@ -1,513 +1,513 @@-{-# LANGUAGE MultiParamTypeClasses, TypeSynonymInstances, FlexibleContexts,FlexibleInstances,-             PatternGuards, RankNTypes, ScopedTypeVariables #-}--------------------------------------------------------------------------------- |--- Module      :  Language.C.Analysis.TravMonad--- Copyright   :  (c) 2008 Benedikt Huber--- License     :  BSD-style--- Maintainer  :  benedikt.huber@gmail.com--- Stability   :  alpha--- Portability :  ghc------ Monad for Traversals of the C AST.------ For the traversal, we maintain a symboltable and need MonadError and unique--- name generation facilities.--- Furthermore, the user may provide callbacks to handle declarations and definitions.-------------------------------------------------------------------------------module Language.C.Analysis.TravMonad (-    -- * Name generation monad-    MonadName(..),-    -- * Symbol table monad-    MonadSymtab(..),-    -- * Specialized C error-handling monad-    MonadCError(..),-    -- * AST traversal monad-    MonadTrav(..),-    -- * Handling declarations-    handleTagDecl, handleTagDef, handleEnumeratorDef, handleTypeDef,-    handleObjectDef,handleFunDef,handleVarDecl,handleParamDecl,-    handleAsmBlock,-    -- * Symbol table scope modification-    enterPrototypeScope,leavePrototypeScope,-    enterFunctionScope,leaveFunctionScope,-    enterBlockScope,leaveBlockScope,-    -- * Symbol table lookup (delegate)-    lookupTypeDef, lookupObject,-    -- * Symbol table modification-    createSUERef,-    -- * Additional error handling facilities-    hadHardErrors,handleTravError,throwOnLeft,-    astError, warn,-    -- * Trav - default MonadTrav implementation-    Trav,-    runTrav,runTrav_,-    TravState,initTravState,withExtDeclHandler,modifyUserState,userState,-    getUserState,-    TravOptions(..),modifyOptions,-    travErrors,-    -- * Language options-    CLanguage(..),-    -- * Helpers-    mapMaybeM,maybeM,mapSndM,concatMapM,-)-where-import Language.C.Data-import Language.C.Data.RList as RList--import Language.C.Analysis.Builtins-import Language.C.Analysis.SemError-import Language.C.Analysis.SemRep-import Language.C.Analysis.TypeUtils (sameType)-import Language.C.Analysis.DefTable hiding (enterBlockScope,leaveBlockScope,-                                            enterFunctionScope,leaveFunctionScope)-import qualified Language.C.Analysis.DefTable as ST--import Data.IntMap (insert)-import Data.Maybe-import Control.Applicative (Applicative(..))-import Control.Monad (liftM, ap)-import Prelude hiding (lookup)--class (Monad m) => MonadName m where-    -- | unique name generation-    genName :: m Name--class (Monad m) => MonadSymtab m where-    -- symbol table handling-    -- | return the definition table-    getDefTable :: m DefTable-    -- | perform an action modifying the definition table-    withDefTable :: (DefTable -> (a, DefTable)) -> m a--class (Monad m) => MonadCError m where-    -- error handling facilities--    -- | throw an 'Error'-    throwTravError :: Error e => e -> m a-    -- | catch an 'Error' (we could implement dynamically-typed catch here)-    catchTravError :: m a -> (CError -> m a) -> m a-    -- | remember that an 'Error' occurred (without throwing it)-    recordError    :: Error e => e -> m ()-    -- | return the list of recorded errors-    getErrors      :: m [CError]---- | Traversal monad-class (MonadName m, MonadSymtab m, MonadCError m) => MonadTrav m where-    -- | handling declarations and definitions-    handleDecl :: DeclEvent -> m ()---- * handling declarations---- check wheter a redefinition is ok-checkRedef :: (MonadCError m, CNode t, CNode t1) => String -> t -> (DeclarationStatus t1) -> m ()-checkRedef subject new_decl redecl_status =-    case redecl_status of-        NewDecl -> return ()-        Redeclared old_def   -> throwTravError $-            redefinition LevelError subject DuplicateDef (nodeInfo new_decl) (nodeInfo old_def)-        KindMismatch old_def -> throwTravError $-            redefinition LevelError subject DiffKindRedecl (nodeInfo new_decl) (nodeInfo old_def)-        Shadowed _old_def     ->  return ()-            -- warn $-            -- redefinition LevelWarn subject ShadowedDef (nodeInfo new_decl) (nodeInfo old_def)-        KeepDef _old_def      -> return ()---- | forward declaration of a tag. Only necessary for name analysis, but otherwise no semantic--- consequences.-handleTagDecl :: (MonadCError m, MonadSymtab m) => TagFwdDecl -> m ()-handleTagDecl decl = do-    redecl <- withDefTable $ declareTag (sueRef decl) decl-    checkRedef (sueRefToString $ sueRef decl) decl redecl---- | define the given composite type or enumeration--- If there is a declaration visible, overwrite it with the definition.--- Otherwise, enter a new definition in the current namespace.--- If there is already a definition present, yield an error (redeclaration).-handleTagDef :: (MonadTrav m) => TagDef -> m ()-handleTagDef def = do-    redecl <- withDefTable $ defineTag (sueRef def) def-    checkRedef (sueRefToString $ sueRef def) def redecl-    handleDecl (TagEvent def)--handleEnumeratorDef :: (MonadCError m, MonadSymtab m) => Enumerator ->  m ()-handleEnumeratorDef enumerator = do-    let ident = declIdent enumerator-    redecl <- withDefTable $ defineScopedIdent ident (EnumeratorDef enumerator)-    checkRedef (identToString ident) ident redecl-    return ()--handleTypeDef :: (MonadTrav m) => TypeDef -> m ()-handleTypeDef typeDef@(TypeDef ident t1 _ _) = do-    redecl <- withDefTable $ defineTypeDef ident typeDef-    -- C11 6.7/3 If an identifier has no linkage, there shall be no more than-    -- one declaration of the identifier (in a declarator or type specifier)-    -- with the same scope and in the same name space, except that: a typedef-    -- name may be redefined to denote the same type as it currently does,-    -- provided that type is not a variably modified type;-    case redecl of-      Redeclared (Left (TypeDef _ t2 _ _)) | sameType t1 t2 -> return ()-      _ -> checkRedef (identToString ident) typeDef redecl-    handleDecl (TypeDefEvent typeDef)-    return ()--handleAsmBlock :: (MonadTrav m) => AsmBlock -> m ()-handleAsmBlock asm = handleDecl (AsmEvent asm)--redefErr :: (MonadCError m, CNode old, CNode new) =>-            Ident -> ErrorLevel -> new -> old -> RedefKind -> m ()-redefErr name lvl new old kind =-  throwTravError $ redefinition lvl (identToString name) kind (nodeInfo new) (nodeInfo old)---- TODO: unused-_checkIdentTyRedef :: (MonadCError m) => IdentEntry -> (DeclarationStatus IdentEntry) -> m ()-_checkIdentTyRedef (Right decl) status = checkVarRedef decl status-_checkIdentTyRedef (Left tydef) (KindMismatch old_def) =-  redefErr (identOfTypeDef tydef) LevelError tydef old_def DiffKindRedecl-_checkIdentTyRedef (Left tydef) (Redeclared old_def) =-  redefErr (identOfTypeDef tydef) LevelError tydef old_def DuplicateDef-_checkIdentTyRedef (Left _tydef) _ = return ()---- Check whether it is ok to declare a variable already in scope-checkVarRedef :: (MonadCError m) => IdentDecl -> (DeclarationStatus IdentEntry) -> m ()-checkVarRedef def redecl =-    case redecl of-        -- always an error-        KindMismatch old_def -> redefVarErr old_def DiffKindRedecl-        -- Declaration referencing definition:-        --   * new entry has to be a declaration-        --   * old entry and new entry have to have linkage and agree on linkage-        --   * types have to match-        KeepDef (Right old_def) | not (agreeOnLinkage def old_def) -> linkageErr def old_def-                                | otherwise -> throwOnLeft $ checkCompatibleTypes new_ty (declType old_def)-        -- redefinition:-        --   * old entry has to be a declaration or tentative definition-        --   * old entry and new entry have to have linkage and agree on linkage-        --   * types have to match-        Redeclared (Right old_def) | not (agreeOnLinkage def old_def) -> linkageErr def old_def-                                   | not(canBeOverwritten old_def) -> redefVarErr old_def DuplicateDef-                                   | otherwise -> throwOnLeft $ checkCompatibleTypes new_ty (declType old_def)-        -- NewDecl/Shadowed is ok-        _ -> return ()-    where-    redefVarErr old_def kind = redefErr (declIdent def) LevelError def old_def kind-    linkageErr new_def old_def =-        case (declLinkage new_def, declLinkage old_def) of-            (NoLinkage, _) -> redefErr (declIdent new_def) LevelError new_def old_def NoLinkageOld-            _              -> redefErr (declIdent new_def) LevelError new_def old_def DisagreeLinkage--    new_ty = declType def-    canBeOverwritten (Declaration _) = True-    canBeOverwritten (ObjectDef od)  = isTentative od-    canBeOverwritten _               = False-    agreeOnLinkage new_def old_def-        | declStorage old_def == FunLinkage InternalLinkage = True-        | not (hasLinkage $ declStorage new_def) || not (hasLinkage $ declStorage old_def) = False-        | (declLinkage new_def) /= (declLinkage old_def) = False-        | otherwise = True---- | handle variable declarations (external object declarations and function prototypes)--- variable declarations are either function prototypes, or external declarations, and not very--- interesting on their own. we only put them in the symbol table and call the handle.--- declarations never override definitions-handleVarDecl :: (MonadTrav m) => Bool -> Decl -> m ()-handleVarDecl is_local decl = do-    def <- enterDecl decl (const False)-    handleDecl ((if is_local then LocalEvent else DeclEvent) def)---- | handle parameter declaration. The interesting part is that parameters can be abstract--- (if they are part of a type). If they have a name, we enter the name (usually in function prototype or function scope),--- checking if there are duplicate definitions.--- FIXME: I think it would be more transparent to handle parameter declarations in a special way-handleParamDecl :: (MonadTrav m) => ParamDecl -> m ()-handleParamDecl pd@(AbstractParamDecl _ _) = handleDecl (ParamEvent pd)-handleParamDecl pd@(ParamDecl vardecl node) = do-    let def = ObjectDef (ObjDef vardecl Nothing node)-    redecl <- withDefTable $ defineScopedIdent (declIdent def) def-    checkVarRedef def redecl-    handleDecl (ParamEvent pd)---- shared impl-enterDecl :: (MonadCError m, MonadSymtab m) => Decl -> (IdentDecl -> Bool) -> m IdentDecl-enterDecl decl cond = do-    let def = Declaration decl-    redecl <- withDefTable $-              defineScopedIdentWhen cond (declIdent def) def-    checkVarRedef def redecl-    return def---- | handle function definitions-handleFunDef :: (MonadTrav m) => Ident -> FunDef -> m ()-handleFunDef ident fun_def = do-    let def = FunctionDef fun_def-    redecl <- withDefTable $-              defineScopedIdentWhen isDeclaration ident def-    checkVarRedef def redecl-    handleDecl (DeclEvent def)--isDeclaration :: IdentDecl -> Bool-isDeclaration (Declaration _) = True-isDeclaration _ = False--checkCompatibleTypes :: Type -> Type -> Either TypeMismatch ()-checkCompatibleTypes _ _ = Right ()---- | handle object defintions (maybe tentative)-handleObjectDef :: (MonadTrav m) => Bool -> Ident -> ObjDef -> m ()-handleObjectDef local ident obj_def = do-    let def = ObjectDef obj_def-    redecl <- withDefTable $-              defineScopedIdentWhen (shouldOverride def) ident def-    checkVarRedef def redecl-    handleDecl ((if local then LocalEvent else DeclEvent) def)-    where-    isTentativeDef (ObjectDef object_def) = isTentative object_def-    isTentativeDef _ = False-    shouldOverride def old | isDeclaration old = True-                           | not (isTentativeDef def) = True-                           | isTentativeDef old = True-                           | otherwise = False---- * scope manipulation------  * file scope: outside of parameter lists and blocks (outermost)------  * function prototype scope------  * function scope: labels are visible within the entire function, and declared implicitely------  * block scope-updDefTable :: (MonadSymtab m) => (DefTable -> DefTable) -> m ()-updDefTable f = withDefTable (\st -> ((),f st))--enterPrototypeScope :: (MonadSymtab m) => m ()-enterPrototypeScope = updDefTable (ST.enterBlockScope)--leavePrototypeScope :: (MonadSymtab m) => m ()-leavePrototypeScope = updDefTable (ST.leaveBlockScope)--enterFunctionScope :: (MonadSymtab m) => m ()-enterFunctionScope = updDefTable (ST.enterFunctionScope)--leaveFunctionScope :: (MonadSymtab m) => m ()-leaveFunctionScope = updDefTable (ST.leaveFunctionScope)--enterBlockScope :: (MonadSymtab m) => m ()-enterBlockScope = updDefTable (ST.enterBlockScope)--leaveBlockScope :: (MonadSymtab m) => m ()-leaveBlockScope = updDefTable (ST.leaveBlockScope)---- * Lookup---- | lookup a type definition--- the 'wrong kind of object' is an internal error here,--- because the parser should distinguish typeDefs and other--- objects-lookupTypeDef :: (MonadCError m, MonadSymtab m) => Ident -> m Type-lookupTypeDef ident =-    getDefTable >>= \symt ->-    case lookupIdent ident symt of-        Nothing                             ->-          astError (nodeInfo ident) $ "unbound typeDef: " ++ identToString ident-        Just (Left (TypeDef def_ident ty _ _)) -> addRef ident def_ident >> return ty-        Just (Right d)                      -> astError (nodeInfo ident) (wrongKindErrMsg d)-    where-    wrongKindErrMsg d = "wrong kind of object: expected typedef but found "++ (objKindDescr d)-                        ++ " (for identifier `" ++ identToString ident ++ "')"----- | lookup an object, function or enumerator-lookupObject :: (MonadCError m, MonadSymtab m) => Ident -> m (Maybe IdentDecl)-lookupObject ident = do-    old_decl <- liftM (lookupIdent ident) getDefTable-    mapMaybeM old_decl $ \obj ->-        case obj of-        Right objdef -> addRef ident objdef >> return objdef-        Left _tydef  -> astError (nodeInfo ident) (mismatchErr "lookupObject" "an object" "a typeDef")---- | add link between use and definition (private)-addRef :: (MonadCError m, MonadSymtab m, CNode u, CNode d) => u -> d -> m ()-addRef use def =-  case (nodeInfo use, nodeInfo def) of-    (NodeInfo _ _ useName, NodeInfo _ _ defName) ->-      withDefTable-      (\dt ->-         ((),-          dt { refTable = insert (nameId useName) defName (refTable dt) }-         )-      )-    (_, _) -> return () -- Don't have Names for both, so can't record.---mismatchErr :: String -> String -> String -> String-mismatchErr ctx expect found = ctx ++ ": Expected " ++ expect ++ ", but found: " ++ found---- * inserting declarations---- | create a reference to a struct\/union\/enum------ This currently depends on the fact the structs are tagged with unique names.--- We could use the name generation of TravMonad as well, which might be the better--- choice when dealing with autogenerated code.-createSUERef :: (MonadCError m, MonadSymtab m) => NodeInfo -> Maybe Ident -> m SUERef-createSUERef _node_info (Just ident) = return$ NamedRef ident-createSUERef node_info Nothing | (Just name) <- nameOfNode node_info = return $ AnonymousRef name-                               | otherwise = astError node_info "struct/union/enum definition without unique name"---- * error handling facilities--handleTravError :: (MonadCError m) => m a -> m (Maybe a)-handleTravError a = liftM Just a `catchTravError` (\e -> recordError e >> return Nothing)---- | check wheter non-recoverable errors occurred-hadHardErrors :: [CError] -> Bool-hadHardErrors = any isHardError---- | raise an error caused by a malformed AST-astError :: (MonadCError m) => NodeInfo -> String -> m a-astError node msg = throwTravError $ invalidAST node msg---- | raise an error based on an Either argument-throwOnLeft :: (MonadCError m, Error e) => Either e a -> m a-throwOnLeft (Left err) = throwTravError err-throwOnLeft (Right v)  = return v--warn :: (Error e, MonadCError m) => e -> m ()-warn err = recordError (changeErrorLevel err LevelWarn)---- * The Trav datatype---- | simple traversal monad, providing user state and callbacks-newtype Trav s a = Trav { unTrav :: TravState s -> Either CError (a, TravState s) }-modify :: (TravState s -> TravState s) -> Trav s ()-modify f = Trav (\s -> Right ((),f s))-gets :: (TravState s -> a) -> Trav s a-gets f   = Trav (\s -> Right (f s, s))-get ::  Trav s (TravState s)-get      = Trav (\s -> Right (s,s))-put :: TravState s -> Trav s ()-put s    = Trav (\_ -> Right ((),s))---runTrav :: forall s a. s -> Trav s a -> Either [CError] (a, TravState s)-runTrav state traversal =-    case unTrav action (initTravState state) of-        Left trav_err                                 -> Left [trav_err]-        Right (v, ts) | hadHardErrors (travErrors ts) -> Left (travErrors ts)-                      | otherwise                     -> Right (v,ts)-    where-    action = do withDefTable (const ((), builtins))-                traversal--runTrav_ :: Trav () a -> Either [CError] (a,[CError])-runTrav_ t = fmap fst . runTrav () $-    do r <- t-       es <- getErrors-       return (r,es)--withExtDeclHandler :: Trav s a -> (DeclEvent -> Trav s ()) -> Trav s a-withExtDeclHandler action handler =-    do modify $ \st -> st { doHandleExtDecl = handler }-       action--instance Functor (Trav s) where-    fmap = liftM--instance Applicative (Trav s) where-    pure  = return-    (<*>) = ap--instance Monad (Trav s) where-    return x  = Trav (\s -> Right (x,s))-    m >>= k   = Trav (\s -> case unTrav m s of-                              Right (x,s1) -> unTrav (k x) s1-                              Left e       -> Left e)--instance MonadName (Trav s) where-    -- unique name generation-    genName = generateName--instance MonadSymtab (Trav s) where-    -- symbol table handling-    getDefTable = gets symbolTable-    withDefTable f = do-        ts <- get-        let (r,symt') = f (symbolTable ts)-        put $ ts { symbolTable = symt' }-        return r--instance MonadCError (Trav s) where-    -- error handling facilities-    throwTravError e = Trav (\_ -> Left (toError e))-    catchTravError a handler = Trav (\s -> case unTrav a s of-                                             Left e  -> unTrav (handler e) s-                                             Right r -> Right r)-    recordError e = modify $ \st -> st { rerrors = (rerrors st) `snoc` toError e }-    getErrors = gets (RList.reverse . rerrors)--instance MonadTrav (Trav s) where-    -- handling declarations and definitions-    handleDecl d = ($ d) =<< gets doHandleExtDecl---- | The variety of the C language to accept. Note: this is not yet enforced.-data CLanguage = C89 | C99 | GNU89 | GNU99--data TravOptions =-    TravOptions {-        language :: CLanguage-    }--data TravState s =-    TravState {-        symbolTable :: DefTable,-        rerrors :: RList CError,-        nameGenerator :: [Name],-        doHandleExtDecl :: (DeclEvent -> Trav s ()),-        userState :: s,-        options :: TravOptions-      }--travErrors :: TravState s -> [CError]-travErrors = RList.reverse . rerrors--initTravState :: s -> TravState s-initTravState userst =-    TravState {-        symbolTable = emptyDefTable,-        rerrors = RList.empty,-        nameGenerator = newNameSupply,-        doHandleExtDecl = const (return ()),-        userState = userst,-        options = TravOptions { language = C99 }-      }---- * Trav specific operations-modifyUserState :: (s -> s) -> Trav s ()-modifyUserState f = modify $ \ts -> ts { userState = f (userState ts) }--getUserState :: Trav s s-getUserState = userState `liftM` get--modifyOptions :: (TravOptions -> TravOptions) -> Trav s ()-modifyOptions f = modify $ \ts -> ts { options = f (options ts) }--generateName :: Trav s Name-generateName =-    get >>= \ts ->-    do let (new_name : gen') = nameGenerator ts-       put $ ts { nameGenerator = gen'}-       return new_name---- * helpers-mapMaybeM :: (Monad m) => (Maybe a) -> (a -> m b) -> m (Maybe b)-mapMaybeM m f = maybe (return Nothing) (liftM Just . f) m--maybeM :: (Monad m) => (Maybe a) -> (a -> m ()) -> m ()-maybeM m f = maybe (return ()) f m--mapSndM :: (Monad m) => (b -> m c) -> (a,b) -> m (a,c)-mapSndM f (a,b) = liftM ((,) a) (f b)--concatMapM :: (Monad m) => (a -> m [b]) -> [a] -> m [b]-concatMapM f = liftM concat . mapM f+{-# LANGUAGE MultiParamTypeClasses, TypeSynonymInstances, FlexibleContexts,FlexibleInstances,
+             PatternGuards, RankNTypes, ScopedTypeVariables #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Analysis.TravMonad
+-- Copyright   :  (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  alpha
+-- Portability :  ghc
+--
+-- Monad for Traversals of the C AST.
+--
+-- For the traversal, we maintain a symboltable and need MonadError and unique
+-- name generation facilities.
+-- Furthermore, the user may provide callbacks to handle declarations and definitions.
+-----------------------------------------------------------------------------
+module Language.C.Analysis.TravMonad (
+    -- * Name generation monad
+    MonadName(..),
+    -- * Symbol table monad
+    MonadSymtab(..),
+    -- * Specialized C error-handling monad
+    MonadCError(..),
+    -- * AST traversal monad
+    MonadTrav(..),
+    -- * Handling declarations
+    handleTagDecl, handleTagDef, handleEnumeratorDef, handleTypeDef,
+    handleObjectDef,handleFunDef,handleVarDecl,handleParamDecl,
+    handleAsmBlock,
+    -- * Symbol table scope modification
+    enterPrototypeScope,leavePrototypeScope,
+    enterFunctionScope,leaveFunctionScope,
+    enterBlockScope,leaveBlockScope,
+    -- * Symbol table lookup (delegate)
+    lookupTypeDef, lookupObject,
+    -- * Symbol table modification
+    createSUERef,
+    -- * Additional error handling facilities
+    hadHardErrors,handleTravError,throwOnLeft,
+    astError, warn,
+    -- * Trav - default MonadTrav implementation
+    Trav,
+    runTrav,runTrav_,
+    TravState,initTravState,withExtDeclHandler,modifyUserState,userState,
+    getUserState,
+    TravOptions(..),modifyOptions,
+    travErrors,
+    -- * Language options
+    CLanguage(..),
+    -- * Helpers
+    mapMaybeM,maybeM,mapSndM,concatMapM,
+)
+where
+import Language.C.Data
+import Language.C.Data.RList as RList
+
+import Language.C.Analysis.Builtins
+import Language.C.Analysis.SemError
+import Language.C.Analysis.SemRep
+import Language.C.Analysis.TypeUtils (sameType)
+import Language.C.Analysis.DefTable hiding (enterBlockScope,leaveBlockScope,
+                                            enterFunctionScope,leaveFunctionScope)
+import qualified Language.C.Analysis.DefTable as ST
+
+import Data.IntMap (insert)
+import Data.Maybe
+import Control.Applicative (Applicative(..))
+import Control.Monad (liftM, ap)
+import Prelude hiding (lookup)
+
+class (Monad m) => MonadName m where
+    -- | unique name generation
+    genName :: m Name
+
+class (Monad m) => MonadSymtab m where
+    -- symbol table handling
+    -- | return the definition table
+    getDefTable :: m DefTable
+    -- | perform an action modifying the definition table
+    withDefTable :: (DefTable -> (a, DefTable)) -> m a
+
+class (Monad m) => MonadCError m where
+    -- error handling facilities
+
+    -- | throw an 'Error'
+    throwTravError :: Error e => e -> m a
+    -- | catch an 'Error' (we could implement dynamically-typed catch here)
+    catchTravError :: m a -> (CError -> m a) -> m a
+    -- | remember that an 'Error' occurred (without throwing it)
+    recordError    :: Error e => e -> m ()
+    -- | return the list of recorded errors
+    getErrors      :: m [CError]
+
+-- | Traversal monad
+class (MonadName m, MonadSymtab m, MonadCError m) => MonadTrav m where
+    -- | handling declarations and definitions
+    handleDecl :: DeclEvent -> m ()
+
+-- * handling declarations
+
+-- check wheter a redefinition is ok
+checkRedef :: (MonadCError m, CNode t, CNode t1) => String -> t -> (DeclarationStatus t1) -> m ()
+checkRedef subject new_decl redecl_status =
+    case redecl_status of
+        NewDecl -> return ()
+        Redeclared old_def   -> throwTravError $
+            redefinition LevelError subject DuplicateDef (nodeInfo new_decl) (nodeInfo old_def)
+        KindMismatch old_def -> throwTravError $
+            redefinition LevelError subject DiffKindRedecl (nodeInfo new_decl) (nodeInfo old_def)
+        Shadowed _old_def     ->  return ()
+            -- warn $
+            -- redefinition LevelWarn subject ShadowedDef (nodeInfo new_decl) (nodeInfo old_def)
+        KeepDef _old_def      -> return ()
+
+-- | forward declaration of a tag. Only necessary for name analysis, but otherwise no semantic
+-- consequences.
+handleTagDecl :: (MonadCError m, MonadSymtab m) => TagFwdDecl -> m ()
+handleTagDecl decl = do
+    redecl <- withDefTable $ declareTag (sueRef decl) decl
+    checkRedef (sueRefToString $ sueRef decl) decl redecl
+
+-- | define the given composite type or enumeration
+-- If there is a declaration visible, overwrite it with the definition.
+-- Otherwise, enter a new definition in the current namespace.
+-- If there is already a definition present, yield an error (redeclaration).
+handleTagDef :: (MonadTrav m) => TagDef -> m ()
+handleTagDef def = do
+    redecl <- withDefTable $ defineTag (sueRef def) def
+    checkRedef (sueRefToString $ sueRef def) def redecl
+    handleDecl (TagEvent def)
+
+handleEnumeratorDef :: (MonadCError m, MonadSymtab m) => Enumerator ->  m ()
+handleEnumeratorDef enumerator = do
+    let ident = declIdent enumerator
+    redecl <- withDefTable $ defineScopedIdent ident (EnumeratorDef enumerator)
+    checkRedef (identToString ident) ident redecl
+    return ()
+
+handleTypeDef :: (MonadTrav m) => TypeDef -> m ()
+handleTypeDef typeDef@(TypeDef ident t1 _ _) = do
+    redecl <- withDefTable $ defineTypeDef ident typeDef
+    -- C11 6.7/3 If an identifier has no linkage, there shall be no more than
+    -- one declaration of the identifier (in a declarator or type specifier)
+    -- with the same scope and in the same name space, except that: a typedef
+    -- name may be redefined to denote the same type as it currently does,
+    -- provided that type is not a variably modified type;
+    case redecl of
+      Redeclared (Left (TypeDef _ t2 _ _)) | sameType t1 t2 -> return ()
+      _ -> checkRedef (identToString ident) typeDef redecl
+    handleDecl (TypeDefEvent typeDef)
+    return ()
+
+handleAsmBlock :: (MonadTrav m) => AsmBlock -> m ()
+handleAsmBlock asm = handleDecl (AsmEvent asm)
+
+redefErr :: (MonadCError m, CNode old, CNode new) =>
+            Ident -> ErrorLevel -> new -> old -> RedefKind -> m ()
+redefErr name lvl new old kind =
+  throwTravError $ redefinition lvl (identToString name) kind (nodeInfo new) (nodeInfo old)
+
+-- TODO: unused
+_checkIdentTyRedef :: (MonadCError m) => IdentEntry -> (DeclarationStatus IdentEntry) -> m ()
+_checkIdentTyRedef (Right decl) status = checkVarRedef decl status
+_checkIdentTyRedef (Left tydef) (KindMismatch old_def) =
+  redefErr (identOfTypeDef tydef) LevelError tydef old_def DiffKindRedecl
+_checkIdentTyRedef (Left tydef) (Redeclared old_def) =
+  redefErr (identOfTypeDef tydef) LevelError tydef old_def DuplicateDef
+_checkIdentTyRedef (Left _tydef) _ = return ()
+
+-- Check whether it is ok to declare a variable already in scope
+checkVarRedef :: (MonadCError m) => IdentDecl -> (DeclarationStatus IdentEntry) -> m ()
+checkVarRedef def redecl =
+    case redecl of
+        -- always an error
+        KindMismatch old_def -> redefVarErr old_def DiffKindRedecl
+        -- Declaration referencing definition:
+        --   * new entry has to be a declaration
+        --   * old entry and new entry have to have linkage and agree on linkage
+        --   * types have to match
+        KeepDef (Right old_def) | not (agreeOnLinkage def old_def) -> linkageErr def old_def
+                                | otherwise -> throwOnLeft $ checkCompatibleTypes new_ty (declType old_def)
+        -- redefinition:
+        --   * old entry has to be a declaration or tentative definition
+        --   * old entry and new entry have to have linkage and agree on linkage
+        --   * types have to match
+        Redeclared (Right old_def) | not (agreeOnLinkage def old_def) -> linkageErr def old_def
+                                   | not(canBeOverwritten old_def) -> redefVarErr old_def DuplicateDef
+                                   | otherwise -> throwOnLeft $ checkCompatibleTypes new_ty (declType old_def)
+        -- NewDecl/Shadowed is ok
+        _ -> return ()
+    where
+    redefVarErr old_def kind = redefErr (declIdent def) LevelError def old_def kind
+    linkageErr new_def old_def =
+        case (declLinkage new_def, declLinkage old_def) of
+            (NoLinkage, _) -> redefErr (declIdent new_def) LevelError new_def old_def NoLinkageOld
+            _              -> redefErr (declIdent new_def) LevelError new_def old_def DisagreeLinkage
+
+    new_ty = declType def
+    canBeOverwritten (Declaration _) = True
+    canBeOverwritten (ObjectDef od)  = isTentative od
+    canBeOverwritten _               = False
+    agreeOnLinkage new_def old_def
+        | declStorage old_def == FunLinkage InternalLinkage = True
+        | not (hasLinkage $ declStorage new_def) || not (hasLinkage $ declStorage old_def) = False
+        | (declLinkage new_def) /= (declLinkage old_def) = False
+        | otherwise = True
+
+-- | handle variable declarations (external object declarations and function prototypes)
+-- variable declarations are either function prototypes, or external declarations, and not very
+-- interesting on their own. we only put them in the symbol table and call the handle.
+-- declarations never override definitions
+handleVarDecl :: (MonadTrav m) => Bool -> Decl -> m ()
+handleVarDecl is_local decl = do
+    def <- enterDecl decl (const False)
+    handleDecl ((if is_local then LocalEvent else DeclEvent) def)
+
+-- | handle parameter declaration. The interesting part is that parameters can be abstract
+-- (if they are part of a type). If they have a name, we enter the name (usually in function prototype or function scope),
+-- checking if there are duplicate definitions.
+-- FIXME: I think it would be more transparent to handle parameter declarations in a special way
+handleParamDecl :: (MonadTrav m) => ParamDecl -> m ()
+handleParamDecl pd@(AbstractParamDecl _ _) = handleDecl (ParamEvent pd)
+handleParamDecl pd@(ParamDecl vardecl node) = do
+    let def = ObjectDef (ObjDef vardecl Nothing node)
+    redecl <- withDefTable $ defineScopedIdent (declIdent def) def
+    checkVarRedef def redecl
+    handleDecl (ParamEvent pd)
+
+-- shared impl
+enterDecl :: (MonadCError m, MonadSymtab m) => Decl -> (IdentDecl -> Bool) -> m IdentDecl
+enterDecl decl cond = do
+    let def = Declaration decl
+    redecl <- withDefTable $
+              defineScopedIdentWhen cond (declIdent def) def
+    checkVarRedef def redecl
+    return def
+
+-- | handle function definitions
+handleFunDef :: (MonadTrav m) => Ident -> FunDef -> m ()
+handleFunDef ident fun_def = do
+    let def = FunctionDef fun_def
+    redecl <- withDefTable $
+              defineScopedIdentWhen isDeclaration ident def
+    checkVarRedef def redecl
+    handleDecl (DeclEvent def)
+
+isDeclaration :: IdentDecl -> Bool
+isDeclaration (Declaration _) = True
+isDeclaration _ = False
+
+checkCompatibleTypes :: Type -> Type -> Either TypeMismatch ()
+checkCompatibleTypes _ _ = Right ()
+
+-- | handle object defintions (maybe tentative)
+handleObjectDef :: (MonadTrav m) => Bool -> Ident -> ObjDef -> m ()
+handleObjectDef local ident obj_def = do
+    let def = ObjectDef obj_def
+    redecl <- withDefTable $
+              defineScopedIdentWhen (shouldOverride def) ident def
+    checkVarRedef def redecl
+    handleDecl ((if local then LocalEvent else DeclEvent) def)
+    where
+    isTentativeDef (ObjectDef object_def) = isTentative object_def
+    isTentativeDef _ = False
+    shouldOverride def old | isDeclaration old = True
+                           | not (isTentativeDef def) = True
+                           | isTentativeDef old = True
+                           | otherwise = False
+
+-- * scope manipulation
+--
+--  * file scope: outside of parameter lists and blocks (outermost)
+--
+--  * function prototype scope
+--
+--  * function scope: labels are visible within the entire function, and declared implicitely
+--
+--  * block scope
+updDefTable :: (MonadSymtab m) => (DefTable -> DefTable) -> m ()
+updDefTable f = withDefTable (\st -> ((),f st))
+
+enterPrototypeScope :: (MonadSymtab m) => m ()
+enterPrototypeScope = updDefTable (ST.enterBlockScope)
+
+leavePrototypeScope :: (MonadSymtab m) => m ()
+leavePrototypeScope = updDefTable (ST.leaveBlockScope)
+
+enterFunctionScope :: (MonadSymtab m) => m ()
+enterFunctionScope = updDefTable (ST.enterFunctionScope)
+
+leaveFunctionScope :: (MonadSymtab m) => m ()
+leaveFunctionScope = updDefTable (ST.leaveFunctionScope)
+
+enterBlockScope :: (MonadSymtab m) => m ()
+enterBlockScope = updDefTable (ST.enterBlockScope)
+
+leaveBlockScope :: (MonadSymtab m) => m ()
+leaveBlockScope = updDefTable (ST.leaveBlockScope)
+
+-- * Lookup
+
+-- | lookup a type definition
+-- the 'wrong kind of object' is an internal error here,
+-- because the parser should distinguish typeDefs and other
+-- objects
+lookupTypeDef :: (MonadCError m, MonadSymtab m) => Ident -> m Type
+lookupTypeDef ident =
+    getDefTable >>= \symt ->
+    case lookupIdent ident symt of
+        Nothing                             ->
+          astError (nodeInfo ident) $ "unbound typeDef: " ++ identToString ident
+        Just (Left (TypeDef def_ident ty _ _)) -> addRef ident def_ident >> return ty
+        Just (Right d)                      -> astError (nodeInfo ident) (wrongKindErrMsg d)
+    where
+    wrongKindErrMsg d = "wrong kind of object: expected typedef but found "++ (objKindDescr d)
+                        ++ " (for identifier `" ++ identToString ident ++ "')"
+
+
+-- | lookup an object, function or enumerator
+lookupObject :: (MonadCError m, MonadSymtab m) => Ident -> m (Maybe IdentDecl)
+lookupObject ident = do
+    old_decl <- liftM (lookupIdent ident) getDefTable
+    mapMaybeM old_decl $ \obj ->
+        case obj of
+        Right objdef -> addRef ident objdef >> return objdef
+        Left _tydef  -> astError (nodeInfo ident) (mismatchErr "lookupObject" "an object" "a typeDef")
+
+-- | add link between use and definition (private)
+addRef :: (MonadCError m, MonadSymtab m, CNode u, CNode d) => u -> d -> m ()
+addRef use def =
+  case (nodeInfo use, nodeInfo def) of
+    (NodeInfo _ _ useName, NodeInfo _ _ defName) ->
+      withDefTable
+      (\dt ->
+         ((),
+          dt { refTable = insert (nameId useName) defName (refTable dt) }
+         )
+      )
+    (_, _) -> return () -- Don't have Names for both, so can't record.
+
+
+mismatchErr :: String -> String -> String -> String
+mismatchErr ctx expect found = ctx ++ ": Expected " ++ expect ++ ", but found: " ++ found
+
+-- * inserting declarations
+
+-- | create a reference to a struct\/union\/enum
+--
+-- This currently depends on the fact the structs are tagged with unique names.
+-- We could use the name generation of TravMonad as well, which might be the better
+-- choice when dealing with autogenerated code.
+createSUERef :: (MonadCError m, MonadSymtab m) => NodeInfo -> Maybe Ident -> m SUERef
+createSUERef _node_info (Just ident) = return$ NamedRef ident
+createSUERef node_info Nothing | (Just name) <- nameOfNode node_info = return $ AnonymousRef name
+                               | otherwise = astError node_info "struct/union/enum definition without unique name"
+
+-- * error handling facilities
+
+handleTravError :: (MonadCError m) => m a -> m (Maybe a)
+handleTravError a = liftM Just a `catchTravError` (\e -> recordError e >> return Nothing)
+
+-- | check wheter non-recoverable errors occurred
+hadHardErrors :: [CError] -> Bool
+hadHardErrors = any isHardError
+
+-- | raise an error caused by a malformed AST
+astError :: (MonadCError m) => NodeInfo -> String -> m a
+astError node msg = throwTravError $ invalidAST node msg
+
+-- | raise an error based on an Either argument
+throwOnLeft :: (MonadCError m, Error e) => Either e a -> m a
+throwOnLeft (Left err) = throwTravError err
+throwOnLeft (Right v)  = return v
+
+warn :: (Error e, MonadCError m) => e -> m ()
+warn err = recordError (changeErrorLevel err LevelWarn)
+
+-- * The Trav datatype
+
+-- | simple traversal monad, providing user state and callbacks
+newtype Trav s a = Trav { unTrav :: TravState s -> Either CError (a, TravState s) }
+modify :: (TravState s -> TravState s) -> Trav s ()
+modify f = Trav (\s -> Right ((),f s))
+gets :: (TravState s -> a) -> Trav s a
+gets f   = Trav (\s -> Right (f s, s))
+get ::  Trav s (TravState s)
+get      = Trav (\s -> Right (s,s))
+put :: TravState s -> Trav s ()
+put s    = Trav (\_ -> Right ((),s))
+
+
+runTrav :: forall s a. s -> Trav s a -> Either [CError] (a, TravState s)
+runTrav state traversal =
+    case unTrav action (initTravState state) of
+        Left trav_err                                 -> Left [trav_err]
+        Right (v, ts) | hadHardErrors (travErrors ts) -> Left (travErrors ts)
+                      | otherwise                     -> Right (v,ts)
+    where
+    action = do withDefTable (const ((), builtins))
+                traversal
+
+runTrav_ :: Trav () a -> Either [CError] (a,[CError])
+runTrav_ t = fmap fst . runTrav () $
+    do r <- t
+       es <- getErrors
+       return (r,es)
+
+withExtDeclHandler :: Trav s a -> (DeclEvent -> Trav s ()) -> Trav s a
+withExtDeclHandler action handler =
+    do modify $ \st -> st { doHandleExtDecl = handler }
+       action
+
+instance Functor (Trav s) where
+    fmap = liftM
+
+instance Applicative (Trav s) where
+    pure  = return
+    (<*>) = ap
+
+instance Monad (Trav s) where
+    return x  = Trav (\s -> Right (x,s))
+    m >>= k   = Trav (\s -> case unTrav m s of
+                              Right (x,s1) -> unTrav (k x) s1
+                              Left e       -> Left e)
+
+instance MonadName (Trav s) where
+    -- unique name generation
+    genName = generateName
+
+instance MonadSymtab (Trav s) where
+    -- symbol table handling
+    getDefTable = gets symbolTable
+    withDefTable f = do
+        ts <- get
+        let (r,symt') = f (symbolTable ts)
+        put $ ts { symbolTable = symt' }
+        return r
+
+instance MonadCError (Trav s) where
+    -- error handling facilities
+    throwTravError e = Trav (\_ -> Left (toError e))
+    catchTravError a handler = Trav (\s -> case unTrav a s of
+                                             Left e  -> unTrav (handler e) s
+                                             Right r -> Right r)
+    recordError e = modify $ \st -> st { rerrors = (rerrors st) `snoc` toError e }
+    getErrors = gets (RList.reverse . rerrors)
+
+instance MonadTrav (Trav s) where
+    -- handling declarations and definitions
+    handleDecl d = ($ d) =<< gets doHandleExtDecl
+
+-- | The variety of the C language to accept. Note: this is not yet enforced.
+data CLanguage = C89 | C99 | GNU89 | GNU99
+
+data TravOptions =
+    TravOptions {
+        language :: CLanguage
+    }
+
+data TravState s =
+    TravState {
+        symbolTable :: DefTable,
+        rerrors :: RList CError,
+        nameGenerator :: [Name],
+        doHandleExtDecl :: (DeclEvent -> Trav s ()),
+        userState :: s,
+        options :: TravOptions
+      }
+
+travErrors :: TravState s -> [CError]
+travErrors = RList.reverse . rerrors
+
+initTravState :: s -> TravState s
+initTravState userst =
+    TravState {
+        symbolTable = emptyDefTable,
+        rerrors = RList.empty,
+        nameGenerator = newNameSupply,
+        doHandleExtDecl = const (return ()),
+        userState = userst,
+        options = TravOptions { language = C99 }
+      }
+
+-- * Trav specific operations
+modifyUserState :: (s -> s) -> Trav s ()
+modifyUserState f = modify $ \ts -> ts { userState = f (userState ts) }
+
+getUserState :: Trav s s
+getUserState = userState `liftM` get
+
+modifyOptions :: (TravOptions -> TravOptions) -> Trav s ()
+modifyOptions f = modify $ \ts -> ts { options = f (options ts) }
+
+generateName :: Trav s Name
+generateName =
+    get >>= \ts ->
+    do let (new_name : gen') = nameGenerator ts
+       put $ ts { nameGenerator = gen'}
+       return new_name
+
+-- * helpers
+mapMaybeM :: (Monad m) => (Maybe a) -> (a -> m b) -> m (Maybe b)
+mapMaybeM m f = maybe (return Nothing) (liftM Just . f) m
+
+maybeM :: (Monad m) => (Maybe a) -> (a -> m ()) -> m ()
+maybeM m f = maybe (return ()) f m
+
+mapSndM :: (Monad m) => (b -> m c) -> (a,b) -> m (a,c)
+mapSndM f (a,b) = liftM ((,) a) (f b)
+
+concatMapM :: (Monad m) => (a -> m [b]) -> [a] -> m [b]
+concatMapM f = liftM concat . mapM f
src/Language/C/Analysis/TypeCheck.hs view
@@ -1,446 +1,446 @@-{-# LANGUAGE FlexibleInstances, CPP #-}-module Language.C.Analysis.TypeCheck where--import Control.Monad-import Data.Maybe-import Language.C.Data.Ident-import Language.C.Data.Node-import Language.C.Data.Position-import Language.C.Pretty-import Language.C.Syntax.AST-import Language.C.Syntax.Constants-import Language.C.Syntax.Ops-import Language.C.Analysis.DefTable-import Language.C.Analysis.SemRep-import Language.C.Analysis.TravMonad-import Language.C.Analysis.TypeConversions-import Language.C.Analysis.TypeUtils-import Language.C.Analysis.Debug ()-import Text.PrettyPrint.HughesPJ---- We used to re-implement and export the standard Either instance for--- Monad, which is bad, because as of GHC 7 it is in Control.Monad.Instances--- in base >4.2. For backwards compatibility with ghc-6.X, we use CPP here.-#if __GLASGOW_HASKELL__ < 700-instance Monad (Either String) where-    return        = Right-    Left  l >>= _ = Left l-    Right r >>= k = k r-    fail msg      = Left msg-#endif--pType :: Type -> String-pType = render . pretty--typeErrorOnLeft :: (MonadCError m) => NodeInfo -> Either String a -> m a-typeErrorOnLeft ni (Left err) = typeError ni err-typeErrorOnLeft _  (Right v)  = return v---- XXX: this should use a custom error type, but typeMismatch isn't always right-typeError :: MonadCError m => NodeInfo -> String -> m a-typeError = astError--notFound :: Ident -> Either String a-notFound i = Left $ "not found: " ++ identToString i--checkScalar' :: MonadCError m => NodeInfo -> Type -> m ()-checkScalar' ni = typeErrorOnLeft ni . checkScalar--checkIntegral' :: MonadCError m => NodeInfo -> Type -> m ()-checkIntegral' ni = typeErrorOnLeft ni . checkIntegral--assignCompatible' :: MonadCError m =>-                     NodeInfo -> CAssignOp -> Type -> Type -> m ()-assignCompatible' ni op t1 t2 = typeErrorOnLeft ni (assignCompatible op t1 t2)--binopType' :: MonadCError m =>-              NodeInfo -> CBinaryOp -> Type -> Type -> m Type-binopType' ni op t1 t2 = typeErrorOnLeft ni (binopType op t1 t2)--conditionalType' :: MonadCError m => NodeInfo -> Type -> Type -> m Type-conditionalType' ni t1 t2 = typeErrorOnLeft ni $ conditionalType t1 t2--checkScalar :: Type -> Either String ()-checkScalar t =-  case canonicalType t of-    DirectType _ _ _  -> Right ()-    PtrType _ _ _     -> Right ()-    ArrayType _ _ _ _ -> Right () -- because it's just a pointer-    t' -> Left $-          "expected scalar type, got: "-          ++ pType t ++ " (" ++ pType t' ++ ")"--checkIntegral :: Type -> Either String ()-checkIntegral t | isIntegralType (canonicalType t) = Right ()-                | otherwise = Left $-                              "expected integral type, got: " ++-                              pType t ++ " (" ++-                              pType (canonicalType t) ++ ")"---- | Determine the type of a constant.-constType :: (MonadCError m, MonadName m) => CConst -> m Type-constType (CIntConst (CInteger _ _ flags) _) =-  return $ DirectType (TyIntegral (getIntType flags)) noTypeQuals noAttributes-constType (CCharConst (CChar _ True) _) =-  return $ DirectType (TyIntegral TyInt) noTypeQuals noAttributes-constType (CCharConst (CChar _ False) _) =-  return $ DirectType (TyIntegral TyChar) noTypeQuals noAttributes-constType (CCharConst (CChars _ _) _)  =-  return $ DirectType (TyIntegral TyInt) noTypeQuals noAttributes -- XXX-constType (CFloatConst (CFloat fs) _) =-  return $ DirectType (TyFloating (getFloatType fs)) noTypeQuals noAttributes--- XXX: should strings have any type qualifiers or attributes?-constType (CStrConst (CString chars wide) ni) =-  do n <- genName-     let charType | wide      = TyInt -- XXX: this isn't universal-                  | otherwise = TyChar-         ni' = mkNodeInfo (posOf ni) n-         arraySize = ArraySize-                     True -- XXX: is it static?-                     (CConst-                      (CIntConst-                       (cInteger (toInteger (length chars))) ni'))-     return $ ArrayType (DirectType (TyIntegral charType) noTypeQuals noAttributes)-                        arraySize noTypeQuals []---- | Determine whether two types are compatible.-compatible :: Type -> Type -> Either String ()-compatible t1 t2 = void$ compositeType t1 t2---- | Determine the composite type of two compatible types.-compositeType :: Type -> Type -> Either String Type-compositeType t1 (DirectType (TyBuiltin TyAny) _ _) = Right t1-compositeType (DirectType (TyBuiltin TyAny) _ _) t2 = Right t2-compositeType t1@(DirectType tn1 q1 a1) t2@(DirectType tn2 q2 a2) =-  do tn <- case (tn1, tn2) of-             (TyVoid, TyVoid) -> Right TyVoid-             (TyIntegral _, TyEnum _) -> Right tn1-             (TyEnum _, TyIntegral _) -> Right tn2-             (TyIntegral i1, TyIntegral i2) ->-               Right $ TyIntegral (intConversion i1 i2)-             (TyFloating f1, TyFloating f2) ->-               Right $ TyFloating (floatConversion f1 f2)-             (TyComplex f1, TyComplex f2) ->-               Right $ TyComplex (floatConversion f1 f2)-             (TyComp c1, TyComp c2) ->-               do when (sueRef c1 /= sueRef c2) $-                       Left $ "incompatible composite types: "-                              ++ pType t1 ++ ", " ++ pType t2-                  Right tn1-             (TyEnum e1, TyEnum e2) ->-               do when (sueRef e1 /= sueRef e2) $-                       Left $ "incompatible enumeration types: "-                              ++ pType t1 ++ ", " ++ pType t2-                  Right $ TyEnum e1-             (TyBuiltin TyVaList, TyBuiltin TyVaList) ->-               Right $ TyBuiltin TyVaList-             (TyBuiltin _, TyBuiltin _) ->-               Left $ "incompatible builtin types: "-                      ++ pType t1 ++ ", " ++ pType t2-             (_, _) -> Left $ "incompatible direct types: "-                       ++ pType t1 ++ ", " ++ pType t2-     Right $ DirectType tn (mergeTypeQuals q1 q2) (mergeAttributes a1 a2)-compositeType (PtrType t1 q1 a1) (PtrType (DirectType TyVoid _ _) q2 _) =-  Right $ PtrType t1 (mergeTypeQuals q1 q2) a1-compositeType (PtrType (DirectType TyVoid _ _) q1 _) (PtrType t2 q2 a2) =-  Right $ PtrType t2 (mergeTypeQuals q1 q2) a2-compositeType (PtrType t1 q1 a1) t2 | isIntegralType t2 =-  Right $ PtrType t1 (mergeTypeQuals q1 (typeQuals t2)) a1-compositeType t1 (PtrType t2 q2 a2) | isIntegralType t1 =-  Right $ PtrType t2 (mergeTypeQuals (typeQuals t1) q2) a2-compositeType (ArrayType t1 _sz1 q1 a1) t2 | isIntegralType t2 =-  Right $ PtrType t1 q1 a1-compositeType t1 (ArrayType t2 _sz2 q2 a2) | isIntegralType t1 =-  Right $ PtrType t2 q2 a2-compositeType (ArrayType t1 s1 q1 a1) (ArrayType t2 s2 q2 a2) =-  do t <- compositeType t1 t2-     s <- compositeSize s1 s2-     let quals = mergeTypeQuals q1 q2-         attrs = mergeAttrs a1 a2-     Right (ArrayType t s quals attrs)-compositeType t1 t2 | isPointerType t1 && isPointerType t2 =-  do t <- compositeType (baseType t1) (baseType t2)-     let quals = mergeTypeQuals (typeQuals t1) (typeQuals t2)-         attrs = mergeAttrs (typeAttrs t1) (typeAttrs t2)-     Right (PtrType t quals attrs)-compositeType (TypeDefType tdr1 _q1 _a1) (TypeDefType tdr2 _q2 _a2) =-  case (tdr1, tdr2) of-    (TypeDefRef _ t1 _, TypeDefRef _ t2 _) ->-      compositeType t1 t2-compositeType (FunctionType ft1 attrs1) (FunctionType ft2 attrs2) =-  case (ft1, ft2) of-    (FunType rt1 args1 varargs1, FunType rt2 args2 varargs2) ->-      do {- when (length args1 /= length args2) $-              Left "different numbers of arguments in function types" -}-         args <- zipWithM compositeParamDecl args1 args2-         when (varargs1 /= varargs2) $-              Left "incompatible varargs declarations"-         doFunType rt1 rt2 args varargs1-    (FunType rt1 args1 varargs1, FunTypeIncomplete rt2) ->-      doFunType rt1 rt2 args1 varargs1-    (FunTypeIncomplete rt1, FunType rt2 args2 varargs2) ->-      doFunType rt1 rt2 args2 varargs2-    (FunTypeIncomplete rt1, FunTypeIncomplete rt2) ->-      do rt <- compositeType rt1 rt2-         Right (FunctionType (FunTypeIncomplete rt) (mergeAttrs attrs1 attrs2))-  where doFunType rt1 rt2 args varargs =-          do rt <- compositeType rt1 rt2-             Right (FunctionType-                     (FunType rt args varargs)-                     (mergeAttrs attrs1 attrs2))-compositeType t1 t2 = Left $ "incompatible types: "-                         ++ pType t1 ++ ", " ++ pType t2---- XXX: this may not be correct-compositeSize :: ArraySize -> ArraySize -> Either String ArraySize-compositeSize (UnknownArraySize _) s2 = Right s2-compositeSize s1 (UnknownArraySize _) = Right s1-compositeSize (ArraySize s1 e1) (ArraySize s2 e2)-  | s1 == s2 && sizeEqual e1 e2 = Right $ ArraySize s1 e1-  | otherwise = Right $ ArraySize s1 e1-{--    fail $ "incompatible array sizes: "-           ++ (render . pretty) e1 ++ ", " ++ (render . pretty) e2--}--sizeEqual :: CExpr -> CExpr -> Bool-sizeEqual (CConst (CIntConst i1 _)) (CConst (CIntConst i2 _)) = i1 == i2-sizeEqual e1 e2 = nodeInfo e1 == nodeInfo e2--mergeAttrs :: Attributes -> Attributes -> Attributes-mergeAttrs = (++) -- XXX: ultimately this should be smarter--compositeParamDecl :: ParamDecl -> ParamDecl -> Either String ParamDecl-compositeParamDecl (ParamDecl vd1 ni1) (ParamDecl vd2 _) =-  compositeParamDecl' ParamDecl vd1 vd2 ni1-compositeParamDecl (AbstractParamDecl vd1 _) (ParamDecl vd2 ni2) =-  compositeParamDecl' ParamDecl vd1 vd2 ni2-compositeParamDecl (ParamDecl vd1 ni1) (AbstractParamDecl vd2 _) =-  compositeParamDecl' ParamDecl vd1 vd2 ni1-compositeParamDecl (AbstractParamDecl vd1 ni1) (AbstractParamDecl vd2 _) =-  compositeParamDecl' AbstractParamDecl vd1 vd2 ni1--compositeParamDecl' :: (VarDecl -> NodeInfo -> ParamDecl)-                    -> VarDecl-                    -> VarDecl-                    -> NodeInfo-                    -> Either String ParamDecl-compositeParamDecl' f (VarDecl n1 attrs1 t1) (VarDecl n2 attrs2 t2) dni =-  do vd <- compositeVarDecl (VarDecl n1 attrs1 t1') (VarDecl n2 attrs2 t2')-     Right $ f vd dni-  where t1' = canonicalType t1-        t2' = canonicalType t2--compositeVarDecl :: VarDecl -> VarDecl -> Either String VarDecl-compositeVarDecl (VarDecl n1 attrs1 t1) (VarDecl _ attrs2 t2) =-  do t <- compositeType t1 t2-     Right (VarDecl n1 (compositeDeclAttrs attrs1 attrs2) t)---- XXX: bad treatement of inline and storage-compositeDeclAttrs :: DeclAttrs -> DeclAttrs -> DeclAttrs-compositeDeclAttrs (DeclAttrs inl stor attrs1) (DeclAttrs _ _ attrs2) =-  DeclAttrs inl stor (mergeAttrs attrs1 attrs2)--castCompatible :: Type -> Type -> Either String ()-castCompatible t1 t2 =-  case (canonicalType t1, canonicalType t2) of-    (DirectType TyVoid _ _, _) -> Right ()-    (_, _) -> checkScalar t1 >> checkScalar t2---- | Determine whether two types are compatible in an assignment expression.-assignCompatible :: CAssignOp -> Type -> Type -> Either String ()-assignCompatible CAssignOp t1 t2 =-  case (canonicalType t1, canonicalType t2) of-    (DirectType (TyBuiltin TyAny) _ _, _) -> Right ()-    (_, DirectType (TyBuiltin TyAny) _ _) -> Right ()-    -- XXX: check qualifiers-    (PtrType (DirectType TyVoid _ _) _ _, t2') | isPointerType t2' -> Right ()-    -- XXX: check qualifiers-    (t1', PtrType (DirectType TyVoid _ _) _ _) | isPointerType t1' -> Right ()-    (PtrType _ _ _, t2') | isIntegralType t2' -> Right ()-    (t1', t2') | isPointerType t1' && isPointerType t2' ->-                 compatible (baseType t1') (baseType t2')-                --unless (typeQuals t2 <= typeQuals t1) $-                --       Left $-                --       "incompatible qualifiers in pointer assignment: "-                --       ++ pType t1 ++ ", " ++ pType t2-    (DirectType (TyComp c1) _ _, DirectType (TyComp c2) _ _)-      | sueRef c1 == sueRef c2 -> Right ()-      | otherwise -> Left $-                     "incompatible compound types in assignment: "-                     ++ pType t1 ++ ", " ++ pType t2-    (DirectType (TyBuiltin TyVaList) _ _, DirectType (TyBuiltin TyVaList) _ _) ->-      Right ()-    (DirectType tn1 _ _, DirectType tn2 _ _)-      | isJust (arithmeticConversion tn1 tn2) -> Right ()-      | otherwise -> Left $ "incompatible direct types in assignment: "-                     ++ pType t1 ++ ", " ++ pType t2-    (t1', t2') -> compatible t1' t2'-assignCompatible op t1 t2 = void$ binopType (assignBinop op) t1 t2---- | Determine the type of a binary operation.-binopType :: CBinaryOp -> Type -> Type -> Either String Type-binopType op t1 t2 =-  case (op, canonicalType t1, canonicalType t2) of-    (_, t1', t2')-      | isLogicOp op ->-        checkScalar t1' >> checkScalar t2' >> Right boolType-      | isCmpOp op ->-        case (t1', t2') of-          (DirectType tn1 _ _, DirectType tn2 _ _) ->-                case arithmeticConversion tn1 tn2 of-                  Just _ -> Right boolType-                  Nothing -> Left $ render $-                             text "incompatible arithmetic types in comparison: "-                             <+> pretty t1 <+> text "and" <+> pretty t2-          (PtrType (DirectType TyVoid _ _) _ _, _)-            | isPointerType t2' -> Right boolType-          (_, PtrType (DirectType TyVoid _ _) _ _)-            | isPointerType t1' -> Right boolType-          (_, _)-            | isPointerType t1' && isIntegralType t2' -> Right boolType-            | isIntegralType t1' && isPointerType t2' -> Right boolType-            | isPointerType t1' && isPointerType t2' ->-              compatible t1' t2' >> Right boolType-          (_, _) -> Left "incompatible types in comparison"-    (CSubOp, ArrayType t1' _ _ _, ArrayType t2' _ _ _) ->-      compatible t1' t2' >> Right ptrDiffType-    (CSubOp, ArrayType t1' _ _ _, PtrType t2' _ _) ->-      compatible t1' t2' >> Right ptrDiffType-    (CSubOp, PtrType t1' _ _, ArrayType t2' _ _ _) ->-      compatible t1' t2' >> Right ptrDiffType-    (CSubOp, PtrType t1' _ _, PtrType t2' _ _) ->-      compatible t1' t2' >> Right ptrDiffType-    (_, PtrType _ _ _, t2')-      | isPtrOp op && isIntegralType t2' -> Right t1-      | otherwise -> Left $ "invalid pointer operation: " ++ render (pretty op)-    (CAddOp, t1', PtrType _ _ _) | isIntegralType t1' -> Right t2-    (_, ArrayType _ _ _ _, t2')-      | isPtrOp op && isIntegralType t2' -> Right t1-      | otherwise -> Left $ "invalid pointer operation: " ++ render (pretty op)-    (CAddOp, t1', ArrayType _ _ _ _) | isIntegralType t1' -> Right t2-    (_, DirectType tn1 q1 a1, DirectType tn2 q2 a2) ->-        do when (isBitOp op) (checkIntegral t1 >> checkIntegral t2)-           case arithmeticConversion tn1 tn2 of-             Just tn -> Right $ DirectType tn (mergeTypeQuals q1 q2) (mergeAttributes a1 a2)-             Nothing -> Left $ render $-                        text "invalid binary operation:" <+> pretty t1 <+> pretty op <+> pretty t2-    (_, _, _) -> Left $ render $-                 text "unhandled binary operation:" <+> pretty t1 <+> pretty op <+> pretty t2---- | Determine the type of a conditional expression.-conditionalType :: Type -> Type -> Either String Type-conditionalType t1 t2 =-  case (canonicalType t1, canonicalType t2) of-    (PtrType (DirectType TyVoid _ _) _ _, t2') | isPointerType t2' -> Right t2-    (t1', PtrType (DirectType TyVoid _ _) _ _) | isPointerType t1' -> Right t1-    (ArrayType t1' _ q1 a1, ArrayType t2' _ q2 a2) ->-      do t <- compositeType t1' t2'-         Right $ ArrayType t (UnknownArraySize False)-                  (mergeTypeQuals q1 q2) (mergeAttrs a1 a2)-    (t1'@(DirectType tn1 q1 a1), t2'@(DirectType tn2 q2 a2)) ->-      case arithmeticConversion tn1 tn2 of-        Just tn -> Right $ DirectType tn (mergeTypeQuals q1 q2) (mergeAttributes a1 a2)-        Nothing -> compositeType t1' t2'-    (t1', t2') -> compositeType t1' t2'--derefType :: Type -> Either String Type-derefType (PtrType t _ _) = Right t-derefType (ArrayType t _ _ _) = Right t-derefType t =-  -- XXX: is it good to use canonicalType here?-  case canonicalType t of-    PtrType t' _ _ -> Right t'-    ArrayType t' _ _ _ -> Right t'-    _ -> Left $ "dereferencing non-pointer: " ++ pType t--varAddrType :: IdentDecl -> Either String Type-varAddrType d =-  do case declStorage d of-       Auto True -> Left "address of register variable"-       _         -> Right ()-     case t of-       ArrayType _ _ q a -> Right $ PtrType t q a-       _                 -> Right $ simplePtr t-  where t = declType d---- | Get the type of field @m@ of type @t@-fieldType :: (MonadCError m, MonadSymtab m) => NodeInfo -> Ident -> Type -> m Type-fieldType ni m t =-  case canonicalType t of-    DirectType (TyComp ctr) _ _ ->-      do td <- lookupSUE ni (sueRef ctr)-         ms <- tagMembers ni td-         case lookup m ms of-           Just ft -> return ft-           Nothing -> typeError ni $ "field not found: " ++ identToString m-    _t' -> astError ni $-          "field of non-composite type: " ++ identToString m-          ++ ", " ++ pType t---- | Get all members of a struct, union, or enum, with their---   types. Collapse fields of anonymous members.-tagMembers :: (MonadCError m, MonadSymtab m) =>-              NodeInfo -> TagDef -> m [(Ident, Type)]-tagMembers ni td =-  case td of-    CompDef (CompType _ _ ms _ _) -> getMembers ms-    EnumDef (EnumType _ es _ _) -> getMembers es-  where getMembers ds =-          do let ts = map declType ds-                 ns = map declName ds-             concat `liftM` mapM (expandAnonymous ni) (zip ns ts)---- | Expand an anonymous composite type into a list of member names---   and their associated types.-expandAnonymous :: (MonadCError m, MonadSymtab m) =>-                   NodeInfo -> (VarName, Type)-                -> m [(Ident, Type)]-expandAnonymous ni (NoName, DirectType (TyComp ctr) _ _) =-  lookupSUE ni (sueRef ctr) >>= tagMembers ni-expandAnonymous _ (NoName, _) = return []-expandAnonymous _ (VarName n _, t) = return [(n, t)]--lookupSUE :: (MonadCError m, MonadSymtab m) =>-             NodeInfo -> SUERef -> m TagDef-lookupSUE ni sue =-  do dt <- getDefTable-     case lookupTag sue dt of-       Just (Right td) -> return td-       _               ->-         typeError ni $ "unknown composite type: " ++ (render . pretty) sue--deepTypeAttrs :: (MonadCError m, MonadSymtab m) =>-                 Type -> m Attributes-deepTypeAttrs (DirectType (TyComp (CompTypeRef sue _ ni)) _ attrs) =-  (attrs ++) `liftM` sueAttrs ni sue-deepTypeAttrs (DirectType (TyEnum (EnumTypeRef sue ni)) _ attrs) =-  (attrs ++) `liftM` sueAttrs ni sue-deepTypeAttrs (DirectType _ _ attrs) = return attrs-deepTypeAttrs (PtrType t _ attrs) = (attrs ++) `liftM` deepTypeAttrs t-deepTypeAttrs (ArrayType t _ _ attrs) = (attrs ++) `liftM` deepTypeAttrs t-deepTypeAttrs (FunctionType (FunType t _ _) attrs) =-  (attrs ++) `liftM` deepTypeAttrs t-deepTypeAttrs (FunctionType (FunTypeIncomplete t)  attrs) =-  (attrs ++) `liftM` deepTypeAttrs t-deepTypeAttrs (TypeDefType (TypeDefRef i _ ni) _ attrs) =-  (attrs ++) `liftM` typeDefAttrs ni i--typeDefAttrs :: (MonadCError m, MonadSymtab m) =>-                NodeInfo -> Ident -> m Attributes-typeDefAttrs ni i =-  do dt <- getDefTable-     case lookupIdent i dt of-       Nothing -> astError ni $ "can't find typedef name: " ++ identToString i-       Just (Left (TypeDef _ t attrs _)) -> (attrs ++) `liftM` deepTypeAttrs t-       Just (Right _) -> astError ni $ "not a typedef name: " ++ identToString i--sueAttrs :: (MonadCError m, MonadSymtab m) =>-            NodeInfo -> SUERef -> m Attributes-sueAttrs ni sue =-  do dt <- getDefTable-     case lookupTag sue dt of-       Nothing -> astError ni $ "SUE not found: " ++ render (pretty sue)-       Just (Left _) -> return []-       Just (Right (CompDef (CompType _ _ _ attrs _))) -> return attrs-       Just (Right (EnumDef (EnumType _ _ attrs _))) -> return attrs+{-# LANGUAGE FlexibleInstances, CPP #-}
+module Language.C.Analysis.TypeCheck where
+
+import Control.Monad
+import Data.Maybe
+import Language.C.Data.Ident
+import Language.C.Data.Node
+import Language.C.Data.Position
+import Language.C.Pretty
+import Language.C.Syntax.AST
+import Language.C.Syntax.Constants
+import Language.C.Syntax.Ops
+import Language.C.Analysis.DefTable
+import Language.C.Analysis.SemRep
+import Language.C.Analysis.TravMonad
+import Language.C.Analysis.TypeConversions
+import Language.C.Analysis.TypeUtils
+import Language.C.Analysis.Debug ()
+import Text.PrettyPrint.HughesPJ
+
+-- We used to re-implement and export the standard Either instance for
+-- Monad, which is bad, because as of GHC 7 it is in Control.Monad.Instances
+-- in base >4.2. For backwards compatibility with ghc-6.X, we use CPP here.
+#if __GLASGOW_HASKELL__ < 700
+instance Monad (Either String) where
+    return        = Right
+    Left  l >>= _ = Left l
+    Right r >>= k = k r
+    fail msg      = Left msg
+#endif
+
+pType :: Type -> String
+pType = render . pretty
+
+typeErrorOnLeft :: (MonadCError m) => NodeInfo -> Either String a -> m a
+typeErrorOnLeft ni (Left err) = typeError ni err
+typeErrorOnLeft _  (Right v)  = return v
+
+-- XXX: this should use a custom error type, but typeMismatch isn't always right
+typeError :: MonadCError m => NodeInfo -> String -> m a
+typeError = astError
+
+notFound :: Ident -> Either String a
+notFound i = Left $ "not found: " ++ identToString i
+
+checkScalar' :: MonadCError m => NodeInfo -> Type -> m ()
+checkScalar' ni = typeErrorOnLeft ni . checkScalar
+
+checkIntegral' :: MonadCError m => NodeInfo -> Type -> m ()
+checkIntegral' ni = typeErrorOnLeft ni . checkIntegral
+
+assignCompatible' :: MonadCError m =>
+                     NodeInfo -> CAssignOp -> Type -> Type -> m ()
+assignCompatible' ni op t1 t2 = typeErrorOnLeft ni (assignCompatible op t1 t2)
+
+binopType' :: MonadCError m =>
+              NodeInfo -> CBinaryOp -> Type -> Type -> m Type
+binopType' ni op t1 t2 = typeErrorOnLeft ni (binopType op t1 t2)
+
+conditionalType' :: MonadCError m => NodeInfo -> Type -> Type -> m Type
+conditionalType' ni t1 t2 = typeErrorOnLeft ni $ conditionalType t1 t2
+
+checkScalar :: Type -> Either String ()
+checkScalar t =
+  case canonicalType t of
+    DirectType _ _ _  -> Right ()
+    PtrType _ _ _     -> Right ()
+    ArrayType _ _ _ _ -> Right () -- because it's just a pointer
+    t' -> Left $
+          "expected scalar type, got: "
+          ++ pType t ++ " (" ++ pType t' ++ ")"
+
+checkIntegral :: Type -> Either String ()
+checkIntegral t | isIntegralType (canonicalType t) = Right ()
+                | otherwise = Left $
+                              "expected integral type, got: " ++
+                              pType t ++ " (" ++
+                              pType (canonicalType t) ++ ")"
+
+-- | Determine the type of a constant.
+constType :: (MonadCError m, MonadName m) => CConst -> m Type
+constType (CIntConst (CInteger _ _ flags) _) =
+  return $ DirectType (TyIntegral (getIntType flags)) noTypeQuals noAttributes
+constType (CCharConst (CChar _ True) _) =
+  return $ DirectType (TyIntegral TyInt) noTypeQuals noAttributes
+constType (CCharConst (CChar _ False) _) =
+  return $ DirectType (TyIntegral TyChar) noTypeQuals noAttributes
+constType (CCharConst (CChars _ _) _)  =
+  return $ DirectType (TyIntegral TyInt) noTypeQuals noAttributes -- XXX
+constType (CFloatConst (CFloat fs) _) =
+  return $ DirectType (TyFloating (getFloatType fs)) noTypeQuals noAttributes
+-- XXX: should strings have any type qualifiers or attributes?
+constType (CStrConst (CString chars wide) ni) =
+  do n <- genName
+     let charType | wide      = TyInt -- XXX: this isn't universal
+                  | otherwise = TyChar
+         ni' = mkNodeInfo (posOf ni) n
+         arraySize = ArraySize
+                     True -- XXX: is it static?
+                     (CConst
+                      (CIntConst
+                       (cInteger (toInteger (length chars))) ni'))
+     return $ ArrayType (DirectType (TyIntegral charType) noTypeQuals noAttributes)
+                        arraySize noTypeQuals []
+
+-- | Determine whether two types are compatible.
+compatible :: Type -> Type -> Either String ()
+compatible t1 t2 = void$ compositeType t1 t2
+
+-- | Determine the composite type of two compatible types.
+compositeType :: Type -> Type -> Either String Type
+compositeType t1 (DirectType (TyBuiltin TyAny) _ _) = Right t1
+compositeType (DirectType (TyBuiltin TyAny) _ _) t2 = Right t2
+compositeType t1@(DirectType tn1 q1 a1) t2@(DirectType tn2 q2 a2) =
+  do tn <- case (tn1, tn2) of
+             (TyVoid, TyVoid) -> Right TyVoid
+             (TyIntegral _, TyEnum _) -> Right tn1
+             (TyEnum _, TyIntegral _) -> Right tn2
+             (TyIntegral i1, TyIntegral i2) ->
+               Right $ TyIntegral (intConversion i1 i2)
+             (TyFloating f1, TyFloating f2) ->
+               Right $ TyFloating (floatConversion f1 f2)
+             (TyComplex f1, TyComplex f2) ->
+               Right $ TyComplex (floatConversion f1 f2)
+             (TyComp c1, TyComp c2) ->
+               do when (sueRef c1 /= sueRef c2) $
+                       Left $ "incompatible composite types: "
+                              ++ pType t1 ++ ", " ++ pType t2
+                  Right tn1
+             (TyEnum e1, TyEnum e2) ->
+               do when (sueRef e1 /= sueRef e2) $
+                       Left $ "incompatible enumeration types: "
+                              ++ pType t1 ++ ", " ++ pType t2
+                  Right $ TyEnum e1
+             (TyBuiltin TyVaList, TyBuiltin TyVaList) ->
+               Right $ TyBuiltin TyVaList
+             (TyBuiltin _, TyBuiltin _) ->
+               Left $ "incompatible builtin types: "
+                      ++ pType t1 ++ ", " ++ pType t2
+             (_, _) -> Left $ "incompatible direct types: "
+                       ++ pType t1 ++ ", " ++ pType t2
+     Right $ DirectType tn (mergeTypeQuals q1 q2) (mergeAttributes a1 a2)
+compositeType (PtrType t1 q1 a1) (PtrType (DirectType TyVoid _ _) q2 _) =
+  Right $ PtrType t1 (mergeTypeQuals q1 q2) a1
+compositeType (PtrType (DirectType TyVoid _ _) q1 _) (PtrType t2 q2 a2) =
+  Right $ PtrType t2 (mergeTypeQuals q1 q2) a2
+compositeType (PtrType t1 q1 a1) t2 | isIntegralType t2 =
+  Right $ PtrType t1 (mergeTypeQuals q1 (typeQuals t2)) a1
+compositeType t1 (PtrType t2 q2 a2) | isIntegralType t1 =
+  Right $ PtrType t2 (mergeTypeQuals (typeQuals t1) q2) a2
+compositeType (ArrayType t1 _sz1 q1 a1) t2 | isIntegralType t2 =
+  Right $ PtrType t1 q1 a1
+compositeType t1 (ArrayType t2 _sz2 q2 a2) | isIntegralType t1 =
+  Right $ PtrType t2 q2 a2
+compositeType (ArrayType t1 s1 q1 a1) (ArrayType t2 s2 q2 a2) =
+  do t <- compositeType t1 t2
+     s <- compositeSize s1 s2
+     let quals = mergeTypeQuals q1 q2
+         attrs = mergeAttrs a1 a2
+     Right (ArrayType t s quals attrs)
+compositeType t1 t2 | isPointerType t1 && isPointerType t2 =
+  do t <- compositeType (baseType t1) (baseType t2)
+     let quals = mergeTypeQuals (typeQuals t1) (typeQuals t2)
+         attrs = mergeAttrs (typeAttrs t1) (typeAttrs t2)
+     Right (PtrType t quals attrs)
+compositeType (TypeDefType tdr1 _q1 _a1) (TypeDefType tdr2 _q2 _a2) =
+  case (tdr1, tdr2) of
+    (TypeDefRef _ t1 _, TypeDefRef _ t2 _) ->
+      compositeType t1 t2
+compositeType (FunctionType ft1 attrs1) (FunctionType ft2 attrs2) =
+  case (ft1, ft2) of
+    (FunType rt1 args1 varargs1, FunType rt2 args2 varargs2) ->
+      do {- when (length args1 /= length args2) $
+              Left "different numbers of arguments in function types" -}
+         args <- zipWithM compositeParamDecl args1 args2
+         when (varargs1 /= varargs2) $
+              Left "incompatible varargs declarations"
+         doFunType rt1 rt2 args varargs1
+    (FunType rt1 args1 varargs1, FunTypeIncomplete rt2) ->
+      doFunType rt1 rt2 args1 varargs1
+    (FunTypeIncomplete rt1, FunType rt2 args2 varargs2) ->
+      doFunType rt1 rt2 args2 varargs2
+    (FunTypeIncomplete rt1, FunTypeIncomplete rt2) ->
+      do rt <- compositeType rt1 rt2
+         Right (FunctionType (FunTypeIncomplete rt) (mergeAttrs attrs1 attrs2))
+  where doFunType rt1 rt2 args varargs =
+          do rt <- compositeType rt1 rt2
+             Right (FunctionType
+                     (FunType rt args varargs)
+                     (mergeAttrs attrs1 attrs2))
+compositeType t1 t2 = Left $ "incompatible types: "
+                         ++ pType t1 ++ ", " ++ pType t2
+
+-- XXX: this may not be correct
+compositeSize :: ArraySize -> ArraySize -> Either String ArraySize
+compositeSize (UnknownArraySize _) s2 = Right s2
+compositeSize s1 (UnknownArraySize _) = Right s1
+compositeSize (ArraySize s1 e1) (ArraySize s2 e2)
+  | s1 == s2 && sizeEqual e1 e2 = Right $ ArraySize s1 e1
+  | otherwise = Right $ ArraySize s1 e1
+{-
+    fail $ "incompatible array sizes: "
+           ++ (render . pretty) e1 ++ ", " ++ (render . pretty) e2
+-}
+
+sizeEqual :: CExpr -> CExpr -> Bool
+sizeEqual (CConst (CIntConst i1 _)) (CConst (CIntConst i2 _)) = i1 == i2
+sizeEqual e1 e2 = nodeInfo e1 == nodeInfo e2
+
+mergeAttrs :: Attributes -> Attributes -> Attributes
+mergeAttrs = (++) -- XXX: ultimately this should be smarter
+
+compositeParamDecl :: ParamDecl -> ParamDecl -> Either String ParamDecl
+compositeParamDecl (ParamDecl vd1 ni1) (ParamDecl vd2 _) =
+  compositeParamDecl' ParamDecl vd1 vd2 ni1
+compositeParamDecl (AbstractParamDecl vd1 _) (ParamDecl vd2 ni2) =
+  compositeParamDecl' ParamDecl vd1 vd2 ni2
+compositeParamDecl (ParamDecl vd1 ni1) (AbstractParamDecl vd2 _) =
+  compositeParamDecl' ParamDecl vd1 vd2 ni1
+compositeParamDecl (AbstractParamDecl vd1 ni1) (AbstractParamDecl vd2 _) =
+  compositeParamDecl' AbstractParamDecl vd1 vd2 ni1
+
+compositeParamDecl' :: (VarDecl -> NodeInfo -> ParamDecl)
+                    -> VarDecl
+                    -> VarDecl
+                    -> NodeInfo
+                    -> Either String ParamDecl
+compositeParamDecl' f (VarDecl n1 attrs1 t1) (VarDecl n2 attrs2 t2) dni =
+  do vd <- compositeVarDecl (VarDecl n1 attrs1 t1') (VarDecl n2 attrs2 t2')
+     Right $ f vd dni
+  where t1' = canonicalType t1
+        t2' = canonicalType t2
+
+compositeVarDecl :: VarDecl -> VarDecl -> Either String VarDecl
+compositeVarDecl (VarDecl n1 attrs1 t1) (VarDecl _ attrs2 t2) =
+  do t <- compositeType t1 t2
+     Right (VarDecl n1 (compositeDeclAttrs attrs1 attrs2) t)
+
+-- XXX: bad treatement of inline and storage
+compositeDeclAttrs :: DeclAttrs -> DeclAttrs -> DeclAttrs
+compositeDeclAttrs (DeclAttrs inl stor attrs1) (DeclAttrs _ _ attrs2) =
+  DeclAttrs inl stor (mergeAttrs attrs1 attrs2)
+
+castCompatible :: Type -> Type -> Either String ()
+castCompatible t1 t2 =
+  case (canonicalType t1, canonicalType t2) of
+    (DirectType TyVoid _ _, _) -> Right ()
+    (_, _) -> checkScalar t1 >> checkScalar t2
+
+-- | Determine whether two types are compatible in an assignment expression.
+assignCompatible :: CAssignOp -> Type -> Type -> Either String ()
+assignCompatible CAssignOp t1 t2 =
+  case (canonicalType t1, canonicalType t2) of
+    (DirectType (TyBuiltin TyAny) _ _, _) -> Right ()
+    (_, DirectType (TyBuiltin TyAny) _ _) -> Right ()
+    -- XXX: check qualifiers
+    (PtrType (DirectType TyVoid _ _) _ _, t2') | isPointerType t2' -> Right ()
+    -- XXX: check qualifiers
+    (t1', PtrType (DirectType TyVoid _ _) _ _) | isPointerType t1' -> Right ()
+    (PtrType _ _ _, t2') | isIntegralType t2' -> Right ()
+    (t1', t2') | isPointerType t1' && isPointerType t2' ->
+                 compatible (baseType t1') (baseType t2')
+                --unless (typeQuals t2 <= typeQuals t1) $
+                --       Left $
+                --       "incompatible qualifiers in pointer assignment: "
+                --       ++ pType t1 ++ ", " ++ pType t2
+    (DirectType (TyComp c1) _ _, DirectType (TyComp c2) _ _)
+      | sueRef c1 == sueRef c2 -> Right ()
+      | otherwise -> Left $
+                     "incompatible compound types in assignment: "
+                     ++ pType t1 ++ ", " ++ pType t2
+    (DirectType (TyBuiltin TyVaList) _ _, DirectType (TyBuiltin TyVaList) _ _) ->
+      Right ()
+    (DirectType tn1 _ _, DirectType tn2 _ _)
+      | isJust (arithmeticConversion tn1 tn2) -> Right ()
+      | otherwise -> Left $ "incompatible direct types in assignment: "
+                     ++ pType t1 ++ ", " ++ pType t2
+    (t1', t2') -> compatible t1' t2'
+assignCompatible op t1 t2 = void$ binopType (assignBinop op) t1 t2
+
+-- | Determine the type of a binary operation.
+binopType :: CBinaryOp -> Type -> Type -> Either String Type
+binopType op t1 t2 =
+  case (op, canonicalType t1, canonicalType t2) of
+    (_, t1', t2')
+      | isLogicOp op ->
+        checkScalar t1' >> checkScalar t2' >> Right boolType
+      | isCmpOp op ->
+        case (t1', t2') of
+          (DirectType tn1 _ _, DirectType tn2 _ _) ->
+                case arithmeticConversion tn1 tn2 of
+                  Just _ -> Right boolType
+                  Nothing -> Left $ render $
+                             text "incompatible arithmetic types in comparison: "
+                             <+> pretty t1 <+> text "and" <+> pretty t2
+          (PtrType (DirectType TyVoid _ _) _ _, _)
+            | isPointerType t2' -> Right boolType
+          (_, PtrType (DirectType TyVoid _ _) _ _)
+            | isPointerType t1' -> Right boolType
+          (_, _)
+            | isPointerType t1' && isIntegralType t2' -> Right boolType
+            | isIntegralType t1' && isPointerType t2' -> Right boolType
+            | isPointerType t1' && isPointerType t2' ->
+              compatible t1' t2' >> Right boolType
+          (_, _) -> Left "incompatible types in comparison"
+    (CSubOp, ArrayType t1' _ _ _, ArrayType t2' _ _ _) ->
+      compatible t1' t2' >> Right ptrDiffType
+    (CSubOp, ArrayType t1' _ _ _, PtrType t2' _ _) ->
+      compatible t1' t2' >> Right ptrDiffType
+    (CSubOp, PtrType t1' _ _, ArrayType t2' _ _ _) ->
+      compatible t1' t2' >> Right ptrDiffType
+    (CSubOp, PtrType t1' _ _, PtrType t2' _ _) ->
+      compatible t1' t2' >> Right ptrDiffType
+    (_, PtrType _ _ _, t2')
+      | isPtrOp op && isIntegralType t2' -> Right t1
+      | otherwise -> Left $ "invalid pointer operation: " ++ render (pretty op)
+    (CAddOp, t1', PtrType _ _ _) | isIntegralType t1' -> Right t2
+    (_, ArrayType _ _ _ _, t2')
+      | isPtrOp op && isIntegralType t2' -> Right t1
+      | otherwise -> Left $ "invalid pointer operation: " ++ render (pretty op)
+    (CAddOp, t1', ArrayType _ _ _ _) | isIntegralType t1' -> Right t2
+    (_, DirectType tn1 q1 a1, DirectType tn2 q2 a2) ->
+        do when (isBitOp op) (checkIntegral t1 >> checkIntegral t2)
+           case arithmeticConversion tn1 tn2 of
+             Just tn -> Right $ DirectType tn (mergeTypeQuals q1 q2) (mergeAttributes a1 a2)
+             Nothing -> Left $ render $
+                        text "invalid binary operation:" <+> pretty t1 <+> pretty op <+> pretty t2
+    (_, _, _) -> Left $ render $
+                 text "unhandled binary operation:" <+> pretty t1 <+> pretty op <+> pretty t2
+
+-- | Determine the type of a conditional expression.
+conditionalType :: Type -> Type -> Either String Type
+conditionalType t1 t2 =
+  case (canonicalType t1, canonicalType t2) of
+    (PtrType (DirectType TyVoid _ _) _ _, t2') | isPointerType t2' -> Right t2
+    (t1', PtrType (DirectType TyVoid _ _) _ _) | isPointerType t1' -> Right t1
+    (ArrayType t1' _ q1 a1, ArrayType t2' _ q2 a2) ->
+      do t <- compositeType t1' t2'
+         Right $ ArrayType t (UnknownArraySize False)
+                  (mergeTypeQuals q1 q2) (mergeAttrs a1 a2)
+    (t1'@(DirectType tn1 q1 a1), t2'@(DirectType tn2 q2 a2)) ->
+      case arithmeticConversion tn1 tn2 of
+        Just tn -> Right $ DirectType tn (mergeTypeQuals q1 q2) (mergeAttributes a1 a2)
+        Nothing -> compositeType t1' t2'
+    (t1', t2') -> compositeType t1' t2'
+
+derefType :: Type -> Either String Type
+derefType (PtrType t _ _) = Right t
+derefType (ArrayType t _ _ _) = Right t
+derefType t =
+  -- XXX: is it good to use canonicalType here?
+  case canonicalType t of
+    PtrType t' _ _ -> Right t'
+    ArrayType t' _ _ _ -> Right t'
+    _ -> Left $ "dereferencing non-pointer: " ++ pType t
+
+varAddrType :: IdentDecl -> Either String Type
+varAddrType d =
+  do case declStorage d of
+       Auto True -> Left "address of register variable"
+       _         -> Right ()
+     case t of
+       ArrayType _ _ q a -> Right $ PtrType t q a
+       _                 -> Right $ simplePtr t
+  where t = declType d
+
+-- | Get the type of field @m@ of type @t@
+fieldType :: (MonadCError m, MonadSymtab m) => NodeInfo -> Ident -> Type -> m Type
+fieldType ni m t =
+  case canonicalType t of
+    DirectType (TyComp ctr) _ _ ->
+      do td <- lookupSUE ni (sueRef ctr)
+         ms <- tagMembers ni td
+         case lookup m ms of
+           Just ft -> return ft
+           Nothing -> typeError ni $ "field not found: " ++ identToString m
+    _t' -> astError ni $
+          "field of non-composite type: " ++ identToString m
+          ++ ", " ++ pType t
+
+-- | Get all members of a struct, union, or enum, with their
+--   types. Collapse fields of anonymous members.
+tagMembers :: (MonadCError m, MonadSymtab m) =>
+              NodeInfo -> TagDef -> m [(Ident, Type)]
+tagMembers ni td =
+  case td of
+    CompDef (CompType _ _ ms _ _) -> getMembers ms
+    EnumDef (EnumType _ es _ _) -> getMembers es
+  where getMembers ds =
+          do let ts = map declType ds
+                 ns = map declName ds
+             concat `liftM` mapM (expandAnonymous ni) (zip ns ts)
+
+-- | Expand an anonymous composite type into a list of member names
+--   and their associated types.
+expandAnonymous :: (MonadCError m, MonadSymtab m) =>
+                   NodeInfo -> (VarName, Type)
+                -> m [(Ident, Type)]
+expandAnonymous ni (NoName, DirectType (TyComp ctr) _ _) =
+  lookupSUE ni (sueRef ctr) >>= tagMembers ni
+expandAnonymous _ (NoName, _) = return []
+expandAnonymous _ (VarName n _, t) = return [(n, t)]
+
+lookupSUE :: (MonadCError m, MonadSymtab m) =>
+             NodeInfo -> SUERef -> m TagDef
+lookupSUE ni sue =
+  do dt <- getDefTable
+     case lookupTag sue dt of
+       Just (Right td) -> return td
+       _               ->
+         typeError ni $ "unknown composite type: " ++ (render . pretty) sue
+
+deepTypeAttrs :: (MonadCError m, MonadSymtab m) =>
+                 Type -> m Attributes
+deepTypeAttrs (DirectType (TyComp (CompTypeRef sue _ ni)) _ attrs) =
+  (attrs ++) `liftM` sueAttrs ni sue
+deepTypeAttrs (DirectType (TyEnum (EnumTypeRef sue ni)) _ attrs) =
+  (attrs ++) `liftM` sueAttrs ni sue
+deepTypeAttrs (DirectType _ _ attrs) = return attrs
+deepTypeAttrs (PtrType t _ attrs) = (attrs ++) `liftM` deepTypeAttrs t
+deepTypeAttrs (ArrayType t _ _ attrs) = (attrs ++) `liftM` deepTypeAttrs t
+deepTypeAttrs (FunctionType (FunType t _ _) attrs) =
+  (attrs ++) `liftM` deepTypeAttrs t
+deepTypeAttrs (FunctionType (FunTypeIncomplete t)  attrs) =
+  (attrs ++) `liftM` deepTypeAttrs t
+deepTypeAttrs (TypeDefType (TypeDefRef i _ ni) _ attrs) =
+  (attrs ++) `liftM` typeDefAttrs ni i
+
+typeDefAttrs :: (MonadCError m, MonadSymtab m) =>
+                NodeInfo -> Ident -> m Attributes
+typeDefAttrs ni i =
+  do dt <- getDefTable
+     case lookupIdent i dt of
+       Nothing -> astError ni $ "can't find typedef name: " ++ identToString i
+       Just (Left (TypeDef _ t attrs _)) -> (attrs ++) `liftM` deepTypeAttrs t
+       Just (Right _) -> astError ni $ "not a typedef name: " ++ identToString i
+
+sueAttrs :: (MonadCError m, MonadSymtab m) =>
+            NodeInfo -> SUERef -> m Attributes
+sueAttrs ni sue =
+  do dt <- getDefTable
+     case lookupTag sue dt of
+       Nothing -> astError ni $ "SUE not found: " ++ render (pretty sue)
+       Just (Left _) -> return []
+       Just (Right (CompDef (CompType _ _ _ attrs _))) -> return attrs
+       Just (Right (EnumDef (EnumType _ _ attrs _))) -> return attrs
src/Language/C/Analysis/TypeConversions.hs view
@@ -1,39 +1,39 @@-module Language.C.Analysis.TypeConversions (-    arithmeticConversion,-    floatConversion,-    intConversion-) where--import Language.C.Analysis.SemRep---- | For an arithmetic operator, if the arguments are of the given---   types, return the type of the full expression.-arithmeticConversion :: TypeName -> TypeName -> Maybe TypeName--- XXX: I'm assuming that double `op` complex float = complex--- double. The standard seems somewhat unclear on whether this is--- really the case.-arithmeticConversion (TyComplex t1) (TyComplex t2) =-  Just $ TyComplex $ floatConversion t1 t2-arithmeticConversion (TyComplex t1) (TyFloating t2) =-  Just $ TyComplex $ floatConversion t1 t2-arithmeticConversion (TyFloating t1) (TyComplex t2) =-  Just $ TyComplex $ floatConversion t1 t2-arithmeticConversion t1@(TyComplex _) (TyIntegral _) = Just t1-arithmeticConversion (TyIntegral _) t2@(TyComplex _) = Just t2-arithmeticConversion (TyFloating t1) (TyFloating t2) =-  Just $ TyFloating $ floatConversion t1 t2-arithmeticConversion t1@(TyFloating _) (TyIntegral _) = Just t1-arithmeticConversion (TyIntegral _) t2@(TyFloating _) = Just t2-arithmeticConversion (TyIntegral t1) (TyIntegral t2) =-  Just $ TyIntegral $ intConversion t1 t2-arithmeticConversion (TyEnum _) (TyEnum _) = Just $ TyIntegral TyInt-arithmeticConversion (TyEnum _) t2 = Just t2-arithmeticConversion t1 (TyEnum _) = Just t1-arithmeticConversion _ _ = Nothing--floatConversion :: FloatType -> FloatType -> FloatType-floatConversion = max--intConversion :: IntType -> IntType -> IntType-intConversion t1 t2 = max TyInt (max t1 t2)-+module Language.C.Analysis.TypeConversions (
+    arithmeticConversion,
+    floatConversion,
+    intConversion
+) where
+
+import Language.C.Analysis.SemRep
+
+-- | For an arithmetic operator, if the arguments are of the given
+--   types, return the type of the full expression.
+arithmeticConversion :: TypeName -> TypeName -> Maybe TypeName
+-- XXX: I'm assuming that double `op` complex float = complex
+-- double. The standard seems somewhat unclear on whether this is
+-- really the case.
+arithmeticConversion (TyComplex t1) (TyComplex t2) =
+  Just $ TyComplex $ floatConversion t1 t2
+arithmeticConversion (TyComplex t1) (TyFloating t2) =
+  Just $ TyComplex $ floatConversion t1 t2
+arithmeticConversion (TyFloating t1) (TyComplex t2) =
+  Just $ TyComplex $ floatConversion t1 t2
+arithmeticConversion t1@(TyComplex _) (TyIntegral _) = Just t1
+arithmeticConversion (TyIntegral _) t2@(TyComplex _) = Just t2
+arithmeticConversion (TyFloating t1) (TyFloating t2) =
+  Just $ TyFloating $ floatConversion t1 t2
+arithmeticConversion t1@(TyFloating _) (TyIntegral _) = Just t1
+arithmeticConversion (TyIntegral _) t2@(TyFloating _) = Just t2
+arithmeticConversion (TyIntegral t1) (TyIntegral t2) =
+  Just $ TyIntegral $ intConversion t1 t2
+arithmeticConversion (TyEnum _) (TyEnum _) = Just $ TyIntegral TyInt
+arithmeticConversion (TyEnum _) t2 = Just t2
+arithmeticConversion t1 (TyEnum _) = Just t1
+arithmeticConversion _ _ = Nothing
+
+floatConversion :: FloatType -> FloatType -> FloatType
+floatConversion = max
+
+intConversion :: IntType -> IntType -> IntType
+intConversion t1 t2 = max TyInt (max t1 t2)
+
src/Language/C/Analysis/TypeUtils.hs view
@@ -1,343 +1,343 @@-module Language.C.Analysis.TypeUtils (-    -- * Constructors-    integral,-    floating,-    simplePtr,-    uint16_tType,-    uint32_tType,-    uint64_tType,-    size_tType,-    ptrDiffType,-    boolType,-    voidType,-    voidPtr,-    constVoidPtr,-    charPtr,-    constCharPtr,-    stringType,-    valistType,-    -- * Classifiers-    isIntegralType,-    isFloatingType,-    isPointerType,-    isScalarType,-    isFunctionType,-    -- Extractors-    typeQuals,-    typeQualsUpd,-    typeAttrs,-    typeAttrsUpd,-    baseType,-    derefTypeDef,-    deepDerefTypeDef,-    canonicalType,-    -- * Type comparisons-    sameType,-    -- * Other utilities-    getIntType,-    getFloatType-) where--import Language.C.Analysis.SemRep-import Language.C.Data.Node (CNode(..))-import Language.C.Syntax.AST (CExpression (..), CConstant (..))-import Language.C.Syntax.Constants---- | Constructor for a simple integral type.-integral :: IntType -> Type-integral ty = DirectType (TyIntegral ty) noTypeQuals noAttributes---- | Constructor for a simple floating-point type.-floating :: FloatType -> Type-floating ty = DirectType (TyFloating ty) noTypeQuals noAttributes---- | A simple pointer with no qualifiers-simplePtr :: Type -> Type-simplePtr t = PtrType t noTypeQuals []---- | A pointer with the @const@ qualifier.-constPtr :: Type -> Type-constPtr t = PtrType t (noTypeQuals { constant = True }) []---- | The underlying type for @uint16_t@. For now, this is just @unsigned short@.-uint16_tType :: Type-uint16_tType = integral TyUShort---- | The underlying type for @uint32_t@. For now, this is just @unsigned int@.-uint32_tType :: Type-uint32_tType = integral TyUInt---- | The underlying type for @uint64_t@. For now, this is just @unsigned long long@.-uint64_tType :: Type-uint64_tType = integral TyULLong---- | The type returned by sizeof (size_t). For now, this is just @int@.-size_tType :: Type-size_tType = integral TyInt---- | The type of pointer differences (ptrdiff_t). For now, this is just @int@.-ptrDiffType :: Type-ptrDiffType = integral TyInt---- | The type of comparisons\/guards. This is always just @int@.-boolType :: Type-boolType = integral TyInt---- | Simple @void@ type.-voidType :: Type-voidType = DirectType TyVoid noTypeQuals noAttributes---- | An unqualified @void@ pointer.-voidPtr :: Type-voidPtr = simplePtr voidType---- | A @const@-qualified @void@ pointer.-constVoidPtr :: Type-constVoidPtr = constPtr voidType---- | An unqualified @char@ pointer.-charPtr :: Type-charPtr = simplePtr (integral TyChar)---- | A @const@-qualified @char@ pointer.-constCharPtr :: Type-constCharPtr = constPtr (integral TyChar)---- | The type of a constant string.-stringType :: Type-stringType  = ArrayType-              (DirectType (TyIntegral TyChar)-                          (noTypeQuals { constant = True })-                          noAttributes)-              (UnknownArraySize False)-              noTypeQuals-              []---- | The builtin type of variable-length argument lists.-valistType :: Type-valistType  = DirectType (TyBuiltin TyVaList) noTypeQuals noAttributes---- | Check whether a type is an integral type. This includes @enum@---   types. This function does not attempt to resolve @typedef@ types.-isIntegralType :: Type -> Bool-isIntegralType (DirectType (TyIntegral _) _ _) = True-isIntegralType (DirectType (TyEnum _) _ _)     = True-isIntegralType _                               = False---- | Check whether a type is a floating-point numeric type. This---   function does not attempt to resolve @typedef@ types.-isFloatingType :: Type -> Bool-isFloatingType (DirectType (TyFloating _) _ _) = True-isFloatingType _                               = False---- | Check whether a type is an pointer type. This includes array---   types. This function does not attempt to resolve @typedef@ types.-isPointerType :: Type -> Bool-isPointerType (PtrType _ _ _)     = True-isPointerType (ArrayType _ _ _ _) = True-isPointerType _                   = False---- | Check whether a type is a scalar type. Scalar types include---   arithmetic types and pointer types.-isScalarType :: Type -> Bool-isScalarType t = isIntegralType t || isPointerType t || isFloatingType t---- | return @True@ if the given type is a function type------   Result is undefined in the presence of undefined typeDefs-isFunctionType :: Type -> Bool-isFunctionType ty =-    case ty of  TypeDefType (TypeDefRef _ actual_ty _) _ _ -> isFunctionType actual_ty-                FunctionType _ _ -> True-                _ -> False---- | Return the qualifiers of a type.-typeQuals :: Type -> TypeQuals-typeQuals (DirectType _ q _) = q-typeQuals (PtrType _ q _) = q-typeQuals (ArrayType _ _ q _) = q-typeQuals (FunctionType _ _) = noTypeQuals-typeQuals (TypeDefType (TypeDefRef _ t _) q _) = mergeTypeQuals q (typeQuals t)----  |Update type qualifiers---   For function types, it is an error to change any type qualifiers---   For typedef types, the result is stored in the typedef attribute field-typeQualsUpd :: (TypeQuals -> TypeQuals) -> Type -> Type-typeQualsUpd f ty =-    case ty of DirectType ty_name ty_quals ty_attrs -> DirectType ty_name (f ty_quals) ty_attrs-               PtrType ty_inner ty_quals ty_attrs         -> PtrType ty_inner (f ty_quals) ty_attrs-               ArrayType ty_inner sz ty_quals ty_attrs    -> ArrayType ty_inner sz (f ty_quals) ty_attrs-               FunctionType ty_inner ty_attrs             -> FunctionType ty_inner ty_attrs-               TypeDefType ty_ref ty_quals ty_attrs -> TypeDefType ty_ref (f ty_quals) ty_attrs---- | Return the attributes of a type.-typeAttrs :: Type -> Attributes-typeAttrs (DirectType _ _ a) = a-typeAttrs (PtrType _ _ a) = a-typeAttrs (ArrayType _ _ _ a) = a-typeAttrs (FunctionType _ a) = a-typeAttrs (TypeDefType (TypeDefRef _ t _) _ a) = mergeAttributes a (typeAttrs t)----  |Update type attributes-typeAttrsUpd :: (Attributes -> Attributes) -> Type -> Type-typeAttrsUpd f ty =-    case ty of DirectType ty_name ty_quals ty_attrs -> DirectType ty_name ty_quals (f ty_attrs)-               PtrType ty_inner ty_quals ty_attrs         -> PtrType ty_inner ty_quals (f ty_attrs)-               ArrayType ty_inner sz ty_quals ty_attrs    -> ArrayType ty_inner sz ty_quals (f ty_attrs)-               FunctionType ty_inner ty_attrs             -> FunctionType ty_inner (f ty_attrs)-               TypeDefType ty_ref ty_quals ty_attrs -> TypeDefType ty_ref ty_quals (f ty_attrs)---- | Return the base type of a pointer or array type. It is an error---   to call this function with a type that is not in one of those two---   categories.-baseType :: Type -> Type-baseType (PtrType t _ _)     = t-baseType (ArrayType t _ _ _) = t-baseType _                   = error "base of non-pointer type"---- | resolve typedefs, if possible-derefTypeDef :: Type -> Type-derefTypeDef (TypeDefType (TypeDefRef _ t _) q a) =-  (typeAttrsUpd (mergeAttributes a) . typeQualsUpd (mergeTypeQuals q))-  (derefTypeDef t)-derefTypeDef ty = ty---- | Attempt to remove all references to @typedef@ types from a given type.---   Note that this does not dereference the types of structure or union---   fields, so there are still cases where further dereferencing is---   needed.-deepDerefTypeDef :: Type -> Type-deepDerefTypeDef (PtrType t quals attrs) =-  PtrType (deepDerefTypeDef t) quals attrs-deepDerefTypeDef (ArrayType t size quals attrs) =-  ArrayType (deepDerefTypeDef t) size quals attrs-deepDerefTypeDef (FunctionType (FunType rt params varargs) attrs) =-  FunctionType (FunType (deepDerefTypeDef rt) params varargs) attrs-deepDerefTypeDef (FunctionType (FunTypeIncomplete rt) attrs) =-  FunctionType (FunTypeIncomplete (deepDerefTypeDef rt)) attrs-deepDerefTypeDef (TypeDefType (TypeDefRef _ t _) q a) =-  (typeAttrsUpd (mergeAttributes a) . typeQualsUpd (mergeTypeQuals q))-  (deepDerefTypeDef t)-deepDerefTypeDef t = t---- | True iff Type is a variable length array or a derived type thereof.--- Variably modified types have function or block scope, so only some--- constructions are possible.-isVariablyModifiedType :: Type -> Bool-isVariablyModifiedType t =-  case derefTypeDef t of-    TypeDefType {} -> error "impossible: derefTypeDef t returned a TypeDefType"-    DirectType {} -> False-    PtrType ptr_ty _ _ -> isVariablyModifiedType ptr_ty-    ArrayType _ sz _ _ -> isVariableArraySize sz-    FunctionType {} -> False-  where-    isVariableArraySize :: ArraySize -> Bool-    isVariableArraySize (UnknownArraySize isStarred) = isStarred-    isVariableArraySize (ArraySize isStatic e) = isStatic || isConstantSize e--    isConstantSize :: Expr -> Bool-    isConstantSize (CConst (CIntConst {})) = True-    isConstantSize _ = False---- | Two types denote the same type if they are identical, ignoring type--- definitions, and neither is a variably modified type.-sameType :: Type -> Type -> Bool-sameType t1 t2 =-  not (isVariablyModifiedType t1 || isVariablyModifiedType t2) && sameType'-  where-    sameType' =-      case (derefTypeDef t1, derefTypeDef t2) of-        (TypeDefType {}, _) -> error "impossible: derefTypeDef t1 returned a TypeDefType"-        (_, TypeDefType {}) -> error "impossible: derefTypeDef t2 returned a TypeDefType"-        (DirectType tn1 q1 _a1, DirectType tn2 q2 _a2) ->-          sameTypeName tn1 tn2 && sameQuals q1 q2 {- FIXME: same attributes? -}-        (PtrType pt1 q1 _a1, PtrType pt2 q2 _a2) ->-          sameType pt1 pt2 && sameQuals q1 q2-        (ArrayType at1 sz1 q1 _a1, ArrayType at2 sz2 q2 _a2) ->-          sameType at1 at2 && sameArraySize sz1 sz2 && sameQuals q1 q2-        (FunctionType ft1 _a1, FunctionType ft2 _a2) ->-          sameFunType ft1 ft2-        _ -> False--sameTypeName :: TypeName -> TypeName -> Bool-sameTypeName t1 t2 =-  case (t1, t2) of-    (TyVoid, TyVoid) -> True-    (TyIntegral i1, TyIntegral i2) -> i1 == i2-    (TyFloating f1, TyFloating f2) -> f1 == f2-    (TyComplex f1, TyComplex f2) -> f1 == f2-    (TyComp ctr1, TyComp ctr2) -> sameCompTypeRef ctr1 ctr2-    (TyEnum etr1, TyEnum etr2) -> sameEnumTypeRef etr1 etr2-    (TyBuiltin b1, TyBuiltin b2) -> sameBuiltinType b1 b2-    _ -> False--sameBuiltinType :: BuiltinType -> BuiltinType -> Bool-sameBuiltinType TyVaList TyVaList = True-sameBuiltinType TyAny TyAny = False {- what does TyAny mean? -}-sameBuiltinType _ _ = False--sameCompTypeRef :: CompTypeRef -> CompTypeRef -> Bool-sameCompTypeRef (CompTypeRef sue1 kind1 _) (CompTypeRef sue2 kind2 _) =-  sue1 == sue2 && kind1 == kind2--sameEnumTypeRef :: EnumTypeRef -> EnumTypeRef -> Bool-sameEnumTypeRef (EnumTypeRef sue1 _) (EnumTypeRef sue2 _) = sue1 == sue2--sameFunType :: FunType -> FunType -> Bool-sameFunType (FunType rt1 params1 isVar1) (FunType rt2 params2 isVar2) =-  sameType rt1 rt2 && sameParamDecls params1 params2 && isVar1 == isVar2-  where-    sameParamDecls :: [ParamDecl] -> [ParamDecl] -> Bool-    sameParamDecls param_list1 param_list2 =-      length param_list1 == length param_list2-      && and (zipWith sameParamDecl param_list1 param_list2)-    -- ignores param identifiers, just compares types-    sameParamDecl :: ParamDecl -> ParamDecl -> Bool-    sameParamDecl p1 p2 = sameType (declType p1) (declType p2)-sameFunType (FunTypeIncomplete rt1) (FunTypeIncomplete rt2) =-  sameType rt1 rt2-sameFunType _ _ = False---- | Returns 'True' iff both array sizes denote the same size.  Assumes that--- neither array type was a variably modified type.-sameArraySize :: ArraySize -> ArraySize -> Bool-sameArraySize (UnknownArraySize isStar1) (UnknownArraySize isStar2) = isStar1 == isStar2-sameArraySize (ArraySize s1 e1) (ArraySize s2 e2) = s1 == s2 && sizeEqual e1 e2-  where-    -- FIXME: Do something better, and combine with sizeEqual in Language.C.Analysis.TypeCheck-    sizeEqual :: Expr -> Expr -> Bool-    sizeEqual (CConst (CIntConst i1 _)) (CConst (CIntConst i2 _)) = i1 == i2-    sizeEqual oe1 oe2 = nodeInfo oe1 == nodeInfo oe2-sameArraySize _ _ = False--sameQuals :: TypeQuals -> TypeQuals -> Bool-sameQuals (TypeQuals {constant = c1, volatile = v1, restrict = r1})-          (TypeQuals {constant = c2, volatile = v2, restrict = r2}) =-  c1 == c2 && v1 == v2 && r1 == r2--canonicalType :: Type -> Type-canonicalType t =-  case deepDerefTypeDef t of-    FunctionType ft attrs -> simplePtr (FunctionType ft attrs)-    t'                    -> t'---- XXX: move to be with other flag functions-testFlags :: Enum f => [f] -> Flags f -> Bool-testFlags flags fi = all (`testFlag` fi) flags---- XXX: deal with FlagImag. No representation for it in Complex.--- XXX: deal with invalid combinations of flags?-getIntType :: Flags CIntFlag -> IntType-getIntType flags | testFlags [FlagLongLong, FlagUnsigned] flags = TyULLong-                 | testFlag  FlagLongLong flags                 = TyLLong-                 | testFlags [FlagLong, FlagUnsigned] flags     = TyULong-                 | testFlag  FlagLong flags                     = TyLong-                 | testFlag  FlagUnsigned flags                 = TyUInt-                 | otherwise                                    = TyInt--getFloatType :: String -> FloatType-getFloatType fs | last fs `elem` ['f', 'F'] = TyFloat-                | last fs `elem` ['l', 'L'] = TyLDouble-                | otherwise                 = TyDouble-+module Language.C.Analysis.TypeUtils (
+    -- * Constructors
+    integral,
+    floating,
+    simplePtr,
+    uint16_tType,
+    uint32_tType,
+    uint64_tType,
+    size_tType,
+    ptrDiffType,
+    boolType,
+    voidType,
+    voidPtr,
+    constVoidPtr,
+    charPtr,
+    constCharPtr,
+    stringType,
+    valistType,
+    -- * Classifiers
+    isIntegralType,
+    isFloatingType,
+    isPointerType,
+    isScalarType,
+    isFunctionType,
+    -- Extractors
+    typeQuals,
+    typeQualsUpd,
+    typeAttrs,
+    typeAttrsUpd,
+    baseType,
+    derefTypeDef,
+    deepDerefTypeDef,
+    canonicalType,
+    -- * Type comparisons
+    sameType,
+    -- * Other utilities
+    getIntType,
+    getFloatType
+) where
+
+import Language.C.Analysis.SemRep
+import Language.C.Data.Node (CNode(..))
+import Language.C.Syntax.AST (CExpression (..), CConstant (..))
+import Language.C.Syntax.Constants
+
+-- | Constructor for a simple integral type.
+integral :: IntType -> Type
+integral ty = DirectType (TyIntegral ty) noTypeQuals noAttributes
+
+-- | Constructor for a simple floating-point type.
+floating :: FloatType -> Type
+floating ty = DirectType (TyFloating ty) noTypeQuals noAttributes
+
+-- | A simple pointer with no qualifiers
+simplePtr :: Type -> Type
+simplePtr t = PtrType t noTypeQuals []
+
+-- | A pointer with the @const@ qualifier.
+constPtr :: Type -> Type
+constPtr t = PtrType t (noTypeQuals { constant = True }) []
+
+-- | The underlying type for @uint16_t@. For now, this is just @unsigned short@.
+uint16_tType :: Type
+uint16_tType = integral TyUShort
+
+-- | The underlying type for @uint32_t@. For now, this is just @unsigned int@.
+uint32_tType :: Type
+uint32_tType = integral TyUInt
+
+-- | The underlying type for @uint64_t@. For now, this is just @unsigned long long@.
+uint64_tType :: Type
+uint64_tType = integral TyULLong
+
+-- | The type returned by sizeof (size_t). For now, this is just @int@.
+size_tType :: Type
+size_tType = integral TyInt
+
+-- | The type of pointer differences (ptrdiff_t). For now, this is just @int@.
+ptrDiffType :: Type
+ptrDiffType = integral TyInt
+
+-- | The type of comparisons\/guards. This is always just @int@.
+boolType :: Type
+boolType = integral TyInt
+
+-- | Simple @void@ type.
+voidType :: Type
+voidType = DirectType TyVoid noTypeQuals noAttributes
+
+-- | An unqualified @void@ pointer.
+voidPtr :: Type
+voidPtr = simplePtr voidType
+
+-- | A @const@-qualified @void@ pointer.
+constVoidPtr :: Type
+constVoidPtr = constPtr voidType
+
+-- | An unqualified @char@ pointer.
+charPtr :: Type
+charPtr = simplePtr (integral TyChar)
+
+-- | A @const@-qualified @char@ pointer.
+constCharPtr :: Type
+constCharPtr = constPtr (integral TyChar)
+
+-- | The type of a constant string.
+stringType :: Type
+stringType  = ArrayType
+              (DirectType (TyIntegral TyChar)
+                          (noTypeQuals { constant = True })
+                          noAttributes)
+              (UnknownArraySize False)
+              noTypeQuals
+              []
+
+-- | The builtin type of variable-length argument lists.
+valistType :: Type
+valistType  = DirectType (TyBuiltin TyVaList) noTypeQuals noAttributes
+
+-- | Check whether a type is an integral type. This includes @enum@
+--   types. This function does not attempt to resolve @typedef@ types.
+isIntegralType :: Type -> Bool
+isIntegralType (DirectType (TyIntegral _) _ _) = True
+isIntegralType (DirectType (TyEnum _) _ _)     = True
+isIntegralType _                               = False
+
+-- | Check whether a type is a floating-point numeric type. This
+--   function does not attempt to resolve @typedef@ types.
+isFloatingType :: Type -> Bool
+isFloatingType (DirectType (TyFloating _) _ _) = True
+isFloatingType _                               = False
+
+-- | Check whether a type is an pointer type. This includes array
+--   types. This function does not attempt to resolve @typedef@ types.
+isPointerType :: Type -> Bool
+isPointerType (PtrType _ _ _)     = True
+isPointerType (ArrayType _ _ _ _) = True
+isPointerType _                   = False
+
+-- | Check whether a type is a scalar type. Scalar types include
+--   arithmetic types and pointer types.
+isScalarType :: Type -> Bool
+isScalarType t = isIntegralType t || isPointerType t || isFloatingType t
+
+-- | return @True@ if the given type is a function type
+--
+--   Result is undefined in the presence of undefined typeDefs
+isFunctionType :: Type -> Bool
+isFunctionType ty =
+    case ty of  TypeDefType (TypeDefRef _ actual_ty _) _ _ -> isFunctionType actual_ty
+                FunctionType _ _ -> True
+                _ -> False
+
+-- | Return the qualifiers of a type.
+typeQuals :: Type -> TypeQuals
+typeQuals (DirectType _ q _) = q
+typeQuals (PtrType _ q _) = q
+typeQuals (ArrayType _ _ q _) = q
+typeQuals (FunctionType _ _) = noTypeQuals
+typeQuals (TypeDefType (TypeDefRef _ t _) q _) = mergeTypeQuals q (typeQuals t)
+
+--  |Update type qualifiers
+--   For function types, it is an error to change any type qualifiers
+--   For typedef types, the result is stored in the typedef attribute field
+typeQualsUpd :: (TypeQuals -> TypeQuals) -> Type -> Type
+typeQualsUpd f ty =
+    case ty of DirectType ty_name ty_quals ty_attrs -> DirectType ty_name (f ty_quals) ty_attrs
+               PtrType ty_inner ty_quals ty_attrs         -> PtrType ty_inner (f ty_quals) ty_attrs
+               ArrayType ty_inner sz ty_quals ty_attrs    -> ArrayType ty_inner sz (f ty_quals) ty_attrs
+               FunctionType ty_inner ty_attrs             -> FunctionType ty_inner ty_attrs
+               TypeDefType ty_ref ty_quals ty_attrs -> TypeDefType ty_ref (f ty_quals) ty_attrs
+
+-- | Return the attributes of a type.
+typeAttrs :: Type -> Attributes
+typeAttrs (DirectType _ _ a) = a
+typeAttrs (PtrType _ _ a) = a
+typeAttrs (ArrayType _ _ _ a) = a
+typeAttrs (FunctionType _ a) = a
+typeAttrs (TypeDefType (TypeDefRef _ t _) _ a) = mergeAttributes a (typeAttrs t)
+
+--  |Update type attributes
+typeAttrsUpd :: (Attributes -> Attributes) -> Type -> Type
+typeAttrsUpd f ty =
+    case ty of DirectType ty_name ty_quals ty_attrs -> DirectType ty_name ty_quals (f ty_attrs)
+               PtrType ty_inner ty_quals ty_attrs         -> PtrType ty_inner ty_quals (f ty_attrs)
+               ArrayType ty_inner sz ty_quals ty_attrs    -> ArrayType ty_inner sz ty_quals (f ty_attrs)
+               FunctionType ty_inner ty_attrs             -> FunctionType ty_inner (f ty_attrs)
+               TypeDefType ty_ref ty_quals ty_attrs -> TypeDefType ty_ref ty_quals (f ty_attrs)
+
+-- | Return the base type of a pointer or array type. It is an error
+--   to call this function with a type that is not in one of those two
+--   categories.
+baseType :: Type -> Type
+baseType (PtrType t _ _)     = t
+baseType (ArrayType t _ _ _) = t
+baseType _                   = error "base of non-pointer type"
+
+-- | resolve typedefs, if possible
+derefTypeDef :: Type -> Type
+derefTypeDef (TypeDefType (TypeDefRef _ t _) q a) =
+  (typeAttrsUpd (mergeAttributes a) . typeQualsUpd (mergeTypeQuals q))
+  (derefTypeDef t)
+derefTypeDef ty = ty
+
+-- | Attempt to remove all references to @typedef@ types from a given type.
+--   Note that this does not dereference the types of structure or union
+--   fields, so there are still cases where further dereferencing is
+--   needed.
+deepDerefTypeDef :: Type -> Type
+deepDerefTypeDef (PtrType t quals attrs) =
+  PtrType (deepDerefTypeDef t) quals attrs
+deepDerefTypeDef (ArrayType t size quals attrs) =
+  ArrayType (deepDerefTypeDef t) size quals attrs
+deepDerefTypeDef (FunctionType (FunType rt params varargs) attrs) =
+  FunctionType (FunType (deepDerefTypeDef rt) params varargs) attrs
+deepDerefTypeDef (FunctionType (FunTypeIncomplete rt) attrs) =
+  FunctionType (FunTypeIncomplete (deepDerefTypeDef rt)) attrs
+deepDerefTypeDef (TypeDefType (TypeDefRef _ t _) q a) =
+  (typeAttrsUpd (mergeAttributes a) . typeQualsUpd (mergeTypeQuals q))
+  (deepDerefTypeDef t)
+deepDerefTypeDef t = t
+
+-- | True iff Type is a variable length array or a derived type thereof.
+-- Variably modified types have function or block scope, so only some
+-- constructions are possible.
+isVariablyModifiedType :: Type -> Bool
+isVariablyModifiedType t =
+  case derefTypeDef t of
+    TypeDefType {} -> error "impossible: derefTypeDef t returned a TypeDefType"
+    DirectType {} -> False
+    PtrType ptr_ty _ _ -> isVariablyModifiedType ptr_ty
+    ArrayType _ sz _ _ -> isVariableArraySize sz
+    FunctionType {} -> False
+  where
+    isVariableArraySize :: ArraySize -> Bool
+    isVariableArraySize (UnknownArraySize isStarred) = isStarred
+    isVariableArraySize (ArraySize isStatic e) = isStatic || isConstantSize e
+
+    isConstantSize :: Expr -> Bool
+    isConstantSize (CConst (CIntConst {})) = True
+    isConstantSize _ = False
+
+-- | Two types denote the same type if they are identical, ignoring type
+-- definitions, and neither is a variably modified type.
+sameType :: Type -> Type -> Bool
+sameType t1 t2 =
+  not (isVariablyModifiedType t1 || isVariablyModifiedType t2) && sameType'
+  where
+    sameType' =
+      case (derefTypeDef t1, derefTypeDef t2) of
+        (TypeDefType {}, _) -> error "impossible: derefTypeDef t1 returned a TypeDefType"
+        (_, TypeDefType {}) -> error "impossible: derefTypeDef t2 returned a TypeDefType"
+        (DirectType tn1 q1 _a1, DirectType tn2 q2 _a2) ->
+          sameTypeName tn1 tn2 && sameQuals q1 q2 {- FIXME: same attributes? -}
+        (PtrType pt1 q1 _a1, PtrType pt2 q2 _a2) ->
+          sameType pt1 pt2 && sameQuals q1 q2
+        (ArrayType at1 sz1 q1 _a1, ArrayType at2 sz2 q2 _a2) ->
+          sameType at1 at2 && sameArraySize sz1 sz2 && sameQuals q1 q2
+        (FunctionType ft1 _a1, FunctionType ft2 _a2) ->
+          sameFunType ft1 ft2
+        _ -> False
+
+sameTypeName :: TypeName -> TypeName -> Bool
+sameTypeName t1 t2 =
+  case (t1, t2) of
+    (TyVoid, TyVoid) -> True
+    (TyIntegral i1, TyIntegral i2) -> i1 == i2
+    (TyFloating f1, TyFloating f2) -> f1 == f2
+    (TyComplex f1, TyComplex f2) -> f1 == f2
+    (TyComp ctr1, TyComp ctr2) -> sameCompTypeRef ctr1 ctr2
+    (TyEnum etr1, TyEnum etr2) -> sameEnumTypeRef etr1 etr2
+    (TyBuiltin b1, TyBuiltin b2) -> sameBuiltinType b1 b2
+    _ -> False
+
+sameBuiltinType :: BuiltinType -> BuiltinType -> Bool
+sameBuiltinType TyVaList TyVaList = True
+sameBuiltinType TyAny TyAny = False {- what does TyAny mean? -}
+sameBuiltinType _ _ = False
+
+sameCompTypeRef :: CompTypeRef -> CompTypeRef -> Bool
+sameCompTypeRef (CompTypeRef sue1 kind1 _) (CompTypeRef sue2 kind2 _) =
+  sue1 == sue2 && kind1 == kind2
+
+sameEnumTypeRef :: EnumTypeRef -> EnumTypeRef -> Bool
+sameEnumTypeRef (EnumTypeRef sue1 _) (EnumTypeRef sue2 _) = sue1 == sue2
+
+sameFunType :: FunType -> FunType -> Bool
+sameFunType (FunType rt1 params1 isVar1) (FunType rt2 params2 isVar2) =
+  sameType rt1 rt2 && sameParamDecls params1 params2 && isVar1 == isVar2
+  where
+    sameParamDecls :: [ParamDecl] -> [ParamDecl] -> Bool
+    sameParamDecls param_list1 param_list2 =
+      length param_list1 == length param_list2
+      && and (zipWith sameParamDecl param_list1 param_list2)
+    -- ignores param identifiers, just compares types
+    sameParamDecl :: ParamDecl -> ParamDecl -> Bool
+    sameParamDecl p1 p2 = sameType (declType p1) (declType p2)
+sameFunType (FunTypeIncomplete rt1) (FunTypeIncomplete rt2) =
+  sameType rt1 rt2
+sameFunType _ _ = False
+
+-- | Returns 'True' iff both array sizes denote the same size.  Assumes that
+-- neither array type was a variably modified type.
+sameArraySize :: ArraySize -> ArraySize -> Bool
+sameArraySize (UnknownArraySize isStar1) (UnknownArraySize isStar2) = isStar1 == isStar2
+sameArraySize (ArraySize s1 e1) (ArraySize s2 e2) = s1 == s2 && sizeEqual e1 e2
+  where
+    -- FIXME: Do something better, and combine with sizeEqual in Language.C.Analysis.TypeCheck
+    sizeEqual :: Expr -> Expr -> Bool
+    sizeEqual (CConst (CIntConst i1 _)) (CConst (CIntConst i2 _)) = i1 == i2
+    sizeEqual oe1 oe2 = nodeInfo oe1 == nodeInfo oe2
+sameArraySize _ _ = False
+
+sameQuals :: TypeQuals -> TypeQuals -> Bool
+sameQuals (TypeQuals {constant = c1, volatile = v1, restrict = r1})
+          (TypeQuals {constant = c2, volatile = v2, restrict = r2}) =
+  c1 == c2 && v1 == v2 && r1 == r2
+
+canonicalType :: Type -> Type
+canonicalType t =
+  case deepDerefTypeDef t of
+    FunctionType ft attrs -> simplePtr (FunctionType ft attrs)
+    t'                    -> t'
+
+-- XXX: move to be with other flag functions
+testFlags :: Enum f => [f] -> Flags f -> Bool
+testFlags flags fi = all (`testFlag` fi) flags
+
+-- XXX: deal with FlagImag. No representation for it in Complex.
+-- XXX: deal with invalid combinations of flags?
+getIntType :: Flags CIntFlag -> IntType
+getIntType flags | testFlags [FlagLongLong, FlagUnsigned] flags = TyULLong
+                 | testFlag  FlagLongLong flags                 = TyLLong
+                 | testFlags [FlagLong, FlagUnsigned] flags     = TyULong
+                 | testFlag  FlagLong flags                     = TyLong
+                 | testFlag  FlagUnsigned flags                 = TyUInt
+                 | otherwise                                    = TyInt
+
+getFloatType :: String -> FloatType
+getFloatType fs | last fs `elem` ['f', 'F'] = TyFloat
+                | last fs `elem` ['l', 'L'] = TyLDouble
+                | otherwise                 = TyDouble
+
src/Language/C/Data.hs view
@@ -1,40 +1,40 @@--------------------------------------------------------------------------------- |--- Module      :  Language.C.Data--- Copyright   :  (c) 2008 Benedikt Huber--- License     :  BSD-style--- Maintainer  : benedikt.huber@gmail.com--- Stability   : experimental--- Portability : ghc------ Common data types for Language.C: Identifiers, unique names, source code locations,--- ast node attributes and extensible errors.-------------------------------------------------------------------------------module Language.C.Data (-     -- * Input stream-     module Language.C.Data.InputStream,-     -- * Identifiers-     SUERef(..), isAnonymousRef, sueRefToString,-     Ident,mkIdent, identToString, internalIdent, isInternalIdent, builtinIdent,-     -- * Unqiue names-     Name(..),newNameSupply,-     -- * Source code positions-     Position(..),posFile,posParent,-     Pos(..),-     initPos, nopos,builtinPos,internalPos,-     isSourcePos,isBuiltinPos,isInternalPos,-     -- * Syntax tree nodes-     NodeInfo(..),CNode(..),-     fileOfNode,posOfNode,nameOfNode,-     undefNode,mkNodeInfoOnlyPos,mkNodeInfo,-     internalNode, -- DEPRECATED-     -- * Extensible errors-     module Language.C.Data.Error-)-where-import Language.C.Data.InputStream-import Language.C.Data.Ident-import Language.C.Data.Name-import Language.C.Data.Position-import Language.C.Data.Error-import Language.C.Data.Node+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Data
+-- Copyright   :  (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  : benedikt.huber@gmail.com
+-- Stability   : experimental
+-- Portability : ghc
+--
+-- Common data types for Language.C: Identifiers, unique names, source code locations,
+-- ast node attributes and extensible errors.
+-----------------------------------------------------------------------------
+module Language.C.Data (
+     -- * Input stream
+     module Language.C.Data.InputStream,
+     -- * Identifiers
+     SUERef(..), isAnonymousRef, sueRefToString,
+     Ident,mkIdent, identToString, internalIdent, isInternalIdent, builtinIdent,
+     -- * Unqiue names
+     Name(..),newNameSupply,
+     -- * Source code positions
+     Position(..),posFile,posParent,
+     Pos(..),
+     initPos, nopos,builtinPos,internalPos,
+     isSourcePos,isBuiltinPos,isInternalPos,
+     -- * Syntax tree nodes
+     NodeInfo(..),CNode(..),
+     fileOfNode,posOfNode,nameOfNode,
+     undefNode,mkNodeInfoOnlyPos,mkNodeInfo,
+     internalNode, -- DEPRECATED
+     -- * Extensible errors
+     module Language.C.Data.Error
+)
+where
+import Language.C.Data.InputStream
+import Language.C.Data.Ident
+import Language.C.Data.Name
+import Language.C.Data.Position
+import Language.C.Data.Error
+import Language.C.Data.Node
src/Language/C/Data/Error.hs view
@@ -1,171 +1,171 @@-{-# LANGUAGE ExistentialQuantification, DeriveDataTypeable #-}--------------------------------------------------------------------------------- |--- Module      :  Language.C.Data.Error--- Copyright   :  (c) 2008 Benedikt Huber, Manuel M. T. Chakravarty--- License     :  BSD-style--- Maintainer  :  benedikt.huber@gmail.com--- Stability   :  experimental--- Portability :  ghc------ Base type for errors occurring in parsing, analysing and pretty-printing.--- With ideas from Simon Marlow's--- "An extensible dynamically-typed hierarchy of execeptions [2006]"-------------------------------------------------------------------------------module Language.C.Data.Error (-    -- * Severity Level-    ErrorLevel(..), isHardError,-    -- * Error class-    Error(..), errorPos, errorLevel, errorMsgs,-    -- * Error 'supertype'-    CError(..),-    -- * Infos attached to errors-    ErrorInfo(..),showError,showErrorInfo,mkErrorInfo,-    -- * Default error types-    UnsupportedFeature, unsupportedFeature, unsupportedFeature_,-    UserError, userErr,-    -- * Raising internal errors-    internalErr,-)-where-import Data.Typeable-import Language.C.Data.Node-import Language.C.Data.Position---- | Error levels (severity)-data ErrorLevel = LevelWarn-                | LevelError-                | LevelFatal-              deriving (Eq, Ord)--instance Show ErrorLevel where-    show LevelWarn  = "WARNING"-    show LevelError = "ERROR"-    show LevelFatal = "FATAL ERROR"---- | return @True@ when the given error makes it impossible to continue---   analysis or compilation.-isHardError :: (Error ex) => ex -> Bool-isHardError = ( > LevelWarn) . errorLevel---- | information attached to every error in Language.C-data ErrorInfo = ErrorInfo ErrorLevel Position [String] deriving Typeable---- to facilitate newtype deriving-instance Show ErrorInfo where show = showErrorInfo "error"-instance Error ErrorInfo where-    errorInfo = id-    changeErrorLevel (ErrorInfo _ pos msgs) lvl' = ErrorInfo lvl' pos msgs--mkErrorInfo :: ErrorLevel -> String -> NodeInfo -> ErrorInfo-mkErrorInfo lvl msg node = ErrorInfo lvl (posOfNode node) (lines msg)---- | `supertype' of all errors-data CError-    = forall err. (Error err) => CError err-    deriving Typeable---- | errors in Language.C are instance of 'Error'-class (Typeable e, Show e) => Error e where-    -- | obtain source location etc. of an error-    errorInfo        :: e -> ErrorInfo-    -- | wrap error in 'CError'-    toError          :: e -> CError-    -- | try to cast a generic 'CError' to the specific error type-    fromError     :: CError -> (Maybe e)-    -- | modify the error level-    changeErrorLevel :: e -> ErrorLevel -> e--    -- default implementation-    fromError (CError e) = cast e-    toError = CError-    changeErrorLevel e lvl =-        if errorLevel e == lvl-            then e-            else error $ "changeErrorLevel: not possible for " ++ show e--instance Show CError where-    show (CError e) = show e-instance Error CError where-    errorInfo (CError err) = errorInfo err-    toError = id-    fromError = Just-    changeErrorLevel (CError e) = CError . changeErrorLevel e---- | position of an @Error@-errorPos   :: (Error e) => e -> Position-errorPos = ( \(ErrorInfo _ pos _) -> pos ) . errorInfo---- | severity level of an @Error@-errorLevel :: (Error e) => e -> ErrorLevel-errorLevel = ( \(ErrorInfo lvl _ _) -> lvl ) . errorInfo---- | message lines of an @Error@-errorMsgs   :: (Error e) => e -> [String]-errorMsgs = ( \(ErrorInfo _ _ msgs) -> msgs ) . errorInfo---- | error raised if a operation requires an unsupported or not yet implemented feature.-data UnsupportedFeature = UnsupportedFeature String Position deriving Typeable-instance Error UnsupportedFeature where-    errorInfo (UnsupportedFeature msg pos) = ErrorInfo LevelError pos (lines msg)-instance Show UnsupportedFeature where show = showError "Unsupported Feature"--unsupportedFeature :: (Pos a) => String -> a -> UnsupportedFeature-unsupportedFeature msg a = UnsupportedFeature msg (posOf a)--unsupportedFeature_ :: String -> UnsupportedFeature-unsupportedFeature_ msg = UnsupportedFeature msg internalPos---- | unspecified error raised by the user (in case the user does not want to define---   her own error types).-newtype UserError     = UserError ErrorInfo deriving Typeable-instance Error UserError where-    errorInfo (UserError info) = info-instance Show UserError where show = showError "User Error"--userErr :: String -> UserError-userErr msg = UserError (ErrorInfo LevelError internalPos (lines msg))---- other errors to be defined elsewhere--showError :: (Error e) => String -> e -> String-showError short_msg = showErrorInfo short_msg . errorInfo---- | converts an error into a string using a fixed format------ * either the lines of the long error message or the short message has to be non-empty------ * the format is------ >    <fname>:<row>: (column <col>) [<err lvl>]--- >      >>> <line_1>--- >      <line_2>--- >        ...--- >      <line_n>-showErrorInfo :: String -> ErrorInfo -> String-showErrorInfo short_msg (ErrorInfo level pos msgs) =-    header ++ showMsgLines (if null short_msg then msgs else short_msg:msgs)-    where-    header = showPos pos ++ "[" ++ show level ++ "]"-    showPos p | isSourcePos p = (posFile p) ++ ":" ++ show (posRow pos) ++ ": " ++-                                "(column " ++ show (posColumn pos) ++ ") "-              | otherwise = show p ++ ":: "-    showMsgLines []     = internalErr "No short message or error message provided."-    showMsgLines (x:xs) = indent ++ ">>> " ++ x ++ "\n" ++ unlines (map (indent++) xs)----- internal errors-internalErrPrefix :: String-internalErrPrefix = unlines [ "Language.C : Internal Error" ,-                              "This is propably a bug, and should be reported at "++-                              "http://www.sivity.net/projects/language.c/newticket"]---- | raise a fatal internal error; message may have multiple lines-internalErr     :: String -> a-internalErr msg  = error (internalErrPrefix ++ "\n"-                       ++ indentLines msg-                       ++ "\n")-indent :: String-indent = "  "-indentLines :: String -> String-indentLines = unlines . map (indent++) . lines+{-# LANGUAGE ExistentialQuantification, DeriveDataTypeable #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Data.Error
+-- Copyright   :  (c) 2008 Benedikt Huber, Manuel M. T. Chakravarty
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  experimental
+-- Portability :  ghc
+--
+-- Base type for errors occurring in parsing, analysing and pretty-printing.
+-- With ideas from Simon Marlow's
+-- "An extensible dynamically-typed hierarchy of execeptions [2006]"
+-----------------------------------------------------------------------------
+module Language.C.Data.Error (
+    -- * Severity Level
+    ErrorLevel(..), isHardError,
+    -- * Error class
+    Error(..), errorPos, errorLevel, errorMsgs,
+    -- * Error 'supertype'
+    CError(..),
+    -- * Infos attached to errors
+    ErrorInfo(..),showError,showErrorInfo,mkErrorInfo,
+    -- * Default error types
+    UnsupportedFeature, unsupportedFeature, unsupportedFeature_,
+    UserError, userErr,
+    -- * Raising internal errors
+    internalErr,
+)
+where
+import Data.Typeable
+import Language.C.Data.Node
+import Language.C.Data.Position
+
+-- | Error levels (severity)
+data ErrorLevel = LevelWarn
+                | LevelError
+                | LevelFatal
+              deriving (Eq, Ord)
+
+instance Show ErrorLevel where
+    show LevelWarn  = "WARNING"
+    show LevelError = "ERROR"
+    show LevelFatal = "FATAL ERROR"
+
+-- | return @True@ when the given error makes it impossible to continue
+--   analysis or compilation.
+isHardError :: (Error ex) => ex -> Bool
+isHardError = ( > LevelWarn) . errorLevel
+
+-- | information attached to every error in Language.C
+data ErrorInfo = ErrorInfo ErrorLevel Position [String] deriving Typeable
+
+-- to facilitate newtype deriving
+instance Show ErrorInfo where show = showErrorInfo "error"
+instance Error ErrorInfo where
+    errorInfo = id
+    changeErrorLevel (ErrorInfo _ pos msgs) lvl' = ErrorInfo lvl' pos msgs
+
+mkErrorInfo :: ErrorLevel -> String -> NodeInfo -> ErrorInfo
+mkErrorInfo lvl msg node = ErrorInfo lvl (posOfNode node) (lines msg)
+
+-- | `supertype' of all errors
+data CError
+    = forall err. (Error err) => CError err
+    deriving Typeable
+
+-- | errors in Language.C are instance of 'Error'
+class (Typeable e, Show e) => Error e where
+    -- | obtain source location etc. of an error
+    errorInfo        :: e -> ErrorInfo
+    -- | wrap error in 'CError'
+    toError          :: e -> CError
+    -- | try to cast a generic 'CError' to the specific error type
+    fromError     :: CError -> (Maybe e)
+    -- | modify the error level
+    changeErrorLevel :: e -> ErrorLevel -> e
+
+    -- default implementation
+    fromError (CError e) = cast e
+    toError = CError
+    changeErrorLevel e lvl =
+        if errorLevel e == lvl
+            then e
+            else error $ "changeErrorLevel: not possible for " ++ show e
+
+instance Show CError where
+    show (CError e) = show e
+instance Error CError where
+    errorInfo (CError err) = errorInfo err
+    toError = id
+    fromError = Just
+    changeErrorLevel (CError e) = CError . changeErrorLevel e
+
+-- | position of an @Error@
+errorPos   :: (Error e) => e -> Position
+errorPos = ( \(ErrorInfo _ pos _) -> pos ) . errorInfo
+
+-- | severity level of an @Error@
+errorLevel :: (Error e) => e -> ErrorLevel
+errorLevel = ( \(ErrorInfo lvl _ _) -> lvl ) . errorInfo
+
+-- | message lines of an @Error@
+errorMsgs   :: (Error e) => e -> [String]
+errorMsgs = ( \(ErrorInfo _ _ msgs) -> msgs ) . errorInfo
+
+-- | error raised if a operation requires an unsupported or not yet implemented feature.
+data UnsupportedFeature = UnsupportedFeature String Position deriving Typeable
+instance Error UnsupportedFeature where
+    errorInfo (UnsupportedFeature msg pos) = ErrorInfo LevelError pos (lines msg)
+instance Show UnsupportedFeature where show = showError "Unsupported Feature"
+
+unsupportedFeature :: (Pos a) => String -> a -> UnsupportedFeature
+unsupportedFeature msg a = UnsupportedFeature msg (posOf a)
+
+unsupportedFeature_ :: String -> UnsupportedFeature
+unsupportedFeature_ msg = UnsupportedFeature msg internalPos
+
+-- | unspecified error raised by the user (in case the user does not want to define
+--   her own error types).
+newtype UserError     = UserError ErrorInfo deriving Typeable
+instance Error UserError where
+    errorInfo (UserError info) = info
+instance Show UserError where show = showError "User Error"
+
+userErr :: String -> UserError
+userErr msg = UserError (ErrorInfo LevelError internalPos (lines msg))
+
+-- other errors to be defined elsewhere
+
+showError :: (Error e) => String -> e -> String
+showError short_msg = showErrorInfo short_msg . errorInfo
+
+-- | converts an error into a string using a fixed format
+--
+-- * either the lines of the long error message or the short message has to be non-empty
+--
+-- * the format is
+--
+-- >    <fname>:<row>: (column <col>) [<err lvl>]
+-- >      >>> <line_1>
+-- >      <line_2>
+-- >        ...
+-- >      <line_n>
+showErrorInfo :: String -> ErrorInfo -> String
+showErrorInfo short_msg (ErrorInfo level pos msgs) =
+    header ++ showMsgLines (if null short_msg then msgs else short_msg:msgs)
+    where
+    header = showPos pos ++ "[" ++ show level ++ "]"
+    showPos p | isSourcePos p = (posFile p) ++ ":" ++ show (posRow pos) ++ ": " ++
+                                "(column " ++ show (posColumn pos) ++ ") "
+              | otherwise = show p ++ ":: "
+    showMsgLines []     = internalErr "No short message or error message provided."
+    showMsgLines (x:xs) = indent ++ ">>> " ++ x ++ "\n" ++ unlines (map (indent++) xs)
+
+
+-- internal errors
+internalErrPrefix :: String
+internalErrPrefix = unlines [ "Language.C : Internal Error" ,
+                              "This is propably a bug, and should be reported at "++
+                              "http://www.sivity.net/projects/language.c/newticket"]
+
+-- | raise a fatal internal error; message may have multiple lines
+internalErr     :: String -> a
+internalErr msg  = error (internalErrPrefix ++ "\n"
+                       ++ indentLines msg
+                       ++ "\n")
+indent :: String
+indent = "  "
+indentLines :: String -> String
+indentLines = unlines . map (indent++) . lines
src/Language/C/Data/Ident.hs view
@@ -1,134 +1,134 @@-{-# LANGUAGE DeriveDataTypeable #-}--------------------------------------------------------------------------------- |--- Module      :  Language.C.Data.Ident--- Copyright   :  (c) [1995..1999] Manuel M. T. Chakravarty---                (c) 2008 Benedikt Huber--- License     :  BSD-style--- Maintainer  :  benedikt.huber@gmail.com--- Stability   :  experimental--- Portability :  ghc------ This module provides the notion of identifiers in C, speed up using hashing.--- Identifiers are associated optionally associated with a 'NodeInfo', i.e. with--- a unique 'Name' and a source location ('Position'). The ordering relation on--- identifiers is based on the hash and does not follow the lexical order.-------------------------------------------------------------------------------module Language.C.Data.Ident (-    Ident(..),-    SUERef(..), isAnonymousRef,-    mkIdent, builtinIdent, internalIdent, internalIdentAt, isInternalIdent,-    identToString, sueRefToString, dumpIdent)-where---- TODO (comment from manuel):---  * Hashing is not 8bit clean.--import Data.Char-import Language.C.Data.Position-import Language.C.Data.Node-import Language.C.Data.Name (Name)-import Data.Generics---- | References uniquely determining a struct, union or enum type.--- Those are either identified by an string identifier, or by a unique--- name (anonymous types).-data SUERef =  AnonymousRef Name-             | NamedRef Ident-    deriving (Typeable, Data, Ord, Eq, Show) --, Read---- | Return true if the struct\/union\/enum reference is anonymous.-isAnonymousRef :: SUERef -> Bool-isAnonymousRef (AnonymousRef _) = True-isAnonymousRef _ = False---- | C identifiers-data Ident = Ident String       -- lexeme-                   {-# UNPACK #-}   !Int     -- hash to speed up equality check-                   NodeInfo                   -- attributes of this ident. incl. position-             deriving (Data,Typeable,Show) -- Read---- the definition of the equality allows identifiers to be equal that are--- defined at different source text positions, and aims at speeding up the--- equality test, by comparing the lexemes only if the two numbers are equal----instance Eq Ident where-  (Ident s h _) == (Ident s' h' _) = (h == h') && (s == s')---- this does *not* follow the alphanumerical ordering of the lexemes----instance Ord Ident where-  compare (Ident s h _) (Ident s' h' _) = compare (h, s) (h', s')---- identifiers are attributed-instance CNode Ident where-  nodeInfo (Ident _ _ at) = at-instance Pos Ident where-  posOf = posOfNode . nodeInfo--- to speed up the equality test we compute some hash-like value for each--- identifiers lexeme and store it in the identifiers representation---- hash function from the dragon book pp437; assumes 7 bit characters and needs--- the (nearly) full range of values guaranteed for `Int' by the Haskell--- language definition; can handle 8 bit characters provided we have 29 bit--- for the `Int's without sign----quad                 :: String -> Int-quad (c1:c2:c3:c4:s)  = ((ord c4 * bits21-                          + ord c3 * bits14-                          + ord c2 * bits7-                          + ord c1)-                         `mod` bits28)-                        + (quad s `mod` bits28)-quad (c1:c2:c3:[]  )  = ord c3 * bits14 + ord c2 * bits7 + ord c1-quad (c1:c2:[]     )  = ord c2 * bits7 + ord c1-quad (c1:[]        )  = ord c1-quad ([]           )  = 0--bits7 :: Int-bits7  = 2^(7::Int)-bits14 :: Int-bits14 = 2^(14::Int)-bits21 :: Int-bits21 = 2^(21::Int)-bits28 :: Int-bits28 = 2^(28::Int)---- | build an identifier from a string.------ * only minimal error checking, e.g., the characters of the identifier are---   not checked for being alphanumerical only; the correct lexis of the---   identifier should be ensured by the caller, e.g., the scanner.------ * for reasons of simplicity the complete lexeme is hashed.-mkIdent            :: Position -> String -> Name -> Ident-mkIdent pos s name  = Ident s (quad s) (mkNodeInfo' pos (pos,length s) name)---- | returns an /internal/ identifier (has internal position and no unique name)-internalIdent   :: String -> Ident-internalIdent s  = Ident s (quad s) (mkNodeInfoOnlyPos internalPos)---- | return an /internal/ identifier with position info-internalIdentAt :: Position -> String -> Ident-internalIdentAt pos s = Ident s (quad s) (mkNodeInfoPosLen pos (pos, length s))---- | returns a /builtin/ identifier (has builtin position and no unique name)-builtinIdent   :: String -> Ident-builtinIdent s  = Ident s (quad s) (mkNodeInfoOnlyPos builtinPos)---- | return @True@ if the given identifier is /internal/-isInternalIdent :: Ident -> Bool-isInternalIdent (Ident _ _ nodeinfo) = isInternalPos (posOfNode nodeinfo)---- | string of an identifier-identToString               :: Ident -> String-identToString (Ident s _ _)  = s---- | string of a SUE ref (empty if anonymous)-sueRefToString                 :: SUERef -> String-sueRefToString (AnonymousRef _) = ""-sueRefToString (NamedRef ident) = identToString ident---- | dump the identifier string and its positions for debugging purposes-dumpIdent     :: Ident -> String-dumpIdent ide  = identToString ide ++ " at " ++ show (nodeInfo ide)+{-# LANGUAGE DeriveDataTypeable #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Data.Ident
+-- Copyright   :  (c) [1995..1999] Manuel M. T. Chakravarty
+--                (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  experimental
+-- Portability :  ghc
+--
+-- This module provides the notion of identifiers in C, speed up using hashing.
+-- Identifiers are associated optionally associated with a 'NodeInfo', i.e. with
+-- a unique 'Name' and a source location ('Position'). The ordering relation on
+-- identifiers is based on the hash and does not follow the lexical order.
+-----------------------------------------------------------------------------
+module Language.C.Data.Ident (
+    Ident(..),
+    SUERef(..), isAnonymousRef,
+    mkIdent, builtinIdent, internalIdent, internalIdentAt, isInternalIdent,
+    identToString, sueRefToString, dumpIdent)
+where
+
+-- TODO (comment from manuel):
+--  * Hashing is not 8bit clean.
+
+import Data.Char
+import Language.C.Data.Position
+import Language.C.Data.Node
+import Language.C.Data.Name (Name)
+import Data.Generics
+
+-- | References uniquely determining a struct, union or enum type.
+-- Those are either identified by an string identifier, or by a unique
+-- name (anonymous types).
+data SUERef =  AnonymousRef Name
+             | NamedRef Ident
+    deriving (Typeable, Data, Ord, Eq, Show) --, Read
+
+-- | Return true if the struct\/union\/enum reference is anonymous.
+isAnonymousRef :: SUERef -> Bool
+isAnonymousRef (AnonymousRef _) = True
+isAnonymousRef _ = False
+
+-- | C identifiers
+data Ident = Ident String       -- lexeme
+                   {-# UNPACK #-}   !Int     -- hash to speed up equality check
+                   NodeInfo                   -- attributes of this ident. incl. position
+             deriving (Data,Typeable,Show) -- Read
+
+-- the definition of the equality allows identifiers to be equal that are
+-- defined at different source text positions, and aims at speeding up the
+-- equality test, by comparing the lexemes only if the two numbers are equal
+--
+instance Eq Ident where
+  (Ident s h _) == (Ident s' h' _) = (h == h') && (s == s')
+
+-- this does *not* follow the alphanumerical ordering of the lexemes
+--
+instance Ord Ident where
+  compare (Ident s h _) (Ident s' h' _) = compare (h, s) (h', s')
+
+-- identifiers are attributed
+instance CNode Ident where
+  nodeInfo (Ident _ _ at) = at
+instance Pos Ident where
+  posOf = posOfNode . nodeInfo
+-- to speed up the equality test we compute some hash-like value for each
+-- identifiers lexeme and store it in the identifiers representation
+
+-- hash function from the dragon book pp437; assumes 7 bit characters and needs
+-- the (nearly) full range of values guaranteed for `Int' by the Haskell
+-- language definition; can handle 8 bit characters provided we have 29 bit
+-- for the `Int's without sign
+--
+quad                 :: String -> Int
+quad (c1:c2:c3:c4:s)  = ((ord c4 * bits21
+                          + ord c3 * bits14
+                          + ord c2 * bits7
+                          + ord c1)
+                         `mod` bits28)
+                        + (quad s `mod` bits28)
+quad (c1:c2:c3:[]  )  = ord c3 * bits14 + ord c2 * bits7 + ord c1
+quad (c1:c2:[]     )  = ord c2 * bits7 + ord c1
+quad (c1:[]        )  = ord c1
+quad ([]           )  = 0
+
+bits7 :: Int
+bits7  = 2^(7::Int)
+bits14 :: Int
+bits14 = 2^(14::Int)
+bits21 :: Int
+bits21 = 2^(21::Int)
+bits28 :: Int
+bits28 = 2^(28::Int)
+
+-- | build an identifier from a string.
+--
+-- * only minimal error checking, e.g., the characters of the identifier are
+--   not checked for being alphanumerical only; the correct lexis of the
+--   identifier should be ensured by the caller, e.g., the scanner.
+--
+-- * for reasons of simplicity the complete lexeme is hashed.
+mkIdent            :: Position -> String -> Name -> Ident
+mkIdent pos s name  = Ident s (quad s) (mkNodeInfo' pos (pos,length s) name)
+
+-- | returns an /internal/ identifier (has internal position and no unique name)
+internalIdent   :: String -> Ident
+internalIdent s  = Ident s (quad s) (mkNodeInfoOnlyPos internalPos)
+
+-- | return an /internal/ identifier with position info
+internalIdentAt :: Position -> String -> Ident
+internalIdentAt pos s = Ident s (quad s) (mkNodeInfoPosLen pos (pos, length s))
+
+-- | returns a /builtin/ identifier (has builtin position and no unique name)
+builtinIdent   :: String -> Ident
+builtinIdent s  = Ident s (quad s) (mkNodeInfoOnlyPos builtinPos)
+
+-- | return @True@ if the given identifier is /internal/
+isInternalIdent :: Ident -> Bool
+isInternalIdent (Ident _ _ nodeinfo) = isInternalPos (posOfNode nodeinfo)
+
+-- | string of an identifier
+identToString               :: Ident -> String
+identToString (Ident s _ _)  = s
+
+-- | string of a SUE ref (empty if anonymous)
+sueRefToString                 :: SUERef -> String
+sueRefToString (AnonymousRef _) = ""
+sueRefToString (NamedRef ident) = identToString ident
+
+-- | dump the identifier string and its positions for debugging purposes
+dumpIdent     :: Ident -> String
+dumpIdent ide  = identToString ide ++ " at " ++ show (nodeInfo ide)
src/Language/C/Data/InputStream.hs view
@@ -1,99 +1,99 @@-{-# LANGUAGE CPP, BangPatterns #-}-{-# OPTIONS -Wall #-}--------------------------------------------------------------------------------- |--- Module      :  Language.C.Data.InputStream--- Copyright   :  (c) 2008,2011 Benedikt Huber--- License     :  BSD-style--- Maintainer  :  benedikt.huber@gmail.com--- Stability   :  experimental--- Portability :  ghc------ Compile time input abstraction for the parser, relying on ByteString.--- The String interface only supports Latin-1 since alex-3, as alex now requires--- byte based access to the input stream.---------------------------------------------------------------------------------module Language.C.Data.InputStream (-    InputStream, readInputStream,inputStreamToString,inputStreamFromString,-    takeByte, takeChar, inputStreamEmpty, takeChars,-    countLines,-)-where--import Data.Word--#ifndef NO_BYTESTRING-import Data.ByteString (ByteString)-import qualified Data.ByteString as BSW-import qualified Data.ByteString.Char8 as BSC-#else-import qualified Data.Char as Char-#endif---- Generic InputStream stuff---- | read a file into an 'InputStream'-readInputStream :: FilePath -> IO InputStream---- | convert 'InputStream' to 'String'-inputStreamToString :: InputStream -> String-{-# INLINE inputStreamToString #-}---- | convert a 'String' to an 'InputStream'-inputStreamFromString :: String -> InputStream---- | @(b,is') = takeByte is@ reads and removes--- the first byte @b@ from the 'InputStream' @is@-takeByte :: InputStream -> (Word8, InputStream)-{-# INLINE takeByte #-}---- | @(c,is') = takeChar is@ reads and removes--- the first character @c@ from the 'InputStream' @is@-takeChar :: InputStream -> (Char, InputStream)-{-# INLINE takeChar #-}---- | return @True@ if the given input stream is empty-inputStreamEmpty :: InputStream -> Bool-{-# INLINE inputStreamEmpty #-}---- | @str = takeChars n is@ returns the first @n@ characters--- of the given input stream, without removing them-takeChars :: Int -> InputStream -> [Char]-{-# INLINE takeChars #-}---- | @countLines@ returns the number of text lines  in the--- given 'InputStream'-countLines :: InputStream -> Int--#ifndef NO_BYTESTRING--type InputStream = ByteString-takeByte bs = BSW.head  bs `seq`  (BSW.head bs, BSW.tail bs)-takeChar bs = BSC.head bs `seq`  (BSC.head bs, BSC.tail bs)-inputStreamEmpty = BSW.null-#ifndef __HADDOCK__-takeChars !n bstr = BSC.unpack $ BSC.take n bstr --leaks-#endif-readInputStream       = BSW.readFile--inputStreamToString   = BSC.unpack-inputStreamFromString = BSC.pack-countLines             = length . BSC.lines---#else--type InputStream = String-takeByte bs-  | Char.isLatin1 c = let b = fromIntegral (Char.ord c) in b `seq` (b, tail bs)-  | otherwise       = error "takeByte: not a latin-1 character"-  where c = head bs-takeChar bs = (head bs, tail bs)-inputStreamEmpty = null-takeChars n str = take n str-readInputStream = readFile-inputStreamToString = id-inputStreamFromString = id-countLines = length . lines-#endif-+{-# LANGUAGE CPP, BangPatterns #-}
+{-# OPTIONS -Wall #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Data.InputStream
+-- Copyright   :  (c) 2008,2011 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  experimental
+-- Portability :  ghc
+--
+-- Compile time input abstraction for the parser, relying on ByteString.
+-- The String interface only supports Latin-1 since alex-3, as alex now requires
+-- byte based access to the input stream.
+-------------------------------------------------------------------------------
+module Language.C.Data.InputStream (
+    InputStream, readInputStream,inputStreamToString,inputStreamFromString,
+    takeByte, takeChar, inputStreamEmpty, takeChars,
+    countLines,
+)
+where
+
+import Data.Word
+
+#ifndef NO_BYTESTRING
+import Data.ByteString (ByteString)
+import qualified Data.ByteString as BSW
+import qualified Data.ByteString.Char8 as BSC
+#else
+import qualified Data.Char as Char
+#endif
+
+-- Generic InputStream stuff
+
+-- | read a file into an 'InputStream'
+readInputStream :: FilePath -> IO InputStream
+
+-- | convert 'InputStream' to 'String'
+inputStreamToString :: InputStream -> String
+{-# INLINE inputStreamToString #-}
+
+-- | convert a 'String' to an 'InputStream'
+inputStreamFromString :: String -> InputStream
+
+-- | @(b,is') = takeByte is@ reads and removes
+-- the first byte @b@ from the 'InputStream' @is@
+takeByte :: InputStream -> (Word8, InputStream)
+{-# INLINE takeByte #-}
+
+-- | @(c,is') = takeChar is@ reads and removes
+-- the first character @c@ from the 'InputStream' @is@
+takeChar :: InputStream -> (Char, InputStream)
+{-# INLINE takeChar #-}
+
+-- | return @True@ if the given input stream is empty
+inputStreamEmpty :: InputStream -> Bool
+{-# INLINE inputStreamEmpty #-}
+
+-- | @str = takeChars n is@ returns the first @n@ characters
+-- of the given input stream, without removing them
+takeChars :: Int -> InputStream -> [Char]
+{-# INLINE takeChars #-}
+
+-- | @countLines@ returns the number of text lines  in the
+-- given 'InputStream'
+countLines :: InputStream -> Int
+
+#ifndef NO_BYTESTRING
+
+type InputStream = ByteString
+takeByte bs = BSW.head  bs `seq`  (BSW.head bs, BSW.tail bs)
+takeChar bs = BSC.head bs `seq`  (BSC.head bs, BSC.tail bs)
+inputStreamEmpty = BSW.null
+#ifndef __HADDOCK__
+takeChars !n bstr = BSC.unpack $ BSC.take n bstr --leaks
+#endif
+readInputStream       = BSW.readFile
+
+inputStreamToString   = BSC.unpack
+inputStreamFromString = BSC.pack
+countLines             = length . BSC.lines
+
+
+#else
+
+type InputStream = String
+takeByte bs
+  | Char.isLatin1 c = let b = fromIntegral (Char.ord c) in b `seq` (b, tail bs)
+  | otherwise       = error "takeByte: not a latin-1 character"
+  where c = head bs
+takeChar bs = (head bs, tail bs)
+inputStreamEmpty = null
+takeChars n str = take n str
+readInputStream = readFile
+inputStreamToString = id
+inputStreamFromString = id
+countLines = length . lines
+#endif
+
src/Language/C/Data/Name.hs view
@@ -1,31 +1,31 @@-{-# LANGUAGE DeriveDataTypeable #-}--------------------------------------------------------------------------------- |--- Module      :  Language.C.Data.Name--- Copyright   :  (c) 2008 Benedikt Huber--- License     :  BSD-style--- Maintainer  :  benedikt.huber@gmail.com--- Stability   :  experimental--- Portability :  ghc------ Unique Names with fast equality (newtype 'Int')-module Language.C.Data.Name (-Name(..),newNameSupply, namesStartingFrom-) where-import Data.Ix-import Data.Generics---- | Name is a unique identifier-newtype Name = Name { nameId :: Int } deriving (Show, Read, Eq, Ord, Ix, Data, Typeable)--instance Enum Name where-    toEnum = Name-    fromEnum (Name n) = n---- | return an infinite stream of 'Name's starting with @nameId@ 0-newNameSupply :: [Name]-newNameSupply = namesStartingFrom 0---- | get the infinite stream of unique names starting from the given integer-namesStartingFrom :: Int -> [Name]-namesStartingFrom k = [Name k..]+{-# LANGUAGE DeriveDataTypeable #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Data.Name
+-- Copyright   :  (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  experimental
+-- Portability :  ghc
+--
+-- Unique Names with fast equality (newtype 'Int')
+module Language.C.Data.Name (
+Name(..),newNameSupply, namesStartingFrom
+) where
+import Data.Ix
+import Data.Generics
+
+-- | Name is a unique identifier
+newtype Name = Name { nameId :: Int } deriving (Show, Read, Eq, Ord, Ix, Data, Typeable)
+
+instance Enum Name where
+    toEnum = Name
+    fromEnum (Name n) = n
+
+-- | return an infinite stream of 'Name's starting with @nameId@ 0
+newNameSupply :: [Name]
+newNameSupply = namesStartingFrom 0
+
+-- | get the infinite stream of unique names starting from the given integer
+namesStartingFrom :: Int -> [Name]
+namesStartingFrom k = [Name k..]
src/Language/C/Data/Node.hs view
@@ -1,124 +1,124 @@-{-# LANGUAGE DeriveDataTypeable #-}--------------------------------------------------------------------------------- |--- Module      :  Language.C.Syntax.Attributes--- Copyright   :  (c) [1995..1999] Manuel M. T. Chakravarty---                (c) 2008 Benedikt Huber (stripped radically)--- License     :  BSD-style--- Maintainer  :  benedikt.huber@gmail.com--- Stability   :  experimental--- Portability :  ghc------ source position and unqiue name-------------------------------------------------------------------------------module Language.C.Data.Node (-   NodeInfo(..), undefNode, isUndefNode,-   mkNodeInfoOnlyPos,mkNodeInfoPosLen, mkNodeInfo,mkNodeInfo',-   internalNode, -- deprecated, use undefNode-   CNode(nodeInfo), fileOfNode,-   posOfNode, nameOfNode, getLastTokenPos, lengthOfNode,-   eqByName,-) where-import Language.C.Data.Position-import Language.C.Data.Name     (Name)-import Data.Generics---- | Parsed entity attribute-data NodeInfo = OnlyPos  Position {-# UNPACK #-} !PosLength        -- only pos and last token (for internal stuff only)-              | NodeInfo Position {-# UNPACK #-} !PosLength !Name  -- pos, last token and unique name-           deriving (Data,Typeable,Eq,Ord)--instance Show NodeInfo where-    showsPrec d (OnlyPos p l) =-      (showString "(OnlyPos ") . (showsPrec d p) . (showString " ") . (showsPrec d l) . (showString ")")-    showsPrec d (NodeInfo p l n) =-      (showString "(NodeInfo ") . (showsPrec d p) . (showString " ") . (showsPrec d l) . (showString " ") . (showsPrec d n) . (showString ")")---- name equality of attributes, used to define (name) equality of objects---instance Eq NodeInfo where---  (NodeInfo   _ _ id1) == (NodeInfo   _ _ id2) = id1 == id2---  _               == _               =---    error "Attributes: Attempt to compare `OnlyPos' attributes!"---- attribute ordering---instance Ord NodeInfo where---  (NodeInfo   _ _ id1) <= (NodeInfo   _ _ id2) = id1 <= id2---  _               <= _               =---    error "Attributes: Attempt to compare `OnlyPos' attributes!"--instance Pos NodeInfo where-  posOf (OnlyPos pos _) = pos-  posOf (NodeInfo pos _ _) = pos---- | get the number of characters an AST node spans-lengthOfNode :: NodeInfo -> Maybe Int-lengthOfNode ni = len-    where-    len = case ni of NodeInfo firstPos lastTok _ -> computeLength firstPos lastTok-                     OnlyPos firstPos lastTok -> computeLength firstPos lastTok-    computeLength pos (lastPos,lastTokLen) | lastTokLen < 0   = Nothing-                                           | otherwise = Just (posOffset lastPos + lastTokLen - posOffset pos)---- | get the position and length of the last token-getLastTokenPos :: NodeInfo -> PosLength-getLastTokenPos (NodeInfo _ lastTok _) = lastTok-getLastTokenPos (OnlyPos _ lastTok) = lastTok---- | a class for convenient access to the attributes of an attributed object-class CNode a where-  nodeInfo :: a -> NodeInfo-instance CNode NodeInfo where-  nodeInfo = id-instance (CNode a, CNode b) => CNode (Either a b) where-  nodeInfo = either nodeInfo nodeInfo--nameOfNode :: NodeInfo -> Maybe Name-nameOfNode (OnlyPos _ _) = Nothing-nameOfNode (NodeInfo _ _ name) = Just name-posOfNode :: NodeInfo -> Position-posOfNode ni = case ni of (OnlyPos pos _) -> pos; (NodeInfo pos _ _) -> pos-fileOfNode :: (CNode a) => a -> Maybe FilePath-fileOfNode = fmap posFile . justIf isSourcePos . posOfNode . nodeInfo where-    justIf predicate x | predicate x = Just x-                       | otherwise   = Nothing---- | equality by name-eqByName           :: CNode a => a -> a -> Bool-eqByName obj1 obj2  = (nodeInfo obj1) == (nodeInfo obj2)----- attribute identifier creation--- ------------------------------{-# DEPRECATED internalNode "use undefNode instead" #-}-internalNode :: NodeInfo-internalNode = undefNode---- | create a node with neither name nor positional information-undefNode :: NodeInfo-undefNode = OnlyPos nopos (nopos,-1)---- | return True if the node carries neither name nor positional information-isUndefNode :: NodeInfo -> Bool-isUndefNode (OnlyPos p _) | isNoPos p = True-                          | otherwise = False-isUndefNode _ = False---- |--- | Given only a source position, create a new node attribute-mkNodeInfoOnlyPos :: Position -> NodeInfo-mkNodeInfoOnlyPos pos  = OnlyPos pos (nopos,-1)---- | Given a source position and the position and length of the last token, create a new node attribute-mkNodeInfoPosLen :: Position -> PosLength -> NodeInfo-mkNodeInfoPosLen = OnlyPos---- | Given a source position and a unique name, create a new attribute--- identifier-mkNodeInfo :: Position -> Name -> NodeInfo-mkNodeInfo pos name  = NodeInfo pos (nopos,-1) name---- | Given a source position, the position and length of the last token and a unique name, create a new attribute--- identifier. Strict in-mkNodeInfo' :: Position -> PosLength -> Name -> NodeInfo-mkNodeInfo' pos lasttok name = NodeInfo pos lasttok name-+{-# LANGUAGE DeriveDataTypeable #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Syntax.Attributes
+-- Copyright   :  (c) [1995..1999] Manuel M. T. Chakravarty
+--                (c) 2008 Benedikt Huber (stripped radically)
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  experimental
+-- Portability :  ghc
+--
+-- source position and unqiue name
+-----------------------------------------------------------------------------
+module Language.C.Data.Node (
+   NodeInfo(..), undefNode, isUndefNode,
+   mkNodeInfoOnlyPos,mkNodeInfoPosLen, mkNodeInfo,mkNodeInfo',
+   internalNode, -- deprecated, use undefNode
+   CNode(nodeInfo), fileOfNode,
+   posOfNode, nameOfNode, getLastTokenPos, lengthOfNode,
+   eqByName,
+) where
+import Language.C.Data.Position
+import Language.C.Data.Name     (Name)
+import Data.Generics
+
+-- | Parsed entity attribute
+data NodeInfo = OnlyPos  Position {-# UNPACK #-} !PosLength        -- only pos and last token (for internal stuff only)
+              | NodeInfo Position {-# UNPACK #-} !PosLength !Name  -- pos, last token and unique name
+           deriving (Data,Typeable,Eq,Ord)
+
+instance Show NodeInfo where
+    showsPrec d (OnlyPos p l) =
+      (showString "(OnlyPos ") . (showsPrec d p) . (showString " ") . (showsPrec d l) . (showString ")")
+    showsPrec d (NodeInfo p l n) =
+      (showString "(NodeInfo ") . (showsPrec d p) . (showString " ") . (showsPrec d l) . (showString " ") . (showsPrec d n) . (showString ")")
+
+-- name equality of attributes, used to define (name) equality of objects
+--instance Eq NodeInfo where
+--  (NodeInfo   _ _ id1) == (NodeInfo   _ _ id2) = id1 == id2
+--  _               == _               =
+--    error "Attributes: Attempt to compare `OnlyPos' attributes!"
+
+-- attribute ordering
+--instance Ord NodeInfo where
+--  (NodeInfo   _ _ id1) <= (NodeInfo   _ _ id2) = id1 <= id2
+--  _               <= _               =
+--    error "Attributes: Attempt to compare `OnlyPos' attributes!"
+
+instance Pos NodeInfo where
+  posOf (OnlyPos pos _) = pos
+  posOf (NodeInfo pos _ _) = pos
+
+-- | get the number of characters an AST node spans
+lengthOfNode :: NodeInfo -> Maybe Int
+lengthOfNode ni = len
+    where
+    len = case ni of NodeInfo firstPos lastTok _ -> computeLength firstPos lastTok
+                     OnlyPos firstPos lastTok -> computeLength firstPos lastTok
+    computeLength pos (lastPos,lastTokLen) | lastTokLen < 0   = Nothing
+                                           | otherwise = Just (posOffset lastPos + lastTokLen - posOffset pos)
+
+-- | get the position and length of the last token
+getLastTokenPos :: NodeInfo -> PosLength
+getLastTokenPos (NodeInfo _ lastTok _) = lastTok
+getLastTokenPos (OnlyPos _ lastTok) = lastTok
+
+-- | a class for convenient access to the attributes of an attributed object
+class CNode a where
+  nodeInfo :: a -> NodeInfo
+instance CNode NodeInfo where
+  nodeInfo = id
+instance (CNode a, CNode b) => CNode (Either a b) where
+  nodeInfo = either nodeInfo nodeInfo
+
+nameOfNode :: NodeInfo -> Maybe Name
+nameOfNode (OnlyPos _ _) = Nothing
+nameOfNode (NodeInfo _ _ name) = Just name
+posOfNode :: NodeInfo -> Position
+posOfNode ni = case ni of (OnlyPos pos _) -> pos; (NodeInfo pos _ _) -> pos
+fileOfNode :: (CNode a) => a -> Maybe FilePath
+fileOfNode = fmap posFile . justIf isSourcePos . posOfNode . nodeInfo where
+    justIf predicate x | predicate x = Just x
+                       | otherwise   = Nothing
+
+-- | equality by name
+eqByName           :: CNode a => a -> a -> Bool
+eqByName obj1 obj2  = (nodeInfo obj1) == (nodeInfo obj2)
+
+
+-- attribute identifier creation
+-- -----------------------------
+{-# DEPRECATED internalNode "use undefNode instead" #-}
+internalNode :: NodeInfo
+internalNode = undefNode
+
+-- | create a node with neither name nor positional information
+undefNode :: NodeInfo
+undefNode = OnlyPos nopos (nopos,-1)
+
+-- | return True if the node carries neither name nor positional information
+isUndefNode :: NodeInfo -> Bool
+isUndefNode (OnlyPos p _) | isNoPos p = True
+                          | otherwise = False
+isUndefNode _ = False
+
+-- |
+-- | Given only a source position, create a new node attribute
+mkNodeInfoOnlyPos :: Position -> NodeInfo
+mkNodeInfoOnlyPos pos  = OnlyPos pos (nopos,-1)
+
+-- | Given a source position and the position and length of the last token, create a new node attribute
+mkNodeInfoPosLen :: Position -> PosLength -> NodeInfo
+mkNodeInfoPosLen = OnlyPos
+
+-- | Given a source position and a unique name, create a new attribute
+-- identifier
+mkNodeInfo :: Position -> Name -> NodeInfo
+mkNodeInfo pos name  = NodeInfo pos (nopos,-1) name
+
+-- | Given a source position, the position and length of the last token and a unique name, create a new attribute
+-- identifier. Strict in
+mkNodeInfo' :: Position -> PosLength -> Name -> NodeInfo
+mkNodeInfo' pos lasttok name = NodeInfo pos lasttok name
+
src/Language/C/Data/Position.hs view
@@ -1,129 +1,129 @@-{-# LANGUAGE DeriveDataTypeable #-}--------------------------------------------------------------------------------- |--- Module      :  Language.C.Data.Position--- Copyright   :  (c) [1995..2000] Manuel M. T. Chakravarty---                    [2008..2009] Benedikt Huber--- License     :  BSD-style--- Maintainer  :  benedikt.huber@gmail.com--- Stability   :  experimental--- Portability :  ghc------ Source code position-------------------------------------------------------------------------------module Language.C.Data.Position (-  ---  -- source text positions-  ---  Position(),-  position,-  PosLength,-  posFile,posRow,posColumn,posOffset,posParent,-  initPos, isSourcePos,-  nopos, isNoPos,-  builtinPos, isBuiltinPos,-  internalPos, isInternalPos,-  incPos, retPos,-  incOffset,-  Pos(..),-) where-import Data.Generics---- | file position information-data FilePosition = FilePosition { posSrcFile    :: String,            -- ^ source file-                                   posParentFile :: (Maybe Position)   -- ^ including file, if any-                                 }-                    deriving (Eq, Ord, Typeable, Data)---- | uniform representation of source file positions-data Position = Position { posOffset :: {-# UNPACK #-} !Int  -- ^ absolute offset in the preprocessed file-                         , posRow :: {-# UNPACK #-} !Int     -- ^ row (line)  in the original file. Affected by #LINE pragmas.-                         , posColumn :: {-# UNPACK #-} !Int  -- ^ column in the preprocessed file. Inaccurate w.r.t. to the original-                                                             --   file in the presence of preprocessor macros.-                         , posFileInfo :: FilePosition       -- ^ position in source file, including files-                         }-              | NoPosition-              | BuiltinPosition-              | InternalPosition-                deriving (Eq, Ord, Typeable, Data)--posFile :: Position -> String-posFile = posSrcFile . posFileInfo--posParent :: Position -> (Maybe Position)-posParent = posParentFile . posFileInfo---- | Position and length of a token-type PosLength = (Position,Int)--instance Show Position where-  showsPrec _ (Position _ row _ (FilePosition fname mparent)) =-    showString "(" . showsPrec 0 fname . showString ": line " . showsPrec 0 row .-    maybe id (\p -> showString ", in file included from " . showsPrec 0 p) mparent .-    showString ")"-  showsPrec _  NoPosition                     = showString "<no file>"-  showsPrec _  BuiltinPosition                = showString "<builtin>"-  showsPrec _ InternalPosition                = showString "<internal>"---- | @position absoluteOffset fileName lineNumber columnNumber@ initializes a @Position@ using the given arguments-position :: Int -> String -> Int -> Int -> Maybe Position -> Position-position offset fname row col mparent = Position offset row col (FilePosition fname mparent)---- | class of type which aggregate a source code location-class Pos a where-    posOf :: a -> Position---- | initialize a Position to the start of the translation unit starting in the given file-initPos :: FilePath -> Position-initPos file = Position 0 1 1 (FilePosition file Nothing)---- | returns @True@ if the given position refers to an actual source file-isSourcePos :: Position -> Bool-isSourcePos (Position _ _ _ _) = True-isSourcePos _                  = False---- | no position (for unknown position information)-nopos :: Position-nopos  = NoPosition---- | returns @True@ if the there is no position information available-isNoPos :: Position -> Bool-isNoPos NoPosition = True-isNoPos _          = False---- | position attached to built-in objects----builtinPos :: Position-builtinPos  = BuiltinPosition---- | returns @True@ if the given position refers to a builtin definition-isBuiltinPos :: Position -> Bool-isBuiltinPos BuiltinPosition = True-isBuiltinPos _               = False---- | position used for internal errors-internalPos :: Position-internalPos = InternalPosition---- | returns @True@ if the given position is internal-isInternalPos :: Position -> Bool-isInternalPos InternalPosition = True-isInternalPos _                = False--{-# INLINE incPos #-}--- | advance column-incPos :: Position -> Int -> Position-incPos (Position offs row col fpos) n = Position (offs + n) row (col + n) fpos-incPos p _                             = p--{-# INLINE retPos #-}--- | advance to next line-retPos :: Position -> Position-retPos (Position offs row _ fpos) = Position (offs+1) (row + 1) 1 fpos-retPos p                           = p--{-# INLINE incOffset #-}--- | advance just the offset-incOffset :: Position -> Int -> Position-incOffset (Position o r c f) n = Position (o + n) r c f-incOffset pos _             = pos+{-# LANGUAGE DeriveDataTypeable #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Data.Position
+-- Copyright   :  (c) [1995..2000] Manuel M. T. Chakravarty
+--                    [2008..2009] Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  experimental
+-- Portability :  ghc
+--
+-- Source code position
+-----------------------------------------------------------------------------
+module Language.C.Data.Position (
+  --
+  -- source text positions
+  --
+  Position(),
+  position,
+  PosLength,
+  posFile,posRow,posColumn,posOffset,posParent,
+  initPos, isSourcePos,
+  nopos, isNoPos,
+  builtinPos, isBuiltinPos,
+  internalPos, isInternalPos,
+  incPos, retPos,
+  incOffset,
+  Pos(..),
+) where
+import Data.Generics
+
+-- | file position information
+data FilePosition = FilePosition { posSrcFile    :: String,            -- ^ source file
+                                   posParentFile :: (Maybe Position)   -- ^ including file, if any
+                                 }
+                    deriving (Eq, Ord, Typeable, Data)
+
+-- | uniform representation of source file positions
+data Position = Position { posOffset :: {-# UNPACK #-} !Int  -- ^ absolute offset in the preprocessed file
+                         , posRow :: {-# UNPACK #-} !Int     -- ^ row (line)  in the original file. Affected by #LINE pragmas.
+                         , posColumn :: {-# UNPACK #-} !Int  -- ^ column in the preprocessed file. Inaccurate w.r.t. to the original
+                                                             --   file in the presence of preprocessor macros.
+                         , posFileInfo :: FilePosition       -- ^ position in source file, including files
+                         }
+              | NoPosition
+              | BuiltinPosition
+              | InternalPosition
+                deriving (Eq, Ord, Typeable, Data)
+
+posFile :: Position -> String
+posFile = posSrcFile . posFileInfo
+
+posParent :: Position -> (Maybe Position)
+posParent = posParentFile . posFileInfo
+
+-- | Position and length of a token
+type PosLength = (Position,Int)
+
+instance Show Position where
+  showsPrec _ (Position _ row _ (FilePosition fname mparent)) =
+    showString "(" . showsPrec 0 fname . showString ": line " . showsPrec 0 row .
+    maybe id (\p -> showString ", in file included from " . showsPrec 0 p) mparent .
+    showString ")"
+  showsPrec _  NoPosition                     = showString "<no file>"
+  showsPrec _  BuiltinPosition                = showString "<builtin>"
+  showsPrec _ InternalPosition                = showString "<internal>"
+
+-- | @position absoluteOffset fileName lineNumber columnNumber@ initializes a @Position@ using the given arguments
+position :: Int -> String -> Int -> Int -> Maybe Position -> Position
+position offset fname row col mparent = Position offset row col (FilePosition fname mparent)
+
+-- | class of type which aggregate a source code location
+class Pos a where
+    posOf :: a -> Position
+
+-- | initialize a Position to the start of the translation unit starting in the given file
+initPos :: FilePath -> Position
+initPos file = Position 0 1 1 (FilePosition file Nothing)
+
+-- | returns @True@ if the given position refers to an actual source file
+isSourcePos :: Position -> Bool
+isSourcePos (Position _ _ _ _) = True
+isSourcePos _                  = False
+
+-- | no position (for unknown position information)
+nopos :: Position
+nopos  = NoPosition
+
+-- | returns @True@ if the there is no position information available
+isNoPos :: Position -> Bool
+isNoPos NoPosition = True
+isNoPos _          = False
+
+-- | position attached to built-in objects
+--
+builtinPos :: Position
+builtinPos  = BuiltinPosition
+
+-- | returns @True@ if the given position refers to a builtin definition
+isBuiltinPos :: Position -> Bool
+isBuiltinPos BuiltinPosition = True
+isBuiltinPos _               = False
+
+-- | position used for internal errors
+internalPos :: Position
+internalPos = InternalPosition
+
+-- | returns @True@ if the given position is internal
+isInternalPos :: Position -> Bool
+isInternalPos InternalPosition = True
+isInternalPos _                = False
+
+{-# INLINE incPos #-}
+-- | advance column
+incPos :: Position -> Int -> Position
+incPos (Position offs row col fpos) n = Position (offs + n) row (col + n) fpos
+incPos p _                             = p
+
+{-# INLINE retPos #-}
+-- | advance to next line
+retPos :: Position -> Position
+retPos (Position offs row _ fpos) = Position (offs+1) (row + 1) 1 fpos
+retPos p                           = p
+
+{-# INLINE incOffset #-}
+-- | advance just the offset
+incOffset :: Position -> Int -> Position
+incOffset (Position o r c f) n = Position (o + n) r c f
+incOffset pos _             = pos
src/Language/C/Data/RList.hs view
@@ -1,52 +1,52 @@--------------------------------------------------------------------------------- |--- Module      :  Language.C.Data.RList--- Copyright   :  (c) [2007..2008] Duncan Coutts, Benedikt Huber--- License     :  BSD-style--- Maintainer  : benedikt.huber@gmail.com--- Stability   : experimental--- Portability : ghc------ Due to the way the grammar is constructed we very often have to build lists--- in reverse. To make sure we do this consistently and correctly we have a--- newtype to wrap the reversed style of list:-------------------------------------------------------------------------------module Language.C.Data.RList (-    RList,Reversed(..),-    empty,singleton,snoc,rappend,appendr,rappendr,rmap,reverse,-    viewr,-)-where-import Prelude hiding (reverse)-import qualified Data.List as List--newtype Reversed a = Reversed a-type RList a = Reversed [a]-empty :: Reversed [a]-empty = Reversed []--singleton :: a -> Reversed [a]-singleton x = Reversed [x]--snoc :: Reversed [a] -> a -> Reversed [a]-snoc (Reversed xs) x = Reversed (x : xs)-infixl 5 `snoc`--rappend :: Reversed [a] -> [a] -> Reversed [a]-rappend (Reversed xs) ys = Reversed (List.reverse ys ++ xs)--appendr :: [a] -> Reversed [a] -> Reversed [a]-appendr xs (Reversed ys) = Reversed (ys ++ List.reverse xs)--rappendr :: Reversed [a] -> Reversed [a] -> Reversed [a]-rappendr (Reversed xs) (Reversed ys) = Reversed (ys ++ xs)--rmap :: (a -> b) -> Reversed [a] -> Reversed [b]-rmap f (Reversed xs) = Reversed (map f xs)--reverse :: Reversed [a] -> [a]-reverse (Reversed xs) = List.reverse xs--viewr :: Reversed [a] -> (Reversed [a] , a)-viewr (Reversed []) = error "viewr: empty RList"-viewr (Reversed (x:xs)) = (Reversed xs, x)+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Data.RList
+-- Copyright   :  (c) [2007..2008] Duncan Coutts, Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  : benedikt.huber@gmail.com
+-- Stability   : experimental
+-- Portability : ghc
+--
+-- Due to the way the grammar is constructed we very often have to build lists
+-- in reverse. To make sure we do this consistently and correctly we have a
+-- newtype to wrap the reversed style of list:
+-----------------------------------------------------------------------------
+module Language.C.Data.RList (
+    RList,Reversed(..),
+    empty,singleton,snoc,rappend,appendr,rappendr,rmap,reverse,
+    viewr,
+)
+where
+import Prelude hiding (reverse)
+import qualified Data.List as List
+
+newtype Reversed a = Reversed a
+type RList a = Reversed [a]
+empty :: Reversed [a]
+empty = Reversed []
+
+singleton :: a -> Reversed [a]
+singleton x = Reversed [x]
+
+snoc :: Reversed [a] -> a -> Reversed [a]
+snoc (Reversed xs) x = Reversed (x : xs)
+infixl 5 `snoc`
+
+rappend :: Reversed [a] -> [a] -> Reversed [a]
+rappend (Reversed xs) ys = Reversed (List.reverse ys ++ xs)
+
+appendr :: [a] -> Reversed [a] -> Reversed [a]
+appendr xs (Reversed ys) = Reversed (ys ++ List.reverse xs)
+
+rappendr :: Reversed [a] -> Reversed [a] -> Reversed [a]
+rappendr (Reversed xs) (Reversed ys) = Reversed (ys ++ xs)
+
+rmap :: (a -> b) -> Reversed [a] -> Reversed [b]
+rmap f (Reversed xs) = Reversed (map f xs)
+
+reverse :: Reversed [a] -> [a]
+reverse (Reversed xs) = List.reverse xs
+
+viewr :: Reversed [a] -> (Reversed [a] , a)
+viewr (Reversed []) = error "viewr: empty RList"
+viewr (Reversed (x:xs)) = (Reversed xs, x)
src/Language/C/Parser.hs view
@@ -1,36 +1,36 @@-{-# OPTIONS  #-}--------------------------------------------------------------------------------- |--- Module      :  Language.C.Parser--- Copyright   :  (c) 2008 Benedikt Huber--- License     :  BSD-style--- Maintainer  : benedikt.huber@gmail.com--- Stability   : experimental--- Portability : ghc------ Language.C parser-------------------------------------------------------------------------------module Language.C.Parser (-    -- * Simple API-    parseC,-    -- * Parser Monad-    P,execParser,execParser_,builtinTypeNames,-    -- * Exposed Parsers-    translUnitP, extDeclP, statementP, expressionP,-    -- * Parser Monad-    ParseError(..)-)-where-import Language.C.Parser.Parser (parseC,translUnitP, extDeclP, statementP, expressionP)-import Language.C.Parser.ParserMonad (execParser, ParseError(..),P)-import Language.C.Parser.Builtin (builtinTypeNames)--import Language.C.Data---- | run the given parser using a new name supply and builtin typedefs---   see 'execParser'------ Synopsis: @runParser parser inputStream initialPos@-execParser_ :: P a -> InputStream -> Position -> Either ParseError a-execParser_ parser input pos =-  fmap fst $ execParser parser input pos builtinTypeNames newNameSupply+{-# OPTIONS  #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Parser
+-- Copyright   :  (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  : benedikt.huber@gmail.com
+-- Stability   : experimental
+-- Portability : ghc
+--
+-- Language.C parser
+-----------------------------------------------------------------------------
+module Language.C.Parser (
+    -- * Simple API
+    parseC,
+    -- * Parser Monad
+    P,execParser,execParser_,builtinTypeNames,
+    -- * Exposed Parsers
+    translUnitP, extDeclP, statementP, expressionP,
+    -- * Parser Monad
+    ParseError(..)
+)
+where
+import Language.C.Parser.Parser (parseC,translUnitP, extDeclP, statementP, expressionP)
+import Language.C.Parser.ParserMonad (execParser, ParseError(..),P)
+import Language.C.Parser.Builtin (builtinTypeNames)
+
+import Language.C.Data
+
+-- | run the given parser using a new name supply and builtin typedefs
+--   see 'execParser'
+--
+-- Synopsis: @runParser parser inputStream initialPos@
+execParser_ :: P a -> InputStream -> Position -> Either ParseError a
+execParser_ parser input pos =
+  fmap fst $ execParser parser input pos builtinTypeNames newNameSupply
src/Language/C/Parser/Builtin.hs view
@@ -1,21 +1,21 @@--- |--- Module      :  Language.C.Parser.Builtin--- Copyright   :  (c) 2001 Manuel M. T. Chakravarty--- License     :  BSD-style--- Maintainer  :  benedikt.huber@gmail.com--- Portability :  portable------ This module provides information about builtin entities.------  Currently, only builtin type names are supported.  The only builtin type---  name is `__builtin_va_list', which is a builtin of GNU C.----module Language.C.Parser.Builtin (-  builtinTypeNames-) where-import Language.C.Data.Ident (Ident, builtinIdent)---- predefined type names----builtinTypeNames :: [Ident]-builtinTypeNames  = [builtinIdent "__builtin_va_list"]+-- |
+-- Module      :  Language.C.Parser.Builtin
+-- Copyright   :  (c) 2001 Manuel M. T. Chakravarty
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Portability :  portable
+--
+-- This module provides information about builtin entities.
+--
+--  Currently, only builtin type names are supported.  The only builtin type
+--  name is `__builtin_va_list', which is a builtin of GNU C.
+--
+module Language.C.Parser.Builtin (
+  builtinTypeNames
+) where
+import Language.C.Data.Ident (Ident, builtinIdent)
+
+-- predefined type names
+--
+builtinTypeNames :: [Ident]
+builtinTypeNames  = [builtinIdent "__builtin_va_list"]
src/Language/C/Parser/Lexer.x view
@@ -1,566 +1,566 @@--------------------------------------------------------------------------------- Module      :  Lexer.x--- Copyright   : (c) [1999..2004] Manuel M T Chakravarty---               (c) 2005 Duncan Coutts---               (c) 2008 Benedikt Huber--- License     :  BSD-style--- Maintainer  :  benedikt.huber@gmail.com--- Portability :  portable------  Lexer for C files, after being processed by the C preprocessor------  We assume that the input already went through cpp.  Thus, we do not handle---  comments and preprocessor directives here.  It supports the---  C99 `restrict' extension: <http://www.lysator.liu.se/c/restrict.html> as---  well as inline functions.------  Comments:------  * Universal character names and multi-character character constants,---    as well as trigraphs are unsupported. They are lexed, but yield an error.------  * We add `typedef-name' (K&R 8.9) as a token, as proposed in K&R A13.---    However, as these tokens cannot be recognized lexically, but require a---    context analysis, they are never produced by the lexer, but instead have---    to be introduced in a later phase (by converting the corresponding---    identifiers).------  * We also recognize GNU C `__attribute__', `__extension__', `__complex__',---    `__const',  `__const__', `__imag', `__imag__', `__inline', `__inline__',---    `__real', `__real__, `__restrict', and `__restrict__'.------  * Any line starting with `#pragma' is ignored.------  With K&R we refer to ``The C Programming Language'', second edition, Brain---  W. Kernighan and Dennis M. Ritchie, Prentice Hall, 1988.------  With C99 we refer to ``ISO/IEC 9899:TC3'',---  available online at http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf.------- TODO ----------------------------------------------------------------------------  * There are more GNU C specific keywords.  Add them and change `Parser.y'---    correspondingly (in particular, most tokens within __attribute ((...))---    expressions are actually keywords, but we handle them as identifiers at---    the moment).------  * Add support for bytestrings--{--module Language.C.Parser.Lexer (lexC, parseError) where--import Data.Char (chr, isDigit)-import Data.Word (Word8)-import Control.Monad (liftM, when)--import Language.C.Data.InputStream-  (InputStream, inputStreamEmpty, takeByte, takeChar, takeChars)---- (    InputStream, readInputStream,inputStreamToString,inputStreamFromString,---     takeByte, takeChar, inputStreamEmpty, takeChars,---     countLines,--- )-import Language.C.Data.Position-import Language.C.Data.Ident    (mkIdent)--import Language.C.Syntax.Constants--import Language.C.Parser.Tokens-import Language.C.Parser.ParserMonad-}--$space = [ \ \t ]                           -- horizontal white space-$eol   = \n                                 -- end of line--$letter   = [a-zA-Z]-$identletter = [a-zA-Z_\$]                  -- GNU extension: allow $ in variable names-$octdigit = 0-7-$digit    = 0-9-$digitNZ  = 1-9-$hexdigit = [0-9a-fA-F]--$inchar   = . # [ \\ \' \n \r ]       -- valid character in char constant-$instr    = . # [ \\ \" \n \r ]       -- valid character in a string literal-$infname  = . # [ \\ \" ]             -- valid character in a filename--@sp  = $space*---- character escape sequence (follows K&R A2.5.2)------ * also used for strings--- * C99: 6.4.4.4-@charesc  = \\([ntvbrfaeE\\\?\'\"]|$octdigit{1,3}|x$hexdigit+)-@ucn      = \\u$hexdigit{4}|\\U$hexdigit{8}---- components of integer constants------ * C99: 6.4.4.1-@int = $digitNZ$digit*---- integer suffixes-@llsuffix  = ll|LL-@gnusuffix = [ij]?-@intsuffix = [uU][lL]?|[uU]@llsuffix|[lL][uU]?|@llsuffix[uU]?-@intgnusuffix = @intsuffix@gnusuffix?|@gnusuffix@intsuffix?---- components of float constants (follows K&R A2.5.3)------ * C99: 6.4.4.2-@digits    = $digit+-@intpart   = @digits-@fractpart = @digits--@mantpart  = @intpart?\.@fractpart|@intpart\.-@exppart   = [eE][\+\-]?@digits--@hexprefix = 0x-@hexdigits = $hexdigit+-@hexmant   = @hexdigits?\.@hexdigits|@hexdigits\.-@binexp    = [pP][\+\-]?@digits---- Suffixes `qQwW` are GNU floating type extensions: <https://gcc.gnu.org/onlinedocs/gcc/Floating-Types.html>-@floatsuffix    = [fFlLqQwW]-@floatgnusuffix = @floatsuffix@gnusuffix?|@gnusuffix@floatsuffix?---- clang version literals with a major.minor.rev-@clangversion = @intpart\.@intpart\.@intpart--tokens :----- whitespace (follows K&R A2.1)------ * horizontal and vertical tabs, newlines, and form feeds are filter out by---   `Lexers.ctrlLexer'------ * comments are not handled, as we assume the input already went through cpp----$white+         ;---- #line directive (C11 6.10.4, GCC Line Control)------ * standard form: int => change line number--- * standard form: int string => change source file and line number--- * preprocessor (gcc/clang): int string int => change source file and line number,---       push or pop item from stack------ * see https://gcc.gnu.org/onlinedocs/cpp/Preprocessor-Output.html----\#$space*@int$space*(\"($infname|@charesc)*\"$space*)?(@int$space*)*\r?$eol-  { \pos len str -> setPos (adjustLineDirective len (takeChars len str) pos) >> lexToken' False }---- #pragma directive (K&R A12.8)------ * we simply ignore any #pragma (but take care to update the position---   information)----\#$space*pragma.*$eol   ;---- #ident directive, eg used by rcs/cvs------ * we simply ignore any #ident (but take care to update the position---   information)----\#$space*ident.*$eol    ;---- identifiers and keywords (follows K&R A2.3 and A2.4)----$identletter($identletter|$digit)*  { \pos len str -> idkwtok (takeChars len str) pos }---- constants (follows K&R A2.5)------ * K&R,C99 explicitly mention `enumeration-constants'; however, as they are---   lexically identifiers, we do not have an extra case for them------- integer constants (follows K&R A2.5.1, C99 6.4.4.1)--- NOTE: 0 is lexed as octal integer constant, and readCOctal takes care of this-0$octdigit*@intgnusuffix?       { token_plus CTokILit readCOctal }-$digitNZ$digit*@intgnusuffix?   { token_plus CTokILit (readCInteger DecRepr) }-0[xX]$hexdigit+@intgnusuffix?   { token_plus CTokILit (readCInteger HexRepr . drop 2) }--(0$octdigit*|$digitNZ$digit*|0[xX]$hexdigit+)[uUlL]+ { token_fail "Invalid integer constant suffix" }---- character constants (follows K&R A2.5.2, C99 6.4.4.4)------ * Universal Character Names are unsupported and cause an error.-\'($inchar|@charesc)\'  { token CTokCLit (cChar . fst . unescapeChar . tail) }-L\'($inchar|@charesc)\' { token CTokCLit (cChar_w . fst . unescapeChar . tail . tail) }-\'($inchar|@charesc){2,}\' { token CTokCLit (flip cChars False . unescapeMultiChars .tail) }-L\'($inchar|@charesc){2,}\' { token CTokCLit (flip cChars True . unescapeMultiChars . tail . tail) }---- Clang version literals-@clangversion           { token (\pos -> CTokClangC pos . ClangCVersionTok) readClangCVersion }---- float constants (follows K&R A2.5.3. C99 6.4.4.2)------ * NOTE: Hexadecimal floating constants without binary exponents are forbidden.---         They generate a lexer error, because they are hard to recognize in the parser.-(@mantpart@exppart?|@intpart@exppart)@floatgnusuffix?  { token CTokFLit readCFloat }-@hexprefix(@hexmant|@hexdigits)@binexp@floatgnusuffix? { token CTokFLit readCFloat }-@hexprefix@hexmant                                     { token_fail "Hexadecimal floating constant requires an exponent" }---- string literal (follows K&R A2.6)--- C99: 6.4.5.-\"($instr|@charesc)*\"      { token CTokSLit (cString . unescapeString . init . tail) }-L\"($instr|@charesc)*\"     { token CTokSLit (cString_w . unescapeString . init . tail . tail) }--L?\'@ucn\'                        { token_fail "Universal character names are unsupported" }-L?\'\\[^0-7'\"\?\\abfnrtvuUx]\'     { token_fail "Invalid escape sequence" }-L?\"($inchar|@charesc)*@ucn($inchar|@charesc|@ucn)*\" { token_fail "Universal character names in string literals are unsupported"}---- operators and separators----"("   { token_ 1 CTokLParen }-")"   { token_ 1 CTokRParen  }-"["   { token_ 1 CTokLBracket }-"]"   { token_ 1 CTokRBracket }-"->"  { token_ 2 CTokArrow }-"."   { token_ 1 CTokDot }-"!"   { token_ 1 CTokExclam }-"~"   { token_ 1 CTokTilde }-"++"  { token_ 2 CTokInc }-"--"  { token_ 2 CTokDec }-"+"   { token_ 1 CTokPlus }-"-"   { token_ 1 CTokMinus }-"*"   { token_ 1 CTokStar }-"/"   { token_ 1 CTokSlash }-"%"   { token_ 1 CTokPercent }-"&"   { token_ 1 CTokAmper }-"<<"  { token_ 2 CTokShiftL }-">>"  { token_ 2 CTokShiftR }-"<"   { token_ 1 CTokLess }-"<="  { token_ 2 CTokLessEq }-">"   { token_ 1 CTokHigh }-">="  { token_ 2 CTokHighEq }-"=="  { token_ 2 CTokEqual }-"!="  { token_ 2 CTokUnequal }-"^"   { token_ 1 CTokHat }-"|"   { token_ 1 CTokBar }-"&&"  { token_ 2 CTokAnd }-"||"  { token_ 2 CTokOr }-"?"   { token_ 1 CTokQuest }-":"   { token_ 1 CTokColon }-"="   { token_ 1 CTokAssign }-"+="  { token_ 2 CTokPlusAss }-"-="  { token_ 2 CTokMinusAss }-"*="  { token_ 2 CTokStarAss }-"/="  { token_ 2 CTokSlashAss }-"%="  { token_ 2 CTokPercAss }-"&="  { token_ 2 CTokAmpAss }-"^="  { token_ 2 CTokHatAss }-"|="  { token_ 2 CTokBarAss }-"<<=" { token_ 3 CTokSLAss }-">>=" { token_ 3 CTokSRAss }-","   { token_ 1 CTokComma }-\;    { token_ 1 CTokSemic }-"{"   { token_ 1 CTokLBrace }-"}"   { token_ 1 CTokRBrace }-"..." { token_ 3 CTokEllipsis }---{--- Fix the 'octal' lexing of '0'-readCOctal :: String -> Either String CInteger-readCOctal s@('0':r) =-    case r of-        (c:_) | isDigit c -> readCInteger OctalRepr r-        _                 -> readCInteger DecRepr s-readCOctal _ = error "ReadOctal: string does not start with `0'"---- We use the odd looking list of string patterns here rather than normal--- string literals since GHC converts the latter into a sequence of string--- comparisons (ie a linear search) but it translates the former using its--- effecient pattern matching which gives us the expected radix-style search.--- This change makes a significant performance difference [chak]------ To make this a little more maintainable, we autogenerate it from this list,--- using the script GenerateKeywords.hs (in /scripts)-{--alignas _Alignas, alignof _Alignof __alignof alignof __alignof__, asm @__, atomic _Atomic, auto-break, bool _Bool,-case, char, const @__, continue, complex _Complex __complex__-default, do, double,-else, enum, extern,-float, for, goto,-if, inline @__, int, __int128, long, noreturn _Noreturn,-float, for,-generic _Generic, goto,-if, inline @__, int, int128 __int128, long,-noreturn _Noreturn,  _Nullable __nullable, _Nonnull __nonnull,-register, restrict @__, return-short, signed @__, sizeof, static, staticAssert _Static_assert, struct, switch,-typedef, typeof @__, thread __thread _Thread_local-union, unsigned, void, volatile @__,-while,-label __label__-(CTokGnuC GnuCAttrTok) __attribute __attribute__-(CTokGnuC GnuCExtTok) __extension__-(CTokGnuC GnuCComplexReal) __real __real__-(CTokGnuC GnuCComplexImag) __imag __imag__-(CTokGnuC GnuCVaArg) __builtin_va_arg-(CTokGnuC GnuCOffsetof) __builtin_offsetof-(CTokGnuC GnuCTyCompat) __builtin_types_compatible_p-(CTokClangC ClangBuiltinConvertVector) __builtin_convertvector--}--- Tokens: _Alignas _Alignof __alignof alignof __alignof__ __asm asm __asm__ _Atomic auto break _Bool case char __const const __const__ continue _Complex __complex__ default do double else enum extern float __float128 _Float128 for _Generic goto if __inline inline __inline__ int __int128 long _Noreturn  _Nullable __nullable _Nonnull __nonnull register __restrict restrict __restrict__ return short __signed signed __signed__ sizeof static _Static_assert struct switch typedef __typeof typeof __typeof__ __thread _Thread_local union unsigned void __volatile volatile __volatile__ while __label__ __attribute __attribute__ __extension__ __real __real__ __imag __imag__ __builtin_va_arg __builtin_offsetof __builtin_types_compatible_p  __builtin_convertvector-idkwtok ('_' : 'A' : 'l' : 'i' : 'g' : 'n' : 'a' : 's' : []) = tok 8 CTokAlignas-idkwtok ('_' : 'A' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : []) = tok 8 CTokAlignof-idkwtok ('_' : 'A' : 't' : 'o' : 'm' : 'i' : 'c' : []) = tok 7 CTokAtomic-idkwtok ('_' : 'B' : 'o' : 'o' : 'l' : []) = tok 5 CTokBool-idkwtok ('_' : 'C' : 'o' : 'm' : 'p' : 'l' : 'e' : 'x' : []) = tok 8 CTokComplex-idkwtok ('_' : 'N' : 'o' : 'n' : 'n' : 'u' : 'l' : 'l' : []) = tok 8 CTokNonnull-idkwtok ('_' : 'G' : 'e' : 'n' : 'e' : 'r' : 'i' : 'c' : []) = tok 8 CTokGeneric-idkwtok ('_' : 'N' : 'o' : 'r' : 'e' : 't' : 'u' : 'r' : 'n' : []) = tok 9 CTokNoreturn-idkwtok ('_' : 'N' : 'u' : 'l' : 'l' : 'a' : 'b' : 'l' : 'e' : []) = tok 9 CTokNullable-idkwtok ('_' : 'S' : 't' : 'a' : 't' : 'i' : 'c' : '_' : 'a' : 's' : 's' : 'e' : 'r' : 't' : []) = tok 14 CTokStaticAssert-idkwtok ('_' : 'T' : 'h' : 'r' : 'e' : 'a' : 'd' : '_' : 'l' : 'o' : 'c' : 'a' : 'l' : []) = tok 13 CTokThread-idkwtok ('_' : '_' : 'a' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : []) = tok 9 CTokAlignof-idkwtok ('a' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : []) = tok 7 CTokAlignof-idkwtok ('_' : '_' : 'a' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : '_' : '_' : []) = tok 11 CTokAlignof-idkwtok ('_' : '_' : 'a' : 's' : 'm' : []) = tok 5 CTokAsm-idkwtok ('a' : 's' : 'm' : []) = tok 3 CTokAsm-idkwtok ('_' : '_' : 'a' : 's' : 'm' : '_' : '_' : []) = tok 7 CTokAsm-idkwtok ('_' : '_' : 'a' : 't' : 't' : 'r' : 'i' : 'b' : 'u' : 't' : 'e' : []) = tok 11 (CTokGnuC GnuCAttrTok)-idkwtok ('_' : '_' : 'a' : 't' : 't' : 'r' : 'i' : 'b' : 'u' : 't' : 'e' : '_' : '_' : []) = tok 13 (CTokGnuC GnuCAttrTok)-idkwtok ('a' : 'u' : 't' : 'o' : []) = tok 4 CTokAuto-idkwtok ('b' : 'r' : 'e' : 'a' : 'k' : []) = tok 5 CTokBreak-idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 'o' : 'f' : 'f' : 's' : 'e' : 't' : 'o' : 'f' : []) = tok 18 (CTokGnuC GnuCOffsetof)-idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 't' : 'y' : 'p' : 'e' : 's' : '_' : 'c' : 'o' : 'm' : 'p' : 'a' : 't' : 'i' : 'b' : 'l' : 'e' : '_' : 'p' : []) = tok 28 (CTokGnuC GnuCTyCompat)-idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 'v' : 'a' : '_' : 'a' : 'r' : 'g' : []) = tok 16 (CTokGnuC GnuCVaArg)-idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 'c' : 'o' : 'n' : 'v' : 'e' : 'r' : 't' : 'v' : 'e' : 'c' : 't' : 'o' : 'r' : []) = tok 23 (flip CTokClangC ClangBuiltinConvertVector)-idkwtok ('c' : 'a' : 's' : 'e' : []) = tok 4 CTokCase-idkwtok ('c' : 'h' : 'a' : 'r' : []) = tok 4 CTokChar-idkwtok ('_' : '_' : 'c' : 'o' : 'm' : 'p' : 'l' : 'e' : 'x' : '_' : '_' : []) = tok 11 CTokComplex-idkwtok ('_' : '_' : 'c' : 'o' : 'n' : 's' : 't' : []) = tok 7 CTokConst-idkwtok ('c' : 'o' : 'n' : 's' : 't' : []) = tok 5 CTokConst-idkwtok ('_' : '_' : 'c' : 'o' : 'n' : 's' : 't' : '_' : '_' : []) = tok 9 CTokConst-idkwtok ('c' : 'o' : 'n' : 't' : 'i' : 'n' : 'u' : 'e' : []) = tok 8 CTokContinue-idkwtok ('d' : 'e' : 'f' : 'a' : 'u' : 'l' : 't' : []) = tok 7 CTokDefault-idkwtok ('d' : 'o' : []) = tok 2 CTokDo-idkwtok ('d' : 'o' : 'u' : 'b' : 'l' : 'e' : []) = tok 6 CTokDouble-idkwtok ('e' : 'l' : 's' : 'e' : []) = tok 4 CTokElse-idkwtok ('e' : 'n' : 'u' : 'm' : []) = tok 4 CTokEnum-idkwtok ('_' : '_' : 'e' : 'x' : 't' : 'e' : 'n' : 's' : 'i' : 'o' : 'n' : '_' : '_' : []) = tok 13 (CTokGnuC GnuCExtTok)-idkwtok ('e' : 'x' : 't' : 'e' : 'r' : 'n' : []) = tok 6 CTokExtern-idkwtok ('f' : 'l' : 'o' : 'a' : 't' : []) = tok 5 CTokFloat-idkwtok ('_' : '_' : 'f' : 'l' : 'o' : 'a' : 't' : '1' : '2' : '8' : []) = tok 10 CTokFloat128-idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '1' : '2' : '8' : []) = tok 9 CTokFloat128-idkwtok ('f' : 'o' : 'r' : []) = tok 3 CTokFor-idkwtok ('g' : 'o' : 't' : 'o' : []) = tok 4 CTokGoto-idkwtok ('i' : 'f' : []) = tok 2 CTokIf-idkwtok ('_' : '_' : 'i' : 'm' : 'a' : 'g' : []) = tok 6 (CTokGnuC GnuCComplexImag)-idkwtok ('_' : '_' : 'i' : 'm' : 'a' : 'g' : '_' : '_' : []) = tok 8 (CTokGnuC GnuCComplexImag)-idkwtok ('_' : '_' : 'i' : 'n' : 'l' : 'i' : 'n' : 'e' : []) = tok 8 CTokInline-idkwtok ('i' : 'n' : 'l' : 'i' : 'n' : 'e' : []) = tok 6 CTokInline-idkwtok ('_' : '_' : 'i' : 'n' : 'l' : 'i' : 'n' : 'e' : '_' : '_' : []) = tok 10 CTokInline-idkwtok ('i' : 'n' : 't' : []) = tok 3 CTokInt-idkwtok ('_' : '_' : 'i' : 'n' : 't' : '1' : '2' : '8' : []) = tok 8 CTokInt128-idkwtok ('_' : '_' : 'l' : 'a' : 'b' : 'e' : 'l' : '_' : '_' : []) = tok 9 CTokLabel-idkwtok ('l' : 'o' : 'n' : 'g' : []) = tok 4 CTokLong-idkwtok ('_' : '_' : 'n' : 'o' : 'n' : 'n' : 'u' : 'l' : 'l' : []) = tok 9 CTokNonnull-idkwtok ('_' : '_' : 'n' : 'u' : 'l' : 'l' : 'a' : 'b' : 'l' : 'e' : []) = tok 10 CTokNullable-idkwtok ('_' : '_' : 'r' : 'e' : 'a' : 'l' : []) = tok 6 (CTokGnuC GnuCComplexReal)-idkwtok ('_' : '_' : 'r' : 'e' : 'a' : 'l' : '_' : '_' : []) = tok 8 (CTokGnuC GnuCComplexReal)-idkwtok ('r' : 'e' : 'g' : 'i' : 's' : 't' : 'e' : 'r' : []) = tok 8 CTokRegister-idkwtok ('_' : '_' : 'r' : 'e' : 's' : 't' : 'r' : 'i' : 'c' : 't' : []) = tok 10 CTokRestrict-idkwtok ('r' : 'e' : 's' : 't' : 'r' : 'i' : 'c' : 't' : []) = tok 8 CTokRestrict-idkwtok ('_' : '_' : 'r' : 'e' : 's' : 't' : 'r' : 'i' : 'c' : 't' : '_' : '_' : []) = tok 12 CTokRestrict-idkwtok ('r' : 'e' : 't' : 'u' : 'r' : 'n' : []) = tok 6 CTokReturn-idkwtok ('s' : 'h' : 'o' : 'r' : 't' : []) = tok 5 CTokShort-idkwtok ('_' : '_' : 's' : 'i' : 'g' : 'n' : 'e' : 'd' : []) = tok 8 CTokSigned-idkwtok ('s' : 'i' : 'g' : 'n' : 'e' : 'd' : []) = tok 6 CTokSigned-idkwtok ('_' : '_' : 's' : 'i' : 'g' : 'n' : 'e' : 'd' : '_' : '_' : []) = tok 10 CTokSigned-idkwtok ('s' : 'i' : 'z' : 'e' : 'o' : 'f' : []) = tok 6 CTokSizeof-idkwtok ('s' : 't' : 'a' : 't' : 'i' : 'c' : []) = tok 6 CTokStatic-idkwtok ('s' : 't' : 'r' : 'u' : 'c' : 't' : []) = tok 6 CTokStruct-idkwtok ('s' : 'w' : 'i' : 't' : 'c' : 'h' : []) = tok 6 CTokSwitch-idkwtok ('_' : '_' : 't' : 'h' : 'r' : 'e' : 'a' : 'd' : []) = tok 8 CTokThread-idkwtok ('t' : 'y' : 'p' : 'e' : 'd' : 'e' : 'f' : []) = tok 7 CTokTypedef-idkwtok ('_' : '_' : 't' : 'y' : 'p' : 'e' : 'o' : 'f' : []) = tok 8 CTokTypeof-idkwtok ('t' : 'y' : 'p' : 'e' : 'o' : 'f' : []) = tok 6 CTokTypeof-idkwtok ('_' : '_' : 't' : 'y' : 'p' : 'e' : 'o' : 'f' : '_' : '_' : []) = tok 10 CTokTypeof-idkwtok ('u' : 'n' : 'i' : 'o' : 'n' : []) = tok 5 CTokUnion-idkwtok ('u' : 'n' : 's' : 'i' : 'g' : 'n' : 'e' : 'd' : []) = tok 8 CTokUnsigned-idkwtok ('v' : 'o' : 'i' : 'd' : []) = tok 4 CTokVoid-idkwtok ('_' : '_' : 'v' : 'o' : 'l' : 'a' : 't' : 'i' : 'l' : 'e' : []) = tok 10 CTokVolatile-idkwtok ('v' : 'o' : 'l' : 'a' : 't' : 'i' : 'l' : 'e' : []) = tok 8 CTokVolatile-idkwtok ('_' : '_' : 'v' : 'o' : 'l' : 'a' : 't' : 'i' : 'l' : 'e' : '_' : '_' : []) = tok 12 CTokVolatile-idkwtok ('w' : 'h' : 'i' : 'l' : 'e' : []) = tok 5 CTokWhile--idkwtok cs = \pos -> do-  name <- getNewName-  let len = case length cs of l -> l-  let ident = mkIdent pos cs name-  tyident <- isTypeIdent ident-  if tyident-    then return (CTokTyIdent (pos,len) ident)-    else return (CTokIdent   (pos,len) ident)--ignoreAttribute :: P ()-ignoreAttribute = skipTokens (0::Int)-  where skipTokens :: Int -> P ()-        skipTokens n = do-          ntok <- lexToken' False-          case ntok of-            CTokRParen _ | n == 1    -> return ()-                         | otherwise -> skipTokens (n-1)-            CTokLParen _             -> skipTokens (n+1)-            _                        -> skipTokens n--tok :: Int -> (PosLength -> CToken) -> Position -> P CToken-tok len tc pos = return (tc (pos,len))--adjustLineDirective :: Int -> String -> Position -> Position-adjustLineDirective pragmaLen str pos =-    offs' `seq` fname' `seq` row' `seq` parent' `seq` (position offs' fname' row' 1 parent')-    where-    -- offset changes by length of #line pragma-    offs'           = (posOffset pos) + pragmaLen-    str'            = dropWhite . drop 1 $ str-    (rowStr, str'') = span isDigit str'-    -- row changes to the first number in the line pragma-    row'      = read rowStr-    str'''      = dropWhite str''-    (fnameStr,str'''') = span (/= '"') . drop 1 $ str'''-    fname = posFile pos-    no_fn = null str''' || (head str''' /= '"') || (head str'''' /= '"')-    -- filename changes to new filename, if specified-    fname' | no_fn = fname-           -- try and get more sharing of file name strings-           | fnameStr == fname     = fname-           | otherwise             = fnameStr-    -- analye flags-    min_flag = find_min_flag (5 :: Int) (drop 1 str'''')-    find_min_flag cur_min = select_min . span isDigit . dropWhile (not . isDigit)-      where-        select_min (numStr, fstr') | null numStr = cur_min-                                   | otherwise = find_min_flag (read numStr `min` cur_min) fstr'-    parent = posParent pos-    parent' = case min_flag of-                1 -> Just pos -- push-                2 -> case parent >>= posParent of-                         Nothing -> Nothing          -- pop/underflow-                         Just gp -> gp `seq` Just gp -- pop-                3 -> parent   -- unchanged stack, system header info-                4 -> parent   -- unchanged stack, extern C info-                _ -> Nothing-    ---    dropWhite = dropWhile (\c -> c == ' ' || c == '\t')---- special utility for the lexer-unescapeMultiChars :: String -> [Char]-unescapeMultiChars cs@(_ : _ : _) = case unescapeChar cs of (c,cs') -> c : unescapeMultiChars cs'-unescapeMultiChars ('\'' : []) = []-unescapeMultiChars _ = error "Unexpected end of multi-char constant"--{-# INLINE token_ #-}--- token that ignores the string-token_ :: Int -> (PosLength -> CToken) -> Position -> Int -> InputStream -> P CToken-token_ len mkTok pos _ _ = return (mkTok (pos,len))--{-# INLINE token_fail #-}--- error token-token_fail :: String -> Position ->-              Int -> InputStream -> P CToken-token_fail errmsg pos _ _ =   failP pos [ "Lexical Error !", errmsg ]---{-# INLINE token #-}--- token that uses the string-token :: (PosLength -> a -> CToken) -> (String -> a)-      -> Position -> Int -> InputStream -> P CToken-token mkTok fromStr pos len str = return (mkTok (pos,len) (fromStr $ takeChars len str))--{-# INLINE token_plus #-}--- token that may fail-token_plus :: (PosLength -> a -> CToken) -> (String -> Either String a)-      -> Position -> Int -> InputStream -> P CToken-token_plus mkTok fromStr pos len str =-  case fromStr (takeChars len str) of Left err -> failP pos [ "Lexical error ! ", err ]-                                      Right ok -> return $! mkTok (pos,len) ok---- -------------------------------------------------------------------------------- The input type--type AlexInput = (Position,   -- current position,-                  InputStream)     -- current input string--alexInputPrevChar :: AlexInput -> Char-alexInputPrevChar _ = error "alexInputPrevChar not used"---- for alex-3.0-alexGetByte :: AlexInput -> Maybe (Word8, AlexInput)-alexGetByte (p,is) | inputStreamEmpty is = Nothing-                   | otherwise  = let (b,s) = takeByte is in-                                  -- this is safe for latin-1, but ugly-                                  let p' = alexMove p (chr (fromIntegral b)) in p' `seq`-                                  Just (b, (p', s))--alexGetChar :: AlexInput -> Maybe (Char,AlexInput)-alexGetChar (p,is) | inputStreamEmpty is = Nothing-                   | otherwise  = let (c,s) = takeChar is in-                                  let p' = alexMove p c in p' `seq`-                                  Just (c, (p', s))--alexMove :: Position -> Char -> Position-alexMove pos ' '  = incPos pos 1-alexMove pos '\n' = retPos pos-alexMove pos '\r' = incOffset pos 1-alexMove pos _    = incPos pos 1--lexicalError :: P a-lexicalError = do-  pos <- getPos-  (c,_) <- liftM takeChar getInput-  failP pos-        ["Lexical error !",-         "The character " ++ show c ++ " does not fit here."]--parseError :: P a-parseError = do-  lastTok <- getLastToken-  failP (posOf lastTok)-        ["Syntax error !",-         "The symbol `" ++ show lastTok ++ "' does not fit here."]---- there is a problem with ignored tokens here (that aren't skipped)--- consider--- 1 > int x;--- 2 > LINE "ex.c" 4--- 4 > int y;--- when we get to LINE, we have [int (1,1),x (1,4)] in the token cache.--- Now we run--- > action  (pos 2,0) 14 "LINE \"ex.c\" 3\n"--- which in turn adjusts the position and then calls lexToken again--- we get `int (pos 4,0)', and have [x (1,4), int (4,1) ] in the token cache (fine)--- but then, we again call setLastToken when returning and get [int (4,1),int (4,1)] in the token cache (bad)--- to resolve this, recursive calls invoke lexToken' False.-lexToken :: P CToken-lexToken = lexToken' True--lexToken' :: Bool -> P CToken-lexToken' modifyCache = do-  pos <- getPos-  inp <- getInput-  case alexScan (pos, inp) 0 of-    AlexEOF -> do-        handleEofToken-        return CTokEof-    AlexError _inp -> lexicalError-    AlexSkip  (pos', inp') _len -> do-        setPos pos'-        setInput inp'-        lexToken' modifyCache-    AlexToken (pos', inp') len action -> do-        setPos pos'-        setInput inp'-        nextTok <- action pos len inp-        when modifyCache $ setLastToken nextTok-        return nextTok--lexC :: (CToken -> P a) -> P a-lexC cont = do-  nextTok <- lexToken-  cont nextTok-}+-----------------------------------------------------------------------------
+-- Module      :  Lexer.x
+-- Copyright   : (c) [1999..2004] Manuel M T Chakravarty
+--               (c) 2005 Duncan Coutts
+--               (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Portability :  portable
+--
+--  Lexer for C files, after being processed by the C preprocessor
+--
+--  We assume that the input already went through cpp.  Thus, we do not handle
+--  comments and preprocessor directives here.  It supports the
+--  C99 `restrict' extension: <http://www.lysator.liu.se/c/restrict.html> as
+--  well as inline functions.
+--
+--  Comments:
+--
+--  * Universal character names and multi-character character constants,
+--    as well as trigraphs are unsupported. They are lexed, but yield an error.
+--
+--  * We add `typedef-name' (K&R 8.9) as a token, as proposed in K&R A13.
+--    However, as these tokens cannot be recognized lexically, but require a
+--    context analysis, they are never produced by the lexer, but instead have
+--    to be introduced in a later phase (by converting the corresponding
+--    identifiers).
+--
+--  * We also recognize GNU C `__attribute__', `__extension__', `__complex__',
+--    `__const',  `__const__', `__imag', `__imag__', `__inline', `__inline__',
+--    `__real', `__real__, `__restrict', and `__restrict__'.
+--
+--  * Any line starting with `#pragma' is ignored.
+--
+--  With K&R we refer to ``The C Programming Language'', second edition, Brain
+--  W. Kernighan and Dennis M. Ritchie, Prentice Hall, 1988.
+--
+--  With C99 we refer to ``ISO/IEC 9899:TC3'',
+--  available online at http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf.
+--
+--- TODO ----------------------------------------------------------------------
+--
+--  * There are more GNU C specific keywords.  Add them and change `Parser.y'
+--    correspondingly (in particular, most tokens within __attribute ((...))
+--    expressions are actually keywords, but we handle them as identifiers at
+--    the moment).
+--
+--  * Add support for bytestrings
+
+{
+
+module Language.C.Parser.Lexer (lexC, parseError) where
+
+import Data.Char (chr, isDigit)
+import Data.Word (Word8)
+import Control.Monad (liftM, when)
+
+import Language.C.Data.InputStream
+  (InputStream, inputStreamEmpty, takeByte, takeChar, takeChars)
+
+-- (    InputStream, readInputStream,inputStreamToString,inputStreamFromString,
+--     takeByte, takeChar, inputStreamEmpty, takeChars,
+--     countLines,
+-- )
+import Language.C.Data.Position
+import Language.C.Data.Ident    (mkIdent)
+
+import Language.C.Syntax.Constants
+
+import Language.C.Parser.Tokens
+import Language.C.Parser.ParserMonad
+}
+
+$space = [ \ \t ]                           -- horizontal white space
+$eol   = \n                                 -- end of line
+
+$letter   = [a-zA-Z]
+$identletter = [a-zA-Z_\$]                  -- GNU extension: allow $ in variable names
+$octdigit = 0-7
+$digit    = 0-9
+$digitNZ  = 1-9
+$hexdigit = [0-9a-fA-F]
+
+$inchar   = . # [ \\ \' \n \r ]       -- valid character in char constant
+$instr    = . # [ \\ \" \n \r ]       -- valid character in a string literal
+$infname  = . # [ \\ \" ]             -- valid character in a filename
+
+@sp  = $space*
+
+-- character escape sequence (follows K&R A2.5.2)
+--
+-- * also used for strings
+-- * C99: 6.4.4.4
+@charesc  = \\([ntvbrfaeE\\\?\'\"]|$octdigit{1,3}|x$hexdigit+)
+@ucn      = \\u$hexdigit{4}|\\U$hexdigit{8}
+
+-- components of integer constants
+--
+-- * C99: 6.4.4.1
+@int = $digitNZ$digit*
+
+-- integer suffixes
+@llsuffix  = ll|LL
+@gnusuffix = [ij]?
+@intsuffix = [uU][lL]?|[uU]@llsuffix|[lL][uU]?|@llsuffix[uU]?
+@intgnusuffix = @intsuffix@gnusuffix?|@gnusuffix@intsuffix?
+
+-- components of float constants (follows K&R A2.5.3)
+--
+-- * C99: 6.4.4.2
+@digits    = $digit+
+@intpart   = @digits
+@fractpart = @digits
+
+@mantpart  = @intpart?\.@fractpart|@intpart\.
+@exppart   = [eE][\+\-]?@digits
+
+@hexprefix = 0x
+@hexdigits = $hexdigit+
+@hexmant   = @hexdigits?\.@hexdigits|@hexdigits\.
+@binexp    = [pP][\+\-]?@digits
+
+-- Suffixes `qQwW` are GNU floating type extensions: <https://gcc.gnu.org/onlinedocs/gcc/Floating-Types.html>
+@floatsuffix    = [fFlLqQwW]
+@floatgnusuffix = @floatsuffix@gnusuffix?|@gnusuffix@floatsuffix?
+
+-- clang version literals with a major.minor.rev
+@clangversion = @intpart\.@intpart\.@intpart
+
+tokens :-
+
+-- whitespace (follows K&R A2.1)
+--
+-- * horizontal and vertical tabs, newlines, and form feeds are filter out by
+--   `Lexers.ctrlLexer'
+--
+-- * comments are not handled, as we assume the input already went through cpp
+--
+$white+         ;
+
+-- #line directive (C11 6.10.4, GCC Line Control)
+--
+-- * standard form: int => change line number
+-- * standard form: int string => change source file and line number
+-- * preprocessor (gcc/clang): int string int => change source file and line number,
+--       push or pop item from stack
+--
+-- * see https://gcc.gnu.org/onlinedocs/cpp/Preprocessor-Output.html
+--
+\#$space*@int$space*(\"($infname|@charesc)*\"$space*)?(@int$space*)*\r?$eol
+  { \pos len str -> setPos (adjustLineDirective len (takeChars len str) pos) >> lexToken' False }
+
+-- #pragma directive (K&R A12.8)
+--
+-- * we simply ignore any #pragma (but take care to update the position
+--   information)
+--
+\#$space*pragma.*$eol   ;
+
+-- #ident directive, eg used by rcs/cvs
+--
+-- * we simply ignore any #ident (but take care to update the position
+--   information)
+--
+\#$space*ident.*$eol    ;
+
+-- identifiers and keywords (follows K&R A2.3 and A2.4)
+--
+$identletter($identletter|$digit)*  { \pos len str -> idkwtok (takeChars len str) pos }
+
+-- constants (follows K&R A2.5)
+--
+-- * K&R,C99 explicitly mention `enumeration-constants'; however, as they are
+--   lexically identifiers, we do not have an extra case for them
+--
+
+-- integer constants (follows K&R A2.5.1, C99 6.4.4.1)
+-- NOTE: 0 is lexed as octal integer constant, and readCOctal takes care of this
+0$octdigit*@intgnusuffix?       { token_plus CTokILit readCOctal }
+$digitNZ$digit*@intgnusuffix?   { token_plus CTokILit (readCInteger DecRepr) }
+0[xX]$hexdigit+@intgnusuffix?   { token_plus CTokILit (readCInteger HexRepr . drop 2) }
+
+(0$octdigit*|$digitNZ$digit*|0[xX]$hexdigit+)[uUlL]+ { token_fail "Invalid integer constant suffix" }
+
+-- character constants (follows K&R A2.5.2, C99 6.4.4.4)
+--
+-- * Universal Character Names are unsupported and cause an error.
+\'($inchar|@charesc)\'  { token CTokCLit (cChar . fst . unescapeChar . tail) }
+L\'($inchar|@charesc)\' { token CTokCLit (cChar_w . fst . unescapeChar . tail . tail) }
+\'($inchar|@charesc){2,}\' { token CTokCLit (flip cChars False . unescapeMultiChars .tail) }
+L\'($inchar|@charesc){2,}\' { token CTokCLit (flip cChars True . unescapeMultiChars . tail . tail) }
+
+-- Clang version literals
+@clangversion           { token (\pos -> CTokClangC pos . ClangCVersionTok) readClangCVersion }
+
+-- float constants (follows K&R A2.5.3. C99 6.4.4.2)
+--
+-- * NOTE: Hexadecimal floating constants without binary exponents are forbidden.
+--         They generate a lexer error, because they are hard to recognize in the parser.
+(@mantpart@exppart?|@intpart@exppart)@floatgnusuffix?  { token CTokFLit readCFloat }
+@hexprefix(@hexmant|@hexdigits)@binexp@floatgnusuffix? { token CTokFLit readCFloat }
+@hexprefix@hexmant                                     { token_fail "Hexadecimal floating constant requires an exponent" }
+
+-- string literal (follows K&R A2.6)
+-- C99: 6.4.5.
+\"($instr|@charesc)*\"      { token CTokSLit (cString . unescapeString . init . tail) }
+L\"($instr|@charesc)*\"     { token CTokSLit (cString_w . unescapeString . init . tail . tail) }
+
+L?\'@ucn\'                        { token_fail "Universal character names are unsupported" }
+L?\'\\[^0-7'\"\?\\abfnrtvuUx]\'     { token_fail "Invalid escape sequence" }
+L?\"($inchar|@charesc)*@ucn($inchar|@charesc|@ucn)*\" { token_fail "Universal character names in string literals are unsupported"}
+
+-- operators and separators
+--
+"("   { token_ 1 CTokLParen }
+")"   { token_ 1 CTokRParen  }
+"["   { token_ 1 CTokLBracket }
+"]"   { token_ 1 CTokRBracket }
+"->"  { token_ 2 CTokArrow }
+"."   { token_ 1 CTokDot }
+"!"   { token_ 1 CTokExclam }
+"~"   { token_ 1 CTokTilde }
+"++"  { token_ 2 CTokInc }
+"--"  { token_ 2 CTokDec }
+"+"   { token_ 1 CTokPlus }
+"-"   { token_ 1 CTokMinus }
+"*"   { token_ 1 CTokStar }
+"/"   { token_ 1 CTokSlash }
+"%"   { token_ 1 CTokPercent }
+"&"   { token_ 1 CTokAmper }
+"<<"  { token_ 2 CTokShiftL }
+">>"  { token_ 2 CTokShiftR }
+"<"   { token_ 1 CTokLess }
+"<="  { token_ 2 CTokLessEq }
+">"   { token_ 1 CTokHigh }
+">="  { token_ 2 CTokHighEq }
+"=="  { token_ 2 CTokEqual }
+"!="  { token_ 2 CTokUnequal }
+"^"   { token_ 1 CTokHat }
+"|"   { token_ 1 CTokBar }
+"&&"  { token_ 2 CTokAnd }
+"||"  { token_ 2 CTokOr }
+"?"   { token_ 1 CTokQuest }
+":"   { token_ 1 CTokColon }
+"="   { token_ 1 CTokAssign }
+"+="  { token_ 2 CTokPlusAss }
+"-="  { token_ 2 CTokMinusAss }
+"*="  { token_ 2 CTokStarAss }
+"/="  { token_ 2 CTokSlashAss }
+"%="  { token_ 2 CTokPercAss }
+"&="  { token_ 2 CTokAmpAss }
+"^="  { token_ 2 CTokHatAss }
+"|="  { token_ 2 CTokBarAss }
+"<<=" { token_ 3 CTokSLAss }
+">>=" { token_ 3 CTokSRAss }
+","   { token_ 1 CTokComma }
+\;    { token_ 1 CTokSemic }
+"{"   { token_ 1 CTokLBrace }
+"}"   { token_ 1 CTokRBrace }
+"..." { token_ 3 CTokEllipsis }
+
+
+{
+-- Fix the 'octal' lexing of '0'
+readCOctal :: String -> Either String CInteger
+readCOctal s@('0':r) =
+    case r of
+        (c:_) | isDigit c -> readCInteger OctalRepr r
+        _                 -> readCInteger DecRepr s
+readCOctal _ = error "ReadOctal: string does not start with `0'"
+
+-- We use the odd looking list of string patterns here rather than normal
+-- string literals since GHC converts the latter into a sequence of string
+-- comparisons (ie a linear search) but it translates the former using its
+-- effecient pattern matching which gives us the expected radix-style search.
+-- This change makes a significant performance difference [chak]
+--
+-- To make this a little more maintainable, we autogenerate it from this list,
+-- using the script GenerateKeywords.hs (in /scripts)
+{-
+alignas _Alignas, alignof _Alignof __alignof alignof __alignof__, asm @__, atomic _Atomic, auto
+break, bool _Bool,
+case, char, const @__, continue, complex _Complex __complex__
+default, do, double,
+else, enum, extern,
+float, for, goto,
+if, inline @__, int, __int128, long, noreturn _Noreturn,
+float, for,
+generic _Generic, goto,
+if, inline @__, int, int128 __int128, long,
+noreturn _Noreturn,  _Nullable __nullable, _Nonnull __nonnull,
+register, restrict @__, return
+short, signed @__, sizeof, static, staticAssert _Static_assert, struct, switch,
+typedef, typeof @__, thread __thread _Thread_local
+union, unsigned, void, volatile @__,
+while,
+label __label__
+(CTokGnuC GnuCAttrTok) __attribute __attribute__
+(CTokGnuC GnuCExtTok) __extension__
+(CTokGnuC GnuCComplexReal) __real __real__
+(CTokGnuC GnuCComplexImag) __imag __imag__
+(CTokGnuC GnuCVaArg) __builtin_va_arg
+(CTokGnuC GnuCOffsetof) __builtin_offsetof
+(CTokGnuC GnuCTyCompat) __builtin_types_compatible_p
+(CTokClangC ClangBuiltinConvertVector) __builtin_convertvector
+-}
+-- Tokens: _Alignas _Alignof __alignof alignof __alignof__ __asm asm __asm__ _Atomic auto break _Bool case char __const const __const__ continue _Complex __complex__ default do double else enum extern float __float128 _Float128 for _Generic goto if __inline inline __inline__ int __int128 long _Noreturn  _Nullable __nullable _Nonnull __nonnull register __restrict restrict __restrict__ return short __signed signed __signed__ sizeof static _Static_assert struct switch typedef __typeof typeof __typeof__ __thread _Thread_local union unsigned void __volatile volatile __volatile__ while __label__ __attribute __attribute__ __extension__ __real __real__ __imag __imag__ __builtin_va_arg __builtin_offsetof __builtin_types_compatible_p  __builtin_convertvector
+idkwtok ('_' : 'A' : 'l' : 'i' : 'g' : 'n' : 'a' : 's' : []) = tok 8 CTokAlignas
+idkwtok ('_' : 'A' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : []) = tok 8 CTokAlignof
+idkwtok ('_' : 'A' : 't' : 'o' : 'm' : 'i' : 'c' : []) = tok 7 CTokAtomic
+idkwtok ('_' : 'B' : 'o' : 'o' : 'l' : []) = tok 5 CTokBool
+idkwtok ('_' : 'C' : 'o' : 'm' : 'p' : 'l' : 'e' : 'x' : []) = tok 8 CTokComplex
+idkwtok ('_' : 'N' : 'o' : 'n' : 'n' : 'u' : 'l' : 'l' : []) = tok 8 CTokNonnull
+idkwtok ('_' : 'G' : 'e' : 'n' : 'e' : 'r' : 'i' : 'c' : []) = tok 8 CTokGeneric
+idkwtok ('_' : 'N' : 'o' : 'r' : 'e' : 't' : 'u' : 'r' : 'n' : []) = tok 9 CTokNoreturn
+idkwtok ('_' : 'N' : 'u' : 'l' : 'l' : 'a' : 'b' : 'l' : 'e' : []) = tok 9 CTokNullable
+idkwtok ('_' : 'S' : 't' : 'a' : 't' : 'i' : 'c' : '_' : 'a' : 's' : 's' : 'e' : 'r' : 't' : []) = tok 14 CTokStaticAssert
+idkwtok ('_' : 'T' : 'h' : 'r' : 'e' : 'a' : 'd' : '_' : 'l' : 'o' : 'c' : 'a' : 'l' : []) = tok 13 CTokThread
+idkwtok ('_' : '_' : 'a' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : []) = tok 9 CTokAlignof
+idkwtok ('a' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : []) = tok 7 CTokAlignof
+idkwtok ('_' : '_' : 'a' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : '_' : '_' : []) = tok 11 CTokAlignof
+idkwtok ('_' : '_' : 'a' : 's' : 'm' : []) = tok 5 CTokAsm
+idkwtok ('a' : 's' : 'm' : []) = tok 3 CTokAsm
+idkwtok ('_' : '_' : 'a' : 's' : 'm' : '_' : '_' : []) = tok 7 CTokAsm
+idkwtok ('_' : '_' : 'a' : 't' : 't' : 'r' : 'i' : 'b' : 'u' : 't' : 'e' : []) = tok 11 (CTokGnuC GnuCAttrTok)
+idkwtok ('_' : '_' : 'a' : 't' : 't' : 'r' : 'i' : 'b' : 'u' : 't' : 'e' : '_' : '_' : []) = tok 13 (CTokGnuC GnuCAttrTok)
+idkwtok ('a' : 'u' : 't' : 'o' : []) = tok 4 CTokAuto
+idkwtok ('b' : 'r' : 'e' : 'a' : 'k' : []) = tok 5 CTokBreak
+idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 'o' : 'f' : 'f' : 's' : 'e' : 't' : 'o' : 'f' : []) = tok 18 (CTokGnuC GnuCOffsetof)
+idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 't' : 'y' : 'p' : 'e' : 's' : '_' : 'c' : 'o' : 'm' : 'p' : 'a' : 't' : 'i' : 'b' : 'l' : 'e' : '_' : 'p' : []) = tok 28 (CTokGnuC GnuCTyCompat)
+idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 'v' : 'a' : '_' : 'a' : 'r' : 'g' : []) = tok 16 (CTokGnuC GnuCVaArg)
+idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 'c' : 'o' : 'n' : 'v' : 'e' : 'r' : 't' : 'v' : 'e' : 'c' : 't' : 'o' : 'r' : []) = tok 23 (flip CTokClangC ClangBuiltinConvertVector)
+idkwtok ('c' : 'a' : 's' : 'e' : []) = tok 4 CTokCase
+idkwtok ('c' : 'h' : 'a' : 'r' : []) = tok 4 CTokChar
+idkwtok ('_' : '_' : 'c' : 'o' : 'm' : 'p' : 'l' : 'e' : 'x' : '_' : '_' : []) = tok 11 CTokComplex
+idkwtok ('_' : '_' : 'c' : 'o' : 'n' : 's' : 't' : []) = tok 7 CTokConst
+idkwtok ('c' : 'o' : 'n' : 's' : 't' : []) = tok 5 CTokConst
+idkwtok ('_' : '_' : 'c' : 'o' : 'n' : 's' : 't' : '_' : '_' : []) = tok 9 CTokConst
+idkwtok ('c' : 'o' : 'n' : 't' : 'i' : 'n' : 'u' : 'e' : []) = tok 8 CTokContinue
+idkwtok ('d' : 'e' : 'f' : 'a' : 'u' : 'l' : 't' : []) = tok 7 CTokDefault
+idkwtok ('d' : 'o' : []) = tok 2 CTokDo
+idkwtok ('d' : 'o' : 'u' : 'b' : 'l' : 'e' : []) = tok 6 CTokDouble
+idkwtok ('e' : 'l' : 's' : 'e' : []) = tok 4 CTokElse
+idkwtok ('e' : 'n' : 'u' : 'm' : []) = tok 4 CTokEnum
+idkwtok ('_' : '_' : 'e' : 'x' : 't' : 'e' : 'n' : 's' : 'i' : 'o' : 'n' : '_' : '_' : []) = tok 13 (CTokGnuC GnuCExtTok)
+idkwtok ('e' : 'x' : 't' : 'e' : 'r' : 'n' : []) = tok 6 CTokExtern
+idkwtok ('f' : 'l' : 'o' : 'a' : 't' : []) = tok 5 CTokFloat
+idkwtok ('_' : '_' : 'f' : 'l' : 'o' : 'a' : 't' : '1' : '2' : '8' : []) = tok 10 CTokFloat128
+idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '1' : '2' : '8' : []) = tok 9 CTokFloat128
+idkwtok ('f' : 'o' : 'r' : []) = tok 3 CTokFor
+idkwtok ('g' : 'o' : 't' : 'o' : []) = tok 4 CTokGoto
+idkwtok ('i' : 'f' : []) = tok 2 CTokIf
+idkwtok ('_' : '_' : 'i' : 'm' : 'a' : 'g' : []) = tok 6 (CTokGnuC GnuCComplexImag)
+idkwtok ('_' : '_' : 'i' : 'm' : 'a' : 'g' : '_' : '_' : []) = tok 8 (CTokGnuC GnuCComplexImag)
+idkwtok ('_' : '_' : 'i' : 'n' : 'l' : 'i' : 'n' : 'e' : []) = tok 8 CTokInline
+idkwtok ('i' : 'n' : 'l' : 'i' : 'n' : 'e' : []) = tok 6 CTokInline
+idkwtok ('_' : '_' : 'i' : 'n' : 'l' : 'i' : 'n' : 'e' : '_' : '_' : []) = tok 10 CTokInline
+idkwtok ('i' : 'n' : 't' : []) = tok 3 CTokInt
+idkwtok ('_' : '_' : 'i' : 'n' : 't' : '1' : '2' : '8' : []) = tok 8 CTokInt128
+idkwtok ('_' : '_' : 'l' : 'a' : 'b' : 'e' : 'l' : '_' : '_' : []) = tok 9 CTokLabel
+idkwtok ('l' : 'o' : 'n' : 'g' : []) = tok 4 CTokLong
+idkwtok ('_' : '_' : 'n' : 'o' : 'n' : 'n' : 'u' : 'l' : 'l' : []) = tok 9 CTokNonnull
+idkwtok ('_' : '_' : 'n' : 'u' : 'l' : 'l' : 'a' : 'b' : 'l' : 'e' : []) = tok 10 CTokNullable
+idkwtok ('_' : '_' : 'r' : 'e' : 'a' : 'l' : []) = tok 6 (CTokGnuC GnuCComplexReal)
+idkwtok ('_' : '_' : 'r' : 'e' : 'a' : 'l' : '_' : '_' : []) = tok 8 (CTokGnuC GnuCComplexReal)
+idkwtok ('r' : 'e' : 'g' : 'i' : 's' : 't' : 'e' : 'r' : []) = tok 8 CTokRegister
+idkwtok ('_' : '_' : 'r' : 'e' : 's' : 't' : 'r' : 'i' : 'c' : 't' : []) = tok 10 CTokRestrict
+idkwtok ('r' : 'e' : 's' : 't' : 'r' : 'i' : 'c' : 't' : []) = tok 8 CTokRestrict
+idkwtok ('_' : '_' : 'r' : 'e' : 's' : 't' : 'r' : 'i' : 'c' : 't' : '_' : '_' : []) = tok 12 CTokRestrict
+idkwtok ('r' : 'e' : 't' : 'u' : 'r' : 'n' : []) = tok 6 CTokReturn
+idkwtok ('s' : 'h' : 'o' : 'r' : 't' : []) = tok 5 CTokShort
+idkwtok ('_' : '_' : 's' : 'i' : 'g' : 'n' : 'e' : 'd' : []) = tok 8 CTokSigned
+idkwtok ('s' : 'i' : 'g' : 'n' : 'e' : 'd' : []) = tok 6 CTokSigned
+idkwtok ('_' : '_' : 's' : 'i' : 'g' : 'n' : 'e' : 'd' : '_' : '_' : []) = tok 10 CTokSigned
+idkwtok ('s' : 'i' : 'z' : 'e' : 'o' : 'f' : []) = tok 6 CTokSizeof
+idkwtok ('s' : 't' : 'a' : 't' : 'i' : 'c' : []) = tok 6 CTokStatic
+idkwtok ('s' : 't' : 'r' : 'u' : 'c' : 't' : []) = tok 6 CTokStruct
+idkwtok ('s' : 'w' : 'i' : 't' : 'c' : 'h' : []) = tok 6 CTokSwitch
+idkwtok ('_' : '_' : 't' : 'h' : 'r' : 'e' : 'a' : 'd' : []) = tok 8 CTokThread
+idkwtok ('t' : 'y' : 'p' : 'e' : 'd' : 'e' : 'f' : []) = tok 7 CTokTypedef
+idkwtok ('_' : '_' : 't' : 'y' : 'p' : 'e' : 'o' : 'f' : []) = tok 8 CTokTypeof
+idkwtok ('t' : 'y' : 'p' : 'e' : 'o' : 'f' : []) = tok 6 CTokTypeof
+idkwtok ('_' : '_' : 't' : 'y' : 'p' : 'e' : 'o' : 'f' : '_' : '_' : []) = tok 10 CTokTypeof
+idkwtok ('u' : 'n' : 'i' : 'o' : 'n' : []) = tok 5 CTokUnion
+idkwtok ('u' : 'n' : 's' : 'i' : 'g' : 'n' : 'e' : 'd' : []) = tok 8 CTokUnsigned
+idkwtok ('v' : 'o' : 'i' : 'd' : []) = tok 4 CTokVoid
+idkwtok ('_' : '_' : 'v' : 'o' : 'l' : 'a' : 't' : 'i' : 'l' : 'e' : []) = tok 10 CTokVolatile
+idkwtok ('v' : 'o' : 'l' : 'a' : 't' : 'i' : 'l' : 'e' : []) = tok 8 CTokVolatile
+idkwtok ('_' : '_' : 'v' : 'o' : 'l' : 'a' : 't' : 'i' : 'l' : 'e' : '_' : '_' : []) = tok 12 CTokVolatile
+idkwtok ('w' : 'h' : 'i' : 'l' : 'e' : []) = tok 5 CTokWhile
+
+idkwtok cs = \pos -> do
+  name <- getNewName
+  let len = case length cs of l -> l
+  let ident = mkIdent pos cs name
+  tyident <- isTypeIdent ident
+  if tyident
+    then return (CTokTyIdent (pos,len) ident)
+    else return (CTokIdent   (pos,len) ident)
+
+ignoreAttribute :: P ()
+ignoreAttribute = skipTokens (0::Int)
+  where skipTokens :: Int -> P ()
+        skipTokens n = do
+          ntok <- lexToken' False
+          case ntok of
+            CTokRParen _ | n == 1    -> return ()
+                         | otherwise -> skipTokens (n-1)
+            CTokLParen _             -> skipTokens (n+1)
+            _                        -> skipTokens n
+
+tok :: Int -> (PosLength -> CToken) -> Position -> P CToken
+tok len tc pos = return (tc (pos,len))
+
+adjustLineDirective :: Int -> String -> Position -> Position
+adjustLineDirective pragmaLen str pos =
+    offs' `seq` fname' `seq` row' `seq` parent' `seq` (position offs' fname' row' 1 parent')
+    where
+    -- offset changes by length of #line pragma
+    offs'           = (posOffset pos) + pragmaLen
+    str'            = dropWhite . drop 1 $ str
+    (rowStr, str'') = span isDigit str'
+    -- row changes to the first number in the line pragma
+    row'      = read rowStr
+    str'''      = dropWhite str''
+    (fnameStr,str'''') = span (/= '"') . drop 1 $ str'''
+    fname = posFile pos
+    no_fn = null str''' || (head str''' /= '"') || (head str'''' /= '"')
+    -- filename changes to new filename, if specified
+    fname' | no_fn = fname
+           -- try and get more sharing of file name strings
+           | fnameStr == fname     = fname
+           | otherwise             = fnameStr
+    -- analye flags
+    min_flag = find_min_flag (5 :: Int) (drop 1 str'''')
+    find_min_flag cur_min = select_min . span isDigit . dropWhile (not . isDigit)
+      where
+        select_min (numStr, fstr') | null numStr = cur_min
+                                   | otherwise = find_min_flag (read numStr `min` cur_min) fstr'
+    parent = posParent pos
+    parent' = case min_flag of
+                1 -> Just pos -- push
+                2 -> case parent >>= posParent of
+                         Nothing -> Nothing          -- pop/underflow
+                         Just gp -> gp `seq` Just gp -- pop
+                3 -> parent   -- unchanged stack, system header info
+                4 -> parent   -- unchanged stack, extern C info
+                _ -> Nothing
+    --
+    dropWhite = dropWhile (\c -> c == ' ' || c == '\t')
+
+-- special utility for the lexer
+unescapeMultiChars :: String -> [Char]
+unescapeMultiChars cs@(_ : _ : _) = case unescapeChar cs of (c,cs') -> c : unescapeMultiChars cs'
+unescapeMultiChars ('\'' : []) = []
+unescapeMultiChars _ = error "Unexpected end of multi-char constant"
+
+{-# INLINE token_ #-}
+-- token that ignores the string
+token_ :: Int -> (PosLength -> CToken) -> Position -> Int -> InputStream -> P CToken
+token_ len mkTok pos _ _ = return (mkTok (pos,len))
+
+{-# INLINE token_fail #-}
+-- error token
+token_fail :: String -> Position ->
+              Int -> InputStream -> P CToken
+token_fail errmsg pos _ _ =   failP pos [ "Lexical Error !", errmsg ]
+
+
+{-# INLINE token #-}
+-- token that uses the string
+token :: (PosLength -> a -> CToken) -> (String -> a)
+      -> Position -> Int -> InputStream -> P CToken
+token mkTok fromStr pos len str = return (mkTok (pos,len) (fromStr $ takeChars len str))
+
+{-# INLINE token_plus #-}
+-- token that may fail
+token_plus :: (PosLength -> a -> CToken) -> (String -> Either String a)
+      -> Position -> Int -> InputStream -> P CToken
+token_plus mkTok fromStr pos len str =
+  case fromStr (takeChars len str) of Left err -> failP pos [ "Lexical error ! ", err ]
+                                      Right ok -> return $! mkTok (pos,len) ok
+
+-- -----------------------------------------------------------------------------
+-- The input type
+
+type AlexInput = (Position,   -- current position,
+                  InputStream)     -- current input string
+
+alexInputPrevChar :: AlexInput -> Char
+alexInputPrevChar _ = error "alexInputPrevChar not used"
+
+-- for alex-3.0
+alexGetByte :: AlexInput -> Maybe (Word8, AlexInput)
+alexGetByte (p,is) | inputStreamEmpty is = Nothing
+                   | otherwise  = let (b,s) = takeByte is in
+                                  -- this is safe for latin-1, but ugly
+                                  let p' = alexMove p (chr (fromIntegral b)) in p' `seq`
+                                  Just (b, (p', s))
+
+alexGetChar :: AlexInput -> Maybe (Char,AlexInput)
+alexGetChar (p,is) | inputStreamEmpty is = Nothing
+                   | otherwise  = let (c,s) = takeChar is in
+                                  let p' = alexMove p c in p' `seq`
+                                  Just (c, (p', s))
+
+alexMove :: Position -> Char -> Position
+alexMove pos ' '  = incPos pos 1
+alexMove pos '\n' = retPos pos
+alexMove pos '\r' = incOffset pos 1
+alexMove pos _    = incPos pos 1
+
+lexicalError :: P a
+lexicalError = do
+  pos <- getPos
+  (c,_) <- liftM takeChar getInput
+  failP pos
+        ["Lexical error !",
+         "The character " ++ show c ++ " does not fit here."]
+
+parseError :: P a
+parseError = do
+  lastTok <- getLastToken
+  failP (posOf lastTok)
+        ["Syntax error !",
+         "The symbol `" ++ show lastTok ++ "' does not fit here."]
+
+-- there is a problem with ignored tokens here (that aren't skipped)
+-- consider
+-- 1 > int x;
+-- 2 > LINE "ex.c" 4
+-- 4 > int y;
+-- when we get to LINE, we have [int (1,1),x (1,4)] in the token cache.
+-- Now we run
+-- > action  (pos 2,0) 14 "LINE \"ex.c\" 3\n"
+-- which in turn adjusts the position and then calls lexToken again
+-- we get `int (pos 4,0)', and have [x (1,4), int (4,1) ] in the token cache (fine)
+-- but then, we again call setLastToken when returning and get [int (4,1),int (4,1)] in the token cache (bad)
+-- to resolve this, recursive calls invoke lexToken' False.
+lexToken :: P CToken
+lexToken = lexToken' True
+
+lexToken' :: Bool -> P CToken
+lexToken' modifyCache = do
+  pos <- getPos
+  inp <- getInput
+  case alexScan (pos, inp) 0 of
+    AlexEOF -> do
+        handleEofToken
+        return CTokEof
+    AlexError _inp -> lexicalError
+    AlexSkip  (pos', inp') _len -> do
+        setPos pos'
+        setInput inp'
+        lexToken' modifyCache
+    AlexToken (pos', inp') len action -> do
+        setPos pos'
+        setInput inp'
+        nextTok <- action pos len inp
+        when modifyCache $ setLastToken nextTok
+        return nextTok
+
+lexC :: (CToken -> P a) -> P a
+lexC cont = do
+  nextTok <- lexToken
+  cont nextTok
+}
src/Language/C/Parser/Parser.y view
@@ -1,2345 +1,2345 @@--------------------------------------------------------------------------------- Module      :  Parser.y--- Copyright   :  (c) 2005-2007 Duncan Coutts---                (c) 2008 Benedikt Huber---                (c) [1999..2004] Manuel M T Chakravarty---                Portions copyright 1989, 1990 James A. Roskind--- License     :  BSD-style--- Maintainer  :  benedikt.huber@gmail.com--- Portability :  portable------  Parser for C translation units, which have already been run through the C---  preprocessor. It is recommended to use the `strict' flag for happy.------  The parser recognizes all of ISO C 99 and most GNU C extensions.------  With C99 we refer to the ISO C99 standard, specifically the section numbers---  used below refer to this report:------    <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf>------ GNU extensions are documented in the gcc parser------    <http://gcc.gnu.org/viewcvs/trunk/gcc/c-parser.c>------ and in: <http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html>------ The set of supported extensions is documented in------    <http://www.sivity.net/projects/language.c/wiki/Cee>--------------------------------------------------------------------{-module Language.C.Parser.Parser (-  -- * Parse a C translation unit-  parseC,-  -- * Exposed Parsers-  translUnitP, extDeclP, statementP, expressionP-) where---- Relevant C99 sections:------ 6.5 Expressions .1 - .17 and 6.6 (almost literally)---  Supported GNU extensions:---     - Allow a compound statement as an expression---     - Various __builtin_* forms that take type parameters---     - `alignof' expression or type---     - `__extension__' to suppress warnings about extensions---     - Allow taking address of a label with: && label---     - Omitting the `then' part of conditional expressions---     - complex numbers------ 6.7 C Declarations .1 -.8---  Supported GNU extensions:---     - '__thread' thread local storage (6.7.1)------ 6.8 Statements .1 - .8---  Supported GNU extensions:---    - case ranges (C99 6.8.1)---    - '__label__ ident;' declarations (C99 6.8.2)---    - computed gotos (C99 6.8.6)------ 6.9 Translation unit---  Supported GNU extensions:---     - allow empty translation_unit---     - allow redundant ';'---     - allow extension keyword before external declaration---     - asm definitions------  Since some of the grammar productions are quite difficult to read,---  (especially those involved with the decleration syntax) we document them---  with an extended syntax that allows a more consise representation:------  Ordinary rules------   foo      named terminal or non-terminal------   'c'      terminal, literal character token------   A B      concatenation------   A | B    alternation------   (A)      grouping------  Extended rules------   A?       optional, short hand for (A|) or [A]{ 0==A || 1==A }------   ...      stands for some part of the grammar omitted for clarity------   {A}      represents sequences, 0 or more.------   <permute> modifier which states that any permutation of the immediate subterms is valid---------- TODO ----------------------------------------------------------------------------  !* We ignore C11 _Atomic type annotations---  !* We ignore the C99 static keyword (see C99 6.7.5.3)---  !* We do not distinguish in the AST between incomplete array types and---      complete variable length arrays ([ '*' ] means the latter). (see C99 6.7.5.2)---  !* The AST doesn't allow recording __attribute__ of unnamed struct field---     (see , struct_default_declaring_list, struct_identifier_declarator)---  !* see `We're being far to liberal here' (... struct definition within structs)---  * Documentation isn't complete and consistent yet.--import Prelude    hiding (reverse)-import qualified Data.List as List-import Control.Monad (mplus)-import Language.C.Parser.Builtin   (builtinTypeNames)-import Language.C.Parser.Lexer     (lexC, parseError)-import Language.C.Parser.Tokens    (CToken(..), GnuCTok(..), ClangCTok (..), posLenOfTok)-import Language.C.Parser.ParserMonad (P, failP, execParser, getNewName, addTypedef, shadowTypedef, getCurrentPosition,-                                      enterScope, leaveScope, getLastToken, getSavedToken, ParseError(..))--import Language.C.Data.RList-import Language.C.Data.InputStream-import Language.C.Data.Ident-import Language.C.Data.Name-import Language.C.Data.Node-import Language.C.Data.Position-import Language.C.Syntax--}--- in order to document the parsers, we have to alias them-%name translation_unit translation_unit-%name external_declaration external_declaration-%name statement statement-%name expression expression--%tokentype { CToken }--%monad { P } { >>= } { return }-%lexer { lexC } { CTokEof }--%expect 1--%token--'('		{ CTokLParen	_ }-')'		{ CTokRParen	_ }-'['		{ CTokLBracket	_ }-']'		{ CTokRBracket	_ }-"->"		{ CTokArrow	_ }-'.'		{ CTokDot	_ }-'!'		{ CTokExclam	_ }-'~'		{ CTokTilde	_ }-"++"		{ CTokInc	_ }-"--"		{ CTokDec	_ }-'+'		{ CTokPlus	_ }-'-'		{ CTokMinus	_ }-'*'		{ CTokStar	_ }-'/'		{ CTokSlash	_ }-'%'		{ CTokPercent	_ }-'&'		{ CTokAmper	_ }-"<<"		{ CTokShiftL	_ }-">>"		{ CTokShiftR	_ }-'<'		{ CTokLess	_ }-"<="		{ CTokLessEq	_ }-'>'		{ CTokHigh	_ }-">="		{ CTokHighEq	_ }-"=="		{ CTokEqual	_ }-"!="		{ CTokUnequal	_ }-'^'		{ CTokHat	_ }-'|'		{ CTokBar	_ }-"&&"		{ CTokAnd	_ }-"||"		{ CTokOr	_ }-'?'		{ CTokQuest	_ }-':'		{ CTokColon	_ }-'='		{ CTokAssign	_ }-"+="		{ CTokPlusAss	_ }-"-="		{ CTokMinusAss	_ }-"*="		{ CTokStarAss	_ }-"/="		{ CTokSlashAss	_ }-"%="		{ CTokPercAss	_ }-"&="		{ CTokAmpAss	_ }-"^="		{ CTokHatAss	_ }-"|="		{ CTokBarAss	_ }-"<<="		{ CTokSLAss	_ }-">>="		{ CTokSRAss	_ }-','		{ CTokComma	_ }-';'		{ CTokSemic	_ }-'{'		{ CTokLBrace	_ }-'}'		{ CTokRBrace	_ }-"..."		{ CTokEllipsis	_ }-alignof		{ CTokAlignof	_ }-alignas         { CTokAlignas   _ }-"_Atomic"       { CTokAtomic    _ }-asm		{ CTokAsm	_ }-auto		{ CTokAuto	_ }-break		{ CTokBreak	_ }-"_Bool"		{ CTokBool	_ }-case		{ CTokCase	_ }-char		{ CTokChar	_ }-const		{ CTokConst	_ }-continue	{ CTokContinue	_ }-"_Complex"	{ CTokComplex	_ }-default		{ CTokDefault	_ }-do		{ CTokDo	_ }-double		{ CTokDouble	_ }-else		{ CTokElse	_ }-enum		{ CTokEnum	_ }-extern		{ CTokExtern	_ }-float		{ CTokFloat	_ }-"__float128"	{ CTokFloat128	_ }-"_Float128"	{ CTokFloat128	_ }-for		{ CTokFor	_ }-"_Generic"      { CTokGeneric   _ }-goto		{ CTokGoto	_ }-if		{ CTokIf	_ }-inline		{ CTokInline	_ }-int		{ CTokInt	_ }-"__int128"      { CTokInt128    _ }-long		{ CTokLong	_ }-"__label__"	{ CTokLabel	_ }-"_Noreturn"     { CTokNoreturn  _ }-"_Nullable"     { CTokNullable  _ }-"_Nonnull"      { CTokNonnull   _ }-register	{ CTokRegister	_ }-restrict	{ CTokRestrict	_ }-return		{ CTokReturn	_ }-short		{ CTokShort	_ }-signed		{ CTokSigned	_ }-sizeof		{ CTokSizeof	_ }-static		{ CTokStatic	_ }-"_Static_assert"{ CTokStaticAssert _ }-struct		{ CTokStruct	_ }-switch		{ CTokSwitch	_ }-typedef		{ CTokTypedef	_ }-typeof		{ CTokTypeof	_ }-"__thread"	{ CTokThread	_ }-union		{ CTokUnion	_ }-unsigned	{ CTokUnsigned	_ }-void		{ CTokVoid	_ }-volatile	{ CTokVolatile	_ }-while		{ CTokWhile	_ }-cchar		{ CTokCLit   _ _ }		-- character constant-cint		{ CTokILit   _ _ }		-- integer constant-cfloat		{ CTokFLit   _ _ }		-- float constant-cstr		{ CTokSLit   _ _ }		-- string constant (no escapes)-ident		{ CTokIdent  _ $$ }		-- identifier-tyident		{ CTokTyIdent _ $$ }		-- `typedef-name' identifier-"__attribute__"	{ CTokGnuC GnuCAttrTok _ }	-- special GNU C tokens-"__extension__"	{ CTokGnuC GnuCExtTok  _ }	-- special GNU C tokens-"__real__"        { CTokGnuC GnuCComplexReal _ }-"__imag__"        { CTokGnuC GnuCComplexImag _ }--- special GNU C builtin 'functions' that actually take types as parameters:-"__builtin_va_arg"		{ CTokGnuC GnuCVaArg    _ }-"__builtin_offsetof"		{ CTokGnuC GnuCOffsetof _ }-"__builtin_types_compatible_p"	{ CTokGnuC GnuCTyCompat _ }-"__builtin_convertvector"	{ CTokClangC _ ClangBuiltinConvertVector }-clangcversion   { CTokClangC _ (ClangCVersionTok $$) } -- Clang version literal--%%----- parse a complete C translation unit--- we have to take special care of empty translation units-translation_unit :: { CTranslUnit }-translation_unit-  : ext_decl_list	{% let decls = reverse $1 in-                       case decls of-                           []     -> do{ n <- getNewName; p <- getCurrentPosition; return $ CTranslUnit decls (mkNodeInfo' p (p,0) n) }-                           (d:ds) -> withNodeInfo d $ CTranslUnit decls }----- parse a list of external declarations, making up a C translation unit (C99 6.9)------ * GNU extensions:---     allow empty translation_unit---     allow redundant ';'-ext_decl_list :: { Reversed [CExtDecl] }-ext_decl_list-  : {- empty -}					        { empty }-  | ext_decl_list ';'			        { $1 }-  | ext_decl_list external_declaration	{ $1 `snoc` $2 }----- parse external C declaration (C99 6.9)------ * GNU extensions:---     allow extension keyword before external declaration (TODO: discarded)---     asm definitions-external_declaration :: { CExtDecl }-external_declaration-  : function_definition		                  { CFDefExt $1 }-  | declaration			                  { CDeclExt $1 }-  | "__extension__" external_declaration          { $2 }-  | asm '(' string_literal ')' ';'		  {% withNodeInfo $1 $ CAsmExt $3 }----- parse C function definition (C99 6.9.1)------ function_definition :- specifiers? fun-declarator compound-statement---                        specifiers? old-fun-declarator  declaration-list compound-statement------ The specifiers are a list consisting of type-names (int, struct foo, ...),--- storage-class specifiers (extern, static,...) and type qualifiers (const, volatile, ...).------   declaration_specifier      :- <permute> type-qualifier* storage-class+ typename+    "extern unsigned static volatile int f()"---   type_specifier             :- <permute> type-qualifier* typename+                   "const int f()", "long int f()"---   declaration_qualifier_list :- <permute> type_qualifier* storage-class+              "extern static const f()"---   type_qualifier_list        :- type-qualifier+                                       "const f()"------ * GNU extension:---    __attribute__ annotations----function_definition :: { CFunDef }-function_definition-  :                            function_declarator compound_statement-	  {% leaveScope >> (withNodeInfo $1 $ CFunDef [] $1 [] $2) }--  | attrs                      function_declarator compound_statement-	  {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftCAttrs $1) $2 [] $3) }--  | declaration_specifier      function_declarator compound_statement-	  {% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) }--  | type_specifier             function_declarator compound_statement-	  {% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) }--  | declaration_qualifier_list function_declarator compound_statement-	  {% leaveScope >> (withNodeInfo $1 $ CFunDef (reverse $1) $2 [] $3) }--  | type_qualifier_list        function_declarator compound_statement-	  {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1) $2 [] $3) }--  | type_qualifier_list  attrs function_declarator compound_statement-	  {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1 ++ liftCAttrs $2) $3 [] $4) }--  -- old function declarators--  |                            function_declarator_old declaration_list compound_statement-  	{% withNodeInfo $1 $ CFunDef [] $1 (reverse $2) $3 }--  |                      attrs function_declarator_old declaration_list compound_statement-  	{% withNodeInfo $2 $ CFunDef (liftCAttrs $1) $2 (reverse $3) $4 }--  | declaration_specifier      function_declarator_old declaration_list compound_statement-  	{% withNodeInfo $1 $ CFunDef $1 $2 (reverse $3) $4 }--  | type_specifier             function_declarator_old declaration_list compound_statement-  	{% withNodeInfo $1 $ CFunDef $1 $2 (reverse $3) $4 }--  | declaration_qualifier_list function_declarator_old declaration_list compound_statement-  	{% withNodeInfo $1 $ CFunDef (reverse $1) $2 (reverse $3) $4 }--  | type_qualifier_list   function_declarator_old declaration_list compound_statement-  	{% withNodeInfo $1 $ CFunDef (liftTypeQuals $1) $2 (reverse $3) $4 }--  | type_qualifier_list attrs  function_declarator_old declaration_list compound_statement-  	{% withNodeInfo $1 $ CFunDef (liftTypeQuals $1  ++ liftCAttrs $2) $3 (reverse $4) $5 }---- Read declarator and put function-function_declarator :: { CDeclr }-function_declarator-  : identifier_declarator-  	{% let declr = reverseDeclr $1 in-  	   enterScope >> doFuncParamDeclIdent declr >> return declr }----- parse C statement (C99 6.8)------ * GNU extension: ' __asm__ (...); ' statements----statement :: { CStat }-statement-  : labeled_statement			{ $1 }-  | compound_statement		{ $1 }-  | expression_statement	{ $1 }-  | selection_statement		{ $1 }-  | iteration_statement		{ $1 }-  | jump_statement			  { $1 }-  | asm_statement			    {% withNodeInfo $1 (CAsm $1) }----- parse C labeled statement (C99 6.8.1)------ * GNU extension: case ranges----labeled_statement :: { CStat }-labeled_statement-  : identifier ':' attrs_opt statement		{% withNodeInfo $1 $ CLabel $1 $4 $3 }-  | case constant_expression ':' statement	{% withNodeInfo $1 $ CCase $2 $4 }-  | default ':' statement			{% withNodeInfo $1 $ CDefault $3 }-  | case constant_expression "..." constant_expression ':' statement-  	{% withNodeInfo $1 $ CCases $2 $4 $6 }----- parse C compound statement (C99 6.8.2)------ * GNU extension: '__label__ ident;' declarations----compound_statement :: { CStat }-compound_statement-  : '{' enter_scope block_item_list leave_scope '}'-  	{% withNodeInfo $1 $ CCompound [] (reverse $3) }--  | '{' enter_scope label_declarations block_item_list leave_scope '}'-  	{% withNodeInfo $1 $ CCompound (reverse $3) (reverse $4) }----- No syntax for these, just side effecting semantic actions.----enter_scope :: { () }-enter_scope : {% enterScope }-leave_scope :: { () }-leave_scope : {% leaveScope }---block_item_list :: { Reversed [CBlockItem] }-block_item_list-  : {- empty -}			{ empty }-  | block_item_list block_item	{ $1 `snoc` $2 }--block_item :: { CBlockItem }-block_item-  : statement			{ CBlockStmt $1 }-  | nested_declaration		{ $1 }--nested_declaration :: { CBlockItem }-nested_declaration-  : declaration				{ CBlockDecl $1 }-  | nested_function_definition		{ CNestedFunDef $1 }-  | "__extension__" nested_declaration	{ $2 }--nested_function_definition :: { CFunDef }-nested_function_definition-  : declaration_specifier      function_declarator compound_statement-	{% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) }--  | type_specifier             function_declarator compound_statement-	{% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) }--  | declaration_qualifier_list function_declarator compound_statement-	{% leaveScope >> (withNodeInfo $1 $ CFunDef (reverse $1) $2 [] $3) }--  | type_qualifier_list   function_declarator compound_statement-	{% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1) $2 [] $3) }--  | type_qualifier_list   attrs function_declarator compound_statement-	{% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1 ++ liftCAttrs $2) $3 [] $4) }---label_declarations :: { Reversed [Ident] }-label_declarations-  : "__label__" identifier_list ';'			{ $2  }-  | label_declarations "__label__" identifier_list ';'	{ $1 `rappendr` $3 }----- parse C expression statement (C99 6.8.3)----expression_statement :: { CStat }-expression_statement-  : ';'				{% withNodeInfo $1 $ CExpr Nothing }-  | expression ';'		{% withNodeInfo $1 $ CExpr (Just $1) }----- parse C selection statement (C99 6.8.4)----selection_statement :: { CStat }-selection_statement-  : if '(' expression ')' statement-	{% withNodeInfo $1 $ CIf $3 $5 Nothing }--  | if '(' expression ')' statement else statement-	{% withNodeInfo $1 $ CIf $3 $5 (Just $7) }--  | switch '(' expression ')' statement-	{% withNodeInfo $1 $ CSwitch $3 $5 }----- parse C iteration statement (C99 6.8.5)----iteration_statement :: { CStat }-iteration_statement-  : while '(' expression ')' statement-  	{% withNodeInfo $1 $ CWhile $3 $5 False }--  | do statement while '(' expression ')' ';'-  	{% withNodeInfo $1 $ CWhile $5 $2 True }--  | for '(' expression_opt ';' expression_opt ';' expression_opt ')' statement-	{% withNodeInfo $1 $ CFor (Left $3) $5 $7 $9 }--  | for '(' enter_scope declaration expression_opt ';' expression_opt ')' statement leave_scope-	{% withNodeInfo $1 $ CFor (Right $4) $5 $7 $9 }----- parse C jump statement (C99 6.8.6)------ * GNU extension: computed gotos----jump_statement :: { CStat }-jump_statement-  : goto identifier ';'			{% withNodeInfo $1 $ CGoto $2 }-  | goto '*' expression ';'		{% withNodeInfo $1 $ CGotoPtr $3 }-  | continue ';'			    {% withNodeInfo $1 $ CCont }-  | break ';'				    {% withNodeInfo $1 $ CBreak }-  | return expression_opt ';'	{% withNodeInfo $1 $ CReturn $2 }----- parse GNU C __asm__ statement (compatible with C99: J.5.10)------ asm_stmt    :- asm volatile? ( "asm..." : output-operands : input-operands : asm-clobbers )--- asm_operand :- [operand-name] "constraint" ( expr )--- asm_clobber :- "r1", "r2", ...----asm_statement :: { CAsmStmt }-asm_statement-  : asm maybe_type_qualifier '(' string_literal ')' ';'-  	{% withNodeInfo $1 $ CAsmStmt $2 $4 [] [] [] }--  | asm maybe_type_qualifier '(' string_literal ':' asm_operands ')' ';'-  	{% withNodeInfo $1 $ CAsmStmt $2 $4 $6 [] [] }--  | asm maybe_type_qualifier '(' string_literal ':' asm_operands ':' asm_operands ')' ';'-  	{% withNodeInfo $1 $ CAsmStmt $2 $4 $6 $8 [] }--  | asm maybe_type_qualifier '(' string_literal ':' asm_operands ':' asm_operands ':' asm_clobbers ')' ';'-  	{% withNodeInfo $1 $ CAsmStmt $2 $4 $6 $8 (reverse $10) }---maybe_type_qualifier :: { Maybe CTypeQual }-maybe_type_qualifier-  : {- empty -}		  { Nothing }-  | type_qualifier	  { Just $1 }--asm_operands :: { [CAsmOperand] }-asm_operands-  : {- empty -}				{ [] }-  | nonnull_asm_operands    { reverse $1 }--nonnull_asm_operands :: { Reversed [CAsmOperand] }-nonnull_asm_operands-  : asm_operand					          { singleton $1 }-  | nonnull_asm_operands ',' asm_operand  { $1 `snoc` $3 }--asm_operand :: { CAsmOperand }-asm_operand-  : string_literal '(' expression ')'			      {% withNodeInfo $1 $ CAsmOperand Nothing $1 $3 }-  | '[' ident ']' string_literal '(' expression ')'   {% withNodeInfo $1 $ CAsmOperand (Just $2) $4 $6 }-  | '[' tyident ']' string_literal '(' expression ')' {% withNodeInfo $1 $ CAsmOperand (Just $2) $4 $6 }---asm_clobbers :: { Reversed [CStrLit] }-asm_clobbers-  : string_literal			        { singleton $1 }-  | asm_clobbers ',' string_literal	{ $1 `snoc` $3 }--{------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Declarations----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Declarations are the most complicated part of the grammar, and shall be summarized here.-To allow a lightweight notation, we will use the modifier <permute> to indicate that the order of the immidieate right-hand sides doesn't matter.- - <permute> a* b+ c   === any sequence of a's, b's and c's, which contains exactly 1 'c' and at least one 'b'---- storage class and type qualifier-----------------------------------------------------------------------------------------------------------------attr                       :-   __attribute__((..))-storage_class              :-   typedef | extern | static | auto | register | _Thread_local-function_specifier         :-   inline | _Noreturn-alignment_specifier        :-   _Alignas (type_name) | _Alignas (constant_expr)--type_qualifier             :-   const | volatile | restrict | _Atomic | _Nullable | _Nonnull-type_qualifier_list        :-   type_qualifier+--declaration_qualifier      :-   storage_class | type_qualifier | function_specifier | alginment_specifier-declaration_qualifier_list :-   <permute> type_qualifier* storage_class+--qualifiers                 :-   declaration_qualifier_list | type_qualifier_list-                           :=   <permute> (type_qualifier|storage_class)+---- type names-----------------------------------------------------------------------------------------------------------------declaration_specifier      :- <permute> type_qualifier* storage_class+ (basic_type_name+ | elaborated_type_name | tyident )-type_specifier             :- <permute> type_qualifier* (basic_type_name+ | elaborated_type_name | tyident)--specifiers                 :- declaration_specifier | type_specifier-                           := <permute> type_qualifier* storage_class* (basic_type_name+ | elaborated_type_name | tyident )---- struct/union/enum declarations-----------------------------------------------------------------------------------------------------------------sue_declaration_specifier :- <permute> type_qualifier* storage_class+ elaborated_type_name-sue_type_specifier        :- <permute> type_qualifier* elaborated_type_name--sue_declaration           := sue_declaration_specifier | sue_type_specifier-                          :- <permute> type_qualifier* storage_class* elaborated_type_name---- declarators-----------------------------------------------------------------------------------------------------------------identifier_declarator :- ( '*' (type_qualifier | attr)* ) * ident     [ array_decl | "(" parameter-list ")" ]-                               plus additional parenthesis' ending ^^ here-typedef_declartor     :--declarator            :- identifier_declarator | typedef_declarator---- Declaration lists-----------------------------------------------------------------------------------------------------------------default_declaring_list :- qualifiers ( identifier_declarator asm*attrs* initializer? )_comma_list--declaring_list         :- specifiers ( declarator asm*attrs* initializer? )_comma_list--declaration_list := default_declaring_list | declaring_list---- Declaration-----------------------------------------------------------------------------------------------------------------declaration = sue_declaration | declaration_list | _Static_assert(..)------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Attributes--- (citing http://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html)----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------"Attributes may appear after the colon following a label (expect case and default)"--labeled_statement :- identifier ':' attrs_opt statement--"Attributes may go either immediately after the struct/union/enum keyword or after the closing brace"--struct attrs_opt ...-struct ... { } attrs_opt--"In general: Attributes appear as part of declarations, either belonging to a declaration or declarator"--"Any list of specifiers and qualifiers at the start of a declaration may contain attribute specifiers"-"An attribute list may appear immediately before the comma, = or semicolon terminating a declaration of an identifier"------------------------------------------------------------------------------------------------------------------For the parser, we modified the following rules to be interleaved with attributes:--default_declaring_list' :-  (declaration_qualifier_list' | type_qualifier_list' attr*)-                                             identifier_declarator asm*attr* initializer?-                                 { ',' attr* identifier_declarator asm*attr* initializer? }-declaring_list' :-          specifier' declarator asm*attr* initializer?-                                 { ',' attr* declarator asm*attr* initializer? }---type_qualifier_list' is like type_qualifier_list, but with preceeding and/or interleaving (but not terminating) __attribute__ annotations.-declaration_qualifier_list', declaration_specifier' and type_specifier' are like their unprimed variants, but with arbitrary preceeding, interleaving and/or terminating __attribute__ annotations.--"An attribute list may appear immediately before a declarator other than the first in a comma seperated list of declarators"--"The attribute specifiers may be the only specifiers present (implicit int)" [not supported]--"Attribute specifiers may be mixed with type qualifiers appearing inside the [] of an parameter array declarator"--tbc.--}------ parse C declaration (C11 6.7)------ * new form in C11---     _Static_assert(expr,string_literal)-declaration :: { CDecl }-declaration-  : sue_declaration_specifier ';'-  	{% withNodeInfo $1 $ CDecl (reverse $1) [] }--  | sue_type_specifier ';'-  	{% withNodeInfo $1 $ CDecl (reverse $1) [] }--  | declaring_list ';'-  	{% case $1 of CDecl declspecs dies at -> withLength at (CDecl declspecs (List.reverse dies)) }--  | default_declaring_list ';'-  	{% case $1 of CDecl declspecs dies at -> withLength at (CDecl declspecs (List.reverse dies)) }-  | "_Static_assert" '(' constant_expression ',' string_literal ')' ';'-        {% withNodeInfo $1 $ CStaticAssert $3 $5 }--declaration_list :: { Reversed [CDecl] }-declaration_list-  : {- empty -}					 { empty }-  | declaration_list declaration { $1 `snoc` $2 }----- * SUMMARY: default_declaring_list :- qualifier* identifier_declarator asm_attrs initializer?---                                                 { ',' identifier_declarator asm_attrs initializer? }------ * GNU extensions---   __attribute__ annotations imm. before an declarator (see Attribute Syntax, paragraph 11)---   asm + __attribute__ annotations (end of declarations, see Attribute Syntax, paragraph 12)---   The assembler annotation is used to specifiy an assembler name for the declarator.----default_declaring_list :: { CDecl }-default_declaring_list-  : declaration_qualifier_list identifier_declarator asm_attrs_opt {-{}-} initializer_opt-  	{% let declspecs = reverse $1 in-  	   do{ declr <- withAsmNameAttrs $3 $2-           ; doDeclIdent declspecs declr-           ; withNodeInfo $1 $-                CDecl declspecs [(Just (reverseDeclr declr), $4, Nothing)] }}--  | type_qualifier_list identifier_declarator asm_attrs_opt {-{}-} initializer_opt-  	{% let declspecs = liftTypeQuals $1 in-  	   do{ declr <- withAsmNameAttrs $3 $2-           ; doDeclIdent declspecs declr-           ; withNodeInfo $1 $ CDecl declspecs [(Just (reverseDeclr declr), $4, Nothing)] }}--  | type_qualifier_list attrs identifier_declarator asm_attrs_opt {-{}-} initializer_opt -- FIX 1600-  	{% let declspecs = liftTypeQuals $1 in-  	   do{ declr <- withAsmNameAttrs $4 $3-           ; doDeclIdent declspecs declr-           ; withNodeInfo $1 $ CDecl (declspecs ++ liftCAttrs $2) [(Just (reverseDeclr declr), $5, Nothing)] }}--  -- GNU extension: __attribute__ as the only qualifier-  | attrs identifier_declarator asm_attrs_opt {-{}-} initializer_opt-    {% let declspecs = liftCAttrs $1 in-       do{ declr <- withAsmNameAttrs $3 $2-           ; doDeclIdent declspecs declr-           ; withNodeInfo $1 $ CDecl declspecs [(Just (reverseDeclr declr), $4, Nothing)] }}--  | default_declaring_list ',' attrs_opt identifier_declarator asm_attrs_opt {-{}-} initializer_opt-  	{% case $1 of-             CDecl declspecs dies at -> do-               declr <- withAsmNameAttrs (fst $5, snd $5 ++ $3) $4-               doDeclIdent declspecs declr-               withLength at $ CDecl declspecs ((Just (reverseDeclr declr), $6, Nothing) : dies)  }---- assembler, followed by attribute annotation-asm_attrs_opt :: { (Maybe CStrLit, [CAttr]) }-asm_attrs_opt-  : asm_opt attrs_opt-  { ($1,$2) }------- SUMMARY: declaring_list :- specifier* declarator asm_attrs initializer?---                                 { ',' declarator asm_attrs initializer? }------ GNU extensions:---      __attribute__ annotations imm. before an declarator (see Attribute Syntax, paragraph 11)---      asm + __attribute__ annotations (end of declarations, see Attribute Syntax, paragraph 12)----declaring_list :: { CDecl }-declaring_list-  : declaration_specifier declarator asm_attrs_opt initializer_opt-  	{% do{-  	   declr <- withAsmNameAttrs $3 $2;-  	   doDeclIdent $1 declr;-       withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr declr), $4, Nothing)] }-    }--  | type_specifier declarator asm_attrs_opt initializer_opt-  	{% do{-  	   declr <- withAsmNameAttrs $3 $2;-  	   doDeclIdent $1 declr;-       withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr declr), $4, Nothing)] }-    }--  | declaring_list ',' attrs_opt declarator asm_attrs_opt initializer_opt-  	{% case $1 of-             CDecl declspecs dies at -> do-               declr <- withAsmNameAttrs (fst $5, snd $5 ++ $3) $4-               doDeclIdent declspecs declr-               return (CDecl declspecs ((Just (reverseDeclr declr), $6, Nothing) : dies) at) }----- parse C declaration specifiers (C99 6.7)------ * <permute> type_qualifier* storage_class+ (basic_type_name+ | elaborated_type_name | tyident )----declaration_specifier :: { [CDeclSpec] }-declaration_specifier-  : basic_declaration_specifier		{ reverse $1 }	-- Arithmetic or void-  | sue_declaration_specifier		{ reverse $1 }	-- Struct/Union/Enum-  | typedef_declaration_specifier	{ reverse $1 }	-- Typedef----- A mixture of type qualifiers (const, volatile, restrict, _Atomic, _Nonnull, _Nullable),--- function specifiers (inline, _Noreturn),--- alignment specifiers (_Alignas) and--- storage class specifiers (extern, static, auto, register, _Thread_local),--- in any order, but containing at least one storage class specifier.------ declaration_qualifier_list :- <permute> type_qualifier* alignment_specifier* function_specifier* storage_class+------ GNU extensions---   * arbitrary interleaved __attribute__ annotations----declaration_qualifier_list :: { Reversed [CDeclSpec] }-declaration_qualifier_list-  : declaration_qualifier_without_types-        { singleton $1 }--  | attrs declaration_qualifier_without_types-  	{ reverseList (liftCAttrs $1) `snoc` $2 }--  | type_qualifier_list declaration_qualifier_without_types-  	{ rmap CTypeQual $1 `snoc` $2 }--  | type_qualifier_list attrs declaration_qualifier_without_types-  	{ (rmap CTypeQual $1 `rappend` liftCAttrs $2) `snoc` $3 }--  | declaration_qualifier_list declaration_qualifier-  	{ $1 `snoc` $2 }--  | declaration_qualifier_list attr-  	{ addTrailingAttrs $1 $2 }------- declaration_qualifier :- storage_class | type_qualifier | function_specifier | alignment_specifier----declaration_qualifier :: { CDeclSpec }-declaration_qualifier-  : storage_class		     { CStorageSpec $1 }-  | type_qualifier		     { CTypeQual $1 }-  | function_specifier               { CFunSpec $1 }-  | alignment_specifier              { CAlignSpec $1 }---declaration_qualifier_without_types :: { CDeclSpec }-  : storage_class		     { CStorageSpec $1 }-  | function_specifier               { CFunSpec $1 }-  | alignment_specifier              { CAlignSpec $1 }----- parse C storage class specifier (C99 6.7.1)------ * GNU extensions: '__thread' thread local storage----storage_class :: { CStorageSpec }-storage_class-  : typedef			{% withNodeInfo $1 $ CTypedef }-  | extern			{% withNodeInfo $1 $ CExtern }-  | static			{% withNodeInfo $1 $ CStatic }-  | auto			{% withNodeInfo $1 $ CAuto }-  | register			{% withNodeInfo $1 $ CRegister }-  | "__thread"			{% withNodeInfo $1 $ CThread }---- parse C function specifier (C11 6.7.4)-function_specifier :: { CFunSpec }-function_specifier-  : inline		{% withNodeInfo $1 $ CInlineQual }-  | "_Noreturn"         {% withNodeInfo $1 $ CNoreturnQual }---- parse C alignment specifier (C11 6.7.5)-alignment_specifier :: { CAlignSpec }-alignment_specifier-  : alignas '(' type_name ')'           {% withNodeInfo $1 $ CAlignAsType $3 }-  | alignas '(' constant_expression ')' {% withNodeInfo $1 $ CAlignAsExpr $3 }---- parse C type specifier (C99 6.7.2)------ This recignises a whole list of type specifiers rather than just one--- as in the C99 grammar.------ type_specifier :- <permute> type_qualifier* (basic_type_name+ | elaborated_type_name | g)------ Type specifier _Atomic(type) is not yet supported because of conflicts with type qualifier _Atomic-type_specifier :: { [CDeclSpec] }-type_specifier-  : basic_type_specifier		{ reverse $1 }	-- Arithmetic or void-  | sue_type_specifier			{ reverse $1 }	-- Struct/Union/Enum-  | typedef_type_specifier		{ reverse $1 }	-- Typedef---  | "_Atomic" '(' type_name ')'                         -- _Atomic(type)---        {% withNodeInfo $1 $ \at -> [CTypeSpec (CAtomicType $3 at)] }--basic_type_name :: { CTypeSpec }-basic_type_name-  : void			{% withNodeInfo $1 $ CVoidType }-  | char			{% withNodeInfo $1 $ CCharType }-  | short			{% withNodeInfo $1 $ CShortType }-  | int				{% withNodeInfo $1 $ CIntType }-  | long			{% withNodeInfo $1 $ CLongType }-  | float			{% withNodeInfo $1 $ CFloatType }-  | double			{% withNodeInfo $1 $ CDoubleType }-  | signed			{% withNodeInfo $1 $ CSignedType }-  | unsigned			{% withNodeInfo $1 $ CUnsigType }-  | "_Bool"			{% withNodeInfo $1 $ CBoolType }-  | "_Complex"			{% withNodeInfo $1 $ CComplexType }-  | "__int128"      {% withNodeInfo $1 $ CInt128Type }-  | "__float128"      {% withNodeInfo $1 $ CFloat128Type }-  | "_Float128"      {% withNodeInfo $1 $ CFloat128Type }----- A mixture of type qualifiers, storage class and basic type names in any--- order, but containing at least one basic type name and at least one storage--- class specifier.------ basic_declaration_specifier :- <permute> type_qualifier* storage_class+ basic_type_name+------   GNU extensions---     arbitrary interleaved __attribute__ annotations----basic_declaration_specifier :: { Reversed [CDeclSpec] }-basic_declaration_specifier-  : declaration_qualifier_list basic_type_name-  	{ $1 `snoc` CTypeSpec $2 }--  | basic_type_specifier storage_class-  	{ $1 `snoc` CStorageSpec $2 }--  | basic_declaration_specifier declaration_qualifier-  	{ $1 `snoc` $2 }--  | basic_declaration_specifier basic_type_name-  	{ $1 `snoc` CTypeSpec $2 }--  | basic_declaration_specifier attr-  	{ addTrailingAttrs $1 $2 }----- A mixture of type qualifiers and basic type names in any order, but--- containing at least one basic type name.------ basic_type_specifier :- <permute> type_qualifier* basic_type_name+------   GNU extensions---     arbitrary interleaved __attribute__ annotations----basic_type_specifier :: { Reversed [CDeclSpec] }-basic_type_specifier-  -- Arithmetic or void-  : basic_type_name-  	{ singleton (CTypeSpec $1) }--  | attrs basic_type_name-  	{ (reverseList $ liftCAttrs $1) `snoc` (CTypeSpec $2) }--  | type_qualifier_list basic_type_name-  	{ rmap CTypeQual $1 `snoc` CTypeSpec $2 }--  | type_qualifier_list attrs basic_type_name-  	{ rmap CTypeQual $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec $3 }--  | basic_type_specifier type_qualifier-  	{ $1 `snoc` CTypeQual $2 }--  | basic_type_specifier basic_type_name-  	{ $1 `snoc` CTypeSpec $2 }--  | basic_type_specifier attr-     { addTrailingAttrs $1 $2 }----- A named or anonymous struct, union or enum type along with at least one--- storage class and any mix of type qualifiers.------ * Summary:---   sue_declaration_specifier :- <permute> type_qualifier* storage_class+ elaborated_type_name----sue_declaration_specifier :: { Reversed [CDeclSpec] }-sue_declaration_specifier-  : declaration_qualifier_list elaborated_type_name-  	{ $1 `snoc` CTypeSpec $2 }--  | sue_type_specifier storage_class-  	{ $1 `snoc` CStorageSpec $2 }--  | sue_declaration_specifier declaration_qualifier-  	{ $1 `snoc` $2 }--  | sue_declaration_specifier attr-  	{ addTrailingAttrs $1 $2 }----- A struct, union or enum type (named or anonymous) with optional leading and--- trailing type qualifiers.------ * Summary:---   sue_type_specifier :- <permute> type_qualifier* elaborated_type_name------ * GNU Extensions: records __attribute__ annotations----sue_type_specifier :: { Reversed [CDeclSpec] }-sue_type_specifier-  -- struct/union/enum-  : elaborated_type_name-  	{ singleton (CTypeSpec $1) }--  | attrs elaborated_type_name-  	{ (reverseList $ liftCAttrs $1) `snoc` (CTypeSpec $2) }--  | type_qualifier_list elaborated_type_name-  	{ rmap CTypeQual $1 `snoc` CTypeSpec $2 }--  | type_qualifier_list attrs elaborated_type_name-  	{ rmap CTypeQual  $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec $3 }--  | sue_type_specifier type_qualifier-  	{ $1 `snoc` CTypeQual $2 }--  | sue_type_specifier attr-    { addTrailingAttrs $1 $2 }---- A typedef'ed type identifier with at least one storage qualifier and any--- number of type qualifiers------ * Summary:---   typedef_declaration_specifier :- <permute> type_qualifier* storage_class+ tyident------ * Note:---   the tyident can also be a: typeof '(' ... ')'----typedef_declaration_specifier :: { Reversed [CDeclSpec] }-typedef_declaration_specifier-  : typedef_type_specifier storage_class-  	{ $1 `snoc` CStorageSpec $2 }--  | declaration_qualifier_list tyident-  	{% withNodeInfo $2 $ \at -> $1 `snoc` CTypeSpec (CTypeDef $2 at) }--  | declaration_qualifier_list typeof '(' expression ')'-  	{% withNodeInfo $2 $ \at -> $1 `snoc` CTypeSpec (CTypeOfExpr $4 at) }--  | declaration_qualifier_list typeof '(' type_name ')'-  	{% withNodeInfo $2 $ \at -> $1 `snoc` CTypeSpec (CTypeOfType $4 at) }--  | typedef_declaration_specifier declaration_qualifier-  	{ $1 `snoc` $2 }--  | typedef_declaration_specifier attr-  	{ addTrailingAttrs $1 $2 }----- typedef'ed type identifier with optional leading and trailing type qualifiers------ * Summary:---   type_qualifier* ( tyident | typeof '('...')' ) type_qualifier*----typedef_type_specifier :: { Reversed [CDeclSpec] }-typedef_type_specifier-  : tyident-  	{% withNodeInfo $1 $ \at -> singleton (CTypeSpec (CTypeDef $1 at)) }--  | typeof '(' expression ')'-  	{% withNodeInfo $1 $ \at -> singleton (CTypeSpec (CTypeOfExpr $3 at)) }--  | typeof '(' type_name ')'-  	{% withNodeInfo $1 $ \at -> singleton (CTypeSpec (CTypeOfType $3 at)) }--  | type_qualifier_list tyident-  	{% withNodeInfo $2 $ \at -> rmap CTypeQual  $1 `snoc` CTypeSpec (CTypeDef $2 at) }--  | type_qualifier_list typeof '(' expression ')'-  	{% withNodeInfo $2 $ \at -> rmap CTypeQual  $1 `snoc` CTypeSpec (CTypeOfExpr $4 at) }--  | type_qualifier_list typeof '(' type_name ')'-  	{% withNodeInfo $2 $ \at -> rmap CTypeQual  $1 `snoc` CTypeSpec (CTypeOfType $4 at) }--  -- repeat with attrs (this could be easier if type qualifier list wouldn't allow leading attributes)-  | attrs tyident-  	{% withNodeInfo $2 $ \at -> reverseList (liftCAttrs $1) `snoc` (CTypeSpec (CTypeDef $2 at)) }--  | attrs typeof '(' expression ')'-  	{% withNodeInfo $1 $ \at -> reverseList (liftCAttrs $1) `snoc`  (CTypeSpec (CTypeOfExpr $4 at)) }--  | attrs typeof '(' type_name ')'-  	{% withNodeInfo $2 $ \at -> reverseList (liftCAttrs $1) `snoc`  (CTypeSpec (CTypeOfType $4 at)) }--  | type_qualifier_list attrs tyident-  	{% withNodeInfo $3 $ \at -> rmap CTypeQual  $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec (CTypeDef $3 at) }--  | type_qualifier_list attrs typeof '(' expression ')'-  	{% withNodeInfo $3 $ \at -> rmap CTypeQual  $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec (CTypeOfExpr $5 at) }--  | type_qualifier_list attrs typeof '(' type_name ')'-  	{% withNodeInfo $3 $ \at -> rmap CTypeQual  $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec (CTypeOfType $5 at) }--  | typedef_type_specifier type_qualifier-  	{ $1 `snoc` CTypeQual $2 }--  | typedef_type_specifier attr-  	{ addTrailingAttrs $1 $2 }----- A named or anonymous struct, union or enum type.------ * Summary:---   (struct|union|enum) (identifier? '{' ... '}' | identifier)----elaborated_type_name :: { CTypeSpec }-elaborated_type_name-  : struct_or_union_specifier	{% withNodeInfo $1 $ CSUType $1 }-  | enum_specifier		{% withNodeInfo $1 $ CEnumType $1 }----- parse C structure or union declaration (C99 6.7.2.1)------ * Summary:---    (struct|union) (identifier? '{' ... '}' | identifier)----struct_or_union_specifier :: { CStructUnion }-struct_or_union_specifier-  : struct_or_union attrs_opt identifier '{' struct_declaration_list  '}'-  	{% withNodeInfo $1 $ CStruct (unL $1) (Just $3) (Just$ reverse $5) $2 }--  | struct_or_union attrs_opt '{' struct_declaration_list  '}'-  	{% withNodeInfo $1 $ CStruct (unL $1) Nothing   (Just$ reverse $4) $2 }--  | struct_or_union attrs_opt identifier-  	{% withNodeInfo $1 $ CStruct (unL $1) (Just $3) Nothing $2 }---struct_or_union :: { Located CStructTag }-struct_or_union-  : struct			{ L CStructTag (posOf $1) }-  | union			{ L CUnionTag (posOf $1) }---struct_declaration_list :: { Reversed [CDecl] }-struct_declaration_list-  : {- empty -}						{ empty }-  | struct_declaration_list ';'				{ $1 }-  | struct_declaration_list struct_declaration		{ $1 `snoc` $2 }----- parse C structure declaration (C99 6.7.2.1)----struct_declaration :: { CDecl }-struct_declaration-  : struct_declaring_list ';'-  	{ case $1 of CDecl declspecs dies at -> CDecl declspecs (List.reverse dies) at }--  | struct_default_declaring_list';'-  	{ case $1 of CDecl declspecs dies at -> CDecl declspecs (List.reverse dies) at }--  | "__extension__" struct_declaration	{ $2 }--------  * Note: doesn't redeclare typedef------  TODO: FIXME: AST doesn't allow recording attributes of unnamed struct members-struct_default_declaring_list :: { CDecl }-struct_default_declaring_list-  : type_qualifier_list attrs_opt struct_identifier_declarator-  	{% withNodeInfo $1 $ case $3 of (d,s) -> CDecl (liftTypeQuals $1 ++ liftCAttrs $2) [(d,Nothing,s)] }--  -- GNU extension: __attribute__ as only type qualifier-  | attrs struct_identifier_declarator-    {% withNodeInfo $1 $ case $2 of (d,s) -> CDecl (liftCAttrs $1) [(d,Nothing,s)] }-  -- attrs_opt apply to the declared object-  | struct_default_declaring_list ',' attrs_opt struct_identifier_declarator-  	{ case $1 of-            CDecl declspecs dies at ->-              case $4 of-                (Just d,s) -> CDecl declspecs ((Just $ appendObjAttrs $3 d,Nothing,s) : dies) at-                (Nothing,s) -> CDecl declspecs ((Nothing,Nothing,s) : dies) at } -- FIXME---- * GNU extensions:---     allow anonymous nested structures and unions---     FIXME: cannot record attribute of unnamed field-struct_declaring_list :: { CDecl }-struct_declaring_list-  : type_specifier struct_declarator attrs_opt-  	{% withNodeInfo $1 $ case $2 of { (Just d,s)  -> CDecl $1 [(Just $! appendObjAttrs $3 d,Nothing,s)]-                                    ; (Nothing,s) -> CDecl $1 [(Nothing,Nothing,s)]  } } {- DO FIXME -}-  | struct_declaring_list ',' attrs_opt struct_declarator attrs_opt-  	{ case $1 of-            CDecl declspecs dies attr ->-              case $4 of-                (Just d,s) -> CDecl declspecs ((Just$ appendObjAttrs ($3++$5) d,Nothing,s) : dies) attr-                (Nothing,s) -> CDecl declspecs ((Nothing,Nothing,s) : dies) attr }--  -- FIXME: We're being far too liberal in the parsing here, we really want to just-  -- allow unnamed struct and union fields but we're actually allowing any-  -- unnamed struct member. Making it allow only unnamed structs or unions in-  -- the parser is far too tricky, it makes things ambiguous. So we'll have to-  -- diagnose unnamed fields that are not structs/unions in a later stage.--  -- Note that a plain type specifier can have a trailing attribute--  | type_specifier-     {% withNodeInfo $1 $ CDecl $1 []  }----- parse C structure declarator (C99 6.7.2.1)----struct_declarator :: { (Maybe CDeclr, Maybe CExpr) }-struct_declarator-  : declarator					       { (Just (reverseDeclr $1), Nothing) }-  | ':' constant_expression			   { (Nothing, Just $2) }-  | declarator ':' constant_expression { (Just (reverseDeclr $1), Just $3) }---- FIXME: anonymous bitfield doesn't allow recording of attributes-struct_identifier_declarator :: { (Maybe CDeclr, Maybe CExpr) }-struct_identifier_declarator-  : identifier_declarator				{ (Just (reverseDeclr $1), Nothing) }-  | ':' constant_expression				{ (Nothing, Just $2) }-  | identifier_declarator ':' constant_expression	{ (Just (reverseDeclr $1), Just $3) }-  | struct_identifier_declarator attr-    {  case $1 of {   (Nothing,expr) -> (Nothing,expr) {- FIXME -}-                    ; (Just (CDeclr name derived asmname attrs node), bsz) ->-                                        (Just (CDeclr name derived asmname (attrs++$2) node),bsz)-                  }-    }---- parse C enumeration declaration (C99 6.7.2.2)------ * Summary:---   enum (identifier? '{' ... '}' | identifier)----enum_specifier :: { CEnum }-enum_specifier-  : enum attrs_opt '{' enumerator_list '}'-  	{% withNodeInfo $1 $ CEnum Nothing   (Just$ reverse $4) $2 }--  | enum attrs_opt '{' enumerator_list ',' '}'-  	{% withNodeInfo $1 $ CEnum Nothing   (Just$ reverse $4) $2 }--  | enum attrs_opt identifier '{' enumerator_list '}'-  	{% withNodeInfo $1 $ CEnum (Just $3) (Just$ reverse $5) $2 }--  | enum attrs_opt identifier '{' enumerator_list ',' '}'-  	{% withNodeInfo $1 $ CEnum (Just $3) (Just$ reverse $5) $2 }--  | enum attrs_opt identifier-  	{% withNodeInfo $1 $ CEnum (Just $3) Nothing $2           }--enumerator_list :: { Reversed [(Ident, Maybe CExpr)] }-enumerator_list-  : enumerator					{ singleton $1 }-  | enumerator_list ',' enumerator		{ $1 `snoc` $3 }---enumerator :: { (Ident, Maybe CExpr) }-enumerator-  : identifier                               { ($1, Nothing) }-  | identifier attrs                         { ($1, Nothing) }-  | identifier attrs '=' constant_expression { ($1, Just $4) }-  | identifier '=' constant_expression       { ($1, Just $3) }----- parse C type qualifier (C11 6.7.3)------ concerning atomic, note:  If the _Atomic keyword is immediately followed by a left--- parenthesis, it should be interpreted as a type specifier (with a type name), not as a type qualifier-type_qualifier :: { CTypeQual }-type_qualifier-  : const		{% withNodeInfo $1 $ CConstQual }-  | volatile		{% withNodeInfo $1 $ CVolatQual }-  | restrict		{% withNodeInfo $1 $ CRestrQual }-  | "_Nullable"         {% withNodeInfo $1 $ CNullableQual }-  | "_Nonnull"          {% withNodeInfo $1 $ CNonnullQual }-  | "_Atomic"           {% withNodeInfo $1 $ CAtomicQual }---- a list containing at least one type_qualifier (const, volatile, restrict, inline, _Noreturn)---    and additionally CAttrs-type_qualifier_list :: { Reversed [CTypeQual] }-type_qualifier_list-  : attrs_opt type_qualifier	             { reverseList (map CAttrQual $1) `snoc` $2 }-  | type_qualifier_list type_qualifier	     { $1 `snoc` $2 }-  | type_qualifier_list attrs type_qualifier { ($1 `rappend` map CAttrQual $2) `snoc` $3}---- parse C declarator (C99 6.7.5)----declarator :: { CDeclrR }-declarator-  : identifier_declarator		{ $1 }-  | typedef_declarator			{ $1 }----- Parse GNU C's asm annotations------ Those annotations allow to give an assembler name to a function or identifier.-asm_opt :: { Maybe CStrLit }-asm_opt-  : {- empty -}				          { Nothing }-  | asm '(' string_literal ')'	{ Just $3 }------- typedef_declarator :---typedef_declarator :: { CDeclrR }-typedef_declarator-  -- would be ambiguous as parameter-  : paren_typedef_declarator		{ $1 }--  -- not ambiguous as param-  | parameter_typedef_declarator	{ $1 }----- parameter_typedef_declarator :- tyident declarator_postfix?---                              | '(' attrs? clean_typedef_declarator ')' declarator_postfix?---                              |  '*' attrs? type_qualifier_list? parameter_typedef_declarator----parameter_typedef_declarator :: { CDeclrR }-parameter_typedef_declarator-  : tyident-  	{% withNodeInfo $1 $ mkVarDeclr $1 }--  | tyident postfixing_abstract_declarator-  	{% withNodeInfo $1 $ \at -> $2 (mkVarDeclr $1 at) }--  | clean_typedef_declarator-  	{ $1 }----- The  following have at least one '*'.--- There is no (redundant) '(' between the '*' and the tyident.------ clean_typedef_declarator :-  '(' attrs? clean_typedef_declarator ')' declarator_postfix?---                            | '*' attrs? type_qualifier_list? parameter_typedef_declarator----clean_typedef_declarator :: { CDeclrR }-clean_typedef_declarator-  : clean_postfix_typedef_declarator-  	{ $1 }--  | '*' parameter_typedef_declarator-  	{% withNodeInfo $1 $ ptrDeclr $2 [] }--  | '*' attrs parameter_typedef_declarator-  	{% withAttribute $1 $2 $ ptrDeclr $3 [] }--  | '*' type_qualifier_list  parameter_typedef_declarator-  	{% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }--  | '*' type_qualifier_list attrs parameter_typedef_declarator-  	{% withAttribute $1 $3 $ ptrDeclr $4 (reverse $2)  }---- clean_postfix_typedef_declarator :- ( attrs? clean_typedef_declarator ) declarator_postfix?----clean_postfix_typedef_declarator :: { CDeclrR }-clean_postfix_typedef_declarator-  : '(' clean_typedef_declarator ')'						              { $2 }-  | '(' clean_typedef_declarator ')' postfixing_abstract_declarator		  { $4 $2 }-  | '(' attrs clean_typedef_declarator ')'	                              { appendDeclrAttrs $2 $3 }-  | '(' attrs clean_typedef_declarator ')' postfixing_abstract_declarator { appendDeclrAttrs $2 ($5 $3) }----- The following have a redundant '(' placed--- immediately to the left of the tyident----paren_typedef_declarator :: { CDeclrR }-paren_typedef_declarator-  : paren_postfix_typedef_declarator-  	{ $1 }--  -- redundant paren-  | '*' '(' simple_paren_typedef_declarator ')'-  	{% withNodeInfo $1 $ ptrDeclr $3 [] }--  | '*' type_qualifier_list '(' simple_paren_typedef_declarator ')'-  	{% withNodeInfo $1 $ ptrDeclr $4 (reverse $2) }-  | '*' type_qualifier_list attrs '(' simple_paren_typedef_declarator ')'-  	{% withAttribute $1 $3 $ ptrDeclr $5 (reverse $2)  }--  | '*' paren_typedef_declarator-  	{% withNodeInfo $1 $ ptrDeclr $2 [] }--  | '*' type_qualifier_list paren_typedef_declarator-  	{% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }-  | '*' type_qualifier_list attrs paren_typedef_declarator-  	{% withAttribute $1 $3 $ ptrDeclr $4 (reverse $2) }---- redundant paren to left of tname-paren_postfix_typedef_declarator :: { CDeclrR }-paren_postfix_typedef_declarator-  : '(' paren_typedef_declarator ')'-  	{ $2 }--  -- redundant paren-  | '(' simple_paren_typedef_declarator postfixing_abstract_declarator ')'-  	{ $3 $2 }--  | '(' paren_typedef_declarator ')' postfixing_abstract_declarator-  	{ $4 $2 }----- Just a type name in any number of nested brackets----simple_paren_typedef_declarator :: { CDeclrR }-simple_paren_typedef_declarator-  : tyident-  	{% withNodeInfo $1 $ mkVarDeclr $1 }--  | '(' simple_paren_typedef_declarator ')'-  	{ $2 }------- Declarators--- * Summary---   declarator :- ( '*' (type_qualifier | attr)* )* ident ( array_decl | "(" parameter-list ")" )?---      + additional parenthesis----identifier_declarator :: { CDeclrR }-identifier_declarator-  : unary_identifier_declarator			{ $1 }-  | paren_identifier_declarator			{ $1 }---unary_identifier_declarator :: { CDeclrR }-unary_identifier_declarator-  : postfix_identifier_declarator-  	{ $1 }--  | '*' identifier_declarator-  	{% withNodeInfo $1 $ ptrDeclr $2 [] }--  | '*' attrs identifier_declarator-  	{% withAttribute $1 $2 $ ptrDeclr $3 [] }--  | '*' type_qualifier_list identifier_declarator-  	{% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }--  | '*' type_qualifier_list attrs identifier_declarator-  	{% withAttribute $1 $3 $ ptrDeclr $4 (reverse $2) }--postfix_identifier_declarator :: { CDeclrR }-postfix_identifier_declarator-  : paren_identifier_declarator postfixing_abstract_declarator-  	{ $2 $1 }--   | '('  unary_identifier_declarator ')'-   	{ $2 }--   | '(' unary_identifier_declarator ')' postfixing_abstract_declarator-   	{ $4 $2 }--   | '(' attrs unary_identifier_declarator ')'-     { appendDeclrAttrs $2 $3 }--   | '(' attrs unary_identifier_declarator ')' postfixing_abstract_declarator-     { appendDeclrAttrs $2 ($5 $3) }----- just an identifier in any number of nested parenthesis-paren_identifier_declarator :: { CDeclrR }-paren_identifier_declarator-  : ident-  	{% withNodeInfo $1 $ mkVarDeclr $1 }--  | '(' paren_identifier_declarator ')'-  	{ $2 }--  | '(' attrs paren_identifier_declarator ')'-  	{ appendDeclrAttrs $2 $3 }--function_declarator_old :: { CDeclr }-function_declarator_old-  : old_function_declarator-    { reverseDeclr $1 }--old_function_declarator :: { CDeclrR }-old_function_declarator-  : postfix_old_function_declarator-  	{ $1 }--  | '*' old_function_declarator-  	{% withNodeInfo $1 $ ptrDeclr $2 [] } -- FIXME: no attr possible here ???--  | '*' type_qualifier_list old_function_declarator-  	{% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }--postfix_old_function_declarator :: { CDeclrR }-postfix_old_function_declarator-  : paren_identifier_declarator '(' identifier_list ')'-  	{% withNodeInfo $1 $ funDeclr $1 (Left $ reverse $3) [] }--  | '(' old_function_declarator ')'-  	{ $2 }--  | '(' old_function_declarator ')' postfixing_abstract_declarator-  	{ $4 $2 }----- parse C parameter type list (C99 6.7.5)----parameter_type_list :: { ([CDecl], Bool) }-parameter_type_list-  : {- empty -}				{ ([], False)}-  | parameter_list			{ (reverse $1, False) }-  | parameter_list ',' "..."		{ (reverse $1, True) }--parameter_list :: { Reversed [CDecl] }-parameter_list-  : parameter_declaration				{ singleton $1 }-  | parameter_list ',' parameter_declaration	{ $1 `snoc` $3 }--parameter_declaration :: { CDecl }-parameter_declaration-  : declaration_specifier-  	{% withNodeInfo $1 $ CDecl $1 [] }--  | declaration_specifier abstract_declarator-  	{% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $2), Nothing, Nothing)] }--  | declaration_specifier identifier_declarator attrs_opt-  	{% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] }--  | declaration_specifier parameter_typedef_declarator attrs_opt-  	{% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] }--  | declaration_qualifier_list-  	{% withNodeInfo $1 $ CDecl (reverse $1) [] }--  | declaration_qualifier_list abstract_declarator-  	{% withNodeInfo $1 $ CDecl (reverse $1) [(Just (reverseDeclr $2), Nothing, Nothing)] }--  | declaration_qualifier_list identifier_declarator attrs_opt-  	{% withNodeInfo $1 $ CDecl (reverse $1) [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] }--  | type_specifier-  	{% withNodeInfo $1 $ CDecl $1 [] }--  | type_specifier abstract_declarator-  	{% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $2), Nothing, Nothing)] }--  | type_specifier identifier_declarator attrs_opt-  	{% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] }--  | type_specifier parameter_typedef_declarator attrs_opt-  	{% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] }--  | type_qualifier_list-  	{% withNodeInfo $1 $ CDecl (liftTypeQuals $1) [] }-  | type_qualifier_list attr-  	{% withNodeInfo $1 $ CDecl (liftTypeQuals $1 ++ liftCAttrs $2) [] }--  | type_qualifier_list abstract_declarator-  	{% withNodeInfo $1 $ CDecl (liftTypeQuals $1) [(Just (reverseDeclr $2), Nothing, Nothing)] }--  | type_qualifier_list identifier_declarator attrs_opt-  	{% withNodeInfo $1 $ CDecl (liftTypeQuals $1) [(Just (reverseDeclr$ appendDeclrAttrs $3 $2), Nothing, Nothing)] }---identifier_list :: { Reversed [Ident] }-identifier_list-  : ident				{ singleton $1 }-  | identifier_list ',' ident		{ $1 `snoc` $3 }----- parse C type name (C99 6.7.6)----type_name :: { CDecl }-type_name-  :  type_specifier-  	{% withNodeInfo $1 $ CDecl $1 [] }--  |  type_specifier abstract_declarator-  	{% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $2), Nothing, Nothing)] }--  |  type_qualifier_list attr-  	{% withNodeInfo $1 $ CDecl (liftTypeQuals $1 ++ liftCAttrs $2) [] }--  |  type_qualifier_list abstract_declarator-  	{% withNodeInfo $1 $ CDecl (liftTypeQuals $1) [(Just (reverseDeclr $2), Nothing, Nothing)] }---- parse C abstract declarator (C99 6.7.6)------ postfix starts with '('--- postfixing starts with '(' or '['--- unary start with '*'-abstract_declarator :: { CDeclrR }-abstract_declarator-  : unary_abstract_declarator	    { $1 }-  | postfix_abstract_declarator		{ $1 }-  | postfixing_abstract_declarator  { $1 emptyDeclr }------- FIXME---  | postfixing_abstract_declarator attrs_opt	{ $1 emptyDeclr }---postfixing_abstract_declarator :: { CDeclrR -> CDeclrR }-postfixing_abstract_declarator-  : array_abstract_declarator-  	{ $1 }--  | '(' parameter_type_list ')'-  	{% withNodeInfo $1 $ \at declr -> case $2 of-             (params, variadic) -> funDeclr declr (Right (params,variadic)) [] at }----- * TODO: Note that we recognise but ignore the C99 static keyword (see C99 6.7.5.3)------ * TODO: We do not distinguish in the AST between incomplete array types and--- complete variable length arrays ([ '*' ] means the latter). (see C99 6.7.5.2)----array_abstract_declarator :: { CDeclrR -> CDeclrR }-array_abstract_declarator-  : postfix_array_abstract_declarator-  	{ $1 }--  | array_abstract_declarator postfix_array_abstract_declarator-  	{ \decl -> $2 ($1 decl) }------- TODO: record static-postfix_array_abstract_declarator :: { CDeclrR -> CDeclrR }-postfix_array_abstract_declarator-  : '[' assignment_expression_opt ']'-  	{% withNodeInfo $1 $ \at declr -> arrDeclr declr [] False False $2 at }--  | '[' attrs assignment_expression_opt ']'-  	{% withAttributePF $1 $2 $ \at declr -> arrDeclr declr [] False False $3 at }--  | '[' type_qualifier_list assignment_expression_opt ']'-  	{% withNodeInfo $1 $ \at declr -> arrDeclr declr (reverse $2) False False $3 at }--  | '[' type_qualifier_list attrs assignment_expression_opt ']'-  	{% withAttributePF $1 $3 $ \at declr -> arrDeclr declr (reverse $2) False False $4 at }--  | '[' static attrs_opt assignment_expression ']'-  	{% withAttributePF $1 $3 $ \at declr -> arrDeclr declr [] False True (Just $4) at }--  | '[' static type_qualifier_list attrs_opt assignment_expression ']'-  	{% withAttributePF $1 $4 $ \at declr -> arrDeclr declr (reverse $3) False True (Just $5) at }--  | '[' type_qualifier_list attrs_opt static attrs_opt assignment_expression ']'-  	{% withAttributePF $1 ($3 ++ $5) $ \at declr -> arrDeclr declr (reverse $2) False True  (Just $6) at }--  | '[' '*' attrs_opt ']'-  	{% withAttributePF $1 $3 $ \at declr -> arrDeclr declr [] True False Nothing at }-  | '[' attrs '*' attrs_opt ']'-  	{% withAttributePF $1 ($2 ++ $4) $ \at declr -> arrDeclr declr [] True False Nothing at }--  | '[' type_qualifier_list '*' attrs_opt ']'-  	{% withAttributePF $1 $4 $ \at declr -> arrDeclr declr (reverse $2) True False Nothing at }-  | '[' type_qualifier_list attrs '*' attrs_opt ']'-  	{% withAttributePF $1 ($3 ++ $5) $ \at declr -> arrDeclr declr (reverse $2) True False Nothing at }--unary_abstract_declarator :: { CDeclrR }-unary_abstract_declarator-  : '*'-  	{% withNodeInfo $1 $ ptrDeclr emptyDeclr [] }--  | '*' type_qualifier_list attrs_opt-  	{% withAttribute $1 $3 $ ptrDeclr emptyDeclr (reverse $2)  }--  | '*' abstract_declarator-  	{% withNodeInfo $1 $ ptrDeclr $2 [] }--  | '*' type_qualifier_list abstract_declarator-  	{% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }--  | '*' attrs-  	{% withAttribute $1 $2 $ ptrDeclr emptyDeclr [] }-  | '*' attrs abstract_declarator-  	{% withAttribute $1 $2 $ ptrDeclr $3 [] }---- postfix_ad starts with '(', postfixing with '(' or '[', unary_abstract starts with '*'-postfix_abstract_declarator :: { CDeclrR }-postfix_abstract_declarator-  : '(' unary_abstract_declarator ')'					{ $2 }-  | '(' postfix_abstract_declarator ')'					{ $2 }-  | '(' postfixing_abstract_declarator ')'				{ $2 emptyDeclr }-  | '(' unary_abstract_declarator ')' postfixing_abstract_declarator	{ $4 $2 }---- FIX 0700-  | '(' attrs unary_abstract_declarator ')'				     	{ appendDeclrAttrs $2 $3 }-  | '(' attrs postfix_abstract_declarator ')'					{ appendDeclrAttrs $2 $3 }-  | '(' attrs postfixing_abstract_declarator ')'				{ appendDeclrAttrs $2 ($3 emptyDeclr) }-  | '(' attrs unary_abstract_declarator ')' postfixing_abstract_declarator	{ appendDeclrAttrs $2 ($5 $3) }-  | postfix_abstract_declarator attr						    { appendDeclrAttrs $2 $1 }----- parse C initializer (C99 6.7.8)----initializer :: { CInit }-initializer-  : assignment_expression		{% withNodeInfo $1 $ CInitExpr $1 }-  | '{' initializer_list '}'		{% withNodeInfo $1 $ CInitList (reverse $2) }-  | '{' initializer_list ',' '}'	{% withNodeInfo $1 $ CInitList (reverse $2) }---initializer_opt :: { Maybe CInit }-initializer_opt-  : {- empty -}			{ Nothing }-  | '=' initializer		{ Just $2 }---initializer_list :: { Reversed CInitList }-initializer_list-  : {- empty -}						{ empty }-  | initializer						{ singleton ([],$1) }-  | designation initializer				{ singleton ($1,$2) }-  | initializer_list ',' initializer			{ $1 `snoc` ([],$3) }-  | initializer_list ',' designation initializer	{ $1 `snoc` ($3,$4) }----- designation------ * GNU extensions:---     old style member designation: 'ident :'---     array range designation----designation :: { [CDesignator] }-designation-  : designator_list '='		{ reverse $1 }-  | identifier ':'		{% withNodeInfo $1 $ \at -> [CMemberDesig $1 at] }-  | array_designator		{ [$1] }---designator_list :: { Reversed [CDesignator] }-designator_list- : designator				{ singleton $1 }- | designator_list designator		{ $1 `snoc` $2 }---designator :: { CDesignator }-designator-  : '[' constant_expression ']'		{% withNodeInfo $1 $ CArrDesig $2 }-  | '.' identifier			{% withNodeInfo $1 $ CMemberDesig $2 }-  | array_designator			{ $1 }---array_designator :: { CDesignator }-array_designator-  : '[' constant_expression "..." constant_expression ']'-  	{% withNodeInfo $1 $ CRangeDesig $2 $4 }----- parse C primary expression (C11 6.5.1)------ We cannot use a typedef name as a variable------ * C11: generic selection--- * GNU extensions:---     allow a compound statement as an expression---     __builtin_va_arg---     __builtin_offsetof---     __builtin_types_compatible_p-primary_expression :: { CExpr }-primary_expression-  : ident		 {% withNodeInfo $1 $ CVar $1 }-  | constant	  	 { CConst $1 }-  | string_literal       { CConst (liftStrLit $1) }-  | '(' expression ')'	 { $2 }-  | "_Generic" '(' assignment_expression ',' generic_assoc_list ')'-        {% withNodeInfo $1 $ CGenericSelection $3 (reverse $5) }-  -- GNU extensions-  | '(' compound_statement ')'-  	{% withNodeInfo $1 $ CStatExpr $2 }--  | "__builtin_va_arg" '(' assignment_expression ',' type_name ')'-  	{% withNodeInfo $1 $ CBuiltinExpr . CBuiltinVaArg $3 $5 }--  | "__builtin_offsetof" '(' type_name ',' offsetof_member_designator ')'-  	{% withNodeInfo $1 $ CBuiltinExpr . CBuiltinOffsetOf $3 (reverse $5) }--  | "__builtin_types_compatible_p" '(' type_name ',' type_name ')'-  	{% withNodeInfo $1 $ CBuiltinExpr . CBuiltinTypesCompatible $3 $5 }--  | "__builtin_convertvector" '(' assignment_expression ',' type_name ')'-        {% withNodeInfo $1 $ CBuiltinExpr . CBuiltinConvertVector $3 $5 }---- Generic Selection association list (C11 6.5.1.1)------ TODO: introduce AST type for generic association-generic_assoc_list :: { Reversed [(Maybe CDecl, CExpr)] }-  : generic_assoc_list ',' generic_assoc { $1 `snoc` $3 }-  | generic_assoc                        { singleton $1 }-generic_assoc :: { (Maybe CDecl, CExpr) }-generic_assoc-  : type_name ':' assignment_expression { (Just $1, $3) }-  | default   ':' assignment_expression { (Nothing, $3) }--offsetof_member_designator :: { Reversed [CDesignator] }-offsetof_member_designator-  : identifier						                        {% withNodeInfo $1 $ singleton . CMemberDesig $1 }-  | offsetof_member_designator '.' identifier		  {% withNodeInfo $3 $ ($1 `snoc`) . CMemberDesig $3 }-  | offsetof_member_designator '[' expression ']'	{% withNodeInfo $3 $ ($1 `snoc`) . CArrDesig $3 }----- parse C postfix expression (C99 6.5.2)----postfix_expression :: { CExpr }-postfix_expression-  : primary_expression-  	{ $1 }--  | postfix_expression '[' expression ']'-  	{% withNodeInfo $1 $ CIndex $1 $3 }--  | postfix_expression '(' ')'-  	{% withNodeInfo $1 $ CCall $1 [] }--  | postfix_expression '(' argument_expression_list ')'-  	{% withNodeInfo $1 $ CCall $1 (reverse $3) }--  | postfix_expression '.' identifier-  	{% withNodeInfo $1 $ CMember $1 $3 False }--  | postfix_expression "->" identifier-  	{% withNodeInfo $1 $ CMember $1 $3 True }--  | postfix_expression "++"-  	{% withNodeInfo $1 $ CUnary CPostIncOp $1 }--  | postfix_expression "--"-  	{% withNodeInfo $1 $ CUnary CPostDecOp $1 }--  | '(' type_name ')' '{' initializer_list '}'-  	{% withNodeInfo $1 $ CCompoundLit $2 (reverse $5) }--  | '(' type_name ')' '{' initializer_list ',' '}'-  	{% withNodeInfo $1 $ CCompoundLit $2 (reverse $5) }---argument_expression_list :: { Reversed [CExpr] }-argument_expression_list-  : assignment_expression				{ singleton $1 }-  | argument_expression_list ',' assignment_expression	{ $1 `snoc` $3 }----- parse C unary expression (C99 6.5.3)------ * GNU extensions:---     'alignof' expression or type---     '__real' and '__imag' expression---     '__extension__' to suppress warnings about extensions---     allow taking address of a label with: && label----unary_expression :: { CExpr }-unary_expression-  : postfix_expression			{ $1 }-  | "++" unary_expression		{% withNodeInfo $1 $ CUnary CPreIncOp $2 }-  | "--" unary_expression		{% withNodeInfo $1 $ CUnary CPreDecOp $2 }-  | "__extension__" cast_expression	{ $2 }-  | unary_operator cast_expression	{% withNodeInfo $1 $ CUnary (unL $1) $2 }-  | sizeof unary_expression		{% withNodeInfo $1 $ CSizeofExpr $2 }-  | sizeof '(' type_name ')'		{% withNodeInfo $1 $ CSizeofType $3 }-  -- GNU: alignof, complex and && extension-  | alignof unary_expression		{% withNodeInfo $1 $ CAlignofExpr $2 }-  | alignof '(' type_name ')'		{% withNodeInfo $1 $ CAlignofType $3 }-  | "__real__" unary_expression    {% withNodeInfo $1 $ CComplexReal $2 }-  | "__imag__" unary_expression    {% withNodeInfo $1 $ CComplexImag $2 }-  | "&&" identifier			{% withNodeInfo $1 $ CLabAddrExpr $2 }---unary_operator :: { Located CUnaryOp }-unary_operator-  : '&'		{ L CAdrOp  (posOf $1) }-  | '*'		{ L CIndOp  (posOf $1) }-  | '+'		{ L CPlusOp (posOf $1) }-  | '-'		{ L CMinOp  (posOf $1) }-  | '~'		{ L CCompOp (posOf $1) }-  | '!'		{ L CNegOp  (posOf $1) }----- parse C cast expression (C99 6.5.4)----cast_expression :: { CExpr }-cast_expression-  : unary_expression			{ $1 }-  | '(' type_name ')' cast_expression	{% withNodeInfo $1 $ CCast $2 $4 }----- parse C multiplicative expression (C99 6.5.5)----multiplicative_expression :: { CExpr }-multiplicative_expression-  : cast_expression-  	{ $1 }--  | multiplicative_expression '*' cast_expression-  	{% withNodeInfo $1 $ CBinary CMulOp $1 $3 }--  | multiplicative_expression '/' cast_expression-  	{% withNodeInfo $1 $ CBinary CDivOp $1 $3 }--  | multiplicative_expression '%' cast_expression-  	{% withNodeInfo $1 $ CBinary CRmdOp $1 $3 }----- parse C additive expression (C99 6.5.6)----additive_expression :: { CExpr }-additive_expression-  : multiplicative_expression-  	{ $1 }--  | additive_expression '+' multiplicative_expression-  	{% withNodeInfo $1 $ CBinary CAddOp $1 $3 }--  | additive_expression '-' multiplicative_expression-  	{% withNodeInfo $1 $ CBinary CSubOp $1 $3 }----- parse C shift expression (C99 6.5.7)----shift_expression :: { CExpr }-shift_expression-  : additive_expression-  	{ $1 }--  | shift_expression "<<" additive_expression-  	{% withNodeInfo $1 $ CBinary CShlOp $1 $3 }--  | shift_expression ">>" additive_expression-  	{% withNodeInfo $1 $ CBinary CShrOp $1 $3 }----- parse C relational expression (C99 6.5.8)----relational_expression :: { CExpr }-relational_expression-  : shift_expression-  	{ $1 }--  | relational_expression '<' shift_expression-  	{% withNodeInfo $1 $ CBinary CLeOp $1 $3 }--  | relational_expression '>' shift_expression-  	{% withNodeInfo $1 $ CBinary CGrOp $1 $3 }--  | relational_expression "<=" shift_expression-  	{% withNodeInfo $1 $ CBinary CLeqOp $1 $3 }--  | relational_expression ">=" shift_expression-  	{% withNodeInfo $1 $ CBinary CGeqOp $1 $3 }----- parse C equality expression (C99 6.5.9)----equality_expression :: { CExpr }-equality_expression-  : relational_expression-  	{ $1 }--  | equality_expression "==" relational_expression-  	{% withNodeInfo $1 $ CBinary CEqOp  $1 $3 }--  | equality_expression "!=" relational_expression-  	{% withNodeInfo $1 $ CBinary CNeqOp $1 $3 }----- parse C bitwise and expression (C99 6.5.10)----and_expression :: { CExpr }-and_expression-  : equality_expression-  	{ $1 }--  | and_expression '&' equality_expression-  	{% withNodeInfo $1 $ CBinary CAndOp $1 $3 }----- parse C bitwise exclusive or expression (C99 6.5.11)----exclusive_or_expression :: { CExpr }-exclusive_or_expression-  : and_expression-  	{ $1 }--  | exclusive_or_expression '^' and_expression-  	{% withNodeInfo $1 $ CBinary CXorOp $1 $3 }----- parse C bitwise or expression (C99 6.5.12)----inclusive_or_expression :: { CExpr }-inclusive_or_expression-  : exclusive_or_expression-  	{ $1 }--  | inclusive_or_expression '|' exclusive_or_expression-  	{% withNodeInfo $1 $ CBinary COrOp $1 $3 }----- parse C logical and expression (C99 6.5.13)----logical_and_expression :: { CExpr }-logical_and_expression-  : inclusive_or_expression-  	{ $1 }--  | logical_and_expression "&&" inclusive_or_expression-  	{% withNodeInfo $1 $ CBinary CLndOp $1 $3 }----- parse C logical or expression (C99 6.5.14)----logical_or_expression :: { CExpr }-logical_or_expression-  : logical_and_expression-  	{ $1 }--  | logical_or_expression "||" logical_and_expression-  	{% withNodeInfo $1 $ CBinary CLorOp $1 $3 }----- parse C conditional expression (C99 6.5.15)------ * GNU extensions:---     omitting the `then' part-conditional_expression :: { CExpr }-conditional_expression-  : logical_or_expression-  	{ $1 }--  | logical_or_expression '?' expression ':' conditional_expression-  	{% withNodeInfo $1 $ CCond $1 (Just $3) $5 }--  | logical_or_expression '?' ':' conditional_expression-  	{% withNodeInfo $1 $ CCond $1 Nothing $4 }----- parse C assignment expression (C99 6.5.16)------ * NOTE: LHS of assignment is more restricted than in gcc.---         `x ? y : z = 3' parses in gcc as `(x ? y : z) = 3',---         but `x ? y : z' is not an unary expression.-assignment_expression :: { CExpr }-assignment_expression-  : conditional_expression-  	{ $1 }--  | unary_expression assignment_operator assignment_expression-  	{% withNodeInfo $1 $ CAssign (unL $2) $1 $3 }---assignment_operator :: { Located CAssignOp }-assignment_operator-  : '='			{ L CAssignOp (posOf $1) }-  | "*="		{ L CMulAssOp (posOf $1) }-  | "/="		{ L CDivAssOp (posOf $1) }-  | "%="		{ L CRmdAssOp (posOf $1) }-  | "+="		{ L CAddAssOp (posOf $1) }-  | "-="		{ L CSubAssOp (posOf $1) }-  | "<<="		{ L CShlAssOp (posOf $1) }-  | ">>="		{ L CShrAssOp (posOf $1) }-  | "&="		{ L CAndAssOp (posOf $1) }-  | "^="		{ L CXorAssOp (posOf $1) }-  | "|="		{ L COrAssOp  (posOf $1) }----- parse C expression (C99 6.5.17)----expression :: { CExpr }-expression-  : assignment_expression-  	{ $1 }--  | assignment_expression ',' comma_expression-  	{% let es = reverse $3 in withNodeInfo es $ CComma ($1:es) }--comma_expression :: { Reversed [CExpr] }-comma_expression-  : assignment_expression			{ singleton $1 }-  | comma_expression ',' assignment_expression	{ $1 `snoc` $3 }----- The following was used for clarity-expression_opt :: { Maybe CExpr }-expression_opt-  : {- empty -}		{ Nothing }-  | expression		{ Just $1 }----- The following was used for clarity-assignment_expression_opt :: { Maybe CExpr }-assignment_expression_opt-  : {- empty -}				{ Nothing }-  | assignment_expression		{ Just $1 }----- parse C constant expression (C99 6.6)----constant_expression :: { CExpr }-constant_expression-  : conditional_expression			{ $1 }----- parse C constants----constant :: { CConst }-constant-  : cint	  {% withNodeInfo $1 $ case $1 of CTokILit _ i -> CIntConst i }-  | cchar	  {% withNodeInfo $1 $ case $1 of CTokCLit _ c -> CCharConst c }-  | cfloat	{% withNodeInfo $1 $ case $1 of CTokFLit _ f -> CFloatConst f }---string_literal :: { CStrLit }-string_literal-  : cstr-  	{% withNodeInfo $1 $ case $1 of CTokSLit _ s -> CStrLit s }--  | cstr string_literal_list-  	{% withNodeInfo $1 $ case $1 of CTokSLit _ s -> CStrLit (concatCStrings (s : reverse $2)) }---string_literal_list :: { Reversed [CString] }-string_literal_list-  : cstr			{ case $1 of CTokSLit _ s -> singleton s }-  | string_literal_list cstr	{ case $2 of CTokSLit _ s -> $1 `snoc` s }--clang_version_literal :: { ClangCVersion }-  : clangcversion       { $1 }--identifier :: { Ident }-identifier-  : ident		{ $1 }-  | tyident		{ $1 }----- parse GNU C attribute annotation-attrs_opt ::	{ [CAttr] }-attrs_opt-  : {- empty -}						{ [] }-  | attrs         				{ $1 }---- GNU C attribute annotation-attrs :: { [CAttr] }-attrs-  : attr						{ $1 }-  | attrs attr	    { $1 ++ $2 }--attr :: { [CAttr] }-attr-  : "__attribute__" '(' '(' attribute_list ')' ')'	{ reverse $4 }--attribute_list :: { Reversed [CAttr] }-  : attribute						          { case $1 of Nothing -> empty; Just attr -> singleton attr }-  | attribute_list ',' attribute	{ (maybe id (flip snoc) $3) $1 }---attribute :: { Maybe CAttr }-attribute-  : {- empty -}						         { Nothing }-  | ident						               {% withNodeInfo $1 $ Just . CAttr $1  [] }-  | const						               {% withNodeInfo $1 $ Just . CAttr (internalIdent "const") [] }-  | ident '(' attribute_params ')' {% withNodeInfo $1 $ Just . CAttr $1 (reverse $3) }-  | ident '(' ')'					         {% withNodeInfo $1 $ Just . CAttr $1 [] }---- OS X 10.9 (Mavericks) makes use of more liberal attribute syntax--- that includes assignment-like expressions referencing version--- numbers.--attribute_params :: { Reversed [CExpr] }-attribute_params-  : constant_expression					              { singleton $1 }-  | unary_expression assignment_operator clang_version_literal { Reversed [] }-  | unary_expression assignment_operator unary_expression { Reversed [] }-  | attribute_params ',' constant_expression	{ $1 `snoc` $3 }-  | attribute_params ',' unary_expression assignment_operator unary_expression { $1 }-  | attribute_params ',' unary_expression assignment_operator clang_version_literal { $1 }--{----  sometimes it is neccessary to reverse an unreversed list-reverseList :: [a] -> Reversed [a]-reverseList = Reversed . List.reverse---- We occasionally need things to have a location when they don't naturally--- have one built in as tokens and most AST elements do.----data Located a = L !a !Position--unL :: Located a -> a-unL (L a pos) = a--instance Pos (Located a) where-  posOf (L _ pos) = pos---- FIXME: the next 3 inlines here increase the object file size by  70%--- Check whether the speed win is worth it-{-# INLINE withNodeInfo #-}-withNodeInfo :: Pos node => node -> (NodeInfo -> a) -> P a-withNodeInfo node mkAttrNode = do-  name <- getNewName-  lastTok <- getSavedToken-  let firstPos = posOf node-  let attrs = mkNodeInfo' firstPos (posLenOfTok $! lastTok) name-  attrs `seq` return (mkAttrNode attrs)--{-# INLINE withLength #-}-withLength :: NodeInfo -> (NodeInfo -> a) -> P a-withLength nodeinfo mkAttrNode = do-  lastTok <- getSavedToken-  let firstPos = posOfNode nodeinfo-  let attrs = mkNodeInfo' firstPos (posLenOfTok $! lastTok)-              (maybe (error "nameOfNode") id (nameOfNode nodeinfo))-  attrs `seq` return (mkAttrNode attrs)--data CDeclrR = CDeclrR (Maybe Ident) (Reversed [CDerivedDeclr]) (Maybe CStrLit) [CAttr] NodeInfo-reverseDeclr :: CDeclrR -> CDeclr-reverseDeclr (CDeclrR ide reversedDDs asmname cattrs at)-    = CDeclr ide (reverse reversedDDs) asmname cattrs at-instance CNode (CDeclrR) where-    nodeInfo (CDeclrR _ _ _ _ n) = n-instance Pos (CDeclrR) where-    posOf (CDeclrR _ _ _ _ n) = posOf n--{-# INLINE withAttribute #-}-withAttribute :: Pos node => node -> [CAttr] -> (NodeInfo -> CDeclrR) -> P CDeclrR-withAttribute node cattrs mkDeclrNode = do-  name <- getNewName-  let attrs = mkNodeInfo (posOf node) name-  let newDeclr = appendDeclrAttrs cattrs $ mkDeclrNode attrs-  attrs `seq` newDeclr `seq` return newDeclr---- postfixing variant-{-# INLINE withAttributePF #-}-withAttributePF :: Pos node => node -> [CAttr] -> (NodeInfo -> CDeclrR -> CDeclrR) -> P (CDeclrR -> CDeclrR)-withAttributePF node cattrs mkDeclrCtor = do-  name <- getNewName-  let attrs = mkNodeInfo (posOf node) name-  let newDeclr = appendDeclrAttrs cattrs . mkDeclrCtor attrs-  attrs `seq` newDeclr `seq` return newDeclr---- add top level attributes for a declarator.------ In the following example------ > int declr1, __attribute__((a1)) * __attribute__((a2)) y() __asm__("$" "y") __attribute__((a3));------ the attributes `a1' and `a3' are top-level attributes for y.--- The (pseudo)-AST for the second declarator is------ > CDeclr "y"--- >        [CFunDeclr ..., CPtrDeclr __attribute__((a2)) ... ]--- >        (asm "$y")--- >        [__attribute__((a1)), __attribute__((a3)) ]------ So assembler names and preceeding and trailing attributes are recorded in object declarator.----appendObjAttrs :: [CAttr] -> CDeclr -> CDeclr-appendObjAttrs newAttrs (CDeclr ident indirections asmname cAttrs at)-    = CDeclr ident indirections asmname (cAttrs ++ newAttrs) at-appendObjAttrsR :: [CAttr] -> CDeclrR -> CDeclrR-appendObjAttrsR newAttrs (CDeclrR ident indirections asmname cAttrs at)-    = CDeclrR ident indirections asmname (cAttrs ++ newAttrs) at--setAsmName :: Maybe CStrLit  -> CDeclrR -> P CDeclrR-setAsmName mAsmName (CDeclrR ident indirections oldName cattrs at) =-    case combineName mAsmName oldName of-        Left (n1,n2)       -> failP (posOf n2) ["Duplicate assembler name: ",showName n1,showName n2]-        Right newName      -> return $ CDeclrR ident indirections newName cattrs at-  where-  combineName Nothing Nothing = Right Nothing-  combineName Nothing oldname@(Just _)  = Right oldname-  combineName newname@(Just _) Nothing  = Right newname-  combineName (Just n1) (Just n2) = Left (n1,n2)-  showName (CStrLit cstr _) = show cstr--withAsmNameAttrs :: (Maybe CStrLit, [CAttr]) -> CDeclrR -> P CDeclrR-withAsmNameAttrs (mAsmName, newAttrs) declr = setAsmName mAsmName (appendObjAttrsR newAttrs declr)--appendDeclrAttrs :: [CAttr] -> CDeclrR -> CDeclrR-appendDeclrAttrs newAttrs (CDeclrR ident (Reversed []) asmname cattrs at)-    = CDeclrR ident empty asmname (cattrs ++ newAttrs) at-appendDeclrAttrs newAttrs (CDeclrR ident (Reversed (x:xs)) asmname cattrs at)-    = CDeclrR ident (Reversed (appendAttrs x : xs)) asmname cattrs at where-    appendAttrs (CPtrDeclr typeQuals at)           = CPtrDeclr (typeQuals ++ map CAttrQual newAttrs) at-    appendAttrs (CArrDeclr typeQuals arraySize at) = CArrDeclr (typeQuals ++ map CAttrQual newAttrs) arraySize at-    appendAttrs (CFunDeclr parameters cattrs at)   = CFunDeclr parameters (cattrs ++ newAttrs) at--ptrDeclr :: CDeclrR -> [CTypeQual] -> NodeInfo -> CDeclrR-ptrDeclr (CDeclrR ident derivedDeclrs asmname cattrs dat) tyquals at-    = CDeclrR ident (derivedDeclrs `snoc` CPtrDeclr tyquals at) asmname cattrs dat-funDeclr :: CDeclrR -> (Either [Ident] ([CDecl],Bool)) -> [CAttr] -> NodeInfo -> CDeclrR-funDeclr (CDeclrR ident derivedDeclrs asmname dcattrs dat) params cattrs at-    = CDeclrR ident (derivedDeclrs `snoc` CFunDeclr params cattrs at) asmname dcattrs dat-arrDeclr :: CDeclrR -> [CTypeQual] -> Bool -> Bool -> Maybe CExpr -> NodeInfo -> CDeclrR-arrDeclr (CDeclrR ident derivedDeclrs asmname cattrs dat) tyquals var_sized static_size size_expr_opt at-    = arr_sz `seq` ( CDeclrR ident (derivedDeclrs `snoc` CArrDeclr tyquals arr_sz at) asmname cattrs dat )-    where-    arr_sz = case size_expr_opt of-                 Just e  -> CArrSize static_size e-                 Nothing -> CNoArrSize var_sized--liftTypeQuals :: Reversed [CTypeQual] -> [CDeclSpec]-liftTypeQuals = map CTypeQual . reverse---- lift CAttrs to DeclSpecs----liftCAttrs :: [CAttr] -> [CDeclSpec]-liftCAttrs = map (CTypeQual . CAttrQual)---- when we parsed (decl_spec_1,...,decl_spec_n,attrs), add the __attributes__s to the declspec list--- needs special care when @decl_spec_n@ is a SUE definition-addTrailingAttrs :: Reversed [CDeclSpec] -> [CAttr] -> Reversed [CDeclSpec]-addTrailingAttrs declspecs new_attrs =-    case viewr declspecs of-        (specs_init, CTypeSpec (CSUType (CStruct tag name (Just def) def_attrs su_node) node))-            -> (specs_init `snoc` CTypeSpec (CSUType (CStruct tag name (Just def) (def_attrs ++ new_attrs) su_node) node))-        (specs_init, CTypeSpec (CEnumType (CEnum name (Just def) def_attrs e_node) node))-            -> (specs_init `snoc` CTypeSpec (CEnumType (CEnum name (Just def) (def_attrs ++ new_attrs) e_node) node))-        _ -> declspecs `rappend` (liftCAttrs new_attrs)---- convenient instance, the position of a list of things is the position of--- the first thing in the list----instance Pos a => Pos [a] where-  posOf (x:_) = posOf x--instance Pos a => Pos (Reversed a) where-  posOf (Reversed x) = posOf x--emptyDeclr :: CDeclrR-emptyDeclr       = CDeclrR Nothing empty Nothing [] undefNode-mkVarDeclr :: Ident -> NodeInfo -> CDeclrR-mkVarDeclr ident = CDeclrR (Just ident) empty Nothing []---- Take the identifiers and use them to update the typedef'ed identifier set--- if the decl is defining a typedef then we add it to the set,--- if it's a var decl then that shadows typedefed identifiers----doDeclIdent :: [CDeclSpec] -> CDeclrR -> P ()-doDeclIdent declspecs (CDeclrR mIdent _ _ _ _) =-  case mIdent of-    Nothing -> return ()-    Just ident | any iypedef declspecs -> addTypedef ident-               | otherwise             -> shadowTypedef ident--  where iypedef (CStorageSpec (CTypedef _)) = True-        iypedef _                           = False--doFuncParamDeclIdent :: CDeclr -> P ()-doFuncParamDeclIdent (CDeclr _ (CFunDeclr params _ _ : _) _ _ _) =-  sequence_-    [ case getCDeclrIdent declr of-        Nothing -> return ()-        Just ident -> shadowTypedef ident-    | CDecl _ dle _  <- either (const []) fst params-    , (Just declr, _, _) <- dle ]-doFuncParamDeclIdent _ = return ()---- extract all identifiers-getCDeclrIdent :: CDeclr -> Maybe Ident-getCDeclrIdent (CDeclr mIdent _ _ _ _) = mIdent--happyError :: P a-happyError = parseError---- * public interface---- | @parseC input initialPos@ parses the given preprocessed C-source input and returns the AST or a list of parse errors.-parseC :: InputStream -> Position -> Either ParseError CTranslUnit-parseC input initialPosition =-  fmap fst $ execParser translUnitP input initialPosition builtinTypeNames (namesStartingFrom 0)---- | @translUnitP@ provides a parser for a complete C translation unit, i.e. a list of external declarations.-translUnitP :: P CTranslUnit-translUnitP = translation_unit--- | @extDeclP@ provides a parser for an external (file-scope) declaration-extDeclP :: P CExtDecl-extDeclP = external_declaration--- | @statementP@ provides a parser for C statements-statementP :: P CStat-statementP = statement--- | @expressionP@ provides a parser for C expressions-expressionP :: P CExpr-expressionP = expression-}+-----------------------------------------------------------------------------
+-- Module      :  Parser.y
+-- Copyright   :  (c) 2005-2007 Duncan Coutts
+--                (c) 2008 Benedikt Huber
+--                (c) [1999..2004] Manuel M T Chakravarty
+--                Portions copyright 1989, 1990 James A. Roskind
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Portability :  portable
+--
+--  Parser for C translation units, which have already been run through the C
+--  preprocessor. It is recommended to use the `strict' flag for happy.
+--
+--  The parser recognizes all of ISO C 99 and most GNU C extensions.
+--
+--  With C99 we refer to the ISO C99 standard, specifically the section numbers
+--  used below refer to this report:
+--
+--    <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf>
+--
+-- GNU extensions are documented in the gcc parser
+--
+--    <http://gcc.gnu.org/viewcvs/trunk/gcc/c-parser.c>
+--
+-- and in: <http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html>
+--
+-- The set of supported extensions is documented in
+--
+--    <http://www.sivity.net/projects/language.c/wiki/Cee>
+------------------------------------------------------------------
+{
+module Language.C.Parser.Parser (
+  -- * Parse a C translation unit
+  parseC,
+  -- * Exposed Parsers
+  translUnitP, extDeclP, statementP, expressionP
+) where
+
+-- Relevant C99 sections:
+--
+-- 6.5 Expressions .1 - .17 and 6.6 (almost literally)
+--  Supported GNU extensions:
+--     - Allow a compound statement as an expression
+--     - Various __builtin_* forms that take type parameters
+--     - `alignof' expression or type
+--     - `__extension__' to suppress warnings about extensions
+--     - Allow taking address of a label with: && label
+--     - Omitting the `then' part of conditional expressions
+--     - complex numbers
+--
+-- 6.7 C Declarations .1 -.8
+--  Supported GNU extensions:
+--     - '__thread' thread local storage (6.7.1)
+--
+-- 6.8 Statements .1 - .8
+--  Supported GNU extensions:
+--    - case ranges (C99 6.8.1)
+--    - '__label__ ident;' declarations (C99 6.8.2)
+--    - computed gotos (C99 6.8.6)
+--
+-- 6.9 Translation unit
+--  Supported GNU extensions:
+--     - allow empty translation_unit
+--     - allow redundant ';'
+--     - allow extension keyword before external declaration
+--     - asm definitions
+--
+--  Since some of the grammar productions are quite difficult to read,
+--  (especially those involved with the decleration syntax) we document them
+--  with an extended syntax that allows a more consise representation:
+--
+--  Ordinary rules
+--
+--   foo      named terminal or non-terminal
+--
+--   'c'      terminal, literal character token
+--
+--   A B      concatenation
+--
+--   A | B    alternation
+--
+--   (A)      grouping
+--
+--  Extended rules
+--
+--   A?       optional, short hand for (A|) or [A]{ 0==A || 1==A }
+--
+--   ...      stands for some part of the grammar omitted for clarity
+--
+--   {A}      represents sequences, 0 or more.
+--
+--   <permute> modifier which states that any permutation of the immediate subterms is valid
+--
+--
+--- TODO ----------------------------------------------------------------------
+--
+--  !* We ignore C11 _Atomic type annotations
+--  !* We ignore the C99 static keyword (see C99 6.7.5.3)
+--  !* We do not distinguish in the AST between incomplete array types and
+--      complete variable length arrays ([ '*' ] means the latter). (see C99 6.7.5.2)
+--  !* The AST doesn't allow recording __attribute__ of unnamed struct field
+--     (see , struct_default_declaring_list, struct_identifier_declarator)
+--  !* see `We're being far to liberal here' (... struct definition within structs)
+--  * Documentation isn't complete and consistent yet.
+
+import Prelude    hiding (reverse)
+import qualified Data.List as List
+import Control.Monad (mplus)
+import Language.C.Parser.Builtin   (builtinTypeNames)
+import Language.C.Parser.Lexer     (lexC, parseError)
+import Language.C.Parser.Tokens    (CToken(..), GnuCTok(..), ClangCTok (..), posLenOfTok)
+import Language.C.Parser.ParserMonad (P, failP, execParser, getNewName, addTypedef, shadowTypedef, getCurrentPosition,
+                                      enterScope, leaveScope, getLastToken, getSavedToken, ParseError(..))
+
+import Language.C.Data.RList
+import Language.C.Data.InputStream
+import Language.C.Data.Ident
+import Language.C.Data.Name
+import Language.C.Data.Node
+import Language.C.Data.Position
+import Language.C.Syntax
+
+}
+-- in order to document the parsers, we have to alias them
+%name translation_unit translation_unit
+%name external_declaration external_declaration
+%name statement statement
+%name expression expression
+
+%tokentype { CToken }
+
+%monad { P } { >>= } { return }
+%lexer { lexC } { CTokEof }
+
+%expect 1
+
+%token
+
+'('		{ CTokLParen	_ }
+')'		{ CTokRParen	_ }
+'['		{ CTokLBracket	_ }
+']'		{ CTokRBracket	_ }
+"->"		{ CTokArrow	_ }
+'.'		{ CTokDot	_ }
+'!'		{ CTokExclam	_ }
+'~'		{ CTokTilde	_ }
+"++"		{ CTokInc	_ }
+"--"		{ CTokDec	_ }
+'+'		{ CTokPlus	_ }
+'-'		{ CTokMinus	_ }
+'*'		{ CTokStar	_ }
+'/'		{ CTokSlash	_ }
+'%'		{ CTokPercent	_ }
+'&'		{ CTokAmper	_ }
+"<<"		{ CTokShiftL	_ }
+">>"		{ CTokShiftR	_ }
+'<'		{ CTokLess	_ }
+"<="		{ CTokLessEq	_ }
+'>'		{ CTokHigh	_ }
+">="		{ CTokHighEq	_ }
+"=="		{ CTokEqual	_ }
+"!="		{ CTokUnequal	_ }
+'^'		{ CTokHat	_ }
+'|'		{ CTokBar	_ }
+"&&"		{ CTokAnd	_ }
+"||"		{ CTokOr	_ }
+'?'		{ CTokQuest	_ }
+':'		{ CTokColon	_ }
+'='		{ CTokAssign	_ }
+"+="		{ CTokPlusAss	_ }
+"-="		{ CTokMinusAss	_ }
+"*="		{ CTokStarAss	_ }
+"/="		{ CTokSlashAss	_ }
+"%="		{ CTokPercAss	_ }
+"&="		{ CTokAmpAss	_ }
+"^="		{ CTokHatAss	_ }
+"|="		{ CTokBarAss	_ }
+"<<="		{ CTokSLAss	_ }
+">>="		{ CTokSRAss	_ }
+','		{ CTokComma	_ }
+';'		{ CTokSemic	_ }
+'{'		{ CTokLBrace	_ }
+'}'		{ CTokRBrace	_ }
+"..."		{ CTokEllipsis	_ }
+alignof		{ CTokAlignof	_ }
+alignas         { CTokAlignas   _ }
+"_Atomic"       { CTokAtomic    _ }
+asm		{ CTokAsm	_ }
+auto		{ CTokAuto	_ }
+break		{ CTokBreak	_ }
+"_Bool"		{ CTokBool	_ }
+case		{ CTokCase	_ }
+char		{ CTokChar	_ }
+const		{ CTokConst	_ }
+continue	{ CTokContinue	_ }
+"_Complex"	{ CTokComplex	_ }
+default		{ CTokDefault	_ }
+do		{ CTokDo	_ }
+double		{ CTokDouble	_ }
+else		{ CTokElse	_ }
+enum		{ CTokEnum	_ }
+extern		{ CTokExtern	_ }
+float		{ CTokFloat	_ }
+"__float128"	{ CTokFloat128	_ }
+"_Float128"	{ CTokFloat128	_ }
+for		{ CTokFor	_ }
+"_Generic"      { CTokGeneric   _ }
+goto		{ CTokGoto	_ }
+if		{ CTokIf	_ }
+inline		{ CTokInline	_ }
+int		{ CTokInt	_ }
+"__int128"      { CTokInt128    _ }
+long		{ CTokLong	_ }
+"__label__"	{ CTokLabel	_ }
+"_Noreturn"     { CTokNoreturn  _ }
+"_Nullable"     { CTokNullable  _ }
+"_Nonnull"      { CTokNonnull   _ }
+register	{ CTokRegister	_ }
+restrict	{ CTokRestrict	_ }
+return		{ CTokReturn	_ }
+short		{ CTokShort	_ }
+signed		{ CTokSigned	_ }
+sizeof		{ CTokSizeof	_ }
+static		{ CTokStatic	_ }
+"_Static_assert"{ CTokStaticAssert _ }
+struct		{ CTokStruct	_ }
+switch		{ CTokSwitch	_ }
+typedef		{ CTokTypedef	_ }
+typeof		{ CTokTypeof	_ }
+"__thread"	{ CTokThread	_ }
+union		{ CTokUnion	_ }
+unsigned	{ CTokUnsigned	_ }
+void		{ CTokVoid	_ }
+volatile	{ CTokVolatile	_ }
+while		{ CTokWhile	_ }
+cchar		{ CTokCLit   _ _ }		-- character constant
+cint		{ CTokILit   _ _ }		-- integer constant
+cfloat		{ CTokFLit   _ _ }		-- float constant
+cstr		{ CTokSLit   _ _ }		-- string constant (no escapes)
+ident		{ CTokIdent  _ $$ }		-- identifier
+tyident		{ CTokTyIdent _ $$ }		-- `typedef-name' identifier
+"__attribute__"	{ CTokGnuC GnuCAttrTok _ }	-- special GNU C tokens
+"__extension__"	{ CTokGnuC GnuCExtTok  _ }	-- special GNU C tokens
+"__real__"        { CTokGnuC GnuCComplexReal _ }
+"__imag__"        { CTokGnuC GnuCComplexImag _ }
+-- special GNU C builtin 'functions' that actually take types as parameters:
+"__builtin_va_arg"		{ CTokGnuC GnuCVaArg    _ }
+"__builtin_offsetof"		{ CTokGnuC GnuCOffsetof _ }
+"__builtin_types_compatible_p"	{ CTokGnuC GnuCTyCompat _ }
+"__builtin_convertvector"	{ CTokClangC _ ClangBuiltinConvertVector }
+clangcversion   { CTokClangC _ (ClangCVersionTok $$) } -- Clang version literal
+
+%%
+
+
+-- parse a complete C translation unit
+-- we have to take special care of empty translation units
+translation_unit :: { CTranslUnit }
+translation_unit
+  : ext_decl_list	{% let decls = reverse $1 in
+                       case decls of
+                           []     -> do{ n <- getNewName; p <- getCurrentPosition; return $ CTranslUnit decls (mkNodeInfo' p (p,0) n) }
+                           (d:ds) -> withNodeInfo d $ CTranslUnit decls }
+
+
+-- parse a list of external declarations, making up a C translation unit (C99 6.9)
+--
+-- * GNU extensions:
+--     allow empty translation_unit
+--     allow redundant ';'
+ext_decl_list :: { Reversed [CExtDecl] }
+ext_decl_list
+  : {- empty -}					        { empty }
+  | ext_decl_list ';'			        { $1 }
+  | ext_decl_list external_declaration	{ $1 `snoc` $2 }
+
+
+-- parse external C declaration (C99 6.9)
+--
+-- * GNU extensions:
+--     allow extension keyword before external declaration (TODO: discarded)
+--     asm definitions
+external_declaration :: { CExtDecl }
+external_declaration
+  : function_definition		                  { CFDefExt $1 }
+  | declaration			                  { CDeclExt $1 }
+  | "__extension__" external_declaration          { $2 }
+  | asm '(' string_literal ')' ';'		  {% withNodeInfo $1 $ CAsmExt $3 }
+
+
+-- parse C function definition (C99 6.9.1)
+--
+-- function_definition :- specifiers? fun-declarator compound-statement
+--                        specifiers? old-fun-declarator  declaration-list compound-statement
+--
+-- The specifiers are a list consisting of type-names (int, struct foo, ...),
+-- storage-class specifiers (extern, static,...) and type qualifiers (const, volatile, ...).
+--
+--   declaration_specifier      :- <permute> type-qualifier* storage-class+ typename+    "extern unsigned static volatile int f()"
+--   type_specifier             :- <permute> type-qualifier* typename+                   "const int f()", "long int f()"
+--   declaration_qualifier_list :- <permute> type_qualifier* storage-class+              "extern static const f()"
+--   type_qualifier_list        :- type-qualifier+                                       "const f()"
+--
+-- * GNU extension:
+--    __attribute__ annotations
+--
+function_definition :: { CFunDef }
+function_definition
+  :                            function_declarator compound_statement
+	  {% leaveScope >> (withNodeInfo $1 $ CFunDef [] $1 [] $2) }
+
+  | attrs                      function_declarator compound_statement
+	  {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftCAttrs $1) $2 [] $3) }
+
+  | declaration_specifier      function_declarator compound_statement
+	  {% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) }
+
+  | type_specifier             function_declarator compound_statement
+	  {% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) }
+
+  | declaration_qualifier_list function_declarator compound_statement
+	  {% leaveScope >> (withNodeInfo $1 $ CFunDef (reverse $1) $2 [] $3) }
+
+  | type_qualifier_list        function_declarator compound_statement
+	  {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1) $2 [] $3) }
+
+  | type_qualifier_list  attrs function_declarator compound_statement
+	  {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1 ++ liftCAttrs $2) $3 [] $4) }
+
+  -- old function declarators
+
+  |                            function_declarator_old declaration_list compound_statement
+  	{% withNodeInfo $1 $ CFunDef [] $1 (reverse $2) $3 }
+
+  |                      attrs function_declarator_old declaration_list compound_statement
+  	{% withNodeInfo $2 $ CFunDef (liftCAttrs $1) $2 (reverse $3) $4 }
+
+  | declaration_specifier      function_declarator_old declaration_list compound_statement
+  	{% withNodeInfo $1 $ CFunDef $1 $2 (reverse $3) $4 }
+
+  | type_specifier             function_declarator_old declaration_list compound_statement
+  	{% withNodeInfo $1 $ CFunDef $1 $2 (reverse $3) $4 }
+
+  | declaration_qualifier_list function_declarator_old declaration_list compound_statement
+  	{% withNodeInfo $1 $ CFunDef (reverse $1) $2 (reverse $3) $4 }
+
+  | type_qualifier_list   function_declarator_old declaration_list compound_statement
+  	{% withNodeInfo $1 $ CFunDef (liftTypeQuals $1) $2 (reverse $3) $4 }
+
+  | type_qualifier_list attrs  function_declarator_old declaration_list compound_statement
+  	{% withNodeInfo $1 $ CFunDef (liftTypeQuals $1  ++ liftCAttrs $2) $3 (reverse $4) $5 }
+
+-- Read declarator and put function
+function_declarator :: { CDeclr }
+function_declarator
+  : identifier_declarator
+  	{% let declr = reverseDeclr $1 in
+  	   enterScope >> doFuncParamDeclIdent declr >> return declr }
+
+
+-- parse C statement (C99 6.8)
+--
+-- * GNU extension: ' __asm__ (...); ' statements
+--
+statement :: { CStat }
+statement
+  : labeled_statement			{ $1 }
+  | compound_statement		{ $1 }
+  | expression_statement	{ $1 }
+  | selection_statement		{ $1 }
+  | iteration_statement		{ $1 }
+  | jump_statement			  { $1 }
+  | asm_statement			    {% withNodeInfo $1 (CAsm $1) }
+
+
+-- parse C labeled statement (C99 6.8.1)
+--
+-- * GNU extension: case ranges
+--
+labeled_statement :: { CStat }
+labeled_statement
+  : identifier ':' attrs_opt statement		{% withNodeInfo $1 $ CLabel $1 $4 $3 }
+  | case constant_expression ':' statement	{% withNodeInfo $1 $ CCase $2 $4 }
+  | default ':' statement			{% withNodeInfo $1 $ CDefault $3 }
+  | case constant_expression "..." constant_expression ':' statement
+  	{% withNodeInfo $1 $ CCases $2 $4 $6 }
+
+
+-- parse C compound statement (C99 6.8.2)
+--
+-- * GNU extension: '__label__ ident;' declarations
+--
+compound_statement :: { CStat }
+compound_statement
+  : '{' enter_scope block_item_list leave_scope '}'
+  	{% withNodeInfo $1 $ CCompound [] (reverse $3) }
+
+  | '{' enter_scope label_declarations block_item_list leave_scope '}'
+  	{% withNodeInfo $1 $ CCompound (reverse $3) (reverse $4) }
+
+
+-- No syntax for these, just side effecting semantic actions.
+--
+enter_scope :: { () }
+enter_scope : {% enterScope }
+leave_scope :: { () }
+leave_scope : {% leaveScope }
+
+
+block_item_list :: { Reversed [CBlockItem] }
+block_item_list
+  : {- empty -}			{ empty }
+  | block_item_list block_item	{ $1 `snoc` $2 }
+
+block_item :: { CBlockItem }
+block_item
+  : statement			{ CBlockStmt $1 }
+  | nested_declaration		{ $1 }
+
+nested_declaration :: { CBlockItem }
+nested_declaration
+  : declaration				{ CBlockDecl $1 }
+  | nested_function_definition		{ CNestedFunDef $1 }
+  | "__extension__" nested_declaration	{ $2 }
+
+nested_function_definition :: { CFunDef }
+nested_function_definition
+  : declaration_specifier      function_declarator compound_statement
+	{% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) }
+
+  | type_specifier             function_declarator compound_statement
+	{% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) }
+
+  | declaration_qualifier_list function_declarator compound_statement
+	{% leaveScope >> (withNodeInfo $1 $ CFunDef (reverse $1) $2 [] $3) }
+
+  | type_qualifier_list   function_declarator compound_statement
+	{% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1) $2 [] $3) }
+
+  | type_qualifier_list   attrs function_declarator compound_statement
+	{% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1 ++ liftCAttrs $2) $3 [] $4) }
+
+
+label_declarations :: { Reversed [Ident] }
+label_declarations
+  : "__label__" identifier_list ';'			{ $2  }
+  | label_declarations "__label__" identifier_list ';'	{ $1 `rappendr` $3 }
+
+
+-- parse C expression statement (C99 6.8.3)
+--
+expression_statement :: { CStat }
+expression_statement
+  : ';'				{% withNodeInfo $1 $ CExpr Nothing }
+  | expression ';'		{% withNodeInfo $1 $ CExpr (Just $1) }
+
+
+-- parse C selection statement (C99 6.8.4)
+--
+selection_statement :: { CStat }
+selection_statement
+  : if '(' expression ')' statement
+	{% withNodeInfo $1 $ CIf $3 $5 Nothing }
+
+  | if '(' expression ')' statement else statement
+	{% withNodeInfo $1 $ CIf $3 $5 (Just $7) }
+
+  | switch '(' expression ')' statement
+	{% withNodeInfo $1 $ CSwitch $3 $5 }
+
+
+-- parse C iteration statement (C99 6.8.5)
+--
+iteration_statement :: { CStat }
+iteration_statement
+  : while '(' expression ')' statement
+  	{% withNodeInfo $1 $ CWhile $3 $5 False }
+
+  | do statement while '(' expression ')' ';'
+  	{% withNodeInfo $1 $ CWhile $5 $2 True }
+
+  | for '(' expression_opt ';' expression_opt ';' expression_opt ')' statement
+	{% withNodeInfo $1 $ CFor (Left $3) $5 $7 $9 }
+
+  | for '(' enter_scope declaration expression_opt ';' expression_opt ')' statement leave_scope
+	{% withNodeInfo $1 $ CFor (Right $4) $5 $7 $9 }
+
+
+-- parse C jump statement (C99 6.8.6)
+--
+-- * GNU extension: computed gotos
+--
+jump_statement :: { CStat }
+jump_statement
+  : goto identifier ';'			{% withNodeInfo $1 $ CGoto $2 }
+  | goto '*' expression ';'		{% withNodeInfo $1 $ CGotoPtr $3 }
+  | continue ';'			    {% withNodeInfo $1 $ CCont }
+  | break ';'				    {% withNodeInfo $1 $ CBreak }
+  | return expression_opt ';'	{% withNodeInfo $1 $ CReturn $2 }
+
+
+-- parse GNU C __asm__ statement (compatible with C99: J.5.10)
+--
+-- asm_stmt    :- asm volatile? ( "asm..." : output-operands : input-operands : asm-clobbers )
+-- asm_operand :- [operand-name] "constraint" ( expr )
+-- asm_clobber :- "r1", "r2", ...
+--
+asm_statement :: { CAsmStmt }
+asm_statement
+  : asm maybe_type_qualifier '(' string_literal ')' ';'
+  	{% withNodeInfo $1 $ CAsmStmt $2 $4 [] [] [] }
+
+  | asm maybe_type_qualifier '(' string_literal ':' asm_operands ')' ';'
+  	{% withNodeInfo $1 $ CAsmStmt $2 $4 $6 [] [] }
+
+  | asm maybe_type_qualifier '(' string_literal ':' asm_operands ':' asm_operands ')' ';'
+  	{% withNodeInfo $1 $ CAsmStmt $2 $4 $6 $8 [] }
+
+  | asm maybe_type_qualifier '(' string_literal ':' asm_operands ':' asm_operands ':' asm_clobbers ')' ';'
+  	{% withNodeInfo $1 $ CAsmStmt $2 $4 $6 $8 (reverse $10) }
+
+
+maybe_type_qualifier :: { Maybe CTypeQual }
+maybe_type_qualifier
+  : {- empty -}		  { Nothing }
+  | type_qualifier	  { Just $1 }
+
+asm_operands :: { [CAsmOperand] }
+asm_operands
+  : {- empty -}				{ [] }
+  | nonnull_asm_operands    { reverse $1 }
+
+nonnull_asm_operands :: { Reversed [CAsmOperand] }
+nonnull_asm_operands
+  : asm_operand					          { singleton $1 }
+  | nonnull_asm_operands ',' asm_operand  { $1 `snoc` $3 }
+
+asm_operand :: { CAsmOperand }
+asm_operand
+  : string_literal '(' expression ')'			      {% withNodeInfo $1 $ CAsmOperand Nothing $1 $3 }
+  | '[' ident ']' string_literal '(' expression ')'   {% withNodeInfo $1 $ CAsmOperand (Just $2) $4 $6 }
+  | '[' tyident ']' string_literal '(' expression ')' {% withNodeInfo $1 $ CAsmOperand (Just $2) $4 $6 }
+
+
+asm_clobbers :: { Reversed [CStrLit] }
+asm_clobbers
+  : string_literal			        { singleton $1 }
+  | asm_clobbers ',' string_literal	{ $1 `snoc` $3 }
+
+{-
+---------------------------------------------------------------------------------------------------------------
+---------------------------------------------------------------------------------------------------------------
+-- Declarations
+---------------------------------------------------------------------------------------------------------------
+---------------------------------------------------------------------------------------------------------------
+
+Declarations are the most complicated part of the grammar, and shall be summarized here.
+To allow a lightweight notation, we will use the modifier <permute> to indicate that the order of the immidieate right-hand sides doesn't matter.
+ - <permute> a* b+ c   === any sequence of a's, b's and c's, which contains exactly 1 'c' and at least one 'b'
+
+-- storage class and type qualifier
+---------------------------------------------------------------------------------------------------------------
+attr                       :-   __attribute__((..))
+storage_class              :-   typedef | extern | static | auto | register | _Thread_local
+function_specifier         :-   inline | _Noreturn
+alignment_specifier        :-   _Alignas (type_name) | _Alignas (constant_expr)
+
+type_qualifier             :-   const | volatile | restrict | _Atomic | _Nullable | _Nonnull
+type_qualifier_list        :-   type_qualifier+
+
+declaration_qualifier      :-   storage_class | type_qualifier | function_specifier | alginment_specifier
+declaration_qualifier_list :-   <permute> type_qualifier* storage_class+
+
+qualifiers                 :-   declaration_qualifier_list | type_qualifier_list
+                           :=   <permute> (type_qualifier|storage_class)+
+
+-- type names
+---------------------------------------------------------------------------------------------------------------
+declaration_specifier      :- <permute> type_qualifier* storage_class+ (basic_type_name+ | elaborated_type_name | tyident )
+type_specifier             :- <permute> type_qualifier* (basic_type_name+ | elaborated_type_name | tyident)
+
+specifiers                 :- declaration_specifier | type_specifier
+                           := <permute> type_qualifier* storage_class* (basic_type_name+ | elaborated_type_name | tyident )
+
+-- struct/union/enum declarations
+---------------------------------------------------------------------------------------------------------------
+sue_declaration_specifier :- <permute> type_qualifier* storage_class+ elaborated_type_name
+sue_type_specifier        :- <permute> type_qualifier* elaborated_type_name
+
+sue_declaration           := sue_declaration_specifier | sue_type_specifier
+                          :- <permute> type_qualifier* storage_class* elaborated_type_name
+
+-- declarators
+---------------------------------------------------------------------------------------------------------------
+identifier_declarator :- ( '*' (type_qualifier | attr)* ) * ident     [ array_decl | "(" parameter-list ")" ]
+                               plus additional parenthesis' ending ^^ here
+typedef_declartor     :-
+declarator            :- identifier_declarator | typedef_declarator
+
+-- Declaration lists
+---------------------------------------------------------------------------------------------------------------
+default_declaring_list :- qualifiers ( identifier_declarator asm*attrs* initializer? )_comma_list
+
+declaring_list         :- specifiers ( declarator asm*attrs* initializer? )_comma_list
+
+declaration_list := default_declaring_list | declaring_list
+
+-- Declaration
+---------------------------------------------------------------------------------------------------------------
+declaration = sue_declaration | declaration_list | _Static_assert(..)
+
+---------------------------------------------------------------------------------------------------------------
+---------------------------------------------------------------------------------------------------------------
+-- Attributes
+-- (citing http://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html)
+---------------------------------------------------------------------------------------------------------------
+---------------------------------------------------------------------------------------------------------------
+
+"Attributes may appear after the colon following a label (expect case and default)"
+
+labeled_statement :- identifier ':' attrs_opt statement
+
+"Attributes may go either immediately after the struct/union/enum keyword or after the closing brace"
+
+struct attrs_opt ...
+struct ... { } attrs_opt
+
+"In general: Attributes appear as part of declarations, either belonging to a declaration or declarator"
+
+"Any list of specifiers and qualifiers at the start of a declaration may contain attribute specifiers"
+"An attribute list may appear immediately before the comma, = or semicolon terminating a declaration of an identifier"
+
+---------------------------------------------------------------------------------------------------------------
+For the parser, we modified the following rules to be interleaved with attributes:
+
+default_declaring_list' :-  (declaration_qualifier_list' | type_qualifier_list' attr*)
+                                             identifier_declarator asm*attr* initializer?
+                                 { ',' attr* identifier_declarator asm*attr* initializer? }
+declaring_list' :-          specifier' declarator asm*attr* initializer?
+                                 { ',' attr* declarator asm*attr* initializer? }
+
+
+type_qualifier_list' is like type_qualifier_list, but with preceeding and/or interleaving (but not terminating) __attribute__ annotations.
+declaration_qualifier_list', declaration_specifier' and type_specifier' are like their unprimed variants, but with arbitrary preceeding, interleaving and/or terminating __attribute__ annotations.
+
+"An attribute list may appear immediately before a declarator other than the first in a comma seperated list of declarators"
+
+"The attribute specifiers may be the only specifiers present (implicit int)" [not supported]
+
+"Attribute specifiers may be mixed with type qualifiers appearing inside the [] of an parameter array declarator"
+
+tbc.
+-}
+
+
+
+-- parse C declaration (C11 6.7)
+--
+-- * new form in C11
+--     _Static_assert(expr,string_literal)
+declaration :: { CDecl }
+declaration
+  : sue_declaration_specifier ';'
+  	{% withNodeInfo $1 $ CDecl (reverse $1) [] }
+
+  | sue_type_specifier ';'
+  	{% withNodeInfo $1 $ CDecl (reverse $1) [] }
+
+  | declaring_list ';'
+  	{% case $1 of CDecl declspecs dies at -> withLength at (CDecl declspecs (List.reverse dies)) }
+
+  | default_declaring_list ';'
+  	{% case $1 of CDecl declspecs dies at -> withLength at (CDecl declspecs (List.reverse dies)) }
+  | "_Static_assert" '(' constant_expression ',' string_literal ')' ';'
+        {% withNodeInfo $1 $ CStaticAssert $3 $5 }
+
+declaration_list :: { Reversed [CDecl] }
+declaration_list
+  : {- empty -}					 { empty }
+  | declaration_list declaration { $1 `snoc` $2 }
+
+
+-- * SUMMARY: default_declaring_list :- qualifier* identifier_declarator asm_attrs initializer?
+--                                                 { ',' identifier_declarator asm_attrs initializer? }
+--
+-- * GNU extensions
+--   __attribute__ annotations imm. before an declarator (see Attribute Syntax, paragraph 11)
+--   asm + __attribute__ annotations (end of declarations, see Attribute Syntax, paragraph 12)
+--   The assembler annotation is used to specifiy an assembler name for the declarator.
+--
+default_declaring_list :: { CDecl }
+default_declaring_list
+  : declaration_qualifier_list identifier_declarator asm_attrs_opt {-{}-} initializer_opt
+  	{% let declspecs = reverse $1 in
+  	   do{ declr <- withAsmNameAttrs $3 $2
+           ; doDeclIdent declspecs declr
+           ; withNodeInfo $1 $
+                CDecl declspecs [(Just (reverseDeclr declr), $4, Nothing)] }}
+
+  | type_qualifier_list identifier_declarator asm_attrs_opt {-{}-} initializer_opt
+  	{% let declspecs = liftTypeQuals $1 in
+  	   do{ declr <- withAsmNameAttrs $3 $2
+           ; doDeclIdent declspecs declr
+           ; withNodeInfo $1 $ CDecl declspecs [(Just (reverseDeclr declr), $4, Nothing)] }}
+
+  | type_qualifier_list attrs identifier_declarator asm_attrs_opt {-{}-} initializer_opt -- FIX 1600
+  	{% let declspecs = liftTypeQuals $1 in
+  	   do{ declr <- withAsmNameAttrs $4 $3
+           ; doDeclIdent declspecs declr
+           ; withNodeInfo $1 $ CDecl (declspecs ++ liftCAttrs $2) [(Just (reverseDeclr declr), $5, Nothing)] }}
+
+  -- GNU extension: __attribute__ as the only qualifier
+  | attrs identifier_declarator asm_attrs_opt {-{}-} initializer_opt
+    {% let declspecs = liftCAttrs $1 in
+       do{ declr <- withAsmNameAttrs $3 $2
+           ; doDeclIdent declspecs declr
+           ; withNodeInfo $1 $ CDecl declspecs [(Just (reverseDeclr declr), $4, Nothing)] }}
+
+  | default_declaring_list ',' attrs_opt identifier_declarator asm_attrs_opt {-{}-} initializer_opt
+  	{% case $1 of
+             CDecl declspecs dies at -> do
+               declr <- withAsmNameAttrs (fst $5, snd $5 ++ $3) $4
+               doDeclIdent declspecs declr
+               withLength at $ CDecl declspecs ((Just (reverseDeclr declr), $6, Nothing) : dies)  }
+
+-- assembler, followed by attribute annotation
+asm_attrs_opt :: { (Maybe CStrLit, [CAttr]) }
+asm_attrs_opt
+  : asm_opt attrs_opt
+  { ($1,$2) }
+
+--
+-- SUMMARY: declaring_list :- specifier* declarator asm_attrs initializer?
+--                                 { ',' declarator asm_attrs initializer? }
+--
+-- GNU extensions:
+--      __attribute__ annotations imm. before an declarator (see Attribute Syntax, paragraph 11)
+--      asm + __attribute__ annotations (end of declarations, see Attribute Syntax, paragraph 12)
+--
+declaring_list :: { CDecl }
+declaring_list
+  : declaration_specifier declarator asm_attrs_opt initializer_opt
+  	{% do{
+  	   declr <- withAsmNameAttrs $3 $2;
+  	   doDeclIdent $1 declr;
+       withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr declr), $4, Nothing)] }
+    }
+
+  | type_specifier declarator asm_attrs_opt initializer_opt
+  	{% do{
+  	   declr <- withAsmNameAttrs $3 $2;
+  	   doDeclIdent $1 declr;
+       withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr declr), $4, Nothing)] }
+    }
+
+  | declaring_list ',' attrs_opt declarator asm_attrs_opt initializer_opt
+  	{% case $1 of
+             CDecl declspecs dies at -> do
+               declr <- withAsmNameAttrs (fst $5, snd $5 ++ $3) $4
+               doDeclIdent declspecs declr
+               return (CDecl declspecs ((Just (reverseDeclr declr), $6, Nothing) : dies) at) }
+
+
+-- parse C declaration specifiers (C99 6.7)
+--
+-- * <permute> type_qualifier* storage_class+ (basic_type_name+ | elaborated_type_name | tyident )
+--
+declaration_specifier :: { [CDeclSpec] }
+declaration_specifier
+  : basic_declaration_specifier		{ reverse $1 }	-- Arithmetic or void
+  | sue_declaration_specifier		{ reverse $1 }	-- Struct/Union/Enum
+  | typedef_declaration_specifier	{ reverse $1 }	-- Typedef
+
+
+-- A mixture of type qualifiers (const, volatile, restrict, _Atomic, _Nonnull, _Nullable),
+-- function specifiers (inline, _Noreturn),
+-- alignment specifiers (_Alignas) and
+-- storage class specifiers (extern, static, auto, register, _Thread_local),
+-- in any order, but containing at least one storage class specifier.
+--
+-- declaration_qualifier_list :- <permute> type_qualifier* alignment_specifier* function_specifier* storage_class+
+--
+-- GNU extensions
+--   * arbitrary interleaved __attribute__ annotations
+--
+declaration_qualifier_list :: { Reversed [CDeclSpec] }
+declaration_qualifier_list
+  : declaration_qualifier_without_types
+        { singleton $1 }
+
+  | attrs declaration_qualifier_without_types
+  	{ reverseList (liftCAttrs $1) `snoc` $2 }
+
+  | type_qualifier_list declaration_qualifier_without_types
+  	{ rmap CTypeQual $1 `snoc` $2 }
+
+  | type_qualifier_list attrs declaration_qualifier_without_types
+  	{ (rmap CTypeQual $1 `rappend` liftCAttrs $2) `snoc` $3 }
+
+  | declaration_qualifier_list declaration_qualifier
+  	{ $1 `snoc` $2 }
+
+  | declaration_qualifier_list attr
+  	{ addTrailingAttrs $1 $2 }
+
+--
+-- declaration_qualifier :- storage_class | type_qualifier | function_specifier | alignment_specifier
+--
+declaration_qualifier :: { CDeclSpec }
+declaration_qualifier
+  : storage_class		     { CStorageSpec $1 }
+  | type_qualifier		     { CTypeQual $1 }
+  | function_specifier               { CFunSpec $1 }
+  | alignment_specifier              { CAlignSpec $1 }
+
+
+declaration_qualifier_without_types :: { CDeclSpec }
+  : storage_class		     { CStorageSpec $1 }
+  | function_specifier               { CFunSpec $1 }
+  | alignment_specifier              { CAlignSpec $1 }
+
+
+-- parse C storage class specifier (C99 6.7.1)
+--
+-- * GNU extensions: '__thread' thread local storage
+--
+storage_class :: { CStorageSpec }
+storage_class
+  : typedef			{% withNodeInfo $1 $ CTypedef }
+  | extern			{% withNodeInfo $1 $ CExtern }
+  | static			{% withNodeInfo $1 $ CStatic }
+  | auto			{% withNodeInfo $1 $ CAuto }
+  | register			{% withNodeInfo $1 $ CRegister }
+  | "__thread"			{% withNodeInfo $1 $ CThread }
+
+-- parse C function specifier (C11 6.7.4)
+function_specifier :: { CFunSpec }
+function_specifier
+  : inline		{% withNodeInfo $1 $ CInlineQual }
+  | "_Noreturn"         {% withNodeInfo $1 $ CNoreturnQual }
+
+-- parse C alignment specifier (C11 6.7.5)
+alignment_specifier :: { CAlignSpec }
+alignment_specifier
+  : alignas '(' type_name ')'           {% withNodeInfo $1 $ CAlignAsType $3 }
+  | alignas '(' constant_expression ')' {% withNodeInfo $1 $ CAlignAsExpr $3 }
+
+-- parse C type specifier (C99 6.7.2)
+--
+-- This recignises a whole list of type specifiers rather than just one
+-- as in the C99 grammar.
+--
+-- type_specifier :- <permute> type_qualifier* (basic_type_name+ | elaborated_type_name | g)
+--
+-- Type specifier _Atomic(type) is not yet supported because of conflicts with type qualifier _Atomic
+type_specifier :: { [CDeclSpec] }
+type_specifier
+  : basic_type_specifier		{ reverse $1 }	-- Arithmetic or void
+  | sue_type_specifier			{ reverse $1 }	-- Struct/Union/Enum
+  | typedef_type_specifier		{ reverse $1 }	-- Typedef
+--  | "_Atomic" '(' type_name ')'                         -- _Atomic(type)
+--        {% withNodeInfo $1 $ \at -> [CTypeSpec (CAtomicType $3 at)] }
+
+basic_type_name :: { CTypeSpec }
+basic_type_name
+  : void			{% withNodeInfo $1 $ CVoidType }
+  | char			{% withNodeInfo $1 $ CCharType }
+  | short			{% withNodeInfo $1 $ CShortType }
+  | int				{% withNodeInfo $1 $ CIntType }
+  | long			{% withNodeInfo $1 $ CLongType }
+  | float			{% withNodeInfo $1 $ CFloatType }
+  | double			{% withNodeInfo $1 $ CDoubleType }
+  | signed			{% withNodeInfo $1 $ CSignedType }
+  | unsigned			{% withNodeInfo $1 $ CUnsigType }
+  | "_Bool"			{% withNodeInfo $1 $ CBoolType }
+  | "_Complex"			{% withNodeInfo $1 $ CComplexType }
+  | "__int128"      {% withNodeInfo $1 $ CInt128Type }
+  | "__float128"      {% withNodeInfo $1 $ CFloat128Type }
+  | "_Float128"      {% withNodeInfo $1 $ CFloat128Type }
+
+
+-- A mixture of type qualifiers, storage class and basic type names in any
+-- order, but containing at least one basic type name and at least one storage
+-- class specifier.
+--
+-- basic_declaration_specifier :- <permute> type_qualifier* storage_class+ basic_type_name+
+--
+--   GNU extensions
+--     arbitrary interleaved __attribute__ annotations
+--
+basic_declaration_specifier :: { Reversed [CDeclSpec] }
+basic_declaration_specifier
+  : declaration_qualifier_list basic_type_name
+  	{ $1 `snoc` CTypeSpec $2 }
+
+  | basic_type_specifier storage_class
+  	{ $1 `snoc` CStorageSpec $2 }
+
+  | basic_declaration_specifier declaration_qualifier
+  	{ $1 `snoc` $2 }
+
+  | basic_declaration_specifier basic_type_name
+  	{ $1 `snoc` CTypeSpec $2 }
+
+  | basic_declaration_specifier attr
+  	{ addTrailingAttrs $1 $2 }
+
+
+-- A mixture of type qualifiers and basic type names in any order, but
+-- containing at least one basic type name.
+--
+-- basic_type_specifier :- <permute> type_qualifier* basic_type_name+
+--
+--   GNU extensions
+--     arbitrary interleaved __attribute__ annotations
+--
+basic_type_specifier :: { Reversed [CDeclSpec] }
+basic_type_specifier
+  -- Arithmetic or void
+  : basic_type_name
+  	{ singleton (CTypeSpec $1) }
+
+  | attrs basic_type_name
+  	{ (reverseList $ liftCAttrs $1) `snoc` (CTypeSpec $2) }
+
+  | type_qualifier_list basic_type_name
+  	{ rmap CTypeQual $1 `snoc` CTypeSpec $2 }
+
+  | type_qualifier_list attrs basic_type_name
+  	{ rmap CTypeQual $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec $3 }
+
+  | basic_type_specifier type_qualifier
+  	{ $1 `snoc` CTypeQual $2 }
+
+  | basic_type_specifier basic_type_name
+  	{ $1 `snoc` CTypeSpec $2 }
+
+  | basic_type_specifier attr
+     { addTrailingAttrs $1 $2 }
+
+
+-- A named or anonymous struct, union or enum type along with at least one
+-- storage class and any mix of type qualifiers.
+--
+-- * Summary:
+--   sue_declaration_specifier :- <permute> type_qualifier* storage_class+ elaborated_type_name
+--
+sue_declaration_specifier :: { Reversed [CDeclSpec] }
+sue_declaration_specifier
+  : declaration_qualifier_list elaborated_type_name
+  	{ $1 `snoc` CTypeSpec $2 }
+
+  | sue_type_specifier storage_class
+  	{ $1 `snoc` CStorageSpec $2 }
+
+  | sue_declaration_specifier declaration_qualifier
+  	{ $1 `snoc` $2 }
+
+  | sue_declaration_specifier attr
+  	{ addTrailingAttrs $1 $2 }
+
+
+-- A struct, union or enum type (named or anonymous) with optional leading and
+-- trailing type qualifiers.
+--
+-- * Summary:
+--   sue_type_specifier :- <permute> type_qualifier* elaborated_type_name
+--
+-- * GNU Extensions: records __attribute__ annotations
+--
+sue_type_specifier :: { Reversed [CDeclSpec] }
+sue_type_specifier
+  -- struct/union/enum
+  : elaborated_type_name
+  	{ singleton (CTypeSpec $1) }
+
+  | attrs elaborated_type_name
+  	{ (reverseList $ liftCAttrs $1) `snoc` (CTypeSpec $2) }
+
+  | type_qualifier_list elaborated_type_name
+  	{ rmap CTypeQual $1 `snoc` CTypeSpec $2 }
+
+  | type_qualifier_list attrs elaborated_type_name
+  	{ rmap CTypeQual  $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec $3 }
+
+  | sue_type_specifier type_qualifier
+  	{ $1 `snoc` CTypeQual $2 }
+
+  | sue_type_specifier attr
+    { addTrailingAttrs $1 $2 }
+
+-- A typedef'ed type identifier with at least one storage qualifier and any
+-- number of type qualifiers
+--
+-- * Summary:
+--   typedef_declaration_specifier :- <permute> type_qualifier* storage_class+ tyident
+--
+-- * Note:
+--   the tyident can also be a: typeof '(' ... ')'
+--
+typedef_declaration_specifier :: { Reversed [CDeclSpec] }
+typedef_declaration_specifier
+  : typedef_type_specifier storage_class
+  	{ $1 `snoc` CStorageSpec $2 }
+
+  | declaration_qualifier_list tyident
+  	{% withNodeInfo $2 $ \at -> $1 `snoc` CTypeSpec (CTypeDef $2 at) }
+
+  | declaration_qualifier_list typeof '(' expression ')'
+  	{% withNodeInfo $2 $ \at -> $1 `snoc` CTypeSpec (CTypeOfExpr $4 at) }
+
+  | declaration_qualifier_list typeof '(' type_name ')'
+  	{% withNodeInfo $2 $ \at -> $1 `snoc` CTypeSpec (CTypeOfType $4 at) }
+
+  | typedef_declaration_specifier declaration_qualifier
+  	{ $1 `snoc` $2 }
+
+  | typedef_declaration_specifier attr
+  	{ addTrailingAttrs $1 $2 }
+
+
+-- typedef'ed type identifier with optional leading and trailing type qualifiers
+--
+-- * Summary:
+--   type_qualifier* ( tyident | typeof '('...')' ) type_qualifier*
+--
+typedef_type_specifier :: { Reversed [CDeclSpec] }
+typedef_type_specifier
+  : tyident
+  	{% withNodeInfo $1 $ \at -> singleton (CTypeSpec (CTypeDef $1 at)) }
+
+  | typeof '(' expression ')'
+  	{% withNodeInfo $1 $ \at -> singleton (CTypeSpec (CTypeOfExpr $3 at)) }
+
+  | typeof '(' type_name ')'
+  	{% withNodeInfo $1 $ \at -> singleton (CTypeSpec (CTypeOfType $3 at)) }
+
+  | type_qualifier_list tyident
+  	{% withNodeInfo $2 $ \at -> rmap CTypeQual  $1 `snoc` CTypeSpec (CTypeDef $2 at) }
+
+  | type_qualifier_list typeof '(' expression ')'
+  	{% withNodeInfo $2 $ \at -> rmap CTypeQual  $1 `snoc` CTypeSpec (CTypeOfExpr $4 at) }
+
+  | type_qualifier_list typeof '(' type_name ')'
+  	{% withNodeInfo $2 $ \at -> rmap CTypeQual  $1 `snoc` CTypeSpec (CTypeOfType $4 at) }
+
+  -- repeat with attrs (this could be easier if type qualifier list wouldn't allow leading attributes)
+  | attrs tyident
+  	{% withNodeInfo $2 $ \at -> reverseList (liftCAttrs $1) `snoc` (CTypeSpec (CTypeDef $2 at)) }
+
+  | attrs typeof '(' expression ')'
+  	{% withNodeInfo $1 $ \at -> reverseList (liftCAttrs $1) `snoc`  (CTypeSpec (CTypeOfExpr $4 at)) }
+
+  | attrs typeof '(' type_name ')'
+  	{% withNodeInfo $2 $ \at -> reverseList (liftCAttrs $1) `snoc`  (CTypeSpec (CTypeOfType $4 at)) }
+
+  | type_qualifier_list attrs tyident
+  	{% withNodeInfo $3 $ \at -> rmap CTypeQual  $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec (CTypeDef $3 at) }
+
+  | type_qualifier_list attrs typeof '(' expression ')'
+  	{% withNodeInfo $3 $ \at -> rmap CTypeQual  $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec (CTypeOfExpr $5 at) }
+
+  | type_qualifier_list attrs typeof '(' type_name ')'
+  	{% withNodeInfo $3 $ \at -> rmap CTypeQual  $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec (CTypeOfType $5 at) }
+
+  | typedef_type_specifier type_qualifier
+  	{ $1 `snoc` CTypeQual $2 }
+
+  | typedef_type_specifier attr
+  	{ addTrailingAttrs $1 $2 }
+
+
+-- A named or anonymous struct, union or enum type.
+--
+-- * Summary:
+--   (struct|union|enum) (identifier? '{' ... '}' | identifier)
+--
+elaborated_type_name :: { CTypeSpec }
+elaborated_type_name
+  : struct_or_union_specifier	{% withNodeInfo $1 $ CSUType $1 }
+  | enum_specifier		{% withNodeInfo $1 $ CEnumType $1 }
+
+
+-- parse C structure or union declaration (C99 6.7.2.1)
+--
+-- * Summary:
+--    (struct|union) (identifier? '{' ... '}' | identifier)
+--
+struct_or_union_specifier :: { CStructUnion }
+struct_or_union_specifier
+  : struct_or_union attrs_opt identifier '{' struct_declaration_list  '}'
+  	{% withNodeInfo $1 $ CStruct (unL $1) (Just $3) (Just$ reverse $5) $2 }
+
+  | struct_or_union attrs_opt '{' struct_declaration_list  '}'
+  	{% withNodeInfo $1 $ CStruct (unL $1) Nothing   (Just$ reverse $4) $2 }
+
+  | struct_or_union attrs_opt identifier
+  	{% withNodeInfo $1 $ CStruct (unL $1) (Just $3) Nothing $2 }
+
+
+struct_or_union :: { Located CStructTag }
+struct_or_union
+  : struct			{ L CStructTag (posOf $1) }
+  | union			{ L CUnionTag (posOf $1) }
+
+
+struct_declaration_list :: { Reversed [CDecl] }
+struct_declaration_list
+  : {- empty -}						{ empty }
+  | struct_declaration_list ';'				{ $1 }
+  | struct_declaration_list struct_declaration		{ $1 `snoc` $2 }
+
+
+-- parse C structure declaration (C99 6.7.2.1)
+--
+struct_declaration :: { CDecl }
+struct_declaration
+  : struct_declaring_list ';'
+  	{ case $1 of CDecl declspecs dies at -> CDecl declspecs (List.reverse dies) at }
+
+  | struct_default_declaring_list';'
+  	{ case $1 of CDecl declspecs dies at -> CDecl declspecs (List.reverse dies) at }
+
+  | "__extension__" struct_declaration	{ $2 }
+
+
+--
+--  * Note: doesn't redeclare typedef
+--
+--  TODO: FIXME: AST doesn't allow recording attributes of unnamed struct members
+struct_default_declaring_list :: { CDecl }
+struct_default_declaring_list
+  : type_qualifier_list attrs_opt struct_identifier_declarator
+  	{% withNodeInfo $1 $ case $3 of (d,s) -> CDecl (liftTypeQuals $1 ++ liftCAttrs $2) [(d,Nothing,s)] }
+
+  -- GNU extension: __attribute__ as only type qualifier
+  | attrs struct_identifier_declarator
+    {% withNodeInfo $1 $ case $2 of (d,s) -> CDecl (liftCAttrs $1) [(d,Nothing,s)] }
+  -- attrs_opt apply to the declared object
+  | struct_default_declaring_list ',' attrs_opt struct_identifier_declarator
+  	{ case $1 of
+            CDecl declspecs dies at ->
+              case $4 of
+                (Just d,s) -> CDecl declspecs ((Just $ appendObjAttrs $3 d,Nothing,s) : dies) at
+                (Nothing,s) -> CDecl declspecs ((Nothing,Nothing,s) : dies) at } -- FIXME
+
+-- * GNU extensions:
+--     allow anonymous nested structures and unions
+--     FIXME: cannot record attribute of unnamed field
+struct_declaring_list :: { CDecl }
+struct_declaring_list
+  : type_specifier struct_declarator attrs_opt
+  	{% withNodeInfo $1 $ case $2 of { (Just d,s)  -> CDecl $1 [(Just $! appendObjAttrs $3 d,Nothing,s)]
+                                    ; (Nothing,s) -> CDecl $1 [(Nothing,Nothing,s)]  } } {- DO FIXME -}
+  | struct_declaring_list ',' attrs_opt struct_declarator attrs_opt
+  	{ case $1 of
+            CDecl declspecs dies attr ->
+              case $4 of
+                (Just d,s) -> CDecl declspecs ((Just$ appendObjAttrs ($3++$5) d,Nothing,s) : dies) attr
+                (Nothing,s) -> CDecl declspecs ((Nothing,Nothing,s) : dies) attr }
+
+  -- FIXME: We're being far too liberal in the parsing here, we really want to just
+  -- allow unnamed struct and union fields but we're actually allowing any
+  -- unnamed struct member. Making it allow only unnamed structs or unions in
+  -- the parser is far too tricky, it makes things ambiguous. So we'll have to
+  -- diagnose unnamed fields that are not structs/unions in a later stage.
+
+  -- Note that a plain type specifier can have a trailing attribute
+
+  | type_specifier
+     {% withNodeInfo $1 $ CDecl $1 []  }
+
+
+-- parse C structure declarator (C99 6.7.2.1)
+--
+struct_declarator :: { (Maybe CDeclr, Maybe CExpr) }
+struct_declarator
+  : declarator					       { (Just (reverseDeclr $1), Nothing) }
+  | ':' constant_expression			   { (Nothing, Just $2) }
+  | declarator ':' constant_expression { (Just (reverseDeclr $1), Just $3) }
+
+-- FIXME: anonymous bitfield doesn't allow recording of attributes
+struct_identifier_declarator :: { (Maybe CDeclr, Maybe CExpr) }
+struct_identifier_declarator
+  : identifier_declarator				{ (Just (reverseDeclr $1), Nothing) }
+  | ':' constant_expression				{ (Nothing, Just $2) }
+  | identifier_declarator ':' constant_expression	{ (Just (reverseDeclr $1), Just $3) }
+  | struct_identifier_declarator attr
+    {  case $1 of {   (Nothing,expr) -> (Nothing,expr) {- FIXME -}
+                    ; (Just (CDeclr name derived asmname attrs node), bsz) ->
+                                        (Just (CDeclr name derived asmname (attrs++$2) node),bsz)
+                  }
+    }
+
+-- parse C enumeration declaration (C99 6.7.2.2)
+--
+-- * Summary:
+--   enum (identifier? '{' ... '}' | identifier)
+--
+enum_specifier :: { CEnum }
+enum_specifier
+  : enum attrs_opt '{' enumerator_list '}'
+  	{% withNodeInfo $1 $ CEnum Nothing   (Just$ reverse $4) $2 }
+
+  | enum attrs_opt '{' enumerator_list ',' '}'
+  	{% withNodeInfo $1 $ CEnum Nothing   (Just$ reverse $4) $2 }
+
+  | enum attrs_opt identifier '{' enumerator_list '}'
+  	{% withNodeInfo $1 $ CEnum (Just $3) (Just$ reverse $5) $2 }
+
+  | enum attrs_opt identifier '{' enumerator_list ',' '}'
+  	{% withNodeInfo $1 $ CEnum (Just $3) (Just$ reverse $5) $2 }
+
+  | enum attrs_opt identifier
+  	{% withNodeInfo $1 $ CEnum (Just $3) Nothing $2           }
+
+enumerator_list :: { Reversed [(Ident, Maybe CExpr)] }
+enumerator_list
+  : enumerator					{ singleton $1 }
+  | enumerator_list ',' enumerator		{ $1 `snoc` $3 }
+
+
+enumerator :: { (Ident, Maybe CExpr) }
+enumerator
+  : identifier                               { ($1, Nothing) }
+  | identifier attrs                         { ($1, Nothing) }
+  | identifier attrs '=' constant_expression { ($1, Just $4) }
+  | identifier '=' constant_expression       { ($1, Just $3) }
+
+
+-- parse C type qualifier (C11 6.7.3)
+--
+-- concerning atomic, note:  If the _Atomic keyword is immediately followed by a left
+-- parenthesis, it should be interpreted as a type specifier (with a type name), not as a type qualifier
+type_qualifier :: { CTypeQual }
+type_qualifier
+  : const		{% withNodeInfo $1 $ CConstQual }
+  | volatile		{% withNodeInfo $1 $ CVolatQual }
+  | restrict		{% withNodeInfo $1 $ CRestrQual }
+  | "_Nullable"         {% withNodeInfo $1 $ CNullableQual }
+  | "_Nonnull"          {% withNodeInfo $1 $ CNonnullQual }
+  | "_Atomic"           {% withNodeInfo $1 $ CAtomicQual }
+
+-- a list containing at least one type_qualifier (const, volatile, restrict, inline, _Noreturn)
+--    and additionally CAttrs
+type_qualifier_list :: { Reversed [CTypeQual] }
+type_qualifier_list
+  : attrs_opt type_qualifier	             { reverseList (map CAttrQual $1) `snoc` $2 }
+  | type_qualifier_list type_qualifier	     { $1 `snoc` $2 }
+  | type_qualifier_list attrs type_qualifier { ($1 `rappend` map CAttrQual $2) `snoc` $3}
+
+-- parse C declarator (C99 6.7.5)
+--
+declarator :: { CDeclrR }
+declarator
+  : identifier_declarator		{ $1 }
+  | typedef_declarator			{ $1 }
+
+
+-- Parse GNU C's asm annotations
+--
+-- Those annotations allow to give an assembler name to a function or identifier.
+asm_opt :: { Maybe CStrLit }
+asm_opt
+  : {- empty -}				          { Nothing }
+  | asm '(' string_literal ')'	{ Just $3 }
+
+--
+-- typedef_declarator :-
+
+typedef_declarator :: { CDeclrR }
+typedef_declarator
+  -- would be ambiguous as parameter
+  : paren_typedef_declarator		{ $1 }
+
+  -- not ambiguous as param
+  | parameter_typedef_declarator	{ $1 }
+
+
+-- parameter_typedef_declarator :- tyident declarator_postfix?
+--                              | '(' attrs? clean_typedef_declarator ')' declarator_postfix?
+--                              |  '*' attrs? type_qualifier_list? parameter_typedef_declarator
+--
+parameter_typedef_declarator :: { CDeclrR }
+parameter_typedef_declarator
+  : tyident
+  	{% withNodeInfo $1 $ mkVarDeclr $1 }
+
+  | tyident postfixing_abstract_declarator
+  	{% withNodeInfo $1 $ \at -> $2 (mkVarDeclr $1 at) }
+
+  | clean_typedef_declarator
+  	{ $1 }
+
+
+-- The  following have at least one '*'.
+-- There is no (redundant) '(' between the '*' and the tyident.
+--
+-- clean_typedef_declarator :-  '(' attrs? clean_typedef_declarator ')' declarator_postfix?
+--                            | '*' attrs? type_qualifier_list? parameter_typedef_declarator
+--
+clean_typedef_declarator :: { CDeclrR }
+clean_typedef_declarator
+  : clean_postfix_typedef_declarator
+  	{ $1 }
+
+  | '*' parameter_typedef_declarator
+  	{% withNodeInfo $1 $ ptrDeclr $2 [] }
+
+  | '*' attrs parameter_typedef_declarator
+  	{% withAttribute $1 $2 $ ptrDeclr $3 [] }
+
+  | '*' type_qualifier_list  parameter_typedef_declarator
+  	{% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }
+
+  | '*' type_qualifier_list attrs parameter_typedef_declarator
+  	{% withAttribute $1 $3 $ ptrDeclr $4 (reverse $2)  }
+
+-- clean_postfix_typedef_declarator :- ( attrs? clean_typedef_declarator ) declarator_postfix?
+--
+clean_postfix_typedef_declarator :: { CDeclrR }
+clean_postfix_typedef_declarator
+  : '(' clean_typedef_declarator ')'						              { $2 }
+  | '(' clean_typedef_declarator ')' postfixing_abstract_declarator		  { $4 $2 }
+  | '(' attrs clean_typedef_declarator ')'	                              { appendDeclrAttrs $2 $3 }
+  | '(' attrs clean_typedef_declarator ')' postfixing_abstract_declarator { appendDeclrAttrs $2 ($5 $3) }
+
+
+-- The following have a redundant '(' placed
+-- immediately to the left of the tyident
+--
+paren_typedef_declarator :: { CDeclrR }
+paren_typedef_declarator
+  : paren_postfix_typedef_declarator
+  	{ $1 }
+
+  -- redundant paren
+  | '*' '(' simple_paren_typedef_declarator ')'
+  	{% withNodeInfo $1 $ ptrDeclr $3 [] }
+
+  | '*' type_qualifier_list '(' simple_paren_typedef_declarator ')'
+  	{% withNodeInfo $1 $ ptrDeclr $4 (reverse $2) }
+  | '*' type_qualifier_list attrs '(' simple_paren_typedef_declarator ')'
+  	{% withAttribute $1 $3 $ ptrDeclr $5 (reverse $2)  }
+
+  | '*' paren_typedef_declarator
+  	{% withNodeInfo $1 $ ptrDeclr $2 [] }
+
+  | '*' type_qualifier_list paren_typedef_declarator
+  	{% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }
+  | '*' type_qualifier_list attrs paren_typedef_declarator
+  	{% withAttribute $1 $3 $ ptrDeclr $4 (reverse $2) }
+
+-- redundant paren to left of tname
+paren_postfix_typedef_declarator :: { CDeclrR }
+paren_postfix_typedef_declarator
+  : '(' paren_typedef_declarator ')'
+  	{ $2 }
+
+  -- redundant paren
+  | '(' simple_paren_typedef_declarator postfixing_abstract_declarator ')'
+  	{ $3 $2 }
+
+  | '(' paren_typedef_declarator ')' postfixing_abstract_declarator
+  	{ $4 $2 }
+
+
+-- Just a type name in any number of nested brackets
+--
+simple_paren_typedef_declarator :: { CDeclrR }
+simple_paren_typedef_declarator
+  : tyident
+  	{% withNodeInfo $1 $ mkVarDeclr $1 }
+
+  | '(' simple_paren_typedef_declarator ')'
+  	{ $2 }
+
+--
+-- Declarators
+-- * Summary
+--   declarator :- ( '*' (type_qualifier | attr)* )* ident ( array_decl | "(" parameter-list ")" )?
+--      + additional parenthesis
+--
+identifier_declarator :: { CDeclrR }
+identifier_declarator
+  : unary_identifier_declarator			{ $1 }
+  | paren_identifier_declarator			{ $1 }
+
+
+unary_identifier_declarator :: { CDeclrR }
+unary_identifier_declarator
+  : postfix_identifier_declarator
+  	{ $1 }
+
+  | '*' identifier_declarator
+  	{% withNodeInfo $1 $ ptrDeclr $2 [] }
+
+  | '*' attrs identifier_declarator
+  	{% withAttribute $1 $2 $ ptrDeclr $3 [] }
+
+  | '*' type_qualifier_list identifier_declarator
+  	{% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }
+
+  | '*' type_qualifier_list attrs identifier_declarator
+  	{% withAttribute $1 $3 $ ptrDeclr $4 (reverse $2) }
+
+postfix_identifier_declarator :: { CDeclrR }
+postfix_identifier_declarator
+  : paren_identifier_declarator postfixing_abstract_declarator
+  	{ $2 $1 }
+
+   | '('  unary_identifier_declarator ')'
+   	{ $2 }
+
+   | '(' unary_identifier_declarator ')' postfixing_abstract_declarator
+   	{ $4 $2 }
+
+   | '(' attrs unary_identifier_declarator ')'
+     { appendDeclrAttrs $2 $3 }
+
+   | '(' attrs unary_identifier_declarator ')' postfixing_abstract_declarator
+     { appendDeclrAttrs $2 ($5 $3) }
+
+
+-- just an identifier in any number of nested parenthesis
+paren_identifier_declarator :: { CDeclrR }
+paren_identifier_declarator
+  : ident
+  	{% withNodeInfo $1 $ mkVarDeclr $1 }
+
+  | '(' paren_identifier_declarator ')'
+  	{ $2 }
+
+  | '(' attrs paren_identifier_declarator ')'
+  	{ appendDeclrAttrs $2 $3 }
+
+function_declarator_old :: { CDeclr }
+function_declarator_old
+  : old_function_declarator
+    { reverseDeclr $1 }
+
+old_function_declarator :: { CDeclrR }
+old_function_declarator
+  : postfix_old_function_declarator
+  	{ $1 }
+
+  | '*' old_function_declarator
+  	{% withNodeInfo $1 $ ptrDeclr $2 [] } -- FIXME: no attr possible here ???
+
+  | '*' type_qualifier_list old_function_declarator
+  	{% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }
+
+postfix_old_function_declarator :: { CDeclrR }
+postfix_old_function_declarator
+  : paren_identifier_declarator '(' identifier_list ')'
+  	{% withNodeInfo $1 $ funDeclr $1 (Left $ reverse $3) [] }
+
+  | '(' old_function_declarator ')'
+  	{ $2 }
+
+  | '(' old_function_declarator ')' postfixing_abstract_declarator
+  	{ $4 $2 }
+
+
+-- parse C parameter type list (C99 6.7.5)
+--
+parameter_type_list :: { ([CDecl], Bool) }
+parameter_type_list
+  : {- empty -}				{ ([], False)}
+  | parameter_list			{ (reverse $1, False) }
+  | parameter_list ',' "..."		{ (reverse $1, True) }
+
+parameter_list :: { Reversed [CDecl] }
+parameter_list
+  : parameter_declaration				{ singleton $1 }
+  | parameter_list ',' parameter_declaration	{ $1 `snoc` $3 }
+
+parameter_declaration :: { CDecl }
+parameter_declaration
+  : declaration_specifier
+  	{% withNodeInfo $1 $ CDecl $1 [] }
+
+  | declaration_specifier abstract_declarator
+  	{% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $2), Nothing, Nothing)] }
+
+  | declaration_specifier identifier_declarator attrs_opt
+  	{% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] }
+
+  | declaration_specifier parameter_typedef_declarator attrs_opt
+  	{% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] }
+
+  | declaration_qualifier_list
+  	{% withNodeInfo $1 $ CDecl (reverse $1) [] }
+
+  | declaration_qualifier_list abstract_declarator
+  	{% withNodeInfo $1 $ CDecl (reverse $1) [(Just (reverseDeclr $2), Nothing, Nothing)] }
+
+  | declaration_qualifier_list identifier_declarator attrs_opt
+  	{% withNodeInfo $1 $ CDecl (reverse $1) [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] }
+
+  | type_specifier
+  	{% withNodeInfo $1 $ CDecl $1 [] }
+
+  | type_specifier abstract_declarator
+  	{% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $2), Nothing, Nothing)] }
+
+  | type_specifier identifier_declarator attrs_opt
+  	{% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] }
+
+  | type_specifier parameter_typedef_declarator attrs_opt
+  	{% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] }
+
+  | type_qualifier_list
+  	{% withNodeInfo $1 $ CDecl (liftTypeQuals $1) [] }
+  | type_qualifier_list attr
+  	{% withNodeInfo $1 $ CDecl (liftTypeQuals $1 ++ liftCAttrs $2) [] }
+
+  | type_qualifier_list abstract_declarator
+  	{% withNodeInfo $1 $ CDecl (liftTypeQuals $1) [(Just (reverseDeclr $2), Nothing, Nothing)] }
+
+  | type_qualifier_list identifier_declarator attrs_opt
+  	{% withNodeInfo $1 $ CDecl (liftTypeQuals $1) [(Just (reverseDeclr$ appendDeclrAttrs $3 $2), Nothing, Nothing)] }
+
+
+identifier_list :: { Reversed [Ident] }
+identifier_list
+  : ident				{ singleton $1 }
+  | identifier_list ',' ident		{ $1 `snoc` $3 }
+
+
+-- parse C type name (C99 6.7.6)
+--
+type_name :: { CDecl }
+type_name
+  :  type_specifier
+  	{% withNodeInfo $1 $ CDecl $1 [] }
+
+  |  type_specifier abstract_declarator
+  	{% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $2), Nothing, Nothing)] }
+
+  |  type_qualifier_list attr
+  	{% withNodeInfo $1 $ CDecl (liftTypeQuals $1 ++ liftCAttrs $2) [] }
+
+  |  type_qualifier_list abstract_declarator
+  	{% withNodeInfo $1 $ CDecl (liftTypeQuals $1) [(Just (reverseDeclr $2), Nothing, Nothing)] }
+
+-- parse C abstract declarator (C99 6.7.6)
+--
+-- postfix starts with '('
+-- postfixing starts with '(' or '['
+-- unary start with '*'
+abstract_declarator :: { CDeclrR }
+abstract_declarator
+  : unary_abstract_declarator	    { $1 }
+  | postfix_abstract_declarator		{ $1 }
+  | postfixing_abstract_declarator  { $1 emptyDeclr }
+
+--
+-- FIXME
+--  | postfixing_abstract_declarator attrs_opt	{ $1 emptyDeclr }
+
+
+postfixing_abstract_declarator :: { CDeclrR -> CDeclrR }
+postfixing_abstract_declarator
+  : array_abstract_declarator
+  	{ $1 }
+
+  | '(' parameter_type_list ')'
+  	{% withNodeInfo $1 $ \at declr -> case $2 of
+             (params, variadic) -> funDeclr declr (Right (params,variadic)) [] at }
+
+
+-- * TODO: Note that we recognise but ignore the C99 static keyword (see C99 6.7.5.3)
+--
+-- * TODO: We do not distinguish in the AST between incomplete array types and
+-- complete variable length arrays ([ '*' ] means the latter). (see C99 6.7.5.2)
+--
+array_abstract_declarator :: { CDeclrR -> CDeclrR }
+array_abstract_declarator
+  : postfix_array_abstract_declarator
+  	{ $1 }
+
+  | array_abstract_declarator postfix_array_abstract_declarator
+  	{ \decl -> $2 ($1 decl) }
+
+--
+-- TODO: record static
+postfix_array_abstract_declarator :: { CDeclrR -> CDeclrR }
+postfix_array_abstract_declarator
+  : '[' assignment_expression_opt ']'
+  	{% withNodeInfo $1 $ \at declr -> arrDeclr declr [] False False $2 at }
+
+  | '[' attrs assignment_expression_opt ']'
+  	{% withAttributePF $1 $2 $ \at declr -> arrDeclr declr [] False False $3 at }
+
+  | '[' type_qualifier_list assignment_expression_opt ']'
+  	{% withNodeInfo $1 $ \at declr -> arrDeclr declr (reverse $2) False False $3 at }
+
+  | '[' type_qualifier_list attrs assignment_expression_opt ']'
+  	{% withAttributePF $1 $3 $ \at declr -> arrDeclr declr (reverse $2) False False $4 at }
+
+  | '[' static attrs_opt assignment_expression ']'
+  	{% withAttributePF $1 $3 $ \at declr -> arrDeclr declr [] False True (Just $4) at }
+
+  | '[' static type_qualifier_list attrs_opt assignment_expression ']'
+  	{% withAttributePF $1 $4 $ \at declr -> arrDeclr declr (reverse $3) False True (Just $5) at }
+
+  | '[' type_qualifier_list attrs_opt static attrs_opt assignment_expression ']'
+  	{% withAttributePF $1 ($3 ++ $5) $ \at declr -> arrDeclr declr (reverse $2) False True  (Just $6) at }
+
+  | '[' '*' attrs_opt ']'
+  	{% withAttributePF $1 $3 $ \at declr -> arrDeclr declr [] True False Nothing at }
+  | '[' attrs '*' attrs_opt ']'
+  	{% withAttributePF $1 ($2 ++ $4) $ \at declr -> arrDeclr declr [] True False Nothing at }
+
+  | '[' type_qualifier_list '*' attrs_opt ']'
+  	{% withAttributePF $1 $4 $ \at declr -> arrDeclr declr (reverse $2) True False Nothing at }
+  | '[' type_qualifier_list attrs '*' attrs_opt ']'
+  	{% withAttributePF $1 ($3 ++ $5) $ \at declr -> arrDeclr declr (reverse $2) True False Nothing at }
+
+unary_abstract_declarator :: { CDeclrR }
+unary_abstract_declarator
+  : '*'
+  	{% withNodeInfo $1 $ ptrDeclr emptyDeclr [] }
+
+  | '*' type_qualifier_list attrs_opt
+  	{% withAttribute $1 $3 $ ptrDeclr emptyDeclr (reverse $2)  }
+
+  | '*' abstract_declarator
+  	{% withNodeInfo $1 $ ptrDeclr $2 [] }
+
+  | '*' type_qualifier_list abstract_declarator
+  	{% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }
+
+  | '*' attrs
+  	{% withAttribute $1 $2 $ ptrDeclr emptyDeclr [] }
+  | '*' attrs abstract_declarator
+  	{% withAttribute $1 $2 $ ptrDeclr $3 [] }
+
+-- postfix_ad starts with '(', postfixing with '(' or '[', unary_abstract starts with '*'
+postfix_abstract_declarator :: { CDeclrR }
+postfix_abstract_declarator
+  : '(' unary_abstract_declarator ')'					{ $2 }
+  | '(' postfix_abstract_declarator ')'					{ $2 }
+  | '(' postfixing_abstract_declarator ')'				{ $2 emptyDeclr }
+  | '(' unary_abstract_declarator ')' postfixing_abstract_declarator	{ $4 $2 }
+
+-- FIX 0700
+  | '(' attrs unary_abstract_declarator ')'				     	{ appendDeclrAttrs $2 $3 }
+  | '(' attrs postfix_abstract_declarator ')'					{ appendDeclrAttrs $2 $3 }
+  | '(' attrs postfixing_abstract_declarator ')'				{ appendDeclrAttrs $2 ($3 emptyDeclr) }
+  | '(' attrs unary_abstract_declarator ')' postfixing_abstract_declarator	{ appendDeclrAttrs $2 ($5 $3) }
+  | postfix_abstract_declarator attr						    { appendDeclrAttrs $2 $1 }
+
+
+-- parse C initializer (C99 6.7.8)
+--
+initializer :: { CInit }
+initializer
+  : assignment_expression		{% withNodeInfo $1 $ CInitExpr $1 }
+  | '{' initializer_list '}'		{% withNodeInfo $1 $ CInitList (reverse $2) }
+  | '{' initializer_list ',' '}'	{% withNodeInfo $1 $ CInitList (reverse $2) }
+
+
+initializer_opt :: { Maybe CInit }
+initializer_opt
+  : {- empty -}			{ Nothing }
+  | '=' initializer		{ Just $2 }
+
+
+initializer_list :: { Reversed CInitList }
+initializer_list
+  : {- empty -}						{ empty }
+  | initializer						{ singleton ([],$1) }
+  | designation initializer				{ singleton ($1,$2) }
+  | initializer_list ',' initializer			{ $1 `snoc` ([],$3) }
+  | initializer_list ',' designation initializer	{ $1 `snoc` ($3,$4) }
+
+
+-- designation
+--
+-- * GNU extensions:
+--     old style member designation: 'ident :'
+--     array range designation
+--
+designation :: { [CDesignator] }
+designation
+  : designator_list '='		{ reverse $1 }
+  | identifier ':'		{% withNodeInfo $1 $ \at -> [CMemberDesig $1 at] }
+  | array_designator		{ [$1] }
+
+
+designator_list :: { Reversed [CDesignator] }
+designator_list
+ : designator				{ singleton $1 }
+ | designator_list designator		{ $1 `snoc` $2 }
+
+
+designator :: { CDesignator }
+designator
+  : '[' constant_expression ']'		{% withNodeInfo $1 $ CArrDesig $2 }
+  | '.' identifier			{% withNodeInfo $1 $ CMemberDesig $2 }
+  | array_designator			{ $1 }
+
+
+array_designator :: { CDesignator }
+array_designator
+  : '[' constant_expression "..." constant_expression ']'
+  	{% withNodeInfo $1 $ CRangeDesig $2 $4 }
+
+
+-- parse C primary expression (C11 6.5.1)
+--
+-- We cannot use a typedef name as a variable
+--
+-- * C11: generic selection
+-- * GNU extensions:
+--     allow a compound statement as an expression
+--     __builtin_va_arg
+--     __builtin_offsetof
+--     __builtin_types_compatible_p
+primary_expression :: { CExpr }
+primary_expression
+  : ident		 {% withNodeInfo $1 $ CVar $1 }
+  | constant	  	 { CConst $1 }
+  | string_literal       { CConst (liftStrLit $1) }
+  | '(' expression ')'	 { $2 }
+  | "_Generic" '(' assignment_expression ',' generic_assoc_list ')'
+        {% withNodeInfo $1 $ CGenericSelection $3 (reverse $5) }
+  -- GNU extensions
+  | '(' compound_statement ')'
+  	{% withNodeInfo $1 $ CStatExpr $2 }
+
+  | "__builtin_va_arg" '(' assignment_expression ',' type_name ')'
+  	{% withNodeInfo $1 $ CBuiltinExpr . CBuiltinVaArg $3 $5 }
+
+  | "__builtin_offsetof" '(' type_name ',' offsetof_member_designator ')'
+  	{% withNodeInfo $1 $ CBuiltinExpr . CBuiltinOffsetOf $3 (reverse $5) }
+
+  | "__builtin_types_compatible_p" '(' type_name ',' type_name ')'
+  	{% withNodeInfo $1 $ CBuiltinExpr . CBuiltinTypesCompatible $3 $5 }
+
+  | "__builtin_convertvector" '(' assignment_expression ',' type_name ')'
+        {% withNodeInfo $1 $ CBuiltinExpr . CBuiltinConvertVector $3 $5 }
+
+-- Generic Selection association list (C11 6.5.1.1)
+--
+-- TODO: introduce AST type for generic association
+generic_assoc_list :: { Reversed [(Maybe CDecl, CExpr)] }
+  : generic_assoc_list ',' generic_assoc { $1 `snoc` $3 }
+  | generic_assoc                        { singleton $1 }
+generic_assoc :: { (Maybe CDecl, CExpr) }
+generic_assoc
+  : type_name ':' assignment_expression { (Just $1, $3) }
+  | default   ':' assignment_expression { (Nothing, $3) }
+
+offsetof_member_designator :: { Reversed [CDesignator] }
+offsetof_member_designator
+  : identifier						                        {% withNodeInfo $1 $ singleton . CMemberDesig $1 }
+  | offsetof_member_designator '.' identifier		  {% withNodeInfo $3 $ ($1 `snoc`) . CMemberDesig $3 }
+  | offsetof_member_designator '[' expression ']'	{% withNodeInfo $3 $ ($1 `snoc`) . CArrDesig $3 }
+
+
+-- parse C postfix expression (C99 6.5.2)
+--
+postfix_expression :: { CExpr }
+postfix_expression
+  : primary_expression
+  	{ $1 }
+
+  | postfix_expression '[' expression ']'
+  	{% withNodeInfo $1 $ CIndex $1 $3 }
+
+  | postfix_expression '(' ')'
+  	{% withNodeInfo $1 $ CCall $1 [] }
+
+  | postfix_expression '(' argument_expression_list ')'
+  	{% withNodeInfo $1 $ CCall $1 (reverse $3) }
+
+  | postfix_expression '.' identifier
+  	{% withNodeInfo $1 $ CMember $1 $3 False }
+
+  | postfix_expression "->" identifier
+  	{% withNodeInfo $1 $ CMember $1 $3 True }
+
+  | postfix_expression "++"
+  	{% withNodeInfo $1 $ CUnary CPostIncOp $1 }
+
+  | postfix_expression "--"
+  	{% withNodeInfo $1 $ CUnary CPostDecOp $1 }
+
+  | '(' type_name ')' '{' initializer_list '}'
+  	{% withNodeInfo $1 $ CCompoundLit $2 (reverse $5) }
+
+  | '(' type_name ')' '{' initializer_list ',' '}'
+  	{% withNodeInfo $1 $ CCompoundLit $2 (reverse $5) }
+
+
+argument_expression_list :: { Reversed [CExpr] }
+argument_expression_list
+  : assignment_expression				{ singleton $1 }
+  | argument_expression_list ',' assignment_expression	{ $1 `snoc` $3 }
+
+
+-- parse C unary expression (C99 6.5.3)
+--
+-- * GNU extensions:
+--     'alignof' expression or type
+--     '__real' and '__imag' expression
+--     '__extension__' to suppress warnings about extensions
+--     allow taking address of a label with: && label
+--
+unary_expression :: { CExpr }
+unary_expression
+  : postfix_expression			{ $1 }
+  | "++" unary_expression		{% withNodeInfo $1 $ CUnary CPreIncOp $2 }
+  | "--" unary_expression		{% withNodeInfo $1 $ CUnary CPreDecOp $2 }
+  | "__extension__" cast_expression	{ $2 }
+  | unary_operator cast_expression	{% withNodeInfo $1 $ CUnary (unL $1) $2 }
+  | sizeof unary_expression		{% withNodeInfo $1 $ CSizeofExpr $2 }
+  | sizeof '(' type_name ')'		{% withNodeInfo $1 $ CSizeofType $3 }
+  -- GNU: alignof, complex and && extension
+  | alignof unary_expression		{% withNodeInfo $1 $ CAlignofExpr $2 }
+  | alignof '(' type_name ')'		{% withNodeInfo $1 $ CAlignofType $3 }
+  | "__real__" unary_expression    {% withNodeInfo $1 $ CComplexReal $2 }
+  | "__imag__" unary_expression    {% withNodeInfo $1 $ CComplexImag $2 }
+  | "&&" identifier			{% withNodeInfo $1 $ CLabAddrExpr $2 }
+
+
+unary_operator :: { Located CUnaryOp }
+unary_operator
+  : '&'		{ L CAdrOp  (posOf $1) }
+  | '*'		{ L CIndOp  (posOf $1) }
+  | '+'		{ L CPlusOp (posOf $1) }
+  | '-'		{ L CMinOp  (posOf $1) }
+  | '~'		{ L CCompOp (posOf $1) }
+  | '!'		{ L CNegOp  (posOf $1) }
+
+
+-- parse C cast expression (C99 6.5.4)
+--
+cast_expression :: { CExpr }
+cast_expression
+  : unary_expression			{ $1 }
+  | '(' type_name ')' cast_expression	{% withNodeInfo $1 $ CCast $2 $4 }
+
+
+-- parse C multiplicative expression (C99 6.5.5)
+--
+multiplicative_expression :: { CExpr }
+multiplicative_expression
+  : cast_expression
+  	{ $1 }
+
+  | multiplicative_expression '*' cast_expression
+  	{% withNodeInfo $1 $ CBinary CMulOp $1 $3 }
+
+  | multiplicative_expression '/' cast_expression
+  	{% withNodeInfo $1 $ CBinary CDivOp $1 $3 }
+
+  | multiplicative_expression '%' cast_expression
+  	{% withNodeInfo $1 $ CBinary CRmdOp $1 $3 }
+
+
+-- parse C additive expression (C99 6.5.6)
+--
+additive_expression :: { CExpr }
+additive_expression
+  : multiplicative_expression
+  	{ $1 }
+
+  | additive_expression '+' multiplicative_expression
+  	{% withNodeInfo $1 $ CBinary CAddOp $1 $3 }
+
+  | additive_expression '-' multiplicative_expression
+  	{% withNodeInfo $1 $ CBinary CSubOp $1 $3 }
+
+
+-- parse C shift expression (C99 6.5.7)
+--
+shift_expression :: { CExpr }
+shift_expression
+  : additive_expression
+  	{ $1 }
+
+  | shift_expression "<<" additive_expression
+  	{% withNodeInfo $1 $ CBinary CShlOp $1 $3 }
+
+  | shift_expression ">>" additive_expression
+  	{% withNodeInfo $1 $ CBinary CShrOp $1 $3 }
+
+
+-- parse C relational expression (C99 6.5.8)
+--
+relational_expression :: { CExpr }
+relational_expression
+  : shift_expression
+  	{ $1 }
+
+  | relational_expression '<' shift_expression
+  	{% withNodeInfo $1 $ CBinary CLeOp $1 $3 }
+
+  | relational_expression '>' shift_expression
+  	{% withNodeInfo $1 $ CBinary CGrOp $1 $3 }
+
+  | relational_expression "<=" shift_expression
+  	{% withNodeInfo $1 $ CBinary CLeqOp $1 $3 }
+
+  | relational_expression ">=" shift_expression
+  	{% withNodeInfo $1 $ CBinary CGeqOp $1 $3 }
+
+
+-- parse C equality expression (C99 6.5.9)
+--
+equality_expression :: { CExpr }
+equality_expression
+  : relational_expression
+  	{ $1 }
+
+  | equality_expression "==" relational_expression
+  	{% withNodeInfo $1 $ CBinary CEqOp  $1 $3 }
+
+  | equality_expression "!=" relational_expression
+  	{% withNodeInfo $1 $ CBinary CNeqOp $1 $3 }
+
+
+-- parse C bitwise and expression (C99 6.5.10)
+--
+and_expression :: { CExpr }
+and_expression
+  : equality_expression
+  	{ $1 }
+
+  | and_expression '&' equality_expression
+  	{% withNodeInfo $1 $ CBinary CAndOp $1 $3 }
+
+
+-- parse C bitwise exclusive or expression (C99 6.5.11)
+--
+exclusive_or_expression :: { CExpr }
+exclusive_or_expression
+  : and_expression
+  	{ $1 }
+
+  | exclusive_or_expression '^' and_expression
+  	{% withNodeInfo $1 $ CBinary CXorOp $1 $3 }
+
+
+-- parse C bitwise or expression (C99 6.5.12)
+--
+inclusive_or_expression :: { CExpr }
+inclusive_or_expression
+  : exclusive_or_expression
+  	{ $1 }
+
+  | inclusive_or_expression '|' exclusive_or_expression
+  	{% withNodeInfo $1 $ CBinary COrOp $1 $3 }
+
+
+-- parse C logical and expression (C99 6.5.13)
+--
+logical_and_expression :: { CExpr }
+logical_and_expression
+  : inclusive_or_expression
+  	{ $1 }
+
+  | logical_and_expression "&&" inclusive_or_expression
+  	{% withNodeInfo $1 $ CBinary CLndOp $1 $3 }
+
+
+-- parse C logical or expression (C99 6.5.14)
+--
+logical_or_expression :: { CExpr }
+logical_or_expression
+  : logical_and_expression
+  	{ $1 }
+
+  | logical_or_expression "||" logical_and_expression
+  	{% withNodeInfo $1 $ CBinary CLorOp $1 $3 }
+
+
+-- parse C conditional expression (C99 6.5.15)
+--
+-- * GNU extensions:
+--     omitting the `then' part
+conditional_expression :: { CExpr }
+conditional_expression
+  : logical_or_expression
+  	{ $1 }
+
+  | logical_or_expression '?' expression ':' conditional_expression
+  	{% withNodeInfo $1 $ CCond $1 (Just $3) $5 }
+
+  | logical_or_expression '?' ':' conditional_expression
+  	{% withNodeInfo $1 $ CCond $1 Nothing $4 }
+
+
+-- parse C assignment expression (C99 6.5.16)
+--
+-- * NOTE: LHS of assignment is more restricted than in gcc.
+--         `x ? y : z = 3' parses in gcc as `(x ? y : z) = 3',
+--         but `x ? y : z' is not an unary expression.
+assignment_expression :: { CExpr }
+assignment_expression
+  : conditional_expression
+  	{ $1 }
+
+  | unary_expression assignment_operator assignment_expression
+  	{% withNodeInfo $1 $ CAssign (unL $2) $1 $3 }
+
+
+assignment_operator :: { Located CAssignOp }
+assignment_operator
+  : '='			{ L CAssignOp (posOf $1) }
+  | "*="		{ L CMulAssOp (posOf $1) }
+  | "/="		{ L CDivAssOp (posOf $1) }
+  | "%="		{ L CRmdAssOp (posOf $1) }
+  | "+="		{ L CAddAssOp (posOf $1) }
+  | "-="		{ L CSubAssOp (posOf $1) }
+  | "<<="		{ L CShlAssOp (posOf $1) }
+  | ">>="		{ L CShrAssOp (posOf $1) }
+  | "&="		{ L CAndAssOp (posOf $1) }
+  | "^="		{ L CXorAssOp (posOf $1) }
+  | "|="		{ L COrAssOp  (posOf $1) }
+
+
+-- parse C expression (C99 6.5.17)
+--
+expression :: { CExpr }
+expression
+  : assignment_expression
+  	{ $1 }
+
+  | assignment_expression ',' comma_expression
+  	{% let es = reverse $3 in withNodeInfo es $ CComma ($1:es) }
+
+comma_expression :: { Reversed [CExpr] }
+comma_expression
+  : assignment_expression			{ singleton $1 }
+  | comma_expression ',' assignment_expression	{ $1 `snoc` $3 }
+
+
+-- The following was used for clarity
+expression_opt :: { Maybe CExpr }
+expression_opt
+  : {- empty -}		{ Nothing }
+  | expression		{ Just $1 }
+
+
+-- The following was used for clarity
+assignment_expression_opt :: { Maybe CExpr }
+assignment_expression_opt
+  : {- empty -}				{ Nothing }
+  | assignment_expression		{ Just $1 }
+
+
+-- parse C constant expression (C99 6.6)
+--
+constant_expression :: { CExpr }
+constant_expression
+  : conditional_expression			{ $1 }
+
+
+-- parse C constants
+--
+constant :: { CConst }
+constant
+  : cint	  {% withNodeInfo $1 $ case $1 of CTokILit _ i -> CIntConst i }
+  | cchar	  {% withNodeInfo $1 $ case $1 of CTokCLit _ c -> CCharConst c }
+  | cfloat	{% withNodeInfo $1 $ case $1 of CTokFLit _ f -> CFloatConst f }
+
+
+string_literal :: { CStrLit }
+string_literal
+  : cstr
+  	{% withNodeInfo $1 $ case $1 of CTokSLit _ s -> CStrLit s }
+
+  | cstr string_literal_list
+  	{% withNodeInfo $1 $ case $1 of CTokSLit _ s -> CStrLit (concatCStrings (s : reverse $2)) }
+
+
+string_literal_list :: { Reversed [CString] }
+string_literal_list
+  : cstr			{ case $1 of CTokSLit _ s -> singleton s }
+  | string_literal_list cstr	{ case $2 of CTokSLit _ s -> $1 `snoc` s }
+
+clang_version_literal :: { ClangCVersion }
+  : clangcversion       { $1 }
+
+identifier :: { Ident }
+identifier
+  : ident		{ $1 }
+  | tyident		{ $1 }
+
+
+-- parse GNU C attribute annotation
+attrs_opt ::	{ [CAttr] }
+attrs_opt
+  : {- empty -}						{ [] }
+  | attrs         				{ $1 }
+
+-- GNU C attribute annotation
+attrs :: { [CAttr] }
+attrs
+  : attr						{ $1 }
+  | attrs attr	    { $1 ++ $2 }
+
+attr :: { [CAttr] }
+attr
+  : "__attribute__" '(' '(' attribute_list ')' ')'	{ reverse $4 }
+
+attribute_list :: { Reversed [CAttr] }
+  : attribute						          { case $1 of Nothing -> empty; Just attr -> singleton attr }
+  | attribute_list ',' attribute	{ (maybe id (flip snoc) $3) $1 }
+
+
+attribute :: { Maybe CAttr }
+attribute
+  : {- empty -}						         { Nothing }
+  | ident						               {% withNodeInfo $1 $ Just . CAttr $1  [] }
+  | const						               {% withNodeInfo $1 $ Just . CAttr (internalIdent "const") [] }
+  | ident '(' attribute_params ')' {% withNodeInfo $1 $ Just . CAttr $1 (reverse $3) }
+  | ident '(' ')'					         {% withNodeInfo $1 $ Just . CAttr $1 [] }
+
+-- OS X 10.9 (Mavericks) makes use of more liberal attribute syntax
+-- that includes assignment-like expressions referencing version
+-- numbers.
+
+attribute_params :: { Reversed [CExpr] }
+attribute_params
+  : constant_expression					              { singleton $1 }
+  | unary_expression assignment_operator clang_version_literal { Reversed [] }
+  | unary_expression assignment_operator unary_expression { Reversed [] }
+  | attribute_params ',' constant_expression	{ $1 `snoc` $3 }
+  | attribute_params ',' unary_expression assignment_operator unary_expression { $1 }
+  | attribute_params ',' unary_expression assignment_operator clang_version_literal { $1 }
+
+{
+
+--  sometimes it is neccessary to reverse an unreversed list
+reverseList :: [a] -> Reversed [a]
+reverseList = Reversed . List.reverse
+
+-- We occasionally need things to have a location when they don't naturally
+-- have one built in as tokens and most AST elements do.
+--
+data Located a = L !a !Position
+
+unL :: Located a -> a
+unL (L a pos) = a
+
+instance Pos (Located a) where
+  posOf (L _ pos) = pos
+
+-- FIXME: the next 3 inlines here increase the object file size by  70%
+-- Check whether the speed win is worth it
+{-# INLINE withNodeInfo #-}
+withNodeInfo :: Pos node => node -> (NodeInfo -> a) -> P a
+withNodeInfo node mkAttrNode = do
+  name <- getNewName
+  lastTok <- getSavedToken
+  let firstPos = posOf node
+  let attrs = mkNodeInfo' firstPos (posLenOfTok $! lastTok) name
+  attrs `seq` return (mkAttrNode attrs)
+
+{-# INLINE withLength #-}
+withLength :: NodeInfo -> (NodeInfo -> a) -> P a
+withLength nodeinfo mkAttrNode = do
+  lastTok <- getSavedToken
+  let firstPos = posOfNode nodeinfo
+  let attrs = mkNodeInfo' firstPos (posLenOfTok $! lastTok)
+              (maybe (error "nameOfNode") id (nameOfNode nodeinfo))
+  attrs `seq` return (mkAttrNode attrs)
+
+data CDeclrR = CDeclrR (Maybe Ident) (Reversed [CDerivedDeclr]) (Maybe CStrLit) [CAttr] NodeInfo
+reverseDeclr :: CDeclrR -> CDeclr
+reverseDeclr (CDeclrR ide reversedDDs asmname cattrs at)
+    = CDeclr ide (reverse reversedDDs) asmname cattrs at
+instance CNode (CDeclrR) where
+    nodeInfo (CDeclrR _ _ _ _ n) = n
+instance Pos (CDeclrR) where
+    posOf (CDeclrR _ _ _ _ n) = posOf n
+
+{-# INLINE withAttribute #-}
+withAttribute :: Pos node => node -> [CAttr] -> (NodeInfo -> CDeclrR) -> P CDeclrR
+withAttribute node cattrs mkDeclrNode = do
+  name <- getNewName
+  let attrs = mkNodeInfo (posOf node) name
+  let newDeclr = appendDeclrAttrs cattrs $ mkDeclrNode attrs
+  attrs `seq` newDeclr `seq` return newDeclr
+
+-- postfixing variant
+{-# INLINE withAttributePF #-}
+withAttributePF :: Pos node => node -> [CAttr] -> (NodeInfo -> CDeclrR -> CDeclrR) -> P (CDeclrR -> CDeclrR)
+withAttributePF node cattrs mkDeclrCtor = do
+  name <- getNewName
+  let attrs = mkNodeInfo (posOf node) name
+  let newDeclr = appendDeclrAttrs cattrs . mkDeclrCtor attrs
+  attrs `seq` newDeclr `seq` return newDeclr
+
+-- add top level attributes for a declarator.
+--
+-- In the following example
+--
+-- > int declr1, __attribute__((a1)) * __attribute__((a2)) y() __asm__("$" "y") __attribute__((a3));
+--
+-- the attributes `a1' and `a3' are top-level attributes for y.
+-- The (pseudo)-AST for the second declarator is
+--
+-- > CDeclr "y"
+-- >        [CFunDeclr ..., CPtrDeclr __attribute__((a2)) ... ]
+-- >        (asm "$y")
+-- >        [__attribute__((a1)), __attribute__((a3)) ]
+--
+-- So assembler names and preceeding and trailing attributes are recorded in object declarator.
+--
+appendObjAttrs :: [CAttr] -> CDeclr -> CDeclr
+appendObjAttrs newAttrs (CDeclr ident indirections asmname cAttrs at)
+    = CDeclr ident indirections asmname (cAttrs ++ newAttrs) at
+appendObjAttrsR :: [CAttr] -> CDeclrR -> CDeclrR
+appendObjAttrsR newAttrs (CDeclrR ident indirections asmname cAttrs at)
+    = CDeclrR ident indirections asmname (cAttrs ++ newAttrs) at
+
+setAsmName :: Maybe CStrLit  -> CDeclrR -> P CDeclrR
+setAsmName mAsmName (CDeclrR ident indirections oldName cattrs at) =
+    case combineName mAsmName oldName of
+        Left (n1,n2)       -> failP (posOf n2) ["Duplicate assembler name: ",showName n1,showName n2]
+        Right newName      -> return $ CDeclrR ident indirections newName cattrs at
+  where
+  combineName Nothing Nothing = Right Nothing
+  combineName Nothing oldname@(Just _)  = Right oldname
+  combineName newname@(Just _) Nothing  = Right newname
+  combineName (Just n1) (Just n2) = Left (n1,n2)
+  showName (CStrLit cstr _) = show cstr
+
+withAsmNameAttrs :: (Maybe CStrLit, [CAttr]) -> CDeclrR -> P CDeclrR
+withAsmNameAttrs (mAsmName, newAttrs) declr = setAsmName mAsmName (appendObjAttrsR newAttrs declr)
+
+appendDeclrAttrs :: [CAttr] -> CDeclrR -> CDeclrR
+appendDeclrAttrs newAttrs (CDeclrR ident (Reversed []) asmname cattrs at)
+    = CDeclrR ident empty asmname (cattrs ++ newAttrs) at
+appendDeclrAttrs newAttrs (CDeclrR ident (Reversed (x:xs)) asmname cattrs at)
+    = CDeclrR ident (Reversed (appendAttrs x : xs)) asmname cattrs at where
+    appendAttrs (CPtrDeclr typeQuals at)           = CPtrDeclr (typeQuals ++ map CAttrQual newAttrs) at
+    appendAttrs (CArrDeclr typeQuals arraySize at) = CArrDeclr (typeQuals ++ map CAttrQual newAttrs) arraySize at
+    appendAttrs (CFunDeclr parameters cattrs at)   = CFunDeclr parameters (cattrs ++ newAttrs) at
+
+ptrDeclr :: CDeclrR -> [CTypeQual] -> NodeInfo -> CDeclrR
+ptrDeclr (CDeclrR ident derivedDeclrs asmname cattrs dat) tyquals at
+    = CDeclrR ident (derivedDeclrs `snoc` CPtrDeclr tyquals at) asmname cattrs dat
+funDeclr :: CDeclrR -> (Either [Ident] ([CDecl],Bool)) -> [CAttr] -> NodeInfo -> CDeclrR
+funDeclr (CDeclrR ident derivedDeclrs asmname dcattrs dat) params cattrs at
+    = CDeclrR ident (derivedDeclrs `snoc` CFunDeclr params cattrs at) asmname dcattrs dat
+arrDeclr :: CDeclrR -> [CTypeQual] -> Bool -> Bool -> Maybe CExpr -> NodeInfo -> CDeclrR
+arrDeclr (CDeclrR ident derivedDeclrs asmname cattrs dat) tyquals var_sized static_size size_expr_opt at
+    = arr_sz `seq` ( CDeclrR ident (derivedDeclrs `snoc` CArrDeclr tyquals arr_sz at) asmname cattrs dat )
+    where
+    arr_sz = case size_expr_opt of
+                 Just e  -> CArrSize static_size e
+                 Nothing -> CNoArrSize var_sized
+
+liftTypeQuals :: Reversed [CTypeQual] -> [CDeclSpec]
+liftTypeQuals = map CTypeQual . reverse
+
+-- lift CAttrs to DeclSpecs
+--
+liftCAttrs :: [CAttr] -> [CDeclSpec]
+liftCAttrs = map (CTypeQual . CAttrQual)
+
+-- when we parsed (decl_spec_1,...,decl_spec_n,attrs), add the __attributes__s to the declspec list
+-- needs special care when @decl_spec_n@ is a SUE definition
+addTrailingAttrs :: Reversed [CDeclSpec] -> [CAttr] -> Reversed [CDeclSpec]
+addTrailingAttrs declspecs new_attrs =
+    case viewr declspecs of
+        (specs_init, CTypeSpec (CSUType (CStruct tag name (Just def) def_attrs su_node) node))
+            -> (specs_init `snoc` CTypeSpec (CSUType (CStruct tag name (Just def) (def_attrs ++ new_attrs) su_node) node))
+        (specs_init, CTypeSpec (CEnumType (CEnum name (Just def) def_attrs e_node) node))
+            -> (specs_init `snoc` CTypeSpec (CEnumType (CEnum name (Just def) (def_attrs ++ new_attrs) e_node) node))
+        _ -> declspecs `rappend` (liftCAttrs new_attrs)
+
+-- convenient instance, the position of a list of things is the position of
+-- the first thing in the list
+--
+instance Pos a => Pos [a] where
+  posOf (x:_) = posOf x
+
+instance Pos a => Pos (Reversed a) where
+  posOf (Reversed x) = posOf x
+
+emptyDeclr :: CDeclrR
+emptyDeclr       = CDeclrR Nothing empty Nothing [] undefNode
+mkVarDeclr :: Ident -> NodeInfo -> CDeclrR
+mkVarDeclr ident = CDeclrR (Just ident) empty Nothing []
+
+-- Take the identifiers and use them to update the typedef'ed identifier set
+-- if the decl is defining a typedef then we add it to the set,
+-- if it's a var decl then that shadows typedefed identifiers
+--
+doDeclIdent :: [CDeclSpec] -> CDeclrR -> P ()
+doDeclIdent declspecs (CDeclrR mIdent _ _ _ _) =
+  case mIdent of
+    Nothing -> return ()
+    Just ident | any iypedef declspecs -> addTypedef ident
+               | otherwise             -> shadowTypedef ident
+
+  where iypedef (CStorageSpec (CTypedef _)) = True
+        iypedef _                           = False
+
+doFuncParamDeclIdent :: CDeclr -> P ()
+doFuncParamDeclIdent (CDeclr _ (CFunDeclr params _ _ : _) _ _ _) =
+  sequence_
+    [ case getCDeclrIdent declr of
+        Nothing -> return ()
+        Just ident -> shadowTypedef ident
+    | CDecl _ dle _  <- either (const []) fst params
+    , (Just declr, _, _) <- dle ]
+doFuncParamDeclIdent _ = return ()
+
+-- extract all identifiers
+getCDeclrIdent :: CDeclr -> Maybe Ident
+getCDeclrIdent (CDeclr mIdent _ _ _ _) = mIdent
+
+happyError :: P a
+happyError = parseError
+
+-- * public interface
+
+-- | @parseC input initialPos@ parses the given preprocessed C-source input and returns the AST or a list of parse errors.
+parseC :: InputStream -> Position -> Either ParseError CTranslUnit
+parseC input initialPosition =
+  fmap fst $ execParser translUnitP input initialPosition builtinTypeNames (namesStartingFrom 0)
+
+-- | @translUnitP@ provides a parser for a complete C translation unit, i.e. a list of external declarations.
+translUnitP :: P CTranslUnit
+translUnitP = translation_unit
+-- | @extDeclP@ provides a parser for an external (file-scope) declaration
+extDeclP :: P CExtDecl
+extDeclP = external_declaration
+-- | @statementP@ provides a parser for C statements
+statementP :: P CStat
+statementP = statement
+-- | @expressionP@ provides a parser for C expressions
+expressionP :: P CExpr
+expressionP = expression
+}
src/Language/C/Parser/ParserMonad.hs view
@@ -1,181 +1,181 @@--------------------------------------------------------------------------------- |--- Module      :  Language.C.Syntax.ParserMonad--- Copyright   :  (c) [1999..2004] Manuel M T Chakravarty---                (c) 2005-2007 Duncan Coutts--- License     :  BSD-style--- Maintainer  :  benedikt.huber@gmail.com--- Portability :  portable------ Monad for the C lexer and parser------  This monad has to be usable with Alex and Happy. Some things in it are---  dictated by that, eg having to be able to remember the last token.------  The monad also provides a unique name supply (via the Name module)------  For parsing C we have to maintain a set of identifiers that we know to be---  typedef'ed type identifiers. We also must deal correctly with scope so we---  keep a list of sets of identifiers so we can save the outer scope when we---  enter an inner scope.-module Language.C.Parser.ParserMonad (-  P,-  execParser,-  failP,-  getNewName,        -- :: P Name-  addTypedef,        -- :: Ident -> P ()-  shadowTypedef,     -- :: Ident -> P ()-  isTypeIdent,       -- :: Ident -> P Bool-  enterScope,        -- :: P ()-  leaveScope,        -- :: P ()-  setPos,            -- :: Position -> P ()-  getPos,            -- :: P Position-  getInput,          -- :: P String-  setInput,          -- :: String -> P ()-  getLastToken,      -- :: P CToken-  getSavedToken,     -- :: P CToken-  setLastToken,      -- :: CToken -> P ()-  handleEofToken,    -- :: P ()-  getCurrentPosition,-- :: P Position-  ParseError(..),-  ) where-import Language.C.Data.Error (internalErr, showErrorInfo,ErrorInfo(..),ErrorLevel(..))-import Language.C.Data.Position  (Position(..))-import Language.C.Data.InputStream-import Language.C.Data.Name    (Name)-import Language.C.Data.Ident    (Ident)-import Language.C.Parser.Tokens (CToken(CTokEof))--import Control.Applicative (Applicative(..))-import Control.Monad (liftM, ap)-import Data.Set  (Set)-import qualified Data.Set as Set (fromList, insert, member, delete)--newtype ParseError = ParseError ([String],Position)-instance Show ParseError where-    show (ParseError (msgs,pos)) = showErrorInfo "Syntax Error !" (ErrorInfo LevelError pos msgs)---data ParseResult a-  = POk !PState a-  | PFailed [String] Position   -- The error message and position--data PState = PState {-        curPos     :: !Position,        -- position at current input location-        curInput   :: !InputStream,      -- the current input-        prevToken  ::  CToken,          -- the previous token-        savedToken ::  CToken,          -- and the token before that-        namesupply :: ![Name],          -- the name unique supply-        tyidents   :: !(Set Ident),     -- the set of typedef'ed identifiers-        scopes     :: ![Set Ident]      -- the tyident sets for outer scopes-     }--newtype P a = P { unP :: PState -> ParseResult a }--instance Functor P where-  fmap = liftM--instance Applicative P where-  pure = return-  (<*>) = ap--instance Monad P where-  return = returnP-  (>>=) = thenP-  fail m = getPos >>= \pos -> failP pos [m]----- | execute the given parser on the supplied input stream.---   returns 'ParseError' if the parser failed, and a pair of---   result and remaining name supply otherwise------ Synopsis: @execParser parser inputStream initialPos predefinedTypedefs uniqNameSupply@-execParser :: P a -> InputStream -> Position -> [Ident] -> [Name]-           -> Either ParseError (a,[Name])-execParser (P parser) input pos builtins names =-  case parser initialState of-    PFailed message errpos -> Left (ParseError (message,errpos))-    POk st result -> Right (result, namesupply st)-  where initialState = PState {-          curPos = pos,-          curInput = input,-          prevToken = internalErr "CLexer.execParser: Touched undefined token!",-          savedToken = internalErr "CLexer.execParser: Touched undefined token (safed token)!",-          namesupply = names,-          tyidents = Set.fromList builtins,-          scopes   = []-        }--{-# INLINE returnP #-}-returnP :: a -> P a-returnP a = P $ \s -> POk s a--{-# INLINE thenP #-}-thenP :: P a -> (a -> P b) -> P b-(P m) `thenP` k = P $ \s ->-        case m s of-                POk s' a        -> (unP (k a)) s'-                PFailed err pos -> PFailed err pos--failP :: Position -> [String] -> P a-failP pos msg = P $ \_ -> PFailed msg pos--getNewName :: P Name-getNewName = P $ \s@PState{namesupply=(n:ns)} -> n `seq` POk s{namesupply=ns} n--setPos :: Position -> P ()-setPos pos = P $ \s -> POk s{curPos=pos} ()--getPos :: P Position-getPos = P $ \s@PState{curPos=pos} -> POk s pos--addTypedef :: Ident -> P ()-addTypedef ident = (P $ \s@PState{tyidents=tyids} ->-                             POk s{tyidents = ident `Set.insert` tyids} ())--shadowTypedef :: Ident -> P ()-shadowTypedef ident = (P $ \s@PState{tyidents=tyids} ->-                             -- optimisation: mostly the ident will not be in-                             -- the tyident set so do a member lookup to avoid-                             --  churn induced by calling delete-                             POk s{tyidents = if ident `Set.member` tyids-                                                then ident `Set.delete` tyids-                                                else tyids } ())--isTypeIdent :: Ident -> P Bool-isTypeIdent ident = P $ \s@PState{tyidents=tyids} ->-                             POk s $! Set.member ident tyids--enterScope :: P ()-enterScope = P $ \s@PState{tyidents=tyids,scopes=ss} ->-                     POk s{scopes=tyids:ss} ()--leaveScope :: P ()-leaveScope = P $ \s@PState{scopes=ss} ->-                     case ss of-                       []          -> error "leaveScope: already in global scope"-                       (tyids:ss') -> POk s{tyidents=tyids, scopes=ss'} ()--getInput :: P InputStream-getInput = P $ \s@PState{curInput=i} -> POk s i--setInput :: InputStream -> P ()-setInput i = P $ \s -> POk s{curInput=i} ()--getLastToken :: P CToken-getLastToken = P $ \s@PState{prevToken=tok} -> POk s tok--getSavedToken :: P CToken-getSavedToken = P $ \s@PState{savedToken=tok} -> POk s tok---- | @setLastToken modifyCache tok@-setLastToken :: CToken -> P ()-setLastToken CTokEof = P $ \s -> POk s{savedToken=(prevToken s)} ()-setLastToken tok      = P $ \s -> POk s{prevToken=tok,savedToken=(prevToken s)} ()---- | handle an End-Of-File token (changes savedToken)-handleEofToken :: P ()-handleEofToken = P $ \s -> POk s{savedToken=(prevToken s)} ()--getCurrentPosition :: P Position-getCurrentPosition = P $ \s@PState{curPos=pos} -> POk s pos+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Syntax.ParserMonad
+-- Copyright   :  (c) [1999..2004] Manuel M T Chakravarty
+--                (c) 2005-2007 Duncan Coutts
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Portability :  portable
+--
+-- Monad for the C lexer and parser
+--
+--  This monad has to be usable with Alex and Happy. Some things in it are
+--  dictated by that, eg having to be able to remember the last token.
+--
+--  The monad also provides a unique name supply (via the Name module)
+--
+--  For parsing C we have to maintain a set of identifiers that we know to be
+--  typedef'ed type identifiers. We also must deal correctly with scope so we
+--  keep a list of sets of identifiers so we can save the outer scope when we
+--  enter an inner scope.
+module Language.C.Parser.ParserMonad (
+  P,
+  execParser,
+  failP,
+  getNewName,        -- :: P Name
+  addTypedef,        -- :: Ident -> P ()
+  shadowTypedef,     -- :: Ident -> P ()
+  isTypeIdent,       -- :: Ident -> P Bool
+  enterScope,        -- :: P ()
+  leaveScope,        -- :: P ()
+  setPos,            -- :: Position -> P ()
+  getPos,            -- :: P Position
+  getInput,          -- :: P String
+  setInput,          -- :: String -> P ()
+  getLastToken,      -- :: P CToken
+  getSavedToken,     -- :: P CToken
+  setLastToken,      -- :: CToken -> P ()
+  handleEofToken,    -- :: P ()
+  getCurrentPosition,-- :: P Position
+  ParseError(..),
+  ) where
+import Language.C.Data.Error (internalErr, showErrorInfo,ErrorInfo(..),ErrorLevel(..))
+import Language.C.Data.Position  (Position(..))
+import Language.C.Data.InputStream
+import Language.C.Data.Name    (Name)
+import Language.C.Data.Ident    (Ident)
+import Language.C.Parser.Tokens (CToken(CTokEof))
+
+import Control.Applicative (Applicative(..))
+import Control.Monad (liftM, ap)
+import Data.Set  (Set)
+import qualified Data.Set as Set (fromList, insert, member, delete)
+
+newtype ParseError = ParseError ([String],Position)
+instance Show ParseError where
+    show (ParseError (msgs,pos)) = showErrorInfo "Syntax Error !" (ErrorInfo LevelError pos msgs)
+
+
+data ParseResult a
+  = POk !PState a
+  | PFailed [String] Position   -- The error message and position
+
+data PState = PState {
+        curPos     :: !Position,        -- position at current input location
+        curInput   :: !InputStream,      -- the current input
+        prevToken  ::  CToken,          -- the previous token
+        savedToken ::  CToken,          -- and the token before that
+        namesupply :: ![Name],          -- the name unique supply
+        tyidents   :: !(Set Ident),     -- the set of typedef'ed identifiers
+        scopes     :: ![Set Ident]      -- the tyident sets for outer scopes
+     }
+
+newtype P a = P { unP :: PState -> ParseResult a }
+
+instance Functor P where
+  fmap = liftM
+
+instance Applicative P where
+  pure = return
+  (<*>) = ap
+
+instance Monad P where
+  return = returnP
+  (>>=) = thenP
+  fail m = getPos >>= \pos -> failP pos [m]
+
+
+-- | execute the given parser on the supplied input stream.
+--   returns 'ParseError' if the parser failed, and a pair of
+--   result and remaining name supply otherwise
+--
+-- Synopsis: @execParser parser inputStream initialPos predefinedTypedefs uniqNameSupply@
+execParser :: P a -> InputStream -> Position -> [Ident] -> [Name]
+           -> Either ParseError (a,[Name])
+execParser (P parser) input pos builtins names =
+  case parser initialState of
+    PFailed message errpos -> Left (ParseError (message,errpos))
+    POk st result -> Right (result, namesupply st)
+  where initialState = PState {
+          curPos = pos,
+          curInput = input,
+          prevToken = internalErr "CLexer.execParser: Touched undefined token!",
+          savedToken = internalErr "CLexer.execParser: Touched undefined token (safed token)!",
+          namesupply = names,
+          tyidents = Set.fromList builtins,
+          scopes   = []
+        }
+
+{-# INLINE returnP #-}
+returnP :: a -> P a
+returnP a = P $ \s -> POk s a
+
+{-# INLINE thenP #-}
+thenP :: P a -> (a -> P b) -> P b
+(P m) `thenP` k = P $ \s ->
+        case m s of
+                POk s' a        -> (unP (k a)) s'
+                PFailed err pos -> PFailed err pos
+
+failP :: Position -> [String] -> P a
+failP pos msg = P $ \_ -> PFailed msg pos
+
+getNewName :: P Name
+getNewName = P $ \s@PState{namesupply=(n:ns)} -> n `seq` POk s{namesupply=ns} n
+
+setPos :: Position -> P ()
+setPos pos = P $ \s -> POk s{curPos=pos} ()
+
+getPos :: P Position
+getPos = P $ \s@PState{curPos=pos} -> POk s pos
+
+addTypedef :: Ident -> P ()
+addTypedef ident = (P $ \s@PState{tyidents=tyids} ->
+                             POk s{tyidents = ident `Set.insert` tyids} ())
+
+shadowTypedef :: Ident -> P ()
+shadowTypedef ident = (P $ \s@PState{tyidents=tyids} ->
+                             -- optimisation: mostly the ident will not be in
+                             -- the tyident set so do a member lookup to avoid
+                             --  churn induced by calling delete
+                             POk s{tyidents = if ident `Set.member` tyids
+                                                then ident `Set.delete` tyids
+                                                else tyids } ())
+
+isTypeIdent :: Ident -> P Bool
+isTypeIdent ident = P $ \s@PState{tyidents=tyids} ->
+                             POk s $! Set.member ident tyids
+
+enterScope :: P ()
+enterScope = P $ \s@PState{tyidents=tyids,scopes=ss} ->
+                     POk s{scopes=tyids:ss} ()
+
+leaveScope :: P ()
+leaveScope = P $ \s@PState{scopes=ss} ->
+                     case ss of
+                       []          -> error "leaveScope: already in global scope"
+                       (tyids:ss') -> POk s{tyidents=tyids, scopes=ss'} ()
+
+getInput :: P InputStream
+getInput = P $ \s@PState{curInput=i} -> POk s i
+
+setInput :: InputStream -> P ()
+setInput i = P $ \s -> POk s{curInput=i} ()
+
+getLastToken :: P CToken
+getLastToken = P $ \s@PState{prevToken=tok} -> POk s tok
+
+getSavedToken :: P CToken
+getSavedToken = P $ \s@PState{savedToken=tok} -> POk s tok
+
+-- | @setLastToken modifyCache tok@
+setLastToken :: CToken -> P ()
+setLastToken CTokEof = P $ \s -> POk s{savedToken=(prevToken s)} ()
+setLastToken tok      = P $ \s -> POk s{prevToken=tok,savedToken=(prevToken s)} ()
+
+-- | handle an End-Of-File token (changes savedToken)
+handleEofToken :: P ()
+handleEofToken = P $ \s -> POk s{savedToken=(prevToken s)} ()
+
+getCurrentPosition :: P Position
+getCurrentPosition = P $ \s@PState{curPos=pos} -> POk s pos
src/Language/C/Parser/Tokens.hs view
@@ -1,382 +1,382 @@-{-# OPTIONS  #-}--------------------------------------------------------------------------------- |--- Module      :  Language.C.Parser.Tokens--- Copyright   :  [1999..2004] Manuel M T Chakravarty---                2005 Duncan Coutts--- License     :  BSD-style--- Maintainer  :  benedikt.huber@gmail.com--- Portability :  portable------  C Tokens for the C lexer.----------------------------------------------------------------------------------module Language.C.Parser.Tokens (CToken(..), posLenOfTok, GnuCTok(..), ClangCTok(..)) where--import Language.C.Data.Position    (Position, Pos(..), PosLength)-import Language.C.Data.Ident       (Ident, identToString)-import Language.C.Syntax.Constants (CChar, CInteger, CFloat, CString, ClangCVersion)---- token definition--- -------------------- possible tokens (EXPORTED)----data CToken = CTokLParen   !PosLength            -- `('-            | CTokRParen   !PosLength            -- `)'-            | CTokLBracket !PosLength            -- `['-            | CTokRBracket !PosLength            -- `]'-            | CTokArrow    !PosLength            -- `->'-            | CTokDot      !PosLength            -- `.'-            | CTokExclam   !PosLength            -- `!'-            | CTokTilde    !PosLength            -- `~'-            | CTokInc      !PosLength            -- `++'-            | CTokDec      !PosLength            -- `--'-            | CTokPlus     !PosLength            -- `+'-            | CTokMinus    !PosLength            -- `-'-            | CTokStar     !PosLength            -- `*'-            | CTokSlash    !PosLength            -- `/'-            | CTokPercent  !PosLength            -- `%'-            | CTokAmper    !PosLength            -- `&'-            | CTokShiftL   !PosLength            -- `<<'-            | CTokShiftR   !PosLength            -- `>>'-            | CTokLess     !PosLength            -- `<'-            | CTokLessEq   !PosLength            -- `<='-            | CTokHigh     !PosLength            -- `>'-            | CTokHighEq   !PosLength            -- `>='-            | CTokEqual    !PosLength            -- `=='-            | CTokUnequal  !PosLength            -- `!='-            | CTokHat      !PosLength            -- `^'-            | CTokBar      !PosLength            -- `|'-            | CTokAnd      !PosLength            -- `&&'-            | CTokOr       !PosLength            -- `||'-            | CTokQuest    !PosLength            -- `?'-            | CTokColon    !PosLength            -- `:'-            | CTokAssign   !PosLength            -- `='-            | CTokPlusAss  !PosLength            -- `+='-            | CTokMinusAss !PosLength            -- `-='-            | CTokStarAss  !PosLength            -- `*='-            | CTokSlashAss !PosLength            -- `/='-            | CTokPercAss  !PosLength            -- `%='-            | CTokAmpAss   !PosLength            -- `&='-            | CTokHatAss   !PosLength            -- `^='-            | CTokBarAss   !PosLength            -- `|='-            | CTokSLAss    !PosLength            -- `<<='-            | CTokSRAss    !PosLength            -- `>>='-            | CTokComma    !PosLength            -- `,'-            | CTokSemic    !PosLength            -- `;'-            | CTokLBrace   !PosLength            -- `{'-            | CTokRBrace   !PosLength            -- `}'-            | CTokEllipsis !PosLength            -- `...'-            | CTokAlignof  !PosLength            -- `alignof'-                                                -- (or `__alignof',-                                                -- `__alignof__')-            | CTokAlignas  !PosLength            -- `_Alignas'-            | CTokAsm      !PosLength            -- `asm'-                                                -- (or `__asm',-                                                -- `__asm__')-            | CTokAtomic   !PosLength            -- `_Atomic'-            | CTokAuto     !PosLength            -- `auto'-            | CTokBreak    !PosLength            -- `break'-            | CTokBool     !PosLength            -- `_Bool'-            | CTokCase     !PosLength            -- `case'-            | CTokChar     !PosLength            -- `char'-            | CTokConst    !PosLength            -- `const'-                                                -- (or `__const', `__const__')-            | CTokContinue !PosLength            -- `continue'-            | CTokComplex  !PosLength            -- `_Complex'-            | CTokDefault  !PosLength            -- `default'-            | CTokDo       !PosLength            -- `do'-            | CTokDouble   !PosLength            -- `double'-            | CTokElse     !PosLength            -- `else'-            | CTokEnum     !PosLength            -- `enum'-            | CTokExtern   !PosLength            -- `extern'-            | CTokFloat    !PosLength            -- `float'-            | CTokFloat128 !PosLength            -- `__float128' or `_Float128`-            | CTokFor      !PosLength            -- `for'-            | CTokGeneric  !PosLength            -- `_Generic'-            | CTokGoto     !PosLength            -- `goto'-            | CTokIf       !PosLength            -- `if'-            | CTokInline   !PosLength            -- `inline'-                                                -- (or `__inline',-                                                -- `__inline__')-            | CTokInt      !PosLength            -- `int'-            | CTokInt128   !PosLength            -- `__int128`-            | CTokLong     !PosLength            -- `long'-            | CTokLabel    !PosLength            -- `__label__-            | CTokNoreturn !PosLength            -- `_Noreturn'-            | CTokNullable !PosLength            -- `_Nullable'-            | CTokNonnull  !PosLength            -- `_Nonnull'-            | CTokRegister !PosLength            -- `register'-            | CTokRestrict !PosLength            -- `restrict'-                                                -- (or `__restrict',-                                                -- `__restrict__')-            | CTokReturn   !PosLength            -- `return'-            | CTokShort    !PosLength            -- `short'-            | CTokSigned   !PosLength            -- `signed'-                                                -- (or `__signed',-                                                -- `__signed__')-            | CTokSizeof   !PosLength            -- `sizeof'-            | CTokStatic   !PosLength            -- `static'-            | CTokStaticAssert !PosLength        -- `_Static_assert'-            | CTokStruct   !PosLength            -- `struct'-            | CTokSwitch   !PosLength            -- `switch'-            | CTokTypedef  !PosLength            -- `typedef'-            | CTokTypeof   !PosLength            -- `typeof'-            | CTokThread   !PosLength            -- `__thread'-            | CTokUnion    !PosLength            -- `union'-            | CTokUnsigned !PosLength            -- `unsigned'-            | CTokVoid     !PosLength            -- `void'-            | CTokVolatile !PosLength            -- `volatile'-                                                -- (or `__volatile',-                                                -- `__volatile__')-            | CTokWhile    !PosLength            -- `while'-            | CTokCLit     !PosLength !CChar     -- character constant-            | CTokILit     !PosLength !CInteger  -- integer constant-            | CTokFLit     !PosLength CFloat     -- float constant-            | CTokSLit     !PosLength CString    -- string constant-            | CTokIdent    !PosLength !Ident     -- identifier--              -- not generated here, but in `CParser.parseCHeader'-            | CTokTyIdent  !PosLength !Ident     -- `typedef-name' identifier-            | CTokGnuC !GnuCTok !PosLength       -- special GNU C tokens-            | CTokClangC !PosLength !ClangCTok   -- special Clang C tokens-            | CTokEof                           -- end of file---- special tokens used in GNU C extensions to ANSI C----data GnuCTok = GnuCAttrTok              -- `__attribute__'-             | GnuCExtTok               -- `__extension__'-             | GnuCVaArg                -- `__builtin_va_arg'-             | GnuCOffsetof             -- `__builtin_offsetof'-             | GnuCTyCompat             -- `__builtin_types_compatible_p'-             | GnuCComplexReal          -- `__real__'-             | GnuCComplexImag          -- `__imag__'--data ClangCTok = ClangCVersionTok !ClangCVersion -- version constant from 'availability' attribute-               | ClangBuiltinConvertVector--instance Pos CToken where-  posOf = fst . posLenOfTok---- token position and length-posLenOfTok :: CToken -> (Position,Int)-posLenOfTok (CTokLParen   pos  ) = pos-posLenOfTok (CTokRParen   pos  ) = pos-posLenOfTok (CTokLBracket pos  ) = pos-posLenOfTok (CTokRBracket pos  ) = pos-posLenOfTok (CTokArrow    pos  ) = pos-posLenOfTok (CTokDot      pos  ) = pos-posLenOfTok (CTokExclam   pos  ) = pos-posLenOfTok (CTokTilde    pos  ) = pos-posLenOfTok (CTokInc      pos  ) = pos-posLenOfTok (CTokDec      pos  ) = pos-posLenOfTok (CTokPlus     pos  ) = pos-posLenOfTok (CTokMinus    pos  ) = pos-posLenOfTok (CTokStar     pos  ) = pos-posLenOfTok (CTokSlash    pos  ) = pos-posLenOfTok (CTokPercent  pos  ) = pos-posLenOfTok (CTokAmper    pos  ) = pos-posLenOfTok (CTokShiftL   pos  ) = pos-posLenOfTok (CTokShiftR   pos  ) = pos-posLenOfTok (CTokLess     pos  ) = pos-posLenOfTok (CTokLessEq   pos  ) = pos-posLenOfTok (CTokHigh     pos  ) = pos-posLenOfTok (CTokHighEq   pos  ) = pos-posLenOfTok (CTokEqual    pos  ) = pos-posLenOfTok (CTokUnequal  pos  ) = pos-posLenOfTok (CTokHat      pos  ) = pos-posLenOfTok (CTokBar      pos  ) = pos-posLenOfTok (CTokAnd      pos  ) = pos-posLenOfTok (CTokOr       pos  ) = pos-posLenOfTok (CTokQuest    pos  ) = pos-posLenOfTok (CTokColon    pos  ) = pos-posLenOfTok (CTokAssign   pos  ) = pos-posLenOfTok (CTokPlusAss  pos  ) = pos-posLenOfTok (CTokMinusAss pos  ) = pos-posLenOfTok (CTokStarAss  pos  ) = pos-posLenOfTok (CTokSlashAss pos  ) = pos-posLenOfTok (CTokPercAss  pos  ) = pos-posLenOfTok (CTokAmpAss   pos  ) = pos-posLenOfTok (CTokHatAss   pos  ) = pos-posLenOfTok (CTokBarAss   pos  ) = pos-posLenOfTok (CTokSLAss    pos  ) = pos-posLenOfTok (CTokSRAss    pos  ) = pos-posLenOfTok (CTokComma    pos  ) = pos-posLenOfTok (CTokSemic    pos  ) = pos-posLenOfTok (CTokLBrace   pos  ) = pos-posLenOfTok (CTokRBrace   pos  ) = pos-posLenOfTok (CTokEllipsis pos  ) = pos-posLenOfTok (CTokAlignof  pos  ) = pos-posLenOfTok (CTokAlignas  pos  ) = pos-posLenOfTok (CTokAsm      pos  ) = pos-posLenOfTok (CTokAtomic   pos  ) = pos-posLenOfTok (CTokAuto     pos  ) = pos-posLenOfTok (CTokBreak    pos  ) = pos-posLenOfTok (CTokBool     pos  ) = pos-posLenOfTok (CTokCase     pos  ) = pos-posLenOfTok (CTokChar     pos  ) = pos-posLenOfTok (CTokConst    pos  ) = pos-posLenOfTok (CTokContinue pos  ) = pos-posLenOfTok (CTokComplex  pos  ) = pos-posLenOfTok (CTokDefault  pos  ) = pos-posLenOfTok (CTokDo       pos  ) = pos-posLenOfTok (CTokDouble   pos  ) = pos-posLenOfTok (CTokElse     pos  ) = pos-posLenOfTok (CTokEnum     pos  ) = pos-posLenOfTok (CTokExtern   pos  ) = pos-posLenOfTok (CTokFloat    pos  ) = pos-posLenOfTok (CTokFloat128 pos  ) = pos-posLenOfTok (CTokFor      pos  ) = pos-posLenOfTok (CTokGeneric  pos  ) = pos-posLenOfTok (CTokGoto     pos  ) = pos-posLenOfTok (CTokInt      pos  ) = pos-posLenOfTok (CTokInt128   pos  ) = pos-posLenOfTok (CTokInline   pos  ) = pos-posLenOfTok (CTokIf       pos  ) = pos-posLenOfTok (CTokLong     pos  ) = pos-posLenOfTok (CTokLabel    pos  ) = pos-posLenOfTok (CTokNoreturn pos  ) = pos-posLenOfTok (CTokNullable pos  ) = pos-posLenOfTok (CTokNonnull  pos  ) = pos-posLenOfTok (CTokRegister pos  ) = pos-posLenOfTok (CTokRestrict pos  ) = pos-posLenOfTok (CTokReturn   pos  ) = pos-posLenOfTok (CTokShort    pos  ) = pos-posLenOfTok (CTokSigned   pos  ) = pos-posLenOfTok (CTokSizeof   pos  ) = pos-posLenOfTok (CTokStatic   pos  ) = pos-posLenOfTok (CTokStaticAssert pos) = pos-posLenOfTok (CTokStruct   pos  ) = pos-posLenOfTok (CTokSwitch   pos  ) = pos-posLenOfTok (CTokTypedef  pos  ) = pos-posLenOfTok (CTokTypeof   pos  ) = pos-posLenOfTok (CTokThread   pos  ) = pos-posLenOfTok (CTokUnion    pos  ) = pos-posLenOfTok (CTokUnsigned pos  ) = pos-posLenOfTok (CTokVoid     pos  ) = pos-posLenOfTok (CTokVolatile pos  ) = pos-posLenOfTok (CTokWhile    pos  ) = pos-posLenOfTok (CTokCLit     pos _) = pos-posLenOfTok (CTokILit     pos _) = pos-posLenOfTok (CTokFLit     pos _) = pos-posLenOfTok (CTokSLit     pos _) = pos-posLenOfTok (CTokIdent    pos _) = pos-posLenOfTok (CTokTyIdent  pos _) = pos-posLenOfTok (CTokGnuC   _ pos  ) = pos-posLenOfTok (CTokClangC   pos _) = pos-posLenOfTok CTokEof = error "tokenPos: Eof"--instance Show CToken where-  showsPrec _ (CTokLParen   _  ) = showString "("-  showsPrec _ (CTokRParen   _  ) = showString ")"-  showsPrec _ (CTokLBracket _  ) = showString "["-  showsPrec _ (CTokRBracket _  ) = showString "]"-  showsPrec _ (CTokArrow    _  ) = showString "->"-  showsPrec _ (CTokDot      _  ) = showString "."-  showsPrec _ (CTokExclam   _  ) = showString "!"-  showsPrec _ (CTokTilde    _  ) = showString "~"-  showsPrec _ (CTokInc      _  ) = showString "++"-  showsPrec _ (CTokDec      _  ) = showString "--"-  showsPrec _ (CTokPlus     _  ) = showString "+"-  showsPrec _ (CTokMinus    _  ) = showString "-"-  showsPrec _ (CTokStar     _  ) = showString "*"-  showsPrec _ (CTokSlash    _  ) = showString "/"-  showsPrec _ (CTokPercent  _  ) = showString "%"-  showsPrec _ (CTokAmper    _  ) = showString "&"-  showsPrec _ (CTokShiftL   _  ) = showString "<<"-  showsPrec _ (CTokShiftR   _  ) = showString ">>"-  showsPrec _ (CTokLess     _  ) = showString "<"-  showsPrec _ (CTokLessEq   _  ) = showString "<="-  showsPrec _ (CTokHigh     _  ) = showString ">"-  showsPrec _ (CTokHighEq   _  ) = showString ">="-  showsPrec _ (CTokEqual    _  ) = showString "=="-  showsPrec _ (CTokUnequal  _  ) = showString "!="-  showsPrec _ (CTokHat      _  ) = showString "^"-  showsPrec _ (CTokBar      _  ) = showString "|"-  showsPrec _ (CTokAnd      _  ) = showString "&&"-  showsPrec _ (CTokOr       _  ) = showString "||"-  showsPrec _ (CTokQuest    _  ) = showString "?"-  showsPrec _ (CTokColon    _  ) = showString ":"-  showsPrec _ (CTokAssign   _  ) = showString "="-  showsPrec _ (CTokPlusAss  _  ) = showString "+="-  showsPrec _ (CTokMinusAss _  ) = showString "-="-  showsPrec _ (CTokStarAss  _  ) = showString "*="-  showsPrec _ (CTokSlashAss _  ) = showString "/="-  showsPrec _ (CTokPercAss  _  ) = showString "%="-  showsPrec _ (CTokAmpAss   _  ) = showString "&="-  showsPrec _ (CTokHatAss   _  ) = showString "^="-  showsPrec _ (CTokBarAss   _  ) = showString "|="-  showsPrec _ (CTokSLAss    _  ) = showString "<<="-  showsPrec _ (CTokSRAss    _  ) = showString ">>="-  showsPrec _ (CTokComma    _  ) = showString ","-  showsPrec _ (CTokSemic    _  ) = showString ";"-  showsPrec _ (CTokLBrace   _  ) = showString "{"-  showsPrec _ (CTokRBrace   _  ) = showString "}"-  showsPrec _ (CTokEllipsis _  ) = showString "..."-  showsPrec _ (CTokAlignof  _  ) = showString "alignof"-  showsPrec _ (CTokAlignas  _  ) = showString "_Alignas"-  showsPrec _ (CTokAsm      _  ) = showString "asm"-  showsPrec _ (CTokAtomic      _  ) = showString "_Atomic"-  showsPrec _ (CTokAuto     _  ) = showString "auto"-  showsPrec _ (CTokBool _)       = showString "_Bool"-  showsPrec _ (CTokBreak    _  ) = showString "break"-  showsPrec _ (CTokCase     _  ) = showString "case"-  showsPrec _ (CTokChar     _  ) = showString "char"-  showsPrec _ (CTokComplex _)    = showString "_Complex"-  showsPrec _ (CTokConst    _  ) = showString "const"-  showsPrec _ (CTokContinue _  ) = showString "continue"-  showsPrec _ (CTokDefault  _  ) = showString "default"-  showsPrec _ (CTokDouble   _  ) = showString "double"-  showsPrec _ (CTokDo       _  ) = showString "do"-  showsPrec _ (CTokElse     _  ) = showString "else"-  showsPrec _ (CTokEnum     _  ) = showString "enum"-  showsPrec _ (CTokExtern   _  ) = showString "extern"-  showsPrec _ (CTokFloat    _  ) = showString "float"-  showsPrec _ (CTokFloat128 _  ) = showString "__float128"-  showsPrec _ (CTokFor      _  ) = showString "for"-  showsPrec _ (CTokGeneric  _  ) = showString "_Generic"-  showsPrec _ (CTokGoto     _  ) = showString "goto"-  showsPrec _ (CTokIf       _  ) = showString "if"-  showsPrec _ (CTokInline   _  ) = showString "inline"-  showsPrec _ (CTokInt      _  ) = showString "int"-  showsPrec _ (CTokInt128   _  ) = showString "__int128"-  showsPrec _ (CTokLong     _  ) = showString "long"-  showsPrec _ (CTokLabel    _  ) = showString "__label__"-  showsPrec _ (CTokNoreturn    _  ) = showString "_Noreturn"-  showsPrec _ (CTokNullable    _  ) = showString "_Nullable"-  showsPrec _ (CTokNonnull     _  ) = showString "_Nonnull"-  showsPrec _ (CTokRegister _  ) = showString "register"-  showsPrec _ (CTokRestrict _  ) = showString "restrict"-  showsPrec _ (CTokReturn   _  ) = showString "return"-  showsPrec _ (CTokShort    _  ) = showString "short"-  showsPrec _ (CTokSigned   _  ) = showString "signed"-  showsPrec _ (CTokSizeof   _  ) = showString "sizeof"-  showsPrec _ (CTokStatic   _  ) = showString "static"-  showsPrec _ (CTokStaticAssert   _  ) = showString "_Static_assert"-  showsPrec _ (CTokStruct   _  ) = showString "struct"-  showsPrec _ (CTokSwitch   _  ) = showString "switch"-  showsPrec _ (CTokTypedef  _  ) = showString "typedef"-  showsPrec _ (CTokTypeof   _  ) = showString "typeof"-  showsPrec _ (CTokThread   _  ) = showString "_Thread_local"-  showsPrec _ (CTokUnion    _  ) = showString "union"-  showsPrec _ (CTokUnsigned _  ) = showString "unsigned"-  showsPrec _ (CTokVoid     _  ) = showString "void"-  showsPrec _ (CTokVolatile _  ) = showString "volatile"-  showsPrec _ (CTokWhile    _  ) = showString "while"-  showsPrec _ (CTokCLit     _ c) = shows c-  showsPrec _ (CTokILit     _ i) = shows i-  showsPrec _ (CTokFLit     _ f) = shows f-  showsPrec _ (CTokSLit     _ s) = shows s-  showsPrec _ (CTokIdent    _ i) = (showString . identToString) i-  showsPrec _ (CTokTyIdent  _ i) = (showString . identToString) i-  showsPrec _ (CTokGnuC GnuCAttrTok _) = showString "__attribute__"-  showsPrec _ (CTokGnuC GnuCExtTok  _) = showString "__extension__"-  showsPrec _ (CTokGnuC GnuCComplexReal _) = showString "__real__"-  showsPrec _ (CTokGnuC GnuCComplexImag  _) = showString "__imag__"-  showsPrec _ (CTokGnuC GnuCVaArg    _) = showString "__builtin_va_arg"-  showsPrec _ (CTokGnuC GnuCOffsetof _) = showString "__builtin_offsetof"-  showsPrec _ (CTokGnuC GnuCTyCompat _) = showString "__builtin_types_compatible_p"-  showsPrec _ (CTokClangC _ (ClangCVersionTok v)) = shows v-  showsPrec _ (CTokClangC _ ClangBuiltinConvertVector) = showString "__builtin_convertvector"-  showsPrec _ CTokEof = error "show CToken : CTokEof"+{-# OPTIONS  #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Parser.Tokens
+-- Copyright   :  [1999..2004] Manuel M T Chakravarty
+--                2005 Duncan Coutts
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Portability :  portable
+--
+--  C Tokens for the C lexer.
+--
+-----------------------------------------------------------------------------
+module Language.C.Parser.Tokens (CToken(..), posLenOfTok, GnuCTok(..), ClangCTok(..)) where
+
+import Language.C.Data.Position    (Position, Pos(..), PosLength)
+import Language.C.Data.Ident       (Ident, identToString)
+import Language.C.Syntax.Constants (CChar, CInteger, CFloat, CString, ClangCVersion)
+
+-- token definition
+-- ----------------
+
+-- possible tokens (EXPORTED)
+--
+data CToken = CTokLParen   !PosLength            -- `('
+            | CTokRParen   !PosLength            -- `)'
+            | CTokLBracket !PosLength            -- `['
+            | CTokRBracket !PosLength            -- `]'
+            | CTokArrow    !PosLength            -- `->'
+            | CTokDot      !PosLength            -- `.'
+            | CTokExclam   !PosLength            -- `!'
+            | CTokTilde    !PosLength            -- `~'
+            | CTokInc      !PosLength            -- `++'
+            | CTokDec      !PosLength            -- `--'
+            | CTokPlus     !PosLength            -- `+'
+            | CTokMinus    !PosLength            -- `-'
+            | CTokStar     !PosLength            -- `*'
+            | CTokSlash    !PosLength            -- `/'
+            | CTokPercent  !PosLength            -- `%'
+            | CTokAmper    !PosLength            -- `&'
+            | CTokShiftL   !PosLength            -- `<<'
+            | CTokShiftR   !PosLength            -- `>>'
+            | CTokLess     !PosLength            -- `<'
+            | CTokLessEq   !PosLength            -- `<='
+            | CTokHigh     !PosLength            -- `>'
+            | CTokHighEq   !PosLength            -- `>='
+            | CTokEqual    !PosLength            -- `=='
+            | CTokUnequal  !PosLength            -- `!='
+            | CTokHat      !PosLength            -- `^'
+            | CTokBar      !PosLength            -- `|'
+            | CTokAnd      !PosLength            -- `&&'
+            | CTokOr       !PosLength            -- `||'
+            | CTokQuest    !PosLength            -- `?'
+            | CTokColon    !PosLength            -- `:'
+            | CTokAssign   !PosLength            -- `='
+            | CTokPlusAss  !PosLength            -- `+='
+            | CTokMinusAss !PosLength            -- `-='
+            | CTokStarAss  !PosLength            -- `*='
+            | CTokSlashAss !PosLength            -- `/='
+            | CTokPercAss  !PosLength            -- `%='
+            | CTokAmpAss   !PosLength            -- `&='
+            | CTokHatAss   !PosLength            -- `^='
+            | CTokBarAss   !PosLength            -- `|='
+            | CTokSLAss    !PosLength            -- `<<='
+            | CTokSRAss    !PosLength            -- `>>='
+            | CTokComma    !PosLength            -- `,'
+            | CTokSemic    !PosLength            -- `;'
+            | CTokLBrace   !PosLength            -- `{'
+            | CTokRBrace   !PosLength            -- `}'
+            | CTokEllipsis !PosLength            -- `...'
+            | CTokAlignof  !PosLength            -- `alignof'
+                                                -- (or `__alignof',
+                                                -- `__alignof__')
+            | CTokAlignas  !PosLength            -- `_Alignas'
+            | CTokAsm      !PosLength            -- `asm'
+                                                -- (or `__asm',
+                                                -- `__asm__')
+            | CTokAtomic   !PosLength            -- `_Atomic'
+            | CTokAuto     !PosLength            -- `auto'
+            | CTokBreak    !PosLength            -- `break'
+            | CTokBool     !PosLength            -- `_Bool'
+            | CTokCase     !PosLength            -- `case'
+            | CTokChar     !PosLength            -- `char'
+            | CTokConst    !PosLength            -- `const'
+                                                -- (or `__const', `__const__')
+            | CTokContinue !PosLength            -- `continue'
+            | CTokComplex  !PosLength            -- `_Complex'
+            | CTokDefault  !PosLength            -- `default'
+            | CTokDo       !PosLength            -- `do'
+            | CTokDouble   !PosLength            -- `double'
+            | CTokElse     !PosLength            -- `else'
+            | CTokEnum     !PosLength            -- `enum'
+            | CTokExtern   !PosLength            -- `extern'
+            | CTokFloat    !PosLength            -- `float'
+            | CTokFloat128 !PosLength            -- `__float128' or `_Float128`
+            | CTokFor      !PosLength            -- `for'
+            | CTokGeneric  !PosLength            -- `_Generic'
+            | CTokGoto     !PosLength            -- `goto'
+            | CTokIf       !PosLength            -- `if'
+            | CTokInline   !PosLength            -- `inline'
+                                                -- (or `__inline',
+                                                -- `__inline__')
+            | CTokInt      !PosLength            -- `int'
+            | CTokInt128   !PosLength            -- `__int128`
+            | CTokLong     !PosLength            -- `long'
+            | CTokLabel    !PosLength            -- `__label__
+            | CTokNoreturn !PosLength            -- `_Noreturn'
+            | CTokNullable !PosLength            -- `_Nullable'
+            | CTokNonnull  !PosLength            -- `_Nonnull'
+            | CTokRegister !PosLength            -- `register'
+            | CTokRestrict !PosLength            -- `restrict'
+                                                -- (or `__restrict',
+                                                -- `__restrict__')
+            | CTokReturn   !PosLength            -- `return'
+            | CTokShort    !PosLength            -- `short'
+            | CTokSigned   !PosLength            -- `signed'
+                                                -- (or `__signed',
+                                                -- `__signed__')
+            | CTokSizeof   !PosLength            -- `sizeof'
+            | CTokStatic   !PosLength            -- `static'
+            | CTokStaticAssert !PosLength        -- `_Static_assert'
+            | CTokStruct   !PosLength            -- `struct'
+            | CTokSwitch   !PosLength            -- `switch'
+            | CTokTypedef  !PosLength            -- `typedef'
+            | CTokTypeof   !PosLength            -- `typeof'
+            | CTokThread   !PosLength            -- `__thread'
+            | CTokUnion    !PosLength            -- `union'
+            | CTokUnsigned !PosLength            -- `unsigned'
+            | CTokVoid     !PosLength            -- `void'
+            | CTokVolatile !PosLength            -- `volatile'
+                                                -- (or `__volatile',
+                                                -- `__volatile__')
+            | CTokWhile    !PosLength            -- `while'
+            | CTokCLit     !PosLength !CChar     -- character constant
+            | CTokILit     !PosLength !CInteger  -- integer constant
+            | CTokFLit     !PosLength CFloat     -- float constant
+            | CTokSLit     !PosLength CString    -- string constant
+            | CTokIdent    !PosLength !Ident     -- identifier
+
+              -- not generated here, but in `CParser.parseCHeader'
+            | CTokTyIdent  !PosLength !Ident     -- `typedef-name' identifier
+            | CTokGnuC !GnuCTok !PosLength       -- special GNU C tokens
+            | CTokClangC !PosLength !ClangCTok   -- special Clang C tokens
+            | CTokEof                           -- end of file
+
+-- special tokens used in GNU C extensions to ANSI C
+--
+data GnuCTok = GnuCAttrTok              -- `__attribute__'
+             | GnuCExtTok               -- `__extension__'
+             | GnuCVaArg                -- `__builtin_va_arg'
+             | GnuCOffsetof             -- `__builtin_offsetof'
+             | GnuCTyCompat             -- `__builtin_types_compatible_p'
+             | GnuCComplexReal          -- `__real__'
+             | GnuCComplexImag          -- `__imag__'
+
+data ClangCTok = ClangCVersionTok !ClangCVersion -- version constant from 'availability' attribute
+               | ClangBuiltinConvertVector
+
+instance Pos CToken where
+  posOf = fst . posLenOfTok
+
+-- token position and length
+posLenOfTok :: CToken -> (Position,Int)
+posLenOfTok (CTokLParen   pos  ) = pos
+posLenOfTok (CTokRParen   pos  ) = pos
+posLenOfTok (CTokLBracket pos  ) = pos
+posLenOfTok (CTokRBracket pos  ) = pos
+posLenOfTok (CTokArrow    pos  ) = pos
+posLenOfTok (CTokDot      pos  ) = pos
+posLenOfTok (CTokExclam   pos  ) = pos
+posLenOfTok (CTokTilde    pos  ) = pos
+posLenOfTok (CTokInc      pos  ) = pos
+posLenOfTok (CTokDec      pos  ) = pos
+posLenOfTok (CTokPlus     pos  ) = pos
+posLenOfTok (CTokMinus    pos  ) = pos
+posLenOfTok (CTokStar     pos  ) = pos
+posLenOfTok (CTokSlash    pos  ) = pos
+posLenOfTok (CTokPercent  pos  ) = pos
+posLenOfTok (CTokAmper    pos  ) = pos
+posLenOfTok (CTokShiftL   pos  ) = pos
+posLenOfTok (CTokShiftR   pos  ) = pos
+posLenOfTok (CTokLess     pos  ) = pos
+posLenOfTok (CTokLessEq   pos  ) = pos
+posLenOfTok (CTokHigh     pos  ) = pos
+posLenOfTok (CTokHighEq   pos  ) = pos
+posLenOfTok (CTokEqual    pos  ) = pos
+posLenOfTok (CTokUnequal  pos  ) = pos
+posLenOfTok (CTokHat      pos  ) = pos
+posLenOfTok (CTokBar      pos  ) = pos
+posLenOfTok (CTokAnd      pos  ) = pos
+posLenOfTok (CTokOr       pos  ) = pos
+posLenOfTok (CTokQuest    pos  ) = pos
+posLenOfTok (CTokColon    pos  ) = pos
+posLenOfTok (CTokAssign   pos  ) = pos
+posLenOfTok (CTokPlusAss  pos  ) = pos
+posLenOfTok (CTokMinusAss pos  ) = pos
+posLenOfTok (CTokStarAss  pos  ) = pos
+posLenOfTok (CTokSlashAss pos  ) = pos
+posLenOfTok (CTokPercAss  pos  ) = pos
+posLenOfTok (CTokAmpAss   pos  ) = pos
+posLenOfTok (CTokHatAss   pos  ) = pos
+posLenOfTok (CTokBarAss   pos  ) = pos
+posLenOfTok (CTokSLAss    pos  ) = pos
+posLenOfTok (CTokSRAss    pos  ) = pos
+posLenOfTok (CTokComma    pos  ) = pos
+posLenOfTok (CTokSemic    pos  ) = pos
+posLenOfTok (CTokLBrace   pos  ) = pos
+posLenOfTok (CTokRBrace   pos  ) = pos
+posLenOfTok (CTokEllipsis pos  ) = pos
+posLenOfTok (CTokAlignof  pos  ) = pos
+posLenOfTok (CTokAlignas  pos  ) = pos
+posLenOfTok (CTokAsm      pos  ) = pos
+posLenOfTok (CTokAtomic   pos  ) = pos
+posLenOfTok (CTokAuto     pos  ) = pos
+posLenOfTok (CTokBreak    pos  ) = pos
+posLenOfTok (CTokBool     pos  ) = pos
+posLenOfTok (CTokCase     pos  ) = pos
+posLenOfTok (CTokChar     pos  ) = pos
+posLenOfTok (CTokConst    pos  ) = pos
+posLenOfTok (CTokContinue pos  ) = pos
+posLenOfTok (CTokComplex  pos  ) = pos
+posLenOfTok (CTokDefault  pos  ) = pos
+posLenOfTok (CTokDo       pos  ) = pos
+posLenOfTok (CTokDouble   pos  ) = pos
+posLenOfTok (CTokElse     pos  ) = pos
+posLenOfTok (CTokEnum     pos  ) = pos
+posLenOfTok (CTokExtern   pos  ) = pos
+posLenOfTok (CTokFloat    pos  ) = pos
+posLenOfTok (CTokFloat128 pos  ) = pos
+posLenOfTok (CTokFor      pos  ) = pos
+posLenOfTok (CTokGeneric  pos  ) = pos
+posLenOfTok (CTokGoto     pos  ) = pos
+posLenOfTok (CTokInt      pos  ) = pos
+posLenOfTok (CTokInt128   pos  ) = pos
+posLenOfTok (CTokInline   pos  ) = pos
+posLenOfTok (CTokIf       pos  ) = pos
+posLenOfTok (CTokLong     pos  ) = pos
+posLenOfTok (CTokLabel    pos  ) = pos
+posLenOfTok (CTokNoreturn pos  ) = pos
+posLenOfTok (CTokNullable pos  ) = pos
+posLenOfTok (CTokNonnull  pos  ) = pos
+posLenOfTok (CTokRegister pos  ) = pos
+posLenOfTok (CTokRestrict pos  ) = pos
+posLenOfTok (CTokReturn   pos  ) = pos
+posLenOfTok (CTokShort    pos  ) = pos
+posLenOfTok (CTokSigned   pos  ) = pos
+posLenOfTok (CTokSizeof   pos  ) = pos
+posLenOfTok (CTokStatic   pos  ) = pos
+posLenOfTok (CTokStaticAssert pos) = pos
+posLenOfTok (CTokStruct   pos  ) = pos
+posLenOfTok (CTokSwitch   pos  ) = pos
+posLenOfTok (CTokTypedef  pos  ) = pos
+posLenOfTok (CTokTypeof   pos  ) = pos
+posLenOfTok (CTokThread   pos  ) = pos
+posLenOfTok (CTokUnion    pos  ) = pos
+posLenOfTok (CTokUnsigned pos  ) = pos
+posLenOfTok (CTokVoid     pos  ) = pos
+posLenOfTok (CTokVolatile pos  ) = pos
+posLenOfTok (CTokWhile    pos  ) = pos
+posLenOfTok (CTokCLit     pos _) = pos
+posLenOfTok (CTokILit     pos _) = pos
+posLenOfTok (CTokFLit     pos _) = pos
+posLenOfTok (CTokSLit     pos _) = pos
+posLenOfTok (CTokIdent    pos _) = pos
+posLenOfTok (CTokTyIdent  pos _) = pos
+posLenOfTok (CTokGnuC   _ pos  ) = pos
+posLenOfTok (CTokClangC   pos _) = pos
+posLenOfTok CTokEof = error "tokenPos: Eof"
+
+instance Show CToken where
+  showsPrec _ (CTokLParen   _  ) = showString "("
+  showsPrec _ (CTokRParen   _  ) = showString ")"
+  showsPrec _ (CTokLBracket _  ) = showString "["
+  showsPrec _ (CTokRBracket _  ) = showString "]"
+  showsPrec _ (CTokArrow    _  ) = showString "->"
+  showsPrec _ (CTokDot      _  ) = showString "."
+  showsPrec _ (CTokExclam   _  ) = showString "!"
+  showsPrec _ (CTokTilde    _  ) = showString "~"
+  showsPrec _ (CTokInc      _  ) = showString "++"
+  showsPrec _ (CTokDec      _  ) = showString "--"
+  showsPrec _ (CTokPlus     _  ) = showString "+"
+  showsPrec _ (CTokMinus    _  ) = showString "-"
+  showsPrec _ (CTokStar     _  ) = showString "*"
+  showsPrec _ (CTokSlash    _  ) = showString "/"
+  showsPrec _ (CTokPercent  _  ) = showString "%"
+  showsPrec _ (CTokAmper    _  ) = showString "&"
+  showsPrec _ (CTokShiftL   _  ) = showString "<<"
+  showsPrec _ (CTokShiftR   _  ) = showString ">>"
+  showsPrec _ (CTokLess     _  ) = showString "<"
+  showsPrec _ (CTokLessEq   _  ) = showString "<="
+  showsPrec _ (CTokHigh     _  ) = showString ">"
+  showsPrec _ (CTokHighEq   _  ) = showString ">="
+  showsPrec _ (CTokEqual    _  ) = showString "=="
+  showsPrec _ (CTokUnequal  _  ) = showString "!="
+  showsPrec _ (CTokHat      _  ) = showString "^"
+  showsPrec _ (CTokBar      _  ) = showString "|"
+  showsPrec _ (CTokAnd      _  ) = showString "&&"
+  showsPrec _ (CTokOr       _  ) = showString "||"
+  showsPrec _ (CTokQuest    _  ) = showString "?"
+  showsPrec _ (CTokColon    _  ) = showString ":"
+  showsPrec _ (CTokAssign   _  ) = showString "="
+  showsPrec _ (CTokPlusAss  _  ) = showString "+="
+  showsPrec _ (CTokMinusAss _  ) = showString "-="
+  showsPrec _ (CTokStarAss  _  ) = showString "*="
+  showsPrec _ (CTokSlashAss _  ) = showString "/="
+  showsPrec _ (CTokPercAss  _  ) = showString "%="
+  showsPrec _ (CTokAmpAss   _  ) = showString "&="
+  showsPrec _ (CTokHatAss   _  ) = showString "^="
+  showsPrec _ (CTokBarAss   _  ) = showString "|="
+  showsPrec _ (CTokSLAss    _  ) = showString "<<="
+  showsPrec _ (CTokSRAss    _  ) = showString ">>="
+  showsPrec _ (CTokComma    _  ) = showString ","
+  showsPrec _ (CTokSemic    _  ) = showString ";"
+  showsPrec _ (CTokLBrace   _  ) = showString "{"
+  showsPrec _ (CTokRBrace   _  ) = showString "}"
+  showsPrec _ (CTokEllipsis _  ) = showString "..."
+  showsPrec _ (CTokAlignof  _  ) = showString "alignof"
+  showsPrec _ (CTokAlignas  _  ) = showString "_Alignas"
+  showsPrec _ (CTokAsm      _  ) = showString "asm"
+  showsPrec _ (CTokAtomic      _  ) = showString "_Atomic"
+  showsPrec _ (CTokAuto     _  ) = showString "auto"
+  showsPrec _ (CTokBool _)       = showString "_Bool"
+  showsPrec _ (CTokBreak    _  ) = showString "break"
+  showsPrec _ (CTokCase     _  ) = showString "case"
+  showsPrec _ (CTokChar     _  ) = showString "char"
+  showsPrec _ (CTokComplex _)    = showString "_Complex"
+  showsPrec _ (CTokConst    _  ) = showString "const"
+  showsPrec _ (CTokContinue _  ) = showString "continue"
+  showsPrec _ (CTokDefault  _  ) = showString "default"
+  showsPrec _ (CTokDouble   _  ) = showString "double"
+  showsPrec _ (CTokDo       _  ) = showString "do"
+  showsPrec _ (CTokElse     _  ) = showString "else"
+  showsPrec _ (CTokEnum     _  ) = showString "enum"
+  showsPrec _ (CTokExtern   _  ) = showString "extern"
+  showsPrec _ (CTokFloat    _  ) = showString "float"
+  showsPrec _ (CTokFloat128 _  ) = showString "__float128"
+  showsPrec _ (CTokFor      _  ) = showString "for"
+  showsPrec _ (CTokGeneric  _  ) = showString "_Generic"
+  showsPrec _ (CTokGoto     _  ) = showString "goto"
+  showsPrec _ (CTokIf       _  ) = showString "if"
+  showsPrec _ (CTokInline   _  ) = showString "inline"
+  showsPrec _ (CTokInt      _  ) = showString "int"
+  showsPrec _ (CTokInt128   _  ) = showString "__int128"
+  showsPrec _ (CTokLong     _  ) = showString "long"
+  showsPrec _ (CTokLabel    _  ) = showString "__label__"
+  showsPrec _ (CTokNoreturn    _  ) = showString "_Noreturn"
+  showsPrec _ (CTokNullable    _  ) = showString "_Nullable"
+  showsPrec _ (CTokNonnull     _  ) = showString "_Nonnull"
+  showsPrec _ (CTokRegister _  ) = showString "register"
+  showsPrec _ (CTokRestrict _  ) = showString "restrict"
+  showsPrec _ (CTokReturn   _  ) = showString "return"
+  showsPrec _ (CTokShort    _  ) = showString "short"
+  showsPrec _ (CTokSigned   _  ) = showString "signed"
+  showsPrec _ (CTokSizeof   _  ) = showString "sizeof"
+  showsPrec _ (CTokStatic   _  ) = showString "static"
+  showsPrec _ (CTokStaticAssert   _  ) = showString "_Static_assert"
+  showsPrec _ (CTokStruct   _  ) = showString "struct"
+  showsPrec _ (CTokSwitch   _  ) = showString "switch"
+  showsPrec _ (CTokTypedef  _  ) = showString "typedef"
+  showsPrec _ (CTokTypeof   _  ) = showString "typeof"
+  showsPrec _ (CTokThread   _  ) = showString "_Thread_local"
+  showsPrec _ (CTokUnion    _  ) = showString "union"
+  showsPrec _ (CTokUnsigned _  ) = showString "unsigned"
+  showsPrec _ (CTokVoid     _  ) = showString "void"
+  showsPrec _ (CTokVolatile _  ) = showString "volatile"
+  showsPrec _ (CTokWhile    _  ) = showString "while"
+  showsPrec _ (CTokCLit     _ c) = shows c
+  showsPrec _ (CTokILit     _ i) = shows i
+  showsPrec _ (CTokFLit     _ f) = shows f
+  showsPrec _ (CTokSLit     _ s) = shows s
+  showsPrec _ (CTokIdent    _ i) = (showString . identToString) i
+  showsPrec _ (CTokTyIdent  _ i) = (showString . identToString) i
+  showsPrec _ (CTokGnuC GnuCAttrTok _) = showString "__attribute__"
+  showsPrec _ (CTokGnuC GnuCExtTok  _) = showString "__extension__"
+  showsPrec _ (CTokGnuC GnuCComplexReal _) = showString "__real__"
+  showsPrec _ (CTokGnuC GnuCComplexImag  _) = showString "__imag__"
+  showsPrec _ (CTokGnuC GnuCVaArg    _) = showString "__builtin_va_arg"
+  showsPrec _ (CTokGnuC GnuCOffsetof _) = showString "__builtin_offsetof"
+  showsPrec _ (CTokGnuC GnuCTyCompat _) = showString "__builtin_types_compatible_p"
+  showsPrec _ (CTokClangC _ (ClangCVersionTok v)) = shows v
+  showsPrec _ (CTokClangC _ ClangBuiltinConvertVector) = showString "__builtin_convertvector"
+  showsPrec _ CTokEof = error "show CToken : CTokEof"
src/Language/C/Pretty.hs view
@@ -1,545 +1,546 @@-{-# LANGUAGE TypeSynonymInstances, FlexibleInstances, FlexibleContexts #-}--------------------------------------------------------------------------------- |--- Module      :  Language.C.Pretty--- Copyright   :  Copyright (c) 2007 Bertram Felgenhauer---                          (c) 2008 Benedikt Huber--- License     :  BSD-style--- Maintainer  : benedikt.huber@gmail.com--- Stability   : experimental--- Portability : portable------ This module provides a pretty printer for the parse tree--- ('Language.C.Syntax.AST').-------------------------------------------------------------------------------module Language.C.Pretty (-    -- * Pretty Printing-    Pretty (..),-    -- * Testing-    prettyUsingInclude-) where-import Data.List (isSuffixOf)-import qualified Data.Set as Set-import Text.PrettyPrint.HughesPJ-import Debug.Trace {- for warnings -}--import Language.C.Data-import Language.C.Syntax---- | A class of types which can be pretty printed-class Pretty p where-    -- | pretty print the given value-    pretty     :: p -> Doc-    -- | @prettyPrec prec p@ pretty prints p assuming-    -- that the surrounding context has a precedence of-    -- @prec@-    prettyPrec :: Int -> p -> Doc--    pretty       = prettyPrec 0-    prettyPrec _ = pretty---- pretty print optional chunk-maybeP :: (p -> Doc) -> Maybe p -> Doc-maybeP = maybe empty---- pretty print when flag is true-ifP :: Bool -> Doc -> Doc-ifP flag doc = if flag then doc else empty---- pretty print _optional_ list, i.e. [] ~ Nothing and (x:xs) ~ Just (x:xs)-mlistP :: ([p] -> Doc) -> [p] -> Doc-mlistP pp xs = maybeP pp (if null xs then Nothing else Just xs)---- pretty print identifier-identP :: Ident -> Doc-identP = text . identToString---- pretty print attribute annotations-attrlistP :: [CAttr] -> Doc-attrlistP [] = empty-attrlistP attrs = text "__attribute__" <> parens (parens (hcat . punctuate comma . map pretty $ attrs))---- analogous to showParen-parenPrec :: Int -> Int -> Doc -> Doc-parenPrec prec prec2 t = if prec <= prec2 then t else parens t---- indent a chunk of code-ii :: Doc -> Doc-ii = nest 4---- Pretty instances-instance Pretty CTranslUnit where-    pretty (CTranslUnit edecls _) = vcat (map pretty edecls)---- | Pretty print the given tranlation unit, but replace declarations from header files with @#include@ directives.------ The resulting file may not compile (because of missing @#define@ directives and similar things), but is very useful--- for testing, as otherwise the pretty printed file will be cluttered with declarations from system headers.-prettyUsingInclude :: CTranslUnit -> Doc-prettyUsingInclude (CTranslUnit edecls _) =-  includeWarning headerFiles-    $$-  vcat (map (either includeHeader pretty) mappedDecls)-  where-    (headerFiles,mappedDecls) = foldr (addDecl . tagIncludedDecls) (Set.empty,[]) edecls-    tagIncludedDecls edecl | maybe False isHeaderFile (fileOfNode edecl) = Left ((posFile . posOf) edecl)-                           | otherwise = Right edecl-    addDecl decl@(Left headerRef) (headerSet, ds)-      | Set.member headerRef headerSet = (headerSet, ds)-      | otherwise = (Set.insert headerRef headerSet, decl : ds)-    addDecl decl (headerSet,ds) = (headerSet, decl : ds)-    includeHeader hFile = text "#include" <+> doubleQuotes (text hFile)-    isHeaderFile = (".h" `isSuffixOf`)-    includeWarning hs | Set.null hs = empty-                      | otherwise = text "/* Warning: The #include directives in this file aren't necessarily correct. */"---- TODO: Check need of __extension__-instance Pretty CExtDecl where-    pretty (CDeclExt decl) = pretty decl <> semi-    pretty (CFDefExt fund) = pretty fund-    pretty (CAsmExt  asmStmt _) = text "asm" <> parens (pretty asmStmt) <> semi---- TODO: Check that old-style and new-style aren't mixed-instance Pretty CFunDef where-    pretty (CFunDef declspecs declr decls stat _) =          -- Example:-            hsep (map pretty declspecs)                      -- __attribute__((noreturn)) static long-        <+> pretty declr                                     -- foo(b)-        $+$ (ii . vcat . map ((<> semi) . pretty)) decls     --     register long b;-        $$ prettyPrec (-1) stat                              -- {  ...-                                                             -- }--instance Pretty CStat where-    pretty (CLabel ident stat cattrs _) = identP ident <> text ":" <+> attrlistP cattrs $$ pretty stat-    pretty (CCase expr stat _) =-        text "case" <+> pretty expr <> text ":" $$ pretty stat-    pretty (CCases expr1 expr2 stat _) =-        text "case" <+> pretty expr1 <+> text "..."-                    <+> pretty expr2 <> text ":" $$ pretty stat-    pretty (CDefault stat _) = text "default:" $$ pretty stat-    pretty (CExpr expr _) = ii $ maybeP pretty expr <> semi-    pretty c@(CCompound _ _ _) = prettyPrec 0 c-    pretty (CIf expr stat estat _) =-        ii $  text "if" <+> parens (pretty expr)-                $+$ prettyBody stat-                $$  maybeP prettyElse estat-      where-        prettyBody c@(CCompound _ _ _) = prettyPrec (-1) c-        prettyBody nonCompound         = prettyPrec (-1) (CCompound [] [CBlockStmt nonCompound] undefined)-        prettyElse (CIf else_if_expr else_if_stat else_stat _) =-          text "else if" <+> parens (pretty else_if_expr)-            $+$ prettyBody else_if_stat-            $$  maybeP prettyElse else_stat-        prettyElse else_stmt =-          text "else"-            $+$ prettyBody else_stmt--    pretty (CSwitch expr stat _) =-        ii $ text "switch" <+> text "(" <> pretty expr <> text ")"-               $+$ prettyPrec (-1) stat-    pretty (CWhile expr stat False _) =-        ii $ text "while" <+> text "(" <> pretty expr <> text ")"-               $+$ prettyPrec (-1) stat-    pretty (CWhile expr stat True _) =-        ii $ text "do" $+$ prettyPrec (-1) stat-               $$ text "while" <+> text "(" <> pretty expr <> text ");"-    pretty (CFor for_init cond step stat _) =-        ii $ text "for" <+> text "("-               <> either (maybeP pretty) pretty for_init <> semi-               <+> maybeP pretty cond <> semi-               <+> maybeP pretty step <> text ")" $+$ prettyPrec (-1) stat-    pretty (CGoto ident _) = ii $ text "goto" <+> identP ident <> semi-    pretty (CGotoPtr expr _) = ii $ text "goto" <+> text "*" <+> prettyPrec 30 expr <> semi-    pretty (CCont _) = ii $ text "continue" <> semi-    pretty (CBreak _) = ii $ text "break" <> semi-    pretty (CReturn Nothing _) = ii $ text "return" <> semi-    pretty (CReturn (Just e) _) = ii $ text "return" <+> pretty e <> semi-    pretty (CAsm asmStmt _) = pretty asmStmt-    prettyPrec p (CCompound localLabels bis _) =-        let inner = text "{" $+$ mlistP ppLblDecls localLabels $+$ vcat (map pretty bis) $$ text "}"-        in  if p == -1 then inner else ii inner-        where ppLblDecls =  vcat . map (\l -> text "__label__" <+> identP l <+> semi)-    prettyPrec _ p = pretty p--instance Pretty CAsmStmt where-    pretty (CAsmStmt tyQual expr outOps inOps clobbers _) =-        ii $ text "__asm__" <+>-             maybeP pretty tyQual <>-             parens asmStmt <> semi-      where-        asmStmt = pretty expr <+>-                  (if all null [inOps,outOps] && null clobbers then empty else ops)-        ops     =  text ":" <+> hcat (punctuate comma (map pretty outOps)) <+>-                   text ":" <+> hcat (punctuate comma (map pretty inOps)) <+>-                   (if null clobbers then empty else clobs)-        clobs   =  text ":" <+> hcat (punctuate comma (map pretty clobbers))--instance Pretty CAsmOperand where-    -- asm_operand :~ [operand-name] "constraint" ( expr )-    pretty (CAsmOperand mArgName cnstr expr _) =-        maybeP (\argName -> text "[" <> identP argName <> text "]") mArgName <+>-        pretty cnstr <+>-        parens (pretty expr)---- TODO: Check need of __extension__-instance Pretty CBlockItem where-    pretty (CBlockStmt stat) = pretty stat-    pretty (CBlockDecl decl) = ii $ pretty decl <> semi-    pretty (CNestedFunDef fundef) = ii $ pretty fundef--instance Pretty CDecl where-    -- CAVEAT:-    -- we may not print __attribute__s directly after typespecs,-    -- as this may change the semantics of the declaration.-    -- The parser fixes this, but to avoid hard-to-track code generator-    -- errors, we enforce this invariant on the AST level.-    pretty (CDecl specs divs _) =-        hsep (map pretty checked_specs) <+> hsep (punctuate comma (map p divs))-            where-            -- possible hint for AST improvement - (declr, initializer, expr, attrs)-            -- currently there are no sensible attributes for unnamed bitfields though-            p (declr, initializer, expr) =-                maybeP (prettyDeclr False 0) declr <+>-                maybeP ((text ":" <+>) . pretty) expr <+>-                attrlistP (getAttrs declr) <+>-                maybeP ((text "=" <+>) . pretty) initializer-            checked_specs =-                if any isAttrAfterSUE  (zip specs (tail specs))-                    then trace-                           ("Warning: AST Invariant violated: __attribute__ specifier following struct/union/enum:" ++-                            show (map pretty specs))-                           specs-                    else specs-            isAttrAfterSUE (CTypeSpec ty,CTypeQual (CAttrQual _)) = isSUEDef ty-            isAttrAfterSUE _ = False-            getAttrs Nothing = []-            getAttrs (Just (CDeclr _ _ _ cattrs _)) = cattrs-    pretty (CStaticAssert expr str _) =-      text "_Static_assert" <> parens (hsep (punctuate comma [pretty expr, pretty str]))--instance Pretty CDeclSpec where-    pretty (CStorageSpec sp) = pretty sp-    pretty (CTypeSpec sp) = pretty sp-    pretty (CTypeQual qu) = pretty qu-    pretty (CFunSpec fs) = pretty fs-    pretty (CAlignSpec sa) = pretty sa--instance Pretty CAlignSpec where-    pretty (CAlignAsType decl _) =-        text "_Alignas" <> parens (pretty decl)-    pretty (CAlignAsExpr expr _) =-        text "_Alignas" <> parens (pretty expr)--instance Pretty CStorageSpec where-    pretty (CAuto _) = text "auto"-    pretty (CRegister _) = text "register"-    pretty (CStatic _) = text "static"-    pretty (CExtern _) = text "extern"-    pretty (CTypedef _) = text "typedef"-    pretty (CThread _) = text "_Thread_local"--instance Pretty CTypeSpec where-    pretty (CVoidType _)        = text "void"-    pretty (CCharType _)        = text "char"-    pretty (CShortType _)       = text "short"-    pretty (CIntType _)         = text "int"-    pretty (CLongType _)        = text "long"-    pretty (CFloatType _)       = text "float"-    pretty (CFloat128Type _)    = text "__float128"-    pretty (CDoubleType _)      = text "double"-    pretty (CSignedType _)      = text "signed"-    pretty (CUnsigType _)       = text "unsigned"-    pretty (CBoolType _)        = text "_Bool"-    pretty (CComplexType _)     = text "_Complex"-    pretty (CInt128Type _)      = text "__int128"-    pretty (CSUType union _)    = pretty union-    pretty (CEnumType enum _)   = pretty enum-    pretty (CTypeDef ident _)   = identP ident-    pretty (CTypeOfExpr expr _) =-        text "typeof" <> parens (pretty expr)-    pretty (CTypeOfType decl _) =-        text "typeof" <> parens (pretty decl)-    pretty (CAtomicType decl _) =-        text "_Atomic" <> parens (pretty decl)--instance Pretty CTypeQual where-    pretty (CConstQual _) = text "const"-    pretty (CVolatQual _) = text "volatile"-    pretty (CRestrQual _) = text "__restrict"-    pretty (CAtomicQual _) = text "_Atomic"-    pretty (CAttrQual a)  = attrlistP [a]-    pretty (CNullableQual _) = text "_Nullable"-    pretty (CNonnullQual _) = text "_Nonnull"--instance Pretty CFunSpec where-    pretty (CInlineQual _) = text "inline"-    pretty (CNoreturnQual _) = text "_Noreturn"--instance Pretty CStructUnion where-    pretty (CStruct tag ident Nothing cattrs _) = pretty tag <+> attrlistP cattrs <+> maybeP identP ident-    pretty (CStruct tag ident (Just []) cattrs _) =-        pretty tag <+> attrlistP cattrs <+> maybeP identP ident <+> text "{ }"-    pretty (CStruct tag ident (Just decls) cattrs _) = vcat [-        pretty tag <+> attrlistP cattrs <+> maybeP identP ident <+> text "{",-        ii $ sep (map ((<> semi) . pretty) decls),-        text "}"]--instance Pretty CStructTag where-    pretty CStructTag = text "struct"-    pretty CUnionTag  = text "union"--instance Pretty CEnum where-    pretty (CEnum enum_ident Nothing cattrs _) = text "enum" <+> attrlistP cattrs <+> maybeP identP enum_ident-    pretty (CEnum enum_ident (Just vals) cattrs _) = vcat [-        text "enum" <+> attrlistP cattrs <+> maybeP identP enum_ident <+> text "{",-        ii $ sep (punctuate comma (map p vals)),-        text "}"] where-        p (ident, expr) = identP ident <+> maybeP ((text "=" <+>) . pretty) expr----  Analyze a declarator and return a human-readable description---   See C99 Spec p 115ff.--- describeDeclr :: CDeclr -> Doc--- describeDeclr declr =---     let declrs = reverse (declrChain declr) in---     endDescr (foldl descrDeclr undefined declrs)------   where---   declrChain declr@(CVarDeclr _ _ _ _) = [declr]---   declrChain declr@(CPtrDeclr _ ideclr _)   = declr : declrChain ideclr---   declrChain declr@(CArrDeclr ideclr _ _ _) = declr : declrChain ideclr---   declrChain declr@(CFunDeclr ideclr _ _ _)   = declr : declrChain ideclr------   descrDeclr _ (CVarDeclr ident asm cattrs _) = single False $ \_ ->---       maybe (text "<anonymous>") identP ident <+>---       maybeP (\asmname -> parens (text "asm:" <+> pretty asmname)) asm <+>---       text "is" <+> (if null cattrs then empty else prettyList (map CAttrQual cattrs) <> comma)---   descrDeclr (pre,isPlural) (CPtrDeclr quals declr _) = single isPlural $ \pluralize ->---       pre <+> indefArticle isPlural <> prettyList quals <+> pluralize "pointer to" "pointers to"---   descrDeclr (pre,isPlural) (CArrDeclr declr quals expr _) = plural isPlural $ \pluralize ->---       pre <+> indefArticle' isPlural <> prettyList quals <+> pluralize "array of" "arrays of"---   descrDeclr (pre,isPlural) (CFunDeclr declr params cattrs _) = single isPlural $ \pluralize ->---       pre <+> indefArticle isPlural <> prettyList (map CAttrQual cattrs) <+> pluralize "function returning" "functions returning"---   endDescr (pre, isPlural) =  pre <+> text (if isPlural then "<typed objects>" else "a <typed object>")---   single :: Bool -> ( (String -> String -> Doc) -> a ) -> (a, Bool)---   single isPlural mkDescr = (mkDescr (pluralize isPlural), isPlural)---   plural :: Bool -> ( (String -> String -> Doc) -> a ) -> (a, Bool)---   plural isPlural mkDescr = (mkDescr (pluralize isPlural), True)---   indefArticle isPlural  = text$ if isPlural then "" else "a "---   indefArticle' isPlural = text$ if isPlural then "" else "an "---   pluralize isPlural s p = text (if isPlural then p else s)---   prettyList :: (Pretty a) => [a] -> Doc---   prettyList = hsep . punctuate comma . map pretty-instance Pretty CDeclr where-    prettyPrec prec declr = prettyDeclr True prec declr--prettyDeclr :: Bool -> Int -> CDeclr -> Doc-prettyDeclr show_attrs prec (CDeclr name derived_declrs asmname cattrs _) =-    ppDeclr prec (reverse derived_declrs) <+> prettyAsmName asmname <+> ifP show_attrs (attrlistP cattrs)-    where-    ppDeclr _ [] = maybeP identP name-    --'*' __attribute__? qualifiers declarator-    ppDeclr p (CPtrDeclr quals _ : declrs) =-        parenPrec p 5 $ text "*" <+> hsep (map pretty quals) <+> ppDeclr 5 declrs--    -- declarator[ __attribute__? qualifiers expr ]-    ppDeclr p (CArrDeclr quals size _ : declrs) =-        parenPrec p 6 $ ppDeclr 6 declrs <> brackets (hsep (map pretty quals) <+> pretty size)-    -- declarator ( arguments )-    -- or (__attribute__ declarator) (arguments)-    ppDeclr _ (CFunDeclr params fun_attrs _ : declrs) =-        (if not (null fun_attrs) then parens (attrlistP fun_attrs <+> ppDeclr 5 declrs) else ppDeclr 6 declrs)-        <> parens (prettyParams params)-    prettyParams (Right (decls, isVariadic)) =-     sep (punctuate comma (map pretty decls))-     <> (if isVariadic then text "," <+> text "..." else empty)-    prettyParams (Left oldStyleIds) =-     hsep (punctuate comma (map identP oldStyleIds))-    prettyAsmName asm_name_opt-        = maybe empty (\asm_name -> text "__asm__" <> parens (pretty asm_name)) asm_name_opt--instance Pretty CArrSize where-  pretty (CNoArrSize completeType) = ifP completeType (text "*")-  pretty (CArrSize staticMod expr) = ifP staticMod (text "static") <+> pretty expr--- initializer :: { CInit }--- initializer :- assignment_expression---              | '{' (designation? initializer)_cs_list '}'-instance Pretty CInit where-    pretty (CInitExpr expr _) = pretty expr-    pretty (CInitList initl _) =-        text "{" <+> hsep (punctuate comma (map p initl)) <+> text "}" where-        p ([], initializer)     = pretty initializer-        p (desigs, initializer) = hsep (map pretty desigs) <+> text "=" <+> pretty initializer---- designation :- designator_list '='---             | array_range_designator--- arr_designator :- '[' constant_expression ']'--- member_designator :-  '.' identifier--- arr_range _designator :- '[' constant_expression "..." constant_expression ']'--instance Pretty CDesignator where-    pretty (CArrDesig expr _) = text "[" <> pretty expr <> text "]"-    pretty (CMemberDesig ident _) = text "." <> identP ident-    pretty (CRangeDesig expr1 expr2 _) =-        text "[" <> pretty expr1 <+> text "..." <+> pretty expr2 <> text "]"--instance Pretty CAttr where-    pretty (CAttr attrName [] _) = identP attrName-    pretty (CAttr attrName attrParams _) = identP attrName <> parens (hsep . punctuate comma . map pretty $ attrParams)--instance Pretty CExpr where-    prettyPrec p (CComma exprs _) =-        parenPrec p (-1) $ hsep (punctuate comma (map (prettyPrec 2) exprs))-    prettyPrec p (CAssign op expr1 expr2 _) =-        parenPrec p 2 $ prettyPrec 3 expr1 <+> pretty op <+> prettyPrec 2 expr2-    prettyPrec p (CCond expr1 expr2 expr3 _) =-        parenPrec p 2 $ prettyPrec 4 expr1 <+> text "?" -- NB: assignment only has a higher precedence if cond is on the rhs-           <+> maybeP pretty expr2 <+> text ":" <+> prettyPrec 4 expr3-    prettyPrec p (CBinary op expr1 expr2 _) =-        let prec = binPrec op-        in  parenPrec p prec $ prettyPrec prec expr1-                             <+> pretty op <+> prettyPrec (prec + 1) expr2-    prettyPrec p (CCast decl expr _) =-        parenPrec p 25 $ text "(" <> pretty decl <> text ")"-                       <+> prettyPrec 25 expr-    prettyPrec p (CUnary CPostIncOp expr _) =-        parenPrec p 26 $ prettyPrec 26 expr <> text "++"-    prettyPrec p (CUnary CPostDecOp expr _) =-        parenPrec p 26 $ prettyPrec 26 expr <> text "--"-    prettyPrec p (CUnary op expr@(CUnary _ _ _) _) =-        --                             parens aren't necessary, but look nicer imho-        parenPrec p 25 $ pretty op <+> parens (prettyPrec 25 expr)-    prettyPrec p (CUnary op expr _) =-        parenPrec p 25 $ pretty op <> prettyPrec 25 expr-    prettyPrec p (CSizeofExpr expr _) =-        parenPrec p 25 $ text "sizeof" <> parens (pretty expr)-    prettyPrec p (CSizeofType decl _) =-        parenPrec p 25 $ text "sizeof" <> parens (pretty decl)-    prettyPrec p (CAlignofExpr expr _) =-        parenPrec p 25 $ text "__alignof" <> parens (pretty expr)-    prettyPrec p (CAlignofType decl _) =-        parenPrec p 25 $ text "__alignof" <> parens (pretty decl)-    prettyPrec p (CComplexReal expr _) =-        parenPrec p 25 $ text "__real" <+> prettyPrec 25 expr-    prettyPrec p (CComplexImag expr _) =-        parenPrec p 25 $ text "__imag" <+> prettyPrec 25 expr-    prettyPrec p (CIndex expr1 expr2 _) =-        parenPrec p 26 $ prettyPrec 26 expr1-                       <> text "[" <> pretty expr2 <> text "]"-    prettyPrec p (CCall expr args _) =-        parenPrec p 30 $ prettyPrec 30 expr <> text "("-            <> (sep . punctuate comma . map pretty) args <> text ")"-    prettyPrec p (CMember expr ident deref _) =-        parenPrec p 26 $ prettyPrec 26 expr-                       <> text (if deref then "->" else ".") <> identP ident-    prettyPrec _p (CVar ident _) = identP ident-    prettyPrec _p (CConst constant) = pretty constant-    prettyPrec _p (CCompoundLit decl initl _) =-        parens (pretty decl) <+> (braces . hsep . punctuate comma) (map p initl) where-        p ([], initializer)           = pretty initializer-        p (mems, initializer) = hcat (punctuate (text ".") (map pretty mems)) <+> text "=" <+> pretty initializer--    prettyPrec _p (CStatExpr stat _) =-        text "(" <> pretty stat <> text ")"--    -- unary_expr :- && ident  {- address of label -}-    prettyPrec _p (CLabAddrExpr ident _) = text "&&" <> identP ident-    prettyPrec _p (CGenericSelection expr assoc_list _) =-      text "_Generic" <> (parens.hsep.punctuate comma) (pretty expr : map pAssoc assoc_list)-      where-        pAssoc (mty, expr1) = maybe (text "default") pretty mty <> text ":" <+> pretty expr1-    prettyPrec _p (CBuiltinExpr builtin) = pretty builtin--instance Pretty CBuiltin where-    pretty (CBuiltinVaArg expr ty_name _) =-        text "__builtin_va_arg" <+>-        parens (pretty expr <> comma <+> pretty ty_name)-    -- The first desig has to be a member field.-    pretty (CBuiltinOffsetOf ty_name (CMemberDesig field1 _ : desigs) _) =-        text "__builtin_offsetof" <+>-        parens (pretty ty_name <> comma <+> identP field1 <> hcat (map pretty desigs) )-    pretty (CBuiltinOffsetOf _ty_name otherDesigs _) =-        error $ "Inconsistent AST: Cannot interpret designators in offsetOf: " ++-                show (hcat $ map pretty otherDesigs)-    pretty (CBuiltinTypesCompatible ty1 ty2 _) =-        text "__builtin_types_compatible_p" <+>-        parens (pretty ty1 <> comma <+> pretty ty2)-    pretty (CBuiltinConvertVector expr ty _)  =-        text "__builtin_convertvector" <+>-        parens (pretty expr <> comma <+> pretty ty)--instance Pretty CAssignOp where-  pretty op = text $ case op of-    CAssignOp -> "="-    CMulAssOp -> "*="-    CDivAssOp -> "/="-    CRmdAssOp -> "%="-    CAddAssOp -> "+="-    CSubAssOp -> "-="-    CShlAssOp -> "<<="-    CShrAssOp -> ">>="-    CAndAssOp -> "&="-    CXorAssOp -> "^="-    COrAssOp  -> "|="--instance Pretty CBinaryOp where-  pretty op = text $ case op of-    CMulOp -> "*"-    CDivOp -> "/"-    CRmdOp -> "%"-    CAddOp -> "+"-    CSubOp -> "-"-    CShlOp -> "<<"-    CShrOp -> ">>"-    CLeOp  -> "<"-    CGrOp  -> ">"-    CLeqOp -> "<="-    CGeqOp -> ">="-    CEqOp  -> "=="-    CNeqOp -> "!="-    CAndOp -> "&"-    CXorOp -> "^"-    COrOp  -> "|"-    CLndOp -> "&&"-    CLorOp -> "||"--instance Pretty CUnaryOp where-  pretty op = text $ case op of-    CPreIncOp  -> "++"-    CPreDecOp  -> "--"-    CPostIncOp -> "++"-    CPostDecOp -> "--"-    CAdrOp     -> "&"-    CIndOp     -> "*"-    CPlusOp    -> "+"-    CMinOp     -> "-"-    CCompOp    -> "~"-    CNegOp     -> "!"--instance Pretty CConst where-    pretty (CIntConst   int_const _) = text (show int_const)-    pretty (CCharConst  chr _) = text (show chr)-    pretty (CFloatConst flt _) = text (show flt)-    pretty (CStrConst   str _) = text (show str)--instance Pretty CStrLit where-    pretty (CStrLit   str _) = text (show str)---- precedence of C operators-binPrec :: CBinaryOp -> Int-binPrec CMulOp = 20-binPrec CDivOp = 20-binPrec CRmdOp = 20-binPrec CAddOp = 19-binPrec CSubOp = 19-binPrec CShlOp = 18-binPrec CShrOp = 18-binPrec CLeOp  = 17-binPrec CGrOp  = 17-binPrec CLeqOp = 17-binPrec CGeqOp = 17-binPrec CEqOp  = 16-binPrec CNeqOp = 16-binPrec CAndOp = 15-binPrec CXorOp = 14-binPrec COrOp  = 13-binPrec CLndOp = 12-binPrec CLorOp = 11+{-# LANGUAGE TypeSynonymInstances, FlexibleInstances, FlexibleContexts #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Pretty
+-- Copyright   :  Copyright (c) 2007 Bertram Felgenhauer
+--                          (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  : benedikt.huber@gmail.com
+-- Stability   : experimental
+-- Portability : portable
+--
+-- This module provides a pretty printer for the parse tree
+-- ('Language.C.Syntax.AST').
+-----------------------------------------------------------------------------
+module Language.C.Pretty (
+    -- * Pretty Printing
+    Pretty (..),
+    -- * Testing
+    prettyUsingInclude
+) where
+import Data.List (isSuffixOf)
+import qualified Data.Set as Set
+import Text.PrettyPrint.HughesPJ
+import Debug.Trace {- for warnings -}
+import Prelude hiding ((<>))
+
+import Language.C.Data
+import Language.C.Syntax
+
+-- | A class of types which can be pretty printed
+class Pretty p where
+    -- | pretty print the given value
+    pretty     :: p -> Doc
+    -- | @prettyPrec prec p@ pretty prints p assuming
+    -- that the surrounding context has a precedence of
+    -- @prec@
+    prettyPrec :: Int -> p -> Doc
+
+    pretty       = prettyPrec 0
+    prettyPrec _ = pretty
+
+-- pretty print optional chunk
+maybeP :: (p -> Doc) -> Maybe p -> Doc
+maybeP = maybe empty
+
+-- pretty print when flag is true
+ifP :: Bool -> Doc -> Doc
+ifP flag doc = if flag then doc else empty
+
+-- pretty print _optional_ list, i.e. [] ~ Nothing and (x:xs) ~ Just (x:xs)
+mlistP :: ([p] -> Doc) -> [p] -> Doc
+mlistP pp xs = maybeP pp (if null xs then Nothing else Just xs)
+
+-- pretty print identifier
+identP :: Ident -> Doc
+identP = text . identToString
+
+-- pretty print attribute annotations
+attrlistP :: [CAttr] -> Doc
+attrlistP [] = empty
+attrlistP attrs = text "__attribute__" <> parens (parens (hcat . punctuate comma . map pretty $ attrs))
+
+-- analogous to showParen
+parenPrec :: Int -> Int -> Doc -> Doc
+parenPrec prec prec2 t = if prec <= prec2 then t else parens t
+
+-- indent a chunk of code
+ii :: Doc -> Doc
+ii = nest 4
+
+-- Pretty instances
+instance Pretty CTranslUnit where
+    pretty (CTranslUnit edecls _) = vcat (map pretty edecls)
+
+-- | Pretty print the given tranlation unit, but replace declarations from header files with @#include@ directives.
+--
+-- The resulting file may not compile (because of missing @#define@ directives and similar things), but is very useful
+-- for testing, as otherwise the pretty printed file will be cluttered with declarations from system headers.
+prettyUsingInclude :: CTranslUnit -> Doc
+prettyUsingInclude (CTranslUnit edecls _) =
+  includeWarning headerFiles
+    $$
+  vcat (map (either includeHeader pretty) mappedDecls)
+  where
+    (headerFiles,mappedDecls) = foldr (addDecl . tagIncludedDecls) (Set.empty,[]) edecls
+    tagIncludedDecls edecl | maybe False isHeaderFile (fileOfNode edecl) = Left ((posFile . posOf) edecl)
+                           | otherwise = Right edecl
+    addDecl decl@(Left headerRef) (headerSet, ds)
+      | Set.member headerRef headerSet = (headerSet, ds)
+      | otherwise = (Set.insert headerRef headerSet, decl : ds)
+    addDecl decl (headerSet,ds) = (headerSet, decl : ds)
+    includeHeader hFile = text "#include" <+> doubleQuotes (text hFile)
+    isHeaderFile = (".h" `isSuffixOf`)
+    includeWarning hs | Set.null hs = empty
+                      | otherwise = text "/* Warning: The #include directives in this file aren't necessarily correct. */"
+
+-- TODO: Check need of __extension__
+instance Pretty CExtDecl where
+    pretty (CDeclExt decl) = pretty decl <> semi
+    pretty (CFDefExt fund) = pretty fund
+    pretty (CAsmExt  asmStmt _) = text "asm" <> parens (pretty asmStmt) <> semi
+
+-- TODO: Check that old-style and new-style aren't mixed
+instance Pretty CFunDef where
+    pretty (CFunDef declspecs declr decls stat _) =          -- Example:
+            hsep (map pretty declspecs)                      -- __attribute__((noreturn)) static long
+        <+> pretty declr                                     -- foo(b)
+        $+$ (ii . vcat . map ((<> semi) . pretty)) decls     --     register long b;
+        $$ prettyPrec (-1) stat                              -- {  ...
+                                                             -- }
+
+instance Pretty CStat where
+    pretty (CLabel ident stat cattrs _) = identP ident <> text ":" <+> attrlistP cattrs $$ pretty stat
+    pretty (CCase expr stat _) =
+        text "case" <+> pretty expr <> text ":" $$ pretty stat
+    pretty (CCases expr1 expr2 stat _) =
+        text "case" <+> pretty expr1 <+> text "..."
+                    <+> pretty expr2 <> text ":" $$ pretty stat
+    pretty (CDefault stat _) = text "default:" $$ pretty stat
+    pretty (CExpr expr _) = ii $ maybeP pretty expr <> semi
+    pretty c@(CCompound _ _ _) = prettyPrec 0 c
+    pretty (CIf expr stat estat _) =
+        ii $  text "if" <+> parens (pretty expr)
+                $+$ prettyBody stat
+                $$  maybeP prettyElse estat
+      where
+        prettyBody c@(CCompound _ _ _) = prettyPrec (-1) c
+        prettyBody nonCompound         = prettyPrec (-1) (CCompound [] [CBlockStmt nonCompound] undefined)
+        prettyElse (CIf else_if_expr else_if_stat else_stat _) =
+          text "else if" <+> parens (pretty else_if_expr)
+            $+$ prettyBody else_if_stat
+            $$  maybeP prettyElse else_stat
+        prettyElse else_stmt =
+          text "else"
+            $+$ prettyBody else_stmt
+
+    pretty (CSwitch expr stat _) =
+        ii $ text "switch" <+> text "(" <> pretty expr <> text ")"
+               $+$ prettyPrec (-1) stat
+    pretty (CWhile expr stat False _) =
+        ii $ text "while" <+> text "(" <> pretty expr <> text ")"
+               $+$ prettyPrec (-1) stat
+    pretty (CWhile expr stat True _) =
+        ii $ text "do" $+$ prettyPrec (-1) stat
+               $$ text "while" <+> text "(" <> pretty expr <> text ");"
+    pretty (CFor for_init cond step stat _) =
+        ii $ text "for" <+> text "("
+               <> either (maybeP pretty) pretty for_init <> semi
+               <+> maybeP pretty cond <> semi
+               <+> maybeP pretty step <> text ")" $+$ prettyPrec (-1) stat
+    pretty (CGoto ident _) = ii $ text "goto" <+> identP ident <> semi
+    pretty (CGotoPtr expr _) = ii $ text "goto" <+> text "*" <+> prettyPrec 30 expr <> semi
+    pretty (CCont _) = ii $ text "continue" <> semi
+    pretty (CBreak _) = ii $ text "break" <> semi
+    pretty (CReturn Nothing _) = ii $ text "return" <> semi
+    pretty (CReturn (Just e) _) = ii $ text "return" <+> pretty e <> semi
+    pretty (CAsm asmStmt _) = pretty asmStmt
+    prettyPrec p (CCompound localLabels bis _) =
+        let inner = text "{" $+$ mlistP ppLblDecls localLabels $+$ vcat (map pretty bis) $$ text "}"
+        in  if p == -1 then inner else ii inner
+        where ppLblDecls =  vcat . map (\l -> text "__label__" <+> identP l <+> semi)
+    prettyPrec _ p = pretty p
+
+instance Pretty CAsmStmt where
+    pretty (CAsmStmt tyQual expr outOps inOps clobbers _) =
+        ii $ text "__asm__" <+>
+             maybeP pretty tyQual <>
+             parens asmStmt <> semi
+      where
+        asmStmt = pretty expr <+>
+                  (if all null [inOps,outOps] && null clobbers then empty else ops)
+        ops     =  text ":" <+> hcat (punctuate comma (map pretty outOps)) <+>
+                   text ":" <+> hcat (punctuate comma (map pretty inOps)) <+>
+                   (if null clobbers then empty else clobs)
+        clobs   =  text ":" <+> hcat (punctuate comma (map pretty clobbers))
+
+instance Pretty CAsmOperand where
+    -- asm_operand :~ [operand-name] "constraint" ( expr )
+    pretty (CAsmOperand mArgName cnstr expr _) =
+        maybeP (\argName -> text "[" <> identP argName <> text "]") mArgName <+>
+        pretty cnstr <+>
+        parens (pretty expr)
+
+-- TODO: Check need of __extension__
+instance Pretty CBlockItem where
+    pretty (CBlockStmt stat) = pretty stat
+    pretty (CBlockDecl decl) = ii $ pretty decl <> semi
+    pretty (CNestedFunDef fundef) = ii $ pretty fundef
+
+instance Pretty CDecl where
+    -- CAVEAT:
+    -- we may not print __attribute__s directly after typespecs,
+    -- as this may change the semantics of the declaration.
+    -- The parser fixes this, but to avoid hard-to-track code generator
+    -- errors, we enforce this invariant on the AST level.
+    pretty (CDecl specs divs _) =
+        hsep (map pretty checked_specs) <+> hsep (punctuate comma (map p divs))
+            where
+            -- possible hint for AST improvement - (declr, initializer, expr, attrs)
+            -- currently there are no sensible attributes for unnamed bitfields though
+            p (declr, initializer, expr) =
+                maybeP (prettyDeclr False 0) declr <+>
+                maybeP ((text ":" <+>) . pretty) expr <+>
+                attrlistP (getAttrs declr) <+>
+                maybeP ((text "=" <+>) . pretty) initializer
+            checked_specs =
+                if any isAttrAfterSUE  (zip specs (tail specs))
+                    then trace
+                           ("Warning: AST Invariant violated: __attribute__ specifier following struct/union/enum:" ++
+                            show (map pretty specs))
+                           specs
+                    else specs
+            isAttrAfterSUE (CTypeSpec ty,CTypeQual (CAttrQual _)) = isSUEDef ty
+            isAttrAfterSUE _ = False
+            getAttrs Nothing = []
+            getAttrs (Just (CDeclr _ _ _ cattrs _)) = cattrs
+    pretty (CStaticAssert expr str _) =
+      text "_Static_assert" <> parens (hsep (punctuate comma [pretty expr, pretty str]))
+
+instance Pretty CDeclSpec where
+    pretty (CStorageSpec sp) = pretty sp
+    pretty (CTypeSpec sp) = pretty sp
+    pretty (CTypeQual qu) = pretty qu
+    pretty (CFunSpec fs) = pretty fs
+    pretty (CAlignSpec sa) = pretty sa
+
+instance Pretty CAlignSpec where
+    pretty (CAlignAsType decl _) =
+        text "_Alignas" <> parens (pretty decl)
+    pretty (CAlignAsExpr expr _) =
+        text "_Alignas" <> parens (pretty expr)
+
+instance Pretty CStorageSpec where
+    pretty (CAuto _) = text "auto"
+    pretty (CRegister _) = text "register"
+    pretty (CStatic _) = text "static"
+    pretty (CExtern _) = text "extern"
+    pretty (CTypedef _) = text "typedef"
+    pretty (CThread _) = text "_Thread_local"
+
+instance Pretty CTypeSpec where
+    pretty (CVoidType _)        = text "void"
+    pretty (CCharType _)        = text "char"
+    pretty (CShortType _)       = text "short"
+    pretty (CIntType _)         = text "int"
+    pretty (CLongType _)        = text "long"
+    pretty (CFloatType _)       = text "float"
+    pretty (CFloat128Type _)    = text "__float128"
+    pretty (CDoubleType _)      = text "double"
+    pretty (CSignedType _)      = text "signed"
+    pretty (CUnsigType _)       = text "unsigned"
+    pretty (CBoolType _)        = text "_Bool"
+    pretty (CComplexType _)     = text "_Complex"
+    pretty (CInt128Type _)      = text "__int128"
+    pretty (CSUType union _)    = pretty union
+    pretty (CEnumType enum _)   = pretty enum
+    pretty (CTypeDef ident _)   = identP ident
+    pretty (CTypeOfExpr expr _) =
+        text "typeof" <> parens (pretty expr)
+    pretty (CTypeOfType decl _) =
+        text "typeof" <> parens (pretty decl)
+    pretty (CAtomicType decl _) =
+        text "_Atomic" <> parens (pretty decl)
+
+instance Pretty CTypeQual where
+    pretty (CConstQual _) = text "const"
+    pretty (CVolatQual _) = text "volatile"
+    pretty (CRestrQual _) = text "__restrict"
+    pretty (CAtomicQual _) = text "_Atomic"
+    pretty (CAttrQual a)  = attrlistP [a]
+    pretty (CNullableQual _) = text "_Nullable"
+    pretty (CNonnullQual _) = text "_Nonnull"
+
+instance Pretty CFunSpec where
+    pretty (CInlineQual _) = text "inline"
+    pretty (CNoreturnQual _) = text "_Noreturn"
+
+instance Pretty CStructUnion where
+    pretty (CStruct tag ident Nothing cattrs _) = pretty tag <+> attrlistP cattrs <+> maybeP identP ident
+    pretty (CStruct tag ident (Just []) cattrs _) =
+        pretty tag <+> attrlistP cattrs <+> maybeP identP ident <+> text "{ }"
+    pretty (CStruct tag ident (Just decls) cattrs _) = vcat [
+        pretty tag <+> attrlistP cattrs <+> maybeP identP ident <+> text "{",
+        ii $ sep (map ((<> semi) . pretty) decls),
+        text "}"]
+
+instance Pretty CStructTag where
+    pretty CStructTag = text "struct"
+    pretty CUnionTag  = text "union"
+
+instance Pretty CEnum where
+    pretty (CEnum enum_ident Nothing cattrs _) = text "enum" <+> attrlistP cattrs <+> maybeP identP enum_ident
+    pretty (CEnum enum_ident (Just vals) cattrs _) = vcat [
+        text "enum" <+> attrlistP cattrs <+> maybeP identP enum_ident <+> text "{",
+        ii $ sep (punctuate comma (map p vals)),
+        text "}"] where
+        p (ident, expr) = identP ident <+> maybeP ((text "=" <+>) . pretty) expr
+
+--  Analyze a declarator and return a human-readable description
+--   See C99 Spec p 115ff.
+-- describeDeclr :: CDeclr -> Doc
+-- describeDeclr declr =
+--     let declrs = reverse (declrChain declr) in
+--     endDescr (foldl descrDeclr undefined declrs)
+--
+--   where
+--   declrChain declr@(CVarDeclr _ _ _ _) = [declr]
+--   declrChain declr@(CPtrDeclr _ ideclr _)   = declr : declrChain ideclr
+--   declrChain declr@(CArrDeclr ideclr _ _ _) = declr : declrChain ideclr
+--   declrChain declr@(CFunDeclr ideclr _ _ _)   = declr : declrChain ideclr
+--
+--   descrDeclr _ (CVarDeclr ident asm cattrs _) = single False $ \_ ->
+--       maybe (text "<anonymous>") identP ident <+>
+--       maybeP (\asmname -> parens (text "asm:" <+> pretty asmname)) asm <+>
+--       text "is" <+> (if null cattrs then empty else prettyList (map CAttrQual cattrs) <> comma)
+--   descrDeclr (pre,isPlural) (CPtrDeclr quals declr _) = single isPlural $ \pluralize ->
+--       pre <+> indefArticle isPlural <> prettyList quals <+> pluralize "pointer to" "pointers to"
+--   descrDeclr (pre,isPlural) (CArrDeclr declr quals expr _) = plural isPlural $ \pluralize ->
+--       pre <+> indefArticle' isPlural <> prettyList quals <+> pluralize "array of" "arrays of"
+--   descrDeclr (pre,isPlural) (CFunDeclr declr params cattrs _) = single isPlural $ \pluralize ->
+--       pre <+> indefArticle isPlural <> prettyList (map CAttrQual cattrs) <+> pluralize "function returning" "functions returning"
+--   endDescr (pre, isPlural) =  pre <+> text (if isPlural then "<typed objects>" else "a <typed object>")
+--   single :: Bool -> ( (String -> String -> Doc) -> a ) -> (a, Bool)
+--   single isPlural mkDescr = (mkDescr (pluralize isPlural), isPlural)
+--   plural :: Bool -> ( (String -> String -> Doc) -> a ) -> (a, Bool)
+--   plural isPlural mkDescr = (mkDescr (pluralize isPlural), True)
+--   indefArticle isPlural  = text$ if isPlural then "" else "a "
+--   indefArticle' isPlural = text$ if isPlural then "" else "an "
+--   pluralize isPlural s p = text (if isPlural then p else s)
+--   prettyList :: (Pretty a) => [a] -> Doc
+--   prettyList = hsep . punctuate comma . map pretty
+instance Pretty CDeclr where
+    prettyPrec prec declr = prettyDeclr True prec declr
+
+prettyDeclr :: Bool -> Int -> CDeclr -> Doc
+prettyDeclr show_attrs prec (CDeclr name derived_declrs asmname cattrs _) =
+    ppDeclr prec (reverse derived_declrs) <+> prettyAsmName asmname <+> ifP show_attrs (attrlistP cattrs)
+    where
+    ppDeclr _ [] = maybeP identP name
+    --'*' __attribute__? qualifiers declarator
+    ppDeclr p (CPtrDeclr quals _ : declrs) =
+        parenPrec p 5 $ text "*" <+> hsep (map pretty quals) <+> ppDeclr 5 declrs
+
+    -- declarator[ __attribute__? qualifiers expr ]
+    ppDeclr p (CArrDeclr quals size _ : declrs) =
+        parenPrec p 6 $ ppDeclr 6 declrs <> brackets (hsep (map pretty quals) <+> pretty size)
+    -- declarator ( arguments )
+    -- or (__attribute__ declarator) (arguments)
+    ppDeclr _ (CFunDeclr params fun_attrs _ : declrs) =
+        (if not (null fun_attrs) then parens (attrlistP fun_attrs <+> ppDeclr 5 declrs) else ppDeclr 6 declrs)
+        <> parens (prettyParams params)
+    prettyParams (Right (decls, isVariadic)) =
+     sep (punctuate comma (map pretty decls))
+     <> (if isVariadic then text "," <+> text "..." else empty)
+    prettyParams (Left oldStyleIds) =
+     hsep (punctuate comma (map identP oldStyleIds))
+    prettyAsmName asm_name_opt
+        = maybe empty (\asm_name -> text "__asm__" <> parens (pretty asm_name)) asm_name_opt
+
+instance Pretty CArrSize where
+  pretty (CNoArrSize completeType) = ifP completeType (text "*")
+  pretty (CArrSize staticMod expr) = ifP staticMod (text "static") <+> pretty expr
+-- initializer :: { CInit }
+-- initializer :- assignment_expression
+--              | '{' (designation? initializer)_cs_list '}'
+instance Pretty CInit where
+    pretty (CInitExpr expr _) = pretty expr
+    pretty (CInitList initl _) =
+        text "{" <+> hsep (punctuate comma (map p initl)) <+> text "}" where
+        p ([], initializer)     = pretty initializer
+        p (desigs, initializer) = hsep (map pretty desigs) <+> text "=" <+> pretty initializer
+
+-- designation :- designator_list '='
+--             | array_range_designator
+-- arr_designator :- '[' constant_expression ']'
+-- member_designator :-  '.' identifier
+-- arr_range _designator :- '[' constant_expression "..." constant_expression ']'
+
+instance Pretty CDesignator where
+    pretty (CArrDesig expr _) = text "[" <> pretty expr <> text "]"
+    pretty (CMemberDesig ident _) = text "." <> identP ident
+    pretty (CRangeDesig expr1 expr2 _) =
+        text "[" <> pretty expr1 <+> text "..." <+> pretty expr2 <> text "]"
+
+instance Pretty CAttr where
+    pretty (CAttr attrName [] _) = identP attrName
+    pretty (CAttr attrName attrParams _) = identP attrName <> parens (hsep . punctuate comma . map pretty $ attrParams)
+
+instance Pretty CExpr where
+    prettyPrec p (CComma exprs _) =
+        parenPrec p (-1) $ hsep (punctuate comma (map (prettyPrec 2) exprs))
+    prettyPrec p (CAssign op expr1 expr2 _) =
+        parenPrec p 2 $ prettyPrec 3 expr1 <+> pretty op <+> prettyPrec 2 expr2
+    prettyPrec p (CCond expr1 expr2 expr3 _) =
+        parenPrec p 2 $ prettyPrec 4 expr1 <+> text "?" -- NB: assignment only has a higher precedence if cond is on the rhs
+           <+> maybeP pretty expr2 <+> text ":" <+> prettyPrec 4 expr3
+    prettyPrec p (CBinary op expr1 expr2 _) =
+        let prec = binPrec op
+        in  parenPrec p prec $ prettyPrec prec expr1
+                             <+> pretty op <+> prettyPrec (prec + 1) expr2
+    prettyPrec p (CCast decl expr _) =
+        parenPrec p 25 $ text "(" <> pretty decl <> text ")"
+                       <+> prettyPrec 25 expr
+    prettyPrec p (CUnary CPostIncOp expr _) =
+        parenPrec p 26 $ prettyPrec 26 expr <> text "++"
+    prettyPrec p (CUnary CPostDecOp expr _) =
+        parenPrec p 26 $ prettyPrec 26 expr <> text "--"
+    prettyPrec p (CUnary op expr@(CUnary _ _ _) _) =
+        --                             parens aren't necessary, but look nicer imho
+        parenPrec p 25 $ pretty op <+> parens (prettyPrec 25 expr)
+    prettyPrec p (CUnary op expr _) =
+        parenPrec p 25 $ pretty op <> prettyPrec 25 expr
+    prettyPrec p (CSizeofExpr expr _) =
+        parenPrec p 25 $ text "sizeof" <> parens (pretty expr)
+    prettyPrec p (CSizeofType decl _) =
+        parenPrec p 25 $ text "sizeof" <> parens (pretty decl)
+    prettyPrec p (CAlignofExpr expr _) =
+        parenPrec p 25 $ text "__alignof" <> parens (pretty expr)
+    prettyPrec p (CAlignofType decl _) =
+        parenPrec p 25 $ text "__alignof" <> parens (pretty decl)
+    prettyPrec p (CComplexReal expr _) =
+        parenPrec p 25 $ text "__real" <+> prettyPrec 25 expr
+    prettyPrec p (CComplexImag expr _) =
+        parenPrec p 25 $ text "__imag" <+> prettyPrec 25 expr
+    prettyPrec p (CIndex expr1 expr2 _) =
+        parenPrec p 26 $ prettyPrec 26 expr1
+                       <> text "[" <> pretty expr2 <> text "]"
+    prettyPrec p (CCall expr args _) =
+        parenPrec p 30 $ prettyPrec 30 expr <> text "("
+            <> (sep . punctuate comma . map pretty) args <> text ")"
+    prettyPrec p (CMember expr ident deref _) =
+        parenPrec p 26 $ prettyPrec 26 expr
+                       <> text (if deref then "->" else ".") <> identP ident
+    prettyPrec _p (CVar ident _) = identP ident
+    prettyPrec _p (CConst constant) = pretty constant
+    prettyPrec _p (CCompoundLit decl initl _) =
+        parens (pretty decl) <+> (braces . hsep . punctuate comma) (map p initl) where
+        p ([], initializer)           = pretty initializer
+        p (mems, initializer) = hcat (punctuate (text ".") (map pretty mems)) <+> text "=" <+> pretty initializer
+
+    prettyPrec _p (CStatExpr stat _) =
+        text "(" <> pretty stat <> text ")"
+
+    -- unary_expr :- && ident  {- address of label -}
+    prettyPrec _p (CLabAddrExpr ident _) = text "&&" <> identP ident
+    prettyPrec _p (CGenericSelection expr assoc_list _) =
+      text "_Generic" <> (parens.hsep.punctuate comma) (pretty expr : map pAssoc assoc_list)
+      where
+        pAssoc (mty, expr1) = maybe (text "default") pretty mty <> text ":" <+> pretty expr1
+    prettyPrec _p (CBuiltinExpr builtin) = pretty builtin
+
+instance Pretty CBuiltin where
+    pretty (CBuiltinVaArg expr ty_name _) =
+        text "__builtin_va_arg" <+>
+        parens (pretty expr <> comma <+> pretty ty_name)
+    -- The first desig has to be a member field.
+    pretty (CBuiltinOffsetOf ty_name (CMemberDesig field1 _ : desigs) _) =
+        text "__builtin_offsetof" <+>
+        parens (pretty ty_name <> comma <+> identP field1 <> hcat (map pretty desigs) )
+    pretty (CBuiltinOffsetOf _ty_name otherDesigs _) =
+        error $ "Inconsistent AST: Cannot interpret designators in offsetOf: " ++
+                show (hcat $ map pretty otherDesigs)
+    pretty (CBuiltinTypesCompatible ty1 ty2 _) =
+        text "__builtin_types_compatible_p" <+>
+        parens (pretty ty1 <> comma <+> pretty ty2)
+    pretty (CBuiltinConvertVector expr ty _)  =
+        text "__builtin_convertvector" <+>
+        parens (pretty expr <> comma <+> pretty ty)
+
+instance Pretty CAssignOp where
+  pretty op = text $ case op of
+    CAssignOp -> "="
+    CMulAssOp -> "*="
+    CDivAssOp -> "/="
+    CRmdAssOp -> "%="
+    CAddAssOp -> "+="
+    CSubAssOp -> "-="
+    CShlAssOp -> "<<="
+    CShrAssOp -> ">>="
+    CAndAssOp -> "&="
+    CXorAssOp -> "^="
+    COrAssOp  -> "|="
+
+instance Pretty CBinaryOp where
+  pretty op = text $ case op of
+    CMulOp -> "*"
+    CDivOp -> "/"
+    CRmdOp -> "%"
+    CAddOp -> "+"
+    CSubOp -> "-"
+    CShlOp -> "<<"
+    CShrOp -> ">>"
+    CLeOp  -> "<"
+    CGrOp  -> ">"
+    CLeqOp -> "<="
+    CGeqOp -> ">="
+    CEqOp  -> "=="
+    CNeqOp -> "!="
+    CAndOp -> "&"
+    CXorOp -> "^"
+    COrOp  -> "|"
+    CLndOp -> "&&"
+    CLorOp -> "||"
+
+instance Pretty CUnaryOp where
+  pretty op = text $ case op of
+    CPreIncOp  -> "++"
+    CPreDecOp  -> "--"
+    CPostIncOp -> "++"
+    CPostDecOp -> "--"
+    CAdrOp     -> "&"
+    CIndOp     -> "*"
+    CPlusOp    -> "+"
+    CMinOp     -> "-"
+    CCompOp    -> "~"
+    CNegOp     -> "!"
+
+instance Pretty CConst where
+    pretty (CIntConst   int_const _) = text (show int_const)
+    pretty (CCharConst  chr _) = text (show chr)
+    pretty (CFloatConst flt _) = text (show flt)
+    pretty (CStrConst   str _) = text (show str)
+
+instance Pretty CStrLit where
+    pretty (CStrLit   str _) = text (show str)
+
+-- precedence of C operators
+binPrec :: CBinaryOp -> Int
+binPrec CMulOp = 20
+binPrec CDivOp = 20
+binPrec CRmdOp = 20
+binPrec CAddOp = 19
+binPrec CSubOp = 19
+binPrec CShlOp = 18
+binPrec CShrOp = 18
+binPrec CLeOp  = 17
+binPrec CGrOp  = 17
+binPrec CLeqOp = 17
+binPrec CGeqOp = 17
+binPrec CEqOp  = 16
+binPrec CNeqOp = 16
+binPrec CAndOp = 15
+binPrec CXorOp = 14
+binPrec COrOp  = 13
+binPrec CLndOp = 12
+binPrec CLorOp = 11
src/Language/C/Syntax.hs view
@@ -1,20 +1,20 @@--------------------------------------------------------------------------------- |--- Module      :  Language.C.Syntax--- Copyright   :  (c) 2008 Benedikt Huber--- License     :  BSD-style--- Maintainer  : benedikt.huber@gmail.com--- Stability   : experimental--- Portability : ghc------ Syntax of C files: The abstract syntax tree and constants.-------------------------------------------------------------------------------module Language.C.Syntax (-     -- * Constants-     module Language.C.Syntax.Constants,-     -- * Syntax tree-     module Language.C.Syntax.AST,-)-where-import Language.C.Syntax.AST-import Language.C.Syntax.Constants+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Syntax
+-- Copyright   :  (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  : benedikt.huber@gmail.com
+-- Stability   : experimental
+-- Portability : ghc
+--
+-- Syntax of C files: The abstract syntax tree and constants.
+-----------------------------------------------------------------------------
+module Language.C.Syntax (
+     -- * Constants
+     module Language.C.Syntax.Constants,
+     -- * Syntax tree
+     module Language.C.Syntax.AST,
+)
+where
+import Language.C.Syntax.AST
+import Language.C.Syntax.Constants
src/Language/C/Syntax/AST.hs view
@@ -1,1393 +1,1393 @@-{-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE TypeSynonymInstances #-}--------------------------------------------------------------------------------- |--- Module      :  Language.C.Syntax.AST--- Copyright   :  (c) [1999..2007] Manuel M T Chakravarty---                (c) 2008 Benedikt Huber--- License     :  BSD-style--- Maintainer  : benedikt.huber@gmail.com--- Stability   : experimental--- Portability : ghc------ Abstract syntax of C source and header files.------  The tree structure is based on the grammar in Appendix A of K&R.  The---  abstract syntax simplifies the concrete syntax by merging similar concrete---  constructs into a single type of abstract tree structure: declarations are---  merged with structure declarations, parameter declarations and type names,---  and declarators are merged with abstract declarators.------  With K&R we refer to ``The C Programming Language'', second edition, Brain---  W. Kernighan and Dennis M. Ritchie, Prentice Hall, 1988. The AST supports all---  of C99 <http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf> and several---  GNU extensions <http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html>.-------------------------------------------------------------------------------module Language.C.Syntax.AST (-  -- * C translation units-  CTranslUnit,  CExtDecl,-  CTranslationUnit(..),  CExternalDeclaration(..),-  -- * Declarations-  CFunDef,  CDecl, CStructUnion, CEnum,-  CFunctionDef(..),  CDeclaration(..),-  CStructTag(..), CStructureUnion(..),  CEnumeration(..),-  -- * Declaration attributes-  CDeclSpec, partitionDeclSpecs,-  CStorageSpec, CTypeSpec, isSUEDef, CTypeQual, CFunSpec, CAlignSpec,  CAttr,-  CFunctionSpecifier(..), CDeclarationSpecifier(..), CStorageSpecifier(..), CTypeSpecifier(..),-  CAlignmentSpecifier(..),-  CTypeQualifier(..), CAttribute(..),-  -- * Declarators-  CDeclr,CDerivedDeclr,CArrSize,-  CDeclarator(..), CDerivedDeclarator(..), CArraySize(..),-  -- * Initialization-  CInit, CInitList, CDesignator,-  CInitializer(..), CInitializerList, CPartDesignator(..),-  -- * Statements-  CStat, CBlockItem, CAsmStmt, CAsmOperand,-  CStatement(..), CCompoundBlockItem(..),-  CAssemblyStatement(..), CAssemblyOperand(..),-  -- * Expressions-  CExpr, CExpression(..),-  CAssignOp(..), CBinaryOp(..), CUnaryOp(..),-  CBuiltin, CBuiltinThing(..),-  -- * Constants-  CConst, CStrLit, cstringOfLit, liftStrLit,-  CConstant(..), CStringLiteral(..),-  -- * Annoated type class-  Annotated(..)-) where-import Language.C.Syntax.Constants-import Language.C.Syntax.Ops-import Language.C.Data.Ident-import Language.C.Data.Node-import Language.C.Data.Position-import Data.Generics---- | Complete C tranlsation unit (C99 6.9, K&R A10)------ A complete C translation unit, for example representing a C header or source file.--- It consists of a list of external (i.e. toplevel) declarations.-type CTranslUnit = CTranslationUnit NodeInfo-data CTranslationUnit a-  = CTranslUnit [CExternalDeclaration a] a-    deriving (Show, Data, Typeable {-! ,CNode ,Functor, Annotated !-})---- | External C declaration (C99 6.9, K&R A10)------ Either a toplevel declaration, function definition or external assembler.-type CExtDecl = CExternalDeclaration NodeInfo-data CExternalDeclaration a-  = CDeclExt (CDeclaration a)-  | CFDefExt (CFunctionDef a)-  | CAsmExt  (CStringLiteral a) a-    deriving (Show, Data,Typeable {-! ,CNode ,Functor, Annotated !-})---- | C function definition (C99 6.9.1, K&R A10.1)------ A function definition is of the form @CFunDef specifiers declarator decllist? stmt@.------ * @specifiers@ are the type and storage-class specifiers of the function.---   The only storage-class specifiers allowed are /extern/ and /static/.------ * The @declarator@ must be such that the declared identifier has /function type/.---   The return type shall be void or an object type other than array type.------ * The optional declaration list @decllist@ is for old-style function declarations.------ * The statement @stmt@ is a compound statement.-type CFunDef = CFunctionDef NodeInfo-data CFunctionDef a-  = CFunDef-    [CDeclarationSpecifier a] -- type specifier and qualifier-    (CDeclarator a)           -- declarator-    [CDeclaration a]          -- optional declaration list-    (CStatement a)            -- compound statement-    a-    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})----- | C declarations (K&R A8, C99 6.7), including structure declarations, parameter---   declarations and type names.------ A declaration is of the form @CDecl specifiers init-declarator-list@, where the form of the declarator list's---  elements depends on the kind of declaration:------ 1) Toplevel declarations (K&R A8, C99 6.7 declaration)------   * C99 requires that there is at least one specifier, though this is merely a syntactic restriction------   * at most one storage class specifier is allowed per declaration------   * the elements of the non-empty @init-declarator-list@ are of the form @(Just declr, init?, Nothing)@.---      The declarator @declr@ has to be present and non-abstract and the initialization expression is---      optional.------ 2) Structure declarations (K&R A8.3, C99 6.7.2.1 struct-declaration)------   Those are the declarations of a structure's members.------   * do not allow storage specifiers------   * in strict C99, the list of declarators has to be non-empty------   * the elements of @init-declarator-list@ are either of the form @(Just declr, Nothing, size?)@,---     representing a member with optional bit-field size, or of the form @(Nothing, Nothing, Just size)@,---     for unnamed bitfields. @declr@ has to be non-abstract.------   * no member of a structure shall have incomplete type------ 3) Parameter declarations (K&R A8.6.3, C99 6.7.5 parameter-declaration)------   * @init-declarator-list@ must contain at most one triple of the form @(Just declr, Nothing, Nothing)@,---     i.e. consist of a single declarator, which is allowed to be abstract (i.e. unnamed).------ 4) Type names (A8.8, C99 6.7.6)------   * do not allow storage specifiers------   * @init-declarator-list@ must contain at most one triple of the form @(Just declr, Nothing, Nothing)@.---     where @declr@ is an abstract declarator (i.e. doesn't contain a declared identifier)----type CDecl = CDeclaration NodeInfo-data CDeclaration a-  = CDecl-    [CDeclarationSpecifier a] -- type specifier and qualifier, __attribute__-    [(Maybe (CDeclarator a),  -- declarator (may be omitted)-      Maybe (CInitializer a), -- optional initialize-      Maybe (CExpression a))] -- optional size (const expr)-    a                         -- annotation-    | CStaticAssert-      (CExpression a)         -- assert expression-      (CStringLiteral a)      -- assert text-      a                       -- annotation-    deriving (Show, Data,Typeable {-! ,CNode ,Annotated !-})---- Derive instance is a little bit ugly-instance Functor CDeclaration where-  fmap f (CDecl specs declarators annot) =-    CDecl (map (fmap f) specs) (map fmap3m declarators) (f annot)-      where fmap3m (a,b,c) = (fmap (fmap f) a, fmap (fmap f) b, fmap (fmap f) c)-  fmap f (CStaticAssert expression strlit annot) =-    CStaticAssert (fmap f expression) (fmap f strlit) (f annot)---- | C declarator (K&R A8.5, C99 6.7.5) and abstract declarator (K&R A8.8, C99 6.7.6)------ A declarator declares a single object, function, or type. It is always associated with--- a declaration ('CDecl'), which specifies the declaration's type and the additional storage qualifiers and--- attributes, which apply to the declared object.------ A declarator is of the form @CDeclr name? indirections asm-name? attrs _@, where--- @name@ is the name of the declared object (missing for abstract declarators),--- @declquals@ is a set of additional declaration specifiers,--- @asm-name@ is the optional assembler name and attributes is a set of--- attrs is a set of @__attribute__@ annotations for the declared object.------ @indirections@ is a set of pointer, array and function declarators, which modify the type of the declared object as--- described below. If the /declaration/ specifies the non-derived type @T@,--- and we have @indirections = [D1, D2, ..., Dn]@ than the declared object has type--- @(D1 `indirect` (D2 `indirect` ...  (Dn `indirect` T)))@, where------  * @(CPtrDeclr attrs) `indirect` T@ is /attributed pointer to T/------  * @(CFunDeclr attrs) `indirect` T@ is /attributed function returning T/------  * @(CArrayDeclr attrs) `indirect` T@ is /attributed array of elemements of type T/------ Examples (simplified attributes):------  * /x/ is an int------ > int x;--- > CDeclr "x" []------  * /x/ is a restrict pointer to a const pointer to int------ > const int * const * restrict x;--- > CDeclr "x" [CPtrDeclr [restrict], CPtrDeclr [const]]------  * /f/ is an function return a constant pointer to int------ > int* const f();--- > CDeclr "f" [CFunDeclr [],CPtrDeclr [const]]------  * /f/ is a constant pointer to a function returning int------ > int (* const f)(); ==>--- > CDeclr "f" [CPtrDeclr [const], CFunDeclr []]-type CDeclr = CDeclarator NodeInfo-data CDeclarator a-  = CDeclr (Maybe Ident) [CDerivedDeclarator a] (Maybe (CStringLiteral a)) [CAttribute a] a-    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})----- | Derived declarators, see 'CDeclr'------ Indirections are qualified using type-qualifiers and generic attributes, and additionally------    * The size of an array is either a constant expression, variable length ('*') or missing; in the last case, the---      type of the array is incomplete. The qualifier static is allowed for function arguments only, indicating that---      the supplied argument is an array of at least the given size.------    * New style parameter lists have the form @Right (declarations, isVariadic)@, old style parameter lists have the---      form @Left (parameter-names)@-type CDerivedDeclr = CDerivedDeclarator NodeInfo-data CDerivedDeclarator a-  = CPtrDeclr [CTypeQualifier a] a-  -- ^ Pointer declarator @CPtrDeclr tyquals declr@-  | CArrDeclr [CTypeQualifier a] (CArraySize a) a-  -- ^ Array declarator @CArrDeclr declr tyquals size-expr?@-  | CFunDeclr (Either [Ident] ([CDeclaration a],Bool)) [CAttribute a] a-    -- ^ Function declarator @CFunDeclr declr (old-style-params | new-style-params) c-attrs@-    deriving (Show, Data,Typeable {-! ,CNode , Annotated !-})---- Derived instance relies on fmap2-instance Functor CDerivedDeclarator where-        fmap _f (CPtrDeclr a1 a2) = CPtrDeclr (fmap (fmap _f) a1) (_f a2)-        fmap _f (CArrDeclr a1 a2 a3)-          = CArrDeclr (fmap (fmap _f) a1) (fmap _f a2) (_f a3)-        fmap _f (CFunDeclr a1 a2 a3)-          = CFunDeclr (fmap (fmapFirst (fmap (fmap _f))) a1) (fmap (fmap _f) a2)-              (_f a3)-          where fmapFirst f (a,b) = (f a, b)---- | Size of an array-type CArrSize = CArraySize NodeInfo-data CArraySize a-  = CNoArrSize Bool               -- ^ @CUnknownSize isCompleteType@-  | CArrSize Bool (CExpression a) -- ^ @CArrSize isStatic expr@-    deriving (Show, Data,Typeable {-! , Functor !-})----- | C statement (K&R A9, C99 6.8)----type CStat = CStatement NodeInfo-data CStatement a-  -- | An (attributed) label followed by a statement-  = CLabel  Ident (CStatement a) [CAttribute a] a-  -- | A statement of the form @case expr : stmt@-  | CCase (CExpression a) (CStatement a) a-  -- | A case range of the form @case lower ... upper : stmt@-  | CCases (CExpression a) (CExpression a) (CStatement a) a-  -- | The default case @default : stmt@-  | CDefault (CStatement a) a-  -- | A simple statement, that is in C: evaluating an expression with-  --   side-effects and discarding the result.-  | CExpr (Maybe (CExpression a)) a-  -- | compound statement @CCompound localLabels blockItems at@-  | CCompound [Ident] [CCompoundBlockItem a] a-  -- | conditional statement @CIf ifExpr thenStmt maybeElseStmt at@-  | CIf (CExpression a) (CStatement a) (Maybe (CStatement a)) a-  -- | switch statement @CSwitch selectorExpr switchStmt@, where-  -- @switchStmt@ usually includes /case/, /break/ and /default/-  -- statements-  | CSwitch (CExpression a) (CStatement a) a-  -- | while or do-while statement @CWhile guard stmt isDoWhile at@-  | CWhile (CExpression a) (CStatement a) Bool a-  -- | for statement @CFor init expr-2 expr-3 stmt@, where @init@ is-  -- either a declaration or initializing expression-  | CFor (Either (Maybe (CExpression a)) (CDeclaration a))-    (Maybe (CExpression a))-    (Maybe (CExpression a))-    (CStatement a)-    a-  -- | goto statement @CGoto label@-  | CGoto Ident a-  -- | computed goto @CGotoPtr labelExpr@-  | CGotoPtr (CExpression a) a-  -- | continue statement-  | CCont a-  -- | break statement-  | CBreak a-  -- | return statement @CReturn returnExpr@-  | CReturn (Maybe (CExpression a)) a-  -- | assembly statement-  | CAsm (CAssemblyStatement a) a-    deriving (Show, Data,Typeable {-! , CNode , Annotated !-})---- Derived instance relies on fmap2 :(-instance Functor CStatement where-        fmap _f (CLabel a1 a2 a3 a4)-          = CLabel a1 (fmap _f a2) (fmap (fmap _f) a3) (_f a4)-        fmap _f (CCase a1 a2 a3) = CCase (fmap _f a1) (fmap _f a2) (_f a3)-        fmap _f (CCases a1 a2 a3 a4)-          = CCases (fmap _f a1) (fmap _f a2) (fmap _f a3) (_f a4)-        fmap _f (CDefault a1 a2) = CDefault (fmap _f a1) (_f a2)-        fmap _f (CExpr a1 a2) = CExpr (fmap (fmap _f) a1) (_f a2)-        fmap _f (CCompound a1 a2 a3)-          = CCompound a1 (fmap (fmap _f) a2) (_f a3)-        fmap _f (CIf a1 a2 a3 a4)-          = CIf (fmap _f a1) (fmap _f a2) (fmap (fmap _f) a3) (_f a4)-        fmap _f (CSwitch a1 a2 a3)-          = CSwitch (fmap _f a1) (fmap _f a2) (_f a3)-        fmap _f (CWhile a1 a2 a3 a4)-          = CWhile (fmap _f a1) (fmap _f a2) a3 (_f a4)-        fmap _f (CFor a1 a2 a3 a4 a5)-          = CFor (mapEither (fmap (fmap _f)) (fmap _f) a1)-                 (fmap (fmap _f) a2) (fmap (fmap _f) a3) (fmap _f a4)-                 (_f a5)-          where mapEither f1 f2 = either (Left . f1) (Right . f2)-        fmap _f (CGoto a1 a2) = CGoto a1 (_f a2)-        fmap _f (CGotoPtr a1 a2) = CGotoPtr (fmap _f a1) (_f a2)-        fmap _f (CCont a1) = CCont (_f a1)-        fmap _f (CBreak a1) = CBreak (_f a1)-        fmap _f (CReturn a1 a2) = CReturn (fmap (fmap _f) a1) (_f a2)-        fmap _f (CAsm a1 a2) = CAsm (fmap _f a1) (_f a2)---- | GNU Assembler statement------ > CAssemblyStatement type-qual? asm-expr out-ops in-ops clobbers _------ is an inline assembler statement.--- The only type-qualifier (if any) allowed is /volatile/.--- @asm-expr@ is the actual assembler epxression (a string), @out-ops@ and @in-ops@ are the input--- and output operands of the statement.--- @clobbers@ is a list of registers which are clobbered when executing the assembler statement-type CAsmStmt = CAssemblyStatement NodeInfo-data CAssemblyStatement a-  = CAsmStmt-    (Maybe (CTypeQualifier a)) -- maybe volatile-    (CStringLiteral a)         -- assembler expression (String)-    [CAssemblyOperand a]       -- output operands-    [CAssemblyOperand a]       -- input operands-    [CStringLiteral a]         -- Clobbers-    a-    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})---- | Assembler operand------ @CAsmOperand argName? constraintExpr arg@ specifies an operand for an assembler--- statement.-type CAsmOperand = CAssemblyOperand NodeInfo-data CAssemblyOperand a-  = CAsmOperand-    (Maybe Ident)       -- argument name-    (CStringLiteral a)  -- constraint expr-    (CExpression a)     -- argument-    a-    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})---- | C99 Block items------  Things that may appear in compound statements: either statements, declarations---   or nested function definitions.-type CBlockItem = CCompoundBlockItem NodeInfo-data CCompoundBlockItem a-  = CBlockStmt    (CStatement a)    -- ^ A statement-  | CBlockDecl    (CDeclaration a)  -- ^ A local declaration-  | CNestedFunDef (CFunctionDef a)  -- ^ A nested function (GNU C)-    deriving (Show, Data,Typeable {-! , CNode , Functor, Annotated !-})---- | C declaration specifiers and qualifiers------ Declaration specifiers include at most one storage-class specifier (C99 6.7.1),--- type specifiers (6.7.2) and type qualifiers (6.7.3).-type CDeclSpec = CDeclarationSpecifier NodeInfo-data CDeclarationSpecifier a-  = CStorageSpec (CStorageSpecifier a) -- ^ storage-class specifier or typedef-  | CTypeSpec    (CTypeSpecifier a)    -- ^ type name-  | CTypeQual    (CTypeQualifier a)    -- ^ type qualifier-  | CFunSpec     (CFunctionSpecifier a) -- ^ function specifier-  | CAlignSpec   (CAlignmentSpecifier a) -- ^ alignment specifier-    deriving (Show, Data,Typeable {-! ,CNode ,Functor, Annotated !-})----- | Separate the declaration specifiers------ @__attribute__@ of a declaration qualify declarations or declarators (but not types),--- and are therefore separated as well.-partitionDeclSpecs :: [CDeclarationSpecifier a]-                   -> ( [CStorageSpecifier a], [CAttribute a]-                      , [CTypeQualifier a], [CTypeSpecifier a]-                      , [CFunctionSpecifier a], [CAlignmentSpecifier a])-partitionDeclSpecs = foldr deals ([],[],[],[],[],[]) where-    deals (CStorageSpec sp) (sts,ats,tqs,tss,fss,ass)  = (sp:sts,ats,tqs,tss,fss,ass)-    deals (CTypeQual (CAttrQual attr)) (sts,ats,tqs,tss,fss,ass)  = (sts,attr:ats,tqs,tss,fss,ass)-    deals (CTypeQual tq) (sts,ats,tqs,tss,fss,ass)     = (sts,ats,tq:tqs,tss,fss,ass)-    deals (CTypeSpec ts) (sts,ats,tqs,tss,fss,ass)     = (sts,ats,tqs,ts:tss,fss,ass)-    deals (CFunSpec fs) (sts,ats,tqs,tss,fss,ass)      = (sts,ats,tqs,tss,fs:fss,ass)-    deals (CAlignSpec as) (sts,ats,tqs,tss,fss,ass)    = (sts,ats,tqs,tss,fss,as:ass)---- | C storage class specifier (and typedefs) (K&R A8.1, C99 6.7.1)-type CStorageSpec = CStorageSpecifier NodeInfo-data CStorageSpecifier a-  = CAuto     a     -- ^ auto-  | CRegister a     -- ^ register-  | CStatic   a     -- ^ static-  | CExtern   a     -- ^ extern-  | CTypedef  a     -- ^ typedef-  | CThread   a     -- ^ C11/GNUC thread local storage-    deriving (Show, Eq,Ord,Data,Typeable {-! ,CNode ,Functor ,Annotated !-})----- | C type specifier (K&R A8.2, C99 6.7.2)------ Type specifiers are either basic types such as @char@ or @int@,--- @struct@, @union@ or @enum@ specifiers or typedef names.------ As a GNU extension, a @typeof@ expression also is a type specifier.-type CTypeSpec = CTypeSpecifier NodeInfo-data CTypeSpecifier a-  = CVoidType    a-  | CCharType    a-  | CShortType   a-  | CIntType     a-  | CLongType    a-  | CFloatType   a-  | CFloat128Type a-  | CDoubleType  a-  | CSignedType  a-  | CUnsigType   a-  | CBoolType    a-  | CComplexType a-  | CInt128Type  a-  | CSUType      (CStructureUnion a) a      -- ^ Struct or Union specifier-  | CEnumType    (CEnumeration a)    a      -- ^ Enumeration specifier-  | CTypeDef     Ident        a      -- ^ Typedef name-  | CTypeOfExpr  (CExpression a)  a  -- ^ @typeof(expr)@-  | CTypeOfType  (CDeclaration a) a  -- ^ @typeof(type)@-  | CAtomicType  (CDeclaration a) a  -- ^ @_Atomic(type)@-    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})----- | returns @True@ if the given typespec is a struct, union or enum /definition/-isSUEDef :: CTypeSpecifier a -> Bool-isSUEDef (CSUType (CStruct _ _ (Just _) _ _) _) = True-isSUEDef (CEnumType (CEnum _ (Just _) _ _) _) = True-isSUEDef _ = False---- | C type qualifiers (K&R A8.2, C99 6.7.3) and attributes.------ @const@, @volatile@ and @restrict@ type qualifiers--- Additionally, @__attribute__@ annotations for declarations and declarators, and--- function specifiers-type CTypeQual = CTypeQualifier NodeInfo-data CTypeQualifier a-  = CConstQual a-  | CVolatQual a-  | CRestrQual a-  | CAtomicQual a-  | CAttrQual  (CAttribute a)-  | CNullableQual a-  | CNonnullQual a-    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})---- | C function specifiers (C99 6.7.4)------ function specifiers @inline@ and @_Noreturn@-type CFunSpec = CFunctionSpecifier NodeInfo-data CFunctionSpecifier a-  = CInlineQual a-  | CNoreturnQual a-    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})---- | C alignment specifiers (C99 6.7.5)----type CAlignSpec = CAlignmentSpecifier NodeInfo-data CAlignmentSpecifier a-  = CAlignAsType (CDeclaration a) a  -- ^ @_Alignas(type)@-  | CAlignAsExpr (CExpression a) a   -- ^ @_Alignas(expr)@-    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})----- | C structure or union specifiers (K&R A8.3, C99 6.7.2.1)------ @CStruct tag identifier struct-decls c-attrs@ represents a struct or union specifier (depending on @tag@).------   * either @identifier@ or the declaration list @struct-decls@ (or both) have to be present.------     Example: in @struct foo x;@, the identifier is present, in @struct { int y; } x@ the declaration list, and---     in @struct foo { int y; } x;@ both of them.------   * @c-attrs@ is a list of @__attribute__@ annotations associated with the struct or union specifier-type CStructUnion = CStructureUnion NodeInfo-data CStructureUnion a-  = CStruct-    CStructTag-    (Maybe Ident)-    (Maybe [CDeclaration a])  -- member declarations-    [CAttribute a]            -- __attribute__s-    a-    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})----- | A tag to determine wheter we refer to a @struct@ or @union@, see 'CStructUnion'.-data CStructTag = CStructTag-                | CUnionTag-                deriving (Show, Eq,Data,Typeable)----- | C enumeration specifier (K&R A8.4, C99 6.7.2.2)------ @CEnum identifier enumerator-list attrs@ represent as enum specifier------  * Either the identifier or the enumerator-list (or both) have to be present.------  * If @enumerator-list@ is present, it has to be non-empty.------  * The enumerator list is of the form @(enumeration-constant, enumeration-value?)@, where the latter---    is an optional constant integral expression.------  * @attrs@ is a list of @__attribute__@ annotations associated with the enumeration specifier-type CEnum = CEnumeration NodeInfo-data CEnumeration a-  = CEnum-    (Maybe Ident)-    (Maybe [(Ident,                   -- variant name-             Maybe (CExpression a))]) -- explicit variant value-    [CAttribute a]                    -- __attribute__s-    a-    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})------ | C initialization (K&R A8.7, C99 6.7.8)------ Initializers are either assignment expressions or initializer lists--- (surrounded in curly braces), whose elements are themselves--- initializers, paired with an optional list of designators.-type CInit = CInitializer NodeInfo-data CInitializer a-  -- | assignment expression-  = CInitExpr (CExpression a) a-  -- | initialization list (see 'CInitList')-  | CInitList (CInitializerList a) a-    deriving (Show, Data,Typeable {-! ,CNode , Annotated !-})---- deriving Functor does not work (type synonym)-instance Functor CInitializer where-        fmap _f (CInitExpr a1 a2) = CInitExpr (fmap _f a1) (_f a2)-        fmap _f (CInitList a1 a2) = CInitList (fmapInitList _f a1) (_f a2)-fmapInitList :: (a->b) -> (CInitializerList a) -> (CInitializerList b)-fmapInitList _f = map (\(desigs, initializer) -> (fmap (fmap _f) desigs, fmap _f initializer))---- | Initializer List------ The members of an initializer list are of the form @(designator-list,initializer)@.--- The @designator-list@ specifies one member of the compound type which is initialized.--- It is allowed to be empty - in this case the initializer refers to the--- ''next'' member of the compound type (see C99 6.7.8).------ Examples (simplified expressions and identifiers):------ > -- int x[3][4] = { [0][3] = 4, [2] = 5, 8 };--- > --   corresponds to the assignments--- > -- x[0][3] = 4; x[2][0] = 5; x[2][1] = 8;--- > let init1 = ([CArrDesig 0, CArrDesig 3], CInitExpr 4)--- >     init2 = ([CArrDesig 2]             , CInitExpr 5)--- >     init3 = ([]                        , CInitExpr 8)--- > in  CInitList [init1, init2, init3]------ > -- struct { struct { int a[2]; int b[2]; int c[2]; } s; } x = { .s = { {2,3} , .c[0] = 1 } };--- > --   corresponds to the assignments--- > -- x.s.a[0] = 2; x.s.a[1] = 3; x.s.c[0] = 1;--- > let init_s_0 = CInitList [ ([], CInitExpr 2), ([], CInitExpr 3)]--- >     init_s   = CInitList [--- >                            ([], init_s_0),--- >                            ([CMemberDesig "c", CArrDesig 0], CInitExpr 1)--- >                          ]--- > in  CInitList [(CMemberDesig "s", init_s)]-type CInitList = CInitializerList NodeInfo-type CInitializerList a = [([CPartDesignator a], CInitializer a)]---- | Designators------ A designator specifies a member of an object, either an element or range of an array,--- or the named member of a struct \/ union.-type CDesignator = CPartDesignator NodeInfo-data CPartDesignator a-  -- | array position designator-  = CArrDesig     (CExpression a) a-  -- | member designator-  | CMemberDesig  Ident a-  -- | array range designator @CRangeDesig from to _@ (GNU C)-  | CRangeDesig (CExpression a) (CExpression a) a-    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})----- | @__attribute__@ annotations------ Those are of the form @CAttr attribute-name attribute-parameters@,--- and serve as generic properties of some syntax tree elements.-type CAttr = CAttribute NodeInfo-data CAttribute a = CAttr Ident [CExpression a] a-                    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})----- | C expression (K&R A7)------ * these can be arbitrary expression, as the argument of `sizeof' can be---   arbitrary, even if appearing in a constant expression------ * GNU C extensions: @alignof@, @__real@, @__imag@, @({ stmt-expr })@, @&& label@ and built-ins----type CExpr = CExpression NodeInfo-data CExpression a-  = CComma       [CExpression a]         -- comma expression list, n >= 2-                 a-  | CAssign      CAssignOp               -- assignment operator-                 (CExpression a)         -- l-value-                 (CExpression a)         -- r-value-                 a-  | CCond        (CExpression a)         -- conditional-                 (Maybe (CExpression a)) -- true-expression (GNU allows omitting)-                 (CExpression a)         -- false-expression-                 a-  | CBinary      CBinaryOp               -- binary operator-                 (CExpression a)         -- lhs-                 (CExpression a)         -- rhs-                 a-  | CCast        (CDeclaration a)        -- type name-                 (CExpression a)-                 a-  | CUnary       CUnaryOp                -- unary operator-                 (CExpression a)-                 a-  | CSizeofExpr  (CExpression a)-                 a-  | CSizeofType  (CDeclaration a)        -- type name-                 a-  | CAlignofExpr (CExpression a)-                 a-  | CAlignofType (CDeclaration a)        -- type name-                 a-  | CComplexReal (CExpression a)         -- real part of complex number-                 a-  | CComplexImag (CExpression a)         -- imaginary part of complex number-                 a-  | CIndex       (CExpression a)         -- array-                 (CExpression a)         -- index-                 a-  | CCall        (CExpression a)         -- function-                 [CExpression a]         -- arguments-                 a-  | CMember      (CExpression a)         -- structure-                 Ident                   -- member name-                 Bool                    -- deref structure? (True for `->')-                 a-  | CVar         Ident                   -- identifier (incl. enumeration const)-                 a-  | CConst       (CConstant a)           -- ^ integer, character, floating point and string constants-  | CCompoundLit (CDeclaration a)-                 (CInitializerList a)    -- type name & initialiser list-                 a                       -- ^ C99 compound literal-  | CGenericSelection (CExpression a) [(Maybe (CDeclaration a), CExpression a)] a -- ^ C11 generic selection-  | CStatExpr    (CStatement a) a        -- ^ GNU C compound statement as expr-  | CLabAddrExpr Ident a                 -- ^ GNU C address of label-  | CBuiltinExpr (CBuiltinThing a)       -- ^ builtin expressions, see 'CBuiltin'-    deriving (Data,Typeable,Show {-! ,CNode , Annotated !-})---- deriving Functor does not work (type synonyms)-instance Functor CExpression where-        fmap _f (CComma a1 a2) = CComma (fmap (fmap _f) a1) (_f a2)-        fmap _f (CAssign a1 a2 a3 a4)-          = CAssign a1 (fmap _f a2) (fmap _f a3) (_f a4)-        fmap _f (CCond a1 a2 a3 a4)-          = CCond (fmap _f a1) (fmap (fmap _f) a2) (fmap _f a3) (_f a4)-        fmap _f (CBinary a1 a2 a3 a4)-          = CBinary a1 (fmap _f a2) (fmap _f a3) (_f a4)-        fmap _f (CCast a1 a2 a3) = CCast (fmap _f a1) (fmap _f a2) (_f a3)-        fmap _f (CUnary a1 a2 a3) = CUnary a1 (fmap _f a2) (_f a3)-        fmap _f (CSizeofExpr a1 a2) = CSizeofExpr (fmap _f a1) (_f a2)-        fmap _f (CSizeofType a1 a2) = CSizeofType (fmap _f a1) (_f a2)-        fmap _f (CAlignofExpr a1 a2) = CAlignofExpr (fmap _f a1) (_f a2)-        fmap _f (CAlignofType a1 a2) = CAlignofType (fmap _f a1) (_f a2)-        fmap _f (CComplexReal a1 a2) = CComplexReal (fmap _f a1) (_f a2)-        fmap _f (CComplexImag a1 a2) = CComplexImag (fmap _f a1) (_f a2)-        fmap _f (CIndex a1 a2 a3)-          = CIndex (fmap _f a1) (fmap _f a2) (_f a3)-        fmap _f (CCall a1 a2 a3)-          = CCall (fmap _f a1) (fmap (fmap _f) a2) (_f a3)-        fmap _f (CMember a1 a2 a3 a4) = CMember (fmap _f a1) a2 a3 (_f a4)-        fmap _f (CVar a1 a2) = CVar a1 (_f a2)-        fmap _f (CConst a1) = CConst (fmap _f a1)-        fmap _f (CCompoundLit a1 a2 a3)-          = CCompoundLit (fmap _f a1) (fmapInitList _f a2) (_f a3)-        fmap _f (CStatExpr a1 a2) = CStatExpr (fmap _f a1) (_f a2)-        fmap _f (CLabAddrExpr a1 a2) = CLabAddrExpr a1 (_f a2)-        fmap _f (CBuiltinExpr a1) = CBuiltinExpr (fmap _f a1)-        fmap _f (CGenericSelection expr list annot) =-          CGenericSelection (fmap _f expr) (map fmap_helper list) (_f annot)-          where-            fmap_helper (ma1, a2) = (fmap (fmap _f) ma1, fmap _f a2)---- | GNU Builtins, which cannot be typed in C99-type CBuiltin = CBuiltinThing NodeInfo-data CBuiltinThing a-  = CBuiltinVaArg (CExpression a) (CDeclaration a) a            -- ^ @(expr, type)@-  | CBuiltinOffsetOf (CDeclaration a) [CPartDesignator a] a -- ^ @(type, designator-list)@-  | CBuiltinTypesCompatible (CDeclaration a) (CDeclaration a) a  -- ^ @(type,type)@-  | CBuiltinConvertVector (CExpression a) (CDeclaration a) a -- ^ @(expr, type)@-    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})----- | C constant (K&R A2.5 & A7.2)-type CConst = CConstant NodeInfo-data CConstant a-  = CIntConst   CInteger a-  | CCharConst  CChar a-  | CFloatConst CFloat a-  | CStrConst   CString a-    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})----- | Attributed string literals-type CStrLit = CStringLiteral NodeInfo-data CStringLiteral a = CStrLit CString a-            deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})---cstringOfLit :: CStringLiteral a -> CString-cstringOfLit (CStrLit cstr _) = cstr---- | Lift a string literal to a C constant-liftStrLit :: CStringLiteral a -> CConstant a-liftStrLit (CStrLit str at) = CStrConst str at---- | All AST nodes are annotated. Inspired by the Annotated--- class of Niklas Broberg's haskell-src-exts package.--- In principle, we could have Copointed superclass instead--- of @ann@, for the price of another dependency.-class (Functor ast) => Annotated ast where-  -- | get the annotation of an AST node-  annotation :: ast a -> a-  -- | change the annotation (non-recursively)-  --   of an AST node. Use fmap for recursively-  --   modifying the annotation.-  amap  :: (a->a) -> ast a -> ast a---- fmap2 :: (a->a') -> (a,b) -> (a',b)--- fmap2 f (a,b) = (f a, b)---- Instances generated using derive-2.*--- GENERATED START--instance CNode t1 => CNode (CTranslationUnit t1) where-        nodeInfo (CTranslUnit _ n) = nodeInfo n-instance CNode t1 => Pos (CTranslationUnit t1) where-        posOf x = posOf (nodeInfo x)--instance Functor CTranslationUnit where-        fmap _f (CTranslUnit a1 a2)-          = CTranslUnit (fmap (fmap _f) a1) (_f a2)--instance Annotated CTranslationUnit where-        annotation (CTranslUnit _ n) = n-        amap f (CTranslUnit a_1 a_2) = CTranslUnit a_1 (f a_2)--instance CNode t1 => CNode (CExternalDeclaration t1) where-        nodeInfo (CDeclExt d) = nodeInfo d-        nodeInfo (CFDefExt d) = nodeInfo d-        nodeInfo (CAsmExt _ n) = nodeInfo n-instance CNode t1 => Pos (CExternalDeclaration t1) where-        posOf x = posOf (nodeInfo x)--instance Functor CExternalDeclaration where-        fmap _f (CDeclExt a1) = CDeclExt (fmap _f a1)-        fmap _f (CFDefExt a1) = CFDefExt (fmap _f a1)-        fmap _f (CAsmExt a1 a2) = CAsmExt (fmap _f a1) (_f a2)--instance Annotated CExternalDeclaration where-        annotation (CDeclExt n) = annotation n-        annotation (CFDefExt n) = annotation n-        annotation (CAsmExt _ n) = n-        amap f (CDeclExt n) = CDeclExt (amap f n)-        amap f (CFDefExt n) = CFDefExt (amap f n)-        amap f (CAsmExt a_1 a_2) = CAsmExt a_1 (f a_2)--instance CNode t1 => CNode (CFunctionDef t1) where-        nodeInfo (CFunDef _ _ _ _ n) = nodeInfo n-instance CNode t1 => Pos (CFunctionDef t1) where-        posOf x = posOf (nodeInfo x)--instance Functor CFunctionDef where-        fmap _f (CFunDef a1 a2 a3 a4 a5)-          = CFunDef (fmap (fmap _f) a1) (fmap _f a2) (fmap (fmap _f) a3)-              (fmap _f a4)-              (_f a5)--instance Annotated CFunctionDef where-        annotation (CFunDef _ _ _ _ n) = n-        amap f (CFunDef a_1 a_2 a_3 a_4 a_5)-          = CFunDef a_1 a_2 a_3 a_4 (f a_5)--instance CNode t1 => CNode (CDeclaration t1) where-        nodeInfo (CDecl _ _ n) = nodeInfo n-        nodeInfo (CStaticAssert _ _ n) = nodeInfo n-instance CNode t1 => Pos (CDeclaration t1) where-        posOf x = posOf (nodeInfo x)--instance Annotated CDeclaration where-        annotation (CDecl _ _ n) = n-        annotation (CStaticAssert _ _ n) = n-        amap f (CDecl a_1 a_2 a_3) = CDecl a_1 a_2 (f a_3)-        amap f (CStaticAssert a_1 a_2 a_3) = CStaticAssert a_1 a_2 (f a_3)--instance CNode t1 => CNode (CDeclarator t1) where-        nodeInfo (CDeclr _ _ _ _ n) = nodeInfo n-instance CNode t1 => Pos (CDeclarator t1) where-        posOf x = posOf (nodeInfo x)--instance Functor CDeclarator where-        fmap _f (CDeclr a1 a2 a3 a4 a5)-          = CDeclr a1 (fmap (fmap _f) a2) (fmap (fmap _f) a3)-              (fmap (fmap _f) a4)-              (_f a5)--instance Annotated CDeclarator where-        annotation (CDeclr _ _ _ _ n) = n-        amap f (CDeclr a_1 a_2 a_3 a_4 a_5)-          = CDeclr a_1 a_2 a_3 a_4 (f a_5)--instance CNode t1 => CNode (CDerivedDeclarator t1) where-        nodeInfo (CPtrDeclr _ n) = nodeInfo n-        nodeInfo (CArrDeclr _ _ n) = nodeInfo n-        nodeInfo (CFunDeclr _ _ n) = nodeInfo n-instance CNode t1 => Pos (CDerivedDeclarator t1) where-        posOf x = posOf (nodeInfo x)--instance Annotated CDerivedDeclarator where-        annotation (CPtrDeclr _ n) = n-        annotation (CArrDeclr _ _ n) = n-        annotation (CFunDeclr _ _ n) = n-        amap f (CPtrDeclr a_1 a_2) = CPtrDeclr a_1 (f a_2)-        amap f (CArrDeclr a_1 a_2 a_3) = CArrDeclr a_1 a_2 (f a_3)-        amap f (CFunDeclr a_1 a_2 a_3) = CFunDeclr a_1 a_2 (f a_3)--instance Functor CArraySize where-        fmap _ (CNoArrSize a1) = CNoArrSize a1-        fmap _f (CArrSize a1 a2) = CArrSize a1 (fmap _f a2)--instance CNode t1 => CNode (CStatement t1) where-        nodeInfo (CLabel _ _ _ n) = nodeInfo n-        nodeInfo (CCase _ _ n) = nodeInfo n-        nodeInfo (CCases _ _ _ n) = nodeInfo n-        nodeInfo (CDefault _ n) = nodeInfo n-        nodeInfo (CExpr _ n) = nodeInfo n-        nodeInfo (CCompound _ _ n) = nodeInfo n-        nodeInfo (CIf _ _ _ n) = nodeInfo n-        nodeInfo (CSwitch _ _ n) = nodeInfo n-        nodeInfo (CWhile _ _ _ n) = nodeInfo n-        nodeInfo (CFor _ _ _ _ n) = nodeInfo n-        nodeInfo (CGoto _ n) = nodeInfo n-        nodeInfo (CGotoPtr _ n) = nodeInfo n-        nodeInfo (CCont d) = nodeInfo d-        nodeInfo (CBreak d) = nodeInfo d-        nodeInfo (CReturn _ n) = nodeInfo n-        nodeInfo (CAsm _ n) = nodeInfo n-instance CNode t1 => Pos (CStatement t1) where-        posOf x = posOf (nodeInfo x)--instance Annotated CStatement where-        annotation (CLabel _ _ _ n) = n-        annotation (CCase _ _ n) = n-        annotation (CCases _ _ _ n) = n-        annotation (CDefault _ n) = n-        annotation (CExpr _ n) = n-        annotation (CCompound _ _ n) = n-        annotation (CIf _ _ _ n) = n-        annotation (CSwitch _ _ n) = n-        annotation (CWhile _ _ _ n) = n-        annotation (CFor _ _ _ _ n) = n-        annotation (CGoto _ n) = n-        annotation (CGotoPtr _ n) = n-        annotation (CCont n) = n-        annotation (CBreak n) = n-        annotation (CReturn _ n) = n-        annotation (CAsm _ n) = n-        amap f (CLabel a_1 a_2 a_3 a_4) = CLabel a_1 a_2 a_3 (f a_4)-        amap f (CCase a_1 a_2 a_3) = CCase a_1 a_2 (f a_3)-        amap f (CCases a_1 a_2 a_3 a_4) = CCases a_1 a_2 a_3 (f a_4)-        amap f (CDefault a_1 a_2) = CDefault a_1 (f a_2)-        amap f (CExpr a_1 a_2) = CExpr a_1 (f a_2)-        amap f (CCompound a_1 a_2 a_3) = CCompound a_1 a_2 (f a_3)-        amap f (CIf a_1 a_2 a_3 a_4) = CIf a_1 a_2 a_3 (f a_4)-        amap f (CSwitch a_1 a_2 a_3) = CSwitch a_1 a_2 (f a_3)-        amap f (CWhile a_1 a_2 a_3 a_4) = CWhile a_1 a_2 a_3 (f a_4)-        amap f (CFor a_1 a_2 a_3 a_4 a_5) = CFor a_1 a_2 a_3 a_4 (f a_5)-        amap f (CGoto a_1 a_2) = CGoto a_1 (f a_2)-        amap f (CGotoPtr a_1 a_2) = CGotoPtr a_1 (f a_2)-        amap f (CCont a_1) = CCont (f a_1)-        amap f (CBreak a_1) = CBreak (f a_1)-        amap f (CReturn a_1 a_2) = CReturn a_1 (f a_2)-        amap f (CAsm a_1 a_2) = CAsm a_1 (f a_2)--instance CNode t1 => CNode (CAssemblyStatement t1) where-        nodeInfo (CAsmStmt _ _ _ _ _ n) = nodeInfo n-instance CNode t1 => Pos (CAssemblyStatement t1) where-        posOf x = posOf (nodeInfo x)--instance Functor CAssemblyStatement where-        fmap _f (CAsmStmt a1 a2 a3 a4 a5 a6)-          = CAsmStmt (fmap (fmap _f) a1) (fmap _f a2) (fmap (fmap _f) a3)-              (fmap (fmap _f) a4)-              (fmap (fmap _f) a5)-              (_f a6)--instance Annotated CAssemblyStatement where-        annotation (CAsmStmt _ _ _ _ _ n) = n-        amap f (CAsmStmt a_1 a_2 a_3 a_4 a_5 a_6)-          = CAsmStmt a_1 a_2 a_3 a_4 a_5 (f a_6)--instance CNode t1 => CNode (CAssemblyOperand t1) where-        nodeInfo (CAsmOperand _ _ _ n) = nodeInfo n-instance CNode t1 => Pos (CAssemblyOperand t1) where-        posOf x = posOf (nodeInfo x)--instance Functor CAssemblyOperand where-        fmap _f (CAsmOperand a1 a2 a3 a4)-          = CAsmOperand a1 (fmap _f a2) (fmap _f a3) (_f a4)--instance Annotated CAssemblyOperand where-        annotation (CAsmOperand _ _ _ n) = n-        amap f (CAsmOperand a_1 a_2 a_3 a_4)-          = CAsmOperand a_1 a_2 a_3 (f a_4)--instance CNode t1 => CNode (CCompoundBlockItem t1) where-        nodeInfo (CBlockStmt d) = nodeInfo d-        nodeInfo (CBlockDecl d) = nodeInfo d-        nodeInfo (CNestedFunDef d) = nodeInfo d-instance CNode t1 => Pos (CCompoundBlockItem t1) where-        posOf x = posOf (nodeInfo x)--instance Functor CCompoundBlockItem where-        fmap _f (CBlockStmt a1) = CBlockStmt (fmap _f a1)-        fmap _f (CBlockDecl a1) = CBlockDecl (fmap _f a1)-        fmap _f (CNestedFunDef a1) = CNestedFunDef (fmap _f a1)--instance Annotated CCompoundBlockItem where-        annotation (CBlockStmt n) = annotation n-        annotation (CBlockDecl n) = annotation n-        annotation (CNestedFunDef n) = annotation n-        amap f (CBlockStmt n) = CBlockStmt (amap f n)-        amap f (CBlockDecl n) = CBlockDecl (amap f n)-        amap f (CNestedFunDef n) = CNestedFunDef (amap f n)--instance CNode t1 => CNode (CDeclarationSpecifier t1) where-        nodeInfo (CStorageSpec d) = nodeInfo d-        nodeInfo (CTypeSpec d) = nodeInfo d-        nodeInfo (CTypeQual d) = nodeInfo d-        nodeInfo (CFunSpec d) = nodeInfo d-        nodeInfo (CAlignSpec d) = nodeInfo d-instance CNode t1 => Pos (CDeclarationSpecifier t1) where-        posOf x = posOf (nodeInfo x)--instance Functor CDeclarationSpecifier where-        fmap _f (CStorageSpec a1) = CStorageSpec (fmap _f a1)-        fmap _f (CTypeSpec a1) = CTypeSpec (fmap _f a1)-        fmap _f (CTypeQual a1) = CTypeQual (fmap _f a1)-        fmap _f (CFunSpec a1) = CFunSpec (fmap _f a1)-        fmap _f (CAlignSpec a1) = CAlignSpec (fmap _f a1)--instance Annotated CDeclarationSpecifier where-        annotation (CStorageSpec n) = annotation n-        annotation (CTypeSpec n) = annotation n-        annotation (CTypeQual n) = annotation n-        annotation (CFunSpec n) = annotation n-        annotation (CAlignSpec n) = annotation n-        amap f (CStorageSpec n) = CStorageSpec (amap f n)-        amap f (CTypeSpec n) = CTypeSpec (amap f n)-        amap f (CTypeQual n) = CTypeQual (amap f n)-        amap f (CFunSpec n) = CFunSpec (amap f n)-        amap f (CAlignSpec n) = CAlignSpec (amap f n)--instance CNode t1 => CNode (CStorageSpecifier t1) where-        nodeInfo (CAuto d) = nodeInfo d-        nodeInfo (CRegister d) = nodeInfo d-        nodeInfo (CStatic d) = nodeInfo d-        nodeInfo (CExtern d) = nodeInfo d-        nodeInfo (CTypedef d) = nodeInfo d-        nodeInfo (CThread d) = nodeInfo d-instance CNode t1 => Pos (CStorageSpecifier t1) where-        posOf x = posOf (nodeInfo x)--instance Functor CStorageSpecifier where-        fmap _f (CAuto a1) = CAuto (_f a1)-        fmap _f (CRegister a1) = CRegister (_f a1)-        fmap _f (CStatic a1) = CStatic (_f a1)-        fmap _f (CExtern a1) = CExtern (_f a1)-        fmap _f (CTypedef a1) = CTypedef (_f a1)-        fmap _f (CThread a1) = CThread (_f a1)--instance Annotated CStorageSpecifier where-        annotation (CAuto n) = n-        annotation (CRegister n) = n-        annotation (CStatic n) = n-        annotation (CExtern n) = n-        annotation (CTypedef n) = n-        annotation (CThread n) = n-        amap f (CAuto a_1) = CAuto (f a_1)-        amap f (CRegister a_1) = CRegister (f a_1)-        amap f (CStatic a_1) = CStatic (f a_1)-        amap f (CExtern a_1) = CExtern (f a_1)-        amap f (CTypedef a_1) = CTypedef (f a_1)-        amap f (CThread a_1) = CThread (f a_1)--instance CNode t1 => CNode (CTypeSpecifier t1) where-        nodeInfo (CVoidType d) = nodeInfo d-        nodeInfo (CCharType d) = nodeInfo d-        nodeInfo (CShortType d) = nodeInfo d-        nodeInfo (CIntType d) = nodeInfo d-        nodeInfo (CLongType d) = nodeInfo d-        nodeInfo (CFloatType d) = nodeInfo d-        nodeInfo (CFloat128Type d) = nodeInfo d-        nodeInfo (CDoubleType d) = nodeInfo d-        nodeInfo (CSignedType d) = nodeInfo d-        nodeInfo (CUnsigType d) = nodeInfo d-        nodeInfo (CBoolType d) = nodeInfo d-        nodeInfo (CComplexType d) = nodeInfo d-        nodeInfo (CInt128Type d) = nodeInfo d-        nodeInfo (CSUType _ n) = nodeInfo n-        nodeInfo (CEnumType _ n) = nodeInfo n-        nodeInfo (CTypeDef _ n) = nodeInfo n-        nodeInfo (CTypeOfExpr _ n) = nodeInfo n-        nodeInfo (CTypeOfType _ n) = nodeInfo n-        nodeInfo (CAtomicType _ n) = nodeInfo n-instance CNode t1 => Pos (CTypeSpecifier t1) where-        posOf x = posOf (nodeInfo x)--instance Functor CTypeSpecifier where-        fmap _f (CVoidType a1) = CVoidType (_f a1)-        fmap _f (CCharType a1) = CCharType (_f a1)-        fmap _f (CShortType a1) = CShortType (_f a1)-        fmap _f (CIntType a1) = CIntType (_f a1)-        fmap _f (CLongType a1) = CLongType (_f a1)-        fmap _f (CFloatType a1) = CFloatType (_f a1)-        fmap _f (CFloat128Type a1) = CFloat128Type (_f a1)-        fmap _f (CDoubleType a1) = CDoubleType (_f a1)-        fmap _f (CSignedType a1) = CSignedType (_f a1)-        fmap _f (CUnsigType a1) = CUnsigType (_f a1)-        fmap _f (CBoolType a1) = CBoolType (_f a1)-        fmap _f (CComplexType a1) = CComplexType (_f a1)-        fmap _f (CInt128Type a1) = CInt128Type (_f a1)-        fmap _f (CSUType a1 a2) = CSUType (fmap _f a1) (_f a2)-        fmap _f (CEnumType a1 a2) = CEnumType (fmap _f a1) (_f a2)-        fmap _f (CTypeDef a1 a2) = CTypeDef a1 (_f a2)-        fmap _f (CTypeOfExpr a1 a2) = CTypeOfExpr (fmap _f a1) (_f a2)-        fmap _f (CTypeOfType a1 a2) = CTypeOfType (fmap _f a1) (_f a2)-        fmap _f (CAtomicType a1 a2) = CAtomicType (fmap _f a1) (_f a2)--instance Annotated CTypeSpecifier where-        annotation (CVoidType n) = n-        annotation (CCharType n) = n-        annotation (CShortType n) = n-        annotation (CIntType n) = n-        annotation (CLongType n) = n-        annotation (CFloatType n) = n-        annotation (CFloat128Type n) = n-        annotation (CDoubleType n) = n-        annotation (CSignedType n) = n-        annotation (CUnsigType n) = n-        annotation (CBoolType n) = n-        annotation (CComplexType n) = n-        annotation (CInt128Type n) = n-        annotation (CSUType _ n) = n-        annotation (CEnumType _ n) = n-        annotation (CTypeDef _ n) = n-        annotation (CTypeOfExpr _ n) = n-        annotation (CTypeOfType _ n) = n-        annotation (CAtomicType _ n) = n-        amap f (CVoidType a_1) = CVoidType (f a_1)-        amap f (CCharType a_1) = CCharType (f a_1)-        amap f (CShortType a_1) = CShortType (f a_1)-        amap f (CIntType a_1) = CIntType (f a_1)-        amap f (CLongType a_1) = CLongType (f a_1)-        amap f (CFloatType a_1) = CFloatType (f a_1)-        amap f (CFloat128Type a_1) = CFloat128Type (f a_1)-        amap f (CDoubleType a_1) = CDoubleType (f a_1)-        amap f (CSignedType a_1) = CSignedType (f a_1)-        amap f (CUnsigType a_1) = CUnsigType (f a_1)-        amap f (CBoolType a_1) = CBoolType (f a_1)-        amap f (CComplexType a_1) = CComplexType (f a_1)-        amap f (CInt128Type a_1) = CInt128Type (f a_1)-        amap f (CSUType a_1 a_2) = CSUType a_1 (f a_2)-        amap f (CEnumType a_1 a_2) = CEnumType a_1 (f a_2)-        amap f (CTypeDef a_1 a_2) = CTypeDef a_1 (f a_2)-        amap f (CTypeOfExpr a_1 a_2) = CTypeOfExpr a_1 (f a_2)-        amap f (CTypeOfType a_1 a_2) = CTypeOfType a_1 (f a_2)-        amap f (CAtomicType a_1 a_2) = CAtomicType a_1 (f a_2)--instance CNode t1 => CNode (CTypeQualifier t1) where-        nodeInfo (CConstQual d) = nodeInfo d-        nodeInfo (CVolatQual d) = nodeInfo d-        nodeInfo (CRestrQual d) = nodeInfo d-        nodeInfo (CAtomicQual d) = nodeInfo d-        nodeInfo (CAttrQual d) = nodeInfo d-        nodeInfo (CNullableQual d) = nodeInfo d-        nodeInfo (CNonnullQual d) = nodeInfo d--instance CNode t1 => Pos (CTypeQualifier t1) where-        posOf x = posOf (nodeInfo x)--instance Functor CTypeQualifier where-        fmap _f (CConstQual a1) = CConstQual (_f a1)-        fmap _f (CVolatQual a1) = CVolatQual (_f a1)-        fmap _f (CRestrQual a1) = CRestrQual (_f a1)-        fmap _f (CAtomicQual a1) = CAtomicQual (_f a1)-        fmap _f (CAttrQual a1) = CAttrQual (fmap _f a1)-        fmap _f (CNullableQual a1) = CNullableQual (_f a1)-        fmap _f (CNonnullQual a1) = CNonnullQual (_f a1)--instance Annotated CTypeQualifier where-        annotation (CConstQual n) = n-        annotation (CVolatQual n) = n-        annotation (CRestrQual n) = n-        annotation (CAtomicQual n) = n-        annotation (CAttrQual n) = annotation n-        annotation (CNullableQual n) = n-        annotation (CNonnullQual n) = n-        amap f (CConstQual a_1) = CConstQual (f a_1)-        amap f (CVolatQual a_1) = CVolatQual (f a_1)-        amap f (CRestrQual a_1) = CRestrQual (f a_1)-        amap f (CAtomicQual a_1) = CAtomicQual (f a_1)-        amap f (CAttrQual n) = CAttrQual (amap f n)-        amap f (CNullableQual a_1) = CNullableQual (f a_1)-        amap f (CNonnullQual a_1) = CNonnullQual (f a_1)--instance CNode t1 => CNode (CFunctionSpecifier t1) where-        nodeInfo (CInlineQual d) = nodeInfo d-        nodeInfo (CNoreturnQual d) = nodeInfo d-instance CNode t1 => Pos (CFunctionSpecifier t1) where-        posOf x = posOf (nodeInfo x)--instance Functor CFunctionSpecifier where-        fmap _f (CInlineQual a1) = CInlineQual (_f a1)-        fmap _f (CNoreturnQual a1) = CNoreturnQual (_f a1)--instance Annotated CFunctionSpecifier where-        annotation (CInlineQual n) = n-        annotation (CNoreturnQual n) = n-        amap f (CInlineQual a_1) = CInlineQual (f a_1)-        amap f (CNoreturnQual a_1) = CNoreturnQual (f a_1)--instance CNode t1 => CNode (CAlignmentSpecifier t1) where-        nodeInfo (CAlignAsType _ n) = nodeInfo n-        nodeInfo (CAlignAsExpr _ n) = nodeInfo n-instance CNode t1 => Pos (CAlignmentSpecifier t1) where-        posOf x = posOf (nodeInfo x)--instance Functor CAlignmentSpecifier where-        fmap _f (CAlignAsType a1 a2) = CAlignAsType (fmap _f a1) (_f a2)-        fmap _f (CAlignAsExpr a1 a2) = CAlignAsExpr (fmap _f a1) (_f a2)--instance Annotated CAlignmentSpecifier where-        annotation (CAlignAsType _ n) = n-        annotation (CAlignAsExpr _ n) = n-        amap f (CAlignAsType a_1 a_2) = CAlignAsType a_1 (f a_2)-        amap f (CAlignAsExpr a_1 a_2) = CAlignAsExpr a_1 (f a_2)--instance CNode t1 => CNode (CStructureUnion t1) where-        nodeInfo (CStruct _ _ _ _ n) = nodeInfo n-instance CNode t1 => Pos (CStructureUnion t1) where-        posOf x = posOf (nodeInfo x)--instance Functor CStructureUnion where-        fmap _f (CStruct a1 a2 a3 a4 a5)-          = CStruct a1 a2 (fmap (fmap (fmap _f)) a3) (fmap (fmap _f) a4)-              (_f a5)--instance Annotated CStructureUnion where-        annotation (CStruct _ _ _ _ n) = n-        amap f (CStruct a_1 a_2 a_3 a_4 a_5)-          = CStruct a_1 a_2 a_3 a_4 (f a_5)--instance CNode t1 => CNode (CEnumeration t1) where-        nodeInfo (CEnum _ _ _ n) = nodeInfo n-instance CNode t1 => Pos (CEnumeration t1) where-        posOf x = posOf (nodeInfo x)--instance Functor CEnumeration where-        fmap _f (CEnum a1 a2 a3 a4)-          = CEnum a1 (fmap (fmap (fmap (fmap (fmap _f)))) a2)-              (fmap (fmap _f) a3)-              (_f a4)--instance Annotated CEnumeration where-        annotation (CEnum _ _ _ n) = n-        amap f (CEnum a_1 a_2 a_3 a_4) = CEnum a_1 a_2 a_3 (f a_4)--instance CNode t1 => CNode (CInitializer t1) where-        nodeInfo (CInitExpr _ n) = nodeInfo n-        nodeInfo (CInitList _ n) = nodeInfo n-instance CNode t1 => Pos (CInitializer t1) where-        posOf x = posOf (nodeInfo x)--instance Annotated CInitializer where-        annotation (CInitExpr _ n) = n-        annotation (CInitList _ n) = n-        amap f (CInitExpr a_1 a_2) = CInitExpr a_1 (f a_2)-        amap f (CInitList a_1 a_2) = CInitList a_1 (f a_2)--instance CNode t1 => CNode (CPartDesignator t1) where-        nodeInfo (CArrDesig _ n) = nodeInfo n-        nodeInfo (CMemberDesig _ n) = nodeInfo n-        nodeInfo (CRangeDesig _ _ n) = nodeInfo n-instance CNode t1 => Pos (CPartDesignator t1) where-        posOf x = posOf (nodeInfo x)--instance Functor CPartDesignator where-        fmap _f (CArrDesig a1 a2) = CArrDesig (fmap _f a1) (_f a2)-        fmap _f (CMemberDesig a1 a2) = CMemberDesig a1 (_f a2)-        fmap _f (CRangeDesig a1 a2 a3)-          = CRangeDesig (fmap _f a1) (fmap _f a2) (_f a3)--instance Annotated CPartDesignator where-        annotation (CArrDesig _ n) = n-        annotation (CMemberDesig _ n) = n-        annotation (CRangeDesig _ _ n) = n-        amap f (CArrDesig a_1 a_2) = CArrDesig a_1 (f a_2)-        amap f (CMemberDesig a_1 a_2) = CMemberDesig a_1 (f a_2)-        amap f (CRangeDesig a_1 a_2 a_3) = CRangeDesig a_1 a_2 (f a_3)--instance CNode t1 => CNode (CAttribute t1) where-        nodeInfo (CAttr _ _ n) = nodeInfo n-instance CNode t1 => Pos (CAttribute t1) where-        posOf x = posOf (nodeInfo x)--instance Functor CAttribute where-        fmap _f (CAttr a1 a2 a3) = CAttr a1 (fmap (fmap _f) a2) (_f a3)--instance Annotated CAttribute where-        annotation (CAttr _ _ n) = n-        amap f (CAttr a_1 a_2 a_3) = CAttr a_1 a_2 (f a_3)--instance CNode t1 => CNode (CExpression t1) where-        nodeInfo (CComma _ n) = nodeInfo n-        nodeInfo (CAssign _ _ _ n) = nodeInfo n-        nodeInfo (CCond _ _ _ n) = nodeInfo n-        nodeInfo (CBinary _ _ _ n) = nodeInfo n-        nodeInfo (CCast _ _ n) = nodeInfo n-        nodeInfo (CUnary _ _ n) = nodeInfo n-        nodeInfo (CSizeofExpr _ n) = nodeInfo n-        nodeInfo (CSizeofType _ n) = nodeInfo n-        nodeInfo (CAlignofExpr _ n) = nodeInfo n-        nodeInfo (CAlignofType _ n) = nodeInfo n-        nodeInfo (CComplexReal _ n) = nodeInfo n-        nodeInfo (CComplexImag _ n) = nodeInfo n-        nodeInfo (CIndex _ _ n) = nodeInfo n-        nodeInfo (CCall _ _ n) = nodeInfo n-        nodeInfo (CMember _ _ _ n) = nodeInfo n-        nodeInfo (CVar _ n) = nodeInfo n-        nodeInfo (CConst d) = nodeInfo d-        nodeInfo (CCompoundLit _ _ n) = nodeInfo n-        nodeInfo (CGenericSelection _ _ n) = nodeInfo n-        nodeInfo (CStatExpr _ n) = nodeInfo n-        nodeInfo (CLabAddrExpr _ n) = nodeInfo n-        nodeInfo (CBuiltinExpr d) = nodeInfo d-instance CNode t1 => Pos (CExpression t1) where-        posOf x = posOf (nodeInfo x)--instance Annotated CExpression where-        annotation (CComma _ n) = n-        annotation (CAssign _ _ _ n) = n-        annotation (CCond _ _ _ n) = n-        annotation (CBinary _ _ _ n) = n-        annotation (CCast _ _ n) = n-        annotation (CUnary _ _ n) = n-        annotation (CSizeofExpr _ n) = n-        annotation (CSizeofType _ n) = n-        annotation (CAlignofExpr _ n) = n-        annotation (CAlignofType _ n) = n-        annotation (CComplexReal _ n) = n-        annotation (CComplexImag _ n) = n-        annotation (CIndex _ _ n) = n-        annotation (CCall _ _ n) = n-        annotation (CMember _ _ _ n) = n-        annotation (CVar _ n) = n-        annotation (CConst n) = annotation n-        annotation (CCompoundLit _ _ n) = n-        annotation (CGenericSelection _ _ n) = n-        annotation (CStatExpr _ n) = n-        annotation (CLabAddrExpr _ n) = n-        annotation (CBuiltinExpr n) = annotation n-        amap f (CComma a_1 a_2) = CComma a_1 (f a_2)-        amap f (CAssign a_1 a_2 a_3 a_4) = CAssign a_1 a_2 a_3 (f a_4)-        amap f (CCond a_1 a_2 a_3 a_4) = CCond a_1 a_2 a_3 (f a_4)-        amap f (CBinary a_1 a_2 a_3 a_4) = CBinary a_1 a_2 a_3 (f a_4)-        amap f (CCast a_1 a_2 a_3) = CCast a_1 a_2 (f a_3)-        amap f (CUnary a_1 a_2 a_3) = CUnary a_1 a_2 (f a_3)-        amap f (CSizeofExpr a_1 a_2) = CSizeofExpr a_1 (f a_2)-        amap f (CSizeofType a_1 a_2) = CSizeofType a_1 (f a_2)-        amap f (CAlignofExpr a_1 a_2) = CAlignofExpr a_1 (f a_2)-        amap f (CAlignofType a_1 a_2) = CAlignofType a_1 (f a_2)-        amap f (CComplexReal a_1 a_2) = CComplexReal a_1 (f a_2)-        amap f (CComplexImag a_1 a_2) = CComplexImag a_1 (f a_2)-        amap f (CIndex a_1 a_2 a_3) = CIndex a_1 a_2 (f a_3)-        amap f (CCall a_1 a_2 a_3) = CCall a_1 a_2 (f a_3)-        amap f (CMember a_1 a_2 a_3 a_4) = CMember a_1 a_2 a_3 (f a_4)-        amap f (CVar a_1 a_2) = CVar a_1 (f a_2)-        amap f (CConst n) = CConst (amap f n)-        amap f (CCompoundLit a_1 a_2 a_3) = CCompoundLit a_1 a_2 (f a_3)-        amap f (CGenericSelection a_1 a_2 a_3)-          = CGenericSelection a_1 a_2 (f a_3)-        amap f (CStatExpr a_1 a_2) = CStatExpr a_1 (f a_2)-        amap f (CLabAddrExpr a_1 a_2) = CLabAddrExpr a_1 (f a_2)-        amap f (CBuiltinExpr n) = CBuiltinExpr (amap f n)--instance CNode t1 => CNode (CBuiltinThing t1) where-        nodeInfo (CBuiltinVaArg _ _ n) = nodeInfo n-        nodeInfo (CBuiltinOffsetOf _ _ n) = nodeInfo n-        nodeInfo (CBuiltinTypesCompatible _ _ n) = nodeInfo n-        nodeInfo (CBuiltinConvertVector _ _ n) = nodeInfo n-instance CNode t1 => Pos (CBuiltinThing t1) where-        posOf x = posOf (nodeInfo x)--instance Functor CBuiltinThing where-        fmap _f (CBuiltinVaArg a1 a2 a3)-          = CBuiltinVaArg (fmap _f a1) (fmap _f a2) (_f a3)-        fmap _f (CBuiltinOffsetOf a1 a2 a3)-          = CBuiltinOffsetOf (fmap _f a1) (fmap (fmap _f) a2) (_f a3)-        fmap _f (CBuiltinTypesCompatible a1 a2 a3)-          = CBuiltinTypesCompatible (fmap _f a1) (fmap _f a2) (_f a3)-        fmap _f (CBuiltinConvertVector a1 a2 a3)-          = CBuiltinConvertVector (fmap _f a1) (fmap _f a2) (_f a3)--instance Annotated CBuiltinThing where-        annotation (CBuiltinVaArg _ _ n) = n-        annotation (CBuiltinOffsetOf _ _ n) = n-        annotation (CBuiltinTypesCompatible _ _ n) = n-        annotation (CBuiltinConvertVector _ _ n) = n-        amap f (CBuiltinVaArg a_1 a_2 a_3) = CBuiltinVaArg a_1 a_2 (f a_3)-        amap f (CBuiltinOffsetOf a_1 a_2 a_3)-          = CBuiltinOffsetOf a_1 a_2 (f a_3)-        amap f (CBuiltinTypesCompatible a_1 a_2 a_3)-          = CBuiltinTypesCompatible a_1 a_2 (f a_3)-        amap f (CBuiltinConvertVector a_1 a_2 a_3) =-          CBuiltinConvertVector a_1 a_2 (f a_3)--instance CNode t1 => CNode (CConstant t1) where-        nodeInfo (CIntConst _ n) = nodeInfo n-        nodeInfo (CCharConst _ n) = nodeInfo n-        nodeInfo (CFloatConst _ n) = nodeInfo n-        nodeInfo (CStrConst _ n) = nodeInfo n-instance CNode t1 => Pos (CConstant t1) where-        posOf x = posOf (nodeInfo x)--instance Functor CConstant where-        fmap _f (CIntConst a1 a2) = CIntConst a1 (_f a2)-        fmap _f (CCharConst a1 a2) = CCharConst a1 (_f a2)-        fmap _f (CFloatConst a1 a2) = CFloatConst a1 (_f a2)-        fmap _f (CStrConst a1 a2) = CStrConst a1 (_f a2)--instance Annotated CConstant where-        annotation (CIntConst _ n) = n-        annotation (CCharConst _ n) = n-        annotation (CFloatConst _ n) = n-        annotation (CStrConst _ n) = n-        amap f (CIntConst a_1 a_2) = CIntConst a_1 (f a_2)-        amap f (CCharConst a_1 a_2) = CCharConst a_1 (f a_2)-        amap f (CFloatConst a_1 a_2) = CFloatConst a_1 (f a_2)-        amap f (CStrConst a_1 a_2) = CStrConst a_1 (f a_2)--instance CNode t1 => CNode (CStringLiteral t1) where-        nodeInfo (CStrLit _ n) = nodeInfo n-instance CNode t1 => Pos (CStringLiteral t1) where-        posOf x = posOf (nodeInfo x)--instance Functor CStringLiteral where-        fmap _f (CStrLit a1 a2) = CStrLit a1 (_f a2)--instance Annotated CStringLiteral where-        annotation (CStrLit _ n) = n-        amap f (CStrLit a_1 a_2) = CStrLit a_1 (f a_2)--- GENERATED STOP+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE TypeSynonymInstances #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Syntax.AST
+-- Copyright   :  (c) [1999..2007] Manuel M T Chakravarty
+--                (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  : benedikt.huber@gmail.com
+-- Stability   : experimental
+-- Portability : ghc
+--
+-- Abstract syntax of C source and header files.
+--
+--  The tree structure is based on the grammar in Appendix A of K&R.  The
+--  abstract syntax simplifies the concrete syntax by merging similar concrete
+--  constructs into a single type of abstract tree structure: declarations are
+--  merged with structure declarations, parameter declarations and type names,
+--  and declarators are merged with abstract declarators.
+--
+--  With K&R we refer to ``The C Programming Language'', second edition, Brain
+--  W. Kernighan and Dennis M. Ritchie, Prentice Hall, 1988. The AST supports all
+--  of C99 <http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf> and several
+--  GNU extensions <http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html>.
+-----------------------------------------------------------------------------
+module Language.C.Syntax.AST (
+  -- * C translation units
+  CTranslUnit,  CExtDecl,
+  CTranslationUnit(..),  CExternalDeclaration(..),
+  -- * Declarations
+  CFunDef,  CDecl, CStructUnion, CEnum,
+  CFunctionDef(..),  CDeclaration(..),
+  CStructTag(..), CStructureUnion(..),  CEnumeration(..),
+  -- * Declaration attributes
+  CDeclSpec, partitionDeclSpecs,
+  CStorageSpec, CTypeSpec, isSUEDef, CTypeQual, CFunSpec, CAlignSpec,  CAttr,
+  CFunctionSpecifier(..), CDeclarationSpecifier(..), CStorageSpecifier(..), CTypeSpecifier(..),
+  CAlignmentSpecifier(..),
+  CTypeQualifier(..), CAttribute(..),
+  -- * Declarators
+  CDeclr,CDerivedDeclr,CArrSize,
+  CDeclarator(..), CDerivedDeclarator(..), CArraySize(..),
+  -- * Initialization
+  CInit, CInitList, CDesignator,
+  CInitializer(..), CInitializerList, CPartDesignator(..),
+  -- * Statements
+  CStat, CBlockItem, CAsmStmt, CAsmOperand,
+  CStatement(..), CCompoundBlockItem(..),
+  CAssemblyStatement(..), CAssemblyOperand(..),
+  -- * Expressions
+  CExpr, CExpression(..),
+  CAssignOp(..), CBinaryOp(..), CUnaryOp(..),
+  CBuiltin, CBuiltinThing(..),
+  -- * Constants
+  CConst, CStrLit, cstringOfLit, liftStrLit,
+  CConstant(..), CStringLiteral(..),
+  -- * Annoated type class
+  Annotated(..)
+) where
+import Language.C.Syntax.Constants
+import Language.C.Syntax.Ops
+import Language.C.Data.Ident
+import Language.C.Data.Node
+import Language.C.Data.Position
+import Data.Generics
+
+-- | Complete C tranlsation unit (C99 6.9, K&R A10)
+--
+-- A complete C translation unit, for example representing a C header or source file.
+-- It consists of a list of external (i.e. toplevel) declarations.
+type CTranslUnit = CTranslationUnit NodeInfo
+data CTranslationUnit a
+  = CTranslUnit [CExternalDeclaration a] a
+    deriving (Show, Data, Typeable {-! ,CNode ,Functor, Annotated !-})
+
+-- | External C declaration (C99 6.9, K&R A10)
+--
+-- Either a toplevel declaration, function definition or external assembler.
+type CExtDecl = CExternalDeclaration NodeInfo
+data CExternalDeclaration a
+  = CDeclExt (CDeclaration a)
+  | CFDefExt (CFunctionDef a)
+  | CAsmExt  (CStringLiteral a) a
+    deriving (Show, Data,Typeable {-! ,CNode ,Functor, Annotated !-})
+
+-- | C function definition (C99 6.9.1, K&R A10.1)
+--
+-- A function definition is of the form @CFunDef specifiers declarator decllist? stmt@.
+--
+-- * @specifiers@ are the type and storage-class specifiers of the function.
+--   The only storage-class specifiers allowed are /extern/ and /static/.
+--
+-- * The @declarator@ must be such that the declared identifier has /function type/.
+--   The return type shall be void or an object type other than array type.
+--
+-- * The optional declaration list @decllist@ is for old-style function declarations.
+--
+-- * The statement @stmt@ is a compound statement.
+type CFunDef = CFunctionDef NodeInfo
+data CFunctionDef a
+  = CFunDef
+    [CDeclarationSpecifier a] -- type specifier and qualifier
+    (CDeclarator a)           -- declarator
+    [CDeclaration a]          -- optional declaration list
+    (CStatement a)            -- compound statement
+    a
+    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})
+
+
+-- | C declarations (K&R A8, C99 6.7), including structure declarations, parameter
+--   declarations and type names.
+--
+-- A declaration is of the form @CDecl specifiers init-declarator-list@, where the form of the declarator list's
+--  elements depends on the kind of declaration:
+--
+-- 1) Toplevel declarations (K&R A8, C99 6.7 declaration)
+--
+--   * C99 requires that there is at least one specifier, though this is merely a syntactic restriction
+--
+--   * at most one storage class specifier is allowed per declaration
+--
+--   * the elements of the non-empty @init-declarator-list@ are of the form @(Just declr, init?, Nothing)@.
+--      The declarator @declr@ has to be present and non-abstract and the initialization expression is
+--      optional.
+--
+-- 2) Structure declarations (K&R A8.3, C99 6.7.2.1 struct-declaration)
+--
+--   Those are the declarations of a structure's members.
+--
+--   * do not allow storage specifiers
+--
+--   * in strict C99, the list of declarators has to be non-empty
+--
+--   * the elements of @init-declarator-list@ are either of the form @(Just declr, Nothing, size?)@,
+--     representing a member with optional bit-field size, or of the form @(Nothing, Nothing, Just size)@,
+--     for unnamed bitfields. @declr@ has to be non-abstract.
+--
+--   * no member of a structure shall have incomplete type
+--
+-- 3) Parameter declarations (K&R A8.6.3, C99 6.7.5 parameter-declaration)
+--
+--   * @init-declarator-list@ must contain at most one triple of the form @(Just declr, Nothing, Nothing)@,
+--     i.e. consist of a single declarator, which is allowed to be abstract (i.e. unnamed).
+--
+-- 4) Type names (A8.8, C99 6.7.6)
+--
+--   * do not allow storage specifiers
+--
+--   * @init-declarator-list@ must contain at most one triple of the form @(Just declr, Nothing, Nothing)@.
+--     where @declr@ is an abstract declarator (i.e. doesn't contain a declared identifier)
+--
+type CDecl = CDeclaration NodeInfo
+data CDeclaration a
+  = CDecl
+    [CDeclarationSpecifier a] -- type specifier and qualifier, __attribute__
+    [(Maybe (CDeclarator a),  -- declarator (may be omitted)
+      Maybe (CInitializer a), -- optional initialize
+      Maybe (CExpression a))] -- optional size (const expr)
+    a                         -- annotation
+    | CStaticAssert
+      (CExpression a)         -- assert expression
+      (CStringLiteral a)      -- assert text
+      a                       -- annotation
+    deriving (Show, Data,Typeable {-! ,CNode ,Annotated !-})
+
+-- Derive instance is a little bit ugly
+instance Functor CDeclaration where
+  fmap f (CDecl specs declarators annot) =
+    CDecl (map (fmap f) specs) (map fmap3m declarators) (f annot)
+      where fmap3m (a,b,c) = (fmap (fmap f) a, fmap (fmap f) b, fmap (fmap f) c)
+  fmap f (CStaticAssert expression strlit annot) =
+    CStaticAssert (fmap f expression) (fmap f strlit) (f annot)
+
+-- | C declarator (K&R A8.5, C99 6.7.5) and abstract declarator (K&R A8.8, C99 6.7.6)
+--
+-- A declarator declares a single object, function, or type. It is always associated with
+-- a declaration ('CDecl'), which specifies the declaration's type and the additional storage qualifiers and
+-- attributes, which apply to the declared object.
+--
+-- A declarator is of the form @CDeclr name? indirections asm-name? attrs _@, where
+-- @name@ is the name of the declared object (missing for abstract declarators),
+-- @declquals@ is a set of additional declaration specifiers,
+-- @asm-name@ is the optional assembler name and attributes is a set of
+-- attrs is a set of @__attribute__@ annotations for the declared object.
+--
+-- @indirections@ is a set of pointer, array and function declarators, which modify the type of the declared object as
+-- described below. If the /declaration/ specifies the non-derived type @T@,
+-- and we have @indirections = [D1, D2, ..., Dn]@ than the declared object has type
+-- @(D1 `indirect` (D2 `indirect` ...  (Dn `indirect` T)))@, where
+--
+--  * @(CPtrDeclr attrs) `indirect` T@ is /attributed pointer to T/
+--
+--  * @(CFunDeclr attrs) `indirect` T@ is /attributed function returning T/
+--
+--  * @(CArrayDeclr attrs) `indirect` T@ is /attributed array of elemements of type T/
+--
+-- Examples (simplified attributes):
+--
+--  * /x/ is an int
+--
+-- > int x;
+-- > CDeclr "x" []
+--
+--  * /x/ is a restrict pointer to a const pointer to int
+--
+-- > const int * const * restrict x;
+-- > CDeclr "x" [CPtrDeclr [restrict], CPtrDeclr [const]]
+--
+--  * /f/ is an function return a constant pointer to int
+--
+-- > int* const f();
+-- > CDeclr "f" [CFunDeclr [],CPtrDeclr [const]]
+--
+--  * /f/ is a constant pointer to a function returning int
+--
+-- > int (* const f)(); ==>
+-- > CDeclr "f" [CPtrDeclr [const], CFunDeclr []]
+type CDeclr = CDeclarator NodeInfo
+data CDeclarator a
+  = CDeclr (Maybe Ident) [CDerivedDeclarator a] (Maybe (CStringLiteral a)) [CAttribute a] a
+    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})
+
+
+-- | Derived declarators, see 'CDeclr'
+--
+-- Indirections are qualified using type-qualifiers and generic attributes, and additionally
+--
+--    * The size of an array is either a constant expression, variable length ('*') or missing; in the last case, the
+--      type of the array is incomplete. The qualifier static is allowed for function arguments only, indicating that
+--      the supplied argument is an array of at least the given size.
+--
+--    * New style parameter lists have the form @Right (declarations, isVariadic)@, old style parameter lists have the
+--      form @Left (parameter-names)@
+type CDerivedDeclr = CDerivedDeclarator NodeInfo
+data CDerivedDeclarator a
+  = CPtrDeclr [CTypeQualifier a] a
+  -- ^ Pointer declarator @CPtrDeclr tyquals declr@
+  | CArrDeclr [CTypeQualifier a] (CArraySize a) a
+  -- ^ Array declarator @CArrDeclr declr tyquals size-expr?@
+  | CFunDeclr (Either [Ident] ([CDeclaration a],Bool)) [CAttribute a] a
+    -- ^ Function declarator @CFunDeclr declr (old-style-params | new-style-params) c-attrs@
+    deriving (Show, Data,Typeable {-! ,CNode , Annotated !-})
+
+-- Derived instance relies on fmap2
+instance Functor CDerivedDeclarator where
+        fmap _f (CPtrDeclr a1 a2) = CPtrDeclr (fmap (fmap _f) a1) (_f a2)
+        fmap _f (CArrDeclr a1 a2 a3)
+          = CArrDeclr (fmap (fmap _f) a1) (fmap _f a2) (_f a3)
+        fmap _f (CFunDeclr a1 a2 a3)
+          = CFunDeclr (fmap (fmapFirst (fmap (fmap _f))) a1) (fmap (fmap _f) a2)
+              (_f a3)
+          where fmapFirst f (a,b) = (f a, b)
+
+-- | Size of an array
+type CArrSize = CArraySize NodeInfo
+data CArraySize a
+  = CNoArrSize Bool               -- ^ @CUnknownSize isCompleteType@
+  | CArrSize Bool (CExpression a) -- ^ @CArrSize isStatic expr@
+    deriving (Show, Data,Typeable {-! , Functor !-})
+
+
+-- | C statement (K&R A9, C99 6.8)
+--
+type CStat = CStatement NodeInfo
+data CStatement a
+  -- | An (attributed) label followed by a statement
+  = CLabel  Ident (CStatement a) [CAttribute a] a
+  -- | A statement of the form @case expr : stmt@
+  | CCase (CExpression a) (CStatement a) a
+  -- | A case range of the form @case lower ... upper : stmt@
+  | CCases (CExpression a) (CExpression a) (CStatement a) a
+  -- | The default case @default : stmt@
+  | CDefault (CStatement a) a
+  -- | A simple statement, that is in C: evaluating an expression with
+  --   side-effects and discarding the result.
+  | CExpr (Maybe (CExpression a)) a
+  -- | compound statement @CCompound localLabels blockItems at@
+  | CCompound [Ident] [CCompoundBlockItem a] a
+  -- | conditional statement @CIf ifExpr thenStmt maybeElseStmt at@
+  | CIf (CExpression a) (CStatement a) (Maybe (CStatement a)) a
+  -- | switch statement @CSwitch selectorExpr switchStmt@, where
+  -- @switchStmt@ usually includes /case/, /break/ and /default/
+  -- statements
+  | CSwitch (CExpression a) (CStatement a) a
+  -- | while or do-while statement @CWhile guard stmt isDoWhile at@
+  | CWhile (CExpression a) (CStatement a) Bool a
+  -- | for statement @CFor init expr-2 expr-3 stmt@, where @init@ is
+  -- either a declaration or initializing expression
+  | CFor (Either (Maybe (CExpression a)) (CDeclaration a))
+    (Maybe (CExpression a))
+    (Maybe (CExpression a))
+    (CStatement a)
+    a
+  -- | goto statement @CGoto label@
+  | CGoto Ident a
+  -- | computed goto @CGotoPtr labelExpr@
+  | CGotoPtr (CExpression a) a
+  -- | continue statement
+  | CCont a
+  -- | break statement
+  | CBreak a
+  -- | return statement @CReturn returnExpr@
+  | CReturn (Maybe (CExpression a)) a
+  -- | assembly statement
+  | CAsm (CAssemblyStatement a) a
+    deriving (Show, Data,Typeable {-! , CNode , Annotated !-})
+
+-- Derived instance relies on fmap2 :(
+instance Functor CStatement where
+        fmap _f (CLabel a1 a2 a3 a4)
+          = CLabel a1 (fmap _f a2) (fmap (fmap _f) a3) (_f a4)
+        fmap _f (CCase a1 a2 a3) = CCase (fmap _f a1) (fmap _f a2) (_f a3)
+        fmap _f (CCases a1 a2 a3 a4)
+          = CCases (fmap _f a1) (fmap _f a2) (fmap _f a3) (_f a4)
+        fmap _f (CDefault a1 a2) = CDefault (fmap _f a1) (_f a2)
+        fmap _f (CExpr a1 a2) = CExpr (fmap (fmap _f) a1) (_f a2)
+        fmap _f (CCompound a1 a2 a3)
+          = CCompound a1 (fmap (fmap _f) a2) (_f a3)
+        fmap _f (CIf a1 a2 a3 a4)
+          = CIf (fmap _f a1) (fmap _f a2) (fmap (fmap _f) a3) (_f a4)
+        fmap _f (CSwitch a1 a2 a3)
+          = CSwitch (fmap _f a1) (fmap _f a2) (_f a3)
+        fmap _f (CWhile a1 a2 a3 a4)
+          = CWhile (fmap _f a1) (fmap _f a2) a3 (_f a4)
+        fmap _f (CFor a1 a2 a3 a4 a5)
+          = CFor (mapEither (fmap (fmap _f)) (fmap _f) a1)
+                 (fmap (fmap _f) a2) (fmap (fmap _f) a3) (fmap _f a4)
+                 (_f a5)
+          where mapEither f1 f2 = either (Left . f1) (Right . f2)
+        fmap _f (CGoto a1 a2) = CGoto a1 (_f a2)
+        fmap _f (CGotoPtr a1 a2) = CGotoPtr (fmap _f a1) (_f a2)
+        fmap _f (CCont a1) = CCont (_f a1)
+        fmap _f (CBreak a1) = CBreak (_f a1)
+        fmap _f (CReturn a1 a2) = CReturn (fmap (fmap _f) a1) (_f a2)
+        fmap _f (CAsm a1 a2) = CAsm (fmap _f a1) (_f a2)
+
+-- | GNU Assembler statement
+--
+-- > CAssemblyStatement type-qual? asm-expr out-ops in-ops clobbers _
+--
+-- is an inline assembler statement.
+-- The only type-qualifier (if any) allowed is /volatile/.
+-- @asm-expr@ is the actual assembler epxression (a string), @out-ops@ and @in-ops@ are the input
+-- and output operands of the statement.
+-- @clobbers@ is a list of registers which are clobbered when executing the assembler statement
+type CAsmStmt = CAssemblyStatement NodeInfo
+data CAssemblyStatement a
+  = CAsmStmt
+    (Maybe (CTypeQualifier a)) -- maybe volatile
+    (CStringLiteral a)         -- assembler expression (String)
+    [CAssemblyOperand a]       -- output operands
+    [CAssemblyOperand a]       -- input operands
+    [CStringLiteral a]         -- Clobbers
+    a
+    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})
+
+-- | Assembler operand
+--
+-- @CAsmOperand argName? constraintExpr arg@ specifies an operand for an assembler
+-- statement.
+type CAsmOperand = CAssemblyOperand NodeInfo
+data CAssemblyOperand a
+  = CAsmOperand
+    (Maybe Ident)       -- argument name
+    (CStringLiteral a)  -- constraint expr
+    (CExpression a)     -- argument
+    a
+    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})
+
+-- | C99 Block items
+--
+--  Things that may appear in compound statements: either statements, declarations
+--   or nested function definitions.
+type CBlockItem = CCompoundBlockItem NodeInfo
+data CCompoundBlockItem a
+  = CBlockStmt    (CStatement a)    -- ^ A statement
+  | CBlockDecl    (CDeclaration a)  -- ^ A local declaration
+  | CNestedFunDef (CFunctionDef a)  -- ^ A nested function (GNU C)
+    deriving (Show, Data,Typeable {-! , CNode , Functor, Annotated !-})
+
+-- | C declaration specifiers and qualifiers
+--
+-- Declaration specifiers include at most one storage-class specifier (C99 6.7.1),
+-- type specifiers (6.7.2) and type qualifiers (6.7.3).
+type CDeclSpec = CDeclarationSpecifier NodeInfo
+data CDeclarationSpecifier a
+  = CStorageSpec (CStorageSpecifier a) -- ^ storage-class specifier or typedef
+  | CTypeSpec    (CTypeSpecifier a)    -- ^ type name
+  | CTypeQual    (CTypeQualifier a)    -- ^ type qualifier
+  | CFunSpec     (CFunctionSpecifier a) -- ^ function specifier
+  | CAlignSpec   (CAlignmentSpecifier a) -- ^ alignment specifier
+    deriving (Show, Data,Typeable {-! ,CNode ,Functor, Annotated !-})
+
+
+-- | Separate the declaration specifiers
+--
+-- @__attribute__@ of a declaration qualify declarations or declarators (but not types),
+-- and are therefore separated as well.
+partitionDeclSpecs :: [CDeclarationSpecifier a]
+                   -> ( [CStorageSpecifier a], [CAttribute a]
+                      , [CTypeQualifier a], [CTypeSpecifier a]
+                      , [CFunctionSpecifier a], [CAlignmentSpecifier a])
+partitionDeclSpecs = foldr deals ([],[],[],[],[],[]) where
+    deals (CStorageSpec sp) (sts,ats,tqs,tss,fss,ass)  = (sp:sts,ats,tqs,tss,fss,ass)
+    deals (CTypeQual (CAttrQual attr)) (sts,ats,tqs,tss,fss,ass)  = (sts,attr:ats,tqs,tss,fss,ass)
+    deals (CTypeQual tq) (sts,ats,tqs,tss,fss,ass)     = (sts,ats,tq:tqs,tss,fss,ass)
+    deals (CTypeSpec ts) (sts,ats,tqs,tss,fss,ass)     = (sts,ats,tqs,ts:tss,fss,ass)
+    deals (CFunSpec fs) (sts,ats,tqs,tss,fss,ass)      = (sts,ats,tqs,tss,fs:fss,ass)
+    deals (CAlignSpec as) (sts,ats,tqs,tss,fss,ass)    = (sts,ats,tqs,tss,fss,as:ass)
+
+-- | C storage class specifier (and typedefs) (K&R A8.1, C99 6.7.1)
+type CStorageSpec = CStorageSpecifier NodeInfo
+data CStorageSpecifier a
+  = CAuto     a     -- ^ auto
+  | CRegister a     -- ^ register
+  | CStatic   a     -- ^ static
+  | CExtern   a     -- ^ extern
+  | CTypedef  a     -- ^ typedef
+  | CThread   a     -- ^ C11/GNUC thread local storage
+    deriving (Show, Eq,Ord,Data,Typeable {-! ,CNode ,Functor ,Annotated !-})
+
+
+-- | C type specifier (K&R A8.2, C99 6.7.2)
+--
+-- Type specifiers are either basic types such as @char@ or @int@,
+-- @struct@, @union@ or @enum@ specifiers or typedef names.
+--
+-- As a GNU extension, a @typeof@ expression also is a type specifier.
+type CTypeSpec = CTypeSpecifier NodeInfo
+data CTypeSpecifier a
+  = CVoidType    a
+  | CCharType    a
+  | CShortType   a
+  | CIntType     a
+  | CLongType    a
+  | CFloatType   a
+  | CFloat128Type a
+  | CDoubleType  a
+  | CSignedType  a
+  | CUnsigType   a
+  | CBoolType    a
+  | CComplexType a
+  | CInt128Type  a
+  | CSUType      (CStructureUnion a) a      -- ^ Struct or Union specifier
+  | CEnumType    (CEnumeration a)    a      -- ^ Enumeration specifier
+  | CTypeDef     Ident        a      -- ^ Typedef name
+  | CTypeOfExpr  (CExpression a)  a  -- ^ @typeof(expr)@
+  | CTypeOfType  (CDeclaration a) a  -- ^ @typeof(type)@
+  | CAtomicType  (CDeclaration a) a  -- ^ @_Atomic(type)@
+    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})
+
+
+-- | returns @True@ if the given typespec is a struct, union or enum /definition/
+isSUEDef :: CTypeSpecifier a -> Bool
+isSUEDef (CSUType (CStruct _ _ (Just _) _ _) _) = True
+isSUEDef (CEnumType (CEnum _ (Just _) _ _) _) = True
+isSUEDef _ = False
+
+-- | C type qualifiers (K&R A8.2, C99 6.7.3) and attributes.
+--
+-- @const@, @volatile@ and @restrict@ type qualifiers
+-- Additionally, @__attribute__@ annotations for declarations and declarators, and
+-- function specifiers
+type CTypeQual = CTypeQualifier NodeInfo
+data CTypeQualifier a
+  = CConstQual a
+  | CVolatQual a
+  | CRestrQual a
+  | CAtomicQual a
+  | CAttrQual  (CAttribute a)
+  | CNullableQual a
+  | CNonnullQual a
+    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})
+
+-- | C function specifiers (C99 6.7.4)
+--
+-- function specifiers @inline@ and @_Noreturn@
+type CFunSpec = CFunctionSpecifier NodeInfo
+data CFunctionSpecifier a
+  = CInlineQual a
+  | CNoreturnQual a
+    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})
+
+-- | C alignment specifiers (C99 6.7.5)
+--
+type CAlignSpec = CAlignmentSpecifier NodeInfo
+data CAlignmentSpecifier a
+  = CAlignAsType (CDeclaration a) a  -- ^ @_Alignas(type)@
+  | CAlignAsExpr (CExpression a) a   -- ^ @_Alignas(expr)@
+    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})
+
+
+-- | C structure or union specifiers (K&R A8.3, C99 6.7.2.1)
+--
+-- @CStruct tag identifier struct-decls c-attrs@ represents a struct or union specifier (depending on @tag@).
+--
+--   * either @identifier@ or the declaration list @struct-decls@ (or both) have to be present.
+--
+--     Example: in @struct foo x;@, the identifier is present, in @struct { int y; } x@ the declaration list, and
+--     in @struct foo { int y; } x;@ both of them.
+--
+--   * @c-attrs@ is a list of @__attribute__@ annotations associated with the struct or union specifier
+type CStructUnion = CStructureUnion NodeInfo
+data CStructureUnion a
+  = CStruct
+    CStructTag
+    (Maybe Ident)
+    (Maybe [CDeclaration a])  -- member declarations
+    [CAttribute a]            -- __attribute__s
+    a
+    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})
+
+
+-- | A tag to determine wheter we refer to a @struct@ or @union@, see 'CStructUnion'.
+data CStructTag = CStructTag
+                | CUnionTag
+                deriving (Show, Eq,Data,Typeable)
+
+
+-- | C enumeration specifier (K&R A8.4, C99 6.7.2.2)
+--
+-- @CEnum identifier enumerator-list attrs@ represent as enum specifier
+--
+--  * Either the identifier or the enumerator-list (or both) have to be present.
+--
+--  * If @enumerator-list@ is present, it has to be non-empty.
+--
+--  * The enumerator list is of the form @(enumeration-constant, enumeration-value?)@, where the latter
+--    is an optional constant integral expression.
+--
+--  * @attrs@ is a list of @__attribute__@ annotations associated with the enumeration specifier
+type CEnum = CEnumeration NodeInfo
+data CEnumeration a
+  = CEnum
+    (Maybe Ident)
+    (Maybe [(Ident,                   -- variant name
+             Maybe (CExpression a))]) -- explicit variant value
+    [CAttribute a]                    -- __attribute__s
+    a
+    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})
+
+
+
+-- | C initialization (K&R A8.7, C99 6.7.8)
+--
+-- Initializers are either assignment expressions or initializer lists
+-- (surrounded in curly braces), whose elements are themselves
+-- initializers, paired with an optional list of designators.
+type CInit = CInitializer NodeInfo
+data CInitializer a
+  -- | assignment expression
+  = CInitExpr (CExpression a) a
+  -- | initialization list (see 'CInitList')
+  | CInitList (CInitializerList a) a
+    deriving (Show, Data,Typeable {-! ,CNode , Annotated !-})
+
+-- deriving Functor does not work (type synonym)
+instance Functor CInitializer where
+        fmap _f (CInitExpr a1 a2) = CInitExpr (fmap _f a1) (_f a2)
+        fmap _f (CInitList a1 a2) = CInitList (fmapInitList _f a1) (_f a2)
+fmapInitList :: (a->b) -> (CInitializerList a) -> (CInitializerList b)
+fmapInitList _f = map (\(desigs, initializer) -> (fmap (fmap _f) desigs, fmap _f initializer))
+
+-- | Initializer List
+--
+-- The members of an initializer list are of the form @(designator-list,initializer)@.
+-- The @designator-list@ specifies one member of the compound type which is initialized.
+-- It is allowed to be empty - in this case the initializer refers to the
+-- ''next'' member of the compound type (see C99 6.7.8).
+--
+-- Examples (simplified expressions and identifiers):
+--
+-- > -- int x[3][4] = { [0][3] = 4, [2] = 5, 8 };
+-- > --   corresponds to the assignments
+-- > -- x[0][3] = 4; x[2][0] = 5; x[2][1] = 8;
+-- > let init1 = ([CArrDesig 0, CArrDesig 3], CInitExpr 4)
+-- >     init2 = ([CArrDesig 2]             , CInitExpr 5)
+-- >     init3 = ([]                        , CInitExpr 8)
+-- > in  CInitList [init1, init2, init3]
+--
+-- > -- struct { struct { int a[2]; int b[2]; int c[2]; } s; } x = { .s = { {2,3} , .c[0] = 1 } };
+-- > --   corresponds to the assignments
+-- > -- x.s.a[0] = 2; x.s.a[1] = 3; x.s.c[0] = 1;
+-- > let init_s_0 = CInitList [ ([], CInitExpr 2), ([], CInitExpr 3)]
+-- >     init_s   = CInitList [
+-- >                            ([], init_s_0),
+-- >                            ([CMemberDesig "c", CArrDesig 0], CInitExpr 1)
+-- >                          ]
+-- > in  CInitList [(CMemberDesig "s", init_s)]
+type CInitList = CInitializerList NodeInfo
+type CInitializerList a = [([CPartDesignator a], CInitializer a)]
+
+-- | Designators
+--
+-- A designator specifies a member of an object, either an element or range of an array,
+-- or the named member of a struct \/ union.
+type CDesignator = CPartDesignator NodeInfo
+data CPartDesignator a
+  -- | array position designator
+  = CArrDesig     (CExpression a) a
+  -- | member designator
+  | CMemberDesig  Ident a
+  -- | array range designator @CRangeDesig from to _@ (GNU C)
+  | CRangeDesig (CExpression a) (CExpression a) a
+    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})
+
+
+-- | @__attribute__@ annotations
+--
+-- Those are of the form @CAttr attribute-name attribute-parameters@,
+-- and serve as generic properties of some syntax tree elements.
+type CAttr = CAttribute NodeInfo
+data CAttribute a = CAttr Ident [CExpression a] a
+                    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})
+
+
+-- | C expression (K&R A7)
+--
+-- * these can be arbitrary expression, as the argument of `sizeof' can be
+--   arbitrary, even if appearing in a constant expression
+--
+-- * GNU C extensions: @alignof@, @__real@, @__imag@, @({ stmt-expr })@, @&& label@ and built-ins
+--
+type CExpr = CExpression NodeInfo
+data CExpression a
+  = CComma       [CExpression a]         -- comma expression list, n >= 2
+                 a
+  | CAssign      CAssignOp               -- assignment operator
+                 (CExpression a)         -- l-value
+                 (CExpression a)         -- r-value
+                 a
+  | CCond        (CExpression a)         -- conditional
+                 (Maybe (CExpression a)) -- true-expression (GNU allows omitting)
+                 (CExpression a)         -- false-expression
+                 a
+  | CBinary      CBinaryOp               -- binary operator
+                 (CExpression a)         -- lhs
+                 (CExpression a)         -- rhs
+                 a
+  | CCast        (CDeclaration a)        -- type name
+                 (CExpression a)
+                 a
+  | CUnary       CUnaryOp                -- unary operator
+                 (CExpression a)
+                 a
+  | CSizeofExpr  (CExpression a)
+                 a
+  | CSizeofType  (CDeclaration a)        -- type name
+                 a
+  | CAlignofExpr (CExpression a)
+                 a
+  | CAlignofType (CDeclaration a)        -- type name
+                 a
+  | CComplexReal (CExpression a)         -- real part of complex number
+                 a
+  | CComplexImag (CExpression a)         -- imaginary part of complex number
+                 a
+  | CIndex       (CExpression a)         -- array
+                 (CExpression a)         -- index
+                 a
+  | CCall        (CExpression a)         -- function
+                 [CExpression a]         -- arguments
+                 a
+  | CMember      (CExpression a)         -- structure
+                 Ident                   -- member name
+                 Bool                    -- deref structure? (True for `->')
+                 a
+  | CVar         Ident                   -- identifier (incl. enumeration const)
+                 a
+  | CConst       (CConstant a)           -- ^ integer, character, floating point and string constants
+  | CCompoundLit (CDeclaration a)
+                 (CInitializerList a)    -- type name & initialiser list
+                 a                       -- ^ C99 compound literal
+  | CGenericSelection (CExpression a) [(Maybe (CDeclaration a), CExpression a)] a -- ^ C11 generic selection
+  | CStatExpr    (CStatement a) a        -- ^ GNU C compound statement as expr
+  | CLabAddrExpr Ident a                 -- ^ GNU C address of label
+  | CBuiltinExpr (CBuiltinThing a)       -- ^ builtin expressions, see 'CBuiltin'
+    deriving (Data,Typeable,Show {-! ,CNode , Annotated !-})
+
+-- deriving Functor does not work (type synonyms)
+instance Functor CExpression where
+        fmap _f (CComma a1 a2) = CComma (fmap (fmap _f) a1) (_f a2)
+        fmap _f (CAssign a1 a2 a3 a4)
+          = CAssign a1 (fmap _f a2) (fmap _f a3) (_f a4)
+        fmap _f (CCond a1 a2 a3 a4)
+          = CCond (fmap _f a1) (fmap (fmap _f) a2) (fmap _f a3) (_f a4)
+        fmap _f (CBinary a1 a2 a3 a4)
+          = CBinary a1 (fmap _f a2) (fmap _f a3) (_f a4)
+        fmap _f (CCast a1 a2 a3) = CCast (fmap _f a1) (fmap _f a2) (_f a3)
+        fmap _f (CUnary a1 a2 a3) = CUnary a1 (fmap _f a2) (_f a3)
+        fmap _f (CSizeofExpr a1 a2) = CSizeofExpr (fmap _f a1) (_f a2)
+        fmap _f (CSizeofType a1 a2) = CSizeofType (fmap _f a1) (_f a2)
+        fmap _f (CAlignofExpr a1 a2) = CAlignofExpr (fmap _f a1) (_f a2)
+        fmap _f (CAlignofType a1 a2) = CAlignofType (fmap _f a1) (_f a2)
+        fmap _f (CComplexReal a1 a2) = CComplexReal (fmap _f a1) (_f a2)
+        fmap _f (CComplexImag a1 a2) = CComplexImag (fmap _f a1) (_f a2)
+        fmap _f (CIndex a1 a2 a3)
+          = CIndex (fmap _f a1) (fmap _f a2) (_f a3)
+        fmap _f (CCall a1 a2 a3)
+          = CCall (fmap _f a1) (fmap (fmap _f) a2) (_f a3)
+        fmap _f (CMember a1 a2 a3 a4) = CMember (fmap _f a1) a2 a3 (_f a4)
+        fmap _f (CVar a1 a2) = CVar a1 (_f a2)
+        fmap _f (CConst a1) = CConst (fmap _f a1)
+        fmap _f (CCompoundLit a1 a2 a3)
+          = CCompoundLit (fmap _f a1) (fmapInitList _f a2) (_f a3)
+        fmap _f (CStatExpr a1 a2) = CStatExpr (fmap _f a1) (_f a2)
+        fmap _f (CLabAddrExpr a1 a2) = CLabAddrExpr a1 (_f a2)
+        fmap _f (CBuiltinExpr a1) = CBuiltinExpr (fmap _f a1)
+        fmap _f (CGenericSelection expr list annot) =
+          CGenericSelection (fmap _f expr) (map fmap_helper list) (_f annot)
+          where
+            fmap_helper (ma1, a2) = (fmap (fmap _f) ma1, fmap _f a2)
+
+-- | GNU Builtins, which cannot be typed in C99
+type CBuiltin = CBuiltinThing NodeInfo
+data CBuiltinThing a
+  = CBuiltinVaArg (CExpression a) (CDeclaration a) a            -- ^ @(expr, type)@
+  | CBuiltinOffsetOf (CDeclaration a) [CPartDesignator a] a -- ^ @(type, designator-list)@
+  | CBuiltinTypesCompatible (CDeclaration a) (CDeclaration a) a  -- ^ @(type,type)@
+  | CBuiltinConvertVector (CExpression a) (CDeclaration a) a -- ^ @(expr, type)@
+    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})
+
+
+-- | C constant (K&R A2.5 & A7.2)
+type CConst = CConstant NodeInfo
+data CConstant a
+  = CIntConst   CInteger a
+  | CCharConst  CChar a
+  | CFloatConst CFloat a
+  | CStrConst   CString a
+    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})
+
+
+-- | Attributed string literals
+type CStrLit = CStringLiteral NodeInfo
+data CStringLiteral a = CStrLit CString a
+            deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})
+
+
+cstringOfLit :: CStringLiteral a -> CString
+cstringOfLit (CStrLit cstr _) = cstr
+
+-- | Lift a string literal to a C constant
+liftStrLit :: CStringLiteral a -> CConstant a
+liftStrLit (CStrLit str at) = CStrConst str at
+
+-- | All AST nodes are annotated. Inspired by the Annotated
+-- class of Niklas Broberg's haskell-src-exts package.
+-- In principle, we could have Copointed superclass instead
+-- of @ann@, for the price of another dependency.
+class (Functor ast) => Annotated ast where
+  -- | get the annotation of an AST node
+  annotation :: ast a -> a
+  -- | change the annotation (non-recursively)
+  --   of an AST node. Use fmap for recursively
+  --   modifying the annotation.
+  amap  :: (a->a) -> ast a -> ast a
+
+-- fmap2 :: (a->a') -> (a,b) -> (a',b)
+-- fmap2 f (a,b) = (f a, b)
+
+-- Instances generated using derive-2.*
+-- GENERATED START
+
+instance CNode t1 => CNode (CTranslationUnit t1) where
+        nodeInfo (CTranslUnit _ n) = nodeInfo n
+instance CNode t1 => Pos (CTranslationUnit t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CTranslationUnit where
+        fmap _f (CTranslUnit a1 a2)
+          = CTranslUnit (fmap (fmap _f) a1) (_f a2)
+
+instance Annotated CTranslationUnit where
+        annotation (CTranslUnit _ n) = n
+        amap f (CTranslUnit a_1 a_2) = CTranslUnit a_1 (f a_2)
+
+instance CNode t1 => CNode (CExternalDeclaration t1) where
+        nodeInfo (CDeclExt d) = nodeInfo d
+        nodeInfo (CFDefExt d) = nodeInfo d
+        nodeInfo (CAsmExt _ n) = nodeInfo n
+instance CNode t1 => Pos (CExternalDeclaration t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CExternalDeclaration where
+        fmap _f (CDeclExt a1) = CDeclExt (fmap _f a1)
+        fmap _f (CFDefExt a1) = CFDefExt (fmap _f a1)
+        fmap _f (CAsmExt a1 a2) = CAsmExt (fmap _f a1) (_f a2)
+
+instance Annotated CExternalDeclaration where
+        annotation (CDeclExt n) = annotation n
+        annotation (CFDefExt n) = annotation n
+        annotation (CAsmExt _ n) = n
+        amap f (CDeclExt n) = CDeclExt (amap f n)
+        amap f (CFDefExt n) = CFDefExt (amap f n)
+        amap f (CAsmExt a_1 a_2) = CAsmExt a_1 (f a_2)
+
+instance CNode t1 => CNode (CFunctionDef t1) where
+        nodeInfo (CFunDef _ _ _ _ n) = nodeInfo n
+instance CNode t1 => Pos (CFunctionDef t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CFunctionDef where
+        fmap _f (CFunDef a1 a2 a3 a4 a5)
+          = CFunDef (fmap (fmap _f) a1) (fmap _f a2) (fmap (fmap _f) a3)
+              (fmap _f a4)
+              (_f a5)
+
+instance Annotated CFunctionDef where
+        annotation (CFunDef _ _ _ _ n) = n
+        amap f (CFunDef a_1 a_2 a_3 a_4 a_5)
+          = CFunDef a_1 a_2 a_3 a_4 (f a_5)
+
+instance CNode t1 => CNode (CDeclaration t1) where
+        nodeInfo (CDecl _ _ n) = nodeInfo n
+        nodeInfo (CStaticAssert _ _ n) = nodeInfo n
+instance CNode t1 => Pos (CDeclaration t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Annotated CDeclaration where
+        annotation (CDecl _ _ n) = n
+        annotation (CStaticAssert _ _ n) = n
+        amap f (CDecl a_1 a_2 a_3) = CDecl a_1 a_2 (f a_3)
+        amap f (CStaticAssert a_1 a_2 a_3) = CStaticAssert a_1 a_2 (f a_3)
+
+instance CNode t1 => CNode (CDeclarator t1) where
+        nodeInfo (CDeclr _ _ _ _ n) = nodeInfo n
+instance CNode t1 => Pos (CDeclarator t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CDeclarator where
+        fmap _f (CDeclr a1 a2 a3 a4 a5)
+          = CDeclr a1 (fmap (fmap _f) a2) (fmap (fmap _f) a3)
+              (fmap (fmap _f) a4)
+              (_f a5)
+
+instance Annotated CDeclarator where
+        annotation (CDeclr _ _ _ _ n) = n
+        amap f (CDeclr a_1 a_2 a_3 a_4 a_5)
+          = CDeclr a_1 a_2 a_3 a_4 (f a_5)
+
+instance CNode t1 => CNode (CDerivedDeclarator t1) where
+        nodeInfo (CPtrDeclr _ n) = nodeInfo n
+        nodeInfo (CArrDeclr _ _ n) = nodeInfo n
+        nodeInfo (CFunDeclr _ _ n) = nodeInfo n
+instance CNode t1 => Pos (CDerivedDeclarator t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Annotated CDerivedDeclarator where
+        annotation (CPtrDeclr _ n) = n
+        annotation (CArrDeclr _ _ n) = n
+        annotation (CFunDeclr _ _ n) = n
+        amap f (CPtrDeclr a_1 a_2) = CPtrDeclr a_1 (f a_2)
+        amap f (CArrDeclr a_1 a_2 a_3) = CArrDeclr a_1 a_2 (f a_3)
+        amap f (CFunDeclr a_1 a_2 a_3) = CFunDeclr a_1 a_2 (f a_3)
+
+instance Functor CArraySize where
+        fmap _ (CNoArrSize a1) = CNoArrSize a1
+        fmap _f (CArrSize a1 a2) = CArrSize a1 (fmap _f a2)
+
+instance CNode t1 => CNode (CStatement t1) where
+        nodeInfo (CLabel _ _ _ n) = nodeInfo n
+        nodeInfo (CCase _ _ n) = nodeInfo n
+        nodeInfo (CCases _ _ _ n) = nodeInfo n
+        nodeInfo (CDefault _ n) = nodeInfo n
+        nodeInfo (CExpr _ n) = nodeInfo n
+        nodeInfo (CCompound _ _ n) = nodeInfo n
+        nodeInfo (CIf _ _ _ n) = nodeInfo n
+        nodeInfo (CSwitch _ _ n) = nodeInfo n
+        nodeInfo (CWhile _ _ _ n) = nodeInfo n
+        nodeInfo (CFor _ _ _ _ n) = nodeInfo n
+        nodeInfo (CGoto _ n) = nodeInfo n
+        nodeInfo (CGotoPtr _ n) = nodeInfo n
+        nodeInfo (CCont d) = nodeInfo d
+        nodeInfo (CBreak d) = nodeInfo d
+        nodeInfo (CReturn _ n) = nodeInfo n
+        nodeInfo (CAsm _ n) = nodeInfo n
+instance CNode t1 => Pos (CStatement t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Annotated CStatement where
+        annotation (CLabel _ _ _ n) = n
+        annotation (CCase _ _ n) = n
+        annotation (CCases _ _ _ n) = n
+        annotation (CDefault _ n) = n
+        annotation (CExpr _ n) = n
+        annotation (CCompound _ _ n) = n
+        annotation (CIf _ _ _ n) = n
+        annotation (CSwitch _ _ n) = n
+        annotation (CWhile _ _ _ n) = n
+        annotation (CFor _ _ _ _ n) = n
+        annotation (CGoto _ n) = n
+        annotation (CGotoPtr _ n) = n
+        annotation (CCont n) = n
+        annotation (CBreak n) = n
+        annotation (CReturn _ n) = n
+        annotation (CAsm _ n) = n
+        amap f (CLabel a_1 a_2 a_3 a_4) = CLabel a_1 a_2 a_3 (f a_4)
+        amap f (CCase a_1 a_2 a_3) = CCase a_1 a_2 (f a_3)
+        amap f (CCases a_1 a_2 a_3 a_4) = CCases a_1 a_2 a_3 (f a_4)
+        amap f (CDefault a_1 a_2) = CDefault a_1 (f a_2)
+        amap f (CExpr a_1 a_2) = CExpr a_1 (f a_2)
+        amap f (CCompound a_1 a_2 a_3) = CCompound a_1 a_2 (f a_3)
+        amap f (CIf a_1 a_2 a_3 a_4) = CIf a_1 a_2 a_3 (f a_4)
+        amap f (CSwitch a_1 a_2 a_3) = CSwitch a_1 a_2 (f a_3)
+        amap f (CWhile a_1 a_2 a_3 a_4) = CWhile a_1 a_2 a_3 (f a_4)
+        amap f (CFor a_1 a_2 a_3 a_4 a_5) = CFor a_1 a_2 a_3 a_4 (f a_5)
+        amap f (CGoto a_1 a_2) = CGoto a_1 (f a_2)
+        amap f (CGotoPtr a_1 a_2) = CGotoPtr a_1 (f a_2)
+        amap f (CCont a_1) = CCont (f a_1)
+        amap f (CBreak a_1) = CBreak (f a_1)
+        amap f (CReturn a_1 a_2) = CReturn a_1 (f a_2)
+        amap f (CAsm a_1 a_2) = CAsm a_1 (f a_2)
+
+instance CNode t1 => CNode (CAssemblyStatement t1) where
+        nodeInfo (CAsmStmt _ _ _ _ _ n) = nodeInfo n
+instance CNode t1 => Pos (CAssemblyStatement t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CAssemblyStatement where
+        fmap _f (CAsmStmt a1 a2 a3 a4 a5 a6)
+          = CAsmStmt (fmap (fmap _f) a1) (fmap _f a2) (fmap (fmap _f) a3)
+              (fmap (fmap _f) a4)
+              (fmap (fmap _f) a5)
+              (_f a6)
+
+instance Annotated CAssemblyStatement where
+        annotation (CAsmStmt _ _ _ _ _ n) = n
+        amap f (CAsmStmt a_1 a_2 a_3 a_4 a_5 a_6)
+          = CAsmStmt a_1 a_2 a_3 a_4 a_5 (f a_6)
+
+instance CNode t1 => CNode (CAssemblyOperand t1) where
+        nodeInfo (CAsmOperand _ _ _ n) = nodeInfo n
+instance CNode t1 => Pos (CAssemblyOperand t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CAssemblyOperand where
+        fmap _f (CAsmOperand a1 a2 a3 a4)
+          = CAsmOperand a1 (fmap _f a2) (fmap _f a3) (_f a4)
+
+instance Annotated CAssemblyOperand where
+        annotation (CAsmOperand _ _ _ n) = n
+        amap f (CAsmOperand a_1 a_2 a_3 a_4)
+          = CAsmOperand a_1 a_2 a_3 (f a_4)
+
+instance CNode t1 => CNode (CCompoundBlockItem t1) where
+        nodeInfo (CBlockStmt d) = nodeInfo d
+        nodeInfo (CBlockDecl d) = nodeInfo d
+        nodeInfo (CNestedFunDef d) = nodeInfo d
+instance CNode t1 => Pos (CCompoundBlockItem t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CCompoundBlockItem where
+        fmap _f (CBlockStmt a1) = CBlockStmt (fmap _f a1)
+        fmap _f (CBlockDecl a1) = CBlockDecl (fmap _f a1)
+        fmap _f (CNestedFunDef a1) = CNestedFunDef (fmap _f a1)
+
+instance Annotated CCompoundBlockItem where
+        annotation (CBlockStmt n) = annotation n
+        annotation (CBlockDecl n) = annotation n
+        annotation (CNestedFunDef n) = annotation n
+        amap f (CBlockStmt n) = CBlockStmt (amap f n)
+        amap f (CBlockDecl n) = CBlockDecl (amap f n)
+        amap f (CNestedFunDef n) = CNestedFunDef (amap f n)
+
+instance CNode t1 => CNode (CDeclarationSpecifier t1) where
+        nodeInfo (CStorageSpec d) = nodeInfo d
+        nodeInfo (CTypeSpec d) = nodeInfo d
+        nodeInfo (CTypeQual d) = nodeInfo d
+        nodeInfo (CFunSpec d) = nodeInfo d
+        nodeInfo (CAlignSpec d) = nodeInfo d
+instance CNode t1 => Pos (CDeclarationSpecifier t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CDeclarationSpecifier where
+        fmap _f (CStorageSpec a1) = CStorageSpec (fmap _f a1)
+        fmap _f (CTypeSpec a1) = CTypeSpec (fmap _f a1)
+        fmap _f (CTypeQual a1) = CTypeQual (fmap _f a1)
+        fmap _f (CFunSpec a1) = CFunSpec (fmap _f a1)
+        fmap _f (CAlignSpec a1) = CAlignSpec (fmap _f a1)
+
+instance Annotated CDeclarationSpecifier where
+        annotation (CStorageSpec n) = annotation n
+        annotation (CTypeSpec n) = annotation n
+        annotation (CTypeQual n) = annotation n
+        annotation (CFunSpec n) = annotation n
+        annotation (CAlignSpec n) = annotation n
+        amap f (CStorageSpec n) = CStorageSpec (amap f n)
+        amap f (CTypeSpec n) = CTypeSpec (amap f n)
+        amap f (CTypeQual n) = CTypeQual (amap f n)
+        amap f (CFunSpec n) = CFunSpec (amap f n)
+        amap f (CAlignSpec n) = CAlignSpec (amap f n)
+
+instance CNode t1 => CNode (CStorageSpecifier t1) where
+        nodeInfo (CAuto d) = nodeInfo d
+        nodeInfo (CRegister d) = nodeInfo d
+        nodeInfo (CStatic d) = nodeInfo d
+        nodeInfo (CExtern d) = nodeInfo d
+        nodeInfo (CTypedef d) = nodeInfo d
+        nodeInfo (CThread d) = nodeInfo d
+instance CNode t1 => Pos (CStorageSpecifier t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CStorageSpecifier where
+        fmap _f (CAuto a1) = CAuto (_f a1)
+        fmap _f (CRegister a1) = CRegister (_f a1)
+        fmap _f (CStatic a1) = CStatic (_f a1)
+        fmap _f (CExtern a1) = CExtern (_f a1)
+        fmap _f (CTypedef a1) = CTypedef (_f a1)
+        fmap _f (CThread a1) = CThread (_f a1)
+
+instance Annotated CStorageSpecifier where
+        annotation (CAuto n) = n
+        annotation (CRegister n) = n
+        annotation (CStatic n) = n
+        annotation (CExtern n) = n
+        annotation (CTypedef n) = n
+        annotation (CThread n) = n
+        amap f (CAuto a_1) = CAuto (f a_1)
+        amap f (CRegister a_1) = CRegister (f a_1)
+        amap f (CStatic a_1) = CStatic (f a_1)
+        amap f (CExtern a_1) = CExtern (f a_1)
+        amap f (CTypedef a_1) = CTypedef (f a_1)
+        amap f (CThread a_1) = CThread (f a_1)
+
+instance CNode t1 => CNode (CTypeSpecifier t1) where
+        nodeInfo (CVoidType d) = nodeInfo d
+        nodeInfo (CCharType d) = nodeInfo d
+        nodeInfo (CShortType d) = nodeInfo d
+        nodeInfo (CIntType d) = nodeInfo d
+        nodeInfo (CLongType d) = nodeInfo d
+        nodeInfo (CFloatType d) = nodeInfo d
+        nodeInfo (CFloat128Type d) = nodeInfo d
+        nodeInfo (CDoubleType d) = nodeInfo d
+        nodeInfo (CSignedType d) = nodeInfo d
+        nodeInfo (CUnsigType d) = nodeInfo d
+        nodeInfo (CBoolType d) = nodeInfo d
+        nodeInfo (CComplexType d) = nodeInfo d
+        nodeInfo (CInt128Type d) = nodeInfo d
+        nodeInfo (CSUType _ n) = nodeInfo n
+        nodeInfo (CEnumType _ n) = nodeInfo n
+        nodeInfo (CTypeDef _ n) = nodeInfo n
+        nodeInfo (CTypeOfExpr _ n) = nodeInfo n
+        nodeInfo (CTypeOfType _ n) = nodeInfo n
+        nodeInfo (CAtomicType _ n) = nodeInfo n
+instance CNode t1 => Pos (CTypeSpecifier t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CTypeSpecifier where
+        fmap _f (CVoidType a1) = CVoidType (_f a1)
+        fmap _f (CCharType a1) = CCharType (_f a1)
+        fmap _f (CShortType a1) = CShortType (_f a1)
+        fmap _f (CIntType a1) = CIntType (_f a1)
+        fmap _f (CLongType a1) = CLongType (_f a1)
+        fmap _f (CFloatType a1) = CFloatType (_f a1)
+        fmap _f (CFloat128Type a1) = CFloat128Type (_f a1)
+        fmap _f (CDoubleType a1) = CDoubleType (_f a1)
+        fmap _f (CSignedType a1) = CSignedType (_f a1)
+        fmap _f (CUnsigType a1) = CUnsigType (_f a1)
+        fmap _f (CBoolType a1) = CBoolType (_f a1)
+        fmap _f (CComplexType a1) = CComplexType (_f a1)
+        fmap _f (CInt128Type a1) = CInt128Type (_f a1)
+        fmap _f (CSUType a1 a2) = CSUType (fmap _f a1) (_f a2)
+        fmap _f (CEnumType a1 a2) = CEnumType (fmap _f a1) (_f a2)
+        fmap _f (CTypeDef a1 a2) = CTypeDef a1 (_f a2)
+        fmap _f (CTypeOfExpr a1 a2) = CTypeOfExpr (fmap _f a1) (_f a2)
+        fmap _f (CTypeOfType a1 a2) = CTypeOfType (fmap _f a1) (_f a2)
+        fmap _f (CAtomicType a1 a2) = CAtomicType (fmap _f a1) (_f a2)
+
+instance Annotated CTypeSpecifier where
+        annotation (CVoidType n) = n
+        annotation (CCharType n) = n
+        annotation (CShortType n) = n
+        annotation (CIntType n) = n
+        annotation (CLongType n) = n
+        annotation (CFloatType n) = n
+        annotation (CFloat128Type n) = n
+        annotation (CDoubleType n) = n
+        annotation (CSignedType n) = n
+        annotation (CUnsigType n) = n
+        annotation (CBoolType n) = n
+        annotation (CComplexType n) = n
+        annotation (CInt128Type n) = n
+        annotation (CSUType _ n) = n
+        annotation (CEnumType _ n) = n
+        annotation (CTypeDef _ n) = n
+        annotation (CTypeOfExpr _ n) = n
+        annotation (CTypeOfType _ n) = n
+        annotation (CAtomicType _ n) = n
+        amap f (CVoidType a_1) = CVoidType (f a_1)
+        amap f (CCharType a_1) = CCharType (f a_1)
+        amap f (CShortType a_1) = CShortType (f a_1)
+        amap f (CIntType a_1) = CIntType (f a_1)
+        amap f (CLongType a_1) = CLongType (f a_1)
+        amap f (CFloatType a_1) = CFloatType (f a_1)
+        amap f (CFloat128Type a_1) = CFloat128Type (f a_1)
+        amap f (CDoubleType a_1) = CDoubleType (f a_1)
+        amap f (CSignedType a_1) = CSignedType (f a_1)
+        amap f (CUnsigType a_1) = CUnsigType (f a_1)
+        amap f (CBoolType a_1) = CBoolType (f a_1)
+        amap f (CComplexType a_1) = CComplexType (f a_1)
+        amap f (CInt128Type a_1) = CInt128Type (f a_1)
+        amap f (CSUType a_1 a_2) = CSUType a_1 (f a_2)
+        amap f (CEnumType a_1 a_2) = CEnumType a_1 (f a_2)
+        amap f (CTypeDef a_1 a_2) = CTypeDef a_1 (f a_2)
+        amap f (CTypeOfExpr a_1 a_2) = CTypeOfExpr a_1 (f a_2)
+        amap f (CTypeOfType a_1 a_2) = CTypeOfType a_1 (f a_2)
+        amap f (CAtomicType a_1 a_2) = CAtomicType a_1 (f a_2)
+
+instance CNode t1 => CNode (CTypeQualifier t1) where
+        nodeInfo (CConstQual d) = nodeInfo d
+        nodeInfo (CVolatQual d) = nodeInfo d
+        nodeInfo (CRestrQual d) = nodeInfo d
+        nodeInfo (CAtomicQual d) = nodeInfo d
+        nodeInfo (CAttrQual d) = nodeInfo d
+        nodeInfo (CNullableQual d) = nodeInfo d
+        nodeInfo (CNonnullQual d) = nodeInfo d
+
+instance CNode t1 => Pos (CTypeQualifier t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CTypeQualifier where
+        fmap _f (CConstQual a1) = CConstQual (_f a1)
+        fmap _f (CVolatQual a1) = CVolatQual (_f a1)
+        fmap _f (CRestrQual a1) = CRestrQual (_f a1)
+        fmap _f (CAtomicQual a1) = CAtomicQual (_f a1)
+        fmap _f (CAttrQual a1) = CAttrQual (fmap _f a1)
+        fmap _f (CNullableQual a1) = CNullableQual (_f a1)
+        fmap _f (CNonnullQual a1) = CNonnullQual (_f a1)
+
+instance Annotated CTypeQualifier where
+        annotation (CConstQual n) = n
+        annotation (CVolatQual n) = n
+        annotation (CRestrQual n) = n
+        annotation (CAtomicQual n) = n
+        annotation (CAttrQual n) = annotation n
+        annotation (CNullableQual n) = n
+        annotation (CNonnullQual n) = n
+        amap f (CConstQual a_1) = CConstQual (f a_1)
+        amap f (CVolatQual a_1) = CVolatQual (f a_1)
+        amap f (CRestrQual a_1) = CRestrQual (f a_1)
+        amap f (CAtomicQual a_1) = CAtomicQual (f a_1)
+        amap f (CAttrQual n) = CAttrQual (amap f n)
+        amap f (CNullableQual a_1) = CNullableQual (f a_1)
+        amap f (CNonnullQual a_1) = CNonnullQual (f a_1)
+
+instance CNode t1 => CNode (CFunctionSpecifier t1) where
+        nodeInfo (CInlineQual d) = nodeInfo d
+        nodeInfo (CNoreturnQual d) = nodeInfo d
+instance CNode t1 => Pos (CFunctionSpecifier t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CFunctionSpecifier where
+        fmap _f (CInlineQual a1) = CInlineQual (_f a1)
+        fmap _f (CNoreturnQual a1) = CNoreturnQual (_f a1)
+
+instance Annotated CFunctionSpecifier where
+        annotation (CInlineQual n) = n
+        annotation (CNoreturnQual n) = n
+        amap f (CInlineQual a_1) = CInlineQual (f a_1)
+        amap f (CNoreturnQual a_1) = CNoreturnQual (f a_1)
+
+instance CNode t1 => CNode (CAlignmentSpecifier t1) where
+        nodeInfo (CAlignAsType _ n) = nodeInfo n
+        nodeInfo (CAlignAsExpr _ n) = nodeInfo n
+instance CNode t1 => Pos (CAlignmentSpecifier t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CAlignmentSpecifier where
+        fmap _f (CAlignAsType a1 a2) = CAlignAsType (fmap _f a1) (_f a2)
+        fmap _f (CAlignAsExpr a1 a2) = CAlignAsExpr (fmap _f a1) (_f a2)
+
+instance Annotated CAlignmentSpecifier where
+        annotation (CAlignAsType _ n) = n
+        annotation (CAlignAsExpr _ n) = n
+        amap f (CAlignAsType a_1 a_2) = CAlignAsType a_1 (f a_2)
+        amap f (CAlignAsExpr a_1 a_2) = CAlignAsExpr a_1 (f a_2)
+
+instance CNode t1 => CNode (CStructureUnion t1) where
+        nodeInfo (CStruct _ _ _ _ n) = nodeInfo n
+instance CNode t1 => Pos (CStructureUnion t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CStructureUnion where
+        fmap _f (CStruct a1 a2 a3 a4 a5)
+          = CStruct a1 a2 (fmap (fmap (fmap _f)) a3) (fmap (fmap _f) a4)
+              (_f a5)
+
+instance Annotated CStructureUnion where
+        annotation (CStruct _ _ _ _ n) = n
+        amap f (CStruct a_1 a_2 a_3 a_4 a_5)
+          = CStruct a_1 a_2 a_3 a_4 (f a_5)
+
+instance CNode t1 => CNode (CEnumeration t1) where
+        nodeInfo (CEnum _ _ _ n) = nodeInfo n
+instance CNode t1 => Pos (CEnumeration t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CEnumeration where
+        fmap _f (CEnum a1 a2 a3 a4)
+          = CEnum a1 (fmap (fmap (fmap (fmap (fmap _f)))) a2)
+              (fmap (fmap _f) a3)
+              (_f a4)
+
+instance Annotated CEnumeration where
+        annotation (CEnum _ _ _ n) = n
+        amap f (CEnum a_1 a_2 a_3 a_4) = CEnum a_1 a_2 a_3 (f a_4)
+
+instance CNode t1 => CNode (CInitializer t1) where
+        nodeInfo (CInitExpr _ n) = nodeInfo n
+        nodeInfo (CInitList _ n) = nodeInfo n
+instance CNode t1 => Pos (CInitializer t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Annotated CInitializer where
+        annotation (CInitExpr _ n) = n
+        annotation (CInitList _ n) = n
+        amap f (CInitExpr a_1 a_2) = CInitExpr a_1 (f a_2)
+        amap f (CInitList a_1 a_2) = CInitList a_1 (f a_2)
+
+instance CNode t1 => CNode (CPartDesignator t1) where
+        nodeInfo (CArrDesig _ n) = nodeInfo n
+        nodeInfo (CMemberDesig _ n) = nodeInfo n
+        nodeInfo (CRangeDesig _ _ n) = nodeInfo n
+instance CNode t1 => Pos (CPartDesignator t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CPartDesignator where
+        fmap _f (CArrDesig a1 a2) = CArrDesig (fmap _f a1) (_f a2)
+        fmap _f (CMemberDesig a1 a2) = CMemberDesig a1 (_f a2)
+        fmap _f (CRangeDesig a1 a2 a3)
+          = CRangeDesig (fmap _f a1) (fmap _f a2) (_f a3)
+
+instance Annotated CPartDesignator where
+        annotation (CArrDesig _ n) = n
+        annotation (CMemberDesig _ n) = n
+        annotation (CRangeDesig _ _ n) = n
+        amap f (CArrDesig a_1 a_2) = CArrDesig a_1 (f a_2)
+        amap f (CMemberDesig a_1 a_2) = CMemberDesig a_1 (f a_2)
+        amap f (CRangeDesig a_1 a_2 a_3) = CRangeDesig a_1 a_2 (f a_3)
+
+instance CNode t1 => CNode (CAttribute t1) where
+        nodeInfo (CAttr _ _ n) = nodeInfo n
+instance CNode t1 => Pos (CAttribute t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CAttribute where
+        fmap _f (CAttr a1 a2 a3) = CAttr a1 (fmap (fmap _f) a2) (_f a3)
+
+instance Annotated CAttribute where
+        annotation (CAttr _ _ n) = n
+        amap f (CAttr a_1 a_2 a_3) = CAttr a_1 a_2 (f a_3)
+
+instance CNode t1 => CNode (CExpression t1) where
+        nodeInfo (CComma _ n) = nodeInfo n
+        nodeInfo (CAssign _ _ _ n) = nodeInfo n
+        nodeInfo (CCond _ _ _ n) = nodeInfo n
+        nodeInfo (CBinary _ _ _ n) = nodeInfo n
+        nodeInfo (CCast _ _ n) = nodeInfo n
+        nodeInfo (CUnary _ _ n) = nodeInfo n
+        nodeInfo (CSizeofExpr _ n) = nodeInfo n
+        nodeInfo (CSizeofType _ n) = nodeInfo n
+        nodeInfo (CAlignofExpr _ n) = nodeInfo n
+        nodeInfo (CAlignofType _ n) = nodeInfo n
+        nodeInfo (CComplexReal _ n) = nodeInfo n
+        nodeInfo (CComplexImag _ n) = nodeInfo n
+        nodeInfo (CIndex _ _ n) = nodeInfo n
+        nodeInfo (CCall _ _ n) = nodeInfo n
+        nodeInfo (CMember _ _ _ n) = nodeInfo n
+        nodeInfo (CVar _ n) = nodeInfo n
+        nodeInfo (CConst d) = nodeInfo d
+        nodeInfo (CCompoundLit _ _ n) = nodeInfo n
+        nodeInfo (CGenericSelection _ _ n) = nodeInfo n
+        nodeInfo (CStatExpr _ n) = nodeInfo n
+        nodeInfo (CLabAddrExpr _ n) = nodeInfo n
+        nodeInfo (CBuiltinExpr d) = nodeInfo d
+instance CNode t1 => Pos (CExpression t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Annotated CExpression where
+        annotation (CComma _ n) = n
+        annotation (CAssign _ _ _ n) = n
+        annotation (CCond _ _ _ n) = n
+        annotation (CBinary _ _ _ n) = n
+        annotation (CCast _ _ n) = n
+        annotation (CUnary _ _ n) = n
+        annotation (CSizeofExpr _ n) = n
+        annotation (CSizeofType _ n) = n
+        annotation (CAlignofExpr _ n) = n
+        annotation (CAlignofType _ n) = n
+        annotation (CComplexReal _ n) = n
+        annotation (CComplexImag _ n) = n
+        annotation (CIndex _ _ n) = n
+        annotation (CCall _ _ n) = n
+        annotation (CMember _ _ _ n) = n
+        annotation (CVar _ n) = n
+        annotation (CConst n) = annotation n
+        annotation (CCompoundLit _ _ n) = n
+        annotation (CGenericSelection _ _ n) = n
+        annotation (CStatExpr _ n) = n
+        annotation (CLabAddrExpr _ n) = n
+        annotation (CBuiltinExpr n) = annotation n
+        amap f (CComma a_1 a_2) = CComma a_1 (f a_2)
+        amap f (CAssign a_1 a_2 a_3 a_4) = CAssign a_1 a_2 a_3 (f a_4)
+        amap f (CCond a_1 a_2 a_3 a_4) = CCond a_1 a_2 a_3 (f a_4)
+        amap f (CBinary a_1 a_2 a_3 a_4) = CBinary a_1 a_2 a_3 (f a_4)
+        amap f (CCast a_1 a_2 a_3) = CCast a_1 a_2 (f a_3)
+        amap f (CUnary a_1 a_2 a_3) = CUnary a_1 a_2 (f a_3)
+        amap f (CSizeofExpr a_1 a_2) = CSizeofExpr a_1 (f a_2)
+        amap f (CSizeofType a_1 a_2) = CSizeofType a_1 (f a_2)
+        amap f (CAlignofExpr a_1 a_2) = CAlignofExpr a_1 (f a_2)
+        amap f (CAlignofType a_1 a_2) = CAlignofType a_1 (f a_2)
+        amap f (CComplexReal a_1 a_2) = CComplexReal a_1 (f a_2)
+        amap f (CComplexImag a_1 a_2) = CComplexImag a_1 (f a_2)
+        amap f (CIndex a_1 a_2 a_3) = CIndex a_1 a_2 (f a_3)
+        amap f (CCall a_1 a_2 a_3) = CCall a_1 a_2 (f a_3)
+        amap f (CMember a_1 a_2 a_3 a_4) = CMember a_1 a_2 a_3 (f a_4)
+        amap f (CVar a_1 a_2) = CVar a_1 (f a_2)
+        amap f (CConst n) = CConst (amap f n)
+        amap f (CCompoundLit a_1 a_2 a_3) = CCompoundLit a_1 a_2 (f a_3)
+        amap f (CGenericSelection a_1 a_2 a_3)
+          = CGenericSelection a_1 a_2 (f a_3)
+        amap f (CStatExpr a_1 a_2) = CStatExpr a_1 (f a_2)
+        amap f (CLabAddrExpr a_1 a_2) = CLabAddrExpr a_1 (f a_2)
+        amap f (CBuiltinExpr n) = CBuiltinExpr (amap f n)
+
+instance CNode t1 => CNode (CBuiltinThing t1) where
+        nodeInfo (CBuiltinVaArg _ _ n) = nodeInfo n
+        nodeInfo (CBuiltinOffsetOf _ _ n) = nodeInfo n
+        nodeInfo (CBuiltinTypesCompatible _ _ n) = nodeInfo n
+        nodeInfo (CBuiltinConvertVector _ _ n) = nodeInfo n
+instance CNode t1 => Pos (CBuiltinThing t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CBuiltinThing where
+        fmap _f (CBuiltinVaArg a1 a2 a3)
+          = CBuiltinVaArg (fmap _f a1) (fmap _f a2) (_f a3)
+        fmap _f (CBuiltinOffsetOf a1 a2 a3)
+          = CBuiltinOffsetOf (fmap _f a1) (fmap (fmap _f) a2) (_f a3)
+        fmap _f (CBuiltinTypesCompatible a1 a2 a3)
+          = CBuiltinTypesCompatible (fmap _f a1) (fmap _f a2) (_f a3)
+        fmap _f (CBuiltinConvertVector a1 a2 a3)
+          = CBuiltinConvertVector (fmap _f a1) (fmap _f a2) (_f a3)
+
+instance Annotated CBuiltinThing where
+        annotation (CBuiltinVaArg _ _ n) = n
+        annotation (CBuiltinOffsetOf _ _ n) = n
+        annotation (CBuiltinTypesCompatible _ _ n) = n
+        annotation (CBuiltinConvertVector _ _ n) = n
+        amap f (CBuiltinVaArg a_1 a_2 a_3) = CBuiltinVaArg a_1 a_2 (f a_3)
+        amap f (CBuiltinOffsetOf a_1 a_2 a_3)
+          = CBuiltinOffsetOf a_1 a_2 (f a_3)
+        amap f (CBuiltinTypesCompatible a_1 a_2 a_3)
+          = CBuiltinTypesCompatible a_1 a_2 (f a_3)
+        amap f (CBuiltinConvertVector a_1 a_2 a_3) =
+          CBuiltinConvertVector a_1 a_2 (f a_3)
+
+instance CNode t1 => CNode (CConstant t1) where
+        nodeInfo (CIntConst _ n) = nodeInfo n
+        nodeInfo (CCharConst _ n) = nodeInfo n
+        nodeInfo (CFloatConst _ n) = nodeInfo n
+        nodeInfo (CStrConst _ n) = nodeInfo n
+instance CNode t1 => Pos (CConstant t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CConstant where
+        fmap _f (CIntConst a1 a2) = CIntConst a1 (_f a2)
+        fmap _f (CCharConst a1 a2) = CCharConst a1 (_f a2)
+        fmap _f (CFloatConst a1 a2) = CFloatConst a1 (_f a2)
+        fmap _f (CStrConst a1 a2) = CStrConst a1 (_f a2)
+
+instance Annotated CConstant where
+        annotation (CIntConst _ n) = n
+        annotation (CCharConst _ n) = n
+        annotation (CFloatConst _ n) = n
+        annotation (CStrConst _ n) = n
+        amap f (CIntConst a_1 a_2) = CIntConst a_1 (f a_2)
+        amap f (CCharConst a_1 a_2) = CCharConst a_1 (f a_2)
+        amap f (CFloatConst a_1 a_2) = CFloatConst a_1 (f a_2)
+        amap f (CStrConst a_1 a_2) = CStrConst a_1 (f a_2)
+
+instance CNode t1 => CNode (CStringLiteral t1) where
+        nodeInfo (CStrLit _ n) = nodeInfo n
+instance CNode t1 => Pos (CStringLiteral t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CStringLiteral where
+        fmap _f (CStrLit a1 a2) = CStrLit a1 (_f a2)
+
+instance Annotated CStringLiteral where
+        annotation (CStrLit _ n) = n
+        amap f (CStrLit a_1 a_2) = CStrLit a_1 (f a_2)
+-- GENERATED STOP
src/Language/C/Syntax/Constants.hs view
@@ -1,296 +1,296 @@-{-# LANGUAGE DeriveDataTypeable #-}--------------------------------------------------------------------------------- |--- Module      :  Language.C.Syntax.Constants--- Copyright   :  (c) 2007..2008 Duncan Coutts, Benedikt Huber--- License     :  BSD-style--- Maintainer  : benedikt.huber@gmail.com--- Stability   : experimental--- Portability : ghc------ This module provides support for representing, checking and exporting c--- constants, i.e. integral, float, character and string constants.-------------------------------------------------------------------------------module Language.C.Syntax.Constants (-  -- * Utilities-  escapeChar, unescapeChar, unescapeString,-  Flags(..), noFlags, setFlag, clearFlag, testFlag,-  -- * C char constants (and multi-character character constants)-  cChar, cChar_w, cChars, CChar(..), getCChar, getCCharAsInt, isWideChar, showCharConst,-  -- * C integral constants-  CIntFlag(..), CIntRepr(..), cInteger, CInteger(..), getCInteger,readCInteger,-  -- * C floating point constants-  cFloat,  CFloat(..), readCFloat,-  -- * C string literals-  cString, cString_w, CString(..), getCString, showStringLit, concatCStrings,-  -- * Clang C version literals-  ClangCVersion(..), readClangCVersion,-)-where-import Data.Bits-import Data.Char-import Numeric (showOct, showHex, readHex, readOct, readDec)-import Data.Generics---- | C char constants (abstract)-data CChar = CChar-              !Char-              !Bool  -- wide flag-           | CChars-              [Char] -- multi-character character constant-              !Bool   -- wide flag-           deriving (Eq,Ord,Data,Typeable)--instance Show CChar where-    showsPrec _ (CChar c wideflag)   = _showWideFlag wideflag . showCharConst c-    showsPrec _ (CChars cs wideflag) = _showWideFlag wideflag . sQuote (concatMap escapeCChar cs)---- | @showCharConst c@ prepends _a_ String representing the C char constant corresponding to @c@.--- If necessary uses octal or hexadecimal escape sequences.-showCharConst :: Char -> ShowS-showCharConst c = sQuote $ escapeCChar c--_showWideFlag :: Bool -> ShowS-_showWideFlag flag = if flag then showString "L" else id---- | get the haskell representation of a char constant-getCChar :: CChar -> String-getCChar (CChar  c _)   = [c]-getCChar (CChars  cs _) = cs---- | get integer value of a C char constant--- undefined result for multi-char char constants-getCCharAsInt :: CChar -> Integer-getCCharAsInt (CChar c _) = fromIntegral (fromEnum c)-getCCharAsInt (CChars _cs _) = error "integer value of multi-character character constants is implementation defined"---- | return @true@ if the character constant is /wide/.-isWideChar :: CChar -> Bool-isWideChar (CChar _ wideFlag) = wideFlag-isWideChar (CChars _ wideFlag) = wideFlag---- | construct a character constant from a haskell 'Char'--- Use 'cchar_w' if you want a wide character constant.-cChar :: Char -> CChar-cChar c = CChar c False---- | construct a wide chararacter constant-cChar_w :: Char -> CChar-cChar_w c = CChar c True---- | create a multi-character character constant-cChars :: String -> Bool -> CChar-cChars = CChars---- | datatype for memorizing the representation of an integer-data CIntRepr = DecRepr | HexRepr | OctalRepr deriving (Eq,Ord,Enum,Bounded,Data,Typeable)---- | datatype representing type flags for integers-data CIntFlag = FlagUnsigned | FlagLong | FlagLongLong | FlagImag deriving (Eq,Ord,Enum,Bounded,Data,Typeable)-instance Show CIntFlag where-    show FlagUnsigned = "u"-    show FlagLong = "L"-    show FlagLongLong = "LL"-    show FlagImag = "i"--{-# SPECIALIZE setFlag :: CIntFlag -> Flags CIntFlag -> Flags CIntFlag #-}-{-# SPECIALIZE clearFlag :: CIntFlag -> Flags CIntFlag -> Flags CIntFlag #-}-{-# SPECIALIZE testFlag :: CIntFlag -> Flags CIntFlag -> Bool #-}--data CInteger = CInteger-                 !Integer-                 !CIntRepr-                 !(Flags CIntFlag)  -- integer flags-                 deriving (Eq,Ord,Data,Typeable)-instance Show CInteger where-    showsPrec _ (CInteger ig repr flags) = showInt ig . showString (concatMap showIFlag [FlagUnsigned .. ]) where-        showIFlag f = if testFlag f flags then show f else []-        showInt num = case repr of DecRepr -> shows num-                                   OctalRepr -> showString "0" . showOct num-                                   HexRepr -> showString "0x" . showHex num---- To be used in the lexer--- Note that the flag lexer won't scale-readCInteger :: CIntRepr -> String -> Either String CInteger-readCInteger repr str =-  case readNum str of-    [(n,suffix)] -> mkCInt n suffix-    parseFailed  -> Left $ "Bad Integer literal: "++show parseFailed-  where-    readNum = case repr of DecRepr -> readDec; HexRepr -> readHex; OctalRepr -> readOct-    mkCInt n suffix = either Left (Right . CInteger n repr)  $ readSuffix suffix-    readSuffix = parseFlags noFlags-    parseFlags flags [] = Right flags-    parseFlags flags ('l':'l':fs) = parseFlags (setFlag FlagLongLong flags) fs-    parseFlags flags ('L':'L':fs) = parseFlags (setFlag FlagLongLong flags) fs-    parseFlags flags (f:fs) =-      let go1 flag = parseFlags (setFlag flag flags) fs in-      case f of-        'l' -> go1 FlagLong ; 'L' -> go1 FlagLong-        'u' -> go1 FlagUnsigned ; 'U' -> go1 FlagUnsigned-        'i' -> go1 FlagImag ; 'I' -> go1 FlagImag; 'j' -> go1 FlagImag; 'J' -> go1 FlagImag-        _ -> Left $ "Unexpected flag " ++ show f--getCInteger :: CInteger -> Integer-getCInteger (CInteger i _ _) = i---- | construct a integer constant (without type flags) from a haskell integer-cInteger :: Integer -> CInteger-cInteger i = CInteger i DecRepr noFlags----- | Floats (represented as strings)-data CFloat = CFloat-               !String-               deriving (Eq,Ord,Data,Typeable)-instance Show CFloat where-  showsPrec _ (CFloat internal) = showString internal--cFloat :: Float -> CFloat-cFloat = CFloat . show---- dummy implementation-readCFloat :: String -> CFloat-readCFloat = CFloat---- | Clang dotted version literal--- <https://clang.llvm.org/docs/AttributeReference.html#availability>-data ClangCVersion = ClangCVersion-                     !String-                     deriving (Eq,Ord,Data,Typeable)-instance Show ClangCVersion where-  showsPrec _ (ClangCVersion internal) = showString internal--readClangCVersion :: String -> ClangCVersion-readClangCVersion = ClangCVersion---- | C String literals-data CString = CString-                String    -- characters-                Bool      -- wide flag-                deriving (Eq,Ord,Data,Typeable)-instance Show CString where-    showsPrec _ (CString str wideflag) = _showWideFlag wideflag . showStringLit str---- construction-cString :: String -> CString-cString str = CString str False-cString_w :: String -> CString-cString_w str = CString str True---- selectors-getCString :: CString -> String-getCString (CString str _) = str-isWideString :: CString -> Bool-isWideString (CString _ wideflag) = wideflag---- | concatenate a list of C string literals-concatCStrings :: [CString] -> CString-concatCStrings cs = CString (concatMap getCString cs) (any isWideString cs)---- | @showStringLiteral s@ prepends a String representing the C string literal corresponding to @s@.--- If necessary it uses octal or hexadecimal escape sequences.-showStringLit :: String -> ShowS-showStringLit = dQuote . concatMap showStringChar-  where-  showStringChar c | isSChar c = return c-                     | c == '"'  = "\\\""-                     | otherwise = escapeChar c------ | @isAsciiSourceChar b@ returns @True@ if the given character is a character which---   may appear in a ASCII C source file and is printable.-isAsciiSourceChar :: Char -> Bool-isAsciiSourceChar c = isAscii c && isPrint c---- | @isCChar c@ returns true, if c is a source character which does not have to be escaped in---   C char constants (C99: 6.4.4.4)-isCChar :: Char -> Bool-isCChar '\\' = False-isCChar '\'' = False-isCChar '\n' = False-isCChar c = isAsciiSourceChar c---- | @escapeCChar c@ escapes c for use in a char constant-escapeCChar :: Char -> String-escapeCChar '\'' = "\\'"-escapeCChar c | isCChar c = [c]-              | otherwise = escapeChar c---- | @isSChar c@ returns true if c is a source character which does not have to be escaped in C string---  literals (C99: 6.4.5)-isSChar :: Char -> Bool-isSChar '\\' = False-isSChar '\"' = False-isSChar '\n' = False-isSChar c = isAsciiSourceChar c--showOct' :: Int -> String-showOct' i = replicate (3 - length s) '0' ++ s-  where s = showOct i ""--escapeChar :: Char -> String-escapeChar '\\' = "\\\\"-escapeChar '\a' = "\\a"-escapeChar '\b' = "\\b"-escapeChar '\ESC' = "\\e";-escapeChar '\f' = "\\f"-escapeChar '\n' = "\\n"-escapeChar '\r' = "\\r"-escapeChar '\t' = "\\t"-escapeChar '\v' = "\\v"-escapeChar c  | (ord c) < 512   = '\\' : showOct' (ord c)-              | otherwise       = '\\' : 'x'  : showHex (ord c) ""--unescapeChar :: String -> (Char, String)-unescapeChar ('\\':c:cs)  = case c of-       'n'  -> ('\n', cs)-       't'  -> ('\t', cs)-       'v'  -> ('\v', cs)-       'b'  -> ('\b', cs)-       'r'  -> ('\r', cs)-       'f'  -> ('\f', cs)-       'a'  -> ('\a', cs)-       'e'  -> ('\ESC', cs)  -- GNU extension-       'E'  -> ('\ESC', cs)  -- GNU extension-       '\\' -> ('\\', cs)-       '?'  -> ('?', cs)-       '\'' -> ('\'', cs)-       '"'  -> ('"', cs)-       'x'  -> case head' "bad escape sequence" (readHex cs) of-                 (i, cs') -> (toEnum i, cs')-       _    -> case head' "bad escape sequence" (readOct' (c:cs)) of-                 (i, cs') -> (toEnum i, cs')-unescapeChar (c   :cs)    = (c, cs)-unescapeChar []  = error $ "unescape char: empty string"--readOct' :: ReadS Int-readOct' s = map (\(i, cs) -> (i, cs ++ rest)) (readOct octStr)-  where octStr = takeWhile isOctDigit $ take 3 s-        rest = drop (length octStr) s--unescapeString :: String -> String-unescapeString [] = []-unescapeString cs = case unescapeChar cs of-                        (c, cs') -> c : unescapeString cs'---- helpers-sQuote :: String -> ShowS-sQuote s t = "'" ++ s ++ "'" ++ t-dQuote :: String -> ShowS-dQuote s t = ('"' : s) ++ "\"" ++ t-head' :: String -> [a] -> a-head' err []  = error err-head' _ (x:_) = x---- TODO: Move to separate file ?-newtype Flags f = Flags Integer deriving (Eq,Ord,Data,Typeable)-noFlags :: Flags f-noFlags = Flags 0-setFlag :: (Enum f) => f -> Flags f -> Flags f-setFlag flag (Flags k)   = Flags$ k  `setBit` fromEnum flag-clearFlag :: (Enum f) => f -> Flags f -> Flags f-clearFlag flag (Flags k) = Flags$ k `clearBit` fromEnum flag-testFlag :: (Enum f) => f -> Flags f -> Bool-testFlag flag (Flags k)  = k `testBit` fromEnum flag+{-# LANGUAGE DeriveDataTypeable #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Syntax.Constants
+-- Copyright   :  (c) 2007..2008 Duncan Coutts, Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  : benedikt.huber@gmail.com
+-- Stability   : experimental
+-- Portability : ghc
+--
+-- This module provides support for representing, checking and exporting c
+-- constants, i.e. integral, float, character and string constants.
+-----------------------------------------------------------------------------
+module Language.C.Syntax.Constants (
+  -- * Utilities
+  escapeChar, unescapeChar, unescapeString,
+  Flags(..), noFlags, setFlag, clearFlag, testFlag,
+  -- * C char constants (and multi-character character constants)
+  cChar, cChar_w, cChars, CChar(..), getCChar, getCCharAsInt, isWideChar, showCharConst,
+  -- * C integral constants
+  CIntFlag(..), CIntRepr(..), cInteger, CInteger(..), getCInteger,readCInteger,
+  -- * C floating point constants
+  cFloat,  CFloat(..), readCFloat,
+  -- * C string literals
+  cString, cString_w, CString(..), getCString, showStringLit, concatCStrings,
+  -- * Clang C version literals
+  ClangCVersion(..), readClangCVersion,
+)
+where
+import Data.Bits
+import Data.Char
+import Numeric (showOct, showHex, readHex, readOct, readDec)
+import Data.Generics
+
+-- | C char constants (abstract)
+data CChar = CChar
+              !Char
+              !Bool  -- wide flag
+           | CChars
+              [Char] -- multi-character character constant
+              !Bool   -- wide flag
+           deriving (Eq,Ord,Data,Typeable)
+
+instance Show CChar where
+    showsPrec _ (CChar c wideflag)   = _showWideFlag wideflag . showCharConst c
+    showsPrec _ (CChars cs wideflag) = _showWideFlag wideflag . sQuote (concatMap escapeCChar cs)
+
+-- | @showCharConst c@ prepends _a_ String representing the C char constant corresponding to @c@.
+-- If necessary uses octal or hexadecimal escape sequences.
+showCharConst :: Char -> ShowS
+showCharConst c = sQuote $ escapeCChar c
+
+_showWideFlag :: Bool -> ShowS
+_showWideFlag flag = if flag then showString "L" else id
+
+-- | get the haskell representation of a char constant
+getCChar :: CChar -> String
+getCChar (CChar  c _)   = [c]
+getCChar (CChars  cs _) = cs
+
+-- | get integer value of a C char constant
+-- undefined result for multi-char char constants
+getCCharAsInt :: CChar -> Integer
+getCCharAsInt (CChar c _) = fromIntegral (fromEnum c)
+getCCharAsInt (CChars _cs _) = error "integer value of multi-character character constants is implementation defined"
+
+-- | return @true@ if the character constant is /wide/.
+isWideChar :: CChar -> Bool
+isWideChar (CChar _ wideFlag) = wideFlag
+isWideChar (CChars _ wideFlag) = wideFlag
+
+-- | construct a character constant from a haskell 'Char'
+-- Use 'cchar_w' if you want a wide character constant.
+cChar :: Char -> CChar
+cChar c = CChar c False
+
+-- | construct a wide chararacter constant
+cChar_w :: Char -> CChar
+cChar_w c = CChar c True
+
+-- | create a multi-character character constant
+cChars :: String -> Bool -> CChar
+cChars = CChars
+
+-- | datatype for memorizing the representation of an integer
+data CIntRepr = DecRepr | HexRepr | OctalRepr deriving (Eq,Ord,Enum,Bounded,Data,Typeable)
+
+-- | datatype representing type flags for integers
+data CIntFlag = FlagUnsigned | FlagLong | FlagLongLong | FlagImag deriving (Eq,Ord,Enum,Bounded,Data,Typeable)
+instance Show CIntFlag where
+    show FlagUnsigned = "u"
+    show FlagLong = "L"
+    show FlagLongLong = "LL"
+    show FlagImag = "i"
+
+{-# SPECIALIZE setFlag :: CIntFlag -> Flags CIntFlag -> Flags CIntFlag #-}
+{-# SPECIALIZE clearFlag :: CIntFlag -> Flags CIntFlag -> Flags CIntFlag #-}
+{-# SPECIALIZE testFlag :: CIntFlag -> Flags CIntFlag -> Bool #-}
+
+data CInteger = CInteger
+                 !Integer
+                 !CIntRepr
+                 !(Flags CIntFlag)  -- integer flags
+                 deriving (Eq,Ord,Data,Typeable)
+instance Show CInteger where
+    showsPrec _ (CInteger ig repr flags) = showInt ig . showString (concatMap showIFlag [FlagUnsigned .. ]) where
+        showIFlag f = if testFlag f flags then show f else []
+        showInt num = case repr of DecRepr -> shows num
+                                   OctalRepr -> showString "0" . showOct num
+                                   HexRepr -> showString "0x" . showHex num
+
+-- To be used in the lexer
+-- Note that the flag lexer won't scale
+readCInteger :: CIntRepr -> String -> Either String CInteger
+readCInteger repr str =
+  case readNum str of
+    [(n,suffix)] -> mkCInt n suffix
+    parseFailed  -> Left $ "Bad Integer literal: "++show parseFailed
+  where
+    readNum = case repr of DecRepr -> readDec; HexRepr -> readHex; OctalRepr -> readOct
+    mkCInt n suffix = either Left (Right . CInteger n repr)  $ readSuffix suffix
+    readSuffix = parseFlags noFlags
+    parseFlags flags [] = Right flags
+    parseFlags flags ('l':'l':fs) = parseFlags (setFlag FlagLongLong flags) fs
+    parseFlags flags ('L':'L':fs) = parseFlags (setFlag FlagLongLong flags) fs
+    parseFlags flags (f:fs) =
+      let go1 flag = parseFlags (setFlag flag flags) fs in
+      case f of
+        'l' -> go1 FlagLong ; 'L' -> go1 FlagLong
+        'u' -> go1 FlagUnsigned ; 'U' -> go1 FlagUnsigned
+        'i' -> go1 FlagImag ; 'I' -> go1 FlagImag; 'j' -> go1 FlagImag; 'J' -> go1 FlagImag
+        _ -> Left $ "Unexpected flag " ++ show f
+
+getCInteger :: CInteger -> Integer
+getCInteger (CInteger i _ _) = i
+
+-- | construct a integer constant (without type flags) from a haskell integer
+cInteger :: Integer -> CInteger
+cInteger i = CInteger i DecRepr noFlags
+
+
+-- | Floats (represented as strings)
+data CFloat = CFloat
+               !String
+               deriving (Eq,Ord,Data,Typeable)
+instance Show CFloat where
+  showsPrec _ (CFloat internal) = showString internal
+
+cFloat :: Float -> CFloat
+cFloat = CFloat . show
+
+-- dummy implementation
+readCFloat :: String -> CFloat
+readCFloat = CFloat
+
+-- | Clang dotted version literal
+-- <https://clang.llvm.org/docs/AttributeReference.html#availability>
+data ClangCVersion = ClangCVersion
+                     !String
+                     deriving (Eq,Ord,Data,Typeable)
+instance Show ClangCVersion where
+  showsPrec _ (ClangCVersion internal) = showString internal
+
+readClangCVersion :: String -> ClangCVersion
+readClangCVersion = ClangCVersion
+
+-- | C String literals
+data CString = CString
+                String    -- characters
+                Bool      -- wide flag
+                deriving (Eq,Ord,Data,Typeable)
+instance Show CString where
+    showsPrec _ (CString str wideflag) = _showWideFlag wideflag . showStringLit str
+
+-- construction
+cString :: String -> CString
+cString str = CString str False
+cString_w :: String -> CString
+cString_w str = CString str True
+
+-- selectors
+getCString :: CString -> String
+getCString (CString str _) = str
+isWideString :: CString -> Bool
+isWideString (CString _ wideflag) = wideflag
+
+-- | concatenate a list of C string literals
+concatCStrings :: [CString] -> CString
+concatCStrings cs = CString (concatMap getCString cs) (any isWideString cs)
+
+-- | @showStringLiteral s@ prepends a String representing the C string literal corresponding to @s@.
+-- If necessary it uses octal or hexadecimal escape sequences.
+showStringLit :: String -> ShowS
+showStringLit = dQuote . concatMap showStringChar
+  where
+  showStringChar c | isSChar c = return c
+                     | c == '"'  = "\\\""
+                     | otherwise = escapeChar c
+
+
+
+-- | @isAsciiSourceChar b@ returns @True@ if the given character is a character which
+--   may appear in a ASCII C source file and is printable.
+isAsciiSourceChar :: Char -> Bool
+isAsciiSourceChar c = isAscii c && isPrint c
+
+-- | @isCChar c@ returns true, if c is a source character which does not have to be escaped in
+--   C char constants (C99: 6.4.4.4)
+isCChar :: Char -> Bool
+isCChar '\\' = False
+isCChar '\'' = False
+isCChar '\n' = False
+isCChar c = isAsciiSourceChar c
+
+-- | @escapeCChar c@ escapes c for use in a char constant
+escapeCChar :: Char -> String
+escapeCChar '\'' = "\\'"
+escapeCChar c | isCChar c = [c]
+              | otherwise = escapeChar c
+
+-- | @isSChar c@ returns true if c is a source character which does not have to be escaped in C string
+--  literals (C99: 6.4.5)
+isSChar :: Char -> Bool
+isSChar '\\' = False
+isSChar '\"' = False
+isSChar '\n' = False
+isSChar c = isAsciiSourceChar c
+
+showOct' :: Int -> String
+showOct' i = replicate (3 - length s) '0' ++ s
+  where s = showOct i ""
+
+escapeChar :: Char -> String
+escapeChar '\\' = "\\\\"
+escapeChar '\a' = "\\a"
+escapeChar '\b' = "\\b"
+escapeChar '\ESC' = "\\e";
+escapeChar '\f' = "\\f"
+escapeChar '\n' = "\\n"
+escapeChar '\r' = "\\r"
+escapeChar '\t' = "\\t"
+escapeChar '\v' = "\\v"
+escapeChar c  | (ord c) < 512   = '\\' : showOct' (ord c)
+              | otherwise       = '\\' : 'x'  : showHex (ord c) ""
+
+unescapeChar :: String -> (Char, String)
+unescapeChar ('\\':c:cs)  = case c of
+       'n'  -> ('\n', cs)
+       't'  -> ('\t', cs)
+       'v'  -> ('\v', cs)
+       'b'  -> ('\b', cs)
+       'r'  -> ('\r', cs)
+       'f'  -> ('\f', cs)
+       'a'  -> ('\a', cs)
+       'e'  -> ('\ESC', cs)  -- GNU extension
+       'E'  -> ('\ESC', cs)  -- GNU extension
+       '\\' -> ('\\', cs)
+       '?'  -> ('?', cs)
+       '\'' -> ('\'', cs)
+       '"'  -> ('"', cs)
+       'x'  -> case head' "bad escape sequence" (readHex cs) of
+                 (i, cs') -> (toEnum i, cs')
+       _    -> case head' "bad escape sequence" (readOct' (c:cs)) of
+                 (i, cs') -> (toEnum i, cs')
+unescapeChar (c   :cs)    = (c, cs)
+unescapeChar []  = error $ "unescape char: empty string"
+
+readOct' :: ReadS Int
+readOct' s = map (\(i, cs) -> (i, cs ++ rest)) (readOct octStr)
+  where octStr = takeWhile isOctDigit $ take 3 s
+        rest = drop (length octStr) s
+
+unescapeString :: String -> String
+unescapeString [] = []
+unescapeString cs = case unescapeChar cs of
+                        (c, cs') -> c : unescapeString cs'
+
+-- helpers
+sQuote :: String -> ShowS
+sQuote s t = "'" ++ s ++ "'" ++ t
+dQuote :: String -> ShowS
+dQuote s t = ('"' : s) ++ "\"" ++ t
+head' :: String -> [a] -> a
+head' err []  = error err
+head' _ (x:_) = x
+
+-- TODO: Move to separate file ?
+newtype Flags f = Flags Integer deriving (Eq,Ord,Data,Typeable)
+noFlags :: Flags f
+noFlags = Flags 0
+setFlag :: (Enum f) => f -> Flags f -> Flags f
+setFlag flag (Flags k)   = Flags$ k  `setBit` fromEnum flag
+clearFlag :: (Enum f) => f -> Flags f -> Flags f
+clearFlag flag (Flags k) = Flags$ k `clearBit` fromEnum flag
+testFlag :: (Enum f) => f -> Flags f -> Bool
+testFlag flag (Flags k)  = k `testBit` fromEnum flag
src/Language/C/Syntax/Ops.hs view
@@ -1,105 +1,105 @@-{-# LANGUAGE DeriveDataTypeable #-}--------------------------------------------------------------------------------- |--- Module      :  Language.C.Syntax.Ops--- Copyright   :  (c) 2008 Benedikt Huber--- License     :  BSD-style--- Maintainer  : benedikt.huber@gmail.com--- Stability   : experimental--- Portability : ghc------ Unary, binary and asssignment operators. Exported via AST.-------------------------------------------------------------------------------module Language.C.Syntax.Ops (--- * Assignment operators-CAssignOp(..),-assignBinop,--- * Binary operators-CBinaryOp(..),-isCmpOp,-isPtrOp,-isBitOp,-isLogicOp,--- * Unary operators-CUnaryOp(..),-isEffectfulOp-)-where-import Data.Generics--- | C assignment operators (K&R A7.17)-data CAssignOp = CAssignOp-               | CMulAssOp-               | CDivAssOp-               | CRmdAssOp              -- ^ remainder and assignment-               | CAddAssOp-               | CSubAssOp-               | CShlAssOp-               | CShrAssOp-               | CAndAssOp-               | CXorAssOp-               | COrAssOp-               deriving (Eq,Ord,Show,Data,Typeable)--assignBinop :: CAssignOp -> CBinaryOp-assignBinop CAssignOp = error "direct assignment has no binary operator"-assignBinop CMulAssOp = CMulOp-assignBinop CDivAssOp = CDivOp-assignBinop CRmdAssOp = CRmdOp-assignBinop CAddAssOp = CAddOp-assignBinop CSubAssOp = CSubOp-assignBinop CShlAssOp = CShlOp-assignBinop CShrAssOp = CShrOp-assignBinop CAndAssOp = CAndOp-assignBinop CXorAssOp = CXorOp-assignBinop COrAssOp  = COrOp---- | C binary operators (K&R A7.6-15)----data CBinaryOp = CMulOp-               | CDivOp-               | CRmdOp                 -- ^ remainder of division-               | CAddOp-               | CSubOp-               | CShlOp                 -- ^ shift left-               | CShrOp                 -- ^ shift right-               | CLeOp                  -- ^ less-               | CGrOp                  -- ^ greater-               | CLeqOp                 -- ^ less or equal-               | CGeqOp                 -- ^ greater or equal-               | CEqOp                  -- ^ equal-               | CNeqOp                 -- ^ not equal-               | CAndOp                 -- ^ bitwise and-               | CXorOp                 -- ^ exclusive bitwise or-               | COrOp                  -- ^ inclusive bitwise or-               | CLndOp                 -- ^ logical and-               | CLorOp                 -- ^ logical or-               deriving (Eq,Ord,Show,Data,Typeable)--isCmpOp :: CBinaryOp -> Bool-isCmpOp op = op `elem` [ CLeqOp, CGeqOp, CLeOp, CGrOp, CEqOp, CNeqOp ]--isPtrOp :: CBinaryOp -> Bool-isPtrOp op = op `elem` [ CAddOp, CSubOp ]--isBitOp :: CBinaryOp -> Bool-isBitOp op = op `elem` [ CShlOp, CShrOp, CAndOp, COrOp, CXorOp ]--isLogicOp :: CBinaryOp -> Bool-isLogicOp op = op `elem` [ CLndOp, CLorOp ]---- | C unary operator (K&R A7.3-4)----data CUnaryOp = CPreIncOp               -- ^ prefix increment operator-              | CPreDecOp               -- ^ prefix decrement operator-              | CPostIncOp              -- ^ postfix increment operator-              | CPostDecOp              -- ^ postfix decrement operator-              | CAdrOp                  -- ^ address operator-              | CIndOp                  -- ^ indirection operator-              | CPlusOp                 -- ^ prefix plus-              | CMinOp                  -- ^ prefix minus-              | CCompOp                 -- ^ one's complement-              | CNegOp                  -- ^ logical negation-              deriving (Eq,Ord,Show,Data,Typeable)--isEffectfulOp :: CUnaryOp -> Bool-isEffectfulOp op = op `elem` [ CPreIncOp, CPreDecOp, CPostIncOp, CPostDecOp ]+{-# LANGUAGE DeriveDataTypeable #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Syntax.Ops
+-- Copyright   :  (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  : benedikt.huber@gmail.com
+-- Stability   : experimental
+-- Portability : ghc
+--
+-- Unary, binary and asssignment operators. Exported via AST.
+-----------------------------------------------------------------------------
+module Language.C.Syntax.Ops (
+-- * Assignment operators
+CAssignOp(..),
+assignBinop,
+-- * Binary operators
+CBinaryOp(..),
+isCmpOp,
+isPtrOp,
+isBitOp,
+isLogicOp,
+-- * Unary operators
+CUnaryOp(..),
+isEffectfulOp
+)
+where
+import Data.Generics
+-- | C assignment operators (K&R A7.17)
+data CAssignOp = CAssignOp
+               | CMulAssOp
+               | CDivAssOp
+               | CRmdAssOp              -- ^ remainder and assignment
+               | CAddAssOp
+               | CSubAssOp
+               | CShlAssOp
+               | CShrAssOp
+               | CAndAssOp
+               | CXorAssOp
+               | COrAssOp
+               deriving (Eq,Ord,Show,Data,Typeable)
+
+assignBinop :: CAssignOp -> CBinaryOp
+assignBinop CAssignOp = error "direct assignment has no binary operator"
+assignBinop CMulAssOp = CMulOp
+assignBinop CDivAssOp = CDivOp
+assignBinop CRmdAssOp = CRmdOp
+assignBinop CAddAssOp = CAddOp
+assignBinop CSubAssOp = CSubOp
+assignBinop CShlAssOp = CShlOp
+assignBinop CShrAssOp = CShrOp
+assignBinop CAndAssOp = CAndOp
+assignBinop CXorAssOp = CXorOp
+assignBinop COrAssOp  = COrOp
+
+-- | C binary operators (K&R A7.6-15)
+--
+data CBinaryOp = CMulOp
+               | CDivOp
+               | CRmdOp                 -- ^ remainder of division
+               | CAddOp
+               | CSubOp
+               | CShlOp                 -- ^ shift left
+               | CShrOp                 -- ^ shift right
+               | CLeOp                  -- ^ less
+               | CGrOp                  -- ^ greater
+               | CLeqOp                 -- ^ less or equal
+               | CGeqOp                 -- ^ greater or equal
+               | CEqOp                  -- ^ equal
+               | CNeqOp                 -- ^ not equal
+               | CAndOp                 -- ^ bitwise and
+               | CXorOp                 -- ^ exclusive bitwise or
+               | COrOp                  -- ^ inclusive bitwise or
+               | CLndOp                 -- ^ logical and
+               | CLorOp                 -- ^ logical or
+               deriving (Eq,Ord,Show,Data,Typeable)
+
+isCmpOp :: CBinaryOp -> Bool
+isCmpOp op = op `elem` [ CLeqOp, CGeqOp, CLeOp, CGrOp, CEqOp, CNeqOp ]
+
+isPtrOp :: CBinaryOp -> Bool
+isPtrOp op = op `elem` [ CAddOp, CSubOp ]
+
+isBitOp :: CBinaryOp -> Bool
+isBitOp op = op `elem` [ CShlOp, CShrOp, CAndOp, COrOp, CXorOp ]
+
+isLogicOp :: CBinaryOp -> Bool
+isLogicOp op = op `elem` [ CLndOp, CLorOp ]
+
+-- | C unary operator (K&R A7.3-4)
+--
+data CUnaryOp = CPreIncOp               -- ^ prefix increment operator
+              | CPreDecOp               -- ^ prefix decrement operator
+              | CPostIncOp              -- ^ postfix increment operator
+              | CPostDecOp              -- ^ postfix decrement operator
+              | CAdrOp                  -- ^ address operator
+              | CIndOp                  -- ^ indirection operator
+              | CPlusOp                 -- ^ prefix plus
+              | CMinOp                  -- ^ prefix minus
+              | CCompOp                 -- ^ one's complement
+              | CNegOp                  -- ^ logical negation
+              deriving (Eq,Ord,Show,Data,Typeable)
+
+isEffectfulOp :: CUnaryOp -> Bool
+isEffectfulOp op = op `elem` [ CPreIncOp, CPreDecOp, CPostIncOp, CPostDecOp ]
src/Language/C/Syntax/Utils.hs view
@@ -1,76 +1,76 @@-module Language.C.Syntax.Utils (-  -- * Generic operations-  getSubStmts,-  mapSubStmts,-  mapBlockItemStmts,-  -- * Concrete operations-  getLabels-) where--import Data.List-import Language.C.Data.Ident-import Language.C.Syntax.AST---- XXX: This is should be generalized !!!---      Data.Generics sounds attractive, but we really need to control the evaluation order--- XXX: Expression statements (which are somewhat problematic anyway), aren't handled yet-getSubStmts :: CStat -> [CStat]-getSubStmts (CLabel _ s _ _)      = [s]-getSubStmts (CCase _ s _)         = [s]-getSubStmts (CCases _ _ s _)      = [s]-getSubStmts (CDefault s _)        = [s]-getSubStmts (CExpr _ _)           = []-getSubStmts (CCompound _ body _)  = concatMap compoundSubStmts body-getSubStmts (CIf _ sthen selse _) = maybe [sthen] (\s -> [sthen,s]) selse-getSubStmts (CSwitch _ s _)       = [s]-getSubStmts (CWhile _ s _ _)      = [s]-getSubStmts (CFor _ _ _ s _)      = [s]-getSubStmts (CGoto _ _)           = []-getSubStmts (CGotoPtr _ _)        = []-getSubStmts (CCont _)             = []-getSubStmts (CBreak _)            = []-getSubStmts (CReturn _ _)         = []-getSubStmts (CAsm _ _)            = []--mapSubStmts :: (CStat -> Bool) -> (CStat -> CStat) -> CStat -> CStat-mapSubStmts stop _ s | stop s = s-mapSubStmts stop f (CLabel i s attrs ni) =-  f (CLabel i (mapSubStmts stop f s) attrs ni)-mapSubStmts stop f (CCase e s ni) =-  f (CCase e (mapSubStmts stop f s) ni)-mapSubStmts stop f (CCases e1 e2 s ni) =-  f (CCases e1 e2 (mapSubStmts stop f s) ni)-mapSubStmts stop f (CDefault s ni) =-  f (CDefault (mapSubStmts stop f s) ni)-mapSubStmts stop f (CCompound ls body ni) =-  f (CCompound ls (map (mapBlockItemStmts stop f) body) ni)-mapSubStmts stop f (CIf e sthen selse ni) =-  f (CIf e-     (mapSubStmts stop f sthen)-     (fmap (mapSubStmts stop f) selse)-     ni)-mapSubStmts stop f (CSwitch e s ni) =-  f (CSwitch e (mapSubStmts stop f s) ni)-mapSubStmts stop f (CWhile e s isdo ni) =-  f (CWhile e (mapSubStmts stop f s) isdo ni)-mapSubStmts stop f (CFor i t a s ni) =-  f (CFor i t a (mapSubStmts stop f s) ni)-mapSubStmts _ f s  = f s--mapBlockItemStmts :: (CStat -> Bool)-                  -> (CStat -> CStat)-                  -> CBlockItem-                  -> CBlockItem-mapBlockItemStmts stop f (CBlockStmt s) = CBlockStmt (mapSubStmts stop f s)-mapBlockItemStmts _ _ bi                = bi--compoundSubStmts :: CBlockItem -> [CStat]-compoundSubStmts (CBlockStmt s)    = [s]-compoundSubStmts (CBlockDecl _)    = []-compoundSubStmts (CNestedFunDef _) = []--getLabels :: CStat -> [Ident]-getLabels (CLabel l s _ _)      = l : getLabels s-getLabels (CCompound ls body _) =-  concatMap (concatMap getLabels . compoundSubStmts) body \\ ls-getLabels stmt                  = concatMap getLabels (getSubStmts stmt)+module Language.C.Syntax.Utils (
+  -- * Generic operations
+  getSubStmts,
+  mapSubStmts,
+  mapBlockItemStmts,
+  -- * Concrete operations
+  getLabels
+) where
+
+import Data.List
+import Language.C.Data.Ident
+import Language.C.Syntax.AST
+
+-- XXX: This is should be generalized !!!
+--      Data.Generics sounds attractive, but we really need to control the evaluation order
+-- XXX: Expression statements (which are somewhat problematic anyway), aren't handled yet
+getSubStmts :: CStat -> [CStat]
+getSubStmts (CLabel _ s _ _)      = [s]
+getSubStmts (CCase _ s _)         = [s]
+getSubStmts (CCases _ _ s _)      = [s]
+getSubStmts (CDefault s _)        = [s]
+getSubStmts (CExpr _ _)           = []
+getSubStmts (CCompound _ body _)  = concatMap compoundSubStmts body
+getSubStmts (CIf _ sthen selse _) = maybe [sthen] (\s -> [sthen,s]) selse
+getSubStmts (CSwitch _ s _)       = [s]
+getSubStmts (CWhile _ s _ _)      = [s]
+getSubStmts (CFor _ _ _ s _)      = [s]
+getSubStmts (CGoto _ _)           = []
+getSubStmts (CGotoPtr _ _)        = []
+getSubStmts (CCont _)             = []
+getSubStmts (CBreak _)            = []
+getSubStmts (CReturn _ _)         = []
+getSubStmts (CAsm _ _)            = []
+
+mapSubStmts :: (CStat -> Bool) -> (CStat -> CStat) -> CStat -> CStat
+mapSubStmts stop _ s | stop s = s
+mapSubStmts stop f (CLabel i s attrs ni) =
+  f (CLabel i (mapSubStmts stop f s) attrs ni)
+mapSubStmts stop f (CCase e s ni) =
+  f (CCase e (mapSubStmts stop f s) ni)
+mapSubStmts stop f (CCases e1 e2 s ni) =
+  f (CCases e1 e2 (mapSubStmts stop f s) ni)
+mapSubStmts stop f (CDefault s ni) =
+  f (CDefault (mapSubStmts stop f s) ni)
+mapSubStmts stop f (CCompound ls body ni) =
+  f (CCompound ls (map (mapBlockItemStmts stop f) body) ni)
+mapSubStmts stop f (CIf e sthen selse ni) =
+  f (CIf e
+     (mapSubStmts stop f sthen)
+     (fmap (mapSubStmts stop f) selse)
+     ni)
+mapSubStmts stop f (CSwitch e s ni) =
+  f (CSwitch e (mapSubStmts stop f s) ni)
+mapSubStmts stop f (CWhile e s isdo ni) =
+  f (CWhile e (mapSubStmts stop f s) isdo ni)
+mapSubStmts stop f (CFor i t a s ni) =
+  f (CFor i t a (mapSubStmts stop f s) ni)
+mapSubStmts _ f s  = f s
+
+mapBlockItemStmts :: (CStat -> Bool)
+                  -> (CStat -> CStat)
+                  -> CBlockItem
+                  -> CBlockItem
+mapBlockItemStmts stop f (CBlockStmt s) = CBlockStmt (mapSubStmts stop f s)
+mapBlockItemStmts _ _ bi                = bi
+
+compoundSubStmts :: CBlockItem -> [CStat]
+compoundSubStmts (CBlockStmt s)    = [s]
+compoundSubStmts (CBlockDecl _)    = []
+compoundSubStmts (CNestedFunDef _) = []
+
+getLabels :: CStat -> [Ident]
+getLabels (CLabel l s _ _)      = l : getLabels s
+getLabels (CCompound ls body _) =
+  concatMap (concatMap getLabels . compoundSubStmts) body \\ ls
+getLabels stmt                  = concatMap getLabels (getSubStmts stmt)
src/Language/C/System/GCC.hs view
@@ -1,114 +1,114 @@-{-# LANGUAGE PatternGuards #-}--------------------------------------------------------------------------------- |--- Module      :  Language.C.System.Gcc--- Copyright   :  (c) 2008 Benedikt Huber--- License     :  BSD-style--- Maintainer  :  benedikt.huber@gmail.com--- Stability   :  experimental--- Portability :  portable------ Invoking gcc for preprocessing and compiling.-------------------------------------------------------------------------------module Language.C.System.GCC (-    GCC,newGCC,-)-where-import Language.C.Data.RList as RList-import Language.C.System.Preprocess-import Data.Maybe-import System.Process-import System.Directory-import Data.List---- | @GCC@ represents a reference to the gcc compiler-newtype GCC = GCC { gccPath :: FilePath }---- | create a reference to @gcc@-newGCC :: FilePath -> GCC-newGCC = GCC--instance Preprocessor GCC where-    parseCPPArgs _ = gccParseCPPArgs-    runCPP gcc cpp_args =-        do  -- copy the input to the outputfile, because in case the input is preprocessed,-            -- gcc -E will do nothing.-            maybe (return()) (copyWritable (inputFile cpp_args)) (outputFile cpp_args)-            rawSystem (gccPath gcc) (buildCppArgs cpp_args)-                where copyWritable source target = do copyFile source target-                                                      p <- getPermissions target-                                                      setPermissions target p{writable=True}---- | Parse arguments for preprocessing via GCC.---   At least one .c, .hc or .h file has to be present.---   For now we only support the most important gcc options.------   1) Parse all flags relevant to CppArgs---   2) Move -c,-S,-M? to other_args---   3) Strip -E---   4) The rest goes into extra_args-gccParseCPPArgs :: [String] -> Either String (CppArgs, [String])-gccParseCPPArgs args =-    case mungeArgs ((Nothing,Nothing,RList.empty),(RList.empty,RList.empty)) args of-        Left err                   -> Left err-        Right ((Nothing,_,_),_)  -> Left "No .c / .hc / .h source file given"-        Right ((Just input_file,output_file_opt,cpp_opts),(extra_args,other_args))-            -> Right ((rawCppArgs (RList.reverse extra_args) input_file)-                      { outputFile = output_file_opt, cppOptions = RList.reverse cpp_opts },-                      RList.reverse other_args)-    where-    mungeArgs :: ParseArgsState -> [String] -> Either String ParseArgsState-    mungeArgs parsed@( cpp_args@(inp,out,cpp_opts),-                          unparsed@(extra,other))-              unparsed_args =-        case unparsed_args of-            ("-E":rest) -> mungeArgs parsed rest--            (flag:flagArg:rest) | flag == "-MF"-                                || flag == "-MT"-                                || flag == "-MQ"-                                -> mungeArgs (cpp_args,(extra,other `snoc` flag `snoc` flagArg)) rest--            (flag:rest) |  flag == "-c"-                        || flag == "-S"-                        || "-M" `isPrefixOf` flag-                        -> mungeArgs (cpp_args,(extra,other `snoc` flag)) rest--            ("-o":file:rest)   | isJust out -> Left "two output files given"-                               | otherwise          -> mungeArgs ((inp,Just file,cpp_opts),unparsed) rest--            (cpp_opt:rest)     | Just (opt,rest') <- getArgOpt cpp_opt rest-                               -> mungeArgs ((inp,out,cpp_opts `snoc` opt),unparsed) rest'--            (cfile:rest)       | any (`isSuffixOf` cfile) (words ".c .hc .h")-                               -> if isJust inp-                                   then Left "two input files given"-                                   else mungeArgs ((Just cfile,out,cpp_opts),unparsed) rest--            (unknown:rest)     -> mungeArgs (cpp_args,(extra `snoc` unknown,other)) rest--            []                 -> Right parsed--    getArgOpt cpp_opt rest | "-I" `isPrefixOf` cpp_opt = Just (IncludeDir (drop 2 cpp_opt),rest)-                           | "-U" `isPrefixOf` cpp_opt = Just (Undefine (drop 2 cpp_opt),rest)-                           | "-D" `isPrefixOf` cpp_opt = Just (getDefine (drop 2 cpp_opt),rest)-    getArgOpt "-include" (f:rest')                     = Just (IncludeFile f, rest')-    getArgOpt _ _ = Nothing-    getDefine opt = let (key,val) = break (== '=') opt in Define key (if null val then "" else tail val)--type ParseArgsState = ((Maybe FilePath, Maybe FilePath, RList CppOption), (RList String, RList String))---buildCppArgs :: CppArgs -> [String]-buildCppArgs (CppArgs options extra_args _tmpdir input_file output_file_opt) =-       (concatMap tOption options)-    ++ outputFileOpt-    ++ ["-E", input_file]-    ++ extra_args-    where-    tOption (IncludeDir incl)  = ["-I",incl]-    tOption (Define key value) = [ "-D" ++ key ++ (if null value then "" else "=" ++ value) ]-    tOption (Undefine key)     = [ "-U" ++ key ]-    tOption (IncludeFile f)    = [ "-include", f]-    outputFileOpt = concat [ ["-o",output_file] | output_file <- maybeToList output_file_opt ]-+{-# LANGUAGE PatternGuards #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.System.Gcc
+-- Copyright   :  (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  experimental
+-- Portability :  portable
+--
+-- Invoking gcc for preprocessing and compiling.
+-----------------------------------------------------------------------------
+module Language.C.System.GCC (
+    GCC,newGCC,
+)
+where
+import Language.C.Data.RList as RList
+import Language.C.System.Preprocess
+import Data.Maybe
+import System.Process
+import System.Directory
+import Data.List
+
+-- | @GCC@ represents a reference to the gcc compiler
+newtype GCC = GCC { gccPath :: FilePath }
+
+-- | create a reference to @gcc@
+newGCC :: FilePath -> GCC
+newGCC = GCC
+
+instance Preprocessor GCC where
+    parseCPPArgs _ = gccParseCPPArgs
+    runCPP gcc cpp_args =
+        do  -- copy the input to the outputfile, because in case the input is preprocessed,
+            -- gcc -E will do nothing.
+            maybe (return()) (copyWritable (inputFile cpp_args)) (outputFile cpp_args)
+            rawSystem (gccPath gcc) (buildCppArgs cpp_args)
+                where copyWritable source target = do copyFile source target
+                                                      p <- getPermissions target
+                                                      setPermissions target p{writable=True}
+
+-- | Parse arguments for preprocessing via GCC.
+--   At least one .c, .hc or .h file has to be present.
+--   For now we only support the most important gcc options.
+--
+--   1) Parse all flags relevant to CppArgs
+--   2) Move -c,-S,-M? to other_args
+--   3) Strip -E
+--   4) The rest goes into extra_args
+gccParseCPPArgs :: [String] -> Either String (CppArgs, [String])
+gccParseCPPArgs args =
+    case mungeArgs ((Nothing,Nothing,RList.empty),(RList.empty,RList.empty)) args of
+        Left err                   -> Left err
+        Right ((Nothing,_,_),_)  -> Left "No .c / .hc / .h source file given"
+        Right ((Just input_file,output_file_opt,cpp_opts),(extra_args,other_args))
+            -> Right ((rawCppArgs (RList.reverse extra_args) input_file)
+                      { outputFile = output_file_opt, cppOptions = RList.reverse cpp_opts },
+                      RList.reverse other_args)
+    where
+    mungeArgs :: ParseArgsState -> [String] -> Either String ParseArgsState
+    mungeArgs parsed@( cpp_args@(inp,out,cpp_opts),
+                          unparsed@(extra,other))
+              unparsed_args =
+        case unparsed_args of
+            ("-E":rest) -> mungeArgs parsed rest
+
+            (flag:flagArg:rest) | flag == "-MF"
+                                || flag == "-MT"
+                                || flag == "-MQ"
+                                -> mungeArgs (cpp_args,(extra,other `snoc` flag `snoc` flagArg)) rest
+
+            (flag:rest) |  flag == "-c"
+                        || flag == "-S"
+                        || "-M" `isPrefixOf` flag
+                        -> mungeArgs (cpp_args,(extra,other `snoc` flag)) rest
+
+            ("-o":file:rest)   | isJust out -> Left "two output files given"
+                               | otherwise          -> mungeArgs ((inp,Just file,cpp_opts),unparsed) rest
+
+            (cpp_opt:rest)     | Just (opt,rest') <- getArgOpt cpp_opt rest
+                               -> mungeArgs ((inp,out,cpp_opts `snoc` opt),unparsed) rest'
+
+            (cfile:rest)       | any (`isSuffixOf` cfile) (words ".c .hc .h")
+                               -> if isJust inp
+                                   then Left "two input files given"
+                                   else mungeArgs ((Just cfile,out,cpp_opts),unparsed) rest
+
+            (unknown:rest)     -> mungeArgs (cpp_args,(extra `snoc` unknown,other)) rest
+
+            []                 -> Right parsed
+
+    getArgOpt cpp_opt rest | "-I" `isPrefixOf` cpp_opt = Just (IncludeDir (drop 2 cpp_opt),rest)
+                           | "-U" `isPrefixOf` cpp_opt = Just (Undefine (drop 2 cpp_opt),rest)
+                           | "-D" `isPrefixOf` cpp_opt = Just (getDefine (drop 2 cpp_opt),rest)
+    getArgOpt "-include" (f:rest')                     = Just (IncludeFile f, rest')
+    getArgOpt _ _ = Nothing
+    getDefine opt = let (key,val) = break (== '=') opt in Define key (if null val then "" else tail val)
+
+type ParseArgsState = ((Maybe FilePath, Maybe FilePath, RList CppOption), (RList String, RList String))
+
+
+buildCppArgs :: CppArgs -> [String]
+buildCppArgs (CppArgs options extra_args _tmpdir input_file output_file_opt) =
+       (concatMap tOption options)
+    ++ outputFileOpt
+    ++ ["-E", input_file]
+    ++ extra_args
+    where
+    tOption (IncludeDir incl)  = ["-I",incl]
+    tOption (Define key value) = [ "-D" ++ key ++ (if null value then "" else "=" ++ value) ]
+    tOption (Undefine key)     = [ "-U" ++ key ]
+    tOption (IncludeFile f)    = [ "-include", f]
+    outputFileOpt = concat [ ["-o",output_file] | output_file <- maybeToList output_file_opt ]
+
src/Language/C/System/Preprocess.hs view
@@ -1,123 +1,123 @@--------------------------------------------------------------------------------- |--- Module      :  Language.C.Wrapper.Preprocess--- Copyright   :  (c) 2008 Benedikt Huber--- License     :  BSD-style--- Maintainer  :  benedikt.huber@gmail.com--- Stability   :  experimental--- Portability :  portable------ Invoking external preprocessors.-------------------------------------------------------------------------------module Language.C.System.Preprocess (-    Preprocessor(..),-    CppOption(..),-    CppArgs(..),rawCppArgs,addCppOption,addExtraOption,cppFile,-    runPreprocessor,-    isPreprocessed,-)-where-import Language.C.Data.InputStream-import System.Exit-import System.Directory-import System.FilePath-import System.IO-import Control.Exception-import Control.Monad-import Data.List---- | 'Preprocessor' encapsulates the abstract interface for invoking C preprocessors-class Preprocessor cpp where-    -- | parse the given command line arguments, and return a pair of parsed and ignored arguments-    parseCPPArgs :: cpp -> [String] -> Either String (CppArgs, [String])-    -- | run the preprocessor-    runCPP :: cpp -> CppArgs -> IO ExitCode---- | file extension of a preprocessed file-preprocessedExt :: String-preprocessedExt = ".i"---- | Generic Options for the preprocessor-data CppOption =-        IncludeDir FilePath-      | Define String String-      | Undefine String-      | IncludeFile FilePath---- | Generic arguments for the preprocessor-data CppArgs = CppArgs {-        cppOptions :: [CppOption],-        extraOptions :: [String],-        cppTmpDir  :: Maybe FilePath,-        inputFile  :: FilePath,-        outputFile :: Maybe FilePath-    }---- | Cpp arguments that only specify the input file name.-cppFile :: FilePath -> CppArgs-cppFile input_file = CppArgs { cppOptions = [], extraOptions = [], cppTmpDir = Nothing, inputFile = input_file, outputFile = Nothing }----- | use the given preprocessor arguments without analyzing them-rawCppArgs :: [String] -> FilePath -> CppArgs-rawCppArgs opts input_file =-    CppArgs { inputFile = input_file, cppOptions = [], extraOptions = opts, outputFile = Nothing, cppTmpDir = Nothing }---- | add a typed option to the given preprocessor arguments-addCppOption :: CppArgs -> CppOption -> CppArgs-addCppOption cpp_args opt =-    cpp_args { cppOptions = opt : cppOptions cpp_args }---- | add a string option to the given preprocessor arguments-addExtraOption :: CppArgs -> String -> CppArgs-addExtraOption cpp_args extra =-    cpp_args { extraOptions = extra : extraOptions cpp_args }---- | run the preprocessor and return an 'InputStream' if preprocesssing succeeded-runPreprocessor :: (Preprocessor cpp) => cpp -> CppArgs -> IO (Either ExitCode InputStream)-runPreprocessor cpp cpp_args =-    bracket-        getActualOutFile-        -- remove outfile if it was temporary-        removeTmpOutFile-        -- invoke preprocessor-        invokeCpp-    where-    getActualOutFile :: IO FilePath-    getActualOutFile = maybe (mkOutputFile (cppTmpDir cpp_args) (inputFile cpp_args)) return (outputFile cpp_args)-    invokeCpp actual_out_file = do-        exit_code <- runCPP cpp (cpp_args { outputFile = Just actual_out_file})-        case exit_code of-            ExitSuccess   -> liftM Right (readInputStream actual_out_file)-            ExitFailure _ -> return $ Left exit_code-    removeTmpOutFile out_file = maybe (removeFile out_file) (\_ -> return ()) (outputFile cpp_args)---- | create an output file, given  @Maybe tmpdir@ and @inputfile@-mkOutputFile :: Maybe FilePath -> FilePath -> IO FilePath-mkOutputFile tmp_dir_opt input_file =-    do tmpDir <- getTempDir tmp_dir_opt-       mkTmpFile tmpDir (getOutputFileName input_file)-    where-    getTempDir (Just tmpdir) = return tmpdir-    getTempDir Nothing       = getTemporaryDirectory---- | compute output file name from input file name-getOutputFileName :: FilePath -> FilePath-getOutputFileName fp | hasExtension fp = replaceExtension filename preprocessedExt-                     | otherwise       = addExtension filename preprocessedExt-    where-    filename = takeFileName fp---- | create a temporary file-mkTmpFile :: FilePath -> FilePath -> IO FilePath-mkTmpFile tmp_dir file_templ = do-    -- putStrLn $ "TmpDir: "++tmp_dir-    -- putStrLn $ "FileTempl: "++file_templ-    (path,file_handle) <- openTempFile tmp_dir file_templ-    hClose file_handle-    return path---- | guess whether a file is preprocessed (file end with .i)-isPreprocessed :: FilePath -> Bool-isPreprocessed = (".i" `isSuffixOf`)-+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Wrapper.Preprocess
+-- Copyright   :  (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  experimental
+-- Portability :  portable
+--
+-- Invoking external preprocessors.
+-----------------------------------------------------------------------------
+module Language.C.System.Preprocess (
+    Preprocessor(..),
+    CppOption(..),
+    CppArgs(..),rawCppArgs,addCppOption,addExtraOption,cppFile,
+    runPreprocessor,
+    isPreprocessed,
+)
+where
+import Language.C.Data.InputStream
+import System.Exit
+import System.Directory
+import System.FilePath
+import System.IO
+import Control.Exception
+import Control.Monad
+import Data.List
+
+-- | 'Preprocessor' encapsulates the abstract interface for invoking C preprocessors
+class Preprocessor cpp where
+    -- | parse the given command line arguments, and return a pair of parsed and ignored arguments
+    parseCPPArgs :: cpp -> [String] -> Either String (CppArgs, [String])
+    -- | run the preprocessor
+    runCPP :: cpp -> CppArgs -> IO ExitCode
+
+-- | file extension of a preprocessed file
+preprocessedExt :: String
+preprocessedExt = ".i"
+
+-- | Generic Options for the preprocessor
+data CppOption =
+        IncludeDir FilePath
+      | Define String String
+      | Undefine String
+      | IncludeFile FilePath
+
+-- | Generic arguments for the preprocessor
+data CppArgs = CppArgs {
+        cppOptions :: [CppOption],
+        extraOptions :: [String],
+        cppTmpDir  :: Maybe FilePath,
+        inputFile  :: FilePath,
+        outputFile :: Maybe FilePath
+    }
+
+-- | Cpp arguments that only specify the input file name.
+cppFile :: FilePath -> CppArgs
+cppFile input_file = CppArgs { cppOptions = [], extraOptions = [], cppTmpDir = Nothing, inputFile = input_file, outputFile = Nothing }
+
+
+-- | use the given preprocessor arguments without analyzing them
+rawCppArgs :: [String] -> FilePath -> CppArgs
+rawCppArgs opts input_file =
+    CppArgs { inputFile = input_file, cppOptions = [], extraOptions = opts, outputFile = Nothing, cppTmpDir = Nothing }
+
+-- | add a typed option to the given preprocessor arguments
+addCppOption :: CppArgs -> CppOption -> CppArgs
+addCppOption cpp_args opt =
+    cpp_args { cppOptions = opt : cppOptions cpp_args }
+
+-- | add a string option to the given preprocessor arguments
+addExtraOption :: CppArgs -> String -> CppArgs
+addExtraOption cpp_args extra =
+    cpp_args { extraOptions = extra : extraOptions cpp_args }
+
+-- | run the preprocessor and return an 'InputStream' if preprocesssing succeeded
+runPreprocessor :: (Preprocessor cpp) => cpp -> CppArgs -> IO (Either ExitCode InputStream)
+runPreprocessor cpp cpp_args =
+    bracket
+        getActualOutFile
+        -- remove outfile if it was temporary
+        removeTmpOutFile
+        -- invoke preprocessor
+        invokeCpp
+    where
+    getActualOutFile :: IO FilePath
+    getActualOutFile = maybe (mkOutputFile (cppTmpDir cpp_args) (inputFile cpp_args)) return (outputFile cpp_args)
+    invokeCpp actual_out_file = do
+        exit_code <- runCPP cpp (cpp_args { outputFile = Just actual_out_file})
+        case exit_code of
+            ExitSuccess   -> liftM Right (readInputStream actual_out_file)
+            ExitFailure _ -> return $ Left exit_code
+    removeTmpOutFile out_file = maybe (removeFile out_file) (\_ -> return ()) (outputFile cpp_args)
+
+-- | create an output file, given  @Maybe tmpdir@ and @inputfile@
+mkOutputFile :: Maybe FilePath -> FilePath -> IO FilePath
+mkOutputFile tmp_dir_opt input_file =
+    do tmpDir <- getTempDir tmp_dir_opt
+       mkTmpFile tmpDir (getOutputFileName input_file)
+    where
+    getTempDir (Just tmpdir) = return tmpdir
+    getTempDir Nothing       = getTemporaryDirectory
+
+-- | compute output file name from input file name
+getOutputFileName :: FilePath -> FilePath
+getOutputFileName fp | hasExtension fp = replaceExtension filename preprocessedExt
+                     | otherwise       = addExtension filename preprocessedExt
+    where
+    filename = takeFileName fp
+
+-- | create a temporary file
+mkTmpFile :: FilePath -> FilePath -> IO FilePath
+mkTmpFile tmp_dir file_templ = do
+    -- putStrLn $ "TmpDir: "++tmp_dir
+    -- putStrLn $ "FileTempl: "++file_templ
+    (path,file_handle) <- openTempFile tmp_dir file_templ
+    hClose file_handle
+    return path
+
+-- | guess whether a file is preprocessed (file end with .i)
+isPreprocessed :: FilePath -> Bool
+isPreprocessed = (".i" `isSuffixOf`)
+
test/harness/run-harness.hs view
@@ -1,70 +1,70 @@-module Main where--import Data.List (intercalate)-import System.Exit (ExitCode(..), exitFailure, exitSuccess, exitWith)-import System.Directory (doesDirectoryExist, doesFileExist, getCurrentDirectory, setCurrentDirectory,-                         getDirectoryContents)-import System.FilePath ((</>))-import System.Process (readProcessWithExitCode, callProcess)-import System.IO (hPutStrLn, hPrint, stderr)-import Control.Monad (filterM, liftM, when)--testDirs :: [String]-testDirs = ["test/harness","harness","."]--getActualTestDirectory :: [String] -> IO FilePath-getActualTestDirectory test_dirs = do-  validDirs <- filterM (doesFileExist . (</> "run-harness.hs")) test_dirs-  case validDirs of-    []    -> ioError (userError ("run-harness.hs not found in " ++ intercalate " or " test_dirs))-    (d:_) -> return d--subdirectoriesOf :: FilePath -> IO [FilePath]-subdirectoriesOf fp = do-  entries <- getDirectoryContents fp-  filterM (doesDirectoryExist . (fp </>)) (filter (not . isSpecialDir) entries)-  where-    isSpecialDir "." = True-    isSpecialDir ".." = True-    isSpecialDir _ = False---- from Control.Monad.Extra-findM :: Monad m => (a -> m Bool) -> [a] -> m (Maybe a)-findM _ [] = return Nothing-findM p (x:xs) = do guard <- p x ; if guard then (return $ Just x) else (findM p xs)--main :: IO ExitCode-main = do-  actual_test_dir <- getActualTestDirectory testDirs-  has_makefile <- doesFileExist (actual_test_dir </> "Makefile")-  when (not has_makefile) $ do-    hPutStrLn stderr "No Makefile found (out of source tree)"-    hPutStrLn stderr "Skipping harness test"-    exitWith ExitSuccess-  tests <- subdirectoriesOf actual_test_dir-  cdir <- getCurrentDirectory-  hPutStrLn stderr ("Changing to test directory " ++ actual_test_dir ++ " and compiling")-  -- build test executables-  setCurrentDirectory (cdir</>actual_test_dir)-  callProcess "make" ["prepare"]-  -- run harness tests-  hasFailure <- findM (liftM (/= ExitSuccess) . runTest . (cdir</>) . (actual_test_dir</>)) tests-  setCurrentDirectory cdir-  case hasFailure of-    Nothing -> exitSuccess-    Just _failed -> exitFailure-  where-    runTest :: FilePath -> IO ExitCode-    runTest dir = do-      setCurrentDirectory dir-      (exitCode, _outp, _errp) <- readProcessWithExitCode "make" [] ""-      hPutStrLn stderr ("cd " ++ dir ++ " && make: " ++ show exitCode)-      when (exitCode /= ExitSuccess) $ do-        hPutStrLn stderr "=== Standard Output ==="-        hPutStrLn stderr _outp-        hPutStrLn stderr "=== Error Output ==="-        hPutStrLn stderr _errp-        hPutStrLn stderr "=== End of Output ==="-      return exitCode--+module Main where
+
+import Data.List (intercalate)
+import System.Exit (ExitCode(..), exitFailure, exitSuccess, exitWith)
+import System.Directory (doesDirectoryExist, doesFileExist, getCurrentDirectory, setCurrentDirectory,
+                         getDirectoryContents)
+import System.FilePath ((</>))
+import System.Process (readProcessWithExitCode, callProcess)
+import System.IO (hPutStrLn, hPrint, stderr)
+import Control.Monad (filterM, liftM, when)
+
+testDirs :: [String]
+testDirs = ["test/harness","harness","."]
+
+getActualTestDirectory :: [String] -> IO FilePath
+getActualTestDirectory test_dirs = do
+  validDirs <- filterM (doesFileExist . (</> "run-harness.hs")) test_dirs
+  case validDirs of
+    []    -> ioError (userError ("run-harness.hs not found in " ++ intercalate " or " test_dirs))
+    (d:_) -> return d
+
+subdirectoriesOf :: FilePath -> IO [FilePath]
+subdirectoriesOf fp = do
+  entries <- getDirectoryContents fp
+  filterM (doesDirectoryExist . (fp </>)) (filter (not . isSpecialDir) entries)
+  where
+    isSpecialDir "." = True
+    isSpecialDir ".." = True
+    isSpecialDir _ = False
+
+-- from Control.Monad.Extra
+findM :: Monad m => (a -> m Bool) -> [a] -> m (Maybe a)
+findM _ [] = return Nothing
+findM p (x:xs) = do guard <- p x ; if guard then (return $ Just x) else (findM p xs)
+
+main :: IO ExitCode
+main = do
+  actual_test_dir <- getActualTestDirectory testDirs
+  has_makefile <- doesFileExist (actual_test_dir </> "Makefile")
+  when (not has_makefile) $ do
+    hPutStrLn stderr "No Makefile found (out of source tree)"
+    hPutStrLn stderr "Skipping harness test"
+    exitWith ExitSuccess
+  tests <- subdirectoriesOf actual_test_dir
+  cdir <- getCurrentDirectory
+  hPutStrLn stderr ("Changing to test directory " ++ actual_test_dir ++ " and compiling")
+  -- build test executables
+  setCurrentDirectory (cdir</>actual_test_dir)
+  callProcess "make" ["prepare"]
+  -- run harness tests
+  hasFailure <- findM (liftM (/= ExitSuccess) . runTest . (cdir</>) . (actual_test_dir</>)) tests
+  setCurrentDirectory cdir
+  case hasFailure of
+    Nothing -> exitSuccess
+    Just _failed -> exitFailure
+  where
+    runTest :: FilePath -> IO ExitCode
+    runTest dir = do
+      setCurrentDirectory dir
+      (exitCode, _outp, _errp) <- readProcessWithExitCode "make" [] ""
+      hPutStrLn stderr ("cd " ++ dir ++ " && make: " ++ show exitCode)
+      when (exitCode /= ExitSuccess) $ do
+        hPutStrLn stderr "=== Standard Output ==="
+        hPutStrLn stderr _outp
+        hPutStrLn stderr "=== Error Output ==="
+        hPutStrLn stderr _errp
+        hPutStrLn stderr "=== End of Output ==="
+      return exitCode
+
+