packages feed

WashNGo (empty) → 2.12

raw patch · 89 files changed

+29568/−0 lines, 89 filesdep +basedep +containersdep +directorysetup-changed

Dependencies added: base, containers, directory, ghc-paths, haskell98, parsec, process, regex-compat

Files

+ LICENSE view
@@ -0,0 +1,30 @@+The WASH License++Copyright 2001-2003, Peter Thiemann.+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. The name of the author may not be used to endorse or promote+      products derived from this software without specific prior+      written permission. ++THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. 
+ Setup.lhs view
@@ -0,0 +1,5 @@+#!/usr/bin/env runhaskell+arch-tag: Main setup script++> import Distribution.Simple+> main = defaultMain
+ WASH/CGI/AbstractSelector.hs view
@@ -0,0 +1,227 @@+module WASH.CGI.AbstractSelector +  -- the public interface+  -- ( as_rows, as_cols, table_io, getText, selectionGroup, selectionButton, selectionDisplay)+where++import WASH.CGI.BaseCombinators (unsafe_io, once)+import WASH.CGI.CGIInternals (HTMLField, INVALID, ValidationError (..))+import WASH.CGI.CGIMonad hiding (lift)+import WASH.CGI.HTMLWrapper+import WASH.CGI.RawCGIInternal hiding (CGIEnv (..))+import WASH.Utility.JavaScript++import Char+import List ((\\))+import Maybe+++-- |abstract table (twodimensional)+data AT =+    AT { as_raw :: [[String]]+       , as_rows :: Int+       , as_cols :: Int+       }++instance Show AT where+  showsPrec i as = showsPrec i (as_rows as, as_cols as)++instance Read AT where+  readsPrec i inp =+    [ (AT { as_raw = [], as_rows = r, as_cols = c }, str')+    | ((r,c), str') <- readsPrec i inp+    ]++-- |abstract row+data AR = AR [String]+  deriving (Eq, Show)++instance Read AR where+  readsPrec i inp =+    case dropWhile isSpace inp of+      'A':'R':xs ->+	[(AR xss, rest) | (xss, rest) <- reads xs]+      _ -> []+  readList inp =+    case dropWhile isSpace inp of+      '+':xs ->+	[ (ar:ars, xs2)| (ar, xs1) <- reads xs, (ars, xs2) <- readList xs1 ]+      '-':xs ->+	[ (ars\\[ar], xs2)| (ar, xs1) <- reads xs, (ars, xs2) <- readList xs1 ]+      "" -> +	[([],[])]+      _ -> []++getAR :: AT -> Int -> AR+getAR at r =+  AR (getRow (as_raw at) r)++unAR :: AR -> [String]+unAR (AR x) = x++-- |Transform an IO action that produces a table in list form into a CGI action+-- that returns an abstract table. +table_io :: IO [[String]] -> CGI AT+table_io io =+  once $+  do raw <- unsafe_io io+     let r = length raw+	 c = length (Prelude.head raw)+     return (AT { as_raw = raw+		, as_rows = r+		, as_cols = c+		})++-- |Access abstract table by row and column. Produces a test node in the+-- document monad.+getText :: Monad m => AT -> Int -> Int -> WithHTML x m ()+getText as r c =+  text (getEntry (as_raw as) r c)++getRow xss r +  | 0 <= r && r < length xss = xss !! r+  | otherwise = []++getCol xs c+  | 0 <= c && c < length xs = xs !! c+  | otherwise = ""++getEntry xss r c =+  getCol (getRow xss r) c+  +-- |a selection group is a virtual field that never appears on the screen, but+-- gives rise to a hidden input field!+data SelectionGroup a x =+     SelectionGroup { selectionName   :: String+		    , selectionToken  :: CGIFieldName+		    , selectionString :: Maybe String+		    , selectionValue  :: Maybe a+		    , selectionBound  :: Bool+		    }++validateSelectionGroup rg =+  case selectionValue rg of +    Nothing | selectionBound rg -> +      Left [ValidationError (selectionName rg) (selectionToken rg) (selectionString rg)]+    _ ->+      Right SelectionGroup  { selectionName = selectionName rg+			, selectionToken = selectionToken rg+			, selectionString = selectionString rg+			, selectionValue = selectionValue rg+			, selectionBound = selectionBound rg+			}++valueSelectionGroup rg =+  case selectionValue rg of+    Nothing -> error ("SelectionGroup { " +++		      "selectionName = " ++ show (selectionName rg) ++ ", " +++		      "selectionString = " ++ show (selectionString rg) ++ ", " +++		      "selectionBound = " ++ show (selectionBound rg) +++		      " }")+    Just vl -> vl++-- |Create a selection group for a table. Selects one row.+selectionGroup :: (CGIMonad cgi) => WithHTML y cgi (SelectionGroup AR INVALID)+selectionGroup =+  do token <- lift nextName+     let fieldName = show token+     info <- lift getInfo+     lift $ addField fieldName False+     let bds = bindings info+	 maybeString = bds >>= assocParm fieldName+	 -- experimental+	 isBound = fromMaybe False (do "UNSET" <- maybeString+				       return True)+	 maybeVal = maybeString >>= (g . reads)+	 g ((a,""):_) = Just a+	 g _ = Nothing+     input (do attr "type" "hidden"+	       attr "name" fieldName+	       attr "value" "UNSET")+     return $+       SelectionGroup { selectionName = fieldName+		      , selectionToken = token+		      , selectionString = maybeString+		      , selectionValue = maybeVal+		      , selectionBound = isBound+		      }++-- |Create a selection button for an abstract table+selectionButton :: (CGIMonad cgi) =>+  SelectionGroup AR INVALID -> AT -> Int -> HTMLField cgi x y ()+selectionButton sg at row buttonAttrs =+  input (do attr "type" "radio"+	    attr "name" (fieldName++"_")+	    attr "onclick" ("var ff=this.form."++fieldName+++			    ";ff.value=" ++ jsShow (show (getAR at row))+++			    ";if(ff.getAttribute('onchange'))"+++			    "{WASHSubmit(ff.name);"+++			    "};")+	    buttonAttrs)+  where+    fieldName = selectionName sg+++-- |Create a labelled selection display for an abstract table. The display+-- function takes the button element and a list of text nodes corresponding to+-- the selected row and is expected to perform the layout.+selectionDisplay :: (CGIMonad cgi) =>+  SelectionGroup AR INVALID -> AT -> Int ->+  (WithHTML x cgi () -> [WithHTML x cgi ()] -> WithHTML x cgi a) ->+  WithHTML x cgi a+selectionDisplay sg at row displayFun =+  displayFun (selectionButton sg at row empty)+	     (Prelude.map text $ getRow (as_raw at) row)++-- |Create a choice group for a table (0-*).+choiceGroup :: (CGIMonad cgi) => WithHTML x cgi (SelectionGroup [AR] INVALID)+choiceGroup =+  do token <- lift nextName+     let fieldName = show token+     info <- lift getInfo+     lift $ addField fieldName False+     let bds = bindings info+	 maybeString = bds >>= assocParm fieldName+	 maybeVal = maybeString >>= (g . reads)+	 g ((a,""):_) = Just a+	 g _ = Nothing+     input (do attr "type" "hidden"+	       attr "name" fieldName+	       attr "value" "")+     return $+       SelectionGroup { selectionName = fieldName+		      , selectionToken = token+		      , selectionString = maybeString+		      , selectionValue = maybeVal+		      , selectionBound = isJust bds+		      }++-- |Create one choice button for an abstract table+choiceButton :: (CGIMonad cgi) =>+  SelectionGroup [AR] INVALID -> AT -> Int -> HTMLField cgi x y ()+choiceButton sg at row buttonAttrs =+  do script_T (rawtext $+	       "SubmitAction[SubmitAction.length]=" +++	       "function(){"+++	       "var f=document.forms[0];" +++	       "if(f."++buttonFieldName++".checked){" ++ +		 "f."++fieldName++".value=" ++ jsShow ('+':show (getAR at row)) +++		   "+f."++fieldName++".value;" +++	       "};return true};")+     input_T+      (do attr "type" "checkbox"+	  attr "name" buttonFieldName+	  buttonAttrs)+  where+    fieldName = selectionName sg+    buttonFieldName = fieldName++'_':show row++-- |Create a labelled choice display for an abstract table. The display+-- function takes the button element and a list of text nodes corresponding to+-- the selected row and is expected to perform the layout.+choiceDisplay :: (CGIMonad cgi) =>+  SelectionGroup [AR] INVALID -> AT -> Int ->+  (WithHTML x cgi () -> [WithHTML x cgi ()] -> WithHTML x cgi a) ->+  WithHTML x cgi a+choiceDisplay sg at row displayFun =+  displayFun (choiceButton sg at row empty)+	     (Prelude.map text $ getRow (as_raw at) row)
+ WASH/CGI/BaseCombinators.hs view
@@ -0,0 +1,548 @@+-- © 2001-2005 Peter Thiemann+module WASH.CGI.BaseCombinators+{-- interface+  (ask		-- WithHTML x CGI a -> CGI ()+  ,tell		-- CGIOutput a => a -> CGI ()+  ,htell 	-- WithHTML x IO () -> CGI ()+  ,run		-- CGI () -> IO ()+  ,runWithHook 	-- ([String] -> CGI ()) -> CGI () -> IO ()+  )+--}+where++import qualified List+import Maybe+import Monad+import System+import IO++import WASH.Utility.Auxiliary+import qualified WASH.Utility.Base64 as Base64+import WASH.CGI.CookieIO+import WASH.CGI.CGIMonad+import WASH.CGI.CGIOutput+import WASH.CGI.CGITypes+import WASH.CGI.EventHandlers+import WASH.CGI.Fields+import WASH.CGI.Frames+import WASH.CGI.LogEntry+import WASH.CGI.CGIHistory+import qualified WASH.CGI.HTMLWrapper as H hiding (map,head)+import WASH.CGI.Images+import WASH.Utility.JavaScript+import qualified WASH.Utility.RFC2279 as RFC2279+import qualified WASH.Utility.RFC2397 as RFC2397+import WASH.CGI.RawCGIInternal hiding (CGIEnv (..), getSessionMode)+import qualified WASH.Utility.URLCoding as URLCoding++import WASH.CGI.CGIConfig+++-- |Safe embedding of an 'IO' action into the 'CGI' monad. Intentionally not+-- parameterized óver its monad to avoid its use inside of transactions.+io :: (Read a, Show a) => IO a -> CGI a+io ioa =+  once (unsafe_io ioa)++-- |Runs a 'CGI' state transformer forever. Its specification is just+--+-- > feedback f x = f x >>= feedback f+-- +-- However, 'feedback' is more efficient because it avoids the +-- buildup of long interaction logs by cutting back every time just before 'f' +-- is invoked. Unfortunately, it's useless due to typing restrictions.+feedback :: (CGIMonad cgi, Read a, Show a) => (a -> cgi a) -> a -> cgi a+feedback f x = +  wrapCGI (\ cgistate ->+  case inparm cgistate of+    -- if we've got a value in the log,+    -- ignore the parameter x and just use the logged value+    PAR_MARK _ : PAR_RESULT code : rest ->+      case reads code of+	(result, ""):_ ->+	  return (result+	         ,cgistate { inparm = rest })+	_ ->+	  reportError "Result unreadable"+	  	(H.text_S "Cannot read " >> H.text (show code)) cgistate+    [] ->+      let stid = stateID cgistate +	  newparm = PAR_MARK stid+	  newvalue = PAR_RESULT (show x)+	  in+      do (nextx, cgistate') <- +	   unwrapCGI (f x) cgistate { outparm = newvalue : newparm : outparm cgistate+				, stateID = nextstid (nextstid stid newparm) newvalue }+	 let (oldstid, outparm') = popToMark $ outparm cgistate'+	 unwrapCGI (feedback f nextx)+	       cgistate { inparm =  inparm cgistate'+			, outparm = outparm'+			, stateID = oldstid+			, cookieMap = cookieMap cgistate' +			, cookiesToSend = cookiesToSend cgistate' }+    _ -> +      reportError "Out of sync" H.empty cgistate)++-- |Control operator for the 'CGI' monad. Its specification is+--+-- > callWithCurrentHistory (\backto x -> action x >>= backto) x+-- > ==+-- > action x >>= callWithCurrentHistory (\backto x -> action x >>= backto)+-- +-- However, 'callWithCurrentHistory' is more efficient because it avoids the +-- buildup of long interaction logs by cutting back every time just before+-- 'action' gets executed. +callWithCurrentHistory :: (CGIMonad cgi, Read a, Show a) =>+			  ((a -> cgi ()) -> a -> cgi ()) -> a -> cgi ()+callWithCurrentHistory g x = +  wrapCGI (\ cgistate ->+  let+    prompt stid x =+      wrapCGI (\ cgistate' ->+	let outparm' = popTo stid (outparm cgistate') +	in+	unwrapCGI (callWithCurrentHistory g x) +	      cgistate { inparm =  inparm cgistate'+		       , outparm = outparm'+		       , stateID = stid+		       , cookieMap = cookieMap cgistate' +		       , cookiesToSend = cookiesToSend cgistate' } )+    popTo stid [] = error "popTo did not find its mark"+    popTo stid (PAR_MARK stid' : rest) | stid' == stid = rest+    popTo stid (_ : rest) = popTo stid rest+  in+  case inparm cgistate of+    -- if we've got a value in the log,+    -- ignore the parameter x and just use the logged value+    PAR_MARK stid : PAR_RESULT code : rest ->+      case reads code of+	(result, ""):_ ->+	  unwrapCGI (g (prompt stid) result) cgistate { inparm = rest }+	_ ->+	  reportError "Result unreadable"+	  	(H.text_S "Cannot read " >> H.text (show code)) cgistate+    [] ->+      let stid = stateID cgistate +	  newmark = PAR_MARK stid+	  newvalue = PAR_RESULT (show x)+	  in+      unwrapCGI (g (prompt stid) x)+	cgistate { outparm = newvalue : newmark : outparm cgistate+		 , stateID = nextstid (nextstid stid newmark) newvalue }+    _ -> +      reportError "Out of sync" H.empty cgistate)++-- |Brackets a 'CGI' action so that only its result is visible. Improves+-- efficiency by not executing the bracketed action after it has been performed+-- once. Use this for avoiding the inefficient buildup of long interaction logs.+once :: (CGIMonad cgi, Read a, Show a) => cgi a -> cgi a+once cgi = +  wrapCGI (\ cgistate ->+  case inparm cgistate of+    PAR_RESULT code : rest ->+      case reads code of+	(result, ""):_ ->+	  return (result+	         ,cgistate { inparm = rest })+	_ ->+	  reportError "Result unreadable"+	  	(H.text_S "Cannot read " >> H.text (show code)) cgistate+    [] ->+      let stid = stateID cgistate +	  newparm = PAR_MARK stid in+      unwrapCGI cgi cgistate { outparm = newparm : outparm cgistate+			 , stateID = nextstid stid newparm }+      >>= finish cgistate+    PAR_MARK _ : rest -> +      unwrapCGI cgi cgistate { inparm = rest } >>= finish cgistate+    _ -> +      reportError "Out of sync" H.empty cgistate)+  where finish cgistate (v, cgistate') =+ 	  let (oldstid, outparm') = popToMark $ outparm cgistate'+	      newparm = PAR_RESULT (show v)+	  in+	  return (v+	      	 ,cgistate { inparm = inparm cgistate'+			   , outparm = newparm : outparm'+			   , stateID = nextstid oldstid newparm+			   , cookieMap = cookieMap cgistate' +			   , cookiesToSend = cookiesToSend cgistate' })++-- |Repeats a 'CGI' action without saving its state so that the size of the+-- interaction log remains constant.+forever :: (CGIMonad cgi) => cgi () -> cgi ()+forever cgi = +  wrapCGI (\ cgistate ->+  case inparm cgistate of+    [] ->+      let stid = stateID cgistate +	  newparm = PAR_MARK stid in+      unwrapCGI cgi cgistate { outparm = newparm : outparm cgistate+			 , stateID = nextstid stid newparm }+      >>= +      const (reportError "Black hole" H.empty cgistate)+    PAR_MARK _ : rest -> +      unwrapCGI cgi cgistate { inparm = rest } >>= finish (mcount cgistate)+    _ -> +      reportError "Out of sync" H.empty cgistate)+  where finish previousMcount (v, cgistate') =+	  let (oldstid, outparm') = popToMark $ outparm cgistate'+	      newparm_ignored = PAR_RESULT (show v)+	      newparm = PAR_MARK oldstid+	  in+	  unwrapCGI cgi +	    cgistate' { inparm = []+		      , outparm = newparm : outparm'+		      , stateID = nextstid oldstid newparm+		      , mcount = previousMcount }++-- |Unsafe variant of 'once':  returns the computed value only the first time+-- and returns a default value in all later invocations.+-- [deprecated]+onceAndThen :: (CGIMonad cgi, Read a, Show a) => a -> cgi a -> cgi a+onceAndThen a cgi = +  wrapCGI (\ cgistate ->+  case inparm cgistate of+    PAR_IGNORED : rest ->+      return (a+	     ,cgistate { inparm = rest })+    [] ->+      unwrapCGI cgi cgistate { outparm = PAR_MARK (stateID cgistate) : outparm cgistate }+      >>= finish+    PAR_MARK _ : rest -> +      unwrapCGI cgi cgistate { inparm = rest } >>= finish+    _ -> +      reportError "Out of sync" H.empty cgistate)+  where popToMark [] = []+	popToMark (PAR_MARK _: rest) = rest+	popToMark (_: rest) = popToMark rest+	finish (v, cgistate') =+ 	  let out = outparm cgistate' in+	  return (v+	      	 ,cgistate' { outparm = PAR_IGNORED : popToMark out })++-- internal helper function+popToMark [] = error "popToMark did not find MARK"+popToMark (PAR_MARK v: rest) = (v, rest)+popToMark (_: rest) = popToMark rest++-- |Directly lifts the 'IO' monad into the 'CGI' monad. This is generally unsafe+-- and should be avoided. Use 'io' instead.+unsafe_io :: IO a -> CGI a+unsafe_io = lift++-- |Takes a monadic value that constructs a HTML page and delivers this+-- page to the browser. This page may contain forms and input widgets.+ask :: (CGIMonad cgi) => H.WithHTML x cgi a -> cgi ()+ask ma =+  do sessionMode <- getSessionMode+     case sessionMode of+       LogOnly -> +	 askResumptive ma+       _ ->+	 askContinuously ma++-- |Implementation of `ask` for the pure logged variant.+askResumptive :: (CGIMonad cgi) => H.WithHTML x cgi a -> cgi ()+askResumptive ma =+  do wrapCGI (\cgistate -> +       return ((), cgistate { pageInfo = initialPageInfo cgistate }))+     setAction tell+     elem <- H.build_document ma +     wrapCGI $+       \cgistate -> let+	 pi = pageInfo cgistate+	 atable = actionTable pi+	 mbnds = bindings pi+	 msubmitter = mbnds >>= assocParm subVar+	 maction = msubmitter >>= \x -> lookup x atable+	 nextState = nextCGIState cgistate+	 defsubmission = liftM snd $ listToMaybe (reverse atable)+	 defaction = maybe (rawTell) +			   (const (maybe (tellError "Unspecified action")+					 id+					 defsubmission))+			   mbnds+	 go = (maybe defaction id maction) elem nextState+	 oldgo = (nextaction pi elem) nextState+       in+	 -- appendDebugFile "/tmp/ask" (show (List.map fst atable, msubmitter)) >>+	 go++-- |Experimental implementation of continuous version.+askContinuously :: (CGIMonad cgi) => H.WithHTML x cgi a -> cgi ()+askContinuously ma =+  fromCGIstate id >>= \initialState -> +  let+    scriptName = cgiScriptName (cgiInfo initialState)+    parentID = (scriptName, stateID initialState)+    askLoop = do +      wrapCGI (\cgistate -> +	   return ((), cgistate { pageInfo = initialPageInfo cgistate })) +      setAction tellContinuously			    -- is this still required?+      elem <- H.build_document ma +      wrapCGI $+       \cgistate -> let+	 tellAction x = \ cst ->+	   do rawTellContinuously x cst+	      hClose (cgiHandle (cgiInfo cgistate))+	      (decoded_parameters, hout) <- readParameters parentID+	      -- newparm :: CGIParameters+	      let newparm = PAR_VALUES $ dropSpecialParameters decoded_parameters+		  newState = initialState { inparm = [newparm]+					  , outparm = newparm : outparm initialState+					  , cgiInfo = (cgiInfo initialState) { cgiHandle = hout}+					  }+	      unwrapCGI askLoop newState+		    +	 pi = pageInfo cgistate+	 atable = actionTable pi+	 mbnds = bindings pi+	 msubmitter = mbnds >>= assocParm subVar+	 maction = msubmitter >>= \x -> lookup x atable+	 nextState = nextCGIState cgistate+	 defsubmission = liftM snd $ listToMaybe (reverse atable)+	 nextparam = head (inparm cgistate)+	 myID = (scriptName, nextstid (snd parentID) nextparam)+	 boost maction =+	   maction >>= \ cgiact -> +	   return (\ elem -> +		     unwrapCGI (lift (createEntry myID (Just parentID) nextparam Nothing)+				 >> wrapCGI (cgiact elem)))+	 defaction = maybe tellAction+			   (const (maybe (tellError "Unspecified action")+					 id+					 (boost defsubmission)))+			   mbnds+       in +	 (maybe defaction id (boost maction)) elem nextState+  in askLoop+++-- |Like 'ask', but passes the constructed HTML page to the @elementAction@+-- parameter. This function may send the page via Email or store it into a+-- file. Anyone loading this page in a browser can resume the interaction.+askOffline :: (CGIMonad cgi) => H.WithHTML x cgi a -> (H.Element -> IO ()) -> cgi ()+askOffline ma elementAction =+  do wrapCGI (\cgistate -> return ((), cgistate { pageInfo = initialPageInfo cgistate }))+     setAction tell+     elem <- H.build_document ma +     wrapCGI $+       \cgistate ->+       case bindings (pageInfo cgistate) of+         Nothing ->+	   elementAction elem >> return ((), cgistate)+	 Just _ ->+	   (nextaction (pageInfo cgistate) elem) (nextCGIState cgistate)++-- |Turns a 'CGI' action into an 'IO' action. Used to turn the main 'CGI' action+-- into the @main@ function of the program. Typical use:+-- +-- > main = run mainCGI+run :: CGI () -> IO ()+run =+  runWithOptions []++-- |Turns a 'CGI' action into an 'IO' action. Used to turn the main 'CGI' action+-- into the @main@ function of the program. Takes additional low-level+-- options. Typical use: +-- +-- > main = runWithOptions [] mainCGI+runWithOptions :: CGIOptions -> CGI () -> IO ()+runWithOptions options =+  runInternal options (fallbackTranslator Nothing)++-- |Variant of 'run' where an additional argument @cgigen@ specifies an action+-- taken when the script is invoked with a non-empty query string as in+-- @script-name?query-string@ +runWithHook :: CGIOptions -> ([String] -> CGI ()) -> CGI () -> IO ()+runWithHook options cgigen =+  runInternal options (fallbackTranslator (Just cgigen))++runInternal options cgigen cgiProg =+  start options $ makeServletInternal cgigen cgiProg++-- |Transform a CGI action into a servlet suitable for running from Marlow's web+-- server.+makeServlet :: CGI () -> CGIProgram+makeServlet cgiProg = +  makeServletInternal (fallbackTranslator Nothing) cgiProg++-- |Like 'makeServlet' with additional CGI generator as in 'runWithHook'.+makeServletWithHook :: ([String] -> CGI ()) -> CGI () -> CGIProgram+makeServletWithHook cgigen cgiProg =+  makeServletInternal (fallbackTranslator $ Just cgigen) cgiProg++makeServletInternal cgigen (CGI cgi) = \ info decoded_parameters ->+  let maybecgiparm = assocParm "=CGI=parm=" decoded_parameters in+  let maybecgistid = assocParm "=CGI=stid=" decoded_parameters in+  let maybejsenabl = assocParm "js_enabled" decoded_parameters in+  let clean_parameters = dropSpecialParameters decoded_parameters in+  let no_parameters = null decoded_parameters in+  do oldparm <- case maybecgiparm of+       Just cgiparm ->+         liftM read $ liftM RFC2279.decode $ decode $ Base64.decode' $ cgiparm+       Nothing -> +         return []+     key <- generateKey+     let newparm +          | no_parameters = []+	  | otherwise = (PAR_VALUES $ clean_parameters)+	  		: oldparm+	 oldstid+	  | null decoded_parameters || isNothing maybecgistid = initialStateID+	  | otherwise = Base64.decode' $ fromJust maybecgistid+	 cgistate = CGIState { inparm = reverse newparm+		             , outparm = newparm+			     , stateID = oldstid+			     , cgiInfo = info+			     , mcount = 0+			     , jsEnabled = liftM read maybejsenabl+			     , pageInfo = (initialPageInfo cgistate) {inFrame = 0}+			     , encoder = makeEncoder key+			     , cookieMap = map decodeCookie (cgiCookies info)+			     , cookiesToSend = []+			     }+	 args = cgiArgs info+	 scriptName = cgiScriptName info+	 sessionMode = cgiSessionMode info+     -- writeDebugFile "/tmp/CGIOLDPARM" (show oldparm)+     -- writeDebugFile "/tmp/CGINEWPARM" (show newparm)+     +     -- set b==False if replaying is required+     b <- case sessionMode of+       LogOnly ->+	 return False+       _ ->+	 if no_parameters then+	   do createEntry (scriptName, initialStateID) Nothing PAR_IGNORED Nothing+	      return False+	 else+           notify (scriptName, oldstid) clean_parameters (cgiHandle info)+	   -- if b is True at this point, we have found a thread to handle+	   -- this request. However, we cannot terminate at this time because+	   -- exiting will close the output handle for the other thread!+     unless b $ do+       if null args || null (head args)+	 then cgi cgistate >> return ()+	 else unCGI (cgigen $ args) cgistate >> return ()+       exitWith ExitSuccess++-- ======================================================================+-- output routines++-- |Terminates script by sending its argument to the browser.+tell :: (CGIMonad cgi, CGIOutput a) => a -> cgi ()+tell a =+  wrapCGI (rawTell a)++-- rawTell :: (CGIOutput a) => a -> CGIAction ()+rawTell a cgistate =+  -- appendFile "/tmp/CGIFRAME" ("tell/enter\n") >>+  let frameno = inFrame $ pageInfo cgistate in+  -- appendFile "/tmp/CGIFRAME" ("tell #" ++ show frameno ++ "\n") >>+  if frameno == 0 then+  do putCookies cgistate+     cgiPut (cgiHandle $ cgiInfo cgistate) a+     exitWith ExitSuccess+  else+  do let fname = frameFullPath (outparm cgistate) frameno+     h <- openFile fname WriteMode+     cgiPut h a+     hClose h+     return ((), cgistate)++-- |(experimental: continuous version) send argument to the browser.+tellContinuously :: (CGIMonad cgi, CGIOutput a) => a -> cgi ()+tellContinuously a =+  wrapCGI (rawTellContinuously a)++rawTellContinuously :: (CGIOutput a) => a -> CGIAction ()+rawTellContinuously a =+  (\cgistate -> +  let h = cgiHandle $ cgiInfo cgistate in+  do putCookies cgistate+     cgiPut h a+     -- hFlush h+     return ((), cgistate))+++-- |Terminate script by sending a HTML page constructed by monadic argument. +htell :: (CGIMonad cgi) => H.WithHTML x IO () -> cgi a+htell hma =+  wrapCGI (\cgistate ->+  do putCookies cgistate+     itell (cgiHandle $ cgiInfo cgistate) hma)+     -- never reached++rawHtell hma = +  \cgistate ->+  do putCookies cgistate+     itell (cgiHandle $ cgiInfo cgistate) hma++-- +tellError :: String -> H.Element -> CGIAction a+tellError str elems = +  rawHtell message +  where message = +	  H.standardPage str (backLink H.empty)++-- +reportError :: String -> H.WithHTML x IO () -> CGIState -> IO (a, CGIState)+reportError ttl elems cgistate =+  unCGI (htell message) cgistate+  -- never reached+  where message = +	  H.standardPage ttl (elems >> backLink H.empty)++-- |Link to previous page in browser's history. Uses JavaScript.+backLink :: Monad m => H.HTMLCons x y m ()+backLink attrs =+  hlink (URL "javascript:back()") (H.text_S "Try again..." >> attrs)++-- |Plain Hyperlink from an URL string.+hlink :: Monad m => URL -> H.HTMLCons x y m ()+hlink url subs = +  H.a_T (H.attr_SD "href" (unURL url) >> subs)++-- +fallbackTranslator mCgigen =+  docTranslator [nothing, question] $+  frameTranslator $+  nextTranslator mCgigen++-- +frameTranslator :: (CGIMonad cgi) => ([String] -> cgi ()) -> [String] -> cgi ()+frameTranslator next (name@('F':'R':'A':'M':'E':':':_):_) =+  tell (ResponseFileReference (frameDir ++ name))+frameTranslator next strs =+  next strs++-- |A /translator/ is a function @[String] -> CGI ()@. It takes the query string+-- of the URL (of type @[String]@) and translates it into a CGI+-- action. @docTranslator docs next@ +-- takes a list of 'FreeForm' documents and a next translator. It tries to+-- select a document by its 'ffName' and falls through to the+-- @next@ translator if no document matches.+docTranslator :: [FreeForm] -> ([String] -> CGI ()) -> [String] -> CGI ()+docTranslator docs next [name] =+  let f (doc : rest) =+        if name == ffName doc then tell doc else f rest+      f [] = next [name]+  in  f docs+docTranslator docs next strs =+  next strs++-- |Terminates a sequence of translators.+lastTranslator :: [String] -> CGI ()+lastTranslator =+  nextTranslator Nothing++nextTranslator Nothing _ =+  tell (Status 404 "Not Found" Nothing)+nextTranslator (Just cgigen) strs =+  cgigen strs++-- | Internal: name for the submission variable and form field+subVar :: String+subVar = "WASHsub"
+ WASH/CGI/CGI.hs view
@@ -0,0 +1,125 @@+-- © 2001-2003 Peter Thiemann+{-|+  One stop shop for the WASH\/CGI library. All high-level scripts should +  get along with importing just this module. Low-level scripts may have to +  import "RawCGI".+  -} +module WASH.CGI.CGI (+	-- * Basics+	CGI, CGIMonad+	, ask, tell, io, run, runWithOptions+	, once, forever, callWithCurrentHistory, htell, askOffline+	-- * Links and Images+	, Image, internalImage, externalImage, makeImg, makeRef, makePopupRef, makeA+	, backLink, hlink, popuplink, restart+	-- * Page Templates+	, H.standardPage, H.htmlHeader, H.html, H.cssPage, H.cssHeader+	-- * Forms and Widgets+	, HTMLField+	-- ** Form Creation+	, makeForm, standardQuery+	-- ** Form Submission+	, submit, submit0, defaultSubmit, resetField, activeInputField, activate+	, submitLink, submitLink0, defaultSubmitLink+	, submitx, DTree, dtleaf, dtnode+	-- ** Textual Input +	, inputField, textInputField, checkedTextInputField, passwordInputField, makeTextarea+	-- ** Checkbox+	, checkboxInputField+	-- ** Button+	, makeButton, RadioGroup, radioGroup, radioButton, radioError+	-- ** Image+	, imageField+	-- ** Selection Box+	, selectMultiple, selectSingle, selectBounded+	-- ** File+	, fileInputField, checkedFileInputField+	-- ** Abstract Selection+	, as_rows, as_cols, table_io, getText, unAR+	, selectionGroup, selectionButton, selectionDisplay+	, choiceGroup, choiceButton, choiceDisplay+	-- ** Handle Manipulation+	, InputField, VALID, INVALID, value, InputHandle, HasValue+	, F0 (F0), F1 (F1), F2 (F2), F3 (F3), F4 (F4), F5 (F5), F6 (F6), F7 (F7), F8 (F8)+	, FL (FL), FA (FA)+	-- ** Handle Concatenation+	, concatFields, concatFieldsWith+	-- ** Attribute Shortcuts+	, fieldSIZE, fieldMAXLENGTH, fieldVALUE+	-- * Advanced+	-- ** Installing Translators+	, runWithHook, docTranslator, lastTranslator+	-- ** Outputable Stuff+	, CGIOutput, Status(..), Location(..), FreeForm(..), FileReference (..)+	-- ** Predefined Types for Input Fields+	, Text(..), NonEmpty(..), AllDigits(..), Phone(..)+	, EmailAddress(..), CreditCardNumber(..), CreditCardExp(..)+	, Password(..), Optional(..)+	-- ** Lowlevel Stuff+	, CGIOption (..), CGIOptions, URL (..)+	-- ** Servlets+	, makeServlet, makeServletWithHook+	-- * HTML and Style+	, module WASH.CGI.HTMLWrapper+	, module WASH.CGI.Style+	-- * Experimental Stuff+	, FrameSet, FrameLayout(..), FrameSpacing(..), makeFrame, makeFrameset, framesetPage+	)+where++import WASH.CGI.CGIMonad (CGIMonad())+-- import qualified Prelude+import WASH.CGI.AbstractSelector+  	( as_rows, as_cols, table_io, getText, unAR+	, selectionGroup, selectionButton, selectionDisplay+	, choiceGroup, choiceButton, choiceDisplay+	)+import WASH.CGI.BaseCombinators+	( io, once, forever, callWithCurrentHistory, ask, askOffline+	, run, runWithOptions, runWithHook+	, tell, htell, backLink, hlink+	, docTranslator, lastTranslator+	, makeServlet, makeServletWithHook+	)+import WASH.CGI.CGITypes+	( FileReference(..), CGIOption(..), CGIOptions, URL(..)+	)+import WASH.CGI.CGIMonad (CGI)+import WASH.CGI.CGIInternals +	( makeRef, makeA, makePopupRef, popuplink+	, InputField, VALID, INVALID+	, makeForm, makeImg, Image, internalImage, externalImage+	, HTMLField, resetField, activeInputField+	, inputField, textInputField, checkedTextInputField, passwordInputField+	, checkboxInputField, fileInputField, checkedFileInputField, imageField+	, RadioGroup, radioGroup, radioButton, radioError, makeButton+	, makeTextarea+	, selectMultiple, selectSingle, selectBounded+	, fieldSIZE, fieldMAXLENGTH, fieldVALUE+	, restart+	, concatFields, concatFieldsWith+	, standardQuery+	)+import WASH.CGI.Submit98 +	( value, InputHandle, HasValue+	, F0 (F0), F1 (F1), F2 (F2), F3 (F3), F4 (F4), F5 (F5), F6 (F6), F7 (F7), F8 (F8)+	, FL (FL), FA (FA)+	, submit, submit0, defaultSubmit, DTree, submitx, dtleaf, dtnode+	, submitLink, submitLink0, defaultSubmitLink+	, activate+	)+import WASH.CGI.CGIOutput+	( CGIOutput+	)+import WASH.CGI.CGITypes+	( Status(..), Location(..), FreeForm(..)+	)+import WASH.CGI.Fields+import WASH.CGI.Style +import WASH.CGI.HTMLWrapper+  hiding (input, form, select, option, textarea, +          cssHeader, cssPage, html, htmlHeader, standardPage)+import qualified WASH.CGI.HTMLWrapper as H++import WASH.CGI.Frames +  (FrameSet, FrameLayout(..), FrameSpacing(..), makeFrame, makeFrameset, framesetPage)
+ WASH/CGI/CGIConfig.hs view
@@ -0,0 +1,33 @@+-- © 2002 Peter Thiemann+module WASH.CGI.CGIConfig where++import System.IO.Unsafe+import System++tmpDir, varDir, imageDir, emailTmpDir, frameDir, persistentDir, persistent2Dir, registryDir, keyFile, pbmPath, catProgram, sendmailProgram :: String++-- |global root for WASH data+globalRoot :: String+globalRoot =+  unsafePerformIO (catch (getEnv "HOME") (\ ioe -> return ""))++-- temporary storage+tmpDir = globalRoot ++ "/tmp/"+-- persistent, mutable storage+varDir = globalRoot ++ "/tmp/"++imageDir 	= tmpDir ++ "Images/"+emailTmpDir 	= tmpDir+frameDir	= tmpDir ++ "Frames/"+persistentDir 	= varDir ++ "Persistent/"+persistent2Dir 	= varDir ++ "Persistent2/"+transactionDir  = varDir ++ "Transactions/"+registryDir	= tmpDir ++ "REGISTRY/"+keyFile		= varDir ++ "KEYFILE"++-- path to PBMplus programs+pbmPath		= "/usr/X11R6/bin/"+-- path of cat program+catProgram	= "/bin/cat"+-- path of sendmail program+sendmailProgram	= "/usr/sbin/sendmail"
+ WASH/CGI/CGIGraphics.hs view
@@ -0,0 +1,194 @@+-- © 2001 Peter Thiemann+module WASH.CGI.CGIGraphics +  (activeImage+  ,newImage+  ,drawOval, fillOval+  ,drawRectangle, fillRectangle+  ,drawLine, drawPoint+  ,makeText+  ,gifImage, xwdImage, xpmImage, bmpImage+  ,activateImage, activateXY, activateColor+  ,overlay+  ,storeDirectory+  ,Pixel, CGIImage, ActionFun) +  where++import Maybe+import Monad+import System++import WASH.Utility.Hex+import qualified WASH.CGI.RawCGIInternal as RawCGI+import WASH.CGI.CGITypes as CGITypes+import WASH.CGI.BaseCombinators (unsafe_io)+import WASH.CGI.CGIMonad hiding (lift)+import WASH.CGI.PPM+import WASH.HTML.HTMLMonad hiding (head, div, span, map)+import WASH.Utility.Unique++import WASH.CGI.CGIConfig++storeDirectory = imageDir++ppmtogif = pbmPath ++ "ppmtogif "+pbmtext  = pbmPath ++ "pbmtext "+pnmcrop  = pbmPath ++ "pnmcrop "+pbmtopgm = pbmPath ++ "pbmtopgm 1 1 "+pgmtoppm = pbmPath ++ "pgmtoppm "+++type CGIImage  = IO CGIImage'+type ActionFun = Int -> Int -> Maybe (CGI ())+data CGIImage' = +     CGIImage'{	pixmap    :: Pixmap+              , actionFun :: ActionFun+	      }+++activeImage :: CGIImage -> WithHTML x CGI ()+activeImage img =+  do fieldName <- liftM show $ lift nextName+     (url, actFun) <- lift (flushImage img)+     input (attr "type" "image" ##+            attr "name" fieldName ##+	    attr "src" (unURL url))+     info <- lift getInfo+     let maybeSetAction = +	    do bds <- bindings info+	       x <- RawCGI.assocParm (fieldName ++ ".x") bds+	       y <- RawCGI.assocParm (fieldName ++ ".y") bds+	       act <- actFun (read x) (read y)+	       return (lift $ setAction (const act))+     fromMaybe (return ()) maybeSetAction++-- internal+flushImage :: CGIImage -> CGI (CGITypes.URL, ActionFun)+flushImage img = +  do cgi_image <- unsafe_io img+     pageInfo <- getInfo+     baseUrl <- getUrl+     case bindings pageInfo of+       Nothing ->+	 unsafe_io $ do+	   key <- inventStdKey+           let path = storeDirectory ++ key+	       ppmPath = path ++ ".ppm"+	       gifPath = path ++ ".gif"+           writeFile ppmPath (show $ pixmap cgi_image)+           system (ppmtogif ++ ppmPath ++ " > " ++ gifPath)+           return (URL (baseUrl ++ '?' : key ++ ".gif"), actionFun cgi_image)+       Just _ ->+	 return (URL "", actionFun cgi_image)++newImage :: (Int, Int) -> Pixel -> CGIImage+newImage (w, h) bg =+  return $ CGIImage' +  	{ pixmap = create w h 8 bg+	, actionFun = const (const Nothing)+	}++makeOval :: Bool -> CGIImage -> (Int, Int) -> (Int, Int) -> Pixel -> CGIImage+drawOval :: CGIImage -> (Int, Int) -> (Int, Int) -> Pixel -> CGIImage+fillOval :: CGIImage -> (Int, Int) -> (Int, Int) -> Pixel -> CGIImage+drawOval = makeOval False+fillOval = makeOval True+makeOval fill img ul lr p =+  do cgi_image <- img+     return $ cgi_image { pixmap = oval (pixmap cgi_image) ul lr p fill }++makeRectangle :: Bool -> CGIImage -> (Int, Int) -> (Int, Int) -> Pixel -> CGIImage+drawRectangle :: CGIImage -> (Int, Int) -> (Int, Int) -> Pixel -> CGIImage+fillRectangle :: CGIImage -> (Int, Int) -> (Int, Int) -> Pixel -> CGIImage+drawRectangle = makeRectangle False+fillRectangle = makeRectangle True+makeRectangle fill img ul lr p =+  do cgi_image <- img+     return $ cgi_image { pixmap = rectangle (pixmap cgi_image) ul lr p fill }++drawLine :: CGIImage -> (Int, Int) -> (Int, Int) -> Pixel -> CGIImage+drawLine img ul lr p =+  do cgi_image <- img+     return $ cgi_image { pixmap = line (pixmap cgi_image) ul lr p }++drawPoint :: CGIImage -> (Int, Int) -> Pixel -> CGIImage+drawPoint img xy p =+  do cgi_image <- img+     return $ cgi_image { pixmap = point (pixmap cgi_image) xy p }++makeText :: String -> Pixel -> CGIImage+makeText str fg =+  do key <- inventStdKey+     let path = storeDirectory ++ key+	 ppmPath = path ++ ".ppm"+	 gifPath = path ++ ".gif"+     system (pbmtext ++ "'" ++ str ++ "' | "+          ++ pnmcrop ++ "| "+	  ++ pbmtopgm ++ "| "+	  ++ pgmtoppm ++ rgb fg ++ "-black > " ++ ppmPath)+     pixmapStr <- readFile ppmPath+     return $ CGIImage'+        { pixmap = read pixmapStr+	, actionFun = const (const Nothing)+	}++rgb (r, g, b) =+  "rgb:" ++ showHex2 r ++ '/' : showHex2 g ++ '/' : showHex2 b++gifImage, xwdImage, xpmImage, bmpImage :: String -> CGIImage+gifImage gifPath =+  anyImage "gif" gifPath+xwdImage xwdPath =+  anyImage "xwd" xwdPath+xpmImage xpmPath =+  anyImage "xpm" xpmPath+bmpImage bmpPath =+  anyImage "bmp" bmpPath++-- internal+anyImage :: String -> String -> CGIImage+anyImage format anyPath =+  do key <- inventStdKey+     let path = storeDirectory ++ key+	 ppmPath = path ++ ".ppm"+     system (pbmPath ++ format ++ "toppm " ++ anyPath ++ " > " ++ ppmPath)+     pixmapStr <- readFile ppmPath+     return $ CGIImage'+     	{ pixmap = read pixmapStr+	, actionFun = const (const Nothing)+	}++activateImage :: CGIImage -> CGI () -> CGIImage+activateImage img act =+  activateXY img (const (const (Just act)))++activateXY :: CGIImage -> ActionFun -> CGIImage+activateXY img actFun =+  do cgi_image <- img+     return $ cgi_image { actionFun = actFun }++activateColor :: CGIImage -> Pixel -> CGI () -> CGIImage+activateColor img p act =+  do cgi_image <- img+     let fun x y = if pixelAt (pixmap cgi_image) x y == p +	 	   then Just act+		   else actionFun cgi_image x y+     return $ cgi_image { actionFun = fun }++overlay :: CGIImage -> CGIImage -> (Int, Int) -> Pixel -> CGIImage+overlay img1 img2 (xul, yul) p =+  do cgi1 <- img1+     cgi2 <- img2+     return $ +       cgi1 { pixmap = comp (pixmap cgi1) (pixmap cgi2) (xul, yul) p+       	    , actionFun = fun cgi1 cgi2+	    }+  where fun cgi1 cgi2 x1 y1 = +	  let x2 = x1 - xul+	      y2 = y1 - yul+	      w2 = width $ pixmap cgi2+	      h2 = height $ pixmap cgi2+	      maybeAction2 = actionFun cgi2 x2 y2+	      maybeAction1 = actionFun cgi1 x1 y1+	  in  if x2 >= 0 && y2 >= 0 && x2 < w2 && y2 < w2 && isJust maybeAction2 +	      then maybeAction2+	      else maybeAction1
+ WASH/CGI/CGIHistory.hs view
@@ -0,0 +1,104 @@+module WASH.CGI.CGIHistory where++import System.IO.Unsafe (unsafePerformIO)++import IO+import Maybe+import Monad+import Control.Concurrent+import Control.Concurrent.MVar+import qualified Data.Map as Map+-- +import WASH.Utility.SHA1+import WASH.CGI.RawCGITypes+import WASH.CGI.CGIMonad+import WASH.CGI.LogEntry++-- | standard value for timeout of interaction threads: one hundred seconds+historyTimeout :: Int+historyTimeout = 100000000++-- | comprises the name of the application and a hash value.+type StateID = (String, String)++{-# NOINLINE history #-}+history :: MVar (Map.Map StateID TableEntry)+history = unsafePerformIO $ newMVar Map.empty++data TableEntry =+    TableEntry +      { myID :: StateID		    		    -- ^ script name and hash key+      , parentID :: Maybe StateID		    -- ^ root has no parent+      , nextparm :: PARAMETER+      , timeout :: Int				    -- ^ timeout for this stage of interaction+      , threads :: MVar [MVar (CGIParameters, Handle)]-- ^ next round of parameters and output handle+      }++-- | Takes the id of the current node, the id of the father node (if any), the+-- current parameter, and (perhaps) a timeout value for the current interaction+-- and enters a corresponding record into the history table.+createEntry :: StateID -> Maybe StateID -> PARAMETER -> Maybe Int -> IO ()+createEntry myID parentID nextparm mTimeout = do+  -- putStrLn ("createEntry "++ show myID ++ " "++ show parentID ++ " " ++ show nextparm)+  threadsvar <- newMVar []+  let protoEntry = TableEntry { myID = myID+			      , parentID = parentID+			      , nextparm = nextparm+			      , timeout = fromMaybe historyTimeout mTimeout+			      , threads = threadsvar+			      }+  modifyMVar_ history (return . Map.insertWith (\ new old -> old) myID protoEntry)+  -- putStrLn ("createEntry finished")++-- | Suspends the current thread by waiting on an entry with the current node's+-- id. Returns the parameters passed to this node.+readParameters :: StateID -> IO (CGIParameters, Handle)+readParameters stateID = do+  -- putStrLn ("readParameters "++ show stateID)+  (myVar, myTimeout) <- modifyMVar history update+  myID <- myThreadId+  killerID <- forkIO (killmeOnTimeout myID myVar myTimeout)+  ch <- takeMVar myVar			    -- suspend until notify puts s.t.+  killThread killerID+  -- putStrLn ("readParameters "++ show stateID ++ " returns " ++ show ch)+  return ch+  where+    update t = do +      let Just entry = Map.lookup stateID t+      myVar <- newEmptyMVar+      modifyMVar_ (threads entry) (\ ms -> return (myVar : ms))+      return (t, (myVar, timeout entry))+    remove v t = do+      let Just entry = Map.lookup stateID t+      modifyMVar (threads entry) (\ ms -> return (filter (/= v) ms, v `elem` ms))+    killmeOnTimeout tid var timeout = do+      threadDelay timeout+      wasPresent <- withMVar history (remove var)+      when wasPresent (killThread tid)+      -- putStrLn ("killmeOnTimeout: had to kill = "++show wasPresent)+      -- otherwise thread tid is on its way to kill me++-- | Attempts to pass parameters and a handle to a thread waiting for the given+-- stateID. Returns True if successful and False if no such thread was found.+notify :: StateID -> CGIParameters -> Handle -> IO Bool+notify stateID parms hout = do+  -- putStrLn ("notify "++ show stateID ++ " "++ show parms ++ " " ++ show hout)+  b <- withMVar history update+  -- putStrLn ("notify returns "++ show b)+  return b+  where+    update t = +      case Map.lookup stateID t of+	Just entry ->+	  do maybeVar <- modifyMVar (threads entry) (return . uncons)+	     case maybeVar of+	       Just myVar -> do+		 putMVar myVar (parms, hout)+		 return True+	       Nothing ->+		 return False+	Nothing ->		   -- may happen after server restart+	  return False++uncons (x : xs) = (xs, Just x)+uncons []       = ([], Nothing)
+ WASH/CGI/CGIInternals.hs view
@@ -0,0 +1,882 @@+-- © 2001-2005 Peter Thiemann+module WASH.CGI.CGIInternals (module WASH.CGI.CGIInternals, getPathInfo)+{-- interface+  (ask		-- WithHTML x CGI a -> CGI ()+  ,tell		-- CGIOutput a => a -> CGI ()+  ,htell 	-- WithHTML x IO () -> CGI ()+  ,run		-- CGI () -> IO ()+  ,runWithHook 	-- ([String] -> CGI ()) -> CGI () -> IO ()+  )+--}+where++import Prelude hiding (head,div,span)+import qualified Prelude+import qualified List+import Maybe+import Monad+import System+import IO++import WASH.Utility.Auxiliary+import qualified WASH.Utility.Base64 as Base64+import WASH.CGI.BaseCombinators+import WASH.CGI.CookieIO+import WASH.CGI.CGIMonad+import WASH.CGI.CGIOutput+import WASH.CGI.CGITypes+import WASH.CGI.EventHandlers+import WASH.CGI.Fields+import WASH.CGI.Frames+import WASH.CGI.CGIHistory+import qualified WASH.CGI.HTMLWrapper as H hiding (map)+import WASH.CGI.Images+import WASH.Utility.JavaScript+import qualified WASH.Utility.RFC2279 as RFC2279+import qualified WASH.Utility.RFC2397 as RFC2397+import WASH.CGI.RawCGIInternal hiding (CGIEnv (..), getSessionMode)+import qualified WASH.Utility.URLCoding as URLCoding++import WASH.CGI.CGIConfig++-- ======================================================================+-- internal references++-- |Create a hyperlink to internal entity.+makeRef :: (CGIMonad cgi, Monad m)+	=> String		-- ^internal name of entity+	-> H.WithHTML x m ()	-- ^body of the reference+	-> cgi (H.WithHTML y m ())+makeRef fileName elems =+  wrapCGI (\cgistate ->+  let fileURL = url cgistate ++ '?' : fileName in+  return (hlink (URL fileURL) elems, cgistate))++-- |Create a popup hyperlink to internal entity.+makePopupRef :: (CGIMonad cgi) =>+           String		-- ^name of popup window+	-> String		-- ^internal name of entity+	-> H.HTMLCons x y cgi ()+makePopupRef name fileName elems =+  do baseUrl <- H.lift getUrl+     let fileURL = baseUrl ++ '?' : fileName+     popuplink name (URL fileURL) elems++-- |Create hyperlink to internal entity @\/path?name@.+makeA :: (CGIMonad cgi) => String -> String -> HTMLField cgi x y ()+makeA path name elems =+  do url <- H.lift getUrl+     let querystring = if null name then "" else '?' : name+	 pathstring = if null path then "" else '/' : path+	 fullurl = url ++ pathstring ++ querystring+     hlink (URL fullurl) elems++-- ======================================================================+-- input fields & forms+-- +data VALID = VALID+data INVALID = INVALID++data InputField a x = +     InputField { ifName :: String+		, ifToken :: CGIFieldName  +     		, ifFty :: String+		, ifString :: Maybe String+		, ifValue :: Maybe a+		, ifRaw :: CGIParameters+		, ifBound :: Bool	    -- True if form submitted+		}++-- |create a virtual input field from the concatenation of two input fields+concatFields :: (Reason c, Read c)+	     => InputField c INVALID -> InputField Text INVALID+  	     -> InputField c INVALID+concatFields ifa ifb = +  concatFieldsWith g ifa [ifb]+  where g sa [sb] = sa ++ sb++-- |Create a virtual input field from the result of applying a function to two+-- input fields. Parsing is applied to the result of the function call.+concatFieldsWith :: (Reason c, Read c) +		 => (String -> [String] -> String)+		 -> InputField c INVALID +		 -> [InputField Text INVALID]+                 -> InputField c INVALID+concatFieldsWith trans ifa ifbs =+  let newString = do stra <- ifString ifa+		     strbs <- mapM ifString ifbs+		     return (trans stra strbs)+      newValue  = do s <- newString+		     maybeRead s+  in +  InputField { ifName = ifName ifa	-- ++ '|' : ifName ifb+	     , ifToken = ifToken ifa+	     , ifFty = ifFty ifa+	     , ifString = newString+	     , ifValue = newValue+	     , ifRaw = ifRaw ifa+	     , ifBound = ifBound ifa && all ifBound ifbs+	     }++-- |Combine the values of separately parsed fields+combineFieldsWith2 f2 if1 if2 =+  InputField { ifName = ifName if1	-- ++ '|' : ifName if2+	     , ifToken = ifToken if1+	     , ifFty = ifFty if1+	     , ifString = Nothing+	     , ifValue = liftM2 f2 (ifValue if1) (ifValue if2)+	     , ifRaw = ifRaw if1+	     , ifBound = ifBound if1 && ifBound if2+	     }++-- transition code+name = ifName+string = ifString+valueInputField inf =+  case ifValue inf of+    Nothing -> error ("InputField { " +++		      "ifName = " ++ show (ifName inf) ++ ", " +++		      "ifString = " ++ show (ifString inf) ++ ", " +++		      "ifBound = " ++ show (ifBound inf) +++		      " }")+    Just vl -> vl+-- raw = ifRaw+-- transition code end++feither :: (a -> b) -> (c -> d) -> Either a c -> Either b d+feither f g (Left a) = Left (f a)+feither f g (Right b) = Right (g b)++-- to expose less of the implementation, the following type could be +-- propagate :: MonadPlus err => Either (err x) a -> .. Either (err x) (a, b)+propagate :: Either [err] a -> Either [err] b -> Either [err] (a,b)+propagate (Right a) (Right b) = Right (a, b)+propagate (Right a) (Left bss) = Left bss+propagate (Left ass) (Right b) = Left ass+propagate (Left ass) (Left bss) = Left (mplus ass bss)++data ValidationError =+     ValidationError { veName :: String			    -- name of erroneous field+		     , veToken :: CGIFieldName		    -- token of erroneous field+		     , veString :: Maybe String		    -- value of erroneous field+		     }++validateInputField inf =+    case ifValue inf of +      Nothing | ifBound inf -> +        Left [ValidationError (ifName inf) (ifToken inf) (ifString inf)]+      _ ->+        Right InputField{ ifName = ifName inf+			, ifToken = ifToken inf+			, ifFty  = ifFty inf+			, ifString = ifString inf+			, ifValue = ifValue inf+			, ifRaw = ifRaw inf+			, ifBound = ifBound inf+			}++-- internal+data InputType = TEXT | PASSWORD | CHECKBOX |+    RADIO | SUBMIT | RESET |+    FILE | HIDDEN | IMAGE | BUTTON+    deriving (Eq)++instance Show InputType where+  show TEXT = "text"+  show PASSWORD = "password"+  show CHECKBOX = "checkbox"+  show RADIO = "radio"+  show SUBMIT = "submit"+  show RESET = "reset"+  show FILE = "file"+  show HIDDEN = "hidden"+  show IMAGE = "image"+  show BUTTON = "button"++textual :: InputType -> Bool+textual TEXT = True+textual PASSWORD = True+textual FILE = True+textual _ = False++-- |Every input widget maps the content generator for the widget (which may+-- produce HTML elements or attributes) to the content generator of the widget. +type HTMLField cgi x y a = H.WithHTML x cgi () -> H.WithHTML y cgi a++-- |Creates a reset button that clears all fields of a form.+resetField :: (CGIMonad cgi) => HTMLField cgi x y (InputField () INVALID)+resetField = +  genericField RESET (const (Just ()))++-- |Creates a submit button. Unsafe. Internal use only.+submitField :: (CGIMonad cgi) => cgi () -> HTMLField cgi x y ()+submitField action =+  internalSubmitField False (Right action)++defaultSubmitField :: (CGIMonad cgi) => cgi () -> HTMLField cgi x y ()+defaultSubmitField action =+  internalSubmitField True (Right action)++internalSubmitField isDefault what attrs =+  do sf <- genericField SUBMIT (const (Just ())) attrs+     attachAction (ifName sf) isDefault what++attachAction fname isDefault what =+  do pageInfo <- H.lift getInfo+     let mbnds = bindings pageInfo+	 localAction = +	   case what of+	     Right action ->+	       let act = resetFrame >> action in+	       do H.lift (setAction (const act))+		  H.lift (registerAction fname (const act))+	     Left sts ->+	       let names = map veName sts+		   values = map (fromMaybe "" . veString) sts+	       in+	       do H.lift (setAction tell)			    -- CHANGE THIS+		  H.lift (registerAction fname tell)+		  H.lift (setFaulty $ zip names values)+{-- +     lift (unsafe_io (do appendFile "/tmp/CGIMBNDS" ("\nlooking for "++name sf++"\n")+			 appendFile "/tmp/CGIMBNDS" (show mbnds)))+--}+     case mbnds of+       Nothing ->+	 return ()+       Just bnds ->+	 case assocParm fname bnds of+	   Just _ ->+	     localAction+	   Nothing ->+	     case assocParm subVar bnds of+	       Just submitter |+		 submitter == fname || submitter == "" && isDefault +		 -> localAction+	       _ -> return ()+	 +-- |Creates an input field that submits the field to the browser when data is+-- entered into this field. +activeInputField :: (CGIMonad cgi, Reason a, Read a)+	=> (a -> cgi ())	-- ^Function that maps input data to a CGI action.+	-> HTMLField cgi x y ()+activeInputField actionFun attrs =+  activateI actionFun inputField attrs++-- |Attach a CGI action to the value returned by the input field. Activation+-- means that data is submitted as soon as it is entered.+activateI :: (CGIMonad cgi) =>+  (a -> cgi ()) -> HTMLField cgi x y (InputField a INVALID) -> HTMLField cgi x y ()+activateI actionFun inputField attrs =+  do js_enabled <- H.lift getJSEnabled+     let use_js = maybe True id js_enabled+     invalid_inf <- inputField (do attrs+				   when use_js $ onChange $ "WASHSubmit(this.name);")+     let r = validateInputField invalid_inf+	 rv = either Left (Right . valueInputField) r+     when (ifBound invalid_inf) $+       activateInternal actionFun (ifName invalid_inf) rv++activateInternal actionFun name what =+  case what of+    Right val -> +      let act = resetFrame >> actionFun val in+      do H.lift (setAction (const act))+	 H.lift (registerAction name (const act))+    Left sts ->+      let names = map veName sts+	  values = map (fromMaybe "" . veString) sts+      in+      do H.lift (setAction tell)			    -- CHANGE THIS+	 H.lift (setFaulty $ zip names values)+	 H.lift (registerAction name tell)++-- |Create a textual input field. Return type can be *anything* in class 'Reason'+-- and 'Read'.+inputField :: (CGIMonad cgi, Reason a, Read a) => HTMLField cgi x y (InputField a INVALID)+inputField = +  genericField TEXT (maybeRead . fromMaybe "")++maybeRead :: Read a => String -> Maybe a+maybeRead s = g (reads s)+  where g ((a,""):_) = Just a+	g _ = Nothing++-- |Create a textual input field that returns the string entered. (Avoids having+-- to put quotes around a string.)+textInputField :: (CGIMonad cgi) => HTMLField cgi x y (InputField String INVALID)+textInputField =+  genericField TEXT id++-- |Creates a textual input field that takes a custom validation function.+checkedTextInputField :: (CGIMonad cgi) => (Maybe String -> Maybe String)+			 -> HTMLField cgi x y (InputField String INVALID)+checkedTextInputField g attrs =+  genericField TEXT g attrs++-- |Like 'inputField' but the characters are not echoed on the screen.+passwordInputField :: (CGIMonad cgi, Reason a, Read a) => HTMLField cgi x y (InputField a INVALID)+passwordInputField =+  genericField PASSWORD (maybeRead . fromMaybe "")++-- |Creates a checkbox. Returns 'True' if box was checked.+checkboxInputField :: (CGIMonad cgi) => HTMLField cgi x y (InputField Bool INVALID)+checkboxInputField =+  genericField CHECKBOX g+  where g Nothing = Just False+	g (Just _) = Just True++-- |Creates a file input field. Returns a temporary 'FileReference'. The+-- 'fileReferenceName' of the result is *not* guaranteed to be persistent. The+-- application is responsible for filing it away at a safe place.+fileInputField :: (CGIMonad cgi) => HTMLField cgi x y (InputField FileReference INVALID)+fileInputField attrs =+  H.lift (setEnctype "multipart/form-data") >>+  genericField FILE (maybeRead . fromMaybe "") attrs++-- |Creates a file input field. Like 'fileInputField' but has an additional+-- parameter for additional validation of the input.+checkedFileInputField :: (CGIMonad cgi) => (Maybe FileReference -> Maybe FileReference) +			  -> HTMLField cgi x y (InputField FileReference INVALID)+checkedFileInputField filter attrs =+  H.lift (setEnctype "multipart/form-data") >>+  genericField FILE (filter . maybeRead . fromMaybe "") attrs++instance Reason FileReference where+  reason _ = "FileReference"++genericField :: (Reason a, CGIMonad cgi) => InputType -> (Maybe String -> Maybe a) -> HTMLField cgi x y (InputField a INVALID)+genericField inputType decode fieldAttrs =+  let isSUBMIT = inputType == SUBMIT +      isFILE   = inputType == FILE+  in+  do fieldName'' <- H.lift nextName+     let fieldName' = show fieldName''+	 fieldName | isSUBMIT = 's' : tail fieldName' +	 	   | otherwise = fieldName'+	 fieldType = show inputType+	 isTextual = textual inputType+     info <- H.lift getInfo+     js_enabled <- H.lift getJSEnabled+     let use_js = maybe True id js_enabled+     (explanation, result) <-+       H.input_T+	     (do H.attr_SS "type" fieldType+		 H.attr_SD "name" fieldName+		 fieldAttrs+		 -- unless isTextual $ H.attr_SD "name" fieldName+		 when (use_js && isSUBMIT) $+		   onClick ("this.form."++subVar++".value=this.name; return true")+		 attrs <- H.get_attrs+		 let [nameAttr] = [ H.attr_value a +				  | a <- attrs, H.attr_name a == "name" +				  ]+		     bds = bindings info+		     maybestring = bds >>= assocParm nameAttr+		     rawvalues = maybeToList bds >>= assocParmR nameAttr+		     mdecoded = decode maybestring+		     decoded = fromJust mdecoded+		     isBound = isJust bds+		     theReason = reason decoded+		     advice = "Enter " ++ prependArticle theReason+		     explanation = theReason ++ " expected"+		 -- H.attr_SD "washtype" (washtype decoded)+		 when (use_js && isTextual) $ do+		   onMouseOver ("self.status=" ++ jsShow advice ++ "; return true")+		   onMouseOut  ("self.status=''; return true")+		 unless (isFILE || isSUBMIT) $ case maybestring of +	           Nothing -> H.empty+		   Just str -> H.attr_SD "value" str+		 H.attr_SS "title" explanation+		 return (explanation,+		   InputField { ifName = nameAttr+			      , ifToken = fieldName''+     		  	      , ifFty = fieldType+			      , ifString = maybestring+			      , ifValue = mdecoded+			      , ifRaw = rawvalues+			      , ifBound = isBound+			      }))+     H.lift $ addField (ifName result) isTextual+--     {- obsoleted by working css stuff -}+--     when isTextual $ do+--       nothingI <- internalImage nothing explanation+--       makeImg nothingI +--         (do H.attr_SS "align" "center"+--	     H.attr_SD "name" ('i' : ifName result))+     return result++-- |generates a hyperlink that submits the current form.+internalSubmitLink :: (CGIMonad cgi) =>+  Bool -> Either [ValidationError] (cgi ()) -> H.HTMLCons x y cgi ()+internalSubmitLink isDefault what subs =+  do fieldToken <- H.lift nextName+     let fieldName = show fieldToken+	 atv = "javascript:" ++ "WASHSubmit('"++fieldName++"'); void 0;"+     H.a_T (H.attr_SS "href" atv >> subs)+     attachAction fieldName isDefault what++-- |Create an input field from an image. Returns (x,y)+-- position clicked in the image.+imageField :: (CGIMonad cgi) => Image -> HTMLField cgi x y (InputField (Int, Int) INVALID)+imageField image fieldAttrs =+  do fieldToken <- H.lift nextName+     let fieldName = show fieldToken+     H.input_T (do H.attr_SS "type" "image"+		   H.attr_SD "name" fieldName+		   H.attr_SD "src" (unURL $ imageSRC image)+		   fieldAttrs)+     H.lift $ addField fieldName False+     info <- H.lift getInfo+     return $+       let maybe_xy = +	    do bds <- bindings info+	       x <- assocParm (fieldName ++ ".x") bds+	       y <- assocParm (fieldName ++ ".y") bds+	       return (x, y)+       in+       InputField { ifName = fieldName+		  , ifToken = fieldToken+       		  , ifFty = "image"+		  , ifString = do (x, y) <- maybe_xy+				  return ("(" ++ x ++ "," ++ y ++ ")")+		  , ifValue  = do (x, y) <- maybe_xy+				  return (read x, read y)+     		  , ifRaw = []+		  , ifBound = isJust (bindings info)+		  }++-- a virtual field that never appears on the screen+data RadioGroup a x =+     RadioGroup { radioName   :: String+		, radioToken  :: CGIFieldName+                , radioString :: Maybe String+		, radioValue  :: Maybe a+		, radioBound  :: Bool+		}++validateRadioGroup rg =+  case radioValue rg of +    Nothing | radioBound rg -> +      Left [ValidationError (radioName rg) (radioToken rg) (radioString rg)]+    _ ->+      Right RadioGroup  { radioName = radioName rg+			, radioToken = radioToken rg+			, radioString = radioString rg+			, radioValue = radioValue rg+			, radioBound = radioBound rg+			}++valueRadioGroup rg =+  case radioValue rg of+    Nothing -> error ("RadioGroup { " +++		      "radioName = " ++ show (radioName rg) ++ ", " +++		      "radioString = " ++ show (radioString rg) ++ ", " +++		      "radioBound = " ++ show (radioBound rg) +++		      " }")+    Just vl -> vl++-- |Create a handle for a new radio group. /This handle is invisible on the screen!/+radioGroup :: (CGIMonad cgi, Read a) => H.WithHTML x cgi (RadioGroup a INVALID)+radioGroup =+  do token <- H.lift nextName+     let fieldName = show token+     info <- H.lift getInfo+     H.lift $ addField fieldName False+     let bds = bindings info+	 maybeString = bds >>= assocParm fieldName+	 maybeVal = maybeString >>= (g . reads . URLCoding.decode)+	 g ((a,""):_) = Just a+	 g _ = Nothing+     return $+       RadioGroup { radioName = fieldName+		  , radioToken = token+		  , radioString = maybeString+		  , radioValue = maybeVal+		  , radioBound = isJust bds+		  }++-- |Create a new radio button and attach it to an existing 'RadioGroup'.+radioButton :: (Show a, Monad cgi) => RadioGroup a INVALID -> a -> HTMLField cgi x y ()+radioButton rg val fieldAttrs =+  H.input_T (do H.attr_SS "type" "radio"+		H.attr_SD "name" (radioName rg)+		H.attr_SD "value" (URLCoding.encode (show val)) +		fieldAttrs)++-- |Create and place the error indicator for an existing 'RadioGroup'. Becomes+-- visible only if no button of a radio group is pressed.+radioError :: (CGIMonad cgi) => RadioGroup a INVALID -> H.WithHTML x cgi ()+radioError rg = +  let name = radioName rg in+  do im <- internalImage nothing "Select exactly one button"+     makeImg im (H.attr "align" "center" >> H.attr "name" ('i' : name))++-- buttons++-- |Create a single button.+makeButton :: (CGIMonad cgi) => HTMLField cgi x y (InputField Bool INVALID)+makeButton fieldAttrs =+  let fieldType = "button" in+  do fieldToken <- H.lift nextName+     let fieldName = show fieldToken+     H.input_T (do H.attr_SS "type" fieldType+		   H.attr_SD "name" fieldName +		   fieldAttrs)+     H.lift $ addField fieldName False+     info <- H.lift getInfo+     let bds = bindings info+	 maybeString = bds >>= assocParm fieldName+	 maybeVal = +	   case bds of+	     Nothing -> Nothing+	     Just parms ->+	       case maybeString of+	         Nothing -> Just False+		 Just _  -> Just True+     return $+       InputField { ifName = fieldName+		  , ifToken = fieldToken+     		  , ifFty = fieldType+		  , ifString = maybeString+		  , ifValue = maybeVal+		  , ifRaw = []+		  , ifBound = isJust bds+		  }++-- form+-- multiple arguments formed according to CGI 1.1 rev 3 spec+-- http://cgi-spec.golux.com/draft-coar-cgi-v11-03-clean.html#5.0++constructQuery url [] =+  url+constructQuery url args =+  url ++ '?' : concat (List.intersperse "+" (map URLCoding.encode args))++-- |Wraps an HTML form around its arguments. All standard attributes are+-- computed and need not be supplied explicitly.+makeForm :: (CGIMonad cgi) => H.WithHTML x cgi a -> H.WithHTML y cgi ()+makeForm attrs_elems = +  makeFormWithErrorMark+    -- ["style.backgroundColor='red'", "style.borderColor='black'"]+    ["className='faultyinput'"]+    attrs_elems++makeFormWithErrorMark errorMarks attrs_elems = do+  url <- H.lift getUrl+  args <- H.lift getCGIArgs+  js_enabled <- H.lift getJSEnabled+  let use_js = maybe True id js_enabled+  when use_js $ H.script_S +    (do H.attr_SS "type" "text/javascript"+	H.comment $+	      "\n" +++	      "var SubmitAction=[];" ++ +	      "function OnSubmit(){" +++	      "var r=true;" +++	      "for(var i=0;i<SubmitAction.length;i++){r=r&&SubmitAction[i]();};" ++ +	      "return r;};"+++	      "function WASHSubmit(fn){" +++	      "var ff = document.forms[0];" +++	      "ff."++subVar++".value=fn;" +++	      "ff.submit();" +++	      "}" +++	      "\n// "+	     )+  jsprog <- H.form_T $+    do H.attr_SD "action" (constructQuery url args)+       H.attr_SS "method" "post"+       when use_js $ onSubmit ("return OnSubmit();")+       attrs_elems+       H.attr_SS "target" "_self"		    -- ensure target attr is present+       -- formname <- liftM show $ H.lift nextName+       info <- H.lift getInfo+       parm <- H.lift getParm+       stid <- H.lift getStateID+       sessionMode <- H.lift getSessionMode+       encoder <- H.lift getEncoder+       fields <- H.lift getFields+       let ff = faultyfields info+	   realparm | null ff   = parm+                  | otherwise = tail parm+	   enabledString =+	     case js_enabled of+	       Just True -> "True"+	       _ -> "False"+       H.input_S+	 (do H.attr_SS "type" "hidden"+	     H.attr_SS "name" "js_enabled"+	     H.attr_SS "value" enabledString)+       H.input_S+	 (do H.attr_SS "type" "hidden"+	     H.attr_SS "name" subVar+	     H.attr_SS "value" "")+       when (sessionNeedsLog sessionMode) $+	 H.input_S +	 (do H.attr_SS "type" "hidden"+	     H.attr_SS "name" "=CGI=parm="+	     H.attr_SD "value"+	       (Base64.encode' $ encoder $ RFC2279.encode $ show $ realparm))+       when (sessionNeedsState sessionMode) $+	 H.input_S +	 (do H.attr_SS "type" "hidden"+	     H.attr_SS "name" "=CGI=stid="+	     H.attr_SD "value" (Base64.encode' stid))+       let +	   checkForJS =+	     case js_enabled of+	       Nothing ->+		 "document.forms[0].js_enabled.value='True';"+	       _ -> ""+           iFields = [iname | (iname@('f':_), True) <- fields]+	   questionURL = url ++ '?' : ffName question+	   hilight =+	    case iFields of+	     [] -> []+	     name':_ ->  ["document.forms[0]." ++ name' ++ ".focus();"+	 		 ,"document.forms[0]." ++ name' ++ ".select();"]+	   markAsFaulty (fname, fvalue) | fname `elem` iFields =+	     "if(document.i" ++ fname ++ ")" +++	     "document.i" ++ fname ++ ".src = " ++ jsShow questionURL ++ ";" +++	     "else{" +++	     (let f mark = "document.forms[0]." ++ fname ++ "." ++ mark ++ ";" in+	     List.concatMap f errorMarks) +++	     "}"+	    | otherwise =+	     "popupstr += " +	     ++ jsShow ("In a previous form, the field " ++ fname ++ +			" had an unparsable input value: " ++ fvalue ++ "\n")+	     ++ ";"+	   jsprog | null ff = hilight+		| otherwise =+	    "popupstr = '';"+	    : map markAsFaulty ff+	    ++ "if (popupstr != '') alert(popupstr + 'Please go back and reenter!');"+	    : hilight+       when (not (null ff)) $ H.comment_T ("Faultyfields: " ++ show ff)+       -- H.attr_SD "name" formname+       H.attr_SD "enctype" (enctype info)+       return (checkForJS : jsprog)+  when (use_js && not (null jsprog)) $+      H.script_T+	 (do H.attr_SS "type" "text/javascript"+	     H.rawtext_S "<!-- "+	     H.rawtext ('\n' : unlines jsprog)+	     H.rawtext_S "// -->")++-- textarea++-- |Create a text area with a preset string.+makeTextarea :: (CGIMonad cgi) => String -> HTMLField cgi x y (InputField String INVALID)+makeTextarea fieldValue fieldAttrs =+  do token <- H.lift nextName+     info <- H.lift getInfo+     let bds = bindings info+	 mvalue = bds >>= assocParm name+	 name = show token+	 displayValue = fromMaybe fieldValue mvalue+     H.textarea_T (do H.attr_SD "name" name+		      H.text_S displayValue+		      fieldAttrs)+     return $+       InputField { ifName = name+		  , ifToken = token+       		  , ifFty = "textarea"+		  , ifString = mvalue+		  , ifValue = mvalue+		  , ifRaw = maybeToList bds >>= assocParmR name+		  , ifBound = isJust bds+		  }++-- select++selectTags = map (('o':) . show) [(1::Int)..] ++-- |Create a selection box where multiple entries can be selected.+selectMultiple :: (CGIMonad cgi, Eq a)+	=> (a -> String)	-- ^function to display values of type a+	-> [a]			-- ^list of preselected entries+	-> [a]			-- ^list of all possible entries+	-> (Int, Int)		-- ^(min, max) number of fields that must be selected +	-> HTMLField cgi x y (InputField [a] INVALID)+selectMultiple shw defs opts (minSel, maxSel) attrs =+  do token <- H.lift nextName+     let name = show token+     info <- H.lift getInfo+     let bds = bindings info+	 rawvalues = maybeToList bds >>= assocParmR name+	 g ('o':i:rest) = i /= '0' +	 g _ = False+	 inputs = filter g $ map fieldContents rawvalues+	 values = inputs >>=+		  (maybeToList . flip List.elemIndex selectTags) >>=+		  (\i -> [opts !! i])+	 len = length inputs+	 mvalue | minSel <= len && len <= maxSel = Just values+	        | otherwise = Nothing+	 revisedDefaults | isJust bds && not (null inputs) = values+	 		 | otherwise = defs+     let makeoption (opt, tag) = +	   H.option_T (do H.text (shw opt)+			  H.attr_SD "value" tag+			  when (opt `elem` revisedDefaults) $+			       H.attr_SS "selected" "selected")+	 makeChoice :: Int -> String+	 makeChoice n | n == 0 = "no choice"+                   | n == 1 = "1 choice"+		   | n == maxBound = "arbitrary many choices"+		   | otherwise = show n ++ " choices"+	 makeRange :: Int -> Int -> String+	 makeRange lo hi | lo == maxBound = "Arbitrary many choices"+                      | lo == hi = "Exactly " ++ makeChoice lo+                      | otherwise = "Minimum " ++ makeChoice lo +++		      		    "; maximum " ++ makeChoice hi+     H.select_T+       (do attrs+	   H.attr_SD "name" name+	   when (maxSel > 1) $+		H.attr_SS "multiple" "multiple"+	   when (null defs && minSel > 0) $+		H.option_S (do H.text_S "--"+			       H.attr_SS "value" "o0")+	   mapM_ makeoption (zip opts selectTags))+     im <- internalImage nothing (makeRange minSel maxSel)+     makeImg im (do H.attr_SS "align" "center"+		    H.attr_SD "name" ('i' : name))+     return $ +       InputField { ifName = name+		  , ifToken = token+       		  , ifFty = "select"+		  , ifString = Nothing -- fmap show value+		  , ifValue = mvalue+		  , ifRaw = rawvalues+		  , ifBound = isJust bds+		  }++-- |Create a selection box where exactly one entry can be selected.+selectSingle :: (CGIMonad cgi, Eq a)+	=> (a -> String)	-- ^function to display values of type a+	-> Maybe a		-- ^optional preselected value+	-> [a]			-- ^list of all possible values+	-> HTMLField cgi x y (InputField a INVALID)+selectSingle shw mdef opts attrs =+  do inf <- selectMultiple shw (maybeToList mdef) opts (1,1) attrs+     return $+       InputField { ifName = ifName inf+		  , ifToken = ifToken inf+       		  , ifFty = "select"+		  , ifString = ifString inf+		  , ifValue = fmap Prelude.head (ifValue inf)+		  , ifRaw = ifRaw inf+		  , ifBound = ifBound inf+		  }++-- |Selection box for elements of a "Bounded" type. Argument is the optional+-- preselected value.+selectBounded :: (CGIMonad cgi, Enum a, Bounded a, Read a, Show a, Eq a) =>+		 Maybe a -> HTMLField cgi x y (InputField a INVALID)+selectBounded def =+  selectSingle show def [minBound..maxBound]+     +-- ======================================================================+-- attributes++-- |Create a 'SIZE' attribute from an 'Int'.+fieldSIZE :: Monad m => Int -> H.WithHTML x m ()+fieldSIZE i = H.attr_SD "size" (show i)++-- |Create a 'MAXLENGTH' attribute from an 'Int'.+fieldMAXLENGTH :: Monad m => Int -> H.WithHTML x m ()+fieldMAXLENGTH i = H.attr_SD "maxlength" (show i)++-- |Create a 'VALUE' attribute from any 'Show'able.+fieldVALUE :: (Monad m, Show a) => a -> H.WithHTML x m ()+fieldVALUE a = H.attr_SD "value" (show a)+++-- Images++data Image =+  Image { imageSRC :: URL+  	, imageALT :: String+	}++-- |Reference to internal image.+internalImage :: (CGIMonad cgi) =>+	   FreeForm		-- ^the raw image+	-> String		-- ^alternative text+	-> H.WithHTML x cgi Image+internalImage ff alttext =+  do baseUrl <- H.lift getUrl+     externalImage (URL (baseUrl ++ '?' : ffName ff)) alttext++-- |Reference to internal image via data URL (small images, only).+dataImage :: (CGIMonad cgi) =>+	   FreeForm		-- ^the raw image+	-> String		-- ^alternative text+	-> H.WithHTML x cgi Image+dataImage ff alttext =+  let url = URL (RFC2397.encode (ffContentType ff, ffRawContents ff)) in+  externalImage url alttext++-- |Reference to internal image via javascript URL (does not seem to work).+jsImage :: (CGIMonad cgi) =>+	   FreeForm		-- ^the raw image+	-> String		-- ^alternative text+	-> H.WithHTML x cgi Image+jsImage ff alttext =+  let url = URL ("javascript:" ++ jsShow (ffRawContents ff)) in+  externalImage url alttext++-- |Reference to image by URL.+externalImage :: (CGIMonad cgi) =>+	   URL			-- ^URL of image+	-> String		-- ^alternative text+	-> H.WithHTML x cgi Image+externalImage url alttext =+     return $ Image { imageSRC = url+     		    , imageALT = alttext+		    }++-- |Create an inline image.+makeImg :: (Monad cgi) => Image -> HTMLField cgi x y ()+makeImg image attrs = +     H.img_T (do H.attr_SD "src" (unURL $ imageSRC image)+		 H.attr_SD "alt" (imageALT image)+		 H.attr_SD "title" (imageALT image)+		 attrs)+++-- |Hyperlink that creates a named popup window from an URL string.+popuplink :: Monad m => String -> URL -> H.HTMLCons x y m ()+popuplink name url subs = +  let atv = "javascript:window.open(" +++            jsShow (unURL url) ++ "," +++	    jsShow name +++	    "); void(0);" in+  H.a_T (H.attr_SD "href" atv >> subs)++-- |restart application.+restart :: (CGIMonad cgi) => cgi ()+restart = +  do myurl <- getUrl+     tell (Location $ URL myurl)++-- |Convenient workhorse. Takes the title of a page and a monadic HTML value for+-- the contents of the page. Wraps the contents in a form so that input fields+-- and buttons may be used inside.+standardQuery :: (CGIMonad cgi) => String -> H.WithHTML x cgi a -> cgi ()+standardQuery ttl elems =+  ask (H.standardPage ttl (makeForm elems))++-- +debug message = unsafe_io $+  do putStrLn "content-type: text/plain"+     putStrLn ""+     putStrLn message+     putStrLn "------------------------------------------------------------"+-- +prependArticle "" = ""+prependArticle xs@(x:_) =+  if x `elem` "aeiouAEIOU" then "an " ++ xs else "a " ++ xs+
+ WASH/CGI/CGIMonad.hs view
@@ -0,0 +1,209 @@+{-# OPTIONS_GHC -fno-monomorphism-restriction #-}+-- © 2001- 2005 Peter Thiemann+-- |Definition of the monad underlying the CGI library.+module WASH.CGI.CGIMonad+where++import Maybe++import Control.Monad.Fix++import WASH.CGI.CGITypes+import WASH.HTML.HTMLMonad hiding (span, map, div, head)+import WASH.CGI.LogEntry+import WASH.CGI.RawCGIInternal hiding (contentType)+import qualified WASH.Utility.SHA1 as SHA1++newtype CGI a = CGI { unCGI :: CGIAction a }+type CGIAction a = CGIState -> IO (a, CGIState)+data CGIState+  = CGIState { inparm   :: [PARAMETER]+	     , outparm  :: [PARAMETER]+	     , stateID  :: String+	     , mcount	:: Int+	     , cgiInfo  :: CGIInfo+	     , pageInfo :: PageInfo+	     , jsEnabled :: Maybe Bool+	     , encoder  :: String -> String+	     , cookieMap     :: [(String, (Maybe String, Maybe String))]+	     , cookiesToSend :: [String]+	     }++data PageInfo =+     PageInfo { count      :: Int+     	      , nextaction :: Element -> CGIAction ()+	      , actionTable :: [(String, Element -> CGIAction ())]+	      , bindings   :: Maybe CGIParameters+	      , enctype    :: String+	      , inFrame    :: Int+	      , allFields  :: [(String, Bool)]+	      , faultyfields :: [(String, String)]+	      }++data CGIFieldName =+     CGIFieldName { fnMcount :: Int, fnCount :: Int }++instance Show CGIFieldName where+  showsPrec i cfn = showChar 'f' .+                    shows (fnMcount cfn) .+		    showChar 'x' .+		    shows (fnCount cfn)++args = cgiArgs . cgiInfo+url = unURL . cgiUrl . cgiInfo+contentType = cgiContentType . cgiInfo++sessionMode = cgiSessionMode . cgiInfo++fromCGIstate select =+  wrapCGI $ \cgistate ->+  return (select cgistate, cgistate)++getCGIArgs = fromCGIstate args+getUrl = fromCGIstate url+getParm = fromCGIstate outparm+getStateID = fromCGIstate stateID+getInfo = fromCGIstate pageInfo+getEncoder = fromCGIstate encoder+getJSEnabled = fromCGIstate jsEnabled+getScriptName = fromCGIstate (cgiScriptName . cgiInfo)+getPathInfo = fromCGIstate (cgiPathInfo . cgiInfo)+getHandle = fromCGIstate (cgiHandle . cgiInfo)+getFields = fromCGIstate (reverse . allFields . pageInfo)+getMcount = fromCGIstate mcount+getSessionMode = fromCGIstate sessionMode++-- | wrapper to transform IO computation to CGIAction+wrapIO :: IO a -> CGIAction a+wrapIO ioa = \ cgistate -> ioa >>= \ a -> return (a, cgistate)++-- | lift IO monad to CGI monad+lift :: IO a -> CGI a+lift = CGI . wrapIO++inc = +  wrapCGI $ \cgistate ->+  let info = pageInfo cgistate in+  return (info +         ,cgistate { pageInfo = info { count = count info + 1}})++setAction :: (CGIMonad cgi) => (Element -> cgi ()) -> cgi ()+setAction actionFun =+  wrapCGI $ \cgistate ->+  return (()+         ,cgistate { pageInfo = (pageInfo cgistate) { nextaction = unwrapCGI . actionFun }})++registerAction :: (CGIMonad cgi) => String -> (Element -> cgi ()) -> cgi ()+registerAction submitter actionFun =+  wrapCGI $ \cgistate ->+  let pi = pageInfo cgistate+      pi' = pi { actionTable = (submitter, unwrapCGI . actionFun) : actionTable pi }+  in return ((), cgistate { pageInfo = pi'})++incFrame :: (CGIMonad cgi) => cgi Int+incFrame =+  wrapCGI $ \cgistate ->+  let info = pageInfo cgistate+      lastFrame = inFrame info+      nextFrame = lastFrame + 1+  in+  return (nextFrame+         ,cgistate { pageInfo = info { inFrame = nextFrame }})++resetFrame :: (CGIMonad cgi) => cgi ()+resetFrame =+  wrapCGI $ \cgistate ->+  let info = pageInfo cgistate+  in+  return (()+         ,cgistate { pageInfo = info { inFrame = 0 }})++setEnctype :: (CGIMonad cgi) => String -> cgi ()+setEnctype contentType =+  wrapCGI $ \cgistate ->+  return (()+         ,cgistate { pageInfo = (pageInfo cgistate) { enctype = contentType } })++setFaulty :: (CGIMonad cgi) => [(String, String)] -> cgi ()+setFaulty ss =+  wrapCGI $ \cgistate ->+  return (()+         ,cgistate { pageInfo = (pageInfo cgistate) { faultyfields = ss } })++instance Monad CGI where+  return a = +	CGI ( \cgistate -> return (a, cgistate))+  CGI cgi >>= f = +	CGI ( \cgistate -> +	    cgi cgistate >>= \ (x, cgistate') ->+	    unCGI (f x) cgistate')++-- contributed by Frederik Eaton <frederik@ofb.net>+instance MonadFix CGI where+  mfix f = CGI (\s ->+		mfix (\x -> (unCGI (f x)) s >>= (return.fst))+		>>= (\x -> return (x,s)))+++class Monad cgi => CGIMonad cgi where+  wrapCGI :: CGIAction a -> cgi a+  unwrapCGI :: cgi a -> CGIAction a+  chooser :: a -> a -> cgi a++instance CGIMonad CGI where+  wrapCGI = CGI+  unwrapCGI = unCGI+  chooser x y = return x+++nextName :: (CGIMonad cgi) => cgi CGIFieldName+nextName =+  do mc <- getMcount+     pageInfo <- inc+     return CGIFieldName { fnMcount = mc, fnCount = count pageInfo }++addField :: (CGIMonad cgi) => String -> Bool -> cgi ()+addField s f =+  wrapCGI ( \cgistate ->+  	let info = pageInfo cgistate in+	return ((), cgistate { pageInfo = info { allFields = (s,f): allFields info }}))++-- +initialPageInfo cgistate =+  let bnds = listToMaybe [ parms | PAR_VALUES parms <- inparm cgistate ]+  in  PageInfo+  	{ count = 0+	, nextaction = \ _ st -> return ((), st)+	, actionTable = []+	, bindings = bnds+	, enctype = contentTypeUrlencoded+	, inFrame = inFrame (pageInfo cgistate)+	, allFields = []+	, faultyfields = []+	}++dropFirstPARVALUES parms =+  let f rps [] = error "dropFirstPARVALUES: no PAR_VALUES found"+      f rps (p : ps) = +	case p of+	  PAR_VALUES _ ->+	    (p, reverse rps ++ ps)+	  _ ->+	    f (p : rps) ps+  in  f [] parms++nextCGIState cgistate = cgistate'+  where +    (newparm, inparm') = dropFirstPARVALUES (inparm cgistate)+    cgistate' = cgistate { inparm = inparm'+			 , stateID = nextstid (stateID cgistate) newparm+			 , mcount = mcount cgistate + 1+			 , pageInfo = (initialPageInfo cgistate')+			     	{ inFrame = inFrame (pageInfo cgistate) }+			 }+-- +initialStateID = "00000000000000000000"++nextstid oldstid parm =+  SHA1.sha1 (oldstid ++ show parm)+
+ WASH/CGI/CGIOutput.hs view
@@ -0,0 +1,132 @@+-- © 2001, 2002 Peter Thiemann+-- |Defines the class 'CGIOutput' of data types that can be output from a CGI+-- program. +module WASH.CGI.CGIOutput where++import IO+import Maybe+import Monad+import System++import WASH.Utility.Auxiliary+import WASH.Utility.BulkIO (rawHandleCopy)+import qualified WASH.CGI.Debug as Debug+import qualified WASH.Utility.RFC2279 as RFC2279++import qualified WASH.Utility.Shell as Shell++import WASH.CGI.CGIConfig+import WASH.CGI.CGITypes+import WASH.CGI.HTMLWrapper hiding (head, div, span, map)+import WASH.HTML.HTMLTemplates++-- import qualified PostElementAction++-- |(internal) takes an output handle and a document without forms and input+-- widgets, displays the document with suitable mime type and encoding, and+-- terminates the program+itell :: Handle -> WithHTML x IO () -> IO a+itell h hma = do elem <- build_document hma+		 cgiPut h elem+		 exitWith ExitSuccess++-- +class CGIOutput a where+  cgiPut' :: Handle -> a -> IO ()+  cgiPutList :: Handle -> [a] -> IO ()+  +  cgiPutList h xs = cgiPutList h xs++cgiPut :: CGIOutput a => Handle -> a -> IO ()+cgiPut h x =+  do cgiPut' h x++instance CGIOutput a => CGIOutput [a] where+  cgiPut' h xs = cgiPutList h xs++-- instance CGIOutput Element where+instance CGIOutput ELEMENT_ where+  cgiPut' h x = hPutElement h x++instance CGIOutput Char where+  cgiPut' h ch = cgiPutList h [ch]+  cgiPutList h x = hPutListChar h x++instance CGIOutput FileReference where+  cgiPut' h x = hPutFileReference h x++instance CGIOutput ResponseFileReference where+  cgiPut' h x = hPutResponseFileReference h x++instance CGIOutput Status where+  cgiPut' h x = hPutStatus h x+	  +instance CGIOutput Location where+  cgiPut' h x = hPutLocation h x++instance CGIOutput FreeForm where+  cgiPut' h x = hPutFreeForm h x++-- ------------------------------------------------------------++hPutElement h elem =+    do hPutStrLn h "Content-Type: text/html; charset=utf-8"+       -- hPutStrLn h "Content-Type: application/xhtml+xml; charset=utf-8"+       -- This MIME type does not work with Mozilla 1.6. It says+       -- "This XML file does not appear to have any style information associated+       -- with it. The document tree is shown below."+       hPutStrLn h ""+       hPutStr h $ RFC2279.encode $ show elem+       -- PostElementAction.postElementAction h+       let new h = hPutStrLn h (showTemplatified elem "")+	   old h = hPutStrLn h $ RFC2279.encode $ show elem+       Debug.logOutput "OLD" old+       -- Debug.logOutput "NEW" new++hPutListChar h str =+    do hPutStrLn h "Content-Type: text/plain; charset=utf-8"+       hPutStrLn h ""+       hPutStr h $ RFC2279.encode str++hPutFileReference h fr =+    do hPutStr h "Content-Type: "+       hPutStrLn h (fileReferenceContentType fr)+       hPutStrLn h ""+       hFlush h+       hin <- openFile (fileReferenceName fr) ReadMode+       rawHandleCopy hin h+       hClose hin++hPutResponseFileReference h (ResponseFileReference fname) =+    do hFlush h+       hin <- openFile fname ReadMode+       rawHandleCopy hin h+       hClose hin++hPutStatus h (Status status reason_phrase elems) =+    do hPutStr h "Status: "+       hPutStr h status_str+       hPutStr h " "+       hPutStrLn h reason_phrase+       case elems of+         Nothing -> hPutStrLn h ""+	 Just _  -> itell h message+    where status_str = show status+	  ttl = "Error: " ++ status_str ++ ' ' : reason_phrase+	  message = standardPage ttl (fromJust elems)++hPutLocation h (Location url) =+    do hPutStr h "Location: "+       hPutStrLn h (unURL url)+       hPutStrLn h ""++hPutFreeForm h (FreeForm fileName contentType rawContents) =+    do hPutStr h "Content-Type: "+       hPutStr h contentType+       when (not (null fileName)) $+         do hPutStr h " ;name=\""+	    hPutStr h fileName+	    hPutStr h "\""+       hPutStrLn h ""+       hPutStrLn h ""+       hPutStr h rawContents
+ WASH/CGI/CGITypes.hs view
@@ -0,0 +1,64 @@+-- © 2001, 2002 Peter Thiemann+-- |Types of outputable data.+module WASH.CGI.CGITypes where++import WASH.CGI.HTMLWrapper (WithHTML)++newtype URL = URL { unURL :: String }++data FileReference =+     FileReference { fileReferenceName :: FilePath+     		   -- ^ valid local filename where this file can be accessed+     		   , fileReferenceContentType :: String+		   , fileReferenceExternalName :: String+		   }+     deriving (Show, Read)++-- |Assumes that file contains correctly formatted HTTP Response starting with+-- Content-Type. Used internally to implement frames.+data ResponseFileReference =+     ResponseFileReference FilePath++data Status = Status { statusCode :: Int		    -- ^ status code+		     , statusReason :: String		    -- ^ reason phrase+		     , statusContent :: Maybe (WithHTML () IO ())   -- ^ more explanation+		     }++newtype Location = Location URL				    -- ^ redirection++data FreeForm =+     FreeForm	{ ffName :: String			    -- ^ internal name+		, ffContentType :: String		    -- ^ MIME type+		, ffRawContents :: String		    -- ^ contents as octet stream+		}++data CGIOption+  = NoPort	-- ^ do not include port number in generated URLs+  | AutoPort	-- ^ include automatically generated port number in generated URLs (default)+  | Port Int	-- ^ use this port number in generated URLs++  | NoHttps     -- ^ do not attempt to detect Https+  | AutoHttps   -- ^ autodetect Https by checking for port number 443 and env var HTTPS (default)++  | FullURL     -- ^ generate full URL including scheme, host, and port+  | PartialURL  -- ^ generate absolute path URL, only (default)++  | SessionMode { unSessionMode :: SessionMode }+  deriving (Eq, Show)+type CGIOptions = [CGIOption]++data SessionMode+  = LogOnly	-- ^ generate log in hidden field, full server replay (default)+  | StateIDOnly	-- ^ generate state id, server threads without replay (only with WSP)+  | LogAndState -- ^ log and state id, server threads with replay as fallback (only with WSP)+  deriving (Eq, Show, Read, Bounded, Enum)++sessionNeedsLog :: SessionMode -> Bool+sessionNeedsLog LogOnly = True+sessionNeedsLog StateIDOnly = False+sessionNeedsLog LogAndState = True++sessionNeedsState :: SessionMode -> Bool+sessionNeedsState LogOnly = False+sessionNeedsState StateIDOnly = True+sessionNeedsState LogAndState = True
+ WASH/CGI/CGIXX.hs view
@@ -0,0 +1,102 @@+{-# OPTIONS -fglasgow-exts #-}+-- © 2001, 2002 Peter Thiemann+{-|+  One stop shop for the WASH\/CGI library. All high-level scripts should +  get along with importing just this module. Low-level scripts may have to +  import "RawCGI". This version requires features beyond Haskell98, in particular +  multi parameter type classes and existential types.+  -} +module WASH.CGI.CGIXX (+	-- * Basics+	CGI+	, ask, tell, io, run+	, once, forever, htell, askOffline+	-- * Links and Images+	, Image, internalImage, externalImage, makeImg, makeRef, makeA+	, backLink, hlink+	-- * Forms and Widgets+	, HTMLField+	-- ** Form Creation+	, makeForm, standardQuery+	-- ** Form Submission+	, submit, submit0, defaultSubmit, resetField, activeInputField, activate+        , submitx, DTree, dtleaf, dtnode+	-- ** Textual Input +	, inputField, textInputField, checkedTextInputField, passwordInputField, makeTextarea+	-- ** Checkbox+	, checkboxInputField+	-- ** Button+	, makeButton, RadioGroup, radioGroup, radioButton, radioError+	-- ** Image+	, imageField+	-- ** Selection Box+	, selectMultiple, selectSingle, selectBounded+	-- ** File+	, fileInputField, checkedFileInputField+	-- ** Handle Manipulation+	, InputField, VALID, INVALID+	-- ** Attribute Shortcuts+	, fieldSIZE, fieldMAXLENGTH, fieldVALUE+	-- * Advanced+	-- ** Installing Translators+	, runWithHook, docTranslator, lastTranslator+	-- ** Outputable Stuff+	, CGIOutput, Status(..), Location(..), FreeForm(..), FileReference (..)+	-- ** Predefined Types for Input Fields+	, Text(..), NonEmpty(..), AllDigits(..)+	, EmailAddress(..), CreditCardNumber(..), CreditCardExp(..)+	-- ** Lowlevel Options+	, CGIOption (..), CGIOptions+	-- ** Servlets+	, makeServlet, makeServletWithHook+	-- * HTML and Style+	, module WASH.CGI.HTMLWrapper+	, module WASH.CGI.Style+	-- * Experimental Stuff+	, FrameSet, FrameLayout(..), FrameSpacing(..), makeFrame, makeFrameset, framesetPage+	)+where++import qualified Prelude+import WASH.CGI.BaseCombinators+	( io, once, forever, callWithCurrentHistory, ask, askOffline+	, run, runWithOptions, runWithHook+	, tell, htell, backLink, hlink+	, docTranslator, lastTranslator+	, makeServlet, makeServletWithHook+	)+import WASH.CGI.CGITypes+	( FileReference(..), CGIOption(..), CGIOptions+	)+import WASH.CGI.CGIMonad (CGI)+import WASH.CGI.CGIInternals +	( makeRef, makeA, makePopupRef, popuplink+	, InputField, VALID, INVALID+	, makeForm, makeImg, Image, internalImage, externalImage+	, HTMLField, resetField, activeInputField+	, inputField, textInputField, checkedTextInputField, passwordInputField+	, checkboxInputField, fileInputField, checkedFileInputField, imageField+	, RadioGroup, radioGroup, radioButton, radioError, makeButton+	, makeTextarea+	, selectMultiple, selectSingle, selectBounded+	, fieldSIZE, fieldMAXLENGTH, fieldVALUE+	, restart+	, concatFields, concatFieldsWith+	, standardQuery+	)+import WASH.CGI.SubmitXX +	( submit, submit0, defaultSubmit+        , submitx, DTree, dtleaf, dtnode+	, activate )+import WASH.CGI.CGIOutput+	( CGIOutput+	)+import WASH.CGI.CGITypes+	( Status(..), Location(..), FreeForm(..)+	)+import WASH.CGI.Fields+import WASH.CGI.Style +import WASH.CGI.HTMLWrapper+  hiding (input, form, select, option, textarea)+import WASH.CGI.Frames+  (FrameSet, FrameLayout(..), FrameSpacing(..), makeFrame, makeFrameset, framesetPage)
+ WASH/CGI/ContentType.hs view
@@ -0,0 +1,20 @@+-- © 2001, 2002 Peter Thiemann+module WASH.CGI.ContentType where++import Char+import List++-- |tries to derive a MIME content type from a file name+guessContentType :: String -> String+guessContentType name = g (map toLower name) + where+ g name+  | ".eps"	`isSuffixOf` name = "application/postscript"+  | ".ps"	`isSuffixOf` name = "application/postscript"+  | ".ps.gz"	`isSuffixOf` name = "application/postscript"   -- correct?+  | ".pdf"	`isSuffixOf` name = "application/pdf"+  | ".html"	`isSuffixOf` name = "text/html"+  | ".gif"	`isSuffixOf` name = "image/gif"+  | ".png"	`isSuffixOf` name = "image/png"+  | ".jpg"	`isSuffixOf` name = "image/jpeg"+  | otherwise = "application/octet-stream"
+ WASH/CGI/Cookie.hs view
@@ -0,0 +1,202 @@+-- © 2001, 2002, 2003 Peter Thiemann+-- |creating, setting, reading, and deleting cookies. Cookies are type-indexed,+-- i.e., there is a different cookie for each name and type.+module WASH.CGI.Cookie (T, check, create, createExpiring, init, initExpiring, get, set, current, delete) where++import Locale+import Maybe+import Prelude hiding (init)+import Random+import Time++import WASH.CGI.BaseCombinators+import WASH.CGI.CGIMonad+import WASH.HTML.HTMLMonad hiding (head, div, map, span)+import WASH.CGI.Types++import WASH.CGI.StateItem++-- |@check name@ returns the current handle to cookie @name@ if that exists.+check :: (Read a, Show a, Types a) => String -> CGI (Maybe (T a))+-- |@create name initValue@ creates cookie @name@ with initial value @initValue@+-- and returns its current handle. The cookie+-- expires at the end of the current run of the browser.+create  :: (Read a, Show a, Types a) => String -> a -> CGI (T a)+-- |like 'create' with additional parameter specifying number of minutes until+-- cookie expires.+createExpiring  :: (Read a, Show a, Types a) => String -> Int -> a -> CGI (T a)+-- |@init name initValue@ returns current handle to cookie @name@. If the+-- cookie did not exist before, it is created and set to @initialValue@. The cookie+-- expires at the end of the current run of the browser.+init    :: (Read a, Show a, Types a) => String -> a -> CGI (T a)+-- |@initExpiring name minutes initValue@ works like 'init' except that the+-- expiration time is @minutes@ in the future.+initExpiring :: (Read a, Show a, Types a) => String -> Int -> a -> CGI (T a)+-- |@get handle@ returns the cookie's value if the handle is current, otherwise+-- returns 'Nothing' +get     :: (Read a, Show a, Types a) => T a -> CGI (Maybe a)+-- |@set handle newValue@ overwrites the cookie's value with @newValue@ if the+-- handle is current. In that case it returns a handle which is current for+-- @newValue@. Otherwise, the result is 'Nothing'.+set     :: (Read a, Show a, Types a) => T a -> a -> CGI (Maybe (T a))+-- |@current handle@ returns @Nothing@ if @handle@ is still current. Otherwise, it+-- returns @Just newHandle@ where @newHandle@ is current for the cookie pointed to by+-- @handle@.+current :: (Read a, Show a, Types a) => T a -> CGI (Maybe (T a))+-- |@delete handle@ removes the cookie determined by @handle@.+delete  :: (Types a) => T a -> CGI ()+-- +++data P a = P { nr :: Int, vl :: a }+  deriving (Read, Show)++t :: String -> P a -> T a+t name (P i a) = T name i++check name =+  once (unsafe_getHandle name)++unsafe_getHandle name =+  CGI (\cgistate ->+    let mresult = fmap (t name) $ cookieLookup cgistate typedName+	myTyspec = ty (tvirtual (fromJust mresult))+	typedName = makeTypedName name myTyspec+    in +    return (mresult, cgistate))   ++create name val = +  once (unsafe_init False name val Nothing)++createExpiring name minutes val =+  once $ do timestr <- unsafe_io $ getTimeString minutes+	    unsafe_init False name val (Just timestr)++initExpiring name minutes val =+  once $ do timestr <- unsafe_io $ getTimeString minutes+	    unsafe_init True name val (Just timestr)++init name val = +  once (unsafe_init True name val Nothing)++unsafe_init useExisting name val mexp =+  CGI (\cgistate ->+     case cookieLookup cgistate typedName of+     -- if name present and existing value is to be used+     -- then construct handle from map entry+       Just pair | useExisting ->+         return (t name pair, cgistate)+       _ -> +     -- extend cookie map with name=val+	 do nonce <- randomIO+	    let p0val = P nonce val+		cm' = (typedName, (Just (show p0val), mexp)) : cookieMap cgistate+     -- register cookie for sending+                cts' = typedName : cookiesToSend cgistate+     -- construct handle+	    return (t name p0val,+		    cgistate { cookieMap = cm'+			     , cookiesToSend = cts'+			     }))+  where myTyspec = ty val+	typedName = makeTypedName name myTyspec+  +get handle =+  once (do eitherTP <- unsafe_get_current handle+	   return $ either (const Nothing) Just eitherTP)++current handle =+  once (do eitherTP <- unsafe_get_current handle+	   return $ either Just (const Nothing) eitherTP)  ++unsafe_get_current :: (Types a, Read a, Show a) => T a -> CGI (Either (T a) a)+unsafe_get_current t@(T name i) =+  CGI (\cgistate ->+     case cookieLookup cgistate typedName of+     -- if name present and types match then construct handle from map entry+       (Just pair)+         | nr pair == i ->+	   return (Right $ vl pair, cgistate)+	 | otherwise ->+	   return (Left $ T name (nr pair), cgistate)+       _ -> +	 reportError "Cookie disappeared" +	   (do let cm = cookieMap cgistate+		   mms = lookup typedName cm+		   mmp = if True then fmap (fmap reads . fst) mms +		                 else Just (Just [(P 0 $ tvirtual t, "")])+	       pre $ text $ ("  " ++ typedName)+	       pre $ text $ show cm+	       pre $ text $ show mms+	       pre $ text $ show mmp)+	   cgistate)+  where myTyspec = ty (tvirtual t)+	typedName = makeTypedName name myTyspec++set handle val =+  once (unsafe_set handle val)++unsafe_set (T name i) val =+  CGI (\cgistate ->+    case cookieLookup cgistate typedName of+      (Just pair) | nr pair == i ->+        do nonce <- randomIO+	   let pair' = if True then P nonce val else pair    -- to unify their types+	       cts = cookiesToSend cgistate+	       cts' = if typedName `elem` cts then cts else typedName : cts+	       cm' = (typedName, (Just (show pair'), Nothing)) :+		     [ entry | entry@(aName, _) <- cookieMap cgistate+			     , aName /= typedName ]+	   return (Just (t name pair'),+		   cgistate { cookieMap = cm'+			    , cookiesToSend = cts'+			    })+      _ -> return (Nothing, cgistate))+  where myTyspec = ty val+	typedName = makeTypedName name myTyspec++delete t = +  once (unsafe_delete t)++unsafe_delete t@(T name i) =+  CGI (\cgistate ->+       let  cts = cookiesToSend cgistate+	    cts' = if typedName `elem` cts then cts else typedName : cts+       in return ( ()+	         , cgistate { cookieMap = (typedName, (Nothing, Nothing))+		 			  : cookieMap cgistate+		            , cookiesToSend = cts'+			    }))+  where myTyspec = ty (tvirtual t)+	typedName = makeTypedName name myTyspec++cookieLookup :: (Show a, Read a) => CGIState -> String -> Maybe (P a)+cookieLookup cgistate typedName =+  let cm = cookieMap cgistate+      fn = lookup typedName cm		    -- Maybe (Maybe String, Maybe String)+      cn = fmap (fmap reads . fst) fn	    -- Maybe (Maybe [(P a, String)])+      checkType [] = +        Nothing+      checkType ((pair,_):_) =+        Just pair+  in  cn >>= \mtp -> mtp >>= checkType++makeTypedName :: String -> TySpec -> String+makeTypedName s tys = s ++ '-' : tid tys ""++-- ++getTimeString :: Int -> IO String+getTimeString minutes =+  do now <- getClockTime+     let expireAt = addToClockTime TimeDiff {tdYear = 0,+	 				     tdMonth = 0,+					     tdDay = 0,+					     tdHour = 0,+					     tdMin = minutes,+					     tdSec = 0,+					     tdPicosec = 0} now+	 -- Wdy, DD-Mon-YYYY HH:MM:SS GMT+	 fmt = "%a, %d-%b-%Y %H:%M:%S GMT"+	 loc = defaultTimeLocale+     return $ formatCalendarTime loc fmt (toUTCTime expireAt)
+ WASH/CGI/CookieIO.hs view
@@ -0,0 +1,52 @@+module WASH.CGI.CookieIO (decodeCookie, encodeCookie, putCookies) where++import IO++import WASH.CGI.CGIMonad+import qualified WASH.CGI.Debug as Debug+import WASH.CGI.RawCGITypes+import qualified WASH.Utility.URLCoding as URLCoding++decodeCookie :: (String, String) -> (String, (Maybe String, Maybe String))+encodeCookie :: (String, (Maybe String, Maybe String)) -> (String, String)+encodeCookie (k, (v, mexp)) =+  (URLCoding.encode k, +   case v of +     Just v' -> URLCoding.encode v' +++       (case mexp of+	  Nothing -> ""+	  Just exp -> "; expires=" ++ exp)+     Nothing -> "deleted; expires=Thu, 01-Jan-1970 00:00:00 GMT")+decodeCookie (k, v) =  (URLCoding.decode k, (Just (URLCoding.decode v), Nothing))++putCookies :: CGIState -> IO ()+putCookies cgistate =+  let cookies = cookiesToSend cgistate+      cm = cookieMap cgistate+      h = cgiHandle (cgiInfo cgistate)+      sendCookie name = case lookup name cm of+        Nothing -> +	  return ()+	Just value -> +	  let (encName, encValue) = encodeCookie (name, value) in+	  do hPutStr h "Set-Cookie: "+	     hPutStr h encName+	     hPutStr h "="+	     hPutStr h encValue+	     hPutStr h ";\n"+  in do printCookies cm cookies h+	Debug.logOutput "OLD" (printCookies cm cookies)++printCookies :: [(String,(Maybe String, Maybe String))] -> [String] -> Handle -> IO ()+printCookies cm cookies h =+  let sendCookie name = case lookup name cm of+        Nothing -> +	  return ()+	Just value -> +	  let (encName, encValue) = encodeCookie (name, value) in+	  do hPutStr h "Set-Cookie: "+	     hPutStr h encName+	     hPutStr h "="+	     hPutStr h encValue+	     hPutStr h ";\n"+  in mapM_ sendCookie cookies
+ WASH/CGI/Debug.hs view
@@ -0,0 +1,116 @@+module WASH.CGI.Debug where++import Directory+import IO+import Monad+import System+import Time++import System.IO.Unsafe++import WASH.Utility.Auxiliary+import WASH.CGI.RawCGITypes+import WASH.CGI.HTTP+import qualified WASH.Utility.Shell as Shell+import qualified WASH.Utility.ISO8601 as ISO8601+import qualified WASH.Utility.IntToString as IntToString++-- |Turn this off for production use.+debugging :: Bool+debugging = False++logDirNakalele = "/export/data/thiemann"++dir :: String+dir = +  unsafePerformIO $+    do (ts, tps) <- timestamp+       onNakalele <- doesDirectoryExist logDirNakalele+       ra <- protectedGetEnv "REMOTE_ADDR" "0.0.0.0"+       home <- protectedGetEnv "HOME" ""+       let root | not (null home) = home ++ "/tmp"+		| onNakalele      = logDirNakalele+		| otherwise       = "/tmp"+	   n = root ++ "/WASHLOGA/" ++ ra ++ +               '/' : IntToString.intToString 10 (toEnum ts) +++	       ':' : IntToString.intToString 10 tps+       assertDirectoryExists n (return ())+       return n++timestamp :: IO (Int, Integer)+timestamp =+  do clkt <- getClockTime+     let dc = diffClockTimes clkt ISO8601.epochClkT+     return (tdSec dc, tdPicosec dc)++withLogFile :: String -> (Handle -> IO ()) -> IO ()+withLogFile path go =+  do h <- openFile path AppendMode+     go h+     hClose h++-- ------------------------------------------------------------++hPutEnvVar h val var =+  do hPutStr h var+     hPutChar h '='+     hPutStrLn h (Shell.quote val)+     hPutStr h "export "+     hPutStrLn h var++makeArgList h [] =+  return ()+makeArgList h (x:xs) =+  do hPutStr h (Shell.quote x)+     hPutChar h ' '+     makeArgList h xs+makeCommand h args =+  do hPutStr h "$1 "+     makeArgList h args+     hPutStrLn h "<< \\EOF"+makeInput h str =+  do hPutStrLn h str+     hPutStrLn h "\\EOF"++-- |Creates a shell script suitable for replaying the interactive submission.+logInput :: CGIEnv -> IO ()+logInput cgiEnv =+  when debugging $+  withLogFile (dir ++ "/IN.sh") $ \ h ->+  do hPutStrLn h "#!/bin/sh"+     hPutEnvVar h (serverName cgiEnv) "SERVER_NAME"+     hPutEnvVar h (serverPort cgiEnv) "SERVER_PORT"+     hPutEnvVar h (serverSoftware cgiEnv) "SERVER_SOFTWARE"+     hPutEnvVar h (serverProtocol cgiEnv) "SERVER_PROTOCOL"+     hPutEnvVar h (gatewayInterface cgiEnv) "GATEWAY_INTERFACE"+     hPutEnvVar h (scriptName cgiEnv) "SCRIPT_NAME"+     hPutEnvVar h (show $ requestMethod cgiEnv) "REQUEST_METHOD"+     hPutEnvVar h (contentLength cgiEnv) "CONTENT_LENGTH"+     hPutEnvVar h (contentType cgiEnv) "CONTENT_TYPE"+     hPutEnvVar h (httpCookie cgiEnv) "HTTP_COOKIE"+     hPutEnvVar h (httpAccept cgiEnv) "HTTP_ACCEPT"+     hPutEnvVar h (pathInfo cgiEnv) "PATH_INFO"+     hPutEnvVar h (pathTranslated cgiEnv) "PATH_TRANSLATED"+     hPutEnvVar h (remoteHost cgiEnv) "REMOTE_HOST"+     hPutEnvVar h (remoteAddr cgiEnv) "REMOTE_ADDR"+     hPutEnvVar h (remoteUser cgiEnv) "REMOTE_USER"+     hPutEnvVar h (authType cgiEnv) "AUTH_TYPE"+     if httpsEnabled cgiEnv +	then hPutEnvVar h "on"  "HTTPS"+	else hPutEnvVar h "off" "HTTPS"+     makeCommand h (rawArgs cgiEnv)+     makeInput h (rawContents cgiEnv)+     +logOutput :: String -> (Handle -> IO ()) -> IO ()+logOutput name f =+  let basename = dir ++ '/' : name in+  when debugging $ do+    before <- getClockTime+    withLogFile basename f+    after <- getClockTime+    let dc = diffClockTimes after before+	dSec = toInteger $ tdSec dc+	dPic = tdPicosec dc+    withLogFile (basename ++ ".time")+      (\h -> do hPutStrLn h (IntToString.intToString 10 dSec)+                hPutStrLn h (IntToString.intToString 10 dPic))
+ WASH/CGI/EventHandlers.hs view
@@ -0,0 +1,130 @@+-- © 2002 Peter Thiemann+module WASH.CGI.EventHandlers where++import WASH.CGI.HTMLWrapper++--abort+onAbort :: Monad m => String -> WithHTML x m ()+onAbort = attr_SS "onabort"+-- ^The user aborts the loading of an image (for example by clicking a link or+-- clicking the Stop button). ++--blur+onBlur :: Monad m => String -> WithHTML x m ()+onBlur = attr_SS "onblur"+-- ^A form element loses focus or when a window or frame loses focus.++--change+onChange :: Monad m => String -> WithHTML x m ()+onChange = attr_SS "onchange"+-- ^A select, text, or textarea field loses focus and its value has been modified.++--click+onClick :: Monad m => String -> WithHTML x m ()+onClick = attr_SS "onclick"+-- ^An object on a form is clicked.++--dblclick+onDblClick :: Monad m => String -> WithHTML x m ()+onDblClick = attr_SS "ondblclick"+-- ^The user double-clicks a form element or a link.++--dragdrop+onDragDrop :: Monad m => String -> WithHTML x m ()+onDragDrop = attr_SS "ondragdrop"+-- ^The user drops an object onto the browser window, such as dropping a file on+-- the browser window. ++--error+onError :: Monad m => String -> WithHTML x m ()+onError = attr_SS "onerror"+-- ^The loading of a document or image causes an error.++--focus+onFocus :: Monad m => String -> WithHTML x m ()+onFocus = attr_SS "onfocus"+-- ^A window, frame, or frameset receives focus or when a form element receives+-- input focus. ++--keydown+onKeyDown :: Monad m => String -> WithHTML x m ()+onKeyDown = attr_SS "onkeydown"+-- ^The user depresses a key.++--keypress+onKeyPress :: Monad m => String -> WithHTML x m ()+onKeyPress = attr_SS "onkeypress"+-- ^The user presses or holds down a key.++--keyup+onKeyUp :: Monad m => String -> WithHTML x m ()+onKeyUp = attr_SS "onkeyup"+-- ^The user releases a key.++--load+onLoad :: Monad m => String -> WithHTML x m ()+onLoad = attr_SS "onload"+-- ^The browser finishes loading a window or all of the frames within a FRAMESET tag.++--mousedown+onMouseDown :: Monad m => String -> WithHTML x m ()+onMouseDown = attr_SS "onmousedown"+-- ^The user depresses a mouse button.++--mousemove+onMouseMove :: Monad m => String -> WithHTML x m ()+onMouseMove = attr_SS "onmousemove"+-- ^The user moves the cursor.++--mouseout+onMouseOut :: Monad m => String -> WithHTML x m ()+onMouseOut = attr_SS "onmouseout"+-- ^The cursor leaves an area (client-side image map) or link from inside that+-- area or link. ++--mouseover+onMouseOver :: Monad m => String -> WithHTML x m ()+onMouseOver = attr_SS "onmouseover"+-- ^The cursor moves over an object or area from outside that object or area.++--mouseup+onMouseUp :: Monad m => String -> WithHTML x m ()+onMouseUp = attr_SS "onmouseup"+-- ^The user releases a mouse button.++--move+onMove :: Monad m => String -> WithHTML x m ()+onMove = attr_SS "onmove"+-- ^The user or script moves a window or frame.++--reset+onReset :: Monad m => String -> WithHTML x m ()+onReset = attr_SS "onreset"+-- ^The user resets a form (clicks a Reset button).++--resize+onResize :: Monad m => String -> WithHTML x m ()+onResize = attr_SS "onresize"+-- ^The user or script resizes a window or frame.++--select+onSelect :: Monad m => String -> WithHTML x m ()+onSelect = attr_SS "onselect"+-- ^The user selects some of the text within a text or textarea field.++--submit+onSubmit :: Monad m => String -> WithHTML x m ()+onSubmit = attr_SS "onsubmit"+-- ^The user submits a form. Event handler must return true to continue+-- submission. Returning false concels submission.++--unload+onUnload :: Monad m => String -> WithHTML x m ()+onUnload = attr_SS "onunload"+-- ^The user exits a document.++-- specialized event handlers+-- |Redirect result of form submission to specific target. Attach to submission+-- button. +toTarget :: Monad m => String -> WithHTML x m ()+toTarget t = onClick ("this.form.target='" ++ t ++ "'; this.form.submit(); return true")
+ WASH/CGI/Fields.hs view
@@ -0,0 +1,282 @@+-- © 2002 Peter Thiemann+module WASH.CGI.Fields where++import Char+import List+import WASH.Utility.ISO8601+import WASH.Utility.SimpleParser as SimpleParser+import WASH.CGI.CGITypes++-- |method 'reason' of this class maps a value of type /a/ to an explanation of+-- the input syntax for a value of type /a/+class Reason a where+  reason :: a -> String+  washtype :: a -> String+  reason _ = ""+  washtype x = reason x++instance Reason Int where+  reason _ = "Int"++instance Reason Integer where+  reason _ = "Integer"++instance Reason Double where+  reason _ = "Double"++instance Reason Float where+  reason _ = "Float"++instance Reason Bool where+  reason _ = "Bool"++instance Reason () where+  reason _ = "()"++instance Reason Char where+  reason _ = "Char"++instance Reason a => Reason [a] where+  reason ~(x:xs) = "[" ++ reason x ++ "]"++instance (Reason a, Reason b) => Reason (a, b) where+  reason ~(x,y) = "(" ++ reason x ++ "," ++ reason y ++ ")"++instance (Reason a, Reason b, Reason c) => Reason (a, b, c) where+  reason ~(x,y,z) = "(" ++ reason x ++ "," ++ reason y ++ "," ++ reason z ++ ")"++-- |Reads an email address according to RFC 2822+newtype EmailAddress = EmailAddress { unEmailAddress :: String }++instance Read EmailAddress where+  readsPrec i str = +    let isAddressChar c = isAlpha c || isDigit c || c `elem` ".-_"+        (name, atDomain) = span isAddressChar (dropWhile isSpace str)+    in  case atDomain of+          '@' : domainPart ->+	    let (domain, rest) = span isAddressChar domainPart in+	    let fulladdress = name ++ '@' : domain in+	    if null name || null domain +	    || "." `isPrefixOf` name || "." `isSuffixOf` name || "." `isPrefixOf` domain+	    || any (isPrefixOf "..") (tails name) +	    || any (isPrefixOf "..") (tails domain)+	    then []+	    else [(EmailAddress fulladdress, dropWhile isSpace rest)]+	  _ -> []+  readList str = +    case reads str of+      (em1, str'): _ ->+        case str' of+	  ',': str'' ->+	    case readList str'' of+	      (ems, str'''): _ ->+	        [(em1:ems, str''')]+	      _ ->+	        [([em1], str')]+	  _ -> +	    [([em1], str')]+      _ -> []+	++instance Show EmailAddress where+  showsPrec i (EmailAddress str) = showString str++instance Reason EmailAddress where+  reason _ = "email address {must contain @ and no special characters except . - _}"+  washtype _ = "EmailAddress"+ +-- |Reads a credit card number and performs Luhn check on it.+newtype CreditCardNumber = CreditCardNumber { unCreditCardNumber :: String }++instance Read CreditCardNumber where+  readsPrec i str = +    let str' = dropWhile isSpace str+	str'' =  take 16 str'+	str''' = dropWhile isSpace (drop 16 str'')+    in	if length str'' == 16 && all isDigit str && luhnCheck str+        then [(CreditCardNumber str, str''')]+	else []++luhnCheck str = +  checkEven (reverse str) 0+  where digitval d = ord d - ord '0'+	checkEven [] n = n `mod` 10 == 0+	checkEven (d:ds) n = checkOdd ds (n + digitval d)+	checkOdd [] n = n `mod` 10 == 0+	checkOdd (d:ds) n = checkEven ds (n + doubleval (digitval d))+	doubleval d = let d2 = 2*d in if d2 > 9 then d2 - 9 else d2++instance Show CreditCardNumber where+  showsPrec i (CreditCardNumber str) = showString str++instance Reason CreditCardNumber where+  reason _ = "credit card number"+  washtype _ = "CreditCardNumber"++-- |Reads credit card expiration dates in format ##\/##.+data CreditCardExp = CreditCardExp { cceMonth :: Int, cceYear :: Int }++instance Read CreditCardExp where+  readsPrec i str = +    g $ dropWhile isSpace str+    where+    g str@(mh: ml: '/': yh: yl:cces) =+      let mo, yr :: Int+	  mo = read [mh, ml]+	  yr = read [yh, yl]+      in if isDigit mh && isDigit ml && isDigit yh && isDigit yl && mo >= 1 && mo <= 12+      then [(CreditCardExp mo yr, cces)]+      else []+    g _ = []++instance Show CreditCardExp where+  showsPrec i cce = shows (cceMonth cce) . showChar '/' . shows (cceYear cce)++instance Reason CreditCardExp where+  reason _ = "credit card expiration date: MM/YY"+  washtype _ = "CreditCardExp"++-- |Non-empty strings.+newtype NonEmpty = NonEmpty { unNonEmpty :: String }++instance Read NonEmpty where+  readsPrec i [] = []+  readsPrec i str = [(NonEmpty str, "")]++instance Show NonEmpty where+  showsPrec i (NonEmpty str) = showString str++instance Reason NonEmpty where+  reason _ = "non empty string"+  washtype _ = "NonEmpty"++-- |Phone numbers.+newtype Phone = Phone { unPhone :: String }++phoneChars = "0123456789 +-/()"++instance Read Phone where+  readsPrec i =+    parserToRead $+    (many1 (oneOf phoneChars) >>= (return . Phone))++instance Show Phone where+  showsPrec i (Phone str) = showString str++instance Reason Phone where+  reason _ = "non empty string of " ++ show phoneChars+  washtype _ = "Phone"++-- |Non-empty strings of digits.+newtype AllDigits = AllDigits { unAllDigits :: String }++instance Read AllDigits where+  readsPrec i str =+    let (digits, str') = span isDigit $ dropWhile isSpace str in +    if null digits then [] else [(AllDigits digits, str')]++instance Show AllDigits where+  showsPrec i (AllDigits str) = showString str++instance Reason AllDigits where+  reason _ = "non empty string of digits"+  washtype _ = "AllDigits"++-- |Arbitrary string data. No quotes required.+newtype Text = Text { unText :: String }++instance Read Text where+  readsPrec i str = [(Text str, "")]+  +instance Show Text where+  showsPrec i (Text str) = showString str++instance Reason Text where+  reason _ = "arbitrary string"+  washtype _ = "Text"++-- |Date and time in ISO8601 format+instance Reason ISODate where+  reason _ = "date in ISO8601 format"+  washtype _ = "ISODate"++instance Reason ISOTime where+  reason _ = "time in ISO8601 format"+  washtype _ = "ISOTime"++instance Reason ISODateAndTime where+  reason _ = "date and time in ISO8601 format"+  washtype _ = "ISODateAndTime"++-- |String in URL format+instance Read URL where+  readsPrec i = parserToRead parseURL++parseURL = +  do scheme <- parseScheme+     colon <- char ':'+     rest <- many1 ascii+     return $ URL (scheme ++ colon : rest)++parseScheme =+  do c <- alpha+     cs <- many SimpleParser.print+     return (c:cs)++instance Show URL where+  showsPrec i (URL str) = showString str++instance Reason URL where+  reason _ = "URL"++-- |A Password is a string of length >= 8 with characters taken from at least+-- three of the four sets: lower case characters, upper case characters, digits,+-- and special characters.+newtype Password = Password { unPassword :: String }++instance Reason Password where+  reason _ = "Password string of length >= 8 with characters taken from at \+             \least three of the four sets: lower case characters, upper case \+	     \characters, digits, and special characters"++instance Read Password where+  readsPrec i str =+    let lower = any isLower str+	upper = any isUpper str+	digit = any isDigit str+	specl = any isSpecl str+	isSpecl c = isPrint c && not (isAlphaNum c)+	nclasses = sum (map fromEnum [lower, upper, digit, specl])+    in +    if   length str >= 8 && nclasses >= 3+    then [(Password str, "")]+    else []++instance Show Password where+  showsPrec i (Password pw) = showString pw++-- |Data type for transforming a field into an optional one. The 'Read' syntax of+-- @Absent@ is the empty string, whereas the 'Read' syntax of @Present a@ is just the+-- 'Read' syntax of @a@. Analogously for 'Show'.+data Optional a = Absent | Present a++-- |Analogous to Maybe.fromJust+fromPresent :: Optional a -> a+fromPresent ~(Present x) = x+-- |Analogous to Maybe.fromMaybe+fromOptional :: a -> Optional a -> a+fromOptional x Absent      = x+fromOptional _ (Present x) = x++instance Show a => Show (Optional a) where+  showsPrec i Absent = id+  showsPrec i (Present x) = showsPrec i x++-- |Optional items are either empty or just the item+instance (Read a) => Read (Optional a) where+  readsPrec i "" = [(Absent, "")]+  readsPrec i xs = [(Present v, rest) | (v, rest) <- readsPrec i xs]++instance (Reason a) => Reason (Optional a) where+  reason x = "optional " ++ reason (fromPresent x)+
+ WASH/CGI/Frames.hs view
@@ -0,0 +1,90 @@+module WASH.CGI.Frames where++import WASH.Utility.Auxiliary+import qualified WASH.CGI.HTMLWrapper as H hiding (map)+import WASH.CGI.CookieIO+import WASH.CGI.CGIConfig+import WASH.CGI.CGIMonad+import WASH.CGI.CGIOutput+import WASH.CGI.CGITypes+import WASH.CGI.EventHandlers+import WASH.CGI.Fields+import WASH.CGI.Images+import WASH.CGI.RawCGIInternal hiding (CGIEnv (..))+import qualified WASH.Utility.URLCoding as URLCoding+import WASH.Utility.JavaScript+++-- ======================================================================+-- frames++-- |Overall layout of a frame set: row-wise or column-wise.+data FrameLayout = ROWS | COLS+  deriving Show++-- |Division of space between elements of a frameset. See+-- <http://wp.netscape.com/assist/net_sites/frame_syntax.html>+data FrameSpacing = FrameAbsolute Int			    -- ^in pixels+		  | FrameRelative Int			    -- ^the @*@ format+		  | FramePercent  Int			    -- ^the @%@ format++instance Show FrameSpacing where+  showsPrec _ (FrameAbsolute n) = shows n+  showsPrec _ (FrameRelative n) = shows n . showChar '*'+  showsPrec _ (FramePercent  n) = shows n . showChar '%'+  showList [] = id+  showList [ffmt] = shows ffmt+  showList (ffmt:ffmts) = shows ffmt . showChar ',' . showList ffmts++-- |Abstract data type of frame set generators.+data FrameSet = FrameSet { unFrameSet :: H.WithHTML () IO () }++-- |Create a frameset, given a layout, its spacing, and its subframe(set)s.+makeFrameset :: (CGIMonad cgi) =>+        FrameLayout+	-> [(FrameSpacing, cgi FrameSet)]+	-> cgi FrameSet+makeFrameset layout subframes =+  do nested <- mapM snd subframes+     return $ FrameSet $+       H.frameset_S (foldr (( >> ) . unFrameSet) +			   (H.attr_SD (show layout) (show (map fst subframes)))+			   nested)++-- |Create a single frame. Returns the assigned name of the frame.+makeFrame :: (CGIMonad cgi) =>+	H.WithHTML x IO ()		-- ^additional attributes to <frame>+	-> cgi ()			-- ^contents of the frame+	-> cgi FrameSet			-- ^returns HTML generator for the frame+makeFrame attrs subAction =+  do n <- incFrame+     -- unsafe_io (appendFile "/tmp/CGIFRAME" $ ("makeFrame #" ++ show n ++ "\n"))+     subAction+     baseUrl <- getUrl+     parm <- getParm+     let url = baseUrl ++ '?' : URLCoding.encode (frameFileName parm n)+	 name = ("FRAME"++show n)+     -- unsafe_io (appendFile "/tmp/CGIFRAME" $ ("makeFrame finished\n"))+     return $ FrameSet $+       H.frame_S (do attrs+		     H.attr_SD "SRC" url+		     H.attr_SD "NAME" name)++frameFileName parm frameno =+  "FRAME:" ++ show frameno ++ ":" ++ (URLCoding.encode $ show $ parm)++frameFullPath parm frameno = +  frameDir ++ frameFileName parm frameno++-- |Required wrapper for pages with frames. Takes a title and a FrameSet+-- generator and displays the page.+framesetPage :: (CGIMonad cgi) => String -> cgi FrameSet -> cgi ()+framesetPage ttl framesetgen =+  do resetFrame+     FrameSet pagegen <- framesetgen+     let ma = H.htmlHeader ttl pagegen+     resetFrame+     wrapCGI $ \ cgistate ->+       do elem <- H.build_document ma+	  (nextaction (pageInfo cgistate) elem) (nextCGIState cgistate)+
+ WASH/CGI/GuaranteedCGI.hs view
@@ -0,0 +1,189 @@+module WASH.CGI.GuaranteedCGI (+	-- * Basics+	CGI, CGIMonad+	, ask, tell, io, run+	, once, forever, callWithCurrentHistory, htell, askOffline+	-- * Links and Images+	, Image, internalImage, externalImage, makeImg, makeRef, makePopupRef, makeA+	, backLink, hlink, popuplink, restart+	-- * Page Templates+	, standardPage, htmlHeader, WASH.CGI.GuaranteedCGI.html, cssPage, cssHeader+	-- * Forms and Widgets+	, HTMLField+	-- ** Form Creation+	, makeForm, standardQuery+	-- ** Form Submission+	, submit, submit0, defaultSubmit, resetField, activeInputField, activate+	, submitLink, submitLink0, defaultSubmitLink+        , submitx, DTree, dtleaf, dtnode+	-- ** Textual Input +	, inputField, textInputField, checkedTextInputField, passwordInputField, makeTextarea+	-- ** Checkbox+	, checkboxInputField+	-- ** Button+	, makeButton, RadioGroup, radioGroup, radioButton, radioError+	-- ** Image+	, imageField+	-- ** Selection Box+	, selectMultiple, selectSingle, selectBounded+	-- ** File+	, fileInputField, checkedFileInputField+	-- ** Handle Manipulation+	, InputField, VALID, INVALID, value, InputHandle, HasValue+	, F0 (F0), F1 (F1), F2 (F2), F3 (F3), F4 (F4), F5 (F5), F6 (F6), F8 (F8)+	, FL (FL), FA (FA)+	-- ** Attribute Shortcuts+	, fieldSIZE, fieldMAXLENGTH, fieldVALUE+	-- * Advanced+	-- ** Installing Translators+	, runWithHook, docTranslator, lastTranslator+	-- ** Outputable Stuff+	, CGIOutput, Status(..), Location(..), FreeForm(..), FileReference (..)+	-- ** Predefined Types for Input Fields+	, Text(..), NonEmpty(..), AllDigits(..), Phone(..)+	, EmailAddress(..), CreditCardNumber(..), CreditCardExp(..)+	, Password(..), Optional(..)+	-- ** Lowlevel Options+	, CGIOption (..), CGIOptions, URL (..)+	-- ** Servlets+	, makeServlet, makeServletWithHook+	-- * HTML and Style+	, module WASH.HTML.HTMLMonad98+	, module WASH.CGI.Style+	-- * Experimental Stuff+	, FrameSet, FrameLayout(..), FrameSpacing(..), makeFrame, makeFrameset, framesetPage+	) where++import WASH.CGI.CGIMonad (CGIMonad())+import WASH.CGI.CGITypes+import WASH.CGI.Fields+import WASH.CGI.Style+import qualified WASH.CGI.CGIInternals as CGIInternals+import WASH.CGI.CGI (+  	CGI+	, tell, io, run, once, forever, callWithCurrentHistory+	, Image, internalImage, externalImage+	, HTMLField, RadioGroup, radioGroup, InputField, VALID, INVALID, value+	, InputHandle, HasValue+	, F0 (F0), F1 (F1), F2 (F2), F3 (F3), F4 (F4), F5 (F5), F6 (F6), F8 (F8)+	, FL (FL), FA (FA)+	, DTree, dtleaf, dtnode+	, runWithHook, docTranslator, lastTranslator+	, CGIOutput, Status(..), Location(..), FreeForm(..), FileReference (..)+	, Text(..), NonEmpty(..), AllDigits(..)+	, EmailAddress(..), CreditCardNumber(..), CreditCardExp(..)+	, CGIOption(..), CGIOptions+	, makeServlet, makeServletWithHook+	, FrameSet, FrameLayout(..), FrameSpacing(..)+	, makeFrameset, framesetPage+	, Style(..)+	)++import WASH.HTML.HTMLMonad98 hiding (html)+import qualified WASH.CGI.CGI as CGI++ask :: (CGIMonad cgi) => WithHTML DOCUMENT cgi a -> cgi ()+ask = CGI.ask+htell :: (CGIMonad cgi) => WithHTML HTML IO () -> cgi a+htell = CGI.htell+askOffline :: (CGIMonad cgi) => WithHTML HTML cgi a -> (Element -> IO ()) -> cgi ()+askOffline = CGI.askOffline+makeImg :: (Monad cgi, AdmitChildIMG y) => Image -> HTMLField cgi IMG y ()+makeImg = CGI.makeImg+makeRef :: (CGIMonad cgi, AdmitChildA y, Monad m) => String -> WithHTML A m () -> cgi (WithHTML y m ())+makeRef = CGI.makeRef+makeA :: (CGIMonad cgi, AdmitChildA y) => String -> String -> HTMLField cgi A y ()+makeA = CGI.makeA+makePopupRef :: (CGIMonad cgi, AdmitChildA y) => String -> String -> HTMLField cgi A y ()+makePopupRef = CGI.makePopupRef+backLink :: (AdmitChildA x, Monad m) => HTMLCons A x m ()+backLink = CGI.backLink+hlink :: (AdmitChildA y, Monad m) => URL -> HTMLCons A y m ()+hlink = CGI.hlink+popuplink :: (AdmitChildA y, Monad m) => String -> URL -> HTMLCons A y m ()+popuplink = CGI.popuplink+restart :: CGI ()+restart = CGI.restart+makeForm :: (AdmitChildFORM y) => WithHTML FORM CGI a -> WithHTML y CGI ()+makeForm = CGI.makeForm+standardQuery :: String -> WithHTML FORM CGI a -> CGI ()+standardQuery = CGI.standardQuery+submit :: (CGIMonad cgi, AdmitChildINPUT y, InputHandle h) => h INVALID -> (h VALID -> cgi ()) -> HTMLField cgi INPUT y ()+submit = CGI.submit+submit0 :: (CGIMonad cgi, AdmitChildINPUT y) => cgi () -> HTMLField cgi INPUT y ()+submit0 = CGI.submit0+defaultSubmit :: (CGIMonad cgi, AdmitChildINPUT y, InputHandle h) => h INVALID -> (h VALID -> cgi ()) -> HTMLField cgi INPUT y ()+defaultSubmit = CGI.defaultSubmit+submitLink :: (CGIMonad cgi, AdmitChildA y, InputHandle h) => h INVALID -> (h VALID -> cgi ()) -> HTMLCons A y cgi ()+submitLink = CGI.submitLink+submitLink0 :: (AdmitChildA y) => CGI () -> HTMLCons A y CGI ()+submitLink0 = CGI.submitLink0+defaultSubmitLink :: (AdmitChildA y, InputHandle h) => h INVALID -> (h VALID -> CGI ()) -> HTMLCons A y CGI ()+defaultSubmitLink = CGI.defaultSubmitLink+submitx :: (AdmitChildINPUT y) => DTree cgi INPUT y -> HTMLField cgi INPUT y ()+submitx = CGI.submitx+resetField :: (CGIMonad cgi, AdmitChildINPUT y) => HTMLField cgi INPUT y (InputField () INVALID)+resetField = CGI.resetField+activeInputField :: (CGIMonad cgi, AdmitChildINPUT y, Reason a, Read a) => (a -> cgi ()) -> HTMLField cgi INPUT y ()+activeInputField = CGI.activeInputField+activate :: (CGIMonad cgi, InputHandle (i a), HasValue i, AdmitChildINPUT y) => (a -> cgi ()) -> HTMLField cgi INPUT y (i a INVALID) -> HTMLField cgi INPUT y (i a INVALID)+activate = CGI.activate+inputField :: (CGIMonad cgi, AdmitChildINPUT y, Reason a, Read a) => HTMLField cgi INPUT y (InputField a INVALID)+inputField = CGI.inputField+checkedTextInputField :: (CGIMonad cgi, AdmitChildINPUT y) => (Maybe String -> Maybe String) -> HTMLField cgi INPUT y (InputField String INVALID)+checkedTextInputField = CGI.checkedTextInputField+textInputField :: (CGIMonad cgi, AdmitChildINPUT y) => HTMLField cgi INPUT y (InputField String INVALID)+textInputField = CGI.textInputField+passwordInputField :: (CGIMonad cgi, AdmitChildINPUT y, Reason a, Read a) => HTMLField cgi INPUT y (InputField a INVALID)+passwordInputField = CGI.passwordInputField+makeTextarea :: (CGIMonad cgi, AdmitChildTEXTAREA y) => String -> HTMLField cgi TEXTAREA y (InputField String INVALID)+makeTextarea = CGI.makeTextarea+checkboxInputField :: (CGIMonad cgi, AdmitChildINPUT y) => HTMLField cgi INPUT y (InputField Bool INVALID)+checkboxInputField = CGI.checkboxInputField+makeButton :: (CGIMonad cgi, AdmitChildINPUT y) => HTMLField cgi INPUT y (InputField Bool INVALID)+makeButton = CGI.makeButton+radioButton :: (CGIMonad cgi, AdmitChildINPUT y, Show a) => RadioGroup a INVALID -> a -> HTMLField cgi INPUT y ()+radioButton = CGI.radioButton+radioError :: (CGIMonad cgi, AdmitChildIMG x) => RadioGroup a INVALID -> WithHTML x cgi ()+radioError = CGI.radioError+imageField :: (CGIMonad cgi, AdmitChildINPUT y) => Image -> HTMLField cgi INPUT y (InputField (Int, Int) INVALID)+imageField = CGI.imageField+selectMultiple :: (CGIMonad cgi, AdmitChildSELECT y, Eq a) => (a -> String) -> [a] -> [a] -> (Int, Int) -> HTMLField cgi SELECT y (InputField [a] INVALID)+selectMultiple = CGI.selectMultiple+selectSingle :: (CGIMonad cgi, AdmitChildSELECT y, Eq a) => (a -> String) -> Maybe a -> [a] -> HTMLField cgi SELECT y (InputField a INVALID)+selectSingle = CGI.selectSingle+selectBounded :: (CGIMonad cgi, AdmitChildSELECT y, Enum a, Bounded a, Read a, Show a, Eq a) => Maybe a -> HTMLField cgi SELECT y (InputField a INVALID)+selectBounded = CGI.selectBounded+checkedFileInputField :: (CGIMonad cgi, AdmitChildINPUT y) => (Maybe FileReference -> Maybe FileReference) -> HTMLField cgi INPUT y (InputField FileReference INVALID)+checkedFileInputField = CGI.checkedFileInputField+fileInputField :: (CGIMonad cgi, AdmitChildINPUT y) => HTMLField cgi INPUT y (InputField FileReference INVALID)+fileInputField = CGI.fileInputField++fieldSIZE :: (Monad m, AdmitAttrSIZE e, AttrValueSIZE v) => v -> WithHTML e m ()+fieldSIZE = WASH.HTML.HTMLMonad98.atSIZE+fieldMAXLENGTH :: (Monad m, AdmitAttrMAXLENGTH e, AttrValueMAXLENGTH v) => v -> WithHTML e m ()+fieldMAXLENGTH = WASH.HTML.HTMLMonad98.atMAXLENGTH+fieldVALUE :: (Monad m, AdmitAttrVALUE e, AttrValueVALUE v) => v -> WithHTML e m ()+fieldVALUE = WASH.HTML.HTMLMonad98.atVALUE++-- module HTMLWrapper+standardPage :: (AdmitChildHTML y, Monad m) => String -> WithHTML BODY m a -> WithHTML y m ()+standardPage = CGI.standardPage+htmlHeader :: (AdmitChildHTML y, Monad m) => String -> WithHTML HTML m a -> WithHTML y m ()+htmlHeader = CGI.htmlHeader+html :: (Monad m, AdmitChildHTML y) => WithHTML HTML m a -> WithHTML y m ()+html = CGI.html+cssHeader :: (AdmitChildHTML y, Monad m) => String -> String -> WithHTML HTML m a -> WithHTML y m ()+cssHeader = CGI.cssHeader+cssPage :: (AdmitChildHTML y, Monad m) => String -> String -> WithHTML BODY m a -> WithHTML y m ()+cssPage = CGI.cssPage++-- module Style+using :: (AdmitAttrSTYLE x, Monad m)+	=> Style+	-> (WithHTML x m b -> c)	-- ^a field constructor, typically 'HTMLField'+	-> WithHTML x m b -> c		-- ^styled version of this constructor+using = CGI.using++makeFrame :: WithHTML FRAME IO () -> CGI () -> CGI FrameSet+makeFrame = CGI.makeFrame
+ WASH/CGI/HTMLMail.hs view
@@ -0,0 +1,10 @@+module WASH.CGI.HTMLMail where++import Prelude hiding (head,div,span)+import WASH.HTML.HTMLMonad hiding (map)+import WASH.Mail.MIME ++-- |transform HTML Element into document suitable for sending as email.+htmlDOC :: Element -> DOC+htmlDOC el = +  binaryDOC "text" "html" (show el)
+ WASH/CGI/HTMLWrapper.hs view
@@ -0,0 +1,44 @@+module WASH.CGI.HTMLWrapper+  (module H, module WASH.CGI.HTMLWrapper) where++import qualified Prelude+import WASH.HTML.HTMLMonad as H hiding (html)++-- |create a standard XHTML page from a title string and body elements+standardPage :: (Prelude.Monad m) => +		Prelude.String -> WithHTML x m a -> WithHTML y m ()+standardPage ttl elems =+  htmlHeader ttl (body_S (h1_S (text ttl) ## elems))++-- |create a standard XHTML page without heading from a title string and body elements+htmlHeader :: (Prelude.Monad m) =>+	      Prelude.String -> WithHTML x m a -> WithHTML y m ()+htmlHeader ttl elems =+  html (head_S (title_S (text ttl))+     ## elems)++-- |create a standard XHTML page from a title string, a stylesheet URL and body+-- elements +cssPage :: (Prelude.Monad m) =>+	   Prelude.String -> Prelude.String -> WithHTML x m a -> WithHTML y m ()+cssPage ttl cssurl elems =+  cssHeader ttl cssurl (body_S (h1_S (text ttl) ## elems))++-- |create an XHTML page with CSS reference but without heading from a title+-- string, the URL of the stylesheet and body elements+cssHeader :: (Prelude.Monad m) =>+	     Prelude.String -> Prelude.String -> WithHTML x m a -> WithHTML y m ()+cssHeader ttl cssurl elems =+  html (head_S (do title_S (text ttl)+		   link_S (do attr_SS "rel" "stylesheet"+			      attr_SS "type" "text/css" +			      attr_SD "href" cssurl))+     ## elems)++-- |create a bare XHTML root tag with proper namespace attribute+html :: (Prelude.Monad m) =>+	WithHTML x m a -> WithHTML y m ()+html elems =+  html_T (do elems+	     attr_SS "xmlns" "http://www.w3.org/1999/xhtml")+
+ WASH/CGI/HTTP.hs view
@@ -0,0 +1,42 @@+module WASH.CGI.HTTP where++import Char++data Method =+    OPTIONS+  | GET+  | HEAD+  | POST+  | PUT+  | DELETE+  | TRACE+  | CONNECT+  | Extension String+  deriving Eq++instance Show Method where+  showsPrec _ OPTIONS = showString "OPTIONS"+  showsPrec _ GET     = showString "GET"+  showsPrec _ HEAD    = showString "HEAD"+  showsPrec _ POST    = showString "POST"+  showsPrec _ PUT     = showString "PUT"+  showsPrec _ DELETE  = showString "DELETE"+  showsPrec _ TRACE   = showString "TRACE"+  showsPrec _ CONNECT = showString "CONNECT"+  showsPrec _ (Extension s) = showString s++instance Read Method where+  readsPrec _ s =+    let (token, rest) = span isAlphaNum s in+    [(+     case token of+       "OPTIONS" -> OPTIONS+       "GET" -> GET+       "HEAD" -> HEAD+       "POST" -> POST+       "PUT" -> PUT+       "DELETE" -> DELETE+       "TRACE" -> TRACE+       "CONNECT" -> CONNECT+       other -> Extension other+     , dropWhile isSpace rest)]
+ WASH/CGI/Images.hs view
@@ -0,0 +1,20 @@+module WASH.CGI.Images (nothing, question, nothingURL, questionURL) where++import WASH.CGI.CGITypes+import WASH.Utility.RFC2397+import WASH.Utility.JavaScript++rawNothing1 = "GIF89a\SOH\NUL\SOH\NUL\128\NUL\NUL\NUL\NUL\NUL\NUL\NUL\216!\249\EOT\SOH\NUL\NUL\NUL\NUL,\NUL\NUL\NUL\NUL\SOH\NUL\SOH\NUL\NUL\STX\STXD\SOH\NUL;"+rawNothing = "GIF89a\DLE\NUL\DLE\NUL\128\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL!\249\EOT\SOH\NUL\NUL\NUL\NUL,\NUL\NUL\NUL\NUL\DLE\NUL\DLE\NUL\NUL\STX\SO\132\143\169\203\237\SI\163\156\180\218\139\179>\ENQ\NUL;"++rawQuestion = "GIF89a\DLE\NUL\DLE\NUL\128\NUL\NUL\NUL\NUL\NUL\255\NUL\NUL!\249\EOT\SOH\NUL\NUL\NUL\NUL,\NUL\NUL\NUL\NUL\DLE\NUL\DLE\NUL\NUL\STX#\132\GS\EM\199\167\191\SUBP\140\182$\177\204\250\194\238\129\155\181Ub9E\136\SUB~\229\199\162\242\140\146\178}\DC4\NUL;"++nothing = FreeForm "nothing.gif" "image/gif" rawNothing+question = FreeForm "question.gif" "image/gif" rawQuestion++nothingURL = "javascript:" ++ jsShow rawNothing+questionURL = "javascript:" ++ jsShow rawQuestion++-- data URL not universally supported+nothingURLdata  = encode ("image/gif", rawNothing)+questionURLdata = encode ("image/gif", rawQuestion)
+ WASH/CGI/InputHandle.hs view
@@ -0,0 +1,20 @@+-- © 2005 Peter Thiemann+{-|+  Internal use only.+  Provides access to class "InputHandle" and thus enables the construction +  new instances of this class, which requires knowledge about programming of+  validations. +  -} +module WASH.CGI.InputHandle where++import WASH.CGI.CGIInternals++class HasValue i where+  -- | extract a value from various kinds of input handles+  value :: i a VALID -> a++class InputHandle h where+  -- | transforms an unvalidated input handle into either an error or a valid handle+  validate :: h INVALID -> Either [ValidationError] (h VALID)+  isBound  :: h INVALID -> Bool+  ihNames  :: h INVALID -> [String]
+ WASH/CGI/LogEntry.hs view
@@ -0,0 +1,53 @@+-- © 2001- 2006 Peter Thiemann+-- |Definition of the type of the redo log entries+module WASH.CGI.LogEntry where++import WASH.CGI.RawCGITypes++data PARAMETER +  = PAR_RESULT String		-- ^ result of an IO operation shown as a string+  | PAR_VALUES CGIParameters	-- ^ record of a form input+  | PAR_MARK   String		-- ^ recorded stateID before the mark+  | PAR_IGNORED+  | PAR_TRANS  String		-- ^ recorded stateID at start of transaction+  | PAR_CRE_TV String String    -- ^ record of a @create@ or @init@ operation+  | PAR_REM_TV String	        -- ^ record of a @remove@ operation+  | PAR_GET_TV String String    -- ^ record of a @get@ operation+  | PAR_SET_TV String String	-- ^ record of a @set@ operation+  | PAR_DB     String		-- ^ record entry for all DB operations.+                                -- the string is already the result of a +                                -- show operation for DB tuples, so it is+			        -- doubly encoded :-(++instance Show PARAMETER where+  showsPrec i par = case par of+    PAR_RESULT str -> showString ":R" . shows str+    PAR_VALUES cps -> showString ":V" . shows cps+    PAR_MARK   str -> showString ":M" . shows str+    PAR_IGNORED    -> showString ":I"+    PAR_TRANS  str -> showString ":T" . shows str+    PAR_CRE_TV n v -> showString ":C" . shows n . shows v+    PAR_REM_TV n   -> showString ":E" . shows n+    PAR_GET_TV n v -> showString ":G" . shows n . shows v+    PAR_SET_TV n v -> showString ":S" . shows n . shows v+    PAR_DB     str -> showString ":D" . shows str++instance Read PARAMETER where+  readsPrec i str = case str of+    ':' : rest -> g rest+    _  -> []+    where g ('R' : str) = [(PAR_RESULT v, rest) | (v, rest) <- reads str]+	  g ('V' : str) = [(PAR_VALUES v, rest) | (v, rest) <- reads str]+	  g ('M' : str) = [(PAR_MARK   v, rest) | (v, rest) <- reads str]+	  g ('I' : str) = [(PAR_IGNORED, str)]+	  g ('T' : str) = [(PAR_TRANS  v, rest) | (v, rest) <- reads str]+	  g ('C' : str) = [(PAR_CRE_TV n v, rest)+			  |(n, str1) <- reads str, (v, rest) <- reads str1]+	  g ('E' : str) = [(PAR_REM_TV n, rest)+			  |(n, rest) <- reads str]+	  g ('G' : str) = [(PAR_GET_TV n v, rest)+			  |(n, str1) <- reads str, (v, rest) <- reads str1]+	  g ('S' : str) = [(PAR_SET_TV n v, rest)+			  |(n, str1) <- reads str, (v, rest) <- reads str1]+	  g ('D' : str) = [(PAR_DB v, rest)     | (v, rest) <- reads str]+	  g _           = []
+ WASH/CGI/MakeTypedName.hs view
@@ -0,0 +1,17 @@+module WASH.CGI.MakeTypedName where++import WASH.CGI.Types++import WASH.Utility.SHA1+import qualified WASH.Utility.Base32 as Base32++-- |Create a probabilistically unique filename from a name and a type+-- descriptor. +makeTypedName :: String -> TySpec -> String+makeTypedName s tys = +  Base32.encode (sha1 s) ++ '-' : Base32.encode (sha1 (tid tys ""))++-- |Create a probabilistically unique filename from a name and the type of a given value. +makeTypedNameFromVal :: Types a => String -> a -> String+makeTypedNameFromVal name val =+  makeTypedName name (ty val)
+ WASH/CGI/PPM.hs view
@@ -0,0 +1,285 @@+-- © 2001 Peter Thiemann+module WASH.CGI.PPM where++import Char++data Pixmap =+     Pixmap	{ width :: Int+     		, height :: Int+		, maximumColorValue :: Int+		, pixelFun :: Int -> Int -> Pixel+		}++type Pixel = (Int, Int, Int)++instance Show Pixmap where+  show pm = if maximumColorValue pm > 255+  	    then showPixmap pm "P3" showAsciiPixel+	    else showPixmap pm "P6" showBinaryPixel+	    +showPixmap pm code showPixel =+  let w = width pm+      h = height pm+  in+  code +++  '\n' : (show w) +++  '\n' : (show h) +++  '\n' : (show $ maximumColorValue pm) +++  '\n' : [ ch | y <- [1..h], x <- [1..w], ch <- showPixel (pixelAt pm x y)]++showAsciiPixel (r, g, b) =+  show r ++ ' ' : show g ++ ' ' : show b ++ "\n"++showBinaryPixel (r, g, b) =+  [chr r, chr g, chr b]++instance Read Pixmap where+  readsPrec i = readsPixmap++readsPixmap ('P':'3':rest) = readsPixmap1 readsAsciiPixel (dropWhile isSpace rest)+readsPixmap ('P':'6':rest) = readsPixmap1 readsBinaryPixel (dropWhile isSpace rest)+readsPixmap str = []++readsPixmap1 readsPixel str = +  do (w, rest1) <- reads str+     (h, rest2) <- reads (dropWhile isSpace rest1)+     (m, rest3) <- reads (dropWhile isSpace rest2)+     (pixs, rest4) <- readsPixels w h readsPixel (dropWhile isSpace rest3)+     return (Pixmap { width = w, +                      height = h, +		      maximumColorValue = m, +		      pixelFun = \x y -> (pixs !! y) !! x }+     	    ,dropWhile isSpace rest4)++readsPixels w h readsPixel str =+  if h > 0 +  then do (sl1, rest1) <- readsScanline w readsPixel str+	  (sls, rest2) <- readsPixels w (h-1) readsPixel rest1+	  return (sl1 : sls, rest2)+  else return ([], str)++readsScanline w readsPixel str =+  if w > 0 +  then do (pix1, rest1) <- readsPixel str+	  (pixs, rest2) <- readsScanline (w-1) readsPixel rest1+	  return (pix1 : pixs, rest2)+  else return ([], str)++readsAsciiPixel str =+  do (r, rest1) <- reads (dropWhile isSpace str)+     (g, rest2) <- reads (dropWhile isSpace rest1)+     (b, rest3) <- reads (dropWhile isSpace rest2)+     return ((r,g,b), rest3)++readsBinaryPixel (cr:cg:cb:rest) =+  return ((ord cr, ord cg, ord cb), rest)+readsBinaryPixel _ =+  []+  +  +++-- ======================================================================++create :: Int -> Int -> Int -> Pixel -> Pixmap+create w h m p = +  Pixmap w h m (const (const p))++oval :: Pixmap -> (Int, Int) -> (Int, Int) -> Pixel -> Bool -> Pixmap+line :: Pixmap -> (Int, Int) -> (Int, Int) -> Pixel -> Pixmap+rectangle :: Pixmap -> (Int, Int) -> (Int, Int) -> Pixel -> Bool -> Pixmap+-- arc+-- poly+-- text+-- bitmap+-- image ++oval pm (xul,yul) (xlr,ylr) p fill =+  pm { pixelFun = fun }+  where w2 = (xlr - xul) `div` 2+	h2 = (ylr - yul) `div` 2+	xm = xul + w2+	ym = yul + h2+	lastfun = pixelFun pm+	fun x y | y < yul || y > ylr || x < xul || x > xlr = lastfun x y+	        | d <= 1.0 && (fill || d >= 0.9) = p+	        | otherwise = lastfun x y+	  where d = fromIntegral ((x - xm) ^ 2) / fromIntegral (w2 ^ 2) ++		    fromIntegral ((y - ym) ^ 2) / fromIntegral (h2 ^ 2)++rectangle pm (xul,yul) (xlr,ylr) p fill =+  pm { pixelFun = fun }+  where lastfun = pixelFun pm+	fun x y | y < yul || y > ylr || x < xul || x > xlr = lastfun x y+	        | x == xul || x == xlr || y == yul || y == ylr || fill = p+		| otherwise = lastfun x y+-- +line = line2++line1 pm (xul,yul) (xlr,ylr) p =+  pm { pixelFun = fun }+  where lastfun = pixelFun pm+	fun x y | x < xul && x < xlr || x > xul && x > xlr || y < yul && y < ylr || y > yul && y > ylr = lastfun x y+	        | (x,y) `elem` points = p+	        | otherwise = lastfun x y+	-- suppose abs dx >= abs dy+	dx = xlr - xul+	dy = ylr - yul+	adx = abs dx+	ady = abs dy+	sdx = signum dx+	sdy = signum dy+	points | adx >= ady = k adx ady sdx sdy xlr ylr (adx `div` 2) (xul,yul)+	       | otherwise  = +       		 [(x,y) | (y,x) <- k ady adx sdy sdx ylr xlr (ady `div` 2) (yul,xul)]+	k adx ady sdx sdy xlr ylr = m+	  where m v (x, y) | x == xlr && y == ylr = [(x,y)]+		           | otherwise = (x, y) : m nv' (nx, ny)+		  where+			nv = v - ady+			nv' | nv > 0 = nv+			    | otherwise = nv + adx+			nx  = x + sdx+			ny  | nv > 0 = y+			    | otherwise = y + sdy++line2 pm (xul,yul) (xlr,ylr) p =+  pm { pixelFun = fun }+  where lastfun = pixelFun pm+	dx = fromIntegral (xlr - xul)+	dy = fromIntegral (ylr - yul)+	xul' = fromIntegral xul+	yul' = fromIntegral yul+-- solve: dx1 * dx + dy1 * dy = 0+	dx1 = - dy+	dy1 = dx+	divisor = dy1 * dx - dy+		+	fun x y | x < xul && x < xlr ||+	          x > xul && x > xlr || +		  y < yul && y < ylr ||+		  y > yul && y > ylr = lastfun x y+		| dx == 0 && x == xul ||+		  dy == 0 && y == yul = p+		| d <= lineWidth = p+		| otherwise = lastfun x y+	  where x' = fromIntegral x+		y' = fromIntegral y+-- solve: x0 = x + t * dx1 +--     && y0 = y + t * dy1+--     && x0 = xul + s * dx +--     && y0 = yul + s * dy+-- for x0, y0, s, t+		s = ((x' - xul') * dy1 + yul' - y') / divisor+		x0 = xul' + s * dx+		y0 = yul' + s * dy+		d = (x0 - x')^2 + (y0 - y')^2+		lineWidth = 1.0++point pm (x0,y0) p =+  pm { pixelFun = fun }+  where lastfun = pixelFun pm+	fun x y | x == x0 && y == y0 = p+	        | otherwise = lastfun x y++comp pm1 pm2 (xul,yul) p =+  pm1 { pixelFun = fun }+  where +    w2 = width pm2+    h2 = height pm2+    lastfun = pixelFun pm1+    fun x y | x2 >= 0 && y2 >= 0 && x2 < w2 && y2 < h2 && p2 /= p = p2+            | otherwise = lastfun x y+      where x2 = x - xul+	    y2 = y - yul+	    p2 = pixelFun pm2 x2 y2++-- for efficiency and versatility rely on external programs:++-- ppmmake : create a canvas+-- pbmtext : create a text image (pbmtopgm; pgmtoppm)+-- pnmcomp : compose two images+-- giftopnm : image to portable anymap++-- missing: ppmline ppmoval++pixelAt :: Pixmap -> Int -> Int -> Pixel+pixelAt =+  pixelFun++-- ======================================================================+-- a picture data type+-- ======================================================================+type Color = (Int, Int, Int)+data Picture = +    Circle Bool		-- radius 1 around origin (filled?)+  | Square Bool		-- unit square, origin= lower left (filled?)+  | Line	-- from origin to (1,0)+  | Colored Color Picture+  | Translate (Double, Double) Picture+  | Rotate Double Picture	-- around origin+  | Scale (Double, Double) Picture+  | Invert Picture+  | And [Picture]+  | Or [Picture]++maxcv (Circle _) = 0+maxcv (Square _) = 0+maxcv (Line) = 0+maxcv (Colored (r,g,b) pic) = maximum [r,g,b,maxcv pic]+maxcv (Translate _ pic) = maxcv pic+maxcv (Rotate _ pic) = maxcv pic+maxcv (Scale _ pic) = maxcv pic+maxcv (Invert pic) = maxcv pic+maxcv (And pics) = maximum (0 : map maxcv pics)+maxcv (Or pics) = maximum (0 : map maxcv pics)++render :: Picture -> Int -> Int -> Color -> Pixmap+render pic w h bg =+  Pixmap { width = w, height = h, maximumColorValue = maxcv pic, pixelFun = pixelAt }+  where pixelAt x y =+	  case renderPix pic bg (fromIntegral x) (fromIntegral y) (sqrt 2) of+	    Nothing -> (0,0,0)+	    Just cl -> cl++renderPix pic bg fx fy fr =+  case pic of+    Circle filled ->		-- radius 1 around origin (filled?)+      let ra = fx * fx + fy * fy in+      if filled then+        if ra <= 1 + fr then Just bg else Nothing+      else+        if abs (ra - 1) <= fr then Just bg else Nothing+    Square filled ->		-- unit square, origin= lower left (filled?)+      if filled then+        if fx + fr >= 0 && fx - fr <= 1 && fy + fr >= 0 && fy - fr <= 1 +	then Just bg else Nothing+      else+        if abs fx <= fr && fy + fr >= 0 && fy - fr <= 1 +	|| abs fy <= fr && fx + fr >= 0 && fx - fr <= 1 +        || abs (fx - 1) <= fr && fy + fr >= 0 && fy - fr <= 1 +	|| abs (fy - 1) <= fr && fx + fr >= 0 && fx - fr <= 1 +	then Just bg else Nothing+    Line ->	-- from origin+      if abs fx <= fr && fy + fr >= 0 && fy - fr <= 1 +      then Just bg else Nothing      +    Colored clr pic ->+      renderPix pic bg fx fy fr >> Just clr+    Translate (dx, dy) pic ->+      renderPix pic bg (fx - dx) (fy - dy) fr+    Rotate phi pic ->	-- around origin+      renderPix pic bg (fx * cos (- phi) - fy * sin (- phi)) +                       (fx * sin (- phi) + fy * cos (- phi)) fr+    Scale (sx, sy) pic ->+      renderPix pic bg (fx / sx) (fy / sy) (max (abs (fr / sx)) (abs (fr / sy)))+    Invert pic ->+      case renderPix pic bg fx fy fr of+        Just _ -> Nothing+	Nothing -> Just bg+    And pics ->+      foldl (\ j pic -> j >> renderPix pic bg fx fy fr) (Just bg) pics+    Or pics ->+      foldl (\ j pic -> case j of +			  Nothing -> renderPix pic bg fx fy fr+			  Just clr -> Just clr+	    ) Nothing pics
+ WASH/CGI/Persistent2.hs view
@@ -0,0 +1,170 @@+-- © 2001, 2002, 2003 Peter Thiemann+{-|This is the preferred, type-indexed implementation of server-side state.++Glossary++A persistent entity (PE) is a time-indexed, named global value.+The current value of a PE is the value that the PE has now.+A handle gives access to a snapshot of a persistent entity at a particular time, potentially in the past.+A handle is /current/ if the value of the PE has not been @set@ or @add@ed to after the creation of the handle.+-}++module WASH.CGI.Persistent2 (T, init, get, set, add, current) where++import WASH.CGI.CGIConfig++import System+import Prelude hiding (init)+import qualified Prelude (init)+import List hiding (init)+import qualified List (init)+import Maybe+import IO+import Directory+import Monad+import Random++import WASH.Utility.Auxiliary+import WASH.CGI.CGI hiding (head, div, span, map)+import WASH.CGI.BaseCombinators (unsafe_io)+import WASH.CGI.Types+import qualified WASH.Utility.Locking as L++import WASH.CGI.StateItem+import WASH.CGI.MakeTypedName+++-- |@init name initialValue@ creates a new PE with name @name@ with initial+-- value @initialValue@ and returns the handle to the initial value. If the PE+-- already exists, then @init@ returns the handle to the current value.+init    :: (Read a, Show a, Types a) => String -> a -> CGI (T a)+-- |@get handle@ retrieves the value of @handle@. This value may not be current+-- because the handle may point to a snapshot from the past.+get     :: (Read a, Types a) => T a -> CGI a+-- |@set handle newValue@ tries to overwrite the value of the pe pointed to by+-- @handle@ with @newValue@. Succeeds @Just handle1@ if @handle@ is current, in+-- this case it returns a handle to the new value. Fails @Nothing@ if the handle+-- is not current. +set     :: (Read a, Show a, Types a) => T a -> a -> CGI (Maybe (T a))+-- |@add handle addValue@ conceptually, this operation adds @addValue@ to the+-- set of values stored in @handle@. Since this set is represented as a list,+-- @handle@ must point to a value of type @[a]@. Since the PE is assumed to+-- contain a set, it does not matter if @handle@ is current. However, the+-- returned handle is guaranteed to be current with a value that contains+-- @addValue@.+add     :: (Read a, Show a, Types a) => T [a] -> a -> CGI (T [a])+-- |@current handle@ returns a handle to the PE pointed to by+-- @handle@. It returns @Nothing@ if @handle@ is still /current/. Otherwise, it+-- returns @Just newHandle@ where @newHandle@ is /current/ in the sense defined+-- above. Using the @newHandle@ obtained from @current@ explicitly discards the+-- value pointed to by @handle@ in favor of a value that may have been stored+-- by a concurrently executing script. Use with caution!+current :: (Read a, Types a) => T a -> CGI (Maybe (T a))+-- +++data P a = P { nr :: Int, vl :: a }+  deriving (Read, Show)++t :: String -> P a -> T a+t name (P i a) = T name i++traceInit =+  -- writeDebugFile (persistent2Dir ++ "TRACE") "" >>+  return ()+trace s = +  -- appendFile (persistent2Dir ++ "TRACE") (s ++ "\n") >>+  return ()++init name val = do+  unsafe_io $+     assertDirectoryExists (List.init persistent2Dir) (return ())+  io $ catch (+     do traceInit+	trace ("P2: init " ++  name ++ " " ++ show val)+	trace ("P2: ty = " ++ show myTyspec)+	trace ("P2: tid ty = " ++ tid myTyspec "")+	trace ("P2: typedName = " ++ typedName)+	trace ("P2: fileName = " ++ show fileName)+	L.obtainLock fileName+	trace ("P2.init: after obtainLock ")+	contents <- readFileStrictly fileName+	trace ("P2.init: after readFileStrictly " ++ contents)+	L.releaseLock fileName+	trace ("P2.init: after releaseLock[1] " ++ contents)+	pairs <- return $ read contents+	return $ t name $ head $ pairs+     )+     $ \ ioError ->+     do trace ("P2.init: ioError caught")+	nonce <- randomIO+	let initialP = P nonce val+	writeFile fileName (show [initialP])+	trace ("P2.init: writing " ++ show [initialP])+	L.releaseLock fileName+	return (t name initialP)+  where+    fileName = persistent2Dir ++ typedName+    myTyspec = ty val+    typedName = makeTypedName name myTyspec++get tn@(T name i) =+  unsafe_io $+  do trace ("P2: get " ++ name ++ " " ++ show i)+     L.obtainLock fileName+     contents <- readFileStrictly fileName+     L.releaseLock fileName+     trace ("P2.get: fileName = " ++ show fileName)+     pairs <- return $ read contents+     return $ vl $ fromJust $ find ((== i) . nr) pairs+  where+    typedName = makeTypedNameFromVal name (tvirtual tn)+    fileName = persistent2Dir ++ typedName++set (T name i) val =+  io $+  do trace ("P2: set " ++ name ++ " " ++ show i ++ " " ++ show val)+     L.obtainLock fileName+     contents <- readFileStrictly fileName+     pairs <- return $ read contents+     i' <- randomIO+     if nr (head pairs) == i+       then do writeFile fileName (show (P i' val : take 15 pairs))+	       L.releaseLock fileName+	       return (Just (T name i'))+       else do L.releaseLock fileName+	       return Nothing+  where+    typedName = makeTypedNameFromVal name val+    fileName = persistent2Dir ++ typedName++add (T name _) val =+  io $+  do trace ("P2: add " ++ name ++ " " ++ show val)+     L.obtainLock fileName+     contents <- readFileStrictly fileName+     pairs <- return $ read contents+     let P i vals = head pairs+     i' <- randomIO+     writeFile fileName (show (P i' (val : vals) : take 15 pairs))+     L.releaseLock fileName+     return (T name i')+  where+    typedName = makeTypedNameFromVal name [val]+    fileName = persistent2Dir ++ typedName++current tn@(T name i) =+  io $+  do trace ("P2: current " ++ name ++ " " ++ show i)+     L.obtainLock fileName+     contents <- readFileStrictly fileName+     L.releaseLock fileName+     pairs <- return $ read contents+     let P i' vals = head pairs+     if i==i'+       then return Nothing+       else return (Just (t name (head pairs)))+  where+    typedName = makeTypedNameFromVal name (tvirtual tn)+    fileName = persistent2Dir ++ typedName+
+ WASH/CGI/RawCGI.hs view
@@ -0,0 +1,10 @@+-- © 2001, 2002 Peter Thiemann+module WASH.CGI.RawCGI+	( CGIProgram+	, CGIOption(..), CGIOptions+	, start+	) where++import WASH.CGI.CGITypes+import WASH.CGI.RawCGIInternal+
+ WASH/CGI/RawCGIInternal.hs view
@@ -0,0 +1,385 @@+-- © 2001, 2002 Peter Thiemann+-- |Low-level interface to CGI scripting.+module WASH.CGI.RawCGIInternal +  (module WASH.CGI.RawCGITypes, module WASH.CGI.RawCGIInternal) +  where+-- (CGIParameter, CGIParameters, start, assocParm, assoc)++import Array+import Char+import IO+import List+import Maybe+import Random+import System+import WASH.Utility.Auxiliary+import WASH.Utility.Unique+import qualified WASH.Utility.URLCoding as URLCoding+import qualified WASH.Utility.RFC2279 as RFC2279++import WASH.CGI.CGIConfig+import WASH.CGI.CGITypes+import WASH.CGI.HTTP+import WASH.CGI.RawCGITypes+import WASH.Utility.BulkIO (rawGetBytes)++import WASH.Utility.Hex++import qualified WASH.CGI.Debug as Debug++getGenericOption isOption defaultOption options =+  fromJust (find isOption (reverse (defaultOption:options)))++-- | Decoding of 'CGIOption'.+isPortOption NoPort = True+isPortOption AutoPort = True+isPortOption (Port _) = True+isPortOption _ = False++getPortOption =+  getGenericOption isPortOption AutoPort++-- | Decoding of 'CGIOption'.+isHttpsOption NoHttps = True+isHttpsOption AutoHttps = True+isHttpsOption _ = False++getHttpsOption =+  getGenericOption isHttpsOption AutoHttps++-- | Decoding of 'CGIOption'.+isURLOption FullURL = True+isURLOption PartialURL = True+isURLOption _ = False++getURLOption =+  getGenericOption isURLOption PartialURL++-- | Decoding of 'CGIOption'.+isSessionOption (SessionMode _) = True+isSessionOption _ = False++getSessionMode =+  unSessionMode . getGenericOption isSessionOption (SessionMode LogOnly)++fieldName = fst+fieldContents = snd++-- |Initial and default content type of a link submission+contentTypeUrlencoded = "application/x-www-form-urlencoded"++-- |Construct a CGI environment from the input and output handle of the current+-- connection and the CGI variables in the environment.+initEnv :: Handle -> Handle -> IO CGIEnv+initEnv hIn hOut =+  do server_name <- protectedGetEnv "SERVER_NAME" "localhost"+     server_port <- protectedGetEnv "SERVER_PORT" "80"+     server_software <- protectedGetEnv "SERVER_SOFTWARE" ""+     server_protocol <- protectedGetEnv "SERVER_PROTOCOL" ""+     gateway_interface <- protectedGetEnv "GATEWAY_INTERFACE" ""+     script_name <- protectedGetEnv "SCRIPT_NAME" ""+     request_method <- protectedGetEnv "REQUEST_METHOD" "GET"+     content_length <- protectedGetEnv "CONTENT_LENGTH" "0"+     content_type <- protectedGetEnv "CONTENT_TYPE" contentTypeUrlencoded+     http_cookie <- protectedGetEnv "HTTP_COOKIE" ""+     http_accept <- protectedGetEnv "HTTP_ACCEPT" ""+     path_info <- protectedGetEnv "PATH_INFO" ""+     path_translated <- protectedGetEnv "PATH_TRANSLATED" ""+     remote_host <- protectedGetEnv "REMOTE_HOST" ""+     remote_addr <- protectedGetEnv "REMOTE_ADDR" ""+     remote_user <- protectedGetEnv "REMOTE_USER" ""+     auth_type <- protectedGetEnv "AUTH_TYPE" ""+     https <- protectedGetEnv "HTTPS" "off"+     raw_args <- getArgs+     let byteCount :: Int+	 byteCount = read ('0':content_length)+	 httpMethod :: Method+	 httpMethod = read request_method+     raw_contents <- case httpMethod of+		       GET -> return ""+		       _   -> rawGetBytes hIn byteCount+     return+       CGIEnv	{ serverName = server_name+		, serverPort = server_port+		, serverSoftware= server_software+		, serverProtocol = server_protocol+		, scriptName = script_name+		, gatewayInterface = gateway_interface+		, requestMethod = httpMethod+		, contentLength = content_length+		, contentType = content_type+		, httpCookie = http_cookie+		, httpAccept = http_accept+		, pathInfo = path_info+		, pathTranslated = path_translated+		, remoteHost = remote_host+		, remoteAddr = remote_addr+		, remoteUser = remote_user+		, authType = auth_type+		, rawContents = raw_contents+		, rawArgs = raw_args+		, handle = hOut+		, httpsEnabled = (https == "on" || server_port == "443")+		}++-- |Main entry point for low-level CGI scripts. Takes a list of 'CGIOption' and+-- a 'CGIProgram' and runs it as a CGI script.+start :: CGIOptions -> (CGIInfo -> CGIParameters -> IO ()) -> IO ()+start options f = +  do env <- initEnv stdin stdout+     Debug.logInput env+     -- use from a CGI program forces standard replay implementation+     startEnv env (SessionMode LogOnly : options) f ++startEnv :: CGIEnv -> CGIOptions -> (CGIInfo -> CGIParameters -> IO ()) -> IO ()+startEnv env options f =+  do let portString = +	   case getPortOption options of+	     AutoPort -> ':' : serverPort env+	     NoPort   -> ""+	     Port num -> ':' : show num+	 schemeString =+	   case getHttpsOption options of+	     AutoHttps -> if httpsEnabled env then "https" else "http"+	     NoHttps -> "http"+	 myurl = +	   case getURLOption options of+	     FullURL ->+	       schemeString ++ "://" ++ serverName env ++ portString +++	 	 scriptName env ++ pathInfo env+	     PartialURL ->+	       scriptName env ++ pathInfo env+	 sessionMode =+	   getSessionMode options+	 methodIsGet +	   = requestMethod env == GET+	 contentIsURLEncoded+	   = contentTypeUrlencoded == map toLower (contentType env)+	 contents = rawContents env+	 rawDecodedParameters +	   | methodIsGet = []+	   | contentIsURLEncoded = map decodeLine $ parameterLines contents+	   | otherwise = decodeMultiPart (contentType env) contents+	 parsed_cookies = parseCookies $ httpCookie env+	 info = CGIInfo { cgiUrl = URL myurl+	 		, cgiPathInfo = pathInfo env+			, cgiScriptName = scriptName env+	 		, cgiContentType = contentType env+			, cgiContents = contents+			, cgiCookies = parsed_cookies+			, cgiArgs = rawArgs env+			, cgiHandle = handle env+			, cgiSessionMode = sessionMode+			}+     decodedParameters <- resolveFiles rawDecodedParameters+     -- appendDebugFile "/tmp/CGIDECODED" (show decodedParameters)+     f info decodedParameters++resolveFiles :: [(String, CGIRawValue)] -> IO CGIParameters+resolveFiles =+  let resolveOne (key, rv) =+        case rv of+          CGIRawString s -> +	    return (key, s)+	  CGIRawFile fileName contentType fileContents ->+	    do localName <- inventFilePath+	       writeFile localName fileContents+	       let fileRef = FileReference+		           { fileReferenceName = localName+			   , fileReferenceContentType = contentType+			   , fileReferenceExternalName = fileName+			   }+	       return (key, show fileRef)+  in mapM resolveOne++parseCookies :: String -> [(String, String)]+parseCookies str = +  let s0 = dropWhile isSpace str in+  if null s0 then [] else+  let (item, rest) = span (/= ';') s0 in+  case span (/= '=') item of+    (key, '=':value) ->+      (key, value) : parseCookies (dropWhile (== ';') rest)+    _ -> +      error ("Trying to parse cookie: " ++ str)++dropSpecialParameters :: [(String,a)] -> [(String,a)]+dropSpecialParameters = filter (f . fieldName)+	where f ('=':_) = False+	      f _ = True++decodeMultiPart :: String -> String -> [(String, CGIRawValue)]+decodeMultiPart contentType contents+  = let Just boundary = extractBoundary contentType +	startBoundary = '-':'-':boundary+	g source = case +	  (+	  advanceIC startBoundary source >>= \afterBoundary ->+	  case afterBoundary of +	   '-':_ -> Nothing+	   '\13':'\10':body ->+		advanceIC "content-disposition: form-data; name=\"" body+		>>= \fieldNameRest ->+		let (fieldName, rest) = span (/= '\"') fieldNameRest in+		advanceIC "\"" rest+		>>= \mayBeFileNameRest ->+		(case mayBeFileNameRest of+		  ';':_ -> advanceIC "; filename=\"" mayBeFileNameRest+		           >>= \fileNameRest ->+		           let (fileName, rest) = span (/= '\"') fileNameRest in+		           advanceIC "\"" rest+		           >>= \mayBeContentTypeRest ->+		           return (Just fileName, mayBeContentTypeRest)+		  _ -> return (Nothing, mayBeFileNameRest))+		>>= \ (mFileName, fileNameRest) ->+		let (contentType, rest) =+		      case advanceIC "\ncontent-type: " fileNameRest of+		        Just contentTypeRest -> span (/= '\13') contentTypeRest+		        Nothing -> ("text/plain", fileNameRest) in+		advanceIC "\n\n" rest+		>>= \contentRest ->+		extractContents startBoundary contentRest+		>>= \ (fieldContents, rest) ->+		-- fieldName must be rfc1522decoded (?)+		let moreParms = g rest +		    rawvalue = case mFileName of+				 Nothing ->+				   CGIRawString $ RFC2279.decode fieldContents+				 Just fileName ->+				   CGIRawFile fileName contentType fieldContents+		in  return ((RFC2279.decode fieldName, rawvalue) : moreParms)+	   )+	  of+	    Just parameters -> parameters+	    Nothing -> []+    in g contents++extractContents :: String -> String -> Maybe (String, String)+extractContents boundary source+  = g "" source+  where g rev "" = Nothing+	g rev ('\r':'\n':xs) = case advanceIC boundary xs of+				Just _  -> Just (reverse rev, xs)+				Nothing -> g ('\n':'\r':rev) xs+	g rev (x:xs) = g (x:rev) xs+++extractBoundary :: String -> Maybe String+extractBoundary contentType = advanceIC "multipart/form-data; boundary=" contentType ++advanceIC :: String -> String -> Maybe String+advanceIC [] ys = Just ys+advanceIC xs [] = Nothing+advanceIC (' ':xs) (y:ys)+	| isSpace y = advanceIC xs (dropWhile isSpace ys)+advanceIC ('\n':xs) ('\13':'\10':ys)+	= advanceIC xs ys+advanceIC (x:xs) (y:ys) +	| toUpper x == toUpper y = advanceIC xs ys+	| otherwise = Nothing++parameterLines :: String -> [String]+parameterLines "" = []+parameterLines xs = let (firstPar, restPar) = span (/= '&') xs in+		    case restPar of+		      '&' : moreParameters -> firstPar : parameterLines moreParameters+		      _ -> [firstPar]++decodeLine :: String -> (String, CGIRawValue)+decodeLine str = +  let (name, '=':value) = span (/= '=') str in+  ( RFC2279.decode $ URLCoding.decode name+  , CGIRawString $ RFC2279.decode $ URLCoding.decode value)++assocParm :: String -> CGIParameters -> Maybe CGIValue+assocParm key =+  listToMaybe . assocParmL key++assocParmL :: String -> CGIParameters -> [CGIValue]+assocParmL key =+  map fieldContents . assocParmR key++assocParmR :: String -> CGIParameters -> CGIParameters+assocParmR key =+  filter (\parm -> fieldName parm == key) ++assoc :: (Eq a) => a -> [(a,b)] -> Maybe b+assoc key alist =+  ass alist +  where ass ((a,b):rest) = if a == key then Just b else ass rest+	ass [] = Nothing -- error ("assoc ("++show key++") "++show alist)++-- update :: [(a,b)] -> a -> b -> [(a,b)]+-- update alist a b = (a,b) : alist++fieldNames :: CGIParameters -> [String]+fieldNames = map fieldName++-- encryption++generateKey :: IO (Maybe (Integer, String, String))+generateKey =+  try (openFile keyFile ReadMode) >>= g+  where+    g (Left ioerror) =+      return Nothing+    g (Right h) =+      do size <- hFileSize h+	 let size2 = size `div` 2+	 pos <- randomRIO (0, size2)+	 if pos < 0+	    then return Nothing +	    else do hSeek h AbsoluteSeek pos+		    xs <- hGetContents h+		    g <- getStdGen+		    return (Just (pos+		    		 ,randomRs (minBound, maxBound) g+				 ,extendRandomly xs))++extendRandomly :: [Char] -> [Char]+extendRandomly xs = h 0 xs+  where h n (x:xs) = x : h (n + ord x) xs+	h n []     = randoms (mkStdGen n)++nrNonces :: Int+nrNonces = 16++makeEncoder :: Maybe (Integer, String, String) -> String -> String+makeEncoder Nothing xs = xs+makeEncoder (Just (i, nonces, keys)) xs = +  show i ++ ';' : encrypt1 (take nrNonces nonces ++ xs) keys++decode :: String -> IO String+decode inp = g (reads inp)+  where+    g :: [(Integer, String)] -> IO String+    g ((pos, ';':encrypted) : _) = +      do h <- openFile keyFile ReadMode+	 hSeek h AbsoluteSeek pos+	 xs <- hGetContents h+	 return (drop nrNonces $ decrypt1 encrypted (extendRandomly xs))+    g _ = return inp++encrypt1 inp keys = map chr (enc 0 (map ord inp) (map ord keys))+  where enc acc [] okeys = []+	enc acc (oinp : oinps) (okey : okeys) =+	  let out = (oinp + okey + acc) `mod` 256 in+	  out : enc ((acc + oinp) `mod` 256) oinps okeys++decrypt1 einp keys = map chr (dec 0 (map ord einp) (map ord keys))+  where dec acc [] okeys = []+	dec acc (oeinp : oeinps) (okey : okeys) =+	  let oinp = (512 + oeinp - okey - acc) `mod` 256 in+	  oinp : dec ((acc + oinp) `mod` 256) oeinps okeys++encrypt, decrypt :: String -> String -> String+encrypt = zipWith cadd+cadd c1 c2 = chr (ord c1 + ord c2 `mod` 256)+decrypt = zipWith csub+csub c1 c2 = chr ((ord c1 + 256 - ord c2) `mod` 256)+{-- +import Bits						    -- ghc specific+encrypt = zipWith cxor+decrypt = zipWith cxor+cxor c1 c2 = chr (ord c1 `xor` ord c2)+--}
+ WASH/CGI/RawCGITypes.hs view
@@ -0,0 +1,61 @@+-- © 2001-2006 Peter Thiemann+-- | Low-level types for raw CGI programming.++module WASH.CGI.RawCGITypes where++import IO++import WASH.CGI.CGITypes+import WASH.CGI.HTTP++type CGIProgram = (CGIInfo -> CGIParameters -> IO ())++type CGIParameter = (String, CGIValue)+type CGIParameters = [CGIParameter]++type CGIValue = String++-- | internal representation of a CGI parameter value+data CGIRawValue =+     CGIRawString String+   | CGIRawFile String String String		    -- ^ name, contentType, content++data CGIInfo = +     CGIInfo    { cgiUrl :: URL+     		, cgiPathInfo :: String+		, cgiScriptName :: String+	       	, cgiContentType :: String+		, cgiContents :: String+		, cgiCookies :: [(String, String)]+		, cgiArgs :: [String]+		, cgiHandle :: Handle+		, cgiSessionMode :: SessionMode+		}++-- | corresponding to CGI environment variables+data CGIEnv =+     CGIEnv	{ serverName :: String+		, serverPort :: String+		, serverSoftware :: String+		, serverProtocol :: String+		, gatewayInterface :: String+		, scriptName :: String+		, requestMethod :: Method+		, contentLength :: String+		, contentType :: String+		, httpAccept :: String+		, httpCookie :: String+		, pathInfo :: String+		, pathTranslated :: String+		, remoteHost :: String+		, remoteAddr :: String+		, remoteUser :: String+		, authType :: String+		+		, rawContents :: String+		, rawArgs :: [String]+		+		, handle :: Handle+		, httpsEnabled :: Bool+		}+
+ WASH/CGI/StateItem.hs view
@@ -0,0 +1,19 @@+-- © 2002 Peter Thiemann+module WASH.CGI.StateItem where++import Char++-- +-- |type of handles to a PE of type @a@+data T a = T String Int | Tvirtual { tvirtual :: a }+instance Show (T a) where+  showsPrec _ (T s i) = showChar 'T' . shows s . shows i+  showsPrec _ (Tvirtual _) = showChar 'V'+instance Read (T a) where+  readsPrec i str = +    case dropWhile isSpace str of+      'T' : str' ->+        [(T s i, str''') | (s, str'') <- reads str', (i, str''') <- reads str'']+      'V' : str' ->+        [(Tvirtual (error "uninitialized tvirtual"), str')]+      _ -> []
+ WASH/CGI/Style.hs view
@@ -0,0 +1,46 @@+-- © 2002 Peter Thiemann+module WASH.CGI.Style (Style(..), using) where++import WASH.HTML.HTMLMonad hiding (map, div, head, span)+import List++infixl 5 :^:+infix 9 :=:++-- |First class style elements. Intended for CSS2.+data Style +  = NoStyle+  | String :=: String	    -- ^primitive style @name :=: value@+  | Style  :^: Style	    -- ^combine two styles+  | Named String	    -- ^reference to style sheet++instance Show Style where+  showsPrec n NoStyle = id+  showsPrec n (s1 :=: s2) = showString s1 . showString ": " . showString s2+  showsPrec n (s1 :^: s2) = shows s1 . showString "; " . shows s2+  showsPrec n (Named s) = id++-- |collects a style into a list of class names and primitive styles+collect :: Style -> ([String], Style)+collect st = g ([],NoStyle) st+  where+    g acc NoStyle = acc+    g (cls, sts) st@(n :=: v) = (cls, st :^: sts)+    g acc (st1 :^: st2) = g (g acc st2) st1+    g (cls, sts) (Named n) = (n : cls, st)++attach :: (Monad m) => Style -> WithHTML x m ()+attach sty = +  let (cls, st) = collect sty in+  do case cls of+       [] -> empty+       _  -> attr "class" (concat $ intersperse " " cls)+     case st of NoStyle -> empty+		_       -> attr "style" (show st)+     +-- |Attaches a style to a field constructor.+using :: (Monad m)+	=> Style+	-> (WithHTML x m b -> c)	-- ^a field constructor, typically 'HTMLField'+	-> WithHTML x m b -> c		-- ^styled version of this constructor+using style elem x = elem (x ## attach style)
+ WASH/CGI/Submit98.hs view
@@ -0,0 +1,322 @@+-- © 2002-2005 Peter Thiemann+-- |Haskell98 version of the submission functions.+module WASH.CGI.Submit98+	( InputHandle, HasValue (value)+	, F0 (F0), F1 (F1), F2 (F2), F3 (F3), F4 (F4), F5 (F5), F6 (F6), F7 (F7), F8 (F8)+	, FL (FL), FA (FA)+	, deF0, deF1, deF2, deF3, deF4, deF5, deF6, deF7, deF8+	, deFL, deFA+	, deValueF0, deValueF1, deValueF2, deValueF3, deValueF4, deValueF5, deValueF6, deValueF7, deValueF8+	, deValueFL, deValueFA+	, submit, submit0, defaultSubmit, DTree, submitx, dtleaf, dtnode+	, submitLink, submitLink0, defaultSubmitLink+	, activate+	)+	where++import WASH.CGI.AbstractSelector+import WASH.CGI.CGIInternals+import WASH.CGI.CGIMonad+import WASH.CGI.EventHandlers+import qualified WASH.CGI.HTMLWrapper as H+import WASH.CGI.InputHandle++import Monad++instance HasValue InputField where+  value inf = valueInputField inf++instance InputHandle (InputField a) where+  validate inf = validateInputField inf+  isBound  inf = ifBound inf+  ihNames  inf = [ifName inf]++data F0 x = F0+deF0 :: r -> (F0 x -> r)+deF0 r F0 = r++deValueF0 r F0 = r++instance InputHandle F0 where+  validate F0 = Right F0+  isBound  F0 = True+  ihNames  F0 = []++data F1 a x = F1 (a x)+deF1 :: (a x -> r) -> (F1 a x -> r)+deF1 g (F1 ax) = g ax++deValueF1 g (F1 ax) = g (value ax)++instance InputHandle a => InputHandle (F1 a) where+  validate (F1 ainv) =+    feither id F1 (validate ainv)+  isBound (F1 ainv) = isBound ainv+  ihNames (F1 ainv) = ihNames ainv++data F2 a b x = F2 (a x) (b x)+deF2 :: (a x -> b x -> r) -> (F2 a b x -> r)+deF2 g (F2 ax bx) = g ax bx++deValueF2 g (F2 ax bx) = g (value ax) (value bx)++instance (InputHandle a, InputHandle b) => InputHandle (F2 a b) where+  validate (F2 ainv binv) =+    feither id (uncurry F2)+    (propagate (validate ainv) (validate binv))+  isBound (F2 ainv binv) =+    isBound ainv && isBound binv+  ihNames (F2 ainv binv) =+    ihNames ainv ++ ihNames binv++data F3 a b c x = F3 (a x) (b x) (c x)+deF3 :: (a x -> b x -> c x -> r) -> (F3 a b c x -> r)+deF3 g (F3 ax bx cx) = g ax bx cx++deValueF3 g (F3 ax bx cx) = g (value ax) (value bx) (value cx)++instance (InputHandle a, InputHandle b, InputHandle c) => InputHandle (F3 a b c) where+  validate (F3 ainv binv cinv) =+    feither id (\ (aval,(bval,cval)) -> F3 aval bval cval)+    (propagate (validate ainv)+     (propagate (validate binv) (validate cinv)))+  isBound (F3 ainv binv cinv) =+    isBound ainv && isBound binv && isBound cinv+  ihNames (F3 ainv binv cinv) =+    ihNames ainv ++ ihNames binv ++ ihNames cinv++data F4 a b c d x = F4 (a x) (b x) (c x) (d x)+deF4 :: (a x -> b x -> c x -> d x -> r) -> (F4 a b c d x -> r)+deF4 g (F4 ax bx cx dx) = g ax bx cx dx++deValueF4 g (F4 ax bx cx dx) = g (value ax) (value bx) (value cx) (value dx)++instance (InputHandle a, InputHandle b, InputHandle c, InputHandle d)+       => InputHandle (F4 a b c d) where+  validate (F4 ainv binv cinv dinv) =+    feither id (\ (aval,(bval,(cval,dval))) -> F4 aval bval cval dval)+    (propagate (validate ainv) +     (propagate (validate binv)+      (propagate (validate cinv) (validate dinv))))+  isBound (F4 ainv binv cinv dinv) =+    isBound ainv && isBound binv && isBound cinv && isBound dinv+  ihNames (F4 ainv binv cinv dinv) =+    ihNames ainv ++ ihNames binv ++ ihNames cinv ++ ihNames dinv++data F5 a b c d e x = F5 (a x) (b x) (c x) (d x) (e x)+deF5 :: (a x -> b x -> c x -> d x -> e x -> r) -> (F5 a b c d e x -> r)+deF5 g (F5 ax bx cx dx ex) = g ax bx cx dx ex++deValueF5 g (F5 ax bx cx dx ex) = g (value ax) (value bx) (value cx) (value dx) (value ex)++instance (InputHandle a, InputHandle b, InputHandle c, InputHandle d, InputHandle e)+       => InputHandle (F5 a b c d e) where+  validate (F5 ainv binv cinv dinv einv) =+    feither id (\ (aval,(bval,(cval,(dval,eval)))) -> F5 aval bval cval dval eval)+    (propagate (validate ainv) +     (propagate (validate binv)+      (propagate (validate cinv)+       (propagate (validate dinv) (validate einv)))))+  isBound (F5 ainv binv cinv dinv einv) =+    isBound ainv && isBound binv && isBound cinv && isBound dinv && isBound einv+  ihNames (F5 ainv binv cinv dinv einv) =+    ihNames ainv ++ ihNames binv ++ ihNames cinv ++ ihNames dinv ++ ihNames einv++data F6 a b c d e f x = F6 (a x) (b x) (c x) (d x) (e x) (f x)+deF6 :: (a x -> b x -> c x -> d x -> e x -> f x -> r) -> (F6 a b c d e f x -> r)+deF6 g (F6 ax bx cx dx ex fx) = g ax bx cx dx ex fx++deValueF6 g (F6 ax bx cx dx ex fx) = g (value ax) (value bx) (value cx) (value dx) (value ex) (value fx)++instance (InputHandle a, InputHandle b, InputHandle c, InputHandle d, InputHandle e, InputHandle f)+       => InputHandle (F6 a b c d e f) where+  validate (F6 ainv binv cinv dinv einv finv) =+    feither id (\ (aval,(bval,(cval,(dval,(eval, fval))))) -> F6 aval bval cval dval eval fval)+    (propagate (validate ainv) +     (propagate (validate binv)+      (propagate (validate cinv)+       (propagate (validate dinv) +        (propagate (validate einv) (validate finv))))))+  isBound (F6 ainv binv cinv dinv einv finv) =+    isBound ainv && isBound binv && isBound cinv && isBound dinv && isBound einv && isBound finv+  ihNames (F6 ainv binv cinv dinv einv finv) =+    ihNames ainv ++ ihNames binv ++ ihNames cinv ++ ihNames dinv ++ ihNames einv ++ ihNames finv++data F7 a b c d e f g x = F7 (a x) (b x) (c x) (d x) (e x) (f x) (g x)+deF7 :: (a x -> b x -> c x -> d x -> e x -> f x -> g x -> r) -> (F7 a b c d e f g x -> r)+deF7 g (F7 ax bx cx dx ex fx gx) = g ax bx cx dx ex fx gx++deValueF7 g (F7 ax bx cx dx ex fx gx) = g (value ax) (value bx) (value cx) (value dx) (value ex) (value fx) (value gx)++instance (InputHandle a, InputHandle b, InputHandle c, InputHandle d, InputHandle e, InputHandle f, InputHandle g)+       => InputHandle (F7 a b c d e f g) where+  validate (F7 ainv binv cinv dinv einv finv ginv) =+    feither id (\ (aval,(bval,(cval,(dval,(eval, (fval, gval)))))) -> F7 aval bval cval dval eval fval gval)+    (propagate (validate ainv) +     (propagate (validate binv)+      (propagate (validate cinv)+       (propagate (validate dinv) +        (propagate (validate einv)+	 (propagate (validate finv) (validate ginv)))))))+  isBound (F7 ainv binv cinv dinv einv finv ginv) =+    isBound ainv && isBound binv && isBound cinv && isBound dinv && isBound einv && isBound finv && isBound ginv+  ihNames (F7 ainv binv cinv dinv einv finv ginv) =+    ihNames ainv ++ ihNames binv ++ ihNames cinv ++ ihNames dinv ++ ihNames einv ++ ihNames finv ++ ihNames ginv++data F8 a b c d e f g h x = F8 (a x) (b x) (c x) (d x) (e x) (f x) (g x) (h x)+deF8 :: (a x -> b x -> c x -> d x -> e x -> f x -> g x -> h x -> r) -> (F8 a b c d e f g h x -> r)+deF8 g (F8 ax bx cx dx ex fx gx hx) = g ax bx cx dx ex fx gx hx++deValueF8 g (F8 ax bx cx dx ex fx gx hx) = g (value ax) (value bx) (value cx) (value dx) (value ex) (value fx) (value gx) (value hx)++instance (InputHandle a, InputHandle b, InputHandle c, InputHandle d, InputHandle e, InputHandle f, InputHandle g, InputHandle h)+       => InputHandle (F8 a b c d e f g h) where+  validate (F8 ainv binv cinv dinv einv finv ginv hinv) =+    feither id (\ (aval,(bval,(cval,(dval,(eval, (fval, (gval, hval))))))) -> F8 aval bval cval dval eval fval gval hval)+    (propagate (validate ainv) +     (propagate (validate binv)+      (propagate (validate cinv)+       (propagate (validate dinv) +        (propagate (validate einv) +	 (propagate (validate finv)+	  (propagate (validate ginv) (validate hinv))))))))+  isBound (F8 ainv binv cinv dinv einv finv ginv hinv) =+    isBound ainv && isBound binv && isBound cinv && isBound dinv && isBound einv && isBound finv && isBound ginv && isBound hinv+  ihNames (F8 ainv binv cinv dinv einv finv ginv hinv) =+    ihNames ainv ++ ihNames binv ++ ihNames cinv ++ ihNames dinv ++ ihNames einv ++ ihNames finv ++ ihNames ginv ++ ihNames hinv++-- |'FL' is required to pass an unknown number of handles of the same+-- type need to the callback function in a form submission. The+-- handles need to be collected in a list and then wrapped in the 'FL' data constructor+data FL a x = FL [a x]+deFL :: ([a x] -> r) -> (FL a x -> r)+deFL g (FL axs) = g axs++deValueFL g (FL axs) = g (map value axs)++instance InputHandle a => InputHandle (FL a) where+  validate (FL ainvs) =+    g (map validate ainvs)		 -- [Either [ValidationError] (h VALID)]+    where +    g = foldr h (Right (FL []))+    h ev evs = feither id (\ (v, FL vs) -> FL (v : vs)) (propagate ev evs)+  isBound (FL ainvs) =+    all isBound ainvs+  ihNames (FL ainvs) =+    concatMap ihNames ainvs++-- |'FA' comes handy when you want to tag an input handle with some extra+-- information, which is not itsefl an input handle and which is not validated+-- by a form submission. The tag is the first argument and the handle is the+-- second argument of the data constructor.+data FA a b x = FA a (b x)+deFA :: (a -> b x -> r) -> (FA a b x -> r)+deFA g (FA a bx) = g a bx++deValueFA g (FA a bx) = g a (value bx)++instance InputHandle b => InputHandle (FA a b) where+  validate (FA a binv) =+    feither id (FA a) (validate binv)+  isBound (FA a binv) =+    isBound binv+  ihNames (FA a binv) =+    ihNames binv++-- |Create a submission button with attached action.+submit :: (CGIMonad cgi, InputHandle h)+	=> h INVALID		-- ^input field handles to be validated and passed to callback action +	-> (h VALID -> cgi ())	-- ^callback maps valid input handles to a CGI action+	-> HTMLField cgi x y ()	-- ^returns a field so that attributes can be attached+submit = submitInternal False++-- |Create a continuation button that takes no parameters.+submit0 :: (CGIMonad cgi) => cgi () -> HTMLField cgi x y ()+submit0 cont = submit F0 (\F0 -> cont)++-- |Create a submission button whose attached action is fired whenever the form+-- is submitted without explicitly clicking any submit button. This can happen if+-- an input field has an attached onclick="submit()" action.+defaultSubmit :: (CGIMonad cgi, InputHandle h) =>+  h INVALID -> (h VALID -> cgi ()) -> HTMLField cgi x y ()+defaultSubmit = submitInternal True++-- |Create an ordinary link serving as a submission button.+submitLink :: (CGIMonad cgi, InputHandle h) =>+  h INVALID -> (h VALID -> cgi ()) -> H.HTMLCons x y cgi ()+submitLink = submitInternalLink False++-- |Create a continuation link.+submitLink0 :: (CGIMonad cgi) => cgi () -> H.HTMLCons x y cgi ()+submitLink0 cont = submitLink F0 (const cont)++defaultSubmitLink :: (CGIMonad cgi, InputHandle h) =>+  h INVALID -> (h VALID -> cgi ()) -> H.HTMLCons x y cgi ()+defaultSubmitLink = submitInternalLink True++-- |Abstract type of decisions trees. These trees provide structured validation.+newtype DTree cgi x y = DTree { unDTree :: HTMLField cgi x y () }++-- |Create a submission button whose validation proceeds according to a decision+-- tree. Trees are built using 'dtleaf' and 'dtnode'.+submitx :: DTree cgi x y -> HTMLField cgi x y ()+submitx = unDTree++-- |Create a leaf in a decision tree from a CGI action. +dtleaf :: (CGIMonad cgi) => cgi () -> DTree cgi x y+dtleaf action = DTree $ submit0 action++-- |Create a node in a decision tree. Takes an invalid input field and a+-- continuation. Validates the input field and passes it to the continuation if+-- the validation was successful. The continuation can dispatch on the value of+-- the input field and produces a new decision tree.+dtnode :: (CGIMonad cgi, InputHandle h) =>+  h INVALID -> (h VALID -> DTree cgi x y) -> DTree cgi x y+dtnode hinv next =+  if isBound hinv then+  case validate hinv of+    Right hval ->+      next hval+    Left ss ->+      DTree $ internalSubmitField False (Left ss)+  else +    DTree $ internalSubmitField False (Left [])++submitInternal isDefault hinv g =+  internalSubmitField isDefault (validator hinv g)++validator hinv g =+  either Left (Right . g) (validate hinv)++submitInternalLink isDefault hinv g =+  internalSubmitLink isDefault (validator hinv g)+    ++instance HasValue RadioGroup where+  value rg = valueRadioGroup rg++instance InputHandle (RadioGroup a) where+  validate rg = validateRadioGroup rg+  isBound rg = radioBound rg+  ihNames rg = [radioName rg]++instance HasValue SelectionGroup where+  value sg = valueSelectionGroup sg++instance InputHandle (SelectionGroup a) where+  validate sg = validateSelectionGroup sg+  isBound sg = selectionBound sg+  ihNames sg = [selectionName sg]++-- |Attach a CGI action to the value returned by the input field. Activation+-- means that data is submitted as soon as it is entered.+activate :: (CGIMonad cgi, InputHandle (i a), HasValue i) =>+  (a -> cgi ()) -> HTMLField cgi x y (i a INVALID) -> HTMLField cgi x y (i a INVALID)+activate actionFun inputField attrs =+  do invalid_inf <- inputField (do attrs+				   onChange $ "WASHSubmit(this.name);")+     let r = validate invalid_inf+	 rv = either Left (Right . value) r+     when (isBound invalid_inf) $+       activateInternal actionFun (head $ ihNames invalid_inf) rv+     return invalid_inf
+ WASH/CGI/SubmitXX.hs view
@@ -0,0 +1,191 @@+{-# OPTIONS_GHC -fglasgow-exts -fallow-undecidable-instances #-}+-- © 2002-2005 Peter Thiemann+-- |Extended-Haskell version of the submission functions.+module WASH.CGI.SubmitXX where++import WASH.CGI.CGIInternals+import WASH.CGI.CGIMonad+import WASH.CGI.EventHandlers++import Monad++class StripHandle hx x | hx -> x where+  validate :: hx -> Either [ValidationError] x+  isBound :: hx -> Bool+  ihNames :: hx -> [String]++instance StripHandle (InputField a x) a where+  validate inf =+    case validateInputField inf of+      Left ss ->+        Left ss+      Right _ ->+        Right $ valueInputField inf+  isBound inf =+    ifBound inf+  ihNames inf =+    [ifName inf]++instance StripHandle (RadioGroup a x) a where+  validate rg =+    case validateRadioGroup rg of+      Left ss ->+        Left ss+      Right _ ->+        Right $ valueRadioGroup rg+  isBound rg =+    radioBound rg+  ihNames rg =+    [radioName rg]++instance StripHandle () () where+  validate () = Right ()+  isBound () = True+  ihNames () = []++instance (StripHandle hx x, StripHandle hy y) => StripHandle (hx, hy) (x, y) where+  validate (hx, hy) =+    propagate (validate hx) (validate hy)+  isBound (hx, hy) =+    isBound hx && isBound hy+  ihNames (hx, hy) =+    ihNames hx ++ ihNames hy++instance (StripHandle hx x, StripHandle hy y, StripHandle hz z) +	=> StripHandle (hx, hy, hz) (x, y, z) where+  validate (hx, hy, hz) =+    feither id (\ (x, (y, z)) -> (x, y, z)) $+    propagate (validate hx) (propagate (validate hy) (validate hz))+  isBound (hx, hy, hz) =+    isBound hx && isBound (hy, hz)+  ihNames (hx, hy, hz) =+    ihNames hx ++ ihNames (hy, hz)++instance (StripHandle hx x, StripHandle hy y, StripHandle hz z, StripHandle ha a)+	=> StripHandle (hx, hy, hz, ha) (x, y, z, a) where+  validate (hx, hy, hz, ha) =+    feither id (\ ((x, y), (z, a)) -> (x, y, z, a)) $+    propagate+      (propagate (validate hx) (validate hy))+      (propagate (validate hz) (validate ha))+  isBound (hx, hy, hz, ha) =+    isBound (hx, hy) && isBound (hz, ha)+  ihNames (hx, hy, hz, ha) =+    ihNames (hx, hy) ++ ihNames (hz, ha)++instance (StripHandle hx x, StripHandle hy y, StripHandle hz z, StripHandle ha a, StripHandle hb b)+	=> StripHandle (hx, hy, hz, ha, hb) (x, y, z, a, b) where+  validate (hx, hy, hz, ha, hb) =+    feither id (\ ((x, y), (z, (a, b))) -> (x, y, z, a, b)) $+    propagate+      (propagate (validate hx) (validate hy))+      (propagate (validate hz) (propagate (validate ha) (validate hb)))+  isBound (hx, hy, hz, ha, hb) =+    isBound (hx, hy) && isBound (hz, (ha, hb))+  ihNames (hx, hy, hz, ha, hb) =+    ihNames (hx, hy) ++ ihNames (hz, (ha, hb))++instance (StripHandle hx x, StripHandle hy y, StripHandle hz z, StripHandle ha a, StripHandle hb b, StripHandle hc c)+	=> StripHandle (hx, hy, hz, ha, hb, hc) (x, y, z, a, b, c) where+  validate (hx, hy, hz, ha, hb, hc) =+    feither id (\ ((x, y, z), (a, b, c)) -> (x, y, z, a, b, c)) $+    propagate+      (validate (hx, hy, hz)) (validate (ha, hb, hc))+  isBound (hx, hy, hz, ha, hb, hc) =+    isBound (hx, hy, hz) && isBound (ha, hb, hc)+  ihNames (hx, hy, hz, ha, hb, hc) =+    ihNames (hx, hy, hz) ++ ihNames (ha, hb, hc)++instance (StripHandle hx x, StripHandle hy y, StripHandle hz z, StripHandle ha a, StripHandle hb b, StripHandle hc c, StripHandle hd d)+	=> StripHandle (hx, hy, hz, ha, hb, hc, hd) (x, y, z, a, b, c, d) where+  validate (hx, hy, hz, ha, hb, hc, hd) =+    feither id (\ ((x, y, z), (a, b, c, d)) -> (x, y, z, a, b, c, d)) $+    propagate+      (validate (hx, hy, hz)) (validate (ha, hb, hc, hd))+  isBound (hx, hy, hz, ha, hb, hc, hd) =+    isBound (hx, hy, hz) && isBound (ha, hb, hc, hd)+  ihNames (hx, hy, hz, ha, hb, hc, hd) =+    ihNames (hx, hy, hz) ++ ihNames (ha, hb, hc, hd)++instance (StripHandle hx x, StripHandle hy y, StripHandle hz z, StripHandle ha a, StripHandle hb b, StripHandle hc c, StripHandle hd d, StripHandle he e)+	=> StripHandle (hx, hy, hz, ha, hb, hc, hd, he) (x, y, z, a, b, c, d, e) where+  validate (hx, hy, hz, ha, hb, hc, hd, he) =+    feither id (\ ((x, y, z), (a, b, c, d, e)) -> (x, y, z, a, b, c, d, e)) $+    propagate+      (validate (hx, hy, hz)) (validate (ha, hb, hc, hd, he))+  isBound (hx, hy, hz, ha, hb, hc, hd, he) =+    isBound (hx, hy, hz) && isBound (ha, hb, hc, hd, he)+  ihNames (hx, hy, hz, ha, hb, hc, hd, he) =+    ihNames (hx, hy, hz) ++ ihNames (ha, hb, hc, hd, he)++instance (StripHandle hw w, StripHandle hx x, StripHandle hy y, StripHandle hz z, StripHandle ha a, StripHandle hb b, StripHandle hc c, StripHandle hd d, StripHandle he e)+	=> StripHandle (hw, hx, hy, hz, ha, hb, hc, hd, he) (w, x, y, z, a, b, c, d, e) where+  validate (hw, hx, hy, hz, ha, hb, hc, hd, he) =+    feither id (\ ((w, x, y, z), (a, b, c, d, e)) -> (w, x, y, z, a, b, c, d, e)) $+    propagate+      (validate (hw, hx, hy, hz)) (validate (ha, hb, hc, hd, he))+  isBound (hw, hx, hy, hz, ha, hb, hc, hd, he) =+    isBound (hw, hx, hy, hz) && isBound (ha, hb, hc, hd, he)+  ihNames (hw, hx, hy, hz, ha, hb, hc, hd, he) =+    ihNames (hw, hx, hy, hz) ++ ihNames (ha, hb, hc, hd, he)++instance (StripHandle hx x) => StripHandle [hx] [x] where+  validate hxs =+    foldr (\ hx xs -> feither id (uncurry (:)) $ propagate (validate hx) xs)+          (Right []) hxs+  isBound hxs =+    all isBound hxs+  ihNames hxs =+    concatMap ihNames hxs++-- |create a submission button with attached action+submit, defaultSubmit :: (CGIMonad cgi, StripHandle handle_a a)+	=> handle_a+	-> (a -> cgi ())+	-> HTMLField cgi x y ()+submit = submitInternal False+defaultSubmit = submitInternal True++-- |create a continuation button with parameters+submit0 :: (CGIMonad cgi) => cgi () -> HTMLField cgi x y ()+submit0 cont = submit () (const cont)++submitInternal isDefault hinv g =+  case validate hinv of+    Right hval ->+      internalSubmitField isDefault (Right (g hval))+    Left ss ->+      internalSubmitField isDefault (Left ss)++newtype DTree cgi x y = DTree { unDTree :: HTMLField cgi x y () }++-- |submission with staged validation+submitx :: DTree cgi x y -> HTMLField cgi x y ()+submitx = unDTree++dtleaf :: (CGIMonad cgi) => cgi () -> DTree cgi x y+dtleaf action = DTree $ submit0 action++dtnode :: (CGIMonad cgi, StripHandle handle_a a) =>+  handle_a -> (a -> DTree cgi x y) -> DTree cgi x y+dtnode hinv next =+  if isBound hinv then+  case validate hinv of+    Right hval ->+      next hval+    Left ss ->+      DTree $ internalSubmitField False (Left ss)+  else +    DTree $ internalSubmitField False (Left [])+  +-- |Attach a CGI action to the value returned by the input field. Activation+-- means that data is submitted as soon as it is entered.+activate :: (CGIMonad cgi, StripHandle ha a) =>+  (a -> cgi ()) -> HTMLField cgi x y ha -> HTMLField cgi x y ha+activate actionFun inputField attrs =+  do invalid_inf <- inputField (do attrs+				   onChange $ "WASHSubmit(this.name);")+     let rv = validate invalid_inf+     when (isBound invalid_inf) $+       activateInternal actionFun (head $ ihNames invalid_inf) rv+     return invalid_inf
+ WASH/CGI/TCGI.hs view
@@ -0,0 +1,31 @@+-- © 2006 Peter Thiemann+{- | Wrapper for the WASH.CGI.CGI monad type. Internal use only. Intended for+-- wrapping transactions. +-}++module WASH.CGI.TCGI where++import WASH.CGI.CGIMonad++-- |Type of a 'CGI' action in a transactional scope with a result variable of+-- type @a@.+newtype TCGI b a =+  TCGI { unTCGI :: CGIAction a }++outof :: TCGI b a -> CGI a+outof = CGI . unTCGI++into :: CGI a -> TCGI b a+into = TCGI . unCGI ++instance Monad (TCGI b) where+  return x = +    into (return x)+  m >>=  f = +    into (outof m >>= (outof . f))++instance CGIMonad (TCGI b) where+  wrapCGI = TCGI+  unwrapCGI = unTCGI+  chooser x y = return y+
+ WASH/CGI/Transaction.hs view
@@ -0,0 +1,393 @@+-- © 2006 Peter Thiemann+{- | Transactional, type-indexed implementation of server-side state.++Glossary++A transactional entity (TE) is a named multi-versioned global variable.+-}++module WASH.CGI.Transaction (+  T (), init, create, remove, get, set,+  with, Control (..),+  TCGI ()+  ) where++import qualified WASH.CGI.BaseCombinators as B+import qualified WASH.CGI.CGIConfig as Conf+import WASH.CGI.CGIMonad+import WASH.CGI.CGI hiding (head, div, span, map)++import WASH.CGI.TCGI (TCGI)+import qualified WASH.CGI.TransactionUtil as TU+import WASH.CGI.TransactionUtil (Control (..))+import WASH.CGI.LogEntry+import WASH.CGI.MakeTypedName+import WASH.CGI.Types++import qualified WASH.CGI.HTMLWrapper as H hiding (map,head)++import qualified WASH.Utility.Auxiliary as Aux+import qualified WASH.Utility.Locking as L+import qualified WASH.Utility.Unique as Unique++import Directory+import IO+import qualified List+import Maybe+import Monad+import Prelude hiding (init)++transactionLock = Conf.transactionDir++-- |Handle of a transactional variable+newtype T a = +  T String+  deriving (Read, Show)++-- |Attempt to create a new tv @n@ and set its initial value. Returns handle to+-- the variable. If the variable already exists, then just returns the handle.+init :: (Types a, Read a, Show a) => String -> a -> TCGI b (T a)+init name val =+  let v = show val +      typedName = makeTypedNameFromVal name val+      h = T typedName +  in+  wrapCGI (\ cgistate ->+    case inparm cgistate of+      [] ->			    -- first time here+        do Aux.assertDirectoryExists (List.init Conf.transactionDir) (return ())+	   -- must try to read the variable at this point +	   -- because it may only exist in the log+	   let out = outparm cgistate+	   ev <- try (readValue out typedName)+	   let newparm =+	         case ev of+		   Left _ ->+		     -- value did not exist (but don't write it now)+		     PAR_CRE_TV typedName v+		   Right (v', cached) ->+		     -- value did exist (although we have not read its value)+		     PAR_GET_TV typedName v'+	   return (h, cgistate { outparm = newparm : out })+      PAR_CRE_TV _ _ : rest ->      -- created the variable+	return (h, cgistate { inparm = rest })+      PAR_GET_TV _ _ : rest ->      -- touched existing variable+	return (h, cgistate { inparm = rest })+      le : rest ->+	error ("Transaction.init: got log entry "+	       ++ show le +++	       ". This should not happen")+  )+++-- |Read transactional variable through a typed handle.+get :: (Read a, Show a) => T a -> TCGI b a+get (T typedName) =+  wrapCGI (\ cgistate ->+    case inparm cgistate of+      [] ->+        -- check the log for preceding reads and  writes;+        --  then fall back to physical read+        let out = outparm cgistate in+        do (v, cached) <- readValue out typedName+	   let newparm | cached    = PAR_RESULT v+		       | otherwise = PAR_GET_TV typedName v+	   return (read v, cgistate { outparm = newparm : out })+      PAR_GET_TV _ v : rest ->+	return (read v, cgistate { inparm = rest })+      PAR_RESULT v : rest ->+	return (read v, cgistate { inparm = rest })+      _ ->+	error "Transaction.get: this should not happen"+  )++-- |Write to a transactional variable through typed handle. Only affects the+-- log, no /physical/ write happens. Checks physically for existence of the+-- variable (but tries the log first). Raises exception if it does not exist.+set :: (Read a, Show a) => T a -> a -> TCGI b ()+set (T typedName) val =+  let v = show val+  in+  wrapCGI (\ cgistate ->+    case inparm cgistate of+      [] ->+        do let newparm = PAR_SET_TV typedName v +	       out = outparm cgistate+	   readValue out typedName -- must not fail+	   return ((), cgistate { outparm = newparm : outparm cgistate })+      PAR_SET_TV _ _ : rest ->+	return ((), cgistate { inparm = rest })+      _ ->+	error "Transaction.set: this should not happen"+  )++-- |Create a fresh transactional variable with an initial value and return its+-- handle. Performs a physical write to ensure that the variable's name is+-- unique. Locks the transaction directory during the write operation.+create :: (Read a, Show a, Types a) => a -> TCGI b (T a)+create val =+  let v = show val+      obtainUniqueHandle =+	do name <- Unique.inventStdKey+	   let typedName = makeTypedNameFromVal name val+	       h = T typedName+	   L.obtainLock transactionLock+	   conflict <- reallyExists typedName+	   unless conflict $ reallyWrite typedName v+	   L.releaseLock transactionLock+	   if conflict then obtainUniqueHandle else return h+  in+  do wrapCGI $ \ cgistate ->+       case inparm cgistate of+	 [] ->+           do Aux.assertDirectoryExists (List.init Conf.transactionDir) (return ())+	      h@(T typedName) <- obtainUniqueHandle+	      return (h, cgistate { outparm = PAR_CRE_TV typedName v : outparm cgistate })+	 PAR_CRE_TV typedName _ : rest ->+	   return (T typedName, cgistate { inparm = rest })+	 _ ->+	   error "Transaction.create: this should not happen"+++-- |Remove a transactional variable. Subsequent read accesses to this variable+-- will make the transaction fail. May throw an exception if the variable is not+-- present.+remove :: (Types a) => T a -> TCGI b ()+remove (T typedName) =+     wrapCGI (\ cgistate ->+       case inparm cgistate of+	 [] ->+	   -- check that the variable exists+           -- will raise an exception otherwise+	   let out = outparm cgistate in+           do readValue out typedName+	      return ((), cgistate { outparm = PAR_REM_TV typedName : out })+	 PAR_REM_TV _ : rest ->+	   return ((), cgistate { inparm = rest })+	 _ ->+	   error "Transaction.remove: this should not happen"+       )+++-- | @with@ creates a transactional scope in which transactional variables can+-- be manipulated. Transactions may be nested to an arbitrary depth, although a+-- check with the current state of the world only occurs at the point where the+-- top-level transaction tries to commit. +-- +-- @with@ takes three parameters, a default value of type @result@, a+-- continuation, and a body function that maps a @Control@ record to a+-- transactional computation. There are three ways in which a+-- transaction may be completed. First, the transaction may be abandoned+-- explicitly by a call to the @abandon@ function supplied as part of the+-- @Control@ record. In this case, the continuation is invoked on a pre-set+-- failure return value. Second, the transaction body runs to completion but+-- fails to commit. In this case, the continuation is also invoked on the+-- pre-set failure return value. Third, the transaction body runs to completion+-- and commits successfully. In this case, the continuation is invoked, but on+-- the pre-set success value. +-- The @result@-type argument initializes the default return value for both, the+-- success and the failure case. The body function implements the body of the+-- transaction. +-- +class CGIMonad cgi => WithMonad cgi where+  with :: (Read result, Show result) =>+	  result +	  -> (result -> cgi ())+	  -> (TU.Control (TCGI result) result -> (TCGI result) ())+	  -> cgi ()++instance WithMonad CGI where+  with result onResult fun =+     TU.withCGI commitFromLog result onResult fun++instance WithMonad (TCGI x) where+-- !!! needs to be checked !!!+  with result onResult fun =+     TU.withTCGI (const $ return True) result onResult fun++-- |Read value of a variable first from log prefix. Return value @True@+-- indicates a value from the log, @False@ indicates a value read from file. May+-- raise an exception if the variable has been removed.+readValue :: [PARAMETER] -> String -> IO (String, Bool)+readValue [] n =+  do v' <- reallyRead n+     return (v', False)+readValue (PAR_SET_TV n' v':rest) n =+  if n==n' +  then return (v', True)		    -- has been overwritten +  else readValue rest n+readValue (PAR_GET_TV n' v':rest) n =+  if n==n' +  then return (v', True)		    -- read before+  else readValue rest n+readValue (PAR_CRE_TV n' v':rest) n =+  if n==n'+  then return (v', True)+  else readValue rest n+readValue (PAR_REM_TV n':rest) n =+  if n==n'+  then fail ("Transactional variable " ++ n ++ " has vanished")+  else readValue rest n+readValue (PAR_TRANS stid:rest) n =+  do v' <- reallyRead n+     return (v', False)+readValue (_:rest) n =+  readValue rest n++-- |Descriptor of a transactional variable.+data TV_DESC +  = TV_DESC { tv_name :: String+	      -- ^ variable name +	    , tv_old :: Maybe (Maybe String)+	      -- ^ value on first read+              --   @Nothing@ if not read+              --   @Just Nothing@ if created+	      --   @Just (Just val)@ first value+	    , tv_new :: Maybe (Maybe String)+	      -- ^ value after last write+	      --   @Nothing@ if not written to+	      --   @Just Nothing@ if removed+	      --   @Just (Just val)@ if @val@ was written+	    }+  deriving Show++-- |Obtain list of descriptors of transaction variables from a list of log+-- entries. Each variable has at most one descriptor. Input list is in reverse+-- chronological order, /e.g./, the earliest entries come last.+getDescriptors :: [PARAMETER] -> [TV_DESC]+getDescriptors logEntries =+  foldr f [] logEntries+  where+    f (PAR_GET_TV n v) r = doRead n v r+    f (PAR_SET_TV n v) r = doWrite n v r+    f (PAR_CRE_TV n v) r = doCreate n v r+    f (PAR_REM_TV n)   r = doRemove n r+    f _ r = r++    doCreate n v ds =+      TV_DESC {tv_name = n, tv_old = Just Nothing, tv_new = Just (Just v)}+	: ds+    doRemove n ds =+      doProcess g n ds+	where+	  g (TV_DESC { tv_old = Just Nothing } : rest) = +	    rest+	  g (tvd : rest) =+	    tvd { tv_new = Just Nothing } : rest+	  g [] =+	    [TV_DESC {tv_name = n, tv_old = Nothing, tv_new = Just Nothing}]+    doProcess g n ds =+      f ds+      where+	f [] =+	  g []+	f ds@(d':ds') =+	  if tv_name d' == n then g ds else d' : f ds'+    doRead n v ds =+      doProcess h n ds+      where +        h [] = +	  [TV_DESC {tv_name = n, tv_old = Just (Just v), tv_new = Nothing }]+	h (tvd : rest) =+	  tvd : rest					    -- not first read+    doWrite n v ds = +      doProcess h n ds+      where+        h [] = +	  [TV_DESC {tv_name = n, tv_old = Nothing, tv_new = Just (Just v) }]+	h (tvd : rest) =+	  tvd { tv_new = Just (Just v) } : rest		    -- do write+    +-- | Get the descriptors and try to commit+commitFromLog :: [PARAMETER] -> IO Bool+commitFromLog =+  tryToCommit . getDescriptors++-- |Attempt to commit a list of descriptors by checking for the old values to+-- match and then overwriting with the new values. A read-only transaction+-- always succeeds, even if the values have changed after they have been+-- read. Returns @True@ if commit succeeded.+tryToCommit :: [TV_DESC] -> IO Bool+tryToCommit ds =+  if checkOnlyReads ds then return True else+  do L.obtainLock transactionLock+     oldValuesPreserved <- checkOldValuesPreserved ds+     when oldValuesPreserved (writeNewValues ds)+     L.releaseLock transactionLock+     return oldValuesPreserved++-- |Check if the values of all transactional variable in a list of descriptors+-- match the current values. Called with all variables locked.+checkOldValuesPreserved :: [TV_DESC] -> IO Bool+checkOldValuesPreserved [] = +  return True+checkOldValuesPreserved (d:ds) =+  do b <- checkOldValuePreserved d+     if b then checkOldValuesPreserved ds+	  else return False++checkOldValuePreserved :: TV_DESC -> IO Bool+checkOldValuePreserved d =+  do +  let n = tv_name d+  varExists <- reallyExists n+  case tv_old d of+    Nothing ->		-- not read, check for presence+      return varExists+    Just Nothing ->	-- created, check that it does *not* exist now+      return (not varExists)+    Just (Just ov) ->	-- read old value @ov@+      if varExists+	 then  -- value is still present; check if equal+	   do cv <- reallyRead n+	      return (cv == ov)+	 else -- value has disappeared: fail+	   return False++-- |Overwrite transactional variables from a list of descriptors with new values.+writeNewValues :: [TV_DESC] -> IO ()+writeNewValues ds = +  mapM_ g ds+  where+    g d = +      let n = tv_name d in+      case tv_new d of+	Nothing -> 		-- not written+	  return ()+	Just Nothing -> 	-- removed+	  reallyRemove n+	Just (Just nv) ->	-- new value+	  reallyWrite n nv++-- |Check that no variable has been written to.+checkOnlyReads :: [TV_DESC] -> Bool+checkOnlyReads ds = +  and (map wasNotWritten ds)+  where+    wasNotWritten d =+      isNothing (tv_new d)+	 +-- |Physically access current shared value of transactional variable. Internal+-- use only.+reallyRead :: String -> IO String+reallyRead n =+  let fileName = Conf.transactionDir ++ n in+  Aux.readFileStrictly fileName++-- |Physically overwrite current shared value of transactional variable.+reallyWrite :: String -> String -> IO ()+reallyWrite n v =+  let fileName = Conf.transactionDir ++ n in+  writeFile fileName v++-- |Physically checks the existence of a transactional variable.+reallyExists :: String -> IO Bool+reallyExists n =+  let fileName = Conf.transactionDir ++ n in+  doesFileExist fileName++-- |Physically remove transactional variable.+reallyRemove :: String -> IO ()+reallyRemove n =+  let fileName = Conf.transactionDir ++ n in+  removeFile fileName
+ WASH/CGI/TransactionUtil.hs view
@@ -0,0 +1,353 @@+-- © 2006 Peter Thiemann+{- | Generic utilities for implementing transactionsal memories+-}+module WASH.CGI.TransactionUtil +  (withCGI, withTCGI, Control (..))+  where++import qualified WASH.CGI.BaseCombinators as B+import qualified WASH.CGI.HTMLWrapper as H hiding (map,head)++import WASH.CGI.CGIMonad+import WASH.CGI.LogEntry++import IO++import WASH.CGI.TCGI++-- | Checks presence of a transaction mark on the stack+onStack :: String -> [PARAMETER] -> Bool+onStack stid parms =+  any h parms+  where+    h (PAR_TRANS stid') = stid' == stid+    h _ = False++-- | Pops log entries up to and including the transaction mark with given state+-- ID. +popTo :: String -> [PARAMETER] -> [PARAMETER]+popTo stid parms =+  g parms+  where+    g [] = error "popTo did not find its transaction mark"+    g (PAR_TRANS stid' : rest) | stid' == stid = rest+    g (_ : rest) = popTo stid rest++-- | Splits the log at the transaction mark with given state ID.+splitTo :: String -> [PARAMETER] -> ([PARAMETER], [PARAMETER])+splitTo stid parms =+  g parms+  where+    g [] = error "splitTo did not find its transaction mark"+    g (mark@(PAR_TRANS stid') : rest) | stid' == stid =+      ([mark], rest)+    g (entry : rest) =+      let (prefix, rest') = splitTo stid rest in+      (entry : prefix, rest')++-- | Applies a function to a transaction mark with given state ID.+applyTo :: String -> ([PARAMETER] -> [PARAMETER]) -> ([PARAMETER] -> [PARAMETER])+applyTo stid trafo parms =+  g parms []+  where+    g [] _ = error "applyTo did not find its transaction mark"+    g (mark@(PAR_TRANS stid') : rest) acc | stid' == stid =+      reverse (trafo (mark : acc)) ++rest+    g (entry : rest) acc =+      g rest (entry : acc)++data Control cgi result =+    Control { abandon   :: result -> cgi ()	-- ^ abandon with result (rollback)+	    , setFail   :: result -> cgi ()	-- ^ set result on failure+	    , setCommit :: result -> cgi ()	-- ^ set result on successful commit+	    }++with :: (CGIMonad cgi, Read result, Show result) =>+	  ([PARAMETER] -> IO Bool)	    -- committer function+	  -> result				-- default result+	  -> (result -> cgi ()) 		-- result continuation+	  -> (Control (TCGI result) result -> (TCGI result) ())+	  -> cgi ()+with commitFromLog result onResult fun =+  wrapCGI (\cgistate -> +    let abandon stid res =+	  wrapCGI (\cgistate -> ioError (userError (shows stid $ show res)))+	setFail stid res = +	  B.once $+	  wrapCGI (\cgistate ->+	       let out = outparm cgistate +		   out' = applyTo stid onFail out+		   onFail (pmark : pfail : psucc : rest) =+			  (pmark : PAR_RESULT (show res) : psucc : rest)+	       in+	       return ((), cgistate { outparm = out' })+	       )+	setCommit stid res = +	  B.once $+	  wrapCGI (\cgistate ->+	       let out = outparm cgistate +		   out' = applyTo stid onSucc out+		   onSucc (pmark : pfail : psucc : rest) =+			  (pmark : pfail : PAR_RESULT (show res) : rest)+	       in+	       return ((), cgistate { outparm = out' })+	       )+	control stid =+	  Control { abandon = abandon stid+		  , setFail = setFail stid+		  , setCommit = setCommit stid+		  }+	run stid cgistate =+	  do lr <- try (unwrapCGI (fun (control stid)) cgistate)+	     case lr of+	       Right (v, cgistate') ->+		 -- body of transaction finished successfully; now commit+		 let out = outparm cgistate'+		     (prefix, outparm') = splitTo stid out+		     PAR_TRANS _ :+		       failp@(PAR_RESULT failString) :+		       succp@(PAR_RESULT succString) : _ = reverse prefix+		 in+		 do committed <- commitFromLog prefix+		    if committed then+		       unwrapCGI (onResult (read succString))+			 cgistate' { outparm = succp : outparm' }+		     else+		       unwrapCGI (onResult (read failString))+			 cgistate' { outparm = failp : outparm' }+		 +	       Left err ->+		 -- Caught an exception; might be due to an @anbandon@ operation+		 case reads (ioeGetErrorString err) of+		   (stid', rest) : _ | stid' == stid ->+		     let result = read rest+			 newvalue = PAR_RESULT rest+			 out' = popTo stid (outparm cgistate)+		     in+		       unwrapCGI (onResult result)+			 cgistate { inparm = []+				  , outparm = newvalue : out'+				  , stateID = nextstid stid newvalue +				  }+		   _ ->+		     ioError err+    in+    case inparm cgistate of+      [] ->+        let stid = stateID cgistate+	    newmark = PAR_TRANS stid+	    newvalue = PAR_RESULT (show result)+	in+	run stid cgistate +	  { outparm = newvalue : newvalue : newmark : outparm cgistate+	  , stateID = nextstid (nextstid (nextstid stid newmark) newvalue) newvalue }+      -- ongoing transaction+      PAR_TRANS stid : PAR_RESULT failString : PAR_RESULT successString : rest ->+	run stid cgistate { inparm = rest }+	       +      -- finished transaction, go on with result continuation+      PAR_RESULT str : rest ->+	unwrapCGI (onResult (read str)) cgistate { inparm = rest }+      _ -> +	B.reportError "Out of sync" H.empty cgistate+  )  +++-- |Unnested transaction+withCGI :: (Read result, Show result) =>+	  ([PARAMETER] -> IO Bool)	    -- committer function+	  -> result				-- default result+	  -> (result -> CGI ()) 		-- result continuation+	  -> (Control (TCGI result) result -> (TCGI result) ())+	  -> CGI ()+withCGI commitFromLog result onResult fun =+  wrapCGI (\cgistate -> +    let abandon stid res =+	  wrapCGI (\cgistate -> ioError (userError (shows stid $ show res)))+	setFail stid res = +	  B.once $+	  wrapCGI (\cgistate ->+	       let out = outparm cgistate +		   out' = applyTo stid onFail out+		   onFail (pmark : pfail : psucc : rest) =+			  (pmark : PAR_RESULT (show res) : psucc : rest)+	       in+	       return ((), cgistate { outparm = out' })+	       )+	setCommit stid res = +	  B.once $+	  wrapCGI (\cgistate ->+	       let out = outparm cgistate +		   out' = applyTo stid onSucc out+		   onSucc (pmark : pfail : psucc : rest) =+			  (pmark : pfail : PAR_RESULT (show res) : rest)+	       in+	       return ((), cgistate { outparm = out' })+	       )+	control stid =+	  Control { abandon = abandon stid+		  , setFail = setFail stid+		  , setCommit = setCommit stid+		  }+	run stid cgistate =+	  do lr <- try (unwrapCGI (fun (control stid)) cgistate)+	     case lr of+	       Right (v, cgistate') ->+		 -- body of transaction finished successfully; now commit+		 let out = outparm cgistate'+		     (prefix, outparm') = splitTo stid out+		     PAR_TRANS _ :+		       failp@(PAR_RESULT failString) :+		       succp@(PAR_RESULT succString) : _ = reverse prefix+		 in+		 do committed <- commitFromLog prefix+		    if committed then+		       unwrapCGI (onResult (read succString))+			 cgistate' { outparm = succp : outparm' }+		     else+		       unwrapCGI (onResult (read failString))+			 cgistate' { outparm = failp : outparm' }+		 +	       Left err ->+		 -- Caught an exception; might be due to an @anbandon@ operation+		 case reads (ioeGetErrorString err) of+		   (stid', rest) : _ | stid' == stid ->+		     let result = read rest+			 newvalue = PAR_RESULT rest+			 out' = popTo stid (outparm cgistate)+		     in+		       unwrapCGI (onResult result)+			 cgistate { inparm = []+				  , outparm = newvalue : out'+				  , stateID = nextstid stid newvalue +				  }+		   _ ->+		     ioError err+    in+    case inparm cgistate of+      [] ->+        let stid = stateID cgistate+	    newmark = PAR_TRANS stid+	    newvalue = PAR_RESULT (show result)+	in+	run stid cgistate +	  { outparm = newvalue : newvalue : newmark : outparm cgistate+	  , stateID = nextstid (nextstid (nextstid stid newmark) newvalue) newvalue }+      -- ongoing transaction+      PAR_TRANS stid : PAR_RESULT failString : PAR_RESULT successString : rest ->+	run stid cgistate { inparm = rest }+	       +      -- finished transaction, go on with result continuation+      PAR_RESULT str : rest ->+	unwrapCGI (onResult (read str)) cgistate { inparm = rest }+      _ -> +	B.reportError "Out of sync" H.empty cgistate+  )  +++-- | nested transaction+withTCGI :: (Read result, Show result) =>+	  ([PARAMETER] -> IO Bool)	    -- committer function+	  -> result				-- default result+	  -> (result -> TCGI result1 ()) 		-- result continuation+	  -> (Control (TCGI result) result -> (TCGI result) ())+	  -> TCGI result1 ()+withTCGI checkIfCommittable result onResult fun =+  wrapCGI (\cgistate -> +    let abandon stid res =+	  wrapCGI (\cgistate -> ioError (userError (shows stid $ show res)))+	setFail stid res = +	  B.once $+	  wrapCGI (\cgistate ->+	       let out = outparm cgistate +		   out' = applyTo stid onFail out+		   onFail (pmark : pfail : psucc : rest) =+			  (pmark : PAR_RESULT (show res) : psucc : rest)+	       in+	       return ((), cgistate { outparm = out' })+	       )+	setCommit stid res = +	  B.once $+	  wrapCGI (\cgistate ->+	       let out = outparm cgistate +		   out' = applyTo stid onSucc out+		   onSucc (pmark : pfail : psucc : rest) =+			  (pmark : pfail : PAR_RESULT (show res) : rest)+	       in+	       return ((), cgistate { outparm = out' })+	       )+	control stid =+	  Control { abandon = abandon stid+		  , setFail = setFail stid+		  , setCommit = setCommit stid+		  }+	run stid cgistate =+	  do lr <- try (unwrapCGI (fun (control stid)) cgistate)+	     case lr of+	       Right (v, cgistate') ->+		 -- body of transaction finished successfully; now commit+		 let out = outparm cgistate'+		     (prefix, outparm') = splitTo stid out+		     PAR_TRANS _ :+		       failp@(PAR_RESULT failString) :+		       succp@(PAR_RESULT succString) : _ = reverse prefix+		 in+		 do committed <- checkIfCommittable prefix+		    if committed then+		       -- if commit can succeed, then its reads and writes+		       -- must not be lost! +		       let marker = PAR_RESULT ""+			   logentries = [ x | x@(PAR_DB _) <- prefix]+		       in+		       unwrapCGI (onResult (read succString))+			 cgistate' { outparm = succp : logentries ++ +				               marker : outparm' }+		     else+		       unwrapCGI (onResult (read failString))+			 cgistate' { outparm = failp : outparm' }+		 +	       Left err ->+		 -- Caught an exception; might be due to an @anbandon@ operation+		 case reads (ioeGetErrorString err) of+		   (stid', rest) : _ | stid' == stid ->+		     let result = read rest+			 newvalue = PAR_RESULT rest+			 out' = popTo stid (outparm cgistate)+		     in+		       unwrapCGI (onResult result)+			 cgistate { inparm = []+				  , outparm = newvalue : out'+				  , stateID = nextstid stid newvalue +				  }+		   _ ->+		     ioError err+    in+    case inparm cgistate of+      [] ->+        let stid = stateID cgistate+	    newmark = PAR_TRANS stid+	    newvalue = PAR_RESULT (show result)+	in+	run stid cgistate +	  { outparm = newvalue : newvalue : newmark : outparm cgistate+	  , stateID = nextstid (nextstid (nextstid stid newmark) newvalue) newvalue }+      -- ongoing transaction+      PAR_TRANS stid : PAR_RESULT failString : PAR_RESULT successString : rest ->+	run stid cgistate { inparm = rest }+	       +      -- finished nested transaction successfully+      PAR_RESULT "" : rest ->+	let loop (PAR_RESULT str : rest) =+	      unwrapCGI (onResult (read str)) cgistate { inparm = rest }+	    loop (PAR_DB _ : rest) =+	      loop rest+	    loop _ =+	      B.reportError "Format error in nested transaction log" H.empty cgistate+	in  loop rest+      -- finished transaction, go on with result continuation+      PAR_RESULT str : rest ->+	unwrapCGI (onResult (read str)) cgistate { inparm = rest }+      _ -> +	B.reportError "Out of sync" H.empty cgistate+  )  +
+ WASH/CGI/Types.hs view
@@ -0,0 +1,184 @@+-- © 2001, 2002, 2003 Peter Thiemann+{-| The Types module aims at providing a representation for (first-order)+monomorphic Haskell types. Two type representations are equal if and+only if the represented types have identical definitions. Thus a type+representation consists of a type term and the smallest list of all+(data or newtype) definitions needed either in the type term or in+another definition. The list of definitions is sorted to make+representations unique.++The main use of type representations is to provide a type index for+storing Haskell values externally and for reading them back into a+running program without sacrificing type safety. Just reading them+back with the @Read@ class is not sufficient because++ * @Read@ does not distinguish between @Int@ and @Integer@, @Float@ and @Double@y++ * @Read@ cannot avoid accidental matches of constructor names++Meanwhile, the 'Data.Typeable' class of GHC provides an encoding with similar+goals.+-}+module WASH.CGI.Types where++import Maybe++-- | A type specification consists of a type representation 'TyRep' and a list of+-- type declarations.+data TySpec = +     TS TyRep [TyDecl]					    -- declarations sorted!+  deriving (Read, Show, Eq)++-- | A type representation is built from base types, type variables, tuples, and+-- references to data-defined types.+data TyRep =+     TRBase  String+   | TRVar   String+   | TRTuple [TyRep]+   | TRData  String [TyRep]+  deriving (Read, Show, Eq)++-- | A data declaration consists of the name of the data type, a list of type+-- variables, and a list of constructor representations.+data TyDecl =+     TD String [String] [ConRep]+  deriving (Read, Show, Eq)++-- | A constructor is represented by its name, a list of field names (if defined+-- using record notation), and the list of its argument types+data ConRep =+     CR String						    -- ctor name+       	(Maybe [String])				    -- field names+	[TyRep]						    -- field types+  deriving (Read, Show, Eq)++class Types a where+  ty :: a -> TySpec++instance Types () where+  ty i = TS (TRBase "()") []++instance Types Bool where+  ty i = TS (TRBase "Bool") []+  +instance Types Int where+  ty i = TS (TRBase "Int") []+  +instance Types Integer where+  ty i = TS (TRBase "Integer") []+  +--instance Types Rational where+--  ty i = TS (TRBase "Rational") []++instance Types Double where+  ty d = TS (TRBase "Double") []++instance Types Float where+  ty d = TS (TRBase "Float") []++instance Types Char where+  ty c = TS (TRBase "Char") []++instance (Types a, Types b) => Types (a,b) where+  ty xy = TS (TRTuple [tra, trb]) (merge defsa defsb)+    where TS tra defsa = ty (fst xy)+	  TS trb defsb = ty (snd xy)++instance (Types a, Types b, Types c) => Types (a,b,c) where+  ty ~(xa,xb,xc) = TS (TRTuple [tra, trb, trc]) (merge (merge defsa defsb) defsc)+    where TS tra defsa = ty xa+	  TS trb defsb = ty xb+	  TS trc defsc = ty xc++instance (Types a, Types b, Types c, Types d) => Types (a,b,c,d) where+  ty ~(xa,xb,xc,xd) = TS (TRTuple [tra, trb, trc, trd]) +			 (merge (merge defsa defsb) (merge defsc defsd))+    where TS tra defsa = ty xa+	  TS trb defsb = ty xb+	  TS trc defsc = ty xc+	  TS trd defsd = ty xd++instance (Types a, Types b, Types c, Types d, Types e) => Types (a,b,c,d,e) where+  ty ~(xa,xb,xc,xd,xe) = TS (TRTuple [tra, trb, trc, trd, tre]) +			    (merges [defsa, defsb, defsc, defsd, defse])+    where TS tra defsa = ty xa+	  TS trb defsb = ty xb+	  TS trc defsc = ty xc+	  TS trd defsd = ty xd+	  TS tre defse = ty xe++instance (Types a) => Types [a] where+  ty xs = TS (TRData (tdName listDef) [tr]) (merge defs [listDef])+    where TS tr defs = ty (head xs)++listDef :: TyDecl+listDef = TD "[]" ["a"]	[CR "[]" Nothing []+			,CR ":"  Nothing [TRVar "a"+					 ,TRData (tdName listDef) [TRVar "a"]]]++instance (Types a) => Types (Maybe a) where+  ty mx = TS (TRData (tdName maybeDef) [tr]) (merge defs [maybeDef])+    where TS tr defs = ty (fromJust mx)++-- fromJust (Just x) = x -- in Module Maybe++maybeDef :: TyDecl+maybeDef = +	TD "Maybe" ["a"][CR "Nothing" Nothing []+			,CR "Just"    Nothing [TRVar "a"]]++instance (Types a, Types b) => Types (Either a b) where+  ty xy = TS (TRData (tdName eitherDef) [tra, trb]) +  	     (merge (merge defsa defsb) [eitherDef])+    where TS tra defsa = ty (fromLeft xy)+	  TS trb defsb = ty (fromRight xy)++fromLeft  (Left x)  = x+fromRight (Right y) = y++eitherDef :: TyDecl+eitherDef =+	TD 	"Either"+		["a", "b"]+		[CR "Left"  Nothing [TRVar "a"]+		,CR "Right" Nothing [TRVar "b"]]++tdName (TD name _ _) = name++merge :: [TyDecl] -> [TyDecl] -> [TyDecl]+merge [] ys = ys+merge xs [] = xs+merge (x:xs) (y:ys) +  | x == y               = x : merge xs ys+  | tdName x == tdName y = error ("Different types with identical name: " ++ tdName x)+  | tdName x <= tdName y = x : merge xs (y:ys)+  | otherwise            = y : merge (x:xs) ys++merges :: [[TyDecl]] -> [TyDecl]+merges tss = foldr merge [] tss++class TID a where+  tid :: a -> ShowS+  +instance TID TySpec where+  tid (TS tyRep tyDecls) =+    tid tyRep . tid tyDecls++instance TID a => TID [a] where+  tid [] = showChar '.'+  tid (x : xs) = showChar ',' . tid x . tid xs++instance TID TyRep where+  tid (TRBase str) = showChar 'B' . shows str+  tid (TRVar  str) = showChar 'V' . shows str+  tid (TRTuple tyReps) = showChar 'T' . tid tyReps+  tid (TRData  str tyReps) = showChar 'D' . shows str . tid tyReps++instance TID TyDecl where+  tid (TD name tyvars conreps) =+    shows name . shows tyvars . tid conreps++instance TID ConRep where+  tid (CR ctorname mFields tyReps) =+    shows ctorname . shows mFields . tid tyReps+
+ WASH/HTML/HTMLBase.hs view
@@ -0,0 +1,180 @@+-- © 2001-2003 Peter Thiemann+module WASH.HTML.HTMLBase +{- +  (ATTR_(), attr_, attr_name, attr_value+  ,ELEMENT_(), element_, empty_, cdata_, comment_, doctype_+  ,CDATA_OPTIONS(..)+  ,add_, add_attr_+  ,get_attrs_+  ,BT(..)+  ,element_S, empty_S, cdata_S, comment_S, doctype_S+  ,element_T, empty_T, cdata_T, comment_T, doctype_T+  ,attr_SS, attr_SD, attr_TS, attr_TD+  ,showTemplatified)+-}+where++import Char++data BT = STATIC | DYNAMIC | TOPLEVEL++-- untyped layer+-- attributes++data ATTR_ =+  ATTR_ { attr_BT :: BT+	, attr_value_BT :: BT+	, attr_name :: String+        , attr_value :: String+	}++attr_   = ATTR_ DYNAMIC  DYNAMIC+attr_SS = ATTR_ STATIC   STATIC+attr_SD = ATTR_ STATIC   DYNAMIC+attr_TS = ATTR_ TOPLEVEL STATIC+attr_TD = ATTR_ TOPLEVEL DYNAMIC++-- elements++data ELEMENT_ =+    ELEMENT_ { elem_BT :: BT+	     , tag :: String+    	     , attrs :: [ATTR_]+	     , elems :: [ELEMENT_]+	     }+  | EMPTY_   { elem_BT :: BT+	     , tag :: String+  	     , attrs :: [ATTR_]+	     }+  | CDATA_   { elem_BT :: BT+	     , elem_cdata :: String+	     }+  | COMMENT_ { elem_BT :: BT+	     , elem_comment :: String+	     }+  | DOCTYPE_ { elem_BT :: BT+	     , doctype :: [String]+  	     , elems :: [ELEMENT_]+	     }++data CDATA_OPTIONS = CDATA_ENCODED | CDATA_FORMATTED+  deriving (Eq)++element_  = ELEMENT_ DYNAMIC+element_S = ELEMENT_ STATIC+element_T = ELEMENT_ TOPLEVEL+empty_    = EMPTY_ DYNAMIC+empty_S   = EMPTY_ STATIC+empty_T   = EMPTY_ TOPLEVEL+makeEncoder opt = format . encode+  where format | CDATA_FORMATTED `elem` opt = id+	       | otherwise = htmlFormat+	encode | CDATA_ENCODED `elem` opt = id+	       | otherwise = htmlEncode+cdata_  opt = CDATA_ DYNAMIC . makeEncoder opt+cdata_S opt = CDATA_ STATIC . makeEncoder opt+cdata_T opt = CDATA_ TOPLEVEL . makeEncoder opt+comment_  = COMMENT_ DYNAMIC+comment_S = COMMENT_ STATIC+comment_T = COMMENT_ TOPLEVEL+doctype_  = DOCTYPE_ DYNAMIC+doctype_S = DOCTYPE_ STATIC+doctype_T = DOCTYPE_ TOPLEVEL++add_ e_ e'_ = e_ { elems = e'_ : elems e_}+-- | Takes element and attribute. Attaches attribute to the element. Replaces+-- prior attribute with same name.+add_attr_ e_ att = +  let nameOfAtt = attr_name att+      all_attrs = attrs e_+      f [] = Nothing+      f (att' : attrs) = if attr_name att' == nameOfAtt +      			 then return (att : attrs)+			 else f attrs >>= \ attrs' -> return (att' : attrs')+      new_attrs = case f all_attrs of+		    Nothing -> att : all_attrs+		    Just attrs -> attrs+  in  e_ { attrs = new_attrs }++get_attrs_ = attrs++-- show functions++instance Show ATTR_ where+  showsPrec i = shows_attribute+  showList    = shows_attributes++shows_attributes :: [ATTR_] -> ShowS+shows_attributes atts = foldr (.) id (map shows_attribute atts)++shows_attribute :: ATTR_ -> ShowS+shows_attribute a =+  showChar ' ' . showString (attr_name a) .+  case attr_value a of+    "()" ->+      id+    str@('\"':_) ->+      showString "=\"" . htmlAttr (read str) . showString "\""+    str ->+      showString "=\"" . htmlAttr str . showString "\""++instance Show ELEMENT_ where+  showsPrec i = shows_element+  showList = shows_elements++shows_elements :: [ELEMENT_] -> ShowS+shows_elements elts = foldr (.) id (reverse (map shows_element elts))++shows_element :: ELEMENT_ -> ShowS+shows_element (EMPTY_ bt tag atts) =+  showChar '<' . showString tag . shows atts . showString "\n/>"+shows_element (ELEMENT_ bt tag atts elts) =+  showChar '<' . showString tag . shows atts . showChar '>'+  . shows_elements elts+  . showString "</" . showString tag . showString "\n>"+shows_element (DOCTYPE_ bt strs elems) =+  showString "<!DOCTYPE" . +  foldr (\str f -> showChar ' ' . showString str . f) id strs . showString "\n>" .+  showString "<!-- generated by WASH/HTML 0.11\n-->" .+  shows_elements elems .+  showChar '\n'+shows_element (CDATA_ bt str) =+  showString str+shows_element (COMMENT_ bt str) =+  showString "<!-- " . commentEncode str . showString "\n-->"++-- |removes illegal characters and sequences of -- from comment+commentEncode :: String -> ShowS+commentEncode "" ys = ys+commentEncode ('-':xs@('-':_)) ys = '-':' ': commentEncode xs ys+commentEncode (x:xs) ys = +  if x == chr 0x9 ||+     x == chr 0xa ||+     x == chr 0xd ||+     x >= chr 0x20 && x <= chr 0xd7ff ||+     x >= chr 0xe000 && x <= chr 0xfffd ||+     x >= chr 0x10000 && x <= chr 0x10ffff+  then x: commentEncode xs ys+  else '?': commentEncode xs ys++htmlForbiddenChars = "<&\""++htmlEncode :: String -> String+htmlEncode s = htmlAttr s ""++htmlFormat s = s++htmlAttr :: String -> ShowS+htmlAttr "" = id+htmlAttr (x:xs) =+  (if x `elem` htmlForbiddenChars+  then showString "&#" . shows (ord x) . showChar ';'+  else showChar x) . htmlAttr xs++{--htmlFormat "" = ""+htmlFormat (x:xs) =+	if isSpace x then+	  "\n " ++ htmlFormat (dropWhile isSpace xs)+	else+	  x : htmlFormat xs	  +--}
+ WASH/HTML/HTMLMonad.hs view
@@ -0,0 +1,372 @@+-- © 2001-2003 Peter Thiemann+-- this file is generated -- do not edit+module WASH.HTML.HTMLMonad +  (module WASH.HTML.HTMLMonad,module WASH.HTML.HTMLMonadBase) +  where+import Prelude hiding (div,head,map,span)+import WASH.HTML.HTMLMonadBase+-- end fixed prologue+a   = mkElement   "a"+a, a_S, a_T :: Monad m => HTMLCons x y m a+a_S = mkElement_S "a"+a_T = mkElement_T "a"+abbr   = mkElement   "abbr"+abbr, abbr_S, abbr_T :: Monad m => HTMLCons x y m a+abbr_S = mkElement_S "abbr"+abbr_T = mkElement_T "abbr"+acronym   = mkElement   "acronym"+acronym, acronym_S, acronym_T :: Monad m => HTMLCons x y m a+acronym_S = mkElement_S "acronym"+acronym_T = mkElement_T "acronym"+address   = mkElement   "address"+address, address_S, address_T :: Monad m => HTMLCons x y m a+address_S = mkElement_S "address"+address_T = mkElement_T "address"+applet   = mkElement   "applet"+applet, applet_S, applet_T :: Monad m => HTMLCons x y m a+applet_S = mkElement_S "applet"+applet_T = mkElement_T "applet"+area   = mkEmpty   "area"+area, area_S, area_T :: Monad m => HTMLCons x y m a+area_S = mkEmpty_S "area"+area_T = mkEmpty_T "area"+b   = mkElement   "b"+b, b_S, b_T :: Monad m => HTMLCons x y m a+b_S = mkElement_S "b"+b_T = mkElement_T "b"+base   = mkEmpty   "base"+base, base_S, base_T :: Monad m => HTMLCons x y m a+base_S = mkEmpty_S "base"+base_T = mkEmpty_T "base"+basefont   = mkEmpty   "basefont"+basefont, basefont_S, basefont_T :: Monad m => HTMLCons x y m a+basefont_S = mkEmpty_S "basefont"+basefont_T = mkEmpty_T "basefont"+bdo   = mkElement   "bdo"+bdo, bdo_S, bdo_T :: Monad m => HTMLCons x y m a+bdo_S = mkElement_S "bdo"+bdo_T = mkElement_T "bdo"+big   = mkElement   "big"+big, big_S, big_T :: Monad m => HTMLCons x y m a+big_S = mkElement_S "big"+big_T = mkElement_T "big"+blockquote   = mkElement   "blockquote"+blockquote, blockquote_S, blockquote_T :: Monad m => HTMLCons x y m a+blockquote_S = mkElement_S "blockquote"+blockquote_T = mkElement_T "blockquote"+body   = mkElement   "body"+body, body_S, body_T :: Monad m => HTMLCons x y m a+body_S = mkElement_S "body"+body_T = mkElement_T "body"+br   = mkEmpty   "br"+br, br_S, br_T :: Monad m => HTMLCons x y m a+br_S = mkEmpty_S "br"+br_T = mkEmpty_T "br"+button   = mkElement   "button"+button, button_S, button_T :: Monad m => HTMLCons x y m a+button_S = mkElement_S "button"+button_T = mkElement_T "button"+caption   = mkElement   "caption"+caption, caption_S, caption_T :: Monad m => HTMLCons x y m a+caption_S = mkElement_S "caption"+caption_T = mkElement_T "caption"+center   = mkElement   "center"+center, center_S, center_T :: Monad m => HTMLCons x y m a+center_S = mkElement_S "center"+center_T = mkElement_T "center"+cite   = mkElement   "cite"+cite, cite_S, cite_T :: Monad m => HTMLCons x y m a+cite_S = mkElement_S "cite"+cite_T = mkElement_T "cite"+code   = mkElement   "code"+code, code_S, code_T :: Monad m => HTMLCons x y m a+code_S = mkElement_S "code"+code_T = mkElement_T "code"+col   = mkEmpty   "col"+col, col_S, col_T :: Monad m => HTMLCons x y m a+col_S = mkEmpty_S "col"+col_T = mkEmpty_T "col"+colgroup   = mkElement   "colgroup"+colgroup, colgroup_S, colgroup_T :: Monad m => HTMLCons x y m a+colgroup_S = mkElement_S "colgroup"+colgroup_T = mkElement_T "colgroup"+dd   = mkElement   "dd"+dd, dd_S, dd_T :: Monad m => HTMLCons x y m a+dd_S = mkElement_S "dd"+dd_T = mkElement_T "dd"+del   = mkElement   "del"+del, del_S, del_T :: Monad m => HTMLCons x y m a+del_S = mkElement_S "del"+del_T = mkElement_T "del"+dfn   = mkElement   "dfn"+dfn, dfn_S, dfn_T :: Monad m => HTMLCons x y m a+dfn_S = mkElement_S "dfn"+dfn_T = mkElement_T "dfn"+dir   = mkElement   "dir"+dir, dir_S, dir_T :: Monad m => HTMLCons x y m a+dir_S = mkElement_S "dir"+dir_T = mkElement_T "dir"+div   = mkElement   "div"+div, div_S, div_T :: Monad m => HTMLCons x y m a+div_S = mkElement_S "div"+div_T = mkElement_T "div"+dl   = mkElement   "dl"+dl, dl_S, dl_T :: Monad m => HTMLCons x y m a+dl_S = mkElement_S "dl"+dl_T = mkElement_T "dl"+dt   = mkElement   "dt"+dt, dt_S, dt_T :: Monad m => HTMLCons x y m a+dt_S = mkElement_S "dt"+dt_T = mkElement_T "dt"+em   = mkElement   "em"+em, em_S, em_T :: Monad m => HTMLCons x y m a+em_S = mkElement_S "em"+em_T = mkElement_T "em"+fieldset   = mkElement   "fieldset"+fieldset, fieldset_S, fieldset_T :: Monad m => HTMLCons x y m a+fieldset_S = mkElement_S "fieldset"+fieldset_T = mkElement_T "fieldset"+font   = mkElement   "font"+font, font_S, font_T :: Monad m => HTMLCons x y m a+font_S = mkElement_S "font"+font_T = mkElement_T "font"+form   = mkElement   "form"+form, form_S, form_T :: Monad m => HTMLCons x y m a+form_S = mkElement_S "form"+form_T = mkElement_T "form"+frame   = mkEmpty   "frame"+frame, frame_S, frame_T :: Monad m => HTMLCons x y m a+frame_S = mkEmpty_S "frame"+frame_T = mkEmpty_T "frame"+frameset   = mkElement   "frameset"+frameset, frameset_S, frameset_T :: Monad m => HTMLCons x y m a+frameset_S = mkElement_S "frameset"+frameset_T = mkElement_T "frameset"+h1   = mkElement   "h1"+h1, h1_S, h1_T :: Monad m => HTMLCons x y m a+h1_S = mkElement_S "h1"+h1_T = mkElement_T "h1"+h2   = mkElement   "h2"+h2, h2_S, h2_T :: Monad m => HTMLCons x y m a+h2_S = mkElement_S "h2"+h2_T = mkElement_T "h2"+h3   = mkElement   "h3"+h3, h3_S, h3_T :: Monad m => HTMLCons x y m a+h3_S = mkElement_S "h3"+h3_T = mkElement_T "h3"+h4   = mkElement   "h4"+h4, h4_S, h4_T :: Monad m => HTMLCons x y m a+h4_S = mkElement_S "h4"+h4_T = mkElement_T "h4"+h5   = mkElement   "h5"+h5, h5_S, h5_T :: Monad m => HTMLCons x y m a+h5_S = mkElement_S "h5"+h5_T = mkElement_T "h5"+h6   = mkElement   "h6"+h6, h6_S, h6_T :: Monad m => HTMLCons x y m a+h6_S = mkElement_S "h6"+h6_T = mkElement_T "h6"+head   = mkElement   "head"+head, head_S, head_T :: Monad m => HTMLCons x y m a+head_S = mkElement_S "head"+head_T = mkElement_T "head"+hr   = mkEmpty   "hr"+hr, hr_S, hr_T :: Monad m => HTMLCons x y m a+hr_S = mkEmpty_S "hr"+hr_T = mkEmpty_T "hr"+html   = mkElement   "html"+html, html_S, html_T :: Monad m => HTMLCons x y m a+html_S = mkElement_S "html"+html_T = mkElement_T "html"+i   = mkElement   "i"+i, i_S, i_T :: Monad m => HTMLCons x y m a+i_S = mkElement_S "i"+i_T = mkElement_T "i"+iframe   = mkElement   "iframe"+iframe, iframe_S, iframe_T :: Monad m => HTMLCons x y m a+iframe_S = mkElement_S "iframe"+iframe_T = mkElement_T "iframe"+img   = mkEmpty   "img"+img, img_S, img_T :: Monad m => HTMLCons x y m a+img_S = mkEmpty_S "img"+img_T = mkEmpty_T "img"+input   = mkEmpty   "input"+input, input_S, input_T :: Monad m => HTMLCons x y m a+input_S = mkEmpty_S "input"+input_T = mkEmpty_T "input"+ins   = mkElement   "ins"+ins, ins_S, ins_T :: Monad m => HTMLCons x y m a+ins_S = mkElement_S "ins"+ins_T = mkElement_T "ins"+isindex   = mkEmpty   "isindex"+isindex, isindex_S, isindex_T :: Monad m => HTMLCons x y m a+isindex_S = mkEmpty_S "isindex"+isindex_T = mkEmpty_T "isindex"+kbd   = mkElement   "kbd"+kbd, kbd_S, kbd_T :: Monad m => HTMLCons x y m a+kbd_S = mkElement_S "kbd"+kbd_T = mkElement_T "kbd"+label   = mkElement   "label"+label, label_S, label_T :: Monad m => HTMLCons x y m a+label_S = mkElement_S "label"+label_T = mkElement_T "label"+legend   = mkElement   "legend"+legend, legend_S, legend_T :: Monad m => HTMLCons x y m a+legend_S = mkElement_S "legend"+legend_T = mkElement_T "legend"+li   = mkElement   "li"+li, li_S, li_T :: Monad m => HTMLCons x y m a+li_S = mkElement_S "li"+li_T = mkElement_T "li"+link   = mkEmpty   "link"+link, link_S, link_T :: Monad m => HTMLCons x y m a+link_S = mkEmpty_S "link"+link_T = mkEmpty_T "link"+map   = mkElement   "map"+map, map_S, map_T :: Monad m => HTMLCons x y m a+map_S = mkElement_S "map"+map_T = mkElement_T "map"+menu   = mkElement   "menu"+menu, menu_S, menu_T :: Monad m => HTMLCons x y m a+menu_S = mkElement_S "menu"+menu_T = mkElement_T "menu"+meta   = mkEmpty   "meta"+meta, meta_S, meta_T :: Monad m => HTMLCons x y m a+meta_S = mkEmpty_S "meta"+meta_T = mkEmpty_T "meta"+noframes   = mkElement   "noframes"+noframes, noframes_S, noframes_T :: Monad m => HTMLCons x y m a+noframes_S = mkElement_S "noframes"+noframes_T = mkElement_T "noframes"+noscript   = mkElement   "noscript"+noscript, noscript_S, noscript_T :: Monad m => HTMLCons x y m a+noscript_S = mkElement_S "noscript"+noscript_T = mkElement_T "noscript"+object   = mkElement   "object"+object, object_S, object_T :: Monad m => HTMLCons x y m a+object_S = mkElement_S "object"+object_T = mkElement_T "object"+ol   = mkElement   "ol"+ol, ol_S, ol_T :: Monad m => HTMLCons x y m a+ol_S = mkElement_S "ol"+ol_T = mkElement_T "ol"+optgroup   = mkElement   "optgroup"+optgroup, optgroup_S, optgroup_T :: Monad m => HTMLCons x y m a+optgroup_S = mkElement_S "optgroup"+optgroup_T = mkElement_T "optgroup"+option   = mkElement   "option"+option, option_S, option_T :: Monad m => HTMLCons x y m a+option_S = mkElement_S "option"+option_T = mkElement_T "option"+p   = mkElement   "p"+p, p_S, p_T :: Monad m => HTMLCons x y m a+p_S = mkElement_S "p"+p_T = mkElement_T "p"+param   = mkEmpty   "param"+param, param_S, param_T :: Monad m => HTMLCons x y m a+param_S = mkEmpty_S "param"+param_T = mkEmpty_T "param"+pre   = mkElement   "pre"+pre, pre_S, pre_T :: Monad m => HTMLCons x y m a+pre_S = mkElement_S "pre"+pre_T = mkElement_T "pre"+q   = mkElement   "q"+q, q_S, q_T :: Monad m => HTMLCons x y m a+q_S = mkElement_S "q"+q_T = mkElement_T "q"+s   = mkElement   "s"+s, s_S, s_T :: Monad m => HTMLCons x y m a+s_S = mkElement_S "s"+s_T = mkElement_T "s"+samp   = mkElement   "samp"+samp, samp_S, samp_T :: Monad m => HTMLCons x y m a+samp_S = mkElement_S "samp"+samp_T = mkElement_T "samp"+script   = mkElement   "script"+script, script_S, script_T :: Monad m => HTMLCons x y m a+script_S = mkElement_S "script"+script_T = mkElement_T "script"+select   = mkElement   "select"+select, select_S, select_T :: Monad m => HTMLCons x y m a+select_S = mkElement_S "select"+select_T = mkElement_T "select"+small   = mkElement   "small"+small, small_S, small_T :: Monad m => HTMLCons x y m a+small_S = mkElement_S "small"+small_T = mkElement_T "small"+span   = mkElement   "span"+span, span_S, span_T :: Monad m => HTMLCons x y m a+span_S = mkElement_S "span"+span_T = mkElement_T "span"+strike   = mkElement   "strike"+strike, strike_S, strike_T :: Monad m => HTMLCons x y m a+strike_S = mkElement_S "strike"+strike_T = mkElement_T "strike"+strong   = mkElement   "strong"+strong, strong_S, strong_T :: Monad m => HTMLCons x y m a+strong_S = mkElement_S "strong"+strong_T = mkElement_T "strong"+style   = mkElement   "style"+style, style_S, style_T :: Monad m => HTMLCons x y m a+style_S = mkElement_S "style"+style_T = mkElement_T "style"+sub   = mkElement   "sub"+sub, sub_S, sub_T :: Monad m => HTMLCons x y m a+sub_S = mkElement_S "sub"+sub_T = mkElement_T "sub"+sup   = mkElement   "sup"+sup, sup_S, sup_T :: Monad m => HTMLCons x y m a+sup_S = mkElement_S "sup"+sup_T = mkElement_T "sup"+table   = mkElement   "table"+table, table_S, table_T :: Monad m => HTMLCons x y m a+table_S = mkElement_S "table"+table_T = mkElement_T "table"+tbody   = mkElement   "tbody"+tbody, tbody_S, tbody_T :: Monad m => HTMLCons x y m a+tbody_S = mkElement_S "tbody"+tbody_T = mkElement_T "tbody"+td   = mkElement   "td"+td, td_S, td_T :: Monad m => HTMLCons x y m a+td_S = mkElement_S "td"+td_T = mkElement_T "td"+textarea   = mkElement   "textarea"+textarea, textarea_S, textarea_T :: Monad m => HTMLCons x y m a+textarea_S = mkElement_S "textarea"+textarea_T = mkElement_T "textarea"+tfoot   = mkElement   "tfoot"+tfoot, tfoot_S, tfoot_T :: Monad m => HTMLCons x y m a+tfoot_S = mkElement_S "tfoot"+tfoot_T = mkElement_T "tfoot"+th   = mkElement   "th"+th, th_S, th_T :: Monad m => HTMLCons x y m a+th_S = mkElement_S "th"+th_T = mkElement_T "th"+thead   = mkElement   "thead"+thead, thead_S, thead_T :: Monad m => HTMLCons x y m a+thead_S = mkElement_S "thead"+thead_T = mkElement_T "thead"+title   = mkElement   "title"+title, title_S, title_T :: Monad m => HTMLCons x y m a+title_S = mkElement_S "title"+title_T = mkElement_T "title"+tr   = mkElement   "tr"+tr, tr_S, tr_T :: Monad m => HTMLCons x y m a+tr_S = mkElement_S "tr"+tr_T = mkElement_T "tr"+tt   = mkElement   "tt"+tt, tt_S, tt_T :: Monad m => HTMLCons x y m a+tt_S = mkElement_S "tt"+tt_T = mkElement_T "tt"+u   = mkElement   "u"+u, u_S, u_T :: Monad m => HTMLCons x y m a+u_S = mkElement_S "u"+u_T = mkElement_T "u"+ul   = mkElement   "ul"+ul, ul_S, ul_T :: Monad m => HTMLCons x y m a+ul_S = mkElement_S "ul"+ul_T = mkElement_T "ul"+var   = mkElement   "var"+var, var_S, var_T :: Monad m => HTMLCons x y m a+var_S = mkElement_S "var"+var_T = mkElement_T "var"
+ WASH/HTML/HTMLMonad98.hs view
@@ -0,0 +1,5852 @@+-- © 2001, 2002 Peter Thiemann+-- this file is generated -- do not edit+module WASH.HTML.HTMLMonad98+  (module WASH.HTML.HTMLMonad98,+   Element,Attributes,Attribute,WithHTML,lift,get_attrs,empty,( ## ),HTMLCons,attr)+  where+import Prelude hiding (div,head,map,span)+import qualified WASH.HTML.HTMLMonad as HTMLMonad+-- fixed top level code+import WASH.HTML.HTMLMonad+	( Element, Attributes, Attribute+	, WithHTML, lift, get_attrs+	, empty, ( ## )+	, HTMLCons, attr, av, addMaker)+data DOCUMENT = DOCUMENT+instance AdmitChildHTML DOCUMENT+build_document :: (Monad m) => WithHTML DOCUMENT m a -> m Element+build_document = HTMLMonad.build_document+class AdmitChildCDATA e where+  text, rawtext, formattedtext :: Monad m => String -> WithHTML e m ()+  text = HTMLMonad.text+  rawtext = HTMLMonad.rawtext+  formattedtext = HTMLMonad.formattedtext+-- end fixed prologue+class AdmitAttrVERSION e where+  uaVERSION :: (Monad m) => String -> WithHTML e m ()+  uaVERSION str = attr "VERSION" str+  atVERSION :: (Monad m, AttrValueVERSION v) => v -> WithHTML e m ()+  atVERSION v = attr "VERSION" (av $ show v)+class AdmitAttrDIR e where+  uaDIR :: (Monad m) => String -> WithHTML e m ()+  uaDIR str = attr "DIR" str+  atDIR :: (Monad m, AttrValueDIR v) => v -> WithHTML e m ()+  atDIR v = attr "DIR" (av $ show v)+class AdmitAttrLANG e where+  uaLANG :: (Monad m) => String -> WithHTML e m ()+  uaLANG str = attr "LANG" str+  atLANG :: (Monad m, AttrValueLANG v) => v -> WithHTML e m ()+  atLANG v = attr "LANG" (av $ show v)+class AdmitAttrONKEYUP e where+  uaONKEYUP :: (Monad m) => String -> WithHTML e m ()+  uaONKEYUP str = attr "ONKEYUP" str+  atONKEYUP :: (Monad m, AttrValueONKEYUP v) => v -> WithHTML e m ()+  atONKEYUP v = attr "ONKEYUP" (av $ show v)+class AdmitAttrONKEYDOWN e where+  uaONKEYDOWN :: (Monad m) => String -> WithHTML e m ()+  uaONKEYDOWN str = attr "ONKEYDOWN" str+  atONKEYDOWN :: (Monad m, AttrValueONKEYDOWN v) => v -> WithHTML e m ()+  atONKEYDOWN v = attr "ONKEYDOWN" (av $ show v)+class AdmitAttrONKEYPRESS e where+  uaONKEYPRESS :: (Monad m) => String -> WithHTML e m ()+  uaONKEYPRESS str = attr "ONKEYPRESS" str+  atONKEYPRESS :: (Monad m, AttrValueONKEYPRESS v) => v -> WithHTML e m ()+  atONKEYPRESS v = attr "ONKEYPRESS" (av $ show v)+class AdmitAttrONMOUSEOUT e where+  uaONMOUSEOUT :: (Monad m) => String -> WithHTML e m ()+  uaONMOUSEOUT str = attr "ONMOUSEOUT" str+  atONMOUSEOUT :: (Monad m, AttrValueONMOUSEOUT v) => v -> WithHTML e m ()+  atONMOUSEOUT v = attr "ONMOUSEOUT" (av $ show v)+class AdmitAttrONMOUSEMOVE e where+  uaONMOUSEMOVE :: (Monad m) => String -> WithHTML e m ()+  uaONMOUSEMOVE str = attr "ONMOUSEMOVE" str+  atONMOUSEMOVE :: (Monad m, AttrValueONMOUSEMOVE v) => v -> WithHTML e m ()+  atONMOUSEMOVE v = attr "ONMOUSEMOVE" (av $ show v)+class AdmitAttrONMOUSEOVER e where+  uaONMOUSEOVER :: (Monad m) => String -> WithHTML e m ()+  uaONMOUSEOVER str = attr "ONMOUSEOVER" str+  atONMOUSEOVER :: (Monad m, AttrValueONMOUSEOVER v) => v -> WithHTML e m ()+  atONMOUSEOVER v = attr "ONMOUSEOVER" (av $ show v)+class AdmitAttrONMOUSEUP e where+  uaONMOUSEUP :: (Monad m) => String -> WithHTML e m ()+  uaONMOUSEUP str = attr "ONMOUSEUP" str+  atONMOUSEUP :: (Monad m, AttrValueONMOUSEUP v) => v -> WithHTML e m ()+  atONMOUSEUP v = attr "ONMOUSEUP" (av $ show v)+class AdmitAttrONMOUSEDOWN e where+  uaONMOUSEDOWN :: (Monad m) => String -> WithHTML e m ()+  uaONMOUSEDOWN str = attr "ONMOUSEDOWN" str+  atONMOUSEDOWN :: (Monad m, AttrValueONMOUSEDOWN v) => v -> WithHTML e m ()+  atONMOUSEDOWN v = attr "ONMOUSEDOWN" (av $ show v)+class AdmitAttrONDBLCLICK e where+  uaONDBLCLICK :: (Monad m) => String -> WithHTML e m ()+  uaONDBLCLICK str = attr "ONDBLCLICK" str+  atONDBLCLICK :: (Monad m, AttrValueONDBLCLICK v) => v -> WithHTML e m ()+  atONDBLCLICK v = attr "ONDBLCLICK" (av $ show v)+class AdmitAttrONCLICK e where+  uaONCLICK :: (Monad m) => String -> WithHTML e m ()+  uaONCLICK str = attr "ONCLICK" str+  atONCLICK :: (Monad m, AttrValueONCLICK v) => v -> WithHTML e m ()+  atONCLICK v = attr "ONCLICK" (av $ show v)+class AdmitAttrTITLE e where+  uaTITLE :: (Monad m) => String -> WithHTML e m ()+  uaTITLE str = attr "TITLE" str+  atTITLE :: (Monad m, AttrValueTITLE v) => v -> WithHTML e m ()+  atTITLE v = attr "TITLE" (av $ show v)+class AdmitAttrSTYLE e where+  uaSTYLE :: (Monad m) => String -> WithHTML e m ()+  uaSTYLE str = attr "STYLE" str+  atSTYLE :: (Monad m, AttrValueSTYLE v) => v -> WithHTML e m ()+  atSTYLE v = attr "STYLE" (av $ show v)+class AdmitAttrCLASS e where+  uaCLASS :: (Monad m) => String -> WithHTML e m ()+  uaCLASS str = attr "CLASS" str+  atCLASS :: (Monad m, AttrValueCLASS v) => v -> WithHTML e m ()+  atCLASS v = attr "CLASS" (av $ show v)+class AdmitAttrID e where+  uaID :: (Monad m) => String -> WithHTML e m ()+  uaID str = attr "ID" str+  atID :: (Monad m, AttrValueID v) => v -> WithHTML e m ()+  atID v = attr "ID" (av $ show v)+class AdmitAttrFOR e where+  uaFOR :: (Monad m) => String -> WithHTML e m ()+  uaFOR str = attr "FOR" str+  atFOR :: (Monad m, AttrValueFOR v) => v -> WithHTML e m ()+  atFOR v = attr "FOR" (av $ show v)+class AdmitAttrEVENT e where+  uaEVENT :: (Monad m) => String -> WithHTML e m ()+  uaEVENT str = attr "EVENT" str+  atEVENT :: (Monad m, AttrValueEVENT v) => v -> WithHTML e m ()+  atEVENT v = attr "EVENT" (av $ show v)+class AdmitAttrDEFER e where+  uaDEFER :: (Monad m) => String -> WithHTML e m ()+  uaDEFER str = attr "DEFER" str+  atDEFER :: (Monad m, AttrValueDEFER v) => v -> WithHTML e m ()+  atDEFER v = attr "DEFER" (av $ show v)+class AdmitAttrSRC e where+  uaSRC :: (Monad m) => String -> WithHTML e m ()+  uaSRC str = attr "SRC" str+  atSRC :: (Monad m, AttrValueSRC v) => v -> WithHTML e m ()+  atSRC v = attr "SRC" (av $ show v)+class AdmitAttrLANGUAGE e where+  uaLANGUAGE :: (Monad m) => String -> WithHTML e m ()+  uaLANGUAGE str = attr "LANGUAGE" str+  atLANGUAGE :: (Monad m, AttrValueLANGUAGE v) => v -> WithHTML e m ()+  atLANGUAGE v = attr "LANGUAGE" (av $ show v)+class AdmitAttrTYPE e where+  uaTYPE :: (Monad m) => String -> WithHTML e m ()+  uaTYPE str = attr "TYPE" str+  atTYPE :: (Monad m, AttrValueTYPE v) => v -> WithHTML e m ()+  atTYPE v = attr "TYPE" (av $ show v)+class AdmitAttrCHARSET e where+  uaCHARSET :: (Monad m) => String -> WithHTML e m ()+  uaCHARSET str = attr "CHARSET" str+  atCHARSET :: (Monad m, AttrValueCHARSET v) => v -> WithHTML e m ()+  atCHARSET v = attr "CHARSET" (av $ show v)+class AdmitAttrMEDIA e where+  uaMEDIA :: (Monad m) => String -> WithHTML e m ()+  uaMEDIA str = attr "MEDIA" str+  atMEDIA :: (Monad m, AttrValueMEDIA v) => v -> WithHTML e m ()+  atMEDIA v = attr "MEDIA" (av $ show v)+class AdmitAttrSCHEME e where+  uaSCHEME :: (Monad m) => String -> WithHTML e m ()+  uaSCHEME str = attr "SCHEME" str+  atSCHEME :: (Monad m, AttrValueSCHEME v) => v -> WithHTML e m ()+  atSCHEME v = attr "SCHEME" (av $ show v)+class AdmitAttrCONTENT e where+  uaCONTENT :: (Monad m) => String -> WithHTML e m ()+  uaCONTENT str = attr "CONTENT" str+  atCONTENT :: (Monad m, AttrValueCONTENT v) => v -> WithHTML e m ()+  atCONTENT v = attr "CONTENT" (av $ show v)+class AdmitAttrNAME e where+  uaNAME :: (Monad m) => String -> WithHTML e m ()+  uaNAME str = attr "NAME" str+  atNAME :: (Monad m, AttrValueNAME v) => v -> WithHTML e m ()+  atNAME v = attr "NAME" (av $ show v)+class AdmitAttrHTTP_EQUIV e where+  uaHTTP_EQUIV :: (Monad m) => String -> WithHTML e m ()+  uaHTTP_EQUIV str = attr "HTTP_EQUIV" str+  atHTTP_EQUIV :: (Monad m, AttrValueHTTP_EQUIV v) => v -> WithHTML e m ()+  atHTTP_EQUIV v = attr "HTTP_EQUIV" (av $ show v)+class AdmitAttrTARGET e where+  uaTARGET :: (Monad m) => String -> WithHTML e m ()+  uaTARGET str = attr "TARGET" str+  atTARGET :: (Monad m, AttrValueTARGET v) => v -> WithHTML e m ()+  atTARGET v = attr "TARGET" (av $ show v)+class AdmitAttrHREF e where+  uaHREF :: (Monad m) => String -> WithHTML e m ()+  uaHREF str = attr "HREF" str+  atHREF :: (Monad m, AttrValueHREF v) => v -> WithHTML e m ()+  atHREF v = attr "HREF" (av $ show v)+class AdmitAttrPROMPT e where+  uaPROMPT :: (Monad m) => String -> WithHTML e m ()+  uaPROMPT str = attr "PROMPT" str+  atPROMPT :: (Monad m, AttrValuePROMPT v) => v -> WithHTML e m ()+  atPROMPT v = attr "PROMPT" (av $ show v)+class AdmitAttrPROFILE e where+  uaPROFILE :: (Monad m) => String -> WithHTML e m ()+  uaPROFILE str = attr "PROFILE" str+  atPROFILE :: (Monad m, AttrValuePROFILE v) => v -> WithHTML e m ()+  atPROFILE v = attr "PROFILE" (av $ show v)+class AdmitAttrWIDTH e where+  uaWIDTH :: (Monad m) => String -> WithHTML e m ()+  uaWIDTH str = attr "WIDTH" str+  atWIDTH :: (Monad m, AttrValueWIDTH v) => v -> WithHTML e m ()+  atWIDTH v = attr "WIDTH" (av $ show v)+class AdmitAttrHEIGHT e where+  uaHEIGHT :: (Monad m) => String -> WithHTML e m ()+  uaHEIGHT str = attr "HEIGHT" str+  atHEIGHT :: (Monad m, AttrValueHEIGHT v) => v -> WithHTML e m ()+  atHEIGHT v = attr "HEIGHT" (av $ show v)+class AdmitAttrALIGN e where+  uaALIGN :: (Monad m) => String -> WithHTML e m ()+  uaALIGN str = attr "ALIGN" str+  atALIGN :: (Monad m, AttrValueALIGN v) => v -> WithHTML e m ()+  atALIGN v = attr "ALIGN" (av $ show v)+class AdmitAttrSCROLLING e where+  uaSCROLLING :: (Monad m) => String -> WithHTML e m ()+  uaSCROLLING str = attr "SCROLLING" str+  atSCROLLING :: (Monad m, AttrValueSCROLLING v) => v -> WithHTML e m ()+  atSCROLLING v = attr "SCROLLING" (av $ show v)+class AdmitAttrMARGINHEIGHT e where+  uaMARGINHEIGHT :: (Monad m) => String -> WithHTML e m ()+  uaMARGINHEIGHT str = attr "MARGINHEIGHT" str+  atMARGINHEIGHT :: (Monad m, AttrValueMARGINHEIGHT v) => v -> WithHTML e m ()+  atMARGINHEIGHT v = attr "MARGINHEIGHT" (av $ show v)+class AdmitAttrMARGINWIDTH e where+  uaMARGINWIDTH :: (Monad m) => String -> WithHTML e m ()+  uaMARGINWIDTH str = attr "MARGINWIDTH" str+  atMARGINWIDTH :: (Monad m, AttrValueMARGINWIDTH v) => v -> WithHTML e m ()+  atMARGINWIDTH v = attr "MARGINWIDTH" (av $ show v)+class AdmitAttrFRAMEBORDER e where+  uaFRAMEBORDER :: (Monad m) => String -> WithHTML e m ()+  uaFRAMEBORDER str = attr "FRAMEBORDER" str+  atFRAMEBORDER :: (Monad m, AttrValueFRAMEBORDER v) => v -> WithHTML e m ()+  atFRAMEBORDER v = attr "FRAMEBORDER" (av $ show v)+class AdmitAttrLONGDESC e where+  uaLONGDESC :: (Monad m) => String -> WithHTML e m ()+  uaLONGDESC str = attr "LONGDESC" str+  atLONGDESC :: (Monad m, AttrValueLONGDESC v) => v -> WithHTML e m ()+  atLONGDESC v = attr "LONGDESC" (av $ show v)+class AdmitAttrNORESIZE e where+  uaNORESIZE :: (Monad m) => String -> WithHTML e m ()+  uaNORESIZE str = attr "NORESIZE" str+  atNORESIZE :: (Monad m, AttrValueNORESIZE v) => v -> WithHTML e m ()+  atNORESIZE v = attr "NORESIZE" (av $ show v)+class AdmitAttrONUNLOAD e where+  uaONUNLOAD :: (Monad m) => String -> WithHTML e m ()+  uaONUNLOAD str = attr "ONUNLOAD" str+  atONUNLOAD :: (Monad m, AttrValueONUNLOAD v) => v -> WithHTML e m ()+  atONUNLOAD v = attr "ONUNLOAD" (av $ show v)+class AdmitAttrONLOAD e where+  uaONLOAD :: (Monad m) => String -> WithHTML e m ()+  uaONLOAD str = attr "ONLOAD" str+  atONLOAD :: (Monad m, AttrValueONLOAD v) => v -> WithHTML e m ()+  atONLOAD v = attr "ONLOAD" (av $ show v)+class AdmitAttrCOLS e where+  uaCOLS :: (Monad m) => String -> WithHTML e m ()+  uaCOLS str = attr "COLS" str+  atCOLS :: (Monad m, AttrValueCOLS v) => v -> WithHTML e m ()+  atCOLS v = attr "COLS" (av $ show v)+class AdmitAttrROWS e where+  uaROWS :: (Monad m) => String -> WithHTML e m ()+  uaROWS str = attr "ROWS" str+  atROWS :: (Monad m, AttrValueROWS v) => v -> WithHTML e m ()+  atROWS v = attr "ROWS" (av $ show v)+class AdmitAttrBGCOLOR e where+  uaBGCOLOR :: (Monad m) => String -> WithHTML e m ()+  uaBGCOLOR str = attr "BGCOLOR" str+  atBGCOLOR :: (Monad m, AttrValueBGCOLOR v) => v -> WithHTML e m ()+  atBGCOLOR v = attr "BGCOLOR" (av $ show v)+class AdmitAttrNOWRAP e where+  uaNOWRAP :: (Monad m) => String -> WithHTML e m ()+  uaNOWRAP str = attr "NOWRAP" str+  atNOWRAP :: (Monad m, AttrValueNOWRAP v) => v -> WithHTML e m ()+  atNOWRAP v = attr "NOWRAP" (av $ show v)+class AdmitAttrVALIGN e where+  uaVALIGN :: (Monad m) => String -> WithHTML e m ()+  uaVALIGN str = attr "VALIGN" str+  atVALIGN :: (Monad m, AttrValueVALIGN v) => v -> WithHTML e m ()+  atVALIGN v = attr "VALIGN" (av $ show v)+class AdmitAttrCHAROFF e where+  uaCHAROFF :: (Monad m) => String -> WithHTML e m ()+  uaCHAROFF str = attr "CHAROFF" str+  atCHAROFF :: (Monad m, AttrValueCHAROFF v) => v -> WithHTML e m ()+  atCHAROFF v = attr "CHAROFF" (av $ show v)+class AdmitAttrCHAR e where+  uaCHAR :: (Monad m) => String -> WithHTML e m ()+  uaCHAR str = attr "CHAR" str+  atCHAR :: (Monad m, AttrValueCHAR v) => v -> WithHTML e m ()+  atCHAR v = attr "CHAR" (av $ show v)+class AdmitAttrCOLSPAN e where+  uaCOLSPAN :: (Monad m) => String -> WithHTML e m ()+  uaCOLSPAN str = attr "COLSPAN" str+  atCOLSPAN :: (Monad m, AttrValueCOLSPAN v) => v -> WithHTML e m ()+  atCOLSPAN v = attr "COLSPAN" (av $ show v)+class AdmitAttrROWSPAN e where+  uaROWSPAN :: (Monad m) => String -> WithHTML e m ()+  uaROWSPAN str = attr "ROWSPAN" str+  atROWSPAN :: (Monad m, AttrValueROWSPAN v) => v -> WithHTML e m ()+  atROWSPAN v = attr "ROWSPAN" (av $ show v)+class AdmitAttrSCOPE e where+  uaSCOPE :: (Monad m) => String -> WithHTML e m ()+  uaSCOPE str = attr "SCOPE" str+  atSCOPE :: (Monad m, AttrValueSCOPE v) => v -> WithHTML e m ()+  atSCOPE v = attr "SCOPE" (av $ show v)+class AdmitAttrHEADERS e where+  uaHEADERS :: (Monad m) => String -> WithHTML e m ()+  uaHEADERS str = attr "HEADERS" str+  atHEADERS :: (Monad m, AttrValueHEADERS v) => v -> WithHTML e m ()+  atHEADERS v = attr "HEADERS" (av $ show v)+class AdmitAttrAXIS e where+  uaAXIS :: (Monad m) => String -> WithHTML e m ()+  uaAXIS str = attr "AXIS" str+  atAXIS :: (Monad m, AttrValueAXIS v) => v -> WithHTML e m ()+  atAXIS v = attr "AXIS" (av $ show v)+class AdmitAttrABBR e where+  uaABBR :: (Monad m) => String -> WithHTML e m ()+  uaABBR str = attr "ABBR" str+  atABBR :: (Monad m, AttrValueABBR v) => v -> WithHTML e m ()+  atABBR v = attr "ABBR" (av $ show v)+class AdmitAttrSPAN e where+  uaSPAN :: (Monad m) => String -> WithHTML e m ()+  uaSPAN str = attr "SPAN" str+  atSPAN :: (Monad m, AttrValueSPAN v) => v -> WithHTML e m ()+  atSPAN v = attr "SPAN" (av $ show v)+class AdmitAttrDATAPAGESIZE e where+  uaDATAPAGESIZE :: (Monad m) => String -> WithHTML e m ()+  uaDATAPAGESIZE str = attr "DATAPAGESIZE" str+  atDATAPAGESIZE :: (Monad m, AttrValueDATAPAGESIZE v) => v -> WithHTML e m ()+  atDATAPAGESIZE v = attr "DATAPAGESIZE" (av $ show v)+class AdmitAttrCELLPADDING e where+  uaCELLPADDING :: (Monad m) => String -> WithHTML e m ()+  uaCELLPADDING str = attr "CELLPADDING" str+  atCELLPADDING :: (Monad m, AttrValueCELLPADDING v) => v -> WithHTML e m ()+  atCELLPADDING v = attr "CELLPADDING" (av $ show v)+class AdmitAttrCELLSPACING e where+  uaCELLSPACING :: (Monad m) => String -> WithHTML e m ()+  uaCELLSPACING str = attr "CELLSPACING" str+  atCELLSPACING :: (Monad m, AttrValueCELLSPACING v) => v -> WithHTML e m ()+  atCELLSPACING v = attr "CELLSPACING" (av $ show v)+class AdmitAttrRULES e where+  uaRULES :: (Monad m) => String -> WithHTML e m ()+  uaRULES str = attr "RULES" str+  atRULES :: (Monad m, AttrValueRULES v) => v -> WithHTML e m ()+  atRULES v = attr "RULES" (av $ show v)+class AdmitAttrFRAME e where+  uaFRAME :: (Monad m) => String -> WithHTML e m ()+  uaFRAME str = attr "FRAME" str+  atFRAME :: (Monad m, AttrValueFRAME v) => v -> WithHTML e m ()+  atFRAME v = attr "FRAME" (av $ show v)+class AdmitAttrBORDER e where+  uaBORDER :: (Monad m) => String -> WithHTML e m ()+  uaBORDER str = attr "BORDER" str+  atBORDER :: (Monad m, AttrValueBORDER v) => v -> WithHTML e m ()+  atBORDER v = attr "BORDER" (av $ show v)+class AdmitAttrSUMMARY e where+  uaSUMMARY :: (Monad m) => String -> WithHTML e m ()+  uaSUMMARY str = attr "SUMMARY" str+  atSUMMARY :: (Monad m, AttrValueSUMMARY v) => v -> WithHTML e m ()+  atSUMMARY v = attr "SUMMARY" (av $ show v)+class AdmitAttrONBLUR e where+  uaONBLUR :: (Monad m) => String -> WithHTML e m ()+  uaONBLUR str = attr "ONBLUR" str+  atONBLUR :: (Monad m, AttrValueONBLUR v) => v -> WithHTML e m ()+  atONBLUR v = attr "ONBLUR" (av $ show v)+class AdmitAttrONFOCUS e where+  uaONFOCUS :: (Monad m) => String -> WithHTML e m ()+  uaONFOCUS str = attr "ONFOCUS" str+  atONFOCUS :: (Monad m, AttrValueONFOCUS v) => v -> WithHTML e m ()+  atONFOCUS v = attr "ONFOCUS" (av $ show v)+class AdmitAttrACCESSKEY e where+  uaACCESSKEY :: (Monad m) => String -> WithHTML e m ()+  uaACCESSKEY str = attr "ACCESSKEY" str+  atACCESSKEY :: (Monad m, AttrValueACCESSKEY v) => v -> WithHTML e m ()+  atACCESSKEY v = attr "ACCESSKEY" (av $ show v)+class AdmitAttrTABINDEX e where+  uaTABINDEX :: (Monad m) => String -> WithHTML e m ()+  uaTABINDEX str = attr "TABINDEX" str+  atTABINDEX :: (Monad m, AttrValueTABINDEX v) => v -> WithHTML e m ()+  atTABINDEX v = attr "TABINDEX" (av $ show v)+class AdmitAttrDISABLED e where+  uaDISABLED :: (Monad m) => String -> WithHTML e m ()+  uaDISABLED str = attr "DISABLED" str+  atDISABLED :: (Monad m, AttrValueDISABLED v) => v -> WithHTML e m ()+  atDISABLED v = attr "DISABLED" (av $ show v)+class AdmitAttrVALUE e where+  uaVALUE :: (Monad m) => String -> WithHTML e m ()+  uaVALUE str = attr "VALUE" str+  atVALUE :: (Monad m, AttrValueVALUE v) => v -> WithHTML e m ()+  atVALUE v = attr "VALUE" (av $ show v)+class AdmitAttrONCHANGE e where+  uaONCHANGE :: (Monad m) => String -> WithHTML e m ()+  uaONCHANGE str = attr "ONCHANGE" str+  atONCHANGE :: (Monad m, AttrValueONCHANGE v) => v -> WithHTML e m ()+  atONCHANGE v = attr "ONCHANGE" (av $ show v)+class AdmitAttrONSELECT e where+  uaONSELECT :: (Monad m) => String -> WithHTML e m ()+  uaONSELECT str = attr "ONSELECT" str+  atONSELECT :: (Monad m, AttrValueONSELECT v) => v -> WithHTML e m ()+  atONSELECT v = attr "ONSELECT" (av $ show v)+class AdmitAttrREADONLY e where+  uaREADONLY :: (Monad m) => String -> WithHTML e m ()+  uaREADONLY str = attr "READONLY" str+  atREADONLY :: (Monad m, AttrValueREADONLY v) => v -> WithHTML e m ()+  atREADONLY v = attr "READONLY" (av $ show v)+class AdmitAttrLABEL e where+  uaLABEL :: (Monad m) => String -> WithHTML e m ()+  uaLABEL str = attr "LABEL" str+  atLABEL :: (Monad m, AttrValueLABEL v) => v -> WithHTML e m ()+  atLABEL v = attr "LABEL" (av $ show v)+class AdmitAttrSELECTED e where+  uaSELECTED :: (Monad m) => String -> WithHTML e m ()+  uaSELECTED str = attr "SELECTED" str+  atSELECTED :: (Monad m, AttrValueSELECTED v) => v -> WithHTML e m ()+  atSELECTED v = attr "SELECTED" (av $ show v)+class AdmitAttrMULTIPLE e where+  uaMULTIPLE :: (Monad m) => String -> WithHTML e m ()+  uaMULTIPLE str = attr "MULTIPLE" str+  atMULTIPLE :: (Monad m, AttrValueMULTIPLE v) => v -> WithHTML e m ()+  atMULTIPLE v = attr "MULTIPLE" (av $ show v)+class AdmitAttrSIZE e where+  uaSIZE :: (Monad m) => String -> WithHTML e m ()+  uaSIZE str = attr "SIZE" str+  atSIZE :: (Monad m, AttrValueSIZE v) => v -> WithHTML e m ()+  atSIZE v = attr "SIZE" (av $ show v)+class AdmitAttrACCEPT e where+  uaACCEPT :: (Monad m) => String -> WithHTML e m ()+  uaACCEPT str = attr "ACCEPT" str+  atACCEPT :: (Monad m, AttrValueACCEPT v) => v -> WithHTML e m ()+  atACCEPT v = attr "ACCEPT" (av $ show v)+class AdmitAttrISMAP e where+  uaISMAP :: (Monad m) => String -> WithHTML e m ()+  uaISMAP str = attr "ISMAP" str+  atISMAP :: (Monad m, AttrValueISMAP v) => v -> WithHTML e m ()+  atISMAP v = attr "ISMAP" (av $ show v)+class AdmitAttrUSEMAP e where+  uaUSEMAP :: (Monad m) => String -> WithHTML e m ()+  uaUSEMAP str = attr "USEMAP" str+  atUSEMAP :: (Monad m, AttrValueUSEMAP v) => v -> WithHTML e m ()+  atUSEMAP v = attr "USEMAP" (av $ show v)+class AdmitAttrALT e where+  uaALT :: (Monad m) => String -> WithHTML e m ()+  uaALT str = attr "ALT" str+  atALT :: (Monad m, AttrValueALT v) => v -> WithHTML e m ()+  atALT v = attr "ALT" (av $ show v)+class AdmitAttrMAXLENGTH e where+  uaMAXLENGTH :: (Monad m) => String -> WithHTML e m ()+  uaMAXLENGTH str = attr "MAXLENGTH" str+  atMAXLENGTH :: (Monad m, AttrValueMAXLENGTH v) => v -> WithHTML e m ()+  atMAXLENGTH v = attr "MAXLENGTH" (av $ show v)+class AdmitAttrCHECKED e where+  uaCHECKED :: (Monad m) => String -> WithHTML e m ()+  uaCHECKED str = attr "CHECKED" str+  atCHECKED :: (Monad m, AttrValueCHECKED v) => v -> WithHTML e m ()+  atCHECKED v = attr "CHECKED" (av $ show v)+class AdmitAttrACCEPT_CHARSET e where+  uaACCEPT_CHARSET :: (Monad m) => String -> WithHTML e m ()+  uaACCEPT_CHARSET str = attr "ACCEPT_CHARSET" str+  atACCEPT_CHARSET :: (Monad m, AttrValueACCEPT_CHARSET v) => v -> WithHTML e m ()+  atACCEPT_CHARSET v = attr "ACCEPT_CHARSET" (av $ show v)+class AdmitAttrONRESET e where+  uaONRESET :: (Monad m) => String -> WithHTML e m ()+  uaONRESET str = attr "ONRESET" str+  atONRESET :: (Monad m, AttrValueONRESET v) => v -> WithHTML e m ()+  atONRESET v = attr "ONRESET" (av $ show v)+class AdmitAttrONSUBMIT e where+  uaONSUBMIT :: (Monad m) => String -> WithHTML e m ()+  uaONSUBMIT str = attr "ONSUBMIT" str+  atONSUBMIT :: (Monad m, AttrValueONSUBMIT v) => v -> WithHTML e m ()+  atONSUBMIT v = attr "ONSUBMIT" (av $ show v)+class AdmitAttrENCTYPE e where+  uaENCTYPE :: (Monad m) => String -> WithHTML e m ()+  uaENCTYPE str = attr "ENCTYPE" str+  atENCTYPE :: (Monad m, AttrValueENCTYPE v) => v -> WithHTML e m ()+  atENCTYPE v = attr "ENCTYPE" (av $ show v)+class AdmitAttrMETHOD e where+  uaMETHOD :: (Monad m) => String -> WithHTML e m ()+  uaMETHOD str = attr "METHOD" str+  atMETHOD :: (Monad m, AttrValueMETHOD v) => v -> WithHTML e m ()+  atMETHOD v = attr "METHOD" (av $ show v)+class AdmitAttrACTION e where+  uaACTION :: (Monad m) => String -> WithHTML e m ()+  uaACTION str = attr "ACTION" str+  atACTION :: (Monad m, AttrValueACTION v) => v -> WithHTML e m ()+  atACTION v = attr "ACTION" (av $ show v)+class AdmitAttrCOMPACT e where+  uaCOMPACT :: (Monad m) => String -> WithHTML e m ()+  uaCOMPACT str = attr "COMPACT" str+  atCOMPACT :: (Monad m, AttrValueCOMPACT v) => v -> WithHTML e m ()+  atCOMPACT v = attr "COMPACT" (av $ show v)+class AdmitAttrSTART e where+  uaSTART :: (Monad m) => String -> WithHTML e m ()+  uaSTART str = attr "START" str+  atSTART :: (Monad m, AttrValueSTART v) => v -> WithHTML e m ()+  atSTART v = attr "START" (av $ show v)+class AdmitAttrDATETIME e where+  uaDATETIME :: (Monad m) => String -> WithHTML e m ()+  uaDATETIME str = attr "DATETIME" str+  atDATETIME :: (Monad m, AttrValueDATETIME v) => v -> WithHTML e m ()+  atDATETIME v = attr "DATETIME" (av $ show v)+class AdmitAttrCITE e where+  uaCITE :: (Monad m) => String -> WithHTML e m ()+  uaCITE str = attr "CITE" str+  atCITE :: (Monad m, AttrValueCITE v) => v -> WithHTML e m ()+  atCITE v = attr "CITE" (av $ show v)+class AdmitAttrNOSHADE e where+  uaNOSHADE :: (Monad m) => String -> WithHTML e m ()+  uaNOSHADE str = attr "NOSHADE" str+  atNOSHADE :: (Monad m, AttrValueNOSHADE v) => v -> WithHTML e m ()+  atNOSHADE v = attr "NOSHADE" (av $ show v)+class AdmitAttrVSPACE e where+  uaVSPACE :: (Monad m) => String -> WithHTML e m ()+  uaVSPACE str = attr "VSPACE" str+  atVSPACE :: (Monad m, AttrValueVSPACE v) => v -> WithHTML e m ()+  atVSPACE v = attr "VSPACE" (av $ show v)+class AdmitAttrHSPACE e where+  uaHSPACE :: (Monad m) => String -> WithHTML e m ()+  uaHSPACE str = attr "HSPACE" str+  atHSPACE :: (Monad m, AttrValueHSPACE v) => v -> WithHTML e m ()+  atHSPACE v = attr "HSPACE" (av $ show v)+class AdmitAttrOBJECT e where+  uaOBJECT :: (Monad m) => String -> WithHTML e m ()+  uaOBJECT str = attr "OBJECT" str+  atOBJECT :: (Monad m, AttrValueOBJECT v) => v -> WithHTML e m ()+  atOBJECT v = attr "OBJECT" (av $ show v)+class AdmitAttrCODE e where+  uaCODE :: (Monad m) => String -> WithHTML e m ()+  uaCODE str = attr "CODE" str+  atCODE :: (Monad m, AttrValueCODE v) => v -> WithHTML e m ()+  atCODE v = attr "CODE" (av $ show v)+class AdmitAttrARCHIVE e where+  uaARCHIVE :: (Monad m) => String -> WithHTML e m ()+  uaARCHIVE str = attr "ARCHIVE" str+  atARCHIVE :: (Monad m, AttrValueARCHIVE v) => v -> WithHTML e m ()+  atARCHIVE v = attr "ARCHIVE" (av $ show v)+class AdmitAttrCODEBASE e where+  uaCODEBASE :: (Monad m) => String -> WithHTML e m ()+  uaCODEBASE str = attr "CODEBASE" str+  atCODEBASE :: (Monad m, AttrValueCODEBASE v) => v -> WithHTML e m ()+  atCODEBASE v = attr "CODEBASE" (av $ show v)+class AdmitAttrVALUETYPE e where+  uaVALUETYPE :: (Monad m) => String -> WithHTML e m ()+  uaVALUETYPE str = attr "VALUETYPE" str+  atVALUETYPE :: (Monad m, AttrValueVALUETYPE v) => v -> WithHTML e m ()+  atVALUETYPE v = attr "VALUETYPE" (av $ show v)+class AdmitAttrSTANDBY e where+  uaSTANDBY :: (Monad m) => String -> WithHTML e m ()+  uaSTANDBY str = attr "STANDBY" str+  atSTANDBY :: (Monad m, AttrValueSTANDBY v) => v -> WithHTML e m ()+  atSTANDBY v = attr "STANDBY" (av $ show v)+class AdmitAttrCODETYPE e where+  uaCODETYPE :: (Monad m) => String -> WithHTML e m ()+  uaCODETYPE str = attr "CODETYPE" str+  atCODETYPE :: (Monad m, AttrValueCODETYPE v) => v -> WithHTML e m ()+  atCODETYPE v = attr "CODETYPE" (av $ show v)+class AdmitAttrDATA e where+  uaDATA :: (Monad m) => String -> WithHTML e m ()+  uaDATA str = attr "DATA" str+  atDATA :: (Monad m, AttrValueDATA v) => v -> WithHTML e m ()+  atDATA v = attr "DATA" (av $ show v)+class AdmitAttrCLASSID e where+  uaCLASSID :: (Monad m) => String -> WithHTML e m ()+  uaCLASSID str = attr "CLASSID" str+  atCLASSID :: (Monad m, AttrValueCLASSID v) => v -> WithHTML e m ()+  atCLASSID v = attr "CLASSID" (av $ show v)+class AdmitAttrDECLARE e where+  uaDECLARE :: (Monad m) => String -> WithHTML e m ()+  uaDECLARE str = attr "DECLARE" str+  atDECLARE :: (Monad m, AttrValueDECLARE v) => v -> WithHTML e m ()+  atDECLARE v = attr "DECLARE" (av $ show v)+class AdmitAttrREV e where+  uaREV :: (Monad m) => String -> WithHTML e m ()+  uaREV str = attr "REV" str+  atREV :: (Monad m, AttrValueREV v) => v -> WithHTML e m ()+  atREV v = attr "REV" (av $ show v)+class AdmitAttrREL e where+  uaREL :: (Monad m) => String -> WithHTML e m ()+  uaREL str = attr "REL" str+  atREL :: (Monad m, AttrValueREL v) => v -> WithHTML e m ()+  atREL v = attr "REL" (av $ show v)+class AdmitAttrHREFLANG e where+  uaHREFLANG :: (Monad m) => String -> WithHTML e m ()+  uaHREFLANG str = attr "HREFLANG" str+  atHREFLANG :: (Monad m, AttrValueHREFLANG v) => v -> WithHTML e m ()+  atHREFLANG v = attr "HREFLANG" (av $ show v)+class AdmitAttrNOHREF e where+  uaNOHREF :: (Monad m) => String -> WithHTML e m ()+  uaNOHREF str = attr "NOHREF" str+  atNOHREF :: (Monad m, AttrValueNOHREF v) => v -> WithHTML e m ()+  atNOHREF v = attr "NOHREF" (av $ show v)+class AdmitAttrCOORDS e where+  uaCOORDS :: (Monad m) => String -> WithHTML e m ()+  uaCOORDS str = attr "COORDS" str+  atCOORDS :: (Monad m, AttrValueCOORDS v) => v -> WithHTML e m ()+  atCOORDS v = attr "COORDS" (av $ show v)+class AdmitAttrSHAPE e where+  uaSHAPE :: (Monad m) => String -> WithHTML e m ()+  uaSHAPE str = attr "SHAPE" str+  atSHAPE :: (Monad m, AttrValueSHAPE v) => v -> WithHTML e m ()+  atSHAPE v = attr "SHAPE" (av $ show v)+class AdmitAttrALINK e where+  uaALINK :: (Monad m) => String -> WithHTML e m ()+  uaALINK str = attr "ALINK" str+  atALINK :: (Monad m, AttrValueALINK v) => v -> WithHTML e m ()+  atALINK v = attr "ALINK" (av $ show v)+class AdmitAttrVLINK e where+  uaVLINK :: (Monad m) => String -> WithHTML e m ()+  uaVLINK str = attr "VLINK" str+  atVLINK :: (Monad m, AttrValueVLINK v) => v -> WithHTML e m ()+  atVLINK v = attr "VLINK" (av $ show v)+class AdmitAttrLINK e where+  uaLINK :: (Monad m) => String -> WithHTML e m ()+  uaLINK str = attr "LINK" str+  atLINK :: (Monad m, AttrValueLINK v) => v -> WithHTML e m ()+  atLINK v = attr "LINK" (av $ show v)+class AdmitAttrTEXT e where+  uaTEXT :: (Monad m) => String -> WithHTML e m ()+  uaTEXT str = attr "TEXT" str+  atTEXT :: (Monad m, AttrValueTEXT v) => v -> WithHTML e m ()+  atTEXT v = attr "TEXT" (av $ show v)+class AdmitAttrBACKGROUND e where+  uaBACKGROUND :: (Monad m) => String -> WithHTML e m ()+  uaBACKGROUND str = attr "BACKGROUND" str+  atBACKGROUND :: (Monad m, AttrValueBACKGROUND v) => v -> WithHTML e m ()+  atBACKGROUND v = attr "BACKGROUND" (av $ show v)+class AdmitAttrCLEAR e where+  uaCLEAR :: (Monad m) => String -> WithHTML e m ()+  uaCLEAR str = attr "CLEAR" str+  atCLEAR :: (Monad m, AttrValueCLEAR v) => v -> WithHTML e m ()+  atCLEAR v = attr "CLEAR" (av $ show v)+class AdmitAttrFACE e where+  uaFACE :: (Monad m) => String -> WithHTML e m ()+  uaFACE str = attr "FACE" str+  atFACE :: (Monad m, AttrValueFACE v) => v -> WithHTML e m ()+  atFACE v = attr "FACE" (av $ show v)+class AdmitAttrCOLOR e where+  uaCOLOR :: (Monad m) => String -> WithHTML e m ()+  uaCOLOR str = attr "COLOR" str+  atCOLOR :: (Monad m, AttrValueCOLOR v) => v -> WithHTML e m ()+  atCOLOR v = attr "COLOR" (av $ show v)+class Show v => AttrValueABBR v+class Show v => AttrValueACCEPT v+class Show v => AttrValueACCEPT_CHARSET v+class Show v => AttrValueACCESSKEY v+class Show v => AttrValueACTION v+class Show v => AttrValueALIGN v+class Show v => AttrValueALINK v+class Show v => AttrValueALT v+class Show v => AttrValueARCHIVE v+class Show v => AttrValueAXIS v+class Show v => AttrValueBACKGROUND v+class Show v => AttrValueBGCOLOR v+class Show v => AttrValueBORDER v+class Show v => AttrValueCELLPADDING v+class Show v => AttrValueCELLSPACING v+class Show v => AttrValueCHAR v+class Show v => AttrValueCHAROFF v+class Show v => AttrValueCHARSET v+class Show v => AttrValueCHECKED v+class Show v => AttrValueCITE v+class Show v => AttrValueCLASS v+class Show v => AttrValueCLASSID v+class Show v => AttrValueCLEAR v+class Show v => AttrValueCODE v+class Show v => AttrValueCODEBASE v+class Show v => AttrValueCODETYPE v+class Show v => AttrValueCOLOR v+class Show v => AttrValueCOLS v+class Show v => AttrValueCOLSPAN v+class Show v => AttrValueCOMPACT v+class Show v => AttrValueCONTENT v+class Show v => AttrValueCOORDS v+class Show v => AttrValueDATA v+class Show v => AttrValueDATAPAGESIZE v+class Show v => AttrValueDATETIME v+class Show v => AttrValueDECLARE v+class Show v => AttrValueDEFER v+class Show v => AttrValueDIR v+class Show v => AttrValueDISABLED v+class Show v => AttrValueENCTYPE v+class Show v => AttrValueEVENT v+class Show v => AttrValueFACE v+class Show v => AttrValueFOR v+class Show v => AttrValueFRAME v+class Show v => AttrValueFRAMEBORDER v+class Show v => AttrValueHEADERS v+class Show v => AttrValueHEIGHT v+class Show v => AttrValueHREF v+class Show v => AttrValueHREFLANG v+class Show v => AttrValueHSPACE v+class Show v => AttrValueHTTP_EQUIV v+class Show v => AttrValueID v+class Show v => AttrValueISMAP v+class Show v => AttrValueLABEL v+class Show v => AttrValueLANG v+class Show v => AttrValueLANGUAGE v+class Show v => AttrValueLINK v+class Show v => AttrValueLONGDESC v+class Show v => AttrValueMARGINHEIGHT v+class Show v => AttrValueMARGINWIDTH v+class Show v => AttrValueMAXLENGTH v+class Show v => AttrValueMEDIA v+class Show v => AttrValueMETHOD v+class Show v => AttrValueMULTIPLE v+class Show v => AttrValueNAME v+class Show v => AttrValueNOHREF v+class Show v => AttrValueNORESIZE v+class Show v => AttrValueNOSHADE v+class Show v => AttrValueNOWRAP v+class Show v => AttrValueOBJECT v+class Show v => AttrValueONBLUR v+class Show v => AttrValueONCHANGE v+class Show v => AttrValueONCLICK v+class Show v => AttrValueONDBLCLICK v+class Show v => AttrValueONFOCUS v+class Show v => AttrValueONKEYDOWN v+class Show v => AttrValueONKEYPRESS v+class Show v => AttrValueONKEYUP v+class Show v => AttrValueONLOAD v+class Show v => AttrValueONMOUSEDOWN v+class Show v => AttrValueONMOUSEMOVE v+class Show v => AttrValueONMOUSEOUT v+class Show v => AttrValueONMOUSEOVER v+class Show v => AttrValueONMOUSEUP v+class Show v => AttrValueONRESET v+class Show v => AttrValueONSELECT v+class Show v => AttrValueONSUBMIT v+class Show v => AttrValueONUNLOAD v+class Show v => AttrValuePROFILE v+class Show v => AttrValuePROMPT v+class Show v => AttrValueREADONLY v+class Show v => AttrValueREL v+class Show v => AttrValueREV v+class Show v => AttrValueROWS v+class Show v => AttrValueROWSPAN v+class Show v => AttrValueRULES v+class Show v => AttrValueSCHEME v+class Show v => AttrValueSCOPE v+class Show v => AttrValueSCROLLING v+class Show v => AttrValueSELECTED v+class Show v => AttrValueSHAPE v+class Show v => AttrValueSIZE v+class Show v => AttrValueSPAN v+class Show v => AttrValueSRC v+class Show v => AttrValueSTANDBY v+class Show v => AttrValueSTART v+class Show v => AttrValueSTYLE v+class Show v => AttrValueSUMMARY v+class Show v => AttrValueTABINDEX v+class Show v => AttrValueTARGET v+class Show v => AttrValueTEXT v+class Show v => AttrValueTITLE v+class Show v => AttrValueTYPE v+class Show v => AttrValueUSEMAP v+class Show v => AttrValueVALIGN v+class Show v => AttrValueVALUE v+class Show v => AttrValueVALUETYPE v+class Show v => AttrValueVERSION v+class Show v => AttrValueVLINK v+class Show v => AttrValueVSPACE v+class Show v => AttrValueWIDTH v+class AdmitChildA e where+  a :: (Monad m) => WithHTML A m a -> WithHTML e m a+  a = HTMLMonad.a+class AdmitChildABBR e where+  abbr :: (Monad m) => WithHTML ABBR m a -> WithHTML e m a+  abbr = HTMLMonad.abbr+class AdmitChildACRONYM e where+  acronym :: (Monad m) => WithHTML ACRONYM m a -> WithHTML e m a+  acronym = HTMLMonad.acronym+class AdmitChildADDRESS e where+  address :: (Monad m) => WithHTML ADDRESS m a -> WithHTML e m a+  address = HTMLMonad.address+class AdmitChildAPPLET e where+  applet :: (Monad m) => WithHTML APPLET m a -> WithHTML e m a+  applet = HTMLMonad.applet+class AdmitChildAREA e where+  area :: (Monad m) => WithHTML AREA m a -> WithHTML e m a+  area = HTMLMonad.area+class AdmitChildB e where+  b :: (Monad m) => WithHTML B m a -> WithHTML e m a+  b = HTMLMonad.b+class AdmitChildBASE e where+  base :: (Monad m) => WithHTML BASE m a -> WithHTML e m a+  base = HTMLMonad.base+class AdmitChildBASEFONT e where+  basefont :: (Monad m) => WithHTML BASEFONT m a -> WithHTML e m a+  basefont = HTMLMonad.basefont+class AdmitChildBDO e where+  bdo :: (Monad m) => WithHTML BDO m a -> WithHTML e m a+  bdo = HTMLMonad.bdo+class AdmitChildBIG e where+  big :: (Monad m) => WithHTML BIG m a -> WithHTML e m a+  big = HTMLMonad.big+class AdmitChildBLOCKQUOTE e where+  blockquote :: (Monad m) => WithHTML BLOCKQUOTE m a -> WithHTML e m a+  blockquote = HTMLMonad.blockquote+class AdmitChildBODY e where+  body :: (Monad m) => WithHTML BODY m a -> WithHTML e m a+  body = HTMLMonad.body+class AdmitChildBR e where+  br :: (Monad m) => WithHTML BR m a -> WithHTML e m a+  br = HTMLMonad.br+class AdmitChildBUTTON e where+  button :: (Monad m) => WithHTML BUTTON m a -> WithHTML e m a+  button = HTMLMonad.button+class AdmitChildCAPTION e where+  caption :: (Monad m) => WithHTML CAPTION m a -> WithHTML e m a+  caption = HTMLMonad.caption+class AdmitChildCENTER e where+  center :: (Monad m) => WithHTML CENTER m a -> WithHTML e m a+  center = HTMLMonad.center+class AdmitChildCITE e where+  cite :: (Monad m) => WithHTML CITE m a -> WithHTML e m a+  cite = HTMLMonad.cite+class AdmitChildCODE e where+  code :: (Monad m) => WithHTML CODE m a -> WithHTML e m a+  code = HTMLMonad.code+class AdmitChildCOL e where+  col :: (Monad m) => WithHTML COL m a -> WithHTML e m a+  col = HTMLMonad.col+class AdmitChildCOLGROUP e where+  colgroup :: (Monad m) => WithHTML COLGROUP m a -> WithHTML e m a+  colgroup = HTMLMonad.colgroup+class AdmitChildDD e where+  dd :: (Monad m) => WithHTML DD m a -> WithHTML e m a+  dd = HTMLMonad.dd+class AdmitChildDEL e where+  del :: (Monad m) => WithHTML DEL m a -> WithHTML e m a+  del = HTMLMonad.del+class AdmitChildDFN e where+  dfn :: (Monad m) => WithHTML DFN m a -> WithHTML e m a+  dfn = HTMLMonad.dfn+class AdmitChildDIR e where+  dir :: (Monad m) => WithHTML DIR m a -> WithHTML e m a+  dir = HTMLMonad.dir+class AdmitChildDIV e where+  div :: (Monad m) => WithHTML DIV m a -> WithHTML e m a+  div = HTMLMonad.div+class AdmitChildDL e where+  dl :: (Monad m) => WithHTML DL m a -> WithHTML e m a+  dl = HTMLMonad.dl+class AdmitChildDT e where+  dt :: (Monad m) => WithHTML DT m a -> WithHTML e m a+  dt = HTMLMonad.dt+class AdmitChildEM e where+  em :: (Monad m) => WithHTML EM m a -> WithHTML e m a+  em = HTMLMonad.em+class AdmitChildFIELDSET e where+  fieldset :: (Monad m) => WithHTML FIELDSET m a -> WithHTML e m a+  fieldset = HTMLMonad.fieldset+class AdmitChildFONT e where+  font :: (Monad m) => WithHTML FONT m a -> WithHTML e m a+  font = HTMLMonad.font+class AdmitChildFORM e where+  form :: (Monad m) => WithHTML FORM m a -> WithHTML e m a+  form = HTMLMonad.form+class AdmitChildFRAME e where+  frame :: (Monad m) => WithHTML FRAME m a -> WithHTML e m a+  frame = HTMLMonad.frame+class AdmitChildFRAMESET e where+  frameset :: (Monad m) => WithHTML FRAMESET m a -> WithHTML e m a+  frameset = HTMLMonad.frameset+class AdmitChildH1 e where+  h1 :: (Monad m) => WithHTML H1 m a -> WithHTML e m a+  h1 = HTMLMonad.h1+class AdmitChildH2 e where+  h2 :: (Monad m) => WithHTML H2 m a -> WithHTML e m a+  h2 = HTMLMonad.h2+class AdmitChildH3 e where+  h3 :: (Monad m) => WithHTML H3 m a -> WithHTML e m a+  h3 = HTMLMonad.h3+class AdmitChildH4 e where+  h4 :: (Monad m) => WithHTML H4 m a -> WithHTML e m a+  h4 = HTMLMonad.h4+class AdmitChildH5 e where+  h5 :: (Monad m) => WithHTML H5 m a -> WithHTML e m a+  h5 = HTMLMonad.h5+class AdmitChildH6 e where+  h6 :: (Monad m) => WithHTML H6 m a -> WithHTML e m a+  h6 = HTMLMonad.h6+class AdmitChildHEAD e where+  head :: (Monad m) => WithHTML HEAD m a -> WithHTML e m a+  head = HTMLMonad.head+class AdmitChildHR e where+  hr :: (Monad m) => WithHTML HR m a -> WithHTML e m a+  hr = HTMLMonad.hr+class AdmitChildHTML e where+  html :: (Monad m) => WithHTML HTML m a -> WithHTML e m a+  html = HTMLMonad.html+class AdmitChildI e where+  i :: (Monad m) => WithHTML I m a -> WithHTML e m a+  i = HTMLMonad.i+class AdmitChildIFRAME e where+  iframe :: (Monad m) => WithHTML IFRAME m a -> WithHTML e m a+  iframe = HTMLMonad.iframe+class AdmitChildIMG e where+  img :: (Monad m) => WithHTML IMG m a -> WithHTML e m a+  img = HTMLMonad.img+class AdmitChildINPUT e where+  input :: (Monad m) => WithHTML INPUT m a -> WithHTML e m a+  input = HTMLMonad.input+class AdmitChildINS e where+  ins :: (Monad m) => WithHTML INS m a -> WithHTML e m a+  ins = HTMLMonad.ins+class AdmitChildISINDEX e where+  isindex :: (Monad m) => WithHTML ISINDEX m a -> WithHTML e m a+  isindex = HTMLMonad.isindex+class AdmitChildKBD e where+  kbd :: (Monad m) => WithHTML KBD m a -> WithHTML e m a+  kbd = HTMLMonad.kbd+class AdmitChildLABEL e where+  label :: (Monad m) => WithHTML LABEL m a -> WithHTML e m a+  label = HTMLMonad.label+class AdmitChildLEGEND e where+  legend :: (Monad m) => WithHTML LEGEND m a -> WithHTML e m a+  legend = HTMLMonad.legend+class AdmitChildLI e where+  li :: (Monad m) => WithHTML LI m a -> WithHTML e m a+  li = HTMLMonad.li+class AdmitChildLINK e where+  link :: (Monad m) => WithHTML LINK m a -> WithHTML e m a+  link = HTMLMonad.link+class AdmitChildMAP e where+  map :: (Monad m) => WithHTML MAP m a -> WithHTML e m a+  map = HTMLMonad.map+class AdmitChildMENU e where+  menu :: (Monad m) => WithHTML MENU m a -> WithHTML e m a+  menu = HTMLMonad.menu+class AdmitChildMETA e where+  meta :: (Monad m) => WithHTML META m a -> WithHTML e m a+  meta = HTMLMonad.meta+class AdmitChildNOFRAMES e where+  noframes :: (Monad m) => WithHTML NOFRAMES m a -> WithHTML e m a+  noframes = HTMLMonad.noframes+class AdmitChildNOSCRIPT e where+  noscript :: (Monad m) => WithHTML NOSCRIPT m a -> WithHTML e m a+  noscript = HTMLMonad.noscript+class AdmitChildOBJECT e where+  object :: (Monad m) => WithHTML OBJECT m a -> WithHTML e m a+  object = HTMLMonad.object+class AdmitChildOL e where+  ol :: (Monad m) => WithHTML OL m a -> WithHTML e m a+  ol = HTMLMonad.ol+class AdmitChildOPTGROUP e where+  optgroup :: (Monad m) => WithHTML OPTGROUP m a -> WithHTML e m a+  optgroup = HTMLMonad.optgroup+class AdmitChildOPTION e where+  option :: (Monad m) => WithHTML OPTION m a -> WithHTML e m a+  option = HTMLMonad.option+class AdmitChildP e where+  p :: (Monad m) => WithHTML P m a -> WithHTML e m a+  p = HTMLMonad.p+class AdmitChildPARAM e where+  param :: (Monad m) => WithHTML PARAM m a -> WithHTML e m a+  param = HTMLMonad.param+class AdmitChildPRE e where+  pre :: (Monad m) => WithHTML PRE m a -> WithHTML e m a+  pre = HTMLMonad.pre+class AdmitChildQ e where+  q :: (Monad m) => WithHTML Q m a -> WithHTML e m a+  q = HTMLMonad.q+class AdmitChildS e where+  s :: (Monad m) => WithHTML S m a -> WithHTML e m a+  s = HTMLMonad.s+class AdmitChildSAMP e where+  samp :: (Monad m) => WithHTML SAMP m a -> WithHTML e m a+  samp = HTMLMonad.samp+class AdmitChildSCRIPT e where+  script :: (Monad m) => WithHTML SCRIPT m a -> WithHTML e m a+  script = HTMLMonad.script+class AdmitChildSELECT e where+  select :: (Monad m) => WithHTML SELECT m a -> WithHTML e m a+  select = HTMLMonad.select+class AdmitChildSMALL e where+  small :: (Monad m) => WithHTML SMALL m a -> WithHTML e m a+  small = HTMLMonad.small+class AdmitChildSPAN e where+  span :: (Monad m) => WithHTML SPAN m a -> WithHTML e m a+  span = HTMLMonad.span+class AdmitChildSTRIKE e where+  strike :: (Monad m) => WithHTML STRIKE m a -> WithHTML e m a+  strike = HTMLMonad.strike+class AdmitChildSTRONG e where+  strong :: (Monad m) => WithHTML STRONG m a -> WithHTML e m a+  strong = HTMLMonad.strong+class AdmitChildSTYLE e where+  style :: (Monad m) => WithHTML STYLE m a -> WithHTML e m a+  style = HTMLMonad.style+class AdmitChildSUB e where+  sub :: (Monad m) => WithHTML SUB m a -> WithHTML e m a+  sub = HTMLMonad.sub+class AdmitChildSUP e where+  sup :: (Monad m) => WithHTML SUP m a -> WithHTML e m a+  sup = HTMLMonad.sup+class AdmitChildTABLE e where+  table :: (Monad m) => WithHTML TABLE m a -> WithHTML e m a+  table = HTMLMonad.table+class AdmitChildTBODY e where+  tbody :: (Monad m) => WithHTML TBODY m a -> WithHTML e m a+  tbody = HTMLMonad.tbody+class AdmitChildTD e where+  td :: (Monad m) => WithHTML TD m a -> WithHTML e m a+  td = HTMLMonad.td+class AdmitChildTEXTAREA e where+  textarea :: (Monad m) => WithHTML TEXTAREA m a -> WithHTML e m a+  textarea = HTMLMonad.textarea+class AdmitChildTFOOT e where+  tfoot :: (Monad m) => WithHTML TFOOT m a -> WithHTML e m a+  tfoot = HTMLMonad.tfoot+class AdmitChildTH e where+  th :: (Monad m) => WithHTML TH m a -> WithHTML e m a+  th = HTMLMonad.th+class AdmitChildTHEAD e where+  thead :: (Monad m) => WithHTML THEAD m a -> WithHTML e m a+  thead = HTMLMonad.thead+class AdmitChildTITLE e where+  title :: (Monad m) => WithHTML TITLE m a -> WithHTML e m a+  title = HTMLMonad.title+class AdmitChildTR e where+  tr :: (Monad m) => WithHTML TR m a -> WithHTML e m a+  tr = HTMLMonad.tr+class AdmitChildTT e where+  tt :: (Monad m) => WithHTML TT m a -> WithHTML e m a+  tt = HTMLMonad.tt+class AdmitChildU e where+  u :: (Monad m) => WithHTML U m a -> WithHTML e m a+  u = HTMLMonad.u+class AdmitChildUL e where+  ul :: (Monad m) => WithHTML UL m a -> WithHTML e m a+  ul = HTMLMonad.ul+class AdmitChildVAR e where+  var :: (Monad m) => WithHTML VAR m a -> WithHTML e m a+  var = HTMLMonad.var+data A = A+instance Show A where show A = "A"+data ABBR = ABBR+instance Show ABBR where show ABBR = "ABBR"+data ACRONYM = ACRONYM+instance Show ACRONYM where show ACRONYM = "ACRONYM"+data ADDRESS = ADDRESS+instance Show ADDRESS where show ADDRESS = "ADDRESS"+data APPLET = APPLET+instance Show APPLET where show APPLET = "APPLET"+data AREA = AREA+instance Show AREA where show AREA = "AREA"+data B = B+instance Show B where show B = "B"+data BASE = BASE+instance Show BASE where show BASE = "BASE"+data BASEFONT = BASEFONT+instance Show BASEFONT where show BASEFONT = "BASEFONT"+data BDO = BDO+instance Show BDO where show BDO = "BDO"+data BIG = BIG+instance Show BIG where show BIG = "BIG"+data BLOCKQUOTE = BLOCKQUOTE+instance Show BLOCKQUOTE where show BLOCKQUOTE = "BLOCKQUOTE"+data BODY = BODY+instance Show BODY where show BODY = "BODY"+data BR = BR+instance Show BR where show BR = "BR"+data BUTTON = BUTTON+instance Show BUTTON where show BUTTON = "BUTTON"+data CAPTION = CAPTION+instance Show CAPTION where show CAPTION = "CAPTION"+data CENTER = CENTER+instance Show CENTER where show CENTER = "CENTER"+data CITE = CITE+instance Show CITE where show CITE = "CITE"+data CODE = CODE+instance Show CODE where show CODE = "CODE"+data COL = COL+instance Show COL where show COL = "COL"+data COLGROUP = COLGROUP+instance Show COLGROUP where show COLGROUP = "COLGROUP"+data DD = DD+instance Show DD where show DD = "DD"+data DEL = DEL+instance Show DEL where show DEL = "DEL"+data DFN = DFN+instance Show DFN where show DFN = "DFN"+data DIR = DIR+instance Show DIR where show DIR = "DIR"+data DIV = DIV+instance Show DIV where show DIV = "DIV"+data DL = DL+instance Show DL where show DL = "DL"+data DT = DT+instance Show DT where show DT = "DT"+data EM = EM+instance Show EM where show EM = "EM"+data FIELDSET = FIELDSET+instance Show FIELDSET where show FIELDSET = "FIELDSET"+data FONT = FONT+instance Show FONT where show FONT = "FONT"+data FORM = FORM+instance Show FORM where show FORM = "FORM"+data FRAME = FRAME+instance Show FRAME where show FRAME = "FRAME"+data FRAMESET = FRAMESET+instance Show FRAMESET where show FRAMESET = "FRAMESET"+data H1 = H1+instance Show H1 where show H1 = "H1"+data H2 = H2+instance Show H2 where show H2 = "H2"+data H3 = H3+instance Show H3 where show H3 = "H3"+data H4 = H4+instance Show H4 where show H4 = "H4"+data H5 = H5+instance Show H5 where show H5 = "H5"+data H6 = H6+instance Show H6 where show H6 = "H6"+data HEAD = HEAD+instance Show HEAD where show HEAD = "HEAD"+data HR = HR+instance Show HR where show HR = "HR"+data HTML = HTML+instance Show HTML where show HTML = "HTML"+data I = I+instance Show I where show I = "I"+data IFRAME = IFRAME+instance Show IFRAME where show IFRAME = "IFRAME"+data IMG = IMG+instance Show IMG where show IMG = "IMG"+data INPUT = INPUT+instance Show INPUT where show INPUT = "INPUT"+data INS = INS+instance Show INS where show INS = "INS"+data ISINDEX = ISINDEX+instance Show ISINDEX where show ISINDEX = "ISINDEX"+data KBD = KBD+instance Show KBD where show KBD = "KBD"+data LABEL = LABEL+instance Show LABEL where show LABEL = "LABEL"+data LEGEND = LEGEND+instance Show LEGEND where show LEGEND = "LEGEND"+data LI = LI+instance Show LI where show LI = "LI"+data LINK = LINK+instance Show LINK where show LINK = "LINK"+data MAP = MAP+instance Show MAP where show MAP = "MAP"+data MENU = MENU+instance Show MENU where show MENU = "MENU"+data META = META+instance Show META where show META = "META"+data NOFRAMES = NOFRAMES+instance Show NOFRAMES where show NOFRAMES = "NOFRAMES"+data NOSCRIPT = NOSCRIPT+instance Show NOSCRIPT where show NOSCRIPT = "NOSCRIPT"+data OBJECT = OBJECT+instance Show OBJECT where show OBJECT = "OBJECT"+data OL = OL+instance Show OL where show OL = "OL"+data OPTGROUP = OPTGROUP+instance Show OPTGROUP where show OPTGROUP = "OPTGROUP"+data OPTION = OPTION+instance Show OPTION where show OPTION = "OPTION"+data P = P+instance Show P where show P = "P"+data PARAM = PARAM+instance Show PARAM where show PARAM = "PARAM"+data PRE = PRE+instance Show PRE where show PRE = "PRE"+data Q = Q+instance Show Q where show Q = "Q"+data S = S+instance Show S where show S = "S"+data SAMP = SAMP+instance Show SAMP where show SAMP = "SAMP"+data SCRIPT = SCRIPT+instance Show SCRIPT where show SCRIPT = "SCRIPT"+data SELECT = SELECT+instance Show SELECT where show SELECT = "SELECT"+data SMALL = SMALL+instance Show SMALL where show SMALL = "SMALL"+data SPAN = SPAN+instance Show SPAN where show SPAN = "SPAN"+data STRIKE = STRIKE+instance Show STRIKE where show STRIKE = "STRIKE"+data STRONG = STRONG+instance Show STRONG where show STRONG = "STRONG"+data STYLE = STYLE+instance Show STYLE where show STYLE = "STYLE"+data SUB = SUB+instance Show SUB where show SUB = "SUB"+data SUP = SUP+instance Show SUP where show SUP = "SUP"+data TABLE = TABLE+instance Show TABLE where show TABLE = "TABLE"+data TBODY = TBODY+instance Show TBODY where show TBODY = "TBODY"+data TD = TD+instance Show TD where show TD = "TD"+data TEXTAREA = TEXTAREA+instance Show TEXTAREA where show TEXTAREA = "TEXTAREA"+data TFOOT = TFOOT+instance Show TFOOT where show TFOOT = "TFOOT"+data TH = TH+instance Show TH where show TH = "TH"+data THEAD = THEAD+instance Show THEAD where show THEAD = "THEAD"+data TITLE = TITLE+instance Show TITLE where show TITLE = "TITLE"+data TR = TR+instance Show TR where show TR = "TR"+data TT = TT+instance Show TT where show TT = "TT"+data U = U+instance Show U where show U = "U"+data UL = UL+instance Show UL where show UL = "UL"+data VAR = VAR+instance Show VAR where show VAR = "VAR"++instance AdmitChildHEAD HTML+instance AdmitChildFRAMESET HTML++instance AdmitChildP NOSCRIPT+instance AdmitChildH1 NOSCRIPT+instance AdmitChildH2 NOSCRIPT+instance AdmitChildH3 NOSCRIPT+instance AdmitChildH4 NOSCRIPT+instance AdmitChildH5 NOSCRIPT+instance AdmitChildH6 NOSCRIPT+instance AdmitChildUL NOSCRIPT+instance AdmitChildOL NOSCRIPT+instance AdmitChildDIR NOSCRIPT+instance AdmitChildMENU NOSCRIPT+instance AdmitChildPRE NOSCRIPT+instance AdmitChildDL NOSCRIPT+instance AdmitChildDIV NOSCRIPT+instance AdmitChildCENTER NOSCRIPT+instance AdmitChildNOSCRIPT NOSCRIPT+instance AdmitChildNOFRAMES NOSCRIPT+instance AdmitChildBLOCKQUOTE NOSCRIPT+instance AdmitChildFORM NOSCRIPT+instance AdmitChildISINDEX NOSCRIPT+instance AdmitChildHR NOSCRIPT+instance AdmitChildTABLE NOSCRIPT+instance AdmitChildFIELDSET NOSCRIPT+instance AdmitChildADDRESS NOSCRIPT+instance AdmitChildCDATA NOSCRIPT+instance AdmitChildTT NOSCRIPT+instance AdmitChildI NOSCRIPT+instance AdmitChildB NOSCRIPT+instance AdmitChildU NOSCRIPT+instance AdmitChildS NOSCRIPT+instance AdmitChildSTRIKE NOSCRIPT+instance AdmitChildBIG NOSCRIPT+instance AdmitChildSMALL NOSCRIPT+instance AdmitChildEM NOSCRIPT+instance AdmitChildSTRONG NOSCRIPT+instance AdmitChildDFN NOSCRIPT+instance AdmitChildCODE NOSCRIPT+instance AdmitChildSAMP NOSCRIPT+instance AdmitChildKBD NOSCRIPT+instance AdmitChildVAR NOSCRIPT+instance AdmitChildCITE NOSCRIPT+instance AdmitChildABBR NOSCRIPT+instance AdmitChildACRONYM NOSCRIPT+instance AdmitChildA NOSCRIPT+instance AdmitChildIMG NOSCRIPT+instance AdmitChildAPPLET NOSCRIPT+instance AdmitChildOBJECT NOSCRIPT+instance AdmitChildFONT NOSCRIPT+instance AdmitChildBASEFONT NOSCRIPT+instance AdmitChildBR NOSCRIPT+instance AdmitChildSCRIPT NOSCRIPT+instance AdmitChildMAP NOSCRIPT+instance AdmitChildQ NOSCRIPT+instance AdmitChildSUB NOSCRIPT+instance AdmitChildSUP NOSCRIPT+instance AdmitChildSPAN NOSCRIPT+instance AdmitChildBDO NOSCRIPT+instance AdmitChildIFRAME NOSCRIPT+instance AdmitChildINPUT NOSCRIPT+instance AdmitChildSELECT NOSCRIPT+instance AdmitChildTEXTAREA NOSCRIPT+instance AdmitChildLABEL NOSCRIPT+instance AdmitChildBUTTON NOSCRIPT++instance AdmitChildCDATA SCRIPT++instance AdmitChildCDATA STYLE+++++instance AdmitChildCDATA TITLE++instance AdmitChildTITLE HEAD+instance AdmitChildISINDEX HEAD+instance AdmitChildBASE HEAD+instance AdmitChildSCRIPT HEAD+instance AdmitChildSTYLE HEAD+instance AdmitChildMETA HEAD+instance AdmitChildLINK HEAD+instance AdmitChildOBJECT HEAD++instance AdmitChildBODY NOFRAMES++instance AdmitChildP IFRAME+instance AdmitChildH1 IFRAME+instance AdmitChildH2 IFRAME+instance AdmitChildH3 IFRAME+instance AdmitChildH4 IFRAME+instance AdmitChildH5 IFRAME+instance AdmitChildH6 IFRAME+instance AdmitChildUL IFRAME+instance AdmitChildOL IFRAME+instance AdmitChildDIR IFRAME+instance AdmitChildMENU IFRAME+instance AdmitChildPRE IFRAME+instance AdmitChildDL IFRAME+instance AdmitChildDIV IFRAME+instance AdmitChildCENTER IFRAME+instance AdmitChildNOSCRIPT IFRAME+instance AdmitChildNOFRAMES IFRAME+instance AdmitChildBLOCKQUOTE IFRAME+instance AdmitChildFORM IFRAME+instance AdmitChildISINDEX IFRAME+instance AdmitChildHR IFRAME+instance AdmitChildTABLE IFRAME+instance AdmitChildFIELDSET IFRAME+instance AdmitChildADDRESS IFRAME+instance AdmitChildCDATA IFRAME+instance AdmitChildTT IFRAME+instance AdmitChildI IFRAME+instance AdmitChildB IFRAME+instance AdmitChildU IFRAME+instance AdmitChildS IFRAME+instance AdmitChildSTRIKE IFRAME+instance AdmitChildBIG IFRAME+instance AdmitChildSMALL IFRAME+instance AdmitChildEM IFRAME+instance AdmitChildSTRONG IFRAME+instance AdmitChildDFN IFRAME+instance AdmitChildCODE IFRAME+instance AdmitChildSAMP IFRAME+instance AdmitChildKBD IFRAME+instance AdmitChildVAR IFRAME+instance AdmitChildCITE IFRAME+instance AdmitChildABBR IFRAME+instance AdmitChildACRONYM IFRAME+instance AdmitChildA IFRAME+instance AdmitChildIMG IFRAME+instance AdmitChildAPPLET IFRAME+instance AdmitChildOBJECT IFRAME+instance AdmitChildFONT IFRAME+instance AdmitChildBASEFONT IFRAME+instance AdmitChildBR IFRAME+instance AdmitChildSCRIPT IFRAME+instance AdmitChildMAP IFRAME+instance AdmitChildQ IFRAME+instance AdmitChildSUB IFRAME+instance AdmitChildSUP IFRAME+instance AdmitChildSPAN IFRAME+instance AdmitChildBDO IFRAME+instance AdmitChildIFRAME IFRAME+instance AdmitChildINPUT IFRAME+instance AdmitChildSELECT IFRAME+instance AdmitChildTEXTAREA IFRAME+instance AdmitChildLABEL IFRAME+instance AdmitChildBUTTON IFRAME+++instance AdmitChildFRAMESET FRAMESET+instance AdmitChildFRAME FRAMESET+instance AdmitChildNOFRAMES FRAMESET++instance AdmitChildP TH+instance AdmitChildH1 TH+instance AdmitChildH2 TH+instance AdmitChildH3 TH+instance AdmitChildH4 TH+instance AdmitChildH5 TH+instance AdmitChildH6 TH+instance AdmitChildUL TH+instance AdmitChildOL TH+instance AdmitChildDIR TH+instance AdmitChildMENU TH+instance AdmitChildPRE TH+instance AdmitChildDL TH+instance AdmitChildDIV TH+instance AdmitChildCENTER TH+instance AdmitChildNOSCRIPT TH+instance AdmitChildNOFRAMES TH+instance AdmitChildBLOCKQUOTE TH+instance AdmitChildFORM TH+instance AdmitChildISINDEX TH+instance AdmitChildHR TH+instance AdmitChildTABLE TH+instance AdmitChildFIELDSET TH+instance AdmitChildADDRESS TH+instance AdmitChildCDATA TH+instance AdmitChildTT TH+instance AdmitChildI TH+instance AdmitChildB TH+instance AdmitChildU TH+instance AdmitChildS TH+instance AdmitChildSTRIKE TH+instance AdmitChildBIG TH+instance AdmitChildSMALL TH+instance AdmitChildEM TH+instance AdmitChildSTRONG TH+instance AdmitChildDFN TH+instance AdmitChildCODE TH+instance AdmitChildSAMP TH+instance AdmitChildKBD TH+instance AdmitChildVAR TH+instance AdmitChildCITE TH+instance AdmitChildABBR TH+instance AdmitChildACRONYM TH+instance AdmitChildA TH+instance AdmitChildIMG TH+instance AdmitChildAPPLET TH+instance AdmitChildOBJECT TH+instance AdmitChildFONT TH+instance AdmitChildBASEFONT TH+instance AdmitChildBR TH+instance AdmitChildSCRIPT TH+instance AdmitChildMAP TH+instance AdmitChildQ TH+instance AdmitChildSUB TH+instance AdmitChildSUP TH+instance AdmitChildSPAN TH+instance AdmitChildBDO TH+instance AdmitChildIFRAME TH+instance AdmitChildINPUT TH+instance AdmitChildSELECT TH+instance AdmitChildTEXTAREA TH+instance AdmitChildLABEL TH+instance AdmitChildBUTTON TH++instance AdmitChildP TD+instance AdmitChildH1 TD+instance AdmitChildH2 TD+instance AdmitChildH3 TD+instance AdmitChildH4 TD+instance AdmitChildH5 TD+instance AdmitChildH6 TD+instance AdmitChildUL TD+instance AdmitChildOL TD+instance AdmitChildDIR TD+instance AdmitChildMENU TD+instance AdmitChildPRE TD+instance AdmitChildDL TD+instance AdmitChildDIV TD+instance AdmitChildCENTER TD+instance AdmitChildNOSCRIPT TD+instance AdmitChildNOFRAMES TD+instance AdmitChildBLOCKQUOTE TD+instance AdmitChildFORM TD+instance AdmitChildISINDEX TD+instance AdmitChildHR TD+instance AdmitChildTABLE TD+instance AdmitChildFIELDSET TD+instance AdmitChildADDRESS TD+instance AdmitChildCDATA TD+instance AdmitChildTT TD+instance AdmitChildI TD+instance AdmitChildB TD+instance AdmitChildU TD+instance AdmitChildS TD+instance AdmitChildSTRIKE TD+instance AdmitChildBIG TD+instance AdmitChildSMALL TD+instance AdmitChildEM TD+instance AdmitChildSTRONG TD+instance AdmitChildDFN TD+instance AdmitChildCODE TD+instance AdmitChildSAMP TD+instance AdmitChildKBD TD+instance AdmitChildVAR TD+instance AdmitChildCITE TD+instance AdmitChildABBR TD+instance AdmitChildACRONYM TD+instance AdmitChildA TD+instance AdmitChildIMG TD+instance AdmitChildAPPLET TD+instance AdmitChildOBJECT TD+instance AdmitChildFONT TD+instance AdmitChildBASEFONT TD+instance AdmitChildBR TD+instance AdmitChildSCRIPT TD+instance AdmitChildMAP TD+instance AdmitChildQ TD+instance AdmitChildSUB TD+instance AdmitChildSUP TD+instance AdmitChildSPAN TD+instance AdmitChildBDO TD+instance AdmitChildIFRAME TD+instance AdmitChildINPUT TD+instance AdmitChildSELECT TD+instance AdmitChildTEXTAREA TD+instance AdmitChildLABEL TD+instance AdmitChildBUTTON TD++instance AdmitChildTH TR+instance AdmitChildTD TR+++instance AdmitChildCOL COLGROUP++instance AdmitChildTR TBODY++instance AdmitChildTR TFOOT++instance AdmitChildTR THEAD++instance AdmitChildCDATA CAPTION+instance AdmitChildTT CAPTION+instance AdmitChildI CAPTION+instance AdmitChildB CAPTION+instance AdmitChildU CAPTION+instance AdmitChildS CAPTION+instance AdmitChildSTRIKE CAPTION+instance AdmitChildBIG CAPTION+instance AdmitChildSMALL CAPTION+instance AdmitChildEM CAPTION+instance AdmitChildSTRONG CAPTION+instance AdmitChildDFN CAPTION+instance AdmitChildCODE CAPTION+instance AdmitChildSAMP CAPTION+instance AdmitChildKBD CAPTION+instance AdmitChildVAR CAPTION+instance AdmitChildCITE CAPTION+instance AdmitChildABBR CAPTION+instance AdmitChildACRONYM CAPTION+instance AdmitChildA CAPTION+instance AdmitChildIMG CAPTION+instance AdmitChildAPPLET CAPTION+instance AdmitChildOBJECT CAPTION+instance AdmitChildFONT CAPTION+instance AdmitChildBASEFONT CAPTION+instance AdmitChildBR CAPTION+instance AdmitChildSCRIPT CAPTION+instance AdmitChildMAP CAPTION+instance AdmitChildQ CAPTION+instance AdmitChildSUB CAPTION+instance AdmitChildSUP CAPTION+instance AdmitChildSPAN CAPTION+instance AdmitChildBDO CAPTION+instance AdmitChildIFRAME CAPTION+instance AdmitChildINPUT CAPTION+instance AdmitChildSELECT CAPTION+instance AdmitChildTEXTAREA CAPTION+instance AdmitChildLABEL CAPTION+instance AdmitChildBUTTON CAPTION++instance AdmitChildCAPTION TABLE+instance AdmitChildCOL TABLE+instance AdmitChildCOLGROUP TABLE+instance AdmitChildTHEAD TABLE+instance AdmitChildTFOOT TABLE+instance AdmitChildTBODY TABLE++instance AdmitChildP BUTTON+instance AdmitChildH1 BUTTON+instance AdmitChildH2 BUTTON+instance AdmitChildH3 BUTTON+instance AdmitChildH4 BUTTON+instance AdmitChildH5 BUTTON+instance AdmitChildH6 BUTTON+instance AdmitChildUL BUTTON+instance AdmitChildOL BUTTON+instance AdmitChildDIR BUTTON+instance AdmitChildMENU BUTTON+instance AdmitChildPRE BUTTON+instance AdmitChildDL BUTTON+instance AdmitChildDIV BUTTON+instance AdmitChildCENTER BUTTON+instance AdmitChildNOSCRIPT BUTTON+instance AdmitChildNOFRAMES BUTTON+instance AdmitChildBLOCKQUOTE BUTTON+instance AdmitChildHR BUTTON+instance AdmitChildTABLE BUTTON+instance AdmitChildADDRESS BUTTON+instance AdmitChildCDATA BUTTON+instance AdmitChildTT BUTTON+instance AdmitChildI BUTTON+instance AdmitChildB BUTTON+instance AdmitChildU BUTTON+instance AdmitChildS BUTTON+instance AdmitChildSTRIKE BUTTON+instance AdmitChildBIG BUTTON+instance AdmitChildSMALL BUTTON+instance AdmitChildEM BUTTON+instance AdmitChildSTRONG BUTTON+instance AdmitChildDFN BUTTON+instance AdmitChildCODE BUTTON+instance AdmitChildSAMP BUTTON+instance AdmitChildKBD BUTTON+instance AdmitChildVAR BUTTON+instance AdmitChildCITE BUTTON+instance AdmitChildABBR BUTTON+instance AdmitChildACRONYM BUTTON+instance AdmitChildIMG BUTTON+instance AdmitChildAPPLET BUTTON+instance AdmitChildOBJECT BUTTON+instance AdmitChildFONT BUTTON+instance AdmitChildBASEFONT BUTTON+instance AdmitChildBR BUTTON+instance AdmitChildSCRIPT BUTTON+instance AdmitChildMAP BUTTON+instance AdmitChildQ BUTTON+instance AdmitChildSUB BUTTON+instance AdmitChildSUP BUTTON+instance AdmitChildSPAN BUTTON+instance AdmitChildBDO BUTTON++instance AdmitChildCDATA LEGEND+instance AdmitChildTT LEGEND+instance AdmitChildI LEGEND+instance AdmitChildB LEGEND+instance AdmitChildU LEGEND+instance AdmitChildS LEGEND+instance AdmitChildSTRIKE LEGEND+instance AdmitChildBIG LEGEND+instance AdmitChildSMALL LEGEND+instance AdmitChildEM LEGEND+instance AdmitChildSTRONG LEGEND+instance AdmitChildDFN LEGEND+instance AdmitChildCODE LEGEND+instance AdmitChildSAMP LEGEND+instance AdmitChildKBD LEGEND+instance AdmitChildVAR LEGEND+instance AdmitChildCITE LEGEND+instance AdmitChildABBR LEGEND+instance AdmitChildACRONYM LEGEND+instance AdmitChildA LEGEND+instance AdmitChildIMG LEGEND+instance AdmitChildAPPLET LEGEND+instance AdmitChildOBJECT LEGEND+instance AdmitChildFONT LEGEND+instance AdmitChildBASEFONT LEGEND+instance AdmitChildBR LEGEND+instance AdmitChildSCRIPT LEGEND+instance AdmitChildMAP LEGEND+instance AdmitChildQ LEGEND+instance AdmitChildSUB LEGEND+instance AdmitChildSUP LEGEND+instance AdmitChildSPAN LEGEND+instance AdmitChildBDO LEGEND+instance AdmitChildIFRAME LEGEND+instance AdmitChildINPUT LEGEND+instance AdmitChildSELECT LEGEND+instance AdmitChildTEXTAREA LEGEND+instance AdmitChildLABEL LEGEND+instance AdmitChildBUTTON LEGEND++instance AdmitChildCDATA FIELDSET+instance AdmitChildLEGEND FIELDSET+instance AdmitChildP FIELDSET+instance AdmitChildH1 FIELDSET+instance AdmitChildH2 FIELDSET+instance AdmitChildH3 FIELDSET+instance AdmitChildH4 FIELDSET+instance AdmitChildH5 FIELDSET+instance AdmitChildH6 FIELDSET+instance AdmitChildUL FIELDSET+instance AdmitChildOL FIELDSET+instance AdmitChildDIR FIELDSET+instance AdmitChildMENU FIELDSET+instance AdmitChildPRE FIELDSET+instance AdmitChildDL FIELDSET+instance AdmitChildDIV FIELDSET+instance AdmitChildCENTER FIELDSET+instance AdmitChildNOSCRIPT FIELDSET+instance AdmitChildNOFRAMES FIELDSET+instance AdmitChildBLOCKQUOTE FIELDSET+instance AdmitChildFORM FIELDSET+instance AdmitChildISINDEX FIELDSET+instance AdmitChildHR FIELDSET+instance AdmitChildTABLE FIELDSET+instance AdmitChildFIELDSET FIELDSET+instance AdmitChildADDRESS FIELDSET+instance AdmitChildTT FIELDSET+instance AdmitChildI FIELDSET+instance AdmitChildB FIELDSET+instance AdmitChildU FIELDSET+instance AdmitChildS FIELDSET+instance AdmitChildSTRIKE FIELDSET+instance AdmitChildBIG FIELDSET+instance AdmitChildSMALL FIELDSET+instance AdmitChildEM FIELDSET+instance AdmitChildSTRONG FIELDSET+instance AdmitChildDFN FIELDSET+instance AdmitChildCODE FIELDSET+instance AdmitChildSAMP FIELDSET+instance AdmitChildKBD FIELDSET+instance AdmitChildVAR FIELDSET+instance AdmitChildCITE FIELDSET+instance AdmitChildABBR FIELDSET+instance AdmitChildACRONYM FIELDSET+instance AdmitChildA FIELDSET+instance AdmitChildIMG FIELDSET+instance AdmitChildAPPLET FIELDSET+instance AdmitChildOBJECT FIELDSET+instance AdmitChildFONT FIELDSET+instance AdmitChildBASEFONT FIELDSET+instance AdmitChildBR FIELDSET+instance AdmitChildSCRIPT FIELDSET+instance AdmitChildMAP FIELDSET+instance AdmitChildQ FIELDSET+instance AdmitChildSUB FIELDSET+instance AdmitChildSUP FIELDSET+instance AdmitChildSPAN FIELDSET+instance AdmitChildBDO FIELDSET+instance AdmitChildIFRAME FIELDSET+instance AdmitChildINPUT FIELDSET+instance AdmitChildSELECT FIELDSET+instance AdmitChildTEXTAREA FIELDSET+instance AdmitChildLABEL FIELDSET+instance AdmitChildBUTTON FIELDSET++instance AdmitChildCDATA TEXTAREA++instance AdmitChildCDATA OPTION++instance AdmitChildOPTION OPTGROUP++instance AdmitChildOPTGROUP SELECT+instance AdmitChildOPTION SELECT+++instance AdmitChildCDATA LABEL+instance AdmitChildTT LABEL+instance AdmitChildI LABEL+instance AdmitChildB LABEL+instance AdmitChildU LABEL+instance AdmitChildS LABEL+instance AdmitChildSTRIKE LABEL+instance AdmitChildBIG LABEL+instance AdmitChildSMALL LABEL+instance AdmitChildEM LABEL+instance AdmitChildSTRONG LABEL+instance AdmitChildDFN LABEL+instance AdmitChildCODE LABEL+instance AdmitChildSAMP LABEL+instance AdmitChildKBD LABEL+instance AdmitChildVAR LABEL+instance AdmitChildCITE LABEL+instance AdmitChildABBR LABEL+instance AdmitChildACRONYM LABEL+instance AdmitChildA LABEL+instance AdmitChildIMG LABEL+instance AdmitChildAPPLET LABEL+instance AdmitChildOBJECT LABEL+instance AdmitChildFONT LABEL+instance AdmitChildBASEFONT LABEL+instance AdmitChildBR LABEL+instance AdmitChildSCRIPT LABEL+instance AdmitChildMAP LABEL+instance AdmitChildQ LABEL+instance AdmitChildSUB LABEL+instance AdmitChildSUP LABEL+instance AdmitChildSPAN LABEL+instance AdmitChildBDO LABEL+instance AdmitChildIFRAME LABEL+instance AdmitChildINPUT LABEL+instance AdmitChildSELECT LABEL+instance AdmitChildTEXTAREA LABEL+instance AdmitChildBUTTON LABEL++instance AdmitChildP FORM+instance AdmitChildH1 FORM+instance AdmitChildH2 FORM+instance AdmitChildH3 FORM+instance AdmitChildH4 FORM+instance AdmitChildH5 FORM+instance AdmitChildH6 FORM+instance AdmitChildUL FORM+instance AdmitChildOL FORM+instance AdmitChildDIR FORM+instance AdmitChildMENU FORM+instance AdmitChildPRE FORM+instance AdmitChildDL FORM+instance AdmitChildDIV FORM+instance AdmitChildCENTER FORM+instance AdmitChildNOSCRIPT FORM+instance AdmitChildNOFRAMES FORM+instance AdmitChildBLOCKQUOTE FORM+instance AdmitChildISINDEX FORM+instance AdmitChildHR FORM+instance AdmitChildTABLE FORM+instance AdmitChildFIELDSET FORM+instance AdmitChildADDRESS FORM+instance AdmitChildCDATA FORM+instance AdmitChildTT FORM+instance AdmitChildI FORM+instance AdmitChildB FORM+instance AdmitChildU FORM+instance AdmitChildS FORM+instance AdmitChildSTRIKE FORM+instance AdmitChildBIG FORM+instance AdmitChildSMALL FORM+instance AdmitChildEM FORM+instance AdmitChildSTRONG FORM+instance AdmitChildDFN FORM+instance AdmitChildCODE FORM+instance AdmitChildSAMP FORM+instance AdmitChildKBD FORM+instance AdmitChildVAR FORM+instance AdmitChildCITE FORM+instance AdmitChildABBR FORM+instance AdmitChildACRONYM FORM+instance AdmitChildA FORM+instance AdmitChildIMG FORM+instance AdmitChildAPPLET FORM+instance AdmitChildOBJECT FORM+instance AdmitChildFONT FORM+instance AdmitChildBASEFONT FORM+instance AdmitChildBR FORM+instance AdmitChildSCRIPT FORM+instance AdmitChildMAP FORM+instance AdmitChildQ FORM+instance AdmitChildSUB FORM+instance AdmitChildSUP FORM+instance AdmitChildSPAN FORM+instance AdmitChildBDO FORM+instance AdmitChildIFRAME FORM+instance AdmitChildINPUT FORM+instance AdmitChildSELECT FORM+instance AdmitChildTEXTAREA FORM+instance AdmitChildLABEL FORM+instance AdmitChildBUTTON FORM++instance AdmitChildP LI+instance AdmitChildH1 LI+instance AdmitChildH2 LI+instance AdmitChildH3 LI+instance AdmitChildH4 LI+instance AdmitChildH5 LI+instance AdmitChildH6 LI+instance AdmitChildUL LI+instance AdmitChildOL LI+instance AdmitChildDIR LI+instance AdmitChildMENU LI+instance AdmitChildPRE LI+instance AdmitChildDL LI+instance AdmitChildDIV LI+instance AdmitChildCENTER LI+instance AdmitChildNOSCRIPT LI+instance AdmitChildNOFRAMES LI+instance AdmitChildBLOCKQUOTE LI+instance AdmitChildFORM LI+instance AdmitChildISINDEX LI+instance AdmitChildHR LI+instance AdmitChildTABLE LI+instance AdmitChildFIELDSET LI+instance AdmitChildADDRESS LI+instance AdmitChildCDATA LI+instance AdmitChildTT LI+instance AdmitChildI LI+instance AdmitChildB LI+instance AdmitChildU LI+instance AdmitChildS LI+instance AdmitChildSTRIKE LI+instance AdmitChildBIG LI+instance AdmitChildSMALL LI+instance AdmitChildEM LI+instance AdmitChildSTRONG LI+instance AdmitChildDFN LI+instance AdmitChildCODE LI+instance AdmitChildSAMP LI+instance AdmitChildKBD LI+instance AdmitChildVAR LI+instance AdmitChildCITE LI+instance AdmitChildABBR LI+instance AdmitChildACRONYM LI+instance AdmitChildA LI+instance AdmitChildIMG LI+instance AdmitChildAPPLET LI+instance AdmitChildOBJECT LI+instance AdmitChildFONT LI+instance AdmitChildBASEFONT LI+instance AdmitChildBR LI+instance AdmitChildSCRIPT LI+instance AdmitChildMAP LI+instance AdmitChildQ LI+instance AdmitChildSUB LI+instance AdmitChildSUP LI+instance AdmitChildSPAN LI+instance AdmitChildBDO LI+instance AdmitChildIFRAME LI+instance AdmitChildINPUT LI+instance AdmitChildSELECT LI+instance AdmitChildTEXTAREA LI+instance AdmitChildLABEL LI+instance AdmitChildBUTTON LI++instance AdmitChildLI DIR++instance AdmitChildLI MENU++instance AdmitChildLI UL++instance AdmitChildLI OL++instance AdmitChildP DD+instance AdmitChildH1 DD+instance AdmitChildH2 DD+instance AdmitChildH3 DD+instance AdmitChildH4 DD+instance AdmitChildH5 DD+instance AdmitChildH6 DD+instance AdmitChildUL DD+instance AdmitChildOL DD+instance AdmitChildDIR DD+instance AdmitChildMENU DD+instance AdmitChildPRE DD+instance AdmitChildDL DD+instance AdmitChildDIV DD+instance AdmitChildCENTER DD+instance AdmitChildNOSCRIPT DD+instance AdmitChildNOFRAMES DD+instance AdmitChildBLOCKQUOTE DD+instance AdmitChildFORM DD+instance AdmitChildISINDEX DD+instance AdmitChildHR DD+instance AdmitChildTABLE DD+instance AdmitChildFIELDSET DD+instance AdmitChildADDRESS DD+instance AdmitChildCDATA DD+instance AdmitChildTT DD+instance AdmitChildI DD+instance AdmitChildB DD+instance AdmitChildU DD+instance AdmitChildS DD+instance AdmitChildSTRIKE DD+instance AdmitChildBIG DD+instance AdmitChildSMALL DD+instance AdmitChildEM DD+instance AdmitChildSTRONG DD+instance AdmitChildDFN DD+instance AdmitChildCODE DD+instance AdmitChildSAMP DD+instance AdmitChildKBD DD+instance AdmitChildVAR DD+instance AdmitChildCITE DD+instance AdmitChildABBR DD+instance AdmitChildACRONYM DD+instance AdmitChildA DD+instance AdmitChildIMG DD+instance AdmitChildAPPLET DD+instance AdmitChildOBJECT DD+instance AdmitChildFONT DD+instance AdmitChildBASEFONT DD+instance AdmitChildBR DD+instance AdmitChildSCRIPT DD+instance AdmitChildMAP DD+instance AdmitChildQ DD+instance AdmitChildSUB DD+instance AdmitChildSUP DD+instance AdmitChildSPAN DD+instance AdmitChildBDO DD+instance AdmitChildIFRAME DD+instance AdmitChildINPUT DD+instance AdmitChildSELECT DD+instance AdmitChildTEXTAREA DD+instance AdmitChildLABEL DD+instance AdmitChildBUTTON DD++instance AdmitChildCDATA DT+instance AdmitChildTT DT+instance AdmitChildI DT+instance AdmitChildB DT+instance AdmitChildU DT+instance AdmitChildS DT+instance AdmitChildSTRIKE DT+instance AdmitChildBIG DT+instance AdmitChildSMALL DT+instance AdmitChildEM DT+instance AdmitChildSTRONG DT+instance AdmitChildDFN DT+instance AdmitChildCODE DT+instance AdmitChildSAMP DT+instance AdmitChildKBD DT+instance AdmitChildVAR DT+instance AdmitChildCITE DT+instance AdmitChildABBR DT+instance AdmitChildACRONYM DT+instance AdmitChildA DT+instance AdmitChildIMG DT+instance AdmitChildAPPLET DT+instance AdmitChildOBJECT DT+instance AdmitChildFONT DT+instance AdmitChildBASEFONT DT+instance AdmitChildBR DT+instance AdmitChildSCRIPT DT+instance AdmitChildMAP DT+instance AdmitChildQ DT+instance AdmitChildSUB DT+instance AdmitChildSUP DT+instance AdmitChildSPAN DT+instance AdmitChildBDO DT+instance AdmitChildIFRAME DT+instance AdmitChildINPUT DT+instance AdmitChildSELECT DT+instance AdmitChildTEXTAREA DT+instance AdmitChildLABEL DT+instance AdmitChildBUTTON DT++instance AdmitChildDT DL+instance AdmitChildDD DL++instance AdmitChildP INS+instance AdmitChildH1 INS+instance AdmitChildH2 INS+instance AdmitChildH3 INS+instance AdmitChildH4 INS+instance AdmitChildH5 INS+instance AdmitChildH6 INS+instance AdmitChildUL INS+instance AdmitChildOL INS+instance AdmitChildDIR INS+instance AdmitChildMENU INS+instance AdmitChildPRE INS+instance AdmitChildDL INS+instance AdmitChildDIV INS+instance AdmitChildCENTER INS+instance AdmitChildNOSCRIPT INS+instance AdmitChildNOFRAMES INS+instance AdmitChildBLOCKQUOTE INS+instance AdmitChildFORM INS+instance AdmitChildISINDEX INS+instance AdmitChildHR INS+instance AdmitChildTABLE INS+instance AdmitChildFIELDSET INS+instance AdmitChildADDRESS INS+instance AdmitChildCDATA INS+instance AdmitChildTT INS+instance AdmitChildI INS+instance AdmitChildB INS+instance AdmitChildU INS+instance AdmitChildS INS+instance AdmitChildSTRIKE INS+instance AdmitChildBIG INS+instance AdmitChildSMALL INS+instance AdmitChildEM INS+instance AdmitChildSTRONG INS+instance AdmitChildDFN INS+instance AdmitChildCODE INS+instance AdmitChildSAMP INS+instance AdmitChildKBD INS+instance AdmitChildVAR INS+instance AdmitChildCITE INS+instance AdmitChildABBR INS+instance AdmitChildACRONYM INS+instance AdmitChildA INS+instance AdmitChildIMG INS+instance AdmitChildAPPLET INS+instance AdmitChildOBJECT INS+instance AdmitChildFONT INS+instance AdmitChildBASEFONT INS+instance AdmitChildBR INS+instance AdmitChildSCRIPT INS+instance AdmitChildMAP INS+instance AdmitChildQ INS+instance AdmitChildSUB INS+instance AdmitChildSUP INS+instance AdmitChildSPAN INS+instance AdmitChildBDO INS+instance AdmitChildIFRAME INS+instance AdmitChildINPUT INS+instance AdmitChildSELECT INS+instance AdmitChildTEXTAREA INS+instance AdmitChildLABEL INS+instance AdmitChildBUTTON INS++instance AdmitChildP DEL+instance AdmitChildH1 DEL+instance AdmitChildH2 DEL+instance AdmitChildH3 DEL+instance AdmitChildH4 DEL+instance AdmitChildH5 DEL+instance AdmitChildH6 DEL+instance AdmitChildUL DEL+instance AdmitChildOL DEL+instance AdmitChildDIR DEL+instance AdmitChildMENU DEL+instance AdmitChildPRE DEL+instance AdmitChildDL DEL+instance AdmitChildDIV DEL+instance AdmitChildCENTER DEL+instance AdmitChildNOSCRIPT DEL+instance AdmitChildNOFRAMES DEL+instance AdmitChildBLOCKQUOTE DEL+instance AdmitChildFORM DEL+instance AdmitChildISINDEX DEL+instance AdmitChildHR DEL+instance AdmitChildTABLE DEL+instance AdmitChildFIELDSET DEL+instance AdmitChildADDRESS DEL+instance AdmitChildCDATA DEL+instance AdmitChildTT DEL+instance AdmitChildI DEL+instance AdmitChildB DEL+instance AdmitChildU DEL+instance AdmitChildS DEL+instance AdmitChildSTRIKE DEL+instance AdmitChildBIG DEL+instance AdmitChildSMALL DEL+instance AdmitChildEM DEL+instance AdmitChildSTRONG DEL+instance AdmitChildDFN DEL+instance AdmitChildCODE DEL+instance AdmitChildSAMP DEL+instance AdmitChildKBD DEL+instance AdmitChildVAR DEL+instance AdmitChildCITE DEL+instance AdmitChildABBR DEL+instance AdmitChildACRONYM DEL+instance AdmitChildA DEL+instance AdmitChildIMG DEL+instance AdmitChildAPPLET DEL+instance AdmitChildOBJECT DEL+instance AdmitChildFONT DEL+instance AdmitChildBASEFONT DEL+instance AdmitChildBR DEL+instance AdmitChildSCRIPT DEL+instance AdmitChildMAP DEL+instance AdmitChildQ DEL+instance AdmitChildSUB DEL+instance AdmitChildSUP DEL+instance AdmitChildSPAN DEL+instance AdmitChildBDO DEL+instance AdmitChildIFRAME DEL+instance AdmitChildINPUT DEL+instance AdmitChildSELECT DEL+instance AdmitChildTEXTAREA DEL+instance AdmitChildLABEL DEL+instance AdmitChildBUTTON DEL++instance AdmitChildP BLOCKQUOTE+instance AdmitChildH1 BLOCKQUOTE+instance AdmitChildH2 BLOCKQUOTE+instance AdmitChildH3 BLOCKQUOTE+instance AdmitChildH4 BLOCKQUOTE+instance AdmitChildH5 BLOCKQUOTE+instance AdmitChildH6 BLOCKQUOTE+instance AdmitChildUL BLOCKQUOTE+instance AdmitChildOL BLOCKQUOTE+instance AdmitChildDIR BLOCKQUOTE+instance AdmitChildMENU BLOCKQUOTE+instance AdmitChildPRE BLOCKQUOTE+instance AdmitChildDL BLOCKQUOTE+instance AdmitChildDIV BLOCKQUOTE+instance AdmitChildCENTER BLOCKQUOTE+instance AdmitChildNOSCRIPT BLOCKQUOTE+instance AdmitChildNOFRAMES BLOCKQUOTE+instance AdmitChildBLOCKQUOTE BLOCKQUOTE+instance AdmitChildFORM BLOCKQUOTE+instance AdmitChildISINDEX BLOCKQUOTE+instance AdmitChildHR BLOCKQUOTE+instance AdmitChildTABLE BLOCKQUOTE+instance AdmitChildFIELDSET BLOCKQUOTE+instance AdmitChildADDRESS BLOCKQUOTE+instance AdmitChildCDATA BLOCKQUOTE+instance AdmitChildTT BLOCKQUOTE+instance AdmitChildI BLOCKQUOTE+instance AdmitChildB BLOCKQUOTE+instance AdmitChildU BLOCKQUOTE+instance AdmitChildS BLOCKQUOTE+instance AdmitChildSTRIKE BLOCKQUOTE+instance AdmitChildBIG BLOCKQUOTE+instance AdmitChildSMALL BLOCKQUOTE+instance AdmitChildEM BLOCKQUOTE+instance AdmitChildSTRONG BLOCKQUOTE+instance AdmitChildDFN BLOCKQUOTE+instance AdmitChildCODE BLOCKQUOTE+instance AdmitChildSAMP BLOCKQUOTE+instance AdmitChildKBD BLOCKQUOTE+instance AdmitChildVAR BLOCKQUOTE+instance AdmitChildCITE BLOCKQUOTE+instance AdmitChildABBR BLOCKQUOTE+instance AdmitChildACRONYM BLOCKQUOTE+instance AdmitChildA BLOCKQUOTE+instance AdmitChildIMG BLOCKQUOTE+instance AdmitChildAPPLET BLOCKQUOTE+instance AdmitChildOBJECT BLOCKQUOTE+instance AdmitChildFONT BLOCKQUOTE+instance AdmitChildBASEFONT BLOCKQUOTE+instance AdmitChildBR BLOCKQUOTE+instance AdmitChildSCRIPT BLOCKQUOTE+instance AdmitChildMAP BLOCKQUOTE+instance AdmitChildQ BLOCKQUOTE+instance AdmitChildSUB BLOCKQUOTE+instance AdmitChildSUP BLOCKQUOTE+instance AdmitChildSPAN BLOCKQUOTE+instance AdmitChildBDO BLOCKQUOTE+instance AdmitChildIFRAME BLOCKQUOTE+instance AdmitChildINPUT BLOCKQUOTE+instance AdmitChildSELECT BLOCKQUOTE+instance AdmitChildTEXTAREA BLOCKQUOTE+instance AdmitChildLABEL BLOCKQUOTE+instance AdmitChildBUTTON BLOCKQUOTE++instance AdmitChildCDATA Q+instance AdmitChildTT Q+instance AdmitChildI Q+instance AdmitChildB Q+instance AdmitChildU Q+instance AdmitChildS Q+instance AdmitChildSTRIKE Q+instance AdmitChildBIG Q+instance AdmitChildSMALL Q+instance AdmitChildEM Q+instance AdmitChildSTRONG Q+instance AdmitChildDFN Q+instance AdmitChildCODE Q+instance AdmitChildSAMP Q+instance AdmitChildKBD Q+instance AdmitChildVAR Q+instance AdmitChildCITE Q+instance AdmitChildABBR Q+instance AdmitChildACRONYM Q+instance AdmitChildA Q+instance AdmitChildIMG Q+instance AdmitChildAPPLET Q+instance AdmitChildOBJECT Q+instance AdmitChildFONT Q+instance AdmitChildBASEFONT Q+instance AdmitChildBR Q+instance AdmitChildSCRIPT Q+instance AdmitChildMAP Q+instance AdmitChildQ Q+instance AdmitChildSUB Q+instance AdmitChildSUP Q+instance AdmitChildSPAN Q+instance AdmitChildBDO Q+instance AdmitChildIFRAME Q+instance AdmitChildINPUT Q+instance AdmitChildSELECT Q+instance AdmitChildTEXTAREA Q+instance AdmitChildLABEL Q+instance AdmitChildBUTTON Q++instance AdmitChildCDATA PRE+instance AdmitChildTT PRE+instance AdmitChildI PRE+instance AdmitChildB PRE+instance AdmitChildU PRE+instance AdmitChildS PRE+instance AdmitChildSTRIKE PRE+instance AdmitChildEM PRE+instance AdmitChildSTRONG PRE+instance AdmitChildDFN PRE+instance AdmitChildCODE PRE+instance AdmitChildSAMP PRE+instance AdmitChildKBD PRE+instance AdmitChildVAR PRE+instance AdmitChildCITE PRE+instance AdmitChildABBR PRE+instance AdmitChildACRONYM PRE+instance AdmitChildA PRE+instance AdmitChildBR PRE+instance AdmitChildSCRIPT PRE+instance AdmitChildMAP PRE+instance AdmitChildQ PRE+instance AdmitChildSPAN PRE+instance AdmitChildBDO PRE+instance AdmitChildIFRAME PRE+instance AdmitChildINPUT PRE+instance AdmitChildSELECT PRE+instance AdmitChildTEXTAREA PRE+instance AdmitChildLABEL PRE+instance AdmitChildBUTTON PRE++instance AdmitChildCDATA H1+instance AdmitChildTT H1+instance AdmitChildI H1+instance AdmitChildB H1+instance AdmitChildU H1+instance AdmitChildS H1+instance AdmitChildSTRIKE H1+instance AdmitChildBIG H1+instance AdmitChildSMALL H1+instance AdmitChildEM H1+instance AdmitChildSTRONG H1+instance AdmitChildDFN H1+instance AdmitChildCODE H1+instance AdmitChildSAMP H1+instance AdmitChildKBD H1+instance AdmitChildVAR H1+instance AdmitChildCITE H1+instance AdmitChildABBR H1+instance AdmitChildACRONYM H1+instance AdmitChildA H1+instance AdmitChildIMG H1+instance AdmitChildAPPLET H1+instance AdmitChildOBJECT H1+instance AdmitChildFONT H1+instance AdmitChildBASEFONT H1+instance AdmitChildBR H1+instance AdmitChildSCRIPT H1+instance AdmitChildMAP H1+instance AdmitChildQ H1+instance AdmitChildSUB H1+instance AdmitChildSUP H1+instance AdmitChildSPAN H1+instance AdmitChildBDO H1+instance AdmitChildIFRAME H1+instance AdmitChildINPUT H1+instance AdmitChildSELECT H1+instance AdmitChildTEXTAREA H1+instance AdmitChildLABEL H1+instance AdmitChildBUTTON H1++instance AdmitChildCDATA H2+instance AdmitChildTT H2+instance AdmitChildI H2+instance AdmitChildB H2+instance AdmitChildU H2+instance AdmitChildS H2+instance AdmitChildSTRIKE H2+instance AdmitChildBIG H2+instance AdmitChildSMALL H2+instance AdmitChildEM H2+instance AdmitChildSTRONG H2+instance AdmitChildDFN H2+instance AdmitChildCODE H2+instance AdmitChildSAMP H2+instance AdmitChildKBD H2+instance AdmitChildVAR H2+instance AdmitChildCITE H2+instance AdmitChildABBR H2+instance AdmitChildACRONYM H2+instance AdmitChildA H2+instance AdmitChildIMG H2+instance AdmitChildAPPLET H2+instance AdmitChildOBJECT H2+instance AdmitChildFONT H2+instance AdmitChildBASEFONT H2+instance AdmitChildBR H2+instance AdmitChildSCRIPT H2+instance AdmitChildMAP H2+instance AdmitChildQ H2+instance AdmitChildSUB H2+instance AdmitChildSUP H2+instance AdmitChildSPAN H2+instance AdmitChildBDO H2+instance AdmitChildIFRAME H2+instance AdmitChildINPUT H2+instance AdmitChildSELECT H2+instance AdmitChildTEXTAREA H2+instance AdmitChildLABEL H2+instance AdmitChildBUTTON H2++instance AdmitChildCDATA H3+instance AdmitChildTT H3+instance AdmitChildI H3+instance AdmitChildB H3+instance AdmitChildU H3+instance AdmitChildS H3+instance AdmitChildSTRIKE H3+instance AdmitChildBIG H3+instance AdmitChildSMALL H3+instance AdmitChildEM H3+instance AdmitChildSTRONG H3+instance AdmitChildDFN H3+instance AdmitChildCODE H3+instance AdmitChildSAMP H3+instance AdmitChildKBD H3+instance AdmitChildVAR H3+instance AdmitChildCITE H3+instance AdmitChildABBR H3+instance AdmitChildACRONYM H3+instance AdmitChildA H3+instance AdmitChildIMG H3+instance AdmitChildAPPLET H3+instance AdmitChildOBJECT H3+instance AdmitChildFONT H3+instance AdmitChildBASEFONT H3+instance AdmitChildBR H3+instance AdmitChildSCRIPT H3+instance AdmitChildMAP H3+instance AdmitChildQ H3+instance AdmitChildSUB H3+instance AdmitChildSUP H3+instance AdmitChildSPAN H3+instance AdmitChildBDO H3+instance AdmitChildIFRAME H3+instance AdmitChildINPUT H3+instance AdmitChildSELECT H3+instance AdmitChildTEXTAREA H3+instance AdmitChildLABEL H3+instance AdmitChildBUTTON H3++instance AdmitChildCDATA H4+instance AdmitChildTT H4+instance AdmitChildI H4+instance AdmitChildB H4+instance AdmitChildU H4+instance AdmitChildS H4+instance AdmitChildSTRIKE H4+instance AdmitChildBIG H4+instance AdmitChildSMALL H4+instance AdmitChildEM H4+instance AdmitChildSTRONG H4+instance AdmitChildDFN H4+instance AdmitChildCODE H4+instance AdmitChildSAMP H4+instance AdmitChildKBD H4+instance AdmitChildVAR H4+instance AdmitChildCITE H4+instance AdmitChildABBR H4+instance AdmitChildACRONYM H4+instance AdmitChildA H4+instance AdmitChildIMG H4+instance AdmitChildAPPLET H4+instance AdmitChildOBJECT H4+instance AdmitChildFONT H4+instance AdmitChildBASEFONT H4+instance AdmitChildBR H4+instance AdmitChildSCRIPT H4+instance AdmitChildMAP H4+instance AdmitChildQ H4+instance AdmitChildSUB H4+instance AdmitChildSUP H4+instance AdmitChildSPAN H4+instance AdmitChildBDO H4+instance AdmitChildIFRAME H4+instance AdmitChildINPUT H4+instance AdmitChildSELECT H4+instance AdmitChildTEXTAREA H4+instance AdmitChildLABEL H4+instance AdmitChildBUTTON H4++instance AdmitChildCDATA H5+instance AdmitChildTT H5+instance AdmitChildI H5+instance AdmitChildB H5+instance AdmitChildU H5+instance AdmitChildS H5+instance AdmitChildSTRIKE H5+instance AdmitChildBIG H5+instance AdmitChildSMALL H5+instance AdmitChildEM H5+instance AdmitChildSTRONG H5+instance AdmitChildDFN H5+instance AdmitChildCODE H5+instance AdmitChildSAMP H5+instance AdmitChildKBD H5+instance AdmitChildVAR H5+instance AdmitChildCITE H5+instance AdmitChildABBR H5+instance AdmitChildACRONYM H5+instance AdmitChildA H5+instance AdmitChildIMG H5+instance AdmitChildAPPLET H5+instance AdmitChildOBJECT H5+instance AdmitChildFONT H5+instance AdmitChildBASEFONT H5+instance AdmitChildBR H5+instance AdmitChildSCRIPT H5+instance AdmitChildMAP H5+instance AdmitChildQ H5+instance AdmitChildSUB H5+instance AdmitChildSUP H5+instance AdmitChildSPAN H5+instance AdmitChildBDO H5+instance AdmitChildIFRAME H5+instance AdmitChildINPUT H5+instance AdmitChildSELECT H5+instance AdmitChildTEXTAREA H5+instance AdmitChildLABEL H5+instance AdmitChildBUTTON H5++instance AdmitChildCDATA H6+instance AdmitChildTT H6+instance AdmitChildI H6+instance AdmitChildB H6+instance AdmitChildU H6+instance AdmitChildS H6+instance AdmitChildSTRIKE H6+instance AdmitChildBIG H6+instance AdmitChildSMALL H6+instance AdmitChildEM H6+instance AdmitChildSTRONG H6+instance AdmitChildDFN H6+instance AdmitChildCODE H6+instance AdmitChildSAMP H6+instance AdmitChildKBD H6+instance AdmitChildVAR H6+instance AdmitChildCITE H6+instance AdmitChildABBR H6+instance AdmitChildACRONYM H6+instance AdmitChildA H6+instance AdmitChildIMG H6+instance AdmitChildAPPLET H6+instance AdmitChildOBJECT H6+instance AdmitChildFONT H6+instance AdmitChildBASEFONT H6+instance AdmitChildBR H6+instance AdmitChildSCRIPT H6+instance AdmitChildMAP H6+instance AdmitChildQ H6+instance AdmitChildSUB H6+instance AdmitChildSUP H6+instance AdmitChildSPAN H6+instance AdmitChildBDO H6+instance AdmitChildIFRAME H6+instance AdmitChildINPUT H6+instance AdmitChildSELECT H6+instance AdmitChildTEXTAREA H6+instance AdmitChildLABEL H6+instance AdmitChildBUTTON H6++instance AdmitChildCDATA P+instance AdmitChildTT P+instance AdmitChildI P+instance AdmitChildB P+instance AdmitChildU P+instance AdmitChildS P+instance AdmitChildSTRIKE P+instance AdmitChildBIG P+instance AdmitChildSMALL P+instance AdmitChildEM P+instance AdmitChildSTRONG P+instance AdmitChildDFN P+instance AdmitChildCODE P+instance AdmitChildSAMP P+instance AdmitChildKBD P+instance AdmitChildVAR P+instance AdmitChildCITE P+instance AdmitChildABBR P+instance AdmitChildACRONYM P+instance AdmitChildA P+instance AdmitChildIMG P+instance AdmitChildAPPLET P+instance AdmitChildOBJECT P+instance AdmitChildFONT P+instance AdmitChildBASEFONT P+instance AdmitChildBR P+instance AdmitChildSCRIPT P+instance AdmitChildMAP P+instance AdmitChildQ P+instance AdmitChildSUB P+instance AdmitChildSUP P+instance AdmitChildSPAN P+instance AdmitChildBDO P+instance AdmitChildIFRAME P+instance AdmitChildINPUT P+instance AdmitChildSELECT P+instance AdmitChildTEXTAREA P+instance AdmitChildLABEL P+instance AdmitChildBUTTON P+++instance AdmitChildPARAM APPLET+instance AdmitChildP APPLET+instance AdmitChildH1 APPLET+instance AdmitChildH2 APPLET+instance AdmitChildH3 APPLET+instance AdmitChildH4 APPLET+instance AdmitChildH5 APPLET+instance AdmitChildH6 APPLET+instance AdmitChildUL APPLET+instance AdmitChildOL APPLET+instance AdmitChildDIR APPLET+instance AdmitChildMENU APPLET+instance AdmitChildPRE APPLET+instance AdmitChildDL APPLET+instance AdmitChildDIV APPLET+instance AdmitChildCENTER APPLET+instance AdmitChildNOSCRIPT APPLET+instance AdmitChildNOFRAMES APPLET+instance AdmitChildBLOCKQUOTE APPLET+instance AdmitChildFORM APPLET+instance AdmitChildISINDEX APPLET+instance AdmitChildHR APPLET+instance AdmitChildTABLE APPLET+instance AdmitChildFIELDSET APPLET+instance AdmitChildADDRESS APPLET+instance AdmitChildCDATA APPLET+instance AdmitChildTT APPLET+instance AdmitChildI APPLET+instance AdmitChildB APPLET+instance AdmitChildU APPLET+instance AdmitChildS APPLET+instance AdmitChildSTRIKE APPLET+instance AdmitChildBIG APPLET+instance AdmitChildSMALL APPLET+instance AdmitChildEM APPLET+instance AdmitChildSTRONG APPLET+instance AdmitChildDFN APPLET+instance AdmitChildCODE APPLET+instance AdmitChildSAMP APPLET+instance AdmitChildKBD APPLET+instance AdmitChildVAR APPLET+instance AdmitChildCITE APPLET+instance AdmitChildABBR APPLET+instance AdmitChildACRONYM APPLET+instance AdmitChildA APPLET+instance AdmitChildIMG APPLET+instance AdmitChildAPPLET APPLET+instance AdmitChildOBJECT APPLET+instance AdmitChildFONT APPLET+instance AdmitChildBASEFONT APPLET+instance AdmitChildBR APPLET+instance AdmitChildSCRIPT APPLET+instance AdmitChildMAP APPLET+instance AdmitChildQ APPLET+instance AdmitChildSUB APPLET+instance AdmitChildSUP APPLET+instance AdmitChildSPAN APPLET+instance AdmitChildBDO APPLET+instance AdmitChildIFRAME APPLET+instance AdmitChildINPUT APPLET+instance AdmitChildSELECT APPLET+instance AdmitChildTEXTAREA APPLET+instance AdmitChildLABEL APPLET+instance AdmitChildBUTTON APPLET+++instance AdmitChildPARAM OBJECT+instance AdmitChildP OBJECT+instance AdmitChildH1 OBJECT+instance AdmitChildH2 OBJECT+instance AdmitChildH3 OBJECT+instance AdmitChildH4 OBJECT+instance AdmitChildH5 OBJECT+instance AdmitChildH6 OBJECT+instance AdmitChildUL OBJECT+instance AdmitChildOL OBJECT+instance AdmitChildDIR OBJECT+instance AdmitChildMENU OBJECT+instance AdmitChildPRE OBJECT+instance AdmitChildDL OBJECT+instance AdmitChildDIV OBJECT+instance AdmitChildCENTER OBJECT+instance AdmitChildNOSCRIPT OBJECT+instance AdmitChildNOFRAMES OBJECT+instance AdmitChildBLOCKQUOTE OBJECT+instance AdmitChildFORM OBJECT+instance AdmitChildISINDEX OBJECT+instance AdmitChildHR OBJECT+instance AdmitChildTABLE OBJECT+instance AdmitChildFIELDSET OBJECT+instance AdmitChildADDRESS OBJECT+instance AdmitChildCDATA OBJECT+instance AdmitChildTT OBJECT+instance AdmitChildI OBJECT+instance AdmitChildB OBJECT+instance AdmitChildU OBJECT+instance AdmitChildS OBJECT+instance AdmitChildSTRIKE OBJECT+instance AdmitChildBIG OBJECT+instance AdmitChildSMALL OBJECT+instance AdmitChildEM OBJECT+instance AdmitChildSTRONG OBJECT+instance AdmitChildDFN OBJECT+instance AdmitChildCODE OBJECT+instance AdmitChildSAMP OBJECT+instance AdmitChildKBD OBJECT+instance AdmitChildVAR OBJECT+instance AdmitChildCITE OBJECT+instance AdmitChildABBR OBJECT+instance AdmitChildACRONYM OBJECT+instance AdmitChildA OBJECT+instance AdmitChildIMG OBJECT+instance AdmitChildAPPLET OBJECT+instance AdmitChildOBJECT OBJECT+instance AdmitChildFONT OBJECT+instance AdmitChildBASEFONT OBJECT+instance AdmitChildBR OBJECT+instance AdmitChildSCRIPT OBJECT+instance AdmitChildMAP OBJECT+instance AdmitChildQ OBJECT+instance AdmitChildSUB OBJECT+instance AdmitChildSUP OBJECT+instance AdmitChildSPAN OBJECT+instance AdmitChildBDO OBJECT+instance AdmitChildIFRAME OBJECT+instance AdmitChildINPUT OBJECT+instance AdmitChildSELECT OBJECT+instance AdmitChildTEXTAREA OBJECT+instance AdmitChildLABEL OBJECT+instance AdmitChildBUTTON OBJECT+++++instance AdmitChildP MAP+instance AdmitChildH1 MAP+instance AdmitChildH2 MAP+instance AdmitChildH3 MAP+instance AdmitChildH4 MAP+instance AdmitChildH5 MAP+instance AdmitChildH6 MAP+instance AdmitChildUL MAP+instance AdmitChildOL MAP+instance AdmitChildDIR MAP+instance AdmitChildMENU MAP+instance AdmitChildPRE MAP+instance AdmitChildDL MAP+instance AdmitChildDIV MAP+instance AdmitChildCENTER MAP+instance AdmitChildNOSCRIPT MAP+instance AdmitChildNOFRAMES MAP+instance AdmitChildBLOCKQUOTE MAP+instance AdmitChildFORM MAP+instance AdmitChildISINDEX MAP+instance AdmitChildHR MAP+instance AdmitChildTABLE MAP+instance AdmitChildFIELDSET MAP+instance AdmitChildADDRESS MAP+instance AdmitChildAREA MAP++instance AdmitChildCDATA A+instance AdmitChildTT A+instance AdmitChildI A+instance AdmitChildB A+instance AdmitChildU A+instance AdmitChildS A+instance AdmitChildSTRIKE A+instance AdmitChildBIG A+instance AdmitChildSMALL A+instance AdmitChildEM A+instance AdmitChildSTRONG A+instance AdmitChildDFN A+instance AdmitChildCODE A+instance AdmitChildSAMP A+instance AdmitChildKBD A+instance AdmitChildVAR A+instance AdmitChildCITE A+instance AdmitChildABBR A+instance AdmitChildACRONYM A+instance AdmitChildIMG A+instance AdmitChildAPPLET A+instance AdmitChildOBJECT A+instance AdmitChildFONT A+instance AdmitChildBASEFONT A+instance AdmitChildBR A+instance AdmitChildSCRIPT A+instance AdmitChildMAP A+instance AdmitChildQ A+instance AdmitChildSUB A+instance AdmitChildSUP A+instance AdmitChildSPAN A+instance AdmitChildBDO A+instance AdmitChildIFRAME A+instance AdmitChildINPUT A+instance AdmitChildSELECT A+instance AdmitChildTEXTAREA A+instance AdmitChildLABEL A+instance AdmitChildBUTTON A++instance AdmitChildP CENTER+instance AdmitChildH1 CENTER+instance AdmitChildH2 CENTER+instance AdmitChildH3 CENTER+instance AdmitChildH4 CENTER+instance AdmitChildH5 CENTER+instance AdmitChildH6 CENTER+instance AdmitChildUL CENTER+instance AdmitChildOL CENTER+instance AdmitChildDIR CENTER+instance AdmitChildMENU CENTER+instance AdmitChildPRE CENTER+instance AdmitChildDL CENTER+instance AdmitChildDIV CENTER+instance AdmitChildCENTER CENTER+instance AdmitChildNOSCRIPT CENTER+instance AdmitChildNOFRAMES CENTER+instance AdmitChildBLOCKQUOTE CENTER+instance AdmitChildFORM CENTER+instance AdmitChildISINDEX CENTER+instance AdmitChildHR CENTER+instance AdmitChildTABLE CENTER+instance AdmitChildFIELDSET CENTER+instance AdmitChildADDRESS CENTER+instance AdmitChildCDATA CENTER+instance AdmitChildTT CENTER+instance AdmitChildI CENTER+instance AdmitChildB CENTER+instance AdmitChildU CENTER+instance AdmitChildS CENTER+instance AdmitChildSTRIKE CENTER+instance AdmitChildBIG CENTER+instance AdmitChildSMALL CENTER+instance AdmitChildEM CENTER+instance AdmitChildSTRONG CENTER+instance AdmitChildDFN CENTER+instance AdmitChildCODE CENTER+instance AdmitChildSAMP CENTER+instance AdmitChildKBD CENTER+instance AdmitChildVAR CENTER+instance AdmitChildCITE CENTER+instance AdmitChildABBR CENTER+instance AdmitChildACRONYM CENTER+instance AdmitChildA CENTER+instance AdmitChildIMG CENTER+instance AdmitChildAPPLET CENTER+instance AdmitChildOBJECT CENTER+instance AdmitChildFONT CENTER+instance AdmitChildBASEFONT CENTER+instance AdmitChildBR CENTER+instance AdmitChildSCRIPT CENTER+instance AdmitChildMAP CENTER+instance AdmitChildQ CENTER+instance AdmitChildSUB CENTER+instance AdmitChildSUP CENTER+instance AdmitChildSPAN CENTER+instance AdmitChildBDO CENTER+instance AdmitChildIFRAME CENTER+instance AdmitChildINPUT CENTER+instance AdmitChildSELECT CENTER+instance AdmitChildTEXTAREA CENTER+instance AdmitChildLABEL CENTER+instance AdmitChildBUTTON CENTER++instance AdmitChildP DIV+instance AdmitChildH1 DIV+instance AdmitChildH2 DIV+instance AdmitChildH3 DIV+instance AdmitChildH4 DIV+instance AdmitChildH5 DIV+instance AdmitChildH6 DIV+instance AdmitChildUL DIV+instance AdmitChildOL DIV+instance AdmitChildDIR DIV+instance AdmitChildMENU DIV+instance AdmitChildPRE DIV+instance AdmitChildDL DIV+instance AdmitChildDIV DIV+instance AdmitChildCENTER DIV+instance AdmitChildNOSCRIPT DIV+instance AdmitChildNOFRAMES DIV+instance AdmitChildBLOCKQUOTE DIV+instance AdmitChildFORM DIV+instance AdmitChildISINDEX DIV+instance AdmitChildHR DIV+instance AdmitChildTABLE DIV+instance AdmitChildFIELDSET DIV+instance AdmitChildADDRESS DIV+instance AdmitChildCDATA DIV+instance AdmitChildTT DIV+instance AdmitChildI DIV+instance AdmitChildB DIV+instance AdmitChildU DIV+instance AdmitChildS DIV+instance AdmitChildSTRIKE DIV+instance AdmitChildBIG DIV+instance AdmitChildSMALL DIV+instance AdmitChildEM DIV+instance AdmitChildSTRONG DIV+instance AdmitChildDFN DIV+instance AdmitChildCODE DIV+instance AdmitChildSAMP DIV+instance AdmitChildKBD DIV+instance AdmitChildVAR DIV+instance AdmitChildCITE DIV+instance AdmitChildABBR DIV+instance AdmitChildACRONYM DIV+instance AdmitChildA DIV+instance AdmitChildIMG DIV+instance AdmitChildAPPLET DIV+instance AdmitChildOBJECT DIV+instance AdmitChildFONT DIV+instance AdmitChildBASEFONT DIV+instance AdmitChildBR DIV+instance AdmitChildSCRIPT DIV+instance AdmitChildMAP DIV+instance AdmitChildQ DIV+instance AdmitChildSUB DIV+instance AdmitChildSUP DIV+instance AdmitChildSPAN DIV+instance AdmitChildBDO DIV+instance AdmitChildIFRAME DIV+instance AdmitChildINPUT DIV+instance AdmitChildSELECT DIV+instance AdmitChildTEXTAREA DIV+instance AdmitChildLABEL DIV+instance AdmitChildBUTTON DIV++instance AdmitChildCDATA ADDRESS+instance AdmitChildTT ADDRESS+instance AdmitChildI ADDRESS+instance AdmitChildB ADDRESS+instance AdmitChildU ADDRESS+instance AdmitChildS ADDRESS+instance AdmitChildSTRIKE ADDRESS+instance AdmitChildBIG ADDRESS+instance AdmitChildSMALL ADDRESS+instance AdmitChildEM ADDRESS+instance AdmitChildSTRONG ADDRESS+instance AdmitChildDFN ADDRESS+instance AdmitChildCODE ADDRESS+instance AdmitChildSAMP ADDRESS+instance AdmitChildKBD ADDRESS+instance AdmitChildVAR ADDRESS+instance AdmitChildCITE ADDRESS+instance AdmitChildABBR ADDRESS+instance AdmitChildACRONYM ADDRESS+instance AdmitChildA ADDRESS+instance AdmitChildIMG ADDRESS+instance AdmitChildAPPLET ADDRESS+instance AdmitChildOBJECT ADDRESS+instance AdmitChildFONT ADDRESS+instance AdmitChildBASEFONT ADDRESS+instance AdmitChildBR ADDRESS+instance AdmitChildSCRIPT ADDRESS+instance AdmitChildMAP ADDRESS+instance AdmitChildQ ADDRESS+instance AdmitChildSUB ADDRESS+instance AdmitChildSUP ADDRESS+instance AdmitChildSPAN ADDRESS+instance AdmitChildBDO ADDRESS+instance AdmitChildIFRAME ADDRESS+instance AdmitChildINPUT ADDRESS+instance AdmitChildSELECT ADDRESS+instance AdmitChildTEXTAREA ADDRESS+instance AdmitChildLABEL ADDRESS+instance AdmitChildBUTTON ADDRESS+instance AdmitChildP ADDRESS++instance AdmitChildP BODY+instance AdmitChildH1 BODY+instance AdmitChildH2 BODY+instance AdmitChildH3 BODY+instance AdmitChildH4 BODY+instance AdmitChildH5 BODY+instance AdmitChildH6 BODY+instance AdmitChildUL BODY+instance AdmitChildOL BODY+instance AdmitChildDIR BODY+instance AdmitChildMENU BODY+instance AdmitChildPRE BODY+instance AdmitChildDL BODY+instance AdmitChildDIV BODY+instance AdmitChildCENTER BODY+instance AdmitChildNOSCRIPT BODY+instance AdmitChildNOFRAMES BODY+instance AdmitChildBLOCKQUOTE BODY+instance AdmitChildFORM BODY+instance AdmitChildISINDEX BODY+instance AdmitChildHR BODY+instance AdmitChildTABLE BODY+instance AdmitChildFIELDSET BODY+instance AdmitChildADDRESS BODY+instance AdmitChildCDATA BODY+instance AdmitChildTT BODY+instance AdmitChildI BODY+instance AdmitChildB BODY+instance AdmitChildU BODY+instance AdmitChildS BODY+instance AdmitChildSTRIKE BODY+instance AdmitChildBIG BODY+instance AdmitChildSMALL BODY+instance AdmitChildEM BODY+instance AdmitChildSTRONG BODY+instance AdmitChildDFN BODY+instance AdmitChildCODE BODY+instance AdmitChildSAMP BODY+instance AdmitChildKBD BODY+instance AdmitChildVAR BODY+instance AdmitChildCITE BODY+instance AdmitChildABBR BODY+instance AdmitChildACRONYM BODY+instance AdmitChildA BODY+instance AdmitChildIMG BODY+instance AdmitChildAPPLET BODY+instance AdmitChildOBJECT BODY+instance AdmitChildFONT BODY+instance AdmitChildBASEFONT BODY+instance AdmitChildBR BODY+instance AdmitChildSCRIPT BODY+instance AdmitChildMAP BODY+instance AdmitChildQ BODY+instance AdmitChildSUB BODY+instance AdmitChildSUP BODY+instance AdmitChildSPAN BODY+instance AdmitChildBDO BODY+instance AdmitChildIFRAME BODY+instance AdmitChildINPUT BODY+instance AdmitChildSELECT BODY+instance AdmitChildTEXTAREA BODY+instance AdmitChildLABEL BODY+instance AdmitChildBUTTON BODY+instance AdmitChildINS BODY+instance AdmitChildDEL BODY+++instance AdmitChildCDATA FONT+instance AdmitChildTT FONT+instance AdmitChildI FONT+instance AdmitChildB FONT+instance AdmitChildU FONT+instance AdmitChildS FONT+instance AdmitChildSTRIKE FONT+instance AdmitChildBIG FONT+instance AdmitChildSMALL FONT+instance AdmitChildEM FONT+instance AdmitChildSTRONG FONT+instance AdmitChildDFN FONT+instance AdmitChildCODE FONT+instance AdmitChildSAMP FONT+instance AdmitChildKBD FONT+instance AdmitChildVAR FONT+instance AdmitChildCITE FONT+instance AdmitChildABBR FONT+instance AdmitChildACRONYM FONT+instance AdmitChildA FONT+instance AdmitChildIMG FONT+instance AdmitChildAPPLET FONT+instance AdmitChildOBJECT FONT+instance AdmitChildFONT FONT+instance AdmitChildBASEFONT FONT+instance AdmitChildBR FONT+instance AdmitChildSCRIPT FONT+instance AdmitChildMAP FONT+instance AdmitChildQ FONT+instance AdmitChildSUB FONT+instance AdmitChildSUP FONT+instance AdmitChildSPAN FONT+instance AdmitChildBDO FONT+instance AdmitChildIFRAME FONT+instance AdmitChildINPUT FONT+instance AdmitChildSELECT FONT+instance AdmitChildTEXTAREA FONT+instance AdmitChildLABEL FONT+instance AdmitChildBUTTON FONT+++instance AdmitChildCDATA BDO+instance AdmitChildTT BDO+instance AdmitChildI BDO+instance AdmitChildB BDO+instance AdmitChildU BDO+instance AdmitChildS BDO+instance AdmitChildSTRIKE BDO+instance AdmitChildBIG BDO+instance AdmitChildSMALL BDO+instance AdmitChildEM BDO+instance AdmitChildSTRONG BDO+instance AdmitChildDFN BDO+instance AdmitChildCODE BDO+instance AdmitChildSAMP BDO+instance AdmitChildKBD BDO+instance AdmitChildVAR BDO+instance AdmitChildCITE BDO+instance AdmitChildABBR BDO+instance AdmitChildACRONYM BDO+instance AdmitChildA BDO+instance AdmitChildIMG BDO+instance AdmitChildAPPLET BDO+instance AdmitChildOBJECT BDO+instance AdmitChildFONT BDO+instance AdmitChildBASEFONT BDO+instance AdmitChildBR BDO+instance AdmitChildSCRIPT BDO+instance AdmitChildMAP BDO+instance AdmitChildQ BDO+instance AdmitChildSUB BDO+instance AdmitChildSUP BDO+instance AdmitChildSPAN BDO+instance AdmitChildBDO BDO+instance AdmitChildIFRAME BDO+instance AdmitChildINPUT BDO+instance AdmitChildSELECT BDO+instance AdmitChildTEXTAREA BDO+instance AdmitChildLABEL BDO+instance AdmitChildBUTTON BDO++instance AdmitChildCDATA SPAN+instance AdmitChildTT SPAN+instance AdmitChildI SPAN+instance AdmitChildB SPAN+instance AdmitChildU SPAN+instance AdmitChildS SPAN+instance AdmitChildSTRIKE SPAN+instance AdmitChildBIG SPAN+instance AdmitChildSMALL SPAN+instance AdmitChildEM SPAN+instance AdmitChildSTRONG SPAN+instance AdmitChildDFN SPAN+instance AdmitChildCODE SPAN+instance AdmitChildSAMP SPAN+instance AdmitChildKBD SPAN+instance AdmitChildVAR SPAN+instance AdmitChildCITE SPAN+instance AdmitChildABBR SPAN+instance AdmitChildACRONYM SPAN+instance AdmitChildA SPAN+instance AdmitChildIMG SPAN+instance AdmitChildAPPLET SPAN+instance AdmitChildOBJECT SPAN+instance AdmitChildFONT SPAN+instance AdmitChildBASEFONT SPAN+instance AdmitChildBR SPAN+instance AdmitChildSCRIPT SPAN+instance AdmitChildMAP SPAN+instance AdmitChildQ SPAN+instance AdmitChildSUB SPAN+instance AdmitChildSUP SPAN+instance AdmitChildSPAN SPAN+instance AdmitChildBDO SPAN+instance AdmitChildIFRAME SPAN+instance AdmitChildINPUT SPAN+instance AdmitChildSELECT SPAN+instance AdmitChildTEXTAREA SPAN+instance AdmitChildLABEL SPAN+instance AdmitChildBUTTON SPAN++instance AdmitChildCDATA SUB+instance AdmitChildTT SUB+instance AdmitChildI SUB+instance AdmitChildB SUB+instance AdmitChildU SUB+instance AdmitChildS SUB+instance AdmitChildSTRIKE SUB+instance AdmitChildBIG SUB+instance AdmitChildSMALL SUB+instance AdmitChildEM SUB+instance AdmitChildSTRONG SUB+instance AdmitChildDFN SUB+instance AdmitChildCODE SUB+instance AdmitChildSAMP SUB+instance AdmitChildKBD SUB+instance AdmitChildVAR SUB+instance AdmitChildCITE SUB+instance AdmitChildABBR SUB+instance AdmitChildACRONYM SUB+instance AdmitChildA SUB+instance AdmitChildIMG SUB+instance AdmitChildAPPLET SUB+instance AdmitChildOBJECT SUB+instance AdmitChildFONT SUB+instance AdmitChildBASEFONT SUB+instance AdmitChildBR SUB+instance AdmitChildSCRIPT SUB+instance AdmitChildMAP SUB+instance AdmitChildQ SUB+instance AdmitChildSUB SUB+instance AdmitChildSUP SUB+instance AdmitChildSPAN SUB+instance AdmitChildBDO SUB+instance AdmitChildIFRAME SUB+instance AdmitChildINPUT SUB+instance AdmitChildSELECT SUB+instance AdmitChildTEXTAREA SUB+instance AdmitChildLABEL SUB+instance AdmitChildBUTTON SUB++instance AdmitChildCDATA SUP+instance AdmitChildTT SUP+instance AdmitChildI SUP+instance AdmitChildB SUP+instance AdmitChildU SUP+instance AdmitChildS SUP+instance AdmitChildSTRIKE SUP+instance AdmitChildBIG SUP+instance AdmitChildSMALL SUP+instance AdmitChildEM SUP+instance AdmitChildSTRONG SUP+instance AdmitChildDFN SUP+instance AdmitChildCODE SUP+instance AdmitChildSAMP SUP+instance AdmitChildKBD SUP+instance AdmitChildVAR SUP+instance AdmitChildCITE SUP+instance AdmitChildABBR SUP+instance AdmitChildACRONYM SUP+instance AdmitChildA SUP+instance AdmitChildIMG SUP+instance AdmitChildAPPLET SUP+instance AdmitChildOBJECT SUP+instance AdmitChildFONT SUP+instance AdmitChildBASEFONT SUP+instance AdmitChildBR SUP+instance AdmitChildSCRIPT SUP+instance AdmitChildMAP SUP+instance AdmitChildQ SUP+instance AdmitChildSUB SUP+instance AdmitChildSUP SUP+instance AdmitChildSPAN SUP+instance AdmitChildBDO SUP+instance AdmitChildIFRAME SUP+instance AdmitChildINPUT SUP+instance AdmitChildSELECT SUP+instance AdmitChildTEXTAREA SUP+instance AdmitChildLABEL SUP+instance AdmitChildBUTTON SUP++instance AdmitChildCDATA TT+instance AdmitChildTT TT+instance AdmitChildI TT+instance AdmitChildB TT+instance AdmitChildU TT+instance AdmitChildS TT+instance AdmitChildSTRIKE TT+instance AdmitChildBIG TT+instance AdmitChildSMALL TT+instance AdmitChildEM TT+instance AdmitChildSTRONG TT+instance AdmitChildDFN TT+instance AdmitChildCODE TT+instance AdmitChildSAMP TT+instance AdmitChildKBD TT+instance AdmitChildVAR TT+instance AdmitChildCITE TT+instance AdmitChildABBR TT+instance AdmitChildACRONYM TT+instance AdmitChildA TT+instance AdmitChildIMG TT+instance AdmitChildAPPLET TT+instance AdmitChildOBJECT TT+instance AdmitChildFONT TT+instance AdmitChildBASEFONT TT+instance AdmitChildBR TT+instance AdmitChildSCRIPT TT+instance AdmitChildMAP TT+instance AdmitChildQ TT+instance AdmitChildSUB TT+instance AdmitChildSUP TT+instance AdmitChildSPAN TT+instance AdmitChildBDO TT+instance AdmitChildIFRAME TT+instance AdmitChildINPUT TT+instance AdmitChildSELECT TT+instance AdmitChildTEXTAREA TT+instance AdmitChildLABEL TT+instance AdmitChildBUTTON TT++instance AdmitChildCDATA I+instance AdmitChildTT I+instance AdmitChildI I+instance AdmitChildB I+instance AdmitChildU I+instance AdmitChildS I+instance AdmitChildSTRIKE I+instance AdmitChildBIG I+instance AdmitChildSMALL I+instance AdmitChildEM I+instance AdmitChildSTRONG I+instance AdmitChildDFN I+instance AdmitChildCODE I+instance AdmitChildSAMP I+instance AdmitChildKBD I+instance AdmitChildVAR I+instance AdmitChildCITE I+instance AdmitChildABBR I+instance AdmitChildACRONYM I+instance AdmitChildA I+instance AdmitChildIMG I+instance AdmitChildAPPLET I+instance AdmitChildOBJECT I+instance AdmitChildFONT I+instance AdmitChildBASEFONT I+instance AdmitChildBR I+instance AdmitChildSCRIPT I+instance AdmitChildMAP I+instance AdmitChildQ I+instance AdmitChildSUB I+instance AdmitChildSUP I+instance AdmitChildSPAN I+instance AdmitChildBDO I+instance AdmitChildIFRAME I+instance AdmitChildINPUT I+instance AdmitChildSELECT I+instance AdmitChildTEXTAREA I+instance AdmitChildLABEL I+instance AdmitChildBUTTON I++instance AdmitChildCDATA B+instance AdmitChildTT B+instance AdmitChildI B+instance AdmitChildB B+instance AdmitChildU B+instance AdmitChildS B+instance AdmitChildSTRIKE B+instance AdmitChildBIG B+instance AdmitChildSMALL B+instance AdmitChildEM B+instance AdmitChildSTRONG B+instance AdmitChildDFN B+instance AdmitChildCODE B+instance AdmitChildSAMP B+instance AdmitChildKBD B+instance AdmitChildVAR B+instance AdmitChildCITE B+instance AdmitChildABBR B+instance AdmitChildACRONYM B+instance AdmitChildA B+instance AdmitChildIMG B+instance AdmitChildAPPLET B+instance AdmitChildOBJECT B+instance AdmitChildFONT B+instance AdmitChildBASEFONT B+instance AdmitChildBR B+instance AdmitChildSCRIPT B+instance AdmitChildMAP B+instance AdmitChildQ B+instance AdmitChildSUB B+instance AdmitChildSUP B+instance AdmitChildSPAN B+instance AdmitChildBDO B+instance AdmitChildIFRAME B+instance AdmitChildINPUT B+instance AdmitChildSELECT B+instance AdmitChildTEXTAREA B+instance AdmitChildLABEL B+instance AdmitChildBUTTON B++instance AdmitChildCDATA U+instance AdmitChildTT U+instance AdmitChildI U+instance AdmitChildB U+instance AdmitChildU U+instance AdmitChildS U+instance AdmitChildSTRIKE U+instance AdmitChildBIG U+instance AdmitChildSMALL U+instance AdmitChildEM U+instance AdmitChildSTRONG U+instance AdmitChildDFN U+instance AdmitChildCODE U+instance AdmitChildSAMP U+instance AdmitChildKBD U+instance AdmitChildVAR U+instance AdmitChildCITE U+instance AdmitChildABBR U+instance AdmitChildACRONYM U+instance AdmitChildA U+instance AdmitChildIMG U+instance AdmitChildAPPLET U+instance AdmitChildOBJECT U+instance AdmitChildFONT U+instance AdmitChildBASEFONT U+instance AdmitChildBR U+instance AdmitChildSCRIPT U+instance AdmitChildMAP U+instance AdmitChildQ U+instance AdmitChildSUB U+instance AdmitChildSUP U+instance AdmitChildSPAN U+instance AdmitChildBDO U+instance AdmitChildIFRAME U+instance AdmitChildINPUT U+instance AdmitChildSELECT U+instance AdmitChildTEXTAREA U+instance AdmitChildLABEL U+instance AdmitChildBUTTON U++instance AdmitChildCDATA S+instance AdmitChildTT S+instance AdmitChildI S+instance AdmitChildB S+instance AdmitChildU S+instance AdmitChildS S+instance AdmitChildSTRIKE S+instance AdmitChildBIG S+instance AdmitChildSMALL S+instance AdmitChildEM S+instance AdmitChildSTRONG S+instance AdmitChildDFN S+instance AdmitChildCODE S+instance AdmitChildSAMP S+instance AdmitChildKBD S+instance AdmitChildVAR S+instance AdmitChildCITE S+instance AdmitChildABBR S+instance AdmitChildACRONYM S+instance AdmitChildA S+instance AdmitChildIMG S+instance AdmitChildAPPLET S+instance AdmitChildOBJECT S+instance AdmitChildFONT S+instance AdmitChildBASEFONT S+instance AdmitChildBR S+instance AdmitChildSCRIPT S+instance AdmitChildMAP S+instance AdmitChildQ S+instance AdmitChildSUB S+instance AdmitChildSUP S+instance AdmitChildSPAN S+instance AdmitChildBDO S+instance AdmitChildIFRAME S+instance AdmitChildINPUT S+instance AdmitChildSELECT S+instance AdmitChildTEXTAREA S+instance AdmitChildLABEL S+instance AdmitChildBUTTON S++instance AdmitChildCDATA STRIKE+instance AdmitChildTT STRIKE+instance AdmitChildI STRIKE+instance AdmitChildB STRIKE+instance AdmitChildU STRIKE+instance AdmitChildS STRIKE+instance AdmitChildSTRIKE STRIKE+instance AdmitChildBIG STRIKE+instance AdmitChildSMALL STRIKE+instance AdmitChildEM STRIKE+instance AdmitChildSTRONG STRIKE+instance AdmitChildDFN STRIKE+instance AdmitChildCODE STRIKE+instance AdmitChildSAMP STRIKE+instance AdmitChildKBD STRIKE+instance AdmitChildVAR STRIKE+instance AdmitChildCITE STRIKE+instance AdmitChildABBR STRIKE+instance AdmitChildACRONYM STRIKE+instance AdmitChildA STRIKE+instance AdmitChildIMG STRIKE+instance AdmitChildAPPLET STRIKE+instance AdmitChildOBJECT STRIKE+instance AdmitChildFONT STRIKE+instance AdmitChildBASEFONT STRIKE+instance AdmitChildBR STRIKE+instance AdmitChildSCRIPT STRIKE+instance AdmitChildMAP STRIKE+instance AdmitChildQ STRIKE+instance AdmitChildSUB STRIKE+instance AdmitChildSUP STRIKE+instance AdmitChildSPAN STRIKE+instance AdmitChildBDO STRIKE+instance AdmitChildIFRAME STRIKE+instance AdmitChildINPUT STRIKE+instance AdmitChildSELECT STRIKE+instance AdmitChildTEXTAREA STRIKE+instance AdmitChildLABEL STRIKE+instance AdmitChildBUTTON STRIKE++instance AdmitChildCDATA BIG+instance AdmitChildTT BIG+instance AdmitChildI BIG+instance AdmitChildB BIG+instance AdmitChildU BIG+instance AdmitChildS BIG+instance AdmitChildSTRIKE BIG+instance AdmitChildBIG BIG+instance AdmitChildSMALL BIG+instance AdmitChildEM BIG+instance AdmitChildSTRONG BIG+instance AdmitChildDFN BIG+instance AdmitChildCODE BIG+instance AdmitChildSAMP BIG+instance AdmitChildKBD BIG+instance AdmitChildVAR BIG+instance AdmitChildCITE BIG+instance AdmitChildABBR BIG+instance AdmitChildACRONYM BIG+instance AdmitChildA BIG+instance AdmitChildIMG BIG+instance AdmitChildAPPLET BIG+instance AdmitChildOBJECT BIG+instance AdmitChildFONT BIG+instance AdmitChildBASEFONT BIG+instance AdmitChildBR BIG+instance AdmitChildSCRIPT BIG+instance AdmitChildMAP BIG+instance AdmitChildQ BIG+instance AdmitChildSUB BIG+instance AdmitChildSUP BIG+instance AdmitChildSPAN BIG+instance AdmitChildBDO BIG+instance AdmitChildIFRAME BIG+instance AdmitChildINPUT BIG+instance AdmitChildSELECT BIG+instance AdmitChildTEXTAREA BIG+instance AdmitChildLABEL BIG+instance AdmitChildBUTTON BIG++instance AdmitChildCDATA SMALL+instance AdmitChildTT SMALL+instance AdmitChildI SMALL+instance AdmitChildB SMALL+instance AdmitChildU SMALL+instance AdmitChildS SMALL+instance AdmitChildSTRIKE SMALL+instance AdmitChildBIG SMALL+instance AdmitChildSMALL SMALL+instance AdmitChildEM SMALL+instance AdmitChildSTRONG SMALL+instance AdmitChildDFN SMALL+instance AdmitChildCODE SMALL+instance AdmitChildSAMP SMALL+instance AdmitChildKBD SMALL+instance AdmitChildVAR SMALL+instance AdmitChildCITE SMALL+instance AdmitChildABBR SMALL+instance AdmitChildACRONYM SMALL+instance AdmitChildA SMALL+instance AdmitChildIMG SMALL+instance AdmitChildAPPLET SMALL+instance AdmitChildOBJECT SMALL+instance AdmitChildFONT SMALL+instance AdmitChildBASEFONT SMALL+instance AdmitChildBR SMALL+instance AdmitChildSCRIPT SMALL+instance AdmitChildMAP SMALL+instance AdmitChildQ SMALL+instance AdmitChildSUB SMALL+instance AdmitChildSUP SMALL+instance AdmitChildSPAN SMALL+instance AdmitChildBDO SMALL+instance AdmitChildIFRAME SMALL+instance AdmitChildINPUT SMALL+instance AdmitChildSELECT SMALL+instance AdmitChildTEXTAREA SMALL+instance AdmitChildLABEL SMALL+instance AdmitChildBUTTON SMALL++instance AdmitChildCDATA EM+instance AdmitChildTT EM+instance AdmitChildI EM+instance AdmitChildB EM+instance AdmitChildU EM+instance AdmitChildS EM+instance AdmitChildSTRIKE EM+instance AdmitChildBIG EM+instance AdmitChildSMALL EM+instance AdmitChildEM EM+instance AdmitChildSTRONG EM+instance AdmitChildDFN EM+instance AdmitChildCODE EM+instance AdmitChildSAMP EM+instance AdmitChildKBD EM+instance AdmitChildVAR EM+instance AdmitChildCITE EM+instance AdmitChildABBR EM+instance AdmitChildACRONYM EM+instance AdmitChildA EM+instance AdmitChildIMG EM+instance AdmitChildAPPLET EM+instance AdmitChildOBJECT EM+instance AdmitChildFONT EM+instance AdmitChildBASEFONT EM+instance AdmitChildBR EM+instance AdmitChildSCRIPT EM+instance AdmitChildMAP EM+instance AdmitChildQ EM+instance AdmitChildSUB EM+instance AdmitChildSUP EM+instance AdmitChildSPAN EM+instance AdmitChildBDO EM+instance AdmitChildIFRAME EM+instance AdmitChildINPUT EM+instance AdmitChildSELECT EM+instance AdmitChildTEXTAREA EM+instance AdmitChildLABEL EM+instance AdmitChildBUTTON EM++instance AdmitChildCDATA STRONG+instance AdmitChildTT STRONG+instance AdmitChildI STRONG+instance AdmitChildB STRONG+instance AdmitChildU STRONG+instance AdmitChildS STRONG+instance AdmitChildSTRIKE STRONG+instance AdmitChildBIG STRONG+instance AdmitChildSMALL STRONG+instance AdmitChildEM STRONG+instance AdmitChildSTRONG STRONG+instance AdmitChildDFN STRONG+instance AdmitChildCODE STRONG+instance AdmitChildSAMP STRONG+instance AdmitChildKBD STRONG+instance AdmitChildVAR STRONG+instance AdmitChildCITE STRONG+instance AdmitChildABBR STRONG+instance AdmitChildACRONYM STRONG+instance AdmitChildA STRONG+instance AdmitChildIMG STRONG+instance AdmitChildAPPLET STRONG+instance AdmitChildOBJECT STRONG+instance AdmitChildFONT STRONG+instance AdmitChildBASEFONT STRONG+instance AdmitChildBR STRONG+instance AdmitChildSCRIPT STRONG+instance AdmitChildMAP STRONG+instance AdmitChildQ STRONG+instance AdmitChildSUB STRONG+instance AdmitChildSUP STRONG+instance AdmitChildSPAN STRONG+instance AdmitChildBDO STRONG+instance AdmitChildIFRAME STRONG+instance AdmitChildINPUT STRONG+instance AdmitChildSELECT STRONG+instance AdmitChildTEXTAREA STRONG+instance AdmitChildLABEL STRONG+instance AdmitChildBUTTON STRONG++instance AdmitChildCDATA DFN+instance AdmitChildTT DFN+instance AdmitChildI DFN+instance AdmitChildB DFN+instance AdmitChildU DFN+instance AdmitChildS DFN+instance AdmitChildSTRIKE DFN+instance AdmitChildBIG DFN+instance AdmitChildSMALL DFN+instance AdmitChildEM DFN+instance AdmitChildSTRONG DFN+instance AdmitChildDFN DFN+instance AdmitChildCODE DFN+instance AdmitChildSAMP DFN+instance AdmitChildKBD DFN+instance AdmitChildVAR DFN+instance AdmitChildCITE DFN+instance AdmitChildABBR DFN+instance AdmitChildACRONYM DFN+instance AdmitChildA DFN+instance AdmitChildIMG DFN+instance AdmitChildAPPLET DFN+instance AdmitChildOBJECT DFN+instance AdmitChildFONT DFN+instance AdmitChildBASEFONT DFN+instance AdmitChildBR DFN+instance AdmitChildSCRIPT DFN+instance AdmitChildMAP DFN+instance AdmitChildQ DFN+instance AdmitChildSUB DFN+instance AdmitChildSUP DFN+instance AdmitChildSPAN DFN+instance AdmitChildBDO DFN+instance AdmitChildIFRAME DFN+instance AdmitChildINPUT DFN+instance AdmitChildSELECT DFN+instance AdmitChildTEXTAREA DFN+instance AdmitChildLABEL DFN+instance AdmitChildBUTTON DFN++instance AdmitChildCDATA CODE+instance AdmitChildTT CODE+instance AdmitChildI CODE+instance AdmitChildB CODE+instance AdmitChildU CODE+instance AdmitChildS CODE+instance AdmitChildSTRIKE CODE+instance AdmitChildBIG CODE+instance AdmitChildSMALL CODE+instance AdmitChildEM CODE+instance AdmitChildSTRONG CODE+instance AdmitChildDFN CODE+instance AdmitChildCODE CODE+instance AdmitChildSAMP CODE+instance AdmitChildKBD CODE+instance AdmitChildVAR CODE+instance AdmitChildCITE CODE+instance AdmitChildABBR CODE+instance AdmitChildACRONYM CODE+instance AdmitChildA CODE+instance AdmitChildIMG CODE+instance AdmitChildAPPLET CODE+instance AdmitChildOBJECT CODE+instance AdmitChildFONT CODE+instance AdmitChildBASEFONT CODE+instance AdmitChildBR CODE+instance AdmitChildSCRIPT CODE+instance AdmitChildMAP CODE+instance AdmitChildQ CODE+instance AdmitChildSUB CODE+instance AdmitChildSUP CODE+instance AdmitChildSPAN CODE+instance AdmitChildBDO CODE+instance AdmitChildIFRAME CODE+instance AdmitChildINPUT CODE+instance AdmitChildSELECT CODE+instance AdmitChildTEXTAREA CODE+instance AdmitChildLABEL CODE+instance AdmitChildBUTTON CODE++instance AdmitChildCDATA SAMP+instance AdmitChildTT SAMP+instance AdmitChildI SAMP+instance AdmitChildB SAMP+instance AdmitChildU SAMP+instance AdmitChildS SAMP+instance AdmitChildSTRIKE SAMP+instance AdmitChildBIG SAMP+instance AdmitChildSMALL SAMP+instance AdmitChildEM SAMP+instance AdmitChildSTRONG SAMP+instance AdmitChildDFN SAMP+instance AdmitChildCODE SAMP+instance AdmitChildSAMP SAMP+instance AdmitChildKBD SAMP+instance AdmitChildVAR SAMP+instance AdmitChildCITE SAMP+instance AdmitChildABBR SAMP+instance AdmitChildACRONYM SAMP+instance AdmitChildA SAMP+instance AdmitChildIMG SAMP+instance AdmitChildAPPLET SAMP+instance AdmitChildOBJECT SAMP+instance AdmitChildFONT SAMP+instance AdmitChildBASEFONT SAMP+instance AdmitChildBR SAMP+instance AdmitChildSCRIPT SAMP+instance AdmitChildMAP SAMP+instance AdmitChildQ SAMP+instance AdmitChildSUB SAMP+instance AdmitChildSUP SAMP+instance AdmitChildSPAN SAMP+instance AdmitChildBDO SAMP+instance AdmitChildIFRAME SAMP+instance AdmitChildINPUT SAMP+instance AdmitChildSELECT SAMP+instance AdmitChildTEXTAREA SAMP+instance AdmitChildLABEL SAMP+instance AdmitChildBUTTON SAMP++instance AdmitChildCDATA KBD+instance AdmitChildTT KBD+instance AdmitChildI KBD+instance AdmitChildB KBD+instance AdmitChildU KBD+instance AdmitChildS KBD+instance AdmitChildSTRIKE KBD+instance AdmitChildBIG KBD+instance AdmitChildSMALL KBD+instance AdmitChildEM KBD+instance AdmitChildSTRONG KBD+instance AdmitChildDFN KBD+instance AdmitChildCODE KBD+instance AdmitChildSAMP KBD+instance AdmitChildKBD KBD+instance AdmitChildVAR KBD+instance AdmitChildCITE KBD+instance AdmitChildABBR KBD+instance AdmitChildACRONYM KBD+instance AdmitChildA KBD+instance AdmitChildIMG KBD+instance AdmitChildAPPLET KBD+instance AdmitChildOBJECT KBD+instance AdmitChildFONT KBD+instance AdmitChildBASEFONT KBD+instance AdmitChildBR KBD+instance AdmitChildSCRIPT KBD+instance AdmitChildMAP KBD+instance AdmitChildQ KBD+instance AdmitChildSUB KBD+instance AdmitChildSUP KBD+instance AdmitChildSPAN KBD+instance AdmitChildBDO KBD+instance AdmitChildIFRAME KBD+instance AdmitChildINPUT KBD+instance AdmitChildSELECT KBD+instance AdmitChildTEXTAREA KBD+instance AdmitChildLABEL KBD+instance AdmitChildBUTTON KBD++instance AdmitChildCDATA VAR+instance AdmitChildTT VAR+instance AdmitChildI VAR+instance AdmitChildB VAR+instance AdmitChildU VAR+instance AdmitChildS VAR+instance AdmitChildSTRIKE VAR+instance AdmitChildBIG VAR+instance AdmitChildSMALL VAR+instance AdmitChildEM VAR+instance AdmitChildSTRONG VAR+instance AdmitChildDFN VAR+instance AdmitChildCODE VAR+instance AdmitChildSAMP VAR+instance AdmitChildKBD VAR+instance AdmitChildVAR VAR+instance AdmitChildCITE VAR+instance AdmitChildABBR VAR+instance AdmitChildACRONYM VAR+instance AdmitChildA VAR+instance AdmitChildIMG VAR+instance AdmitChildAPPLET VAR+instance AdmitChildOBJECT VAR+instance AdmitChildFONT VAR+instance AdmitChildBASEFONT VAR+instance AdmitChildBR VAR+instance AdmitChildSCRIPT VAR+instance AdmitChildMAP VAR+instance AdmitChildQ VAR+instance AdmitChildSUB VAR+instance AdmitChildSUP VAR+instance AdmitChildSPAN VAR+instance AdmitChildBDO VAR+instance AdmitChildIFRAME VAR+instance AdmitChildINPUT VAR+instance AdmitChildSELECT VAR+instance AdmitChildTEXTAREA VAR+instance AdmitChildLABEL VAR+instance AdmitChildBUTTON VAR++instance AdmitChildCDATA CITE+instance AdmitChildTT CITE+instance AdmitChildI CITE+instance AdmitChildB CITE+instance AdmitChildU CITE+instance AdmitChildS CITE+instance AdmitChildSTRIKE CITE+instance AdmitChildBIG CITE+instance AdmitChildSMALL CITE+instance AdmitChildEM CITE+instance AdmitChildSTRONG CITE+instance AdmitChildDFN CITE+instance AdmitChildCODE CITE+instance AdmitChildSAMP CITE+instance AdmitChildKBD CITE+instance AdmitChildVAR CITE+instance AdmitChildCITE CITE+instance AdmitChildABBR CITE+instance AdmitChildACRONYM CITE+instance AdmitChildA CITE+instance AdmitChildIMG CITE+instance AdmitChildAPPLET CITE+instance AdmitChildOBJECT CITE+instance AdmitChildFONT CITE+instance AdmitChildBASEFONT CITE+instance AdmitChildBR CITE+instance AdmitChildSCRIPT CITE+instance AdmitChildMAP CITE+instance AdmitChildQ CITE+instance AdmitChildSUB CITE+instance AdmitChildSUP CITE+instance AdmitChildSPAN CITE+instance AdmitChildBDO CITE+instance AdmitChildIFRAME CITE+instance AdmitChildINPUT CITE+instance AdmitChildSELECT CITE+instance AdmitChildTEXTAREA CITE+instance AdmitChildLABEL CITE+instance AdmitChildBUTTON CITE++instance AdmitChildCDATA ABBR+instance AdmitChildTT ABBR+instance AdmitChildI ABBR+instance AdmitChildB ABBR+instance AdmitChildU ABBR+instance AdmitChildS ABBR+instance AdmitChildSTRIKE ABBR+instance AdmitChildBIG ABBR+instance AdmitChildSMALL ABBR+instance AdmitChildEM ABBR+instance AdmitChildSTRONG ABBR+instance AdmitChildDFN ABBR+instance AdmitChildCODE ABBR+instance AdmitChildSAMP ABBR+instance AdmitChildKBD ABBR+instance AdmitChildVAR ABBR+instance AdmitChildCITE ABBR+instance AdmitChildABBR ABBR+instance AdmitChildACRONYM ABBR+instance AdmitChildA ABBR+instance AdmitChildIMG ABBR+instance AdmitChildAPPLET ABBR+instance AdmitChildOBJECT ABBR+instance AdmitChildFONT ABBR+instance AdmitChildBASEFONT ABBR+instance AdmitChildBR ABBR+instance AdmitChildSCRIPT ABBR+instance AdmitChildMAP ABBR+instance AdmitChildQ ABBR+instance AdmitChildSUB ABBR+instance AdmitChildSUP ABBR+instance AdmitChildSPAN ABBR+instance AdmitChildBDO ABBR+instance AdmitChildIFRAME ABBR+instance AdmitChildINPUT ABBR+instance AdmitChildSELECT ABBR+instance AdmitChildTEXTAREA ABBR+instance AdmitChildLABEL ABBR+instance AdmitChildBUTTON ABBR++instance AdmitChildCDATA ACRONYM+instance AdmitChildTT ACRONYM+instance AdmitChildI ACRONYM+instance AdmitChildB ACRONYM+instance AdmitChildU ACRONYM+instance AdmitChildS ACRONYM+instance AdmitChildSTRIKE ACRONYM+instance AdmitChildBIG ACRONYM+instance AdmitChildSMALL ACRONYM+instance AdmitChildEM ACRONYM+instance AdmitChildSTRONG ACRONYM+instance AdmitChildDFN ACRONYM+instance AdmitChildCODE ACRONYM+instance AdmitChildSAMP ACRONYM+instance AdmitChildKBD ACRONYM+instance AdmitChildVAR ACRONYM+instance AdmitChildCITE ACRONYM+instance AdmitChildABBR ACRONYM+instance AdmitChildACRONYM ACRONYM+instance AdmitChildA ACRONYM+instance AdmitChildIMG ACRONYM+instance AdmitChildAPPLET ACRONYM+instance AdmitChildOBJECT ACRONYM+instance AdmitChildFONT ACRONYM+instance AdmitChildBASEFONT ACRONYM+instance AdmitChildBR ACRONYM+instance AdmitChildSCRIPT ACRONYM+instance AdmitChildMAP ACRONYM+instance AdmitChildQ ACRONYM+instance AdmitChildSUB ACRONYM+instance AdmitChildSUP ACRONYM+instance AdmitChildSPAN ACRONYM+instance AdmitChildBDO ACRONYM+instance AdmitChildIFRAME ACRONYM+instance AdmitChildINPUT ACRONYM+instance AdmitChildSELECT ACRONYM+instance AdmitChildTEXTAREA ACRONYM+instance AdmitChildLABEL ACRONYM+instance AdmitChildBUTTON ACRONYM+data ALIGN_bottom = ALIGN_bottom+data ALIGN_center = ALIGN_center+data ALIGN_char = ALIGN_char+data ALIGN_justify = ALIGN_justify+data ALIGN_left = ALIGN_left+data ALIGN_middle = ALIGN_middle+data ALIGN_right = ALIGN_right+data ALIGN_top = ALIGN_top+data CHECKED_checked = CHECKED_checked+data CLEAR_all = CLEAR_all+data CLEAR_left = CLEAR_left+data CLEAR_none = CLEAR_none+data CLEAR_right = CLEAR_right+data COMPACT_compact = COMPACT_compact+data DECLARE_declare = DECLARE_declare+data DEFER_defer = DEFER_defer+data DIR_ltr = DIR_ltr+data DIR_rtl = DIR_rtl+data DISABLED_disabled = DISABLED_disabled+data FRAME_above = FRAME_above+data FRAME_below = FRAME_below+data FRAME_border = FRAME_border+data FRAME_box = FRAME_box+data FRAME_hsides = FRAME_hsides+data FRAME_lhs = FRAME_lhs+data FRAME_rhs = FRAME_rhs+data FRAME_void = FRAME_void+data FRAME_vsides = FRAME_vsides+data ISMAP_ismap = ISMAP_ismap+data METHOD_GET = METHOD_GET+data METHOD_POST = METHOD_POST+data MULTIPLE_multiple = MULTIPLE_multiple+data NOHREF_nohref = NOHREF_nohref+data NORESIZE_noresize = NORESIZE_noresize+data NOSHADE_noshade = NOSHADE_noshade+data NOWRAP_nowrap = NOWRAP_nowrap+data READONLY_readonly = READONLY_readonly+data RULES_all = RULES_all+data RULES_cols = RULES_cols+data RULES_groups = RULES_groups+data RULES_none = RULES_none+data RULES_rows = RULES_rows+data SCOPE_col = SCOPE_col+data SCOPE_colgroup = SCOPE_colgroup+data SCOPE_row = SCOPE_row+data SCOPE_rowgroup = SCOPE_rowgroup+data SCROLLING_auto = SCROLLING_auto+data SCROLLING_no = SCROLLING_no+data SCROLLING_yes = SCROLLING_yes+data SELECTED_selected = SELECTED_selected+data SHAPE_circle = SHAPE_circle+data SHAPE_default' = SHAPE_default'+data SHAPE_poly = SHAPE_poly+data SHAPE_rect = SHAPE_rect+data TYPE_BUTTON = TYPE_BUTTON+data TYPE_CHECKBOX = TYPE_CHECKBOX+data TYPE_FILE = TYPE_FILE+data TYPE_HIDDEN = TYPE_HIDDEN+data TYPE_IMAGE = TYPE_IMAGE+data TYPE_PASSWORD = TYPE_PASSWORD+data TYPE_RADIO = TYPE_RADIO+data TYPE_RESET = TYPE_RESET+data TYPE_SUBMIT = TYPE_SUBMIT+data TYPE_TEXT = TYPE_TEXT+data TYPE_button = TYPE_button+data TYPE_circle = TYPE_circle+data TYPE_disc = TYPE_disc+data TYPE_reset = TYPE_reset+data TYPE_square = TYPE_square+data TYPE_submit = TYPE_submit+data VALIGN_baseline = VALIGN_baseline+data VALIGN_bottom = VALIGN_bottom+data VALIGN_middle = VALIGN_middle+data VALIGN_top = VALIGN_top+data VALUETYPE_DATA = VALUETYPE_DATA+data VALUETYPE_OBJECT = VALUETYPE_OBJECT+data VALUETYPE_REF = VALUETYPE_REF+instance AttrValueABBR Char+instance AttrValueABBR a => AttrValueABBR [a]+instance AttrValueACCEPT Char+instance AttrValueACCEPT a => AttrValueACCEPT [a]+instance AttrValueACCEPT_CHARSET Char+instance AttrValueACCEPT_CHARSET a => AttrValueACCEPT_CHARSET [a]+instance AttrValueACCESSKEY Char+instance AttrValueACCESSKEY a => AttrValueACCESSKEY [a]+instance AttrValueACTION Char+instance AttrValueACTION a => AttrValueACTION [a]+instance AttrValueALIGN ALIGN_bottom+instance AttrValueALIGN ALIGN_center+instance AttrValueALIGN ALIGN_char+instance AttrValueALIGN ALIGN_justify+instance AttrValueALIGN ALIGN_left+instance AttrValueALIGN ALIGN_middle+instance AttrValueALIGN ALIGN_right+instance AttrValueALIGN ALIGN_top+instance AttrValueALINK Char+instance AttrValueALINK a => AttrValueALINK [a]+instance AttrValueALT Char+instance AttrValueALT a => AttrValueALT [a]+instance AttrValueARCHIVE Char+instance AttrValueARCHIVE a => AttrValueARCHIVE [a]+instance AttrValueAXIS Char+instance AttrValueAXIS a => AttrValueAXIS [a]+instance AttrValueBACKGROUND Char+instance AttrValueBACKGROUND a => AttrValueBACKGROUND [a]+instance AttrValueBGCOLOR Char+instance AttrValueBGCOLOR a => AttrValueBGCOLOR [a]+instance AttrValueBORDER Char+instance AttrValueBORDER a => AttrValueBORDER [a]+instance AttrValueCELLPADDING Char+instance AttrValueCELLPADDING a => AttrValueCELLPADDING [a]+instance AttrValueCELLSPACING Char+instance AttrValueCELLSPACING a => AttrValueCELLSPACING [a]+instance AttrValueCHAR Char+instance AttrValueCHAR a => AttrValueCHAR [a]+instance AttrValueCHAROFF Char+instance AttrValueCHAROFF a => AttrValueCHAROFF [a]+instance AttrValueCHARSET Char+instance AttrValueCHARSET a => AttrValueCHARSET [a]+instance AttrValueCHECKED CHECKED_checked+instance AttrValueCITE Char+instance AttrValueCITE a => AttrValueCITE [a]+instance AttrValueCLASS Char+instance AttrValueCLASS a => AttrValueCLASS [a]+instance AttrValueCLASSID Char+instance AttrValueCLASSID a => AttrValueCLASSID [a]+instance AttrValueCLEAR CLEAR_all+instance AttrValueCLEAR CLEAR_left+instance AttrValueCLEAR CLEAR_none+instance AttrValueCLEAR CLEAR_right+instance AttrValueCODE Char+instance AttrValueCODE a => AttrValueCODE [a]+instance AttrValueCODEBASE Char+instance AttrValueCODEBASE a => AttrValueCODEBASE [a]+instance AttrValueCODETYPE Char+instance AttrValueCODETYPE a => AttrValueCODETYPE [a]+instance AttrValueCOLOR Char+instance AttrValueCOLOR a => AttrValueCOLOR [a]+instance AttrValueCOLS Char+instance AttrValueCOLS Int+instance AttrValueCOLS a => AttrValueCOLS [a]+instance AttrValueCOLSPAN Int+instance AttrValueCOMPACT COMPACT_compact+instance AttrValueCONTENT Char+instance AttrValueCONTENT a => AttrValueCONTENT [a]+instance AttrValueCOORDS Char+instance AttrValueCOORDS a => AttrValueCOORDS [a]+instance AttrValueDATA Char+instance AttrValueDATA a => AttrValueDATA [a]+instance AttrValueDATAPAGESIZE Char+instance AttrValueDATAPAGESIZE a => AttrValueDATAPAGESIZE [a]+instance AttrValueDATETIME Char+instance AttrValueDATETIME a => AttrValueDATETIME [a]+instance AttrValueDECLARE DECLARE_declare+instance AttrValueDEFER DEFER_defer+instance AttrValueDIR DIR_ltr+instance AttrValueDIR DIR_rtl+instance AttrValueDISABLED DISABLED_disabled+instance AttrValueENCTYPE Char+instance AttrValueENCTYPE a => AttrValueENCTYPE [a]+instance AttrValueEVENT Char+instance AttrValueEVENT a => AttrValueEVENT [a]+instance AttrValueFACE Char+instance AttrValueFACE a => AttrValueFACE [a]+instance AttrValueFOR Char+instance AttrValueFOR a => AttrValueFOR [a]+instance AttrValueFRAME FRAME_above+instance AttrValueFRAME FRAME_below+instance AttrValueFRAME FRAME_border+instance AttrValueFRAME FRAME_box+instance AttrValueFRAME FRAME_hsides+instance AttrValueFRAME FRAME_lhs+instance AttrValueFRAME FRAME_rhs+instance AttrValueFRAME FRAME_void+instance AttrValueFRAME FRAME_vsides+instance AttrValueFRAMEBORDER Int+instance AttrValueHEADERS Char+instance AttrValueHEADERS a => AttrValueHEADERS [a]+instance AttrValueHEIGHT Char+instance AttrValueHEIGHT a => AttrValueHEIGHT [a]+instance AttrValueHREF Char+instance AttrValueHREF a => AttrValueHREF [a]+instance AttrValueHREFLANG Char+instance AttrValueHREFLANG a => AttrValueHREFLANG [a]+instance AttrValueHSPACE Char+instance AttrValueHSPACE a => AttrValueHSPACE [a]+instance AttrValueHTTP_EQUIV Char+instance AttrValueHTTP_EQUIV a => AttrValueHTTP_EQUIV [a]+instance AttrValueID Char+instance AttrValueID a => AttrValueID [a]+instance AttrValueISMAP ISMAP_ismap+instance AttrValueLABEL Char+instance AttrValueLABEL a => AttrValueLABEL [a]+instance AttrValueLANG Char+instance AttrValueLANG a => AttrValueLANG [a]+instance AttrValueLANGUAGE Char+instance AttrValueLANGUAGE a => AttrValueLANGUAGE [a]+instance AttrValueLINK Char+instance AttrValueLINK a => AttrValueLINK [a]+instance AttrValueLONGDESC Char+instance AttrValueLONGDESC a => AttrValueLONGDESC [a]+instance AttrValueMARGINHEIGHT Char+instance AttrValueMARGINHEIGHT a => AttrValueMARGINHEIGHT [a]+instance AttrValueMARGINWIDTH Char+instance AttrValueMARGINWIDTH a => AttrValueMARGINWIDTH [a]+instance AttrValueMAXLENGTH Int+instance AttrValueMEDIA Char+instance AttrValueMEDIA a => AttrValueMEDIA [a]+instance AttrValueMETHOD METHOD_GET+instance AttrValueMETHOD METHOD_POST+instance AttrValueMULTIPLE MULTIPLE_multiple+instance AttrValueNAME Char+instance AttrValueNAME a => AttrValueNAME [a]+instance AttrValueNOHREF NOHREF_nohref+instance AttrValueNORESIZE NORESIZE_noresize+instance AttrValueNOSHADE NOSHADE_noshade+instance AttrValueNOWRAP NOWRAP_nowrap+instance AttrValueOBJECT Char+instance AttrValueOBJECT a => AttrValueOBJECT [a]+instance AttrValueONBLUR Char+instance AttrValueONBLUR a => AttrValueONBLUR [a]+instance AttrValueONCHANGE Char+instance AttrValueONCHANGE a => AttrValueONCHANGE [a]+instance AttrValueONCLICK Char+instance AttrValueONCLICK a => AttrValueONCLICK [a]+instance AttrValueONDBLCLICK Char+instance AttrValueONDBLCLICK a => AttrValueONDBLCLICK [a]+instance AttrValueONFOCUS Char+instance AttrValueONFOCUS a => AttrValueONFOCUS [a]+instance AttrValueONKEYDOWN Char+instance AttrValueONKEYDOWN a => AttrValueONKEYDOWN [a]+instance AttrValueONKEYPRESS Char+instance AttrValueONKEYPRESS a => AttrValueONKEYPRESS [a]+instance AttrValueONKEYUP Char+instance AttrValueONKEYUP a => AttrValueONKEYUP [a]+instance AttrValueONLOAD Char+instance AttrValueONLOAD a => AttrValueONLOAD [a]+instance AttrValueONMOUSEDOWN Char+instance AttrValueONMOUSEDOWN a => AttrValueONMOUSEDOWN [a]+instance AttrValueONMOUSEMOVE Char+instance AttrValueONMOUSEMOVE a => AttrValueONMOUSEMOVE [a]+instance AttrValueONMOUSEOUT Char+instance AttrValueONMOUSEOUT a => AttrValueONMOUSEOUT [a]+instance AttrValueONMOUSEOVER Char+instance AttrValueONMOUSEOVER a => AttrValueONMOUSEOVER [a]+instance AttrValueONMOUSEUP Char+instance AttrValueONMOUSEUP a => AttrValueONMOUSEUP [a]+instance AttrValueONRESET Char+instance AttrValueONRESET a => AttrValueONRESET [a]+instance AttrValueONSELECT Char+instance AttrValueONSELECT a => AttrValueONSELECT [a]+instance AttrValueONSUBMIT Char+instance AttrValueONSUBMIT a => AttrValueONSUBMIT [a]+instance AttrValueONUNLOAD Char+instance AttrValueONUNLOAD a => AttrValueONUNLOAD [a]+instance AttrValuePROFILE Char+instance AttrValuePROFILE a => AttrValuePROFILE [a]+instance AttrValuePROMPT Char+instance AttrValuePROMPT a => AttrValuePROMPT [a]+instance AttrValueREADONLY READONLY_readonly+instance AttrValueREL Char+instance AttrValueREL a => AttrValueREL [a]+instance AttrValueREV Char+instance AttrValueREV a => AttrValueREV [a]+instance AttrValueROWS Char+instance AttrValueROWS Int+instance AttrValueROWS a => AttrValueROWS [a]+instance AttrValueROWSPAN Int+instance AttrValueRULES RULES_all+instance AttrValueRULES RULES_cols+instance AttrValueRULES RULES_groups+instance AttrValueRULES RULES_none+instance AttrValueRULES RULES_rows+instance AttrValueSCHEME Char+instance AttrValueSCHEME a => AttrValueSCHEME [a]+instance AttrValueSCOPE SCOPE_col+instance AttrValueSCOPE SCOPE_colgroup+instance AttrValueSCOPE SCOPE_row+instance AttrValueSCOPE SCOPE_rowgroup+instance AttrValueSCROLLING SCROLLING_auto+instance AttrValueSCROLLING SCROLLING_no+instance AttrValueSCROLLING SCROLLING_yes+instance AttrValueSELECTED SELECTED_selected+instance AttrValueSHAPE SHAPE_circle+instance AttrValueSHAPE SHAPE_default'+instance AttrValueSHAPE SHAPE_poly+instance AttrValueSHAPE SHAPE_rect+instance AttrValueSIZE Char+instance AttrValueSIZE Int+instance AttrValueSIZE a => AttrValueSIZE [a]+instance AttrValueSPAN Int+instance AttrValueSRC Char+instance AttrValueSRC a => AttrValueSRC [a]+instance AttrValueSTANDBY Char+instance AttrValueSTANDBY a => AttrValueSTANDBY [a]+instance AttrValueSTART Int+instance AttrValueSTYLE Char+instance AttrValueSTYLE a => AttrValueSTYLE [a]+instance AttrValueSUMMARY Char+instance AttrValueSUMMARY a => AttrValueSUMMARY [a]+instance AttrValueTABINDEX Int+instance AttrValueTARGET Char+instance AttrValueTARGET a => AttrValueTARGET [a]+instance AttrValueTEXT Char+instance AttrValueTEXT a => AttrValueTEXT [a]+instance AttrValueTITLE Char+instance AttrValueTITLE a => AttrValueTITLE [a]+instance AttrValueTYPE Char+instance AttrValueTYPE TYPE_BUTTON+instance AttrValueTYPE TYPE_CHECKBOX+instance AttrValueTYPE TYPE_FILE+instance AttrValueTYPE TYPE_HIDDEN+instance AttrValueTYPE TYPE_IMAGE+instance AttrValueTYPE TYPE_PASSWORD+instance AttrValueTYPE TYPE_RADIO+instance AttrValueTYPE TYPE_RESET+instance AttrValueTYPE TYPE_SUBMIT+instance AttrValueTYPE TYPE_TEXT+instance AttrValueTYPE TYPE_button+instance AttrValueTYPE TYPE_circle+instance AttrValueTYPE TYPE_disc+instance AttrValueTYPE TYPE_reset+instance AttrValueTYPE TYPE_square+instance AttrValueTYPE TYPE_submit+instance AttrValueTYPE a => AttrValueTYPE [a]+instance AttrValueUSEMAP Char+instance AttrValueUSEMAP a => AttrValueUSEMAP [a]+instance AttrValueVALIGN VALIGN_baseline+instance AttrValueVALIGN VALIGN_bottom+instance AttrValueVALIGN VALIGN_middle+instance AttrValueVALIGN VALIGN_top+instance AttrValueVALUE Char+instance AttrValueVALUE Int+instance AttrValueVALUE a => AttrValueVALUE [a]+instance AttrValueVALUETYPE VALUETYPE_DATA+instance AttrValueVALUETYPE VALUETYPE_OBJECT+instance AttrValueVALUETYPE VALUETYPE_REF+instance AttrValueVERSION Char+instance AttrValueVERSION a => AttrValueVERSION [a]+instance AttrValueVLINK Char+instance AttrValueVLINK a => AttrValueVLINK [a]+instance AttrValueVSPACE Char+instance AttrValueVSPACE a => AttrValueVSPACE [a]+instance AttrValueWIDTH Char+instance AttrValueWIDTH Int+instance AttrValueWIDTH a => AttrValueWIDTH [a]+instance Show ALIGN_bottom where show ALIGN_bottom = "bottom"+instance Show ALIGN_center where show ALIGN_center = "center"+instance Show ALIGN_char where show ALIGN_char = "char"+instance Show ALIGN_justify where show ALIGN_justify = "justify"+instance Show ALIGN_left where show ALIGN_left = "left"+instance Show ALIGN_middle where show ALIGN_middle = "middle"+instance Show ALIGN_right where show ALIGN_right = "right"+instance Show ALIGN_top where show ALIGN_top = "top"+instance Show CHECKED_checked where show CHECKED_checked = "checked"+instance Show CLEAR_all where show CLEAR_all = "all"+instance Show CLEAR_left where show CLEAR_left = "left"+instance Show CLEAR_none where show CLEAR_none = "none"+instance Show CLEAR_right where show CLEAR_right = "right"+instance Show COMPACT_compact where show COMPACT_compact = "compact"+instance Show DECLARE_declare where show DECLARE_declare = "declare"+instance Show DEFER_defer where show DEFER_defer = "defer"+instance Show DIR_ltr where show DIR_ltr = "ltr"+instance Show DIR_rtl where show DIR_rtl = "rtl"+instance Show DISABLED_disabled where show DISABLED_disabled = "disabled"+instance Show FRAME_above where show FRAME_above = "above"+instance Show FRAME_below where show FRAME_below = "below"+instance Show FRAME_border where show FRAME_border = "border"+instance Show FRAME_box where show FRAME_box = "box"+instance Show FRAME_hsides where show FRAME_hsides = "hsides"+instance Show FRAME_lhs where show FRAME_lhs = "lhs"+instance Show FRAME_rhs where show FRAME_rhs = "rhs"+instance Show FRAME_void where show FRAME_void = "void"+instance Show FRAME_vsides where show FRAME_vsides = "vsides"+instance Show ISMAP_ismap where show ISMAP_ismap = "ismap"+instance Show METHOD_GET where show METHOD_GET = "GET"+instance Show METHOD_POST where show METHOD_POST = "POST"+instance Show MULTIPLE_multiple where show MULTIPLE_multiple = "multiple"+instance Show NOHREF_nohref where show NOHREF_nohref = "nohref"+instance Show NORESIZE_noresize where show NORESIZE_noresize = "noresize"+instance Show NOSHADE_noshade where show NOSHADE_noshade = "noshade"+instance Show NOWRAP_nowrap where show NOWRAP_nowrap = "nowrap"+instance Show READONLY_readonly where show READONLY_readonly = "readonly"+instance Show RULES_all where show RULES_all = "all"+instance Show RULES_cols where show RULES_cols = "cols"+instance Show RULES_groups where show RULES_groups = "groups"+instance Show RULES_none where show RULES_none = "none"+instance Show RULES_rows where show RULES_rows = "rows"+instance Show SCOPE_col where show SCOPE_col = "col"+instance Show SCOPE_colgroup where show SCOPE_colgroup = "colgroup"+instance Show SCOPE_row where show SCOPE_row = "row"+instance Show SCOPE_rowgroup where show SCOPE_rowgroup = "rowgroup"+instance Show SCROLLING_auto where show SCROLLING_auto = "auto"+instance Show SCROLLING_no where show SCROLLING_no = "no"+instance Show SCROLLING_yes where show SCROLLING_yes = "yes"+instance Show SELECTED_selected where show SELECTED_selected = "selected"+instance Show SHAPE_circle where show SHAPE_circle = "circle"+instance Show SHAPE_default' where show SHAPE_default' = "default"+instance Show SHAPE_poly where show SHAPE_poly = "poly"+instance Show SHAPE_rect where show SHAPE_rect = "rect"+instance Show TYPE_BUTTON where show TYPE_BUTTON = "BUTTON"+instance Show TYPE_CHECKBOX where show TYPE_CHECKBOX = "CHECKBOX"+instance Show TYPE_FILE where show TYPE_FILE = "FILE"+instance Show TYPE_HIDDEN where show TYPE_HIDDEN = "HIDDEN"+instance Show TYPE_IMAGE where show TYPE_IMAGE = "IMAGE"+instance Show TYPE_PASSWORD where show TYPE_PASSWORD = "PASSWORD"+instance Show TYPE_RADIO where show TYPE_RADIO = "RADIO"+instance Show TYPE_RESET where show TYPE_RESET = "RESET"+instance Show TYPE_SUBMIT where show TYPE_SUBMIT = "SUBMIT"+instance Show TYPE_TEXT where show TYPE_TEXT = "TEXT"+instance Show TYPE_button where show TYPE_button = "button"+instance Show TYPE_circle where show TYPE_circle = "circle"+instance Show TYPE_disc where show TYPE_disc = "disc"+instance Show TYPE_reset where show TYPE_reset = "reset"+instance Show TYPE_square where show TYPE_square = "square"+instance Show TYPE_submit where show TYPE_submit = "submit"+instance Show VALIGN_baseline where show VALIGN_baseline = "baseline"+instance Show VALIGN_bottom where show VALIGN_bottom = "bottom"+instance Show VALIGN_middle where show VALIGN_middle = "middle"+instance Show VALIGN_top where show VALIGN_top = "top"+instance Show VALUETYPE_DATA where show VALUETYPE_DATA = "DATA"+instance Show VALUETYPE_OBJECT where show VALUETYPE_OBJECT = "OBJECT"+instance Show VALUETYPE_REF where show VALUETYPE_REF = "REF"+instance AdmitAttrABBR TD+instance AdmitAttrABBR TH+instance AdmitAttrACCEPT INPUT+instance AdmitAttrACCEPT_CHARSET FORM+instance AdmitAttrACCESSKEY A+instance AdmitAttrACCESSKEY AREA+instance AdmitAttrACCESSKEY BUTTON+instance AdmitAttrACCESSKEY INPUT+instance AdmitAttrACCESSKEY LABEL+instance AdmitAttrACCESSKEY LEGEND+instance AdmitAttrACCESSKEY TEXTAREA+instance AdmitAttrACTION FORM+instance AdmitAttrALIGN APPLET+instance AdmitAttrALIGN CAPTION+instance AdmitAttrALIGN COL+instance AdmitAttrALIGN COLGROUP+instance AdmitAttrALIGN DIV+instance AdmitAttrALIGN H1+instance AdmitAttrALIGN H2+instance AdmitAttrALIGN H3+instance AdmitAttrALIGN H4+instance AdmitAttrALIGN H5+instance AdmitAttrALIGN H6+instance AdmitAttrALIGN HR+instance AdmitAttrALIGN IFRAME+instance AdmitAttrALIGN IMG+instance AdmitAttrALIGN INPUT+instance AdmitAttrALIGN LEGEND+instance AdmitAttrALIGN OBJECT+instance AdmitAttrALIGN P+instance AdmitAttrALIGN TABLE+instance AdmitAttrALIGN TBODY+instance AdmitAttrALIGN TD+instance AdmitAttrALIGN TFOOT+instance AdmitAttrALIGN TH+instance AdmitAttrALIGN THEAD+instance AdmitAttrALIGN TR+instance AdmitAttrALINK BODY+instance AdmitAttrALT APPLET+instance AdmitAttrALT AREA+instance AdmitAttrALT IMG+instance AdmitAttrALT INPUT+instance AdmitAttrARCHIVE APPLET+instance AdmitAttrARCHIVE OBJECT+instance AdmitAttrAXIS TD+instance AdmitAttrAXIS TH+instance AdmitAttrBACKGROUND BODY+instance AdmitAttrBGCOLOR BODY+instance AdmitAttrBGCOLOR TABLE+instance AdmitAttrBGCOLOR TD+instance AdmitAttrBGCOLOR TH+instance AdmitAttrBGCOLOR TR+instance AdmitAttrBORDER IMG+instance AdmitAttrBORDER OBJECT+instance AdmitAttrBORDER TABLE+instance AdmitAttrCELLPADDING TABLE+instance AdmitAttrCELLSPACING TABLE+instance AdmitAttrCHAR COL+instance AdmitAttrCHAR COLGROUP+instance AdmitAttrCHAR TBODY+instance AdmitAttrCHAR TD+instance AdmitAttrCHAR TFOOT+instance AdmitAttrCHAR TH+instance AdmitAttrCHAR THEAD+instance AdmitAttrCHAR TR+instance AdmitAttrCHAROFF COL+instance AdmitAttrCHAROFF COLGROUP+instance AdmitAttrCHAROFF TBODY+instance AdmitAttrCHAROFF TD+instance AdmitAttrCHAROFF TFOOT+instance AdmitAttrCHAROFF TH+instance AdmitAttrCHAROFF THEAD+instance AdmitAttrCHAROFF TR+instance AdmitAttrCHARSET A+instance AdmitAttrCHARSET LINK+instance AdmitAttrCHARSET SCRIPT+instance AdmitAttrCHECKED INPUT+instance AdmitAttrCITE BLOCKQUOTE+instance AdmitAttrCITE DEL+instance AdmitAttrCITE INS+instance AdmitAttrCITE Q+instance AdmitAttrCLASS A+instance AdmitAttrCLASS ABBR+instance AdmitAttrCLASS ACRONYM+instance AdmitAttrCLASS ADDRESS+instance AdmitAttrCLASS APPLET+instance AdmitAttrCLASS AREA+instance AdmitAttrCLASS B+instance AdmitAttrCLASS BDO+instance AdmitAttrCLASS BIG+instance AdmitAttrCLASS BLOCKQUOTE+instance AdmitAttrCLASS BODY+instance AdmitAttrCLASS BR+instance AdmitAttrCLASS BUTTON+instance AdmitAttrCLASS CAPTION+instance AdmitAttrCLASS CENTER+instance AdmitAttrCLASS CITE+instance AdmitAttrCLASS CODE+instance AdmitAttrCLASS COL+instance AdmitAttrCLASS COLGROUP+instance AdmitAttrCLASS DD+instance AdmitAttrCLASS DEL+instance AdmitAttrCLASS DFN+instance AdmitAttrCLASS DIR+instance AdmitAttrCLASS DIV+instance AdmitAttrCLASS DL+instance AdmitAttrCLASS DT+instance AdmitAttrCLASS EM+instance AdmitAttrCLASS FIELDSET+instance AdmitAttrCLASS FONT+instance AdmitAttrCLASS FORM+instance AdmitAttrCLASS FRAME+instance AdmitAttrCLASS FRAMESET+instance AdmitAttrCLASS H1+instance AdmitAttrCLASS H2+instance AdmitAttrCLASS H3+instance AdmitAttrCLASS H4+instance AdmitAttrCLASS H5+instance AdmitAttrCLASS H6+instance AdmitAttrCLASS HR+instance AdmitAttrCLASS I+instance AdmitAttrCLASS IFRAME+instance AdmitAttrCLASS IMG+instance AdmitAttrCLASS INPUT+instance AdmitAttrCLASS INS+instance AdmitAttrCLASS ISINDEX+instance AdmitAttrCLASS KBD+instance AdmitAttrCLASS LABEL+instance AdmitAttrCLASS LEGEND+instance AdmitAttrCLASS LI+instance AdmitAttrCLASS LINK+instance AdmitAttrCLASS MAP+instance AdmitAttrCLASS MENU+instance AdmitAttrCLASS NOFRAMES+instance AdmitAttrCLASS NOSCRIPT+instance AdmitAttrCLASS OBJECT+instance AdmitAttrCLASS OL+instance AdmitAttrCLASS OPTGROUP+instance AdmitAttrCLASS OPTION+instance AdmitAttrCLASS P+instance AdmitAttrCLASS PRE+instance AdmitAttrCLASS Q+instance AdmitAttrCLASS S+instance AdmitAttrCLASS SAMP+instance AdmitAttrCLASS SELECT+instance AdmitAttrCLASS SMALL+instance AdmitAttrCLASS SPAN+instance AdmitAttrCLASS STRIKE+instance AdmitAttrCLASS STRONG+instance AdmitAttrCLASS SUB+instance AdmitAttrCLASS SUP+instance AdmitAttrCLASS TABLE+instance AdmitAttrCLASS TBODY+instance AdmitAttrCLASS TD+instance AdmitAttrCLASS TEXTAREA+instance AdmitAttrCLASS TFOOT+instance AdmitAttrCLASS TH+instance AdmitAttrCLASS THEAD+instance AdmitAttrCLASS TR+instance AdmitAttrCLASS TT+instance AdmitAttrCLASS U+instance AdmitAttrCLASS UL+instance AdmitAttrCLASS VAR+instance AdmitAttrCLASSID OBJECT+instance AdmitAttrCLEAR BR+instance AdmitAttrCODE APPLET+instance AdmitAttrCODEBASE APPLET+instance AdmitAttrCODEBASE OBJECT+instance AdmitAttrCODETYPE OBJECT+instance AdmitAttrCOLOR BASEFONT+instance AdmitAttrCOLOR FONT+instance AdmitAttrCOLS FRAMESET+instance AdmitAttrCOLS TEXTAREA+instance AdmitAttrCOLSPAN TD+instance AdmitAttrCOLSPAN TH+instance AdmitAttrCOMPACT DIR+instance AdmitAttrCOMPACT DL+instance AdmitAttrCOMPACT MENU+instance AdmitAttrCOMPACT OL+instance AdmitAttrCOMPACT UL+instance AdmitAttrCONTENT META+instance AdmitAttrCOORDS A+instance AdmitAttrCOORDS AREA+instance AdmitAttrDATA OBJECT+instance AdmitAttrDATAPAGESIZE TABLE+instance AdmitAttrDATETIME DEL+instance AdmitAttrDATETIME INS+instance AdmitAttrDECLARE OBJECT+instance AdmitAttrDEFER SCRIPT+instance AdmitAttrDIR A+instance AdmitAttrDIR ABBR+instance AdmitAttrDIR ACRONYM+instance AdmitAttrDIR ADDRESS+instance AdmitAttrDIR AREA+instance AdmitAttrDIR B+instance AdmitAttrDIR BDO+instance AdmitAttrDIR BIG+instance AdmitAttrDIR BLOCKQUOTE+instance AdmitAttrDIR BODY+instance AdmitAttrDIR BUTTON+instance AdmitAttrDIR CAPTION+instance AdmitAttrDIR CENTER+instance AdmitAttrDIR CITE+instance AdmitAttrDIR CODE+instance AdmitAttrDIR COL+instance AdmitAttrDIR COLGROUP+instance AdmitAttrDIR DD+instance AdmitAttrDIR DEL+instance AdmitAttrDIR DFN+instance AdmitAttrDIR DIR+instance AdmitAttrDIR DIV+instance AdmitAttrDIR DL+instance AdmitAttrDIR DT+instance AdmitAttrDIR EM+instance AdmitAttrDIR FIELDSET+instance AdmitAttrDIR FONT+instance AdmitAttrDIR FORM+instance AdmitAttrDIR H1+instance AdmitAttrDIR H2+instance AdmitAttrDIR H3+instance AdmitAttrDIR H4+instance AdmitAttrDIR H5+instance AdmitAttrDIR H6+instance AdmitAttrDIR HEAD+instance AdmitAttrDIR HR+instance AdmitAttrDIR HTML+instance AdmitAttrDIR I+instance AdmitAttrDIR IMG+instance AdmitAttrDIR INPUT+instance AdmitAttrDIR INS+instance AdmitAttrDIR ISINDEX+instance AdmitAttrDIR KBD+instance AdmitAttrDIR LABEL+instance AdmitAttrDIR LEGEND+instance AdmitAttrDIR LI+instance AdmitAttrDIR LINK+instance AdmitAttrDIR MAP+instance AdmitAttrDIR MENU+instance AdmitAttrDIR META+instance AdmitAttrDIR NOFRAMES+instance AdmitAttrDIR NOSCRIPT+instance AdmitAttrDIR OBJECT+instance AdmitAttrDIR OL+instance AdmitAttrDIR OPTGROUP+instance AdmitAttrDIR OPTION+instance AdmitAttrDIR P+instance AdmitAttrDIR PRE+instance AdmitAttrDIR Q+instance AdmitAttrDIR S+instance AdmitAttrDIR SAMP+instance AdmitAttrDIR SELECT+instance AdmitAttrDIR SMALL+instance AdmitAttrDIR SPAN+instance AdmitAttrDIR STRIKE+instance AdmitAttrDIR STRONG+instance AdmitAttrDIR STYLE+instance AdmitAttrDIR SUB+instance AdmitAttrDIR SUP+instance AdmitAttrDIR TABLE+instance AdmitAttrDIR TBODY+instance AdmitAttrDIR TD+instance AdmitAttrDIR TEXTAREA+instance AdmitAttrDIR TFOOT+instance AdmitAttrDIR TH+instance AdmitAttrDIR THEAD+instance AdmitAttrDIR TITLE+instance AdmitAttrDIR TR+instance AdmitAttrDIR TT+instance AdmitAttrDIR U+instance AdmitAttrDIR UL+instance AdmitAttrDIR VAR+instance AdmitAttrDISABLED BUTTON+instance AdmitAttrDISABLED INPUT+instance AdmitAttrDISABLED OPTGROUP+instance AdmitAttrDISABLED OPTION+instance AdmitAttrDISABLED SELECT+instance AdmitAttrDISABLED TEXTAREA+instance AdmitAttrENCTYPE FORM+instance AdmitAttrEVENT SCRIPT+instance AdmitAttrFACE BASEFONT+instance AdmitAttrFACE FONT+instance AdmitAttrFOR LABEL+instance AdmitAttrFOR SCRIPT+instance AdmitAttrFRAME TABLE+instance AdmitAttrFRAMEBORDER FRAME+instance AdmitAttrFRAMEBORDER IFRAME+instance AdmitAttrHEADERS TD+instance AdmitAttrHEADERS TH+instance AdmitAttrHEIGHT APPLET+instance AdmitAttrHEIGHT IFRAME+instance AdmitAttrHEIGHT IMG+instance AdmitAttrHEIGHT OBJECT+instance AdmitAttrHEIGHT TD+instance AdmitAttrHEIGHT TH+instance AdmitAttrHREF A+instance AdmitAttrHREF AREA+instance AdmitAttrHREF BASE+instance AdmitAttrHREF LINK+instance AdmitAttrHREFLANG A+instance AdmitAttrHREFLANG LINK+instance AdmitAttrHSPACE APPLET+instance AdmitAttrHSPACE IMG+instance AdmitAttrHSPACE OBJECT+instance AdmitAttrHTTP_EQUIV META+instance AdmitAttrID A+instance AdmitAttrID ABBR+instance AdmitAttrID ACRONYM+instance AdmitAttrID ADDRESS+instance AdmitAttrID APPLET+instance AdmitAttrID AREA+instance AdmitAttrID B+instance AdmitAttrID BASEFONT+instance AdmitAttrID BDO+instance AdmitAttrID BIG+instance AdmitAttrID BLOCKQUOTE+instance AdmitAttrID BODY+instance AdmitAttrID BR+instance AdmitAttrID BUTTON+instance AdmitAttrID CAPTION+instance AdmitAttrID CENTER+instance AdmitAttrID CITE+instance AdmitAttrID CODE+instance AdmitAttrID COL+instance AdmitAttrID COLGROUP+instance AdmitAttrID DD+instance AdmitAttrID DEL+instance AdmitAttrID DFN+instance AdmitAttrID DIR+instance AdmitAttrID DIV+instance AdmitAttrID DL+instance AdmitAttrID DT+instance AdmitAttrID EM+instance AdmitAttrID FIELDSET+instance AdmitAttrID FONT+instance AdmitAttrID FORM+instance AdmitAttrID FRAME+instance AdmitAttrID FRAMESET+instance AdmitAttrID H1+instance AdmitAttrID H2+instance AdmitAttrID H3+instance AdmitAttrID H4+instance AdmitAttrID H5+instance AdmitAttrID H6+instance AdmitAttrID HR+instance AdmitAttrID I+instance AdmitAttrID IFRAME+instance AdmitAttrID IMG+instance AdmitAttrID INPUT+instance AdmitAttrID INS+instance AdmitAttrID ISINDEX+instance AdmitAttrID KBD+instance AdmitAttrID LABEL+instance AdmitAttrID LEGEND+instance AdmitAttrID LI+instance AdmitAttrID LINK+instance AdmitAttrID MAP+instance AdmitAttrID MENU+instance AdmitAttrID NOFRAMES+instance AdmitAttrID NOSCRIPT+instance AdmitAttrID OBJECT+instance AdmitAttrID OL+instance AdmitAttrID OPTGROUP+instance AdmitAttrID OPTION+instance AdmitAttrID P+instance AdmitAttrID PARAM+instance AdmitAttrID PRE+instance AdmitAttrID Q+instance AdmitAttrID S+instance AdmitAttrID SAMP+instance AdmitAttrID SELECT+instance AdmitAttrID SMALL+instance AdmitAttrID SPAN+instance AdmitAttrID STRIKE+instance AdmitAttrID STRONG+instance AdmitAttrID SUB+instance AdmitAttrID SUP+instance AdmitAttrID TABLE+instance AdmitAttrID TBODY+instance AdmitAttrID TD+instance AdmitAttrID TEXTAREA+instance AdmitAttrID TFOOT+instance AdmitAttrID TH+instance AdmitAttrID THEAD+instance AdmitAttrID TR+instance AdmitAttrID TT+instance AdmitAttrID U+instance AdmitAttrID UL+instance AdmitAttrID VAR+instance AdmitAttrISMAP IMG+instance AdmitAttrISMAP INPUT+instance AdmitAttrLABEL OPTGROUP+instance AdmitAttrLABEL OPTION+instance AdmitAttrLANG A+instance AdmitAttrLANG ABBR+instance AdmitAttrLANG ACRONYM+instance AdmitAttrLANG ADDRESS+instance AdmitAttrLANG AREA+instance AdmitAttrLANG B+instance AdmitAttrLANG BDO+instance AdmitAttrLANG BIG+instance AdmitAttrLANG BLOCKQUOTE+instance AdmitAttrLANG BODY+instance AdmitAttrLANG BUTTON+instance AdmitAttrLANG CAPTION+instance AdmitAttrLANG CENTER+instance AdmitAttrLANG CITE+instance AdmitAttrLANG CODE+instance AdmitAttrLANG COL+instance AdmitAttrLANG COLGROUP+instance AdmitAttrLANG DD+instance AdmitAttrLANG DEL+instance AdmitAttrLANG DFN+instance AdmitAttrLANG DIR+instance AdmitAttrLANG DIV+instance AdmitAttrLANG DL+instance AdmitAttrLANG DT+instance AdmitAttrLANG EM+instance AdmitAttrLANG FIELDSET+instance AdmitAttrLANG FONT+instance AdmitAttrLANG FORM+instance AdmitAttrLANG H1+instance AdmitAttrLANG H2+instance AdmitAttrLANG H3+instance AdmitAttrLANG H4+instance AdmitAttrLANG H5+instance AdmitAttrLANG H6+instance AdmitAttrLANG HEAD+instance AdmitAttrLANG HR+instance AdmitAttrLANG HTML+instance AdmitAttrLANG I+instance AdmitAttrLANG IMG+instance AdmitAttrLANG INPUT+instance AdmitAttrLANG INS+instance AdmitAttrLANG ISINDEX+instance AdmitAttrLANG KBD+instance AdmitAttrLANG LABEL+instance AdmitAttrLANG LEGEND+instance AdmitAttrLANG LI+instance AdmitAttrLANG LINK+instance AdmitAttrLANG MAP+instance AdmitAttrLANG MENU+instance AdmitAttrLANG META+instance AdmitAttrLANG NOFRAMES+instance AdmitAttrLANG NOSCRIPT+instance AdmitAttrLANG OBJECT+instance AdmitAttrLANG OL+instance AdmitAttrLANG OPTGROUP+instance AdmitAttrLANG OPTION+instance AdmitAttrLANG P+instance AdmitAttrLANG PRE+instance AdmitAttrLANG Q+instance AdmitAttrLANG S+instance AdmitAttrLANG SAMP+instance AdmitAttrLANG SELECT+instance AdmitAttrLANG SMALL+instance AdmitAttrLANG SPAN+instance AdmitAttrLANG STRIKE+instance AdmitAttrLANG STRONG+instance AdmitAttrLANG STYLE+instance AdmitAttrLANG SUB+instance AdmitAttrLANG SUP+instance AdmitAttrLANG TABLE+instance AdmitAttrLANG TBODY+instance AdmitAttrLANG TD+instance AdmitAttrLANG TEXTAREA+instance AdmitAttrLANG TFOOT+instance AdmitAttrLANG TH+instance AdmitAttrLANG THEAD+instance AdmitAttrLANG TITLE+instance AdmitAttrLANG TR+instance AdmitAttrLANG TT+instance AdmitAttrLANG U+instance AdmitAttrLANG UL+instance AdmitAttrLANG VAR+instance AdmitAttrLANGUAGE SCRIPT+instance AdmitAttrLINK BODY+instance AdmitAttrLONGDESC FRAME+instance AdmitAttrLONGDESC IFRAME+instance AdmitAttrLONGDESC IMG+instance AdmitAttrMARGINHEIGHT FRAME+instance AdmitAttrMARGINHEIGHT IFRAME+instance AdmitAttrMARGINWIDTH FRAME+instance AdmitAttrMARGINWIDTH IFRAME+instance AdmitAttrMAXLENGTH INPUT+instance AdmitAttrMEDIA LINK+instance AdmitAttrMEDIA STYLE+instance AdmitAttrMETHOD FORM+instance AdmitAttrMULTIPLE SELECT+instance AdmitAttrNAME A+instance AdmitAttrNAME APPLET+instance AdmitAttrNAME BUTTON+instance AdmitAttrNAME FORM+instance AdmitAttrNAME FRAME+instance AdmitAttrNAME IFRAME+instance AdmitAttrNAME IMG+instance AdmitAttrNAME INPUT+instance AdmitAttrNAME MAP+instance AdmitAttrNAME META+instance AdmitAttrNAME OBJECT+instance AdmitAttrNAME PARAM+instance AdmitAttrNAME SELECT+instance AdmitAttrNAME TEXTAREA+instance AdmitAttrNOHREF AREA+instance AdmitAttrNORESIZE FRAME+instance AdmitAttrNOSHADE HR+instance AdmitAttrNOWRAP TD+instance AdmitAttrNOWRAP TH+instance AdmitAttrOBJECT APPLET+instance AdmitAttrONBLUR A+instance AdmitAttrONBLUR AREA+instance AdmitAttrONBLUR BUTTON+instance AdmitAttrONBLUR INPUT+instance AdmitAttrONBLUR LABEL+instance AdmitAttrONBLUR SELECT+instance AdmitAttrONBLUR TEXTAREA+instance AdmitAttrONCHANGE INPUT+instance AdmitAttrONCHANGE SELECT+instance AdmitAttrONCHANGE TEXTAREA+instance AdmitAttrONCLICK A+instance AdmitAttrONCLICK ABBR+instance AdmitAttrONCLICK ACRONYM+instance AdmitAttrONCLICK ADDRESS+instance AdmitAttrONCLICK AREA+instance AdmitAttrONCLICK B+instance AdmitAttrONCLICK BIG+instance AdmitAttrONCLICK BLOCKQUOTE+instance AdmitAttrONCLICK BODY+instance AdmitAttrONCLICK BUTTON+instance AdmitAttrONCLICK CAPTION+instance AdmitAttrONCLICK CENTER+instance AdmitAttrONCLICK CITE+instance AdmitAttrONCLICK CODE+instance AdmitAttrONCLICK COL+instance AdmitAttrONCLICK COLGROUP+instance AdmitAttrONCLICK DD+instance AdmitAttrONCLICK DEL+instance AdmitAttrONCLICK DFN+instance AdmitAttrONCLICK DIR+instance AdmitAttrONCLICK DIV+instance AdmitAttrONCLICK DL+instance AdmitAttrONCLICK DT+instance AdmitAttrONCLICK EM+instance AdmitAttrONCLICK FIELDSET+instance AdmitAttrONCLICK FORM+instance AdmitAttrONCLICK H1+instance AdmitAttrONCLICK H2+instance AdmitAttrONCLICK H3+instance AdmitAttrONCLICK H4+instance AdmitAttrONCLICK H5+instance AdmitAttrONCLICK H6+instance AdmitAttrONCLICK HR+instance AdmitAttrONCLICK I+instance AdmitAttrONCLICK IMG+instance AdmitAttrONCLICK INPUT+instance AdmitAttrONCLICK INS+instance AdmitAttrONCLICK KBD+instance AdmitAttrONCLICK LABEL+instance AdmitAttrONCLICK LEGEND+instance AdmitAttrONCLICK LI+instance AdmitAttrONCLICK LINK+instance AdmitAttrONCLICK MAP+instance AdmitAttrONCLICK MENU+instance AdmitAttrONCLICK NOFRAMES+instance AdmitAttrONCLICK NOSCRIPT+instance AdmitAttrONCLICK OBJECT+instance AdmitAttrONCLICK OL+instance AdmitAttrONCLICK OPTGROUP+instance AdmitAttrONCLICK OPTION+instance AdmitAttrONCLICK P+instance AdmitAttrONCLICK PRE+instance AdmitAttrONCLICK Q+instance AdmitAttrONCLICK S+instance AdmitAttrONCLICK SAMP+instance AdmitAttrONCLICK SELECT+instance AdmitAttrONCLICK SMALL+instance AdmitAttrONCLICK SPAN+instance AdmitAttrONCLICK STRIKE+instance AdmitAttrONCLICK STRONG+instance AdmitAttrONCLICK SUB+instance AdmitAttrONCLICK SUP+instance AdmitAttrONCLICK TABLE+instance AdmitAttrONCLICK TBODY+instance AdmitAttrONCLICK TD+instance AdmitAttrONCLICK TEXTAREA+instance AdmitAttrONCLICK TFOOT+instance AdmitAttrONCLICK TH+instance AdmitAttrONCLICK THEAD+instance AdmitAttrONCLICK TR+instance AdmitAttrONCLICK TT+instance AdmitAttrONCLICK U+instance AdmitAttrONCLICK UL+instance AdmitAttrONCLICK VAR+instance AdmitAttrONDBLCLICK A+instance AdmitAttrONDBLCLICK ABBR+instance AdmitAttrONDBLCLICK ACRONYM+instance AdmitAttrONDBLCLICK ADDRESS+instance AdmitAttrONDBLCLICK AREA+instance AdmitAttrONDBLCLICK B+instance AdmitAttrONDBLCLICK BIG+instance AdmitAttrONDBLCLICK BLOCKQUOTE+instance AdmitAttrONDBLCLICK BODY+instance AdmitAttrONDBLCLICK BUTTON+instance AdmitAttrONDBLCLICK CAPTION+instance AdmitAttrONDBLCLICK CENTER+instance AdmitAttrONDBLCLICK CITE+instance AdmitAttrONDBLCLICK CODE+instance AdmitAttrONDBLCLICK COL+instance AdmitAttrONDBLCLICK COLGROUP+instance AdmitAttrONDBLCLICK DD+instance AdmitAttrONDBLCLICK DEL+instance AdmitAttrONDBLCLICK DFN+instance AdmitAttrONDBLCLICK DIR+instance AdmitAttrONDBLCLICK DIV+instance AdmitAttrONDBLCLICK DL+instance AdmitAttrONDBLCLICK DT+instance AdmitAttrONDBLCLICK EM+instance AdmitAttrONDBLCLICK FIELDSET+instance AdmitAttrONDBLCLICK FORM+instance AdmitAttrONDBLCLICK H1+instance AdmitAttrONDBLCLICK H2+instance AdmitAttrONDBLCLICK H3+instance AdmitAttrONDBLCLICK H4+instance AdmitAttrONDBLCLICK H5+instance AdmitAttrONDBLCLICK H6+instance AdmitAttrONDBLCLICK HR+instance AdmitAttrONDBLCLICK I+instance AdmitAttrONDBLCLICK IMG+instance AdmitAttrONDBLCLICK INPUT+instance AdmitAttrONDBLCLICK INS+instance AdmitAttrONDBLCLICK KBD+instance AdmitAttrONDBLCLICK LABEL+instance AdmitAttrONDBLCLICK LEGEND+instance AdmitAttrONDBLCLICK LI+instance AdmitAttrONDBLCLICK LINK+instance AdmitAttrONDBLCLICK MAP+instance AdmitAttrONDBLCLICK MENU+instance AdmitAttrONDBLCLICK NOFRAMES+instance AdmitAttrONDBLCLICK NOSCRIPT+instance AdmitAttrONDBLCLICK OBJECT+instance AdmitAttrONDBLCLICK OL+instance AdmitAttrONDBLCLICK OPTGROUP+instance AdmitAttrONDBLCLICK OPTION+instance AdmitAttrONDBLCLICK P+instance AdmitAttrONDBLCLICK PRE+instance AdmitAttrONDBLCLICK Q+instance AdmitAttrONDBLCLICK S+instance AdmitAttrONDBLCLICK SAMP+instance AdmitAttrONDBLCLICK SELECT+instance AdmitAttrONDBLCLICK SMALL+instance AdmitAttrONDBLCLICK SPAN+instance AdmitAttrONDBLCLICK STRIKE+instance AdmitAttrONDBLCLICK STRONG+instance AdmitAttrONDBLCLICK SUB+instance AdmitAttrONDBLCLICK SUP+instance AdmitAttrONDBLCLICK TABLE+instance AdmitAttrONDBLCLICK TBODY+instance AdmitAttrONDBLCLICK TD+instance AdmitAttrONDBLCLICK TEXTAREA+instance AdmitAttrONDBLCLICK TFOOT+instance AdmitAttrONDBLCLICK TH+instance AdmitAttrONDBLCLICK THEAD+instance AdmitAttrONDBLCLICK TR+instance AdmitAttrONDBLCLICK TT+instance AdmitAttrONDBLCLICK U+instance AdmitAttrONDBLCLICK UL+instance AdmitAttrONDBLCLICK VAR+instance AdmitAttrONFOCUS A+instance AdmitAttrONFOCUS AREA+instance AdmitAttrONFOCUS BUTTON+instance AdmitAttrONFOCUS INPUT+instance AdmitAttrONFOCUS LABEL+instance AdmitAttrONFOCUS SELECT+instance AdmitAttrONFOCUS TEXTAREA+instance AdmitAttrONKEYDOWN A+instance AdmitAttrONKEYDOWN ABBR+instance AdmitAttrONKEYDOWN ACRONYM+instance AdmitAttrONKEYDOWN ADDRESS+instance AdmitAttrONKEYDOWN AREA+instance AdmitAttrONKEYDOWN B+instance AdmitAttrONKEYDOWN BIG+instance AdmitAttrONKEYDOWN BLOCKQUOTE+instance AdmitAttrONKEYDOWN BODY+instance AdmitAttrONKEYDOWN BUTTON+instance AdmitAttrONKEYDOWN CAPTION+instance AdmitAttrONKEYDOWN CENTER+instance AdmitAttrONKEYDOWN CITE+instance AdmitAttrONKEYDOWN CODE+instance AdmitAttrONKEYDOWN COL+instance AdmitAttrONKEYDOWN COLGROUP+instance AdmitAttrONKEYDOWN DD+instance AdmitAttrONKEYDOWN DEL+instance AdmitAttrONKEYDOWN DFN+instance AdmitAttrONKEYDOWN DIR+instance AdmitAttrONKEYDOWN DIV+instance AdmitAttrONKEYDOWN DL+instance AdmitAttrONKEYDOWN DT+instance AdmitAttrONKEYDOWN EM+instance AdmitAttrONKEYDOWN FIELDSET+instance AdmitAttrONKEYDOWN FORM+instance AdmitAttrONKEYDOWN H1+instance AdmitAttrONKEYDOWN H2+instance AdmitAttrONKEYDOWN H3+instance AdmitAttrONKEYDOWN H4+instance AdmitAttrONKEYDOWN H5+instance AdmitAttrONKEYDOWN H6+instance AdmitAttrONKEYDOWN HR+instance AdmitAttrONKEYDOWN I+instance AdmitAttrONKEYDOWN IMG+instance AdmitAttrONKEYDOWN INPUT+instance AdmitAttrONKEYDOWN INS+instance AdmitAttrONKEYDOWN KBD+instance AdmitAttrONKEYDOWN LABEL+instance AdmitAttrONKEYDOWN LEGEND+instance AdmitAttrONKEYDOWN LI+instance AdmitAttrONKEYDOWN LINK+instance AdmitAttrONKEYDOWN MAP+instance AdmitAttrONKEYDOWN MENU+instance AdmitAttrONKEYDOWN NOFRAMES+instance AdmitAttrONKEYDOWN NOSCRIPT+instance AdmitAttrONKEYDOWN OBJECT+instance AdmitAttrONKEYDOWN OL+instance AdmitAttrONKEYDOWN OPTGROUP+instance AdmitAttrONKEYDOWN OPTION+instance AdmitAttrONKEYDOWN P+instance AdmitAttrONKEYDOWN PRE+instance AdmitAttrONKEYDOWN Q+instance AdmitAttrONKEYDOWN S+instance AdmitAttrONKEYDOWN SAMP+instance AdmitAttrONKEYDOWN SELECT+instance AdmitAttrONKEYDOWN SMALL+instance AdmitAttrONKEYDOWN SPAN+instance AdmitAttrONKEYDOWN STRIKE+instance AdmitAttrONKEYDOWN STRONG+instance AdmitAttrONKEYDOWN SUB+instance AdmitAttrONKEYDOWN SUP+instance AdmitAttrONKEYDOWN TABLE+instance AdmitAttrONKEYDOWN TBODY+instance AdmitAttrONKEYDOWN TD+instance AdmitAttrONKEYDOWN TEXTAREA+instance AdmitAttrONKEYDOWN TFOOT+instance AdmitAttrONKEYDOWN TH+instance AdmitAttrONKEYDOWN THEAD+instance AdmitAttrONKEYDOWN TR+instance AdmitAttrONKEYDOWN TT+instance AdmitAttrONKEYDOWN U+instance AdmitAttrONKEYDOWN UL+instance AdmitAttrONKEYDOWN VAR+instance AdmitAttrONKEYPRESS A+instance AdmitAttrONKEYPRESS ABBR+instance AdmitAttrONKEYPRESS ACRONYM+instance AdmitAttrONKEYPRESS ADDRESS+instance AdmitAttrONKEYPRESS AREA+instance AdmitAttrONKEYPRESS B+instance AdmitAttrONKEYPRESS BIG+instance AdmitAttrONKEYPRESS BLOCKQUOTE+instance AdmitAttrONKEYPRESS BODY+instance AdmitAttrONKEYPRESS BUTTON+instance AdmitAttrONKEYPRESS CAPTION+instance AdmitAttrONKEYPRESS CENTER+instance AdmitAttrONKEYPRESS CITE+instance AdmitAttrONKEYPRESS CODE+instance AdmitAttrONKEYPRESS COL+instance AdmitAttrONKEYPRESS COLGROUP+instance AdmitAttrONKEYPRESS DD+instance AdmitAttrONKEYPRESS DEL+instance AdmitAttrONKEYPRESS DFN+instance AdmitAttrONKEYPRESS DIR+instance AdmitAttrONKEYPRESS DIV+instance AdmitAttrONKEYPRESS DL+instance AdmitAttrONKEYPRESS DT+instance AdmitAttrONKEYPRESS EM+instance AdmitAttrONKEYPRESS FIELDSET+instance AdmitAttrONKEYPRESS FORM+instance AdmitAttrONKEYPRESS H1+instance AdmitAttrONKEYPRESS H2+instance AdmitAttrONKEYPRESS H3+instance AdmitAttrONKEYPRESS H4+instance AdmitAttrONKEYPRESS H5+instance AdmitAttrONKEYPRESS H6+instance AdmitAttrONKEYPRESS HR+instance AdmitAttrONKEYPRESS I+instance AdmitAttrONKEYPRESS IMG+instance AdmitAttrONKEYPRESS INPUT+instance AdmitAttrONKEYPRESS INS+instance AdmitAttrONKEYPRESS KBD+instance AdmitAttrONKEYPRESS LABEL+instance AdmitAttrONKEYPRESS LEGEND+instance AdmitAttrONKEYPRESS LI+instance AdmitAttrONKEYPRESS LINK+instance AdmitAttrONKEYPRESS MAP+instance AdmitAttrONKEYPRESS MENU+instance AdmitAttrONKEYPRESS NOFRAMES+instance AdmitAttrONKEYPRESS NOSCRIPT+instance AdmitAttrONKEYPRESS OBJECT+instance AdmitAttrONKEYPRESS OL+instance AdmitAttrONKEYPRESS OPTGROUP+instance AdmitAttrONKEYPRESS OPTION+instance AdmitAttrONKEYPRESS P+instance AdmitAttrONKEYPRESS PRE+instance AdmitAttrONKEYPRESS Q+instance AdmitAttrONKEYPRESS S+instance AdmitAttrONKEYPRESS SAMP+instance AdmitAttrONKEYPRESS SELECT+instance AdmitAttrONKEYPRESS SMALL+instance AdmitAttrONKEYPRESS SPAN+instance AdmitAttrONKEYPRESS STRIKE+instance AdmitAttrONKEYPRESS STRONG+instance AdmitAttrONKEYPRESS SUB+instance AdmitAttrONKEYPRESS SUP+instance AdmitAttrONKEYPRESS TABLE+instance AdmitAttrONKEYPRESS TBODY+instance AdmitAttrONKEYPRESS TD+instance AdmitAttrONKEYPRESS TEXTAREA+instance AdmitAttrONKEYPRESS TFOOT+instance AdmitAttrONKEYPRESS TH+instance AdmitAttrONKEYPRESS THEAD+instance AdmitAttrONKEYPRESS TR+instance AdmitAttrONKEYPRESS TT+instance AdmitAttrONKEYPRESS U+instance AdmitAttrONKEYPRESS UL+instance AdmitAttrONKEYPRESS VAR+instance AdmitAttrONKEYUP A+instance AdmitAttrONKEYUP ABBR+instance AdmitAttrONKEYUP ACRONYM+instance AdmitAttrONKEYUP ADDRESS+instance AdmitAttrONKEYUP AREA+instance AdmitAttrONKEYUP B+instance AdmitAttrONKEYUP BIG+instance AdmitAttrONKEYUP BLOCKQUOTE+instance AdmitAttrONKEYUP BODY+instance AdmitAttrONKEYUP BUTTON+instance AdmitAttrONKEYUP CAPTION+instance AdmitAttrONKEYUP CENTER+instance AdmitAttrONKEYUP CITE+instance AdmitAttrONKEYUP CODE+instance AdmitAttrONKEYUP COL+instance AdmitAttrONKEYUP COLGROUP+instance AdmitAttrONKEYUP DD+instance AdmitAttrONKEYUP DEL+instance AdmitAttrONKEYUP DFN+instance AdmitAttrONKEYUP DIR+instance AdmitAttrONKEYUP DIV+instance AdmitAttrONKEYUP DL+instance AdmitAttrONKEYUP DT+instance AdmitAttrONKEYUP EM+instance AdmitAttrONKEYUP FIELDSET+instance AdmitAttrONKEYUP FORM+instance AdmitAttrONKEYUP H1+instance AdmitAttrONKEYUP H2+instance AdmitAttrONKEYUP H3+instance AdmitAttrONKEYUP H4+instance AdmitAttrONKEYUP H5+instance AdmitAttrONKEYUP H6+instance AdmitAttrONKEYUP HR+instance AdmitAttrONKEYUP I+instance AdmitAttrONKEYUP IMG+instance AdmitAttrONKEYUP INPUT+instance AdmitAttrONKEYUP INS+instance AdmitAttrONKEYUP KBD+instance AdmitAttrONKEYUP LABEL+instance AdmitAttrONKEYUP LEGEND+instance AdmitAttrONKEYUP LI+instance AdmitAttrONKEYUP LINK+instance AdmitAttrONKEYUP MAP+instance AdmitAttrONKEYUP MENU+instance AdmitAttrONKEYUP NOFRAMES+instance AdmitAttrONKEYUP NOSCRIPT+instance AdmitAttrONKEYUP OBJECT+instance AdmitAttrONKEYUP OL+instance AdmitAttrONKEYUP OPTGROUP+instance AdmitAttrONKEYUP OPTION+instance AdmitAttrONKEYUP P+instance AdmitAttrONKEYUP PRE+instance AdmitAttrONKEYUP Q+instance AdmitAttrONKEYUP S+instance AdmitAttrONKEYUP SAMP+instance AdmitAttrONKEYUP SELECT+instance AdmitAttrONKEYUP SMALL+instance AdmitAttrONKEYUP SPAN+instance AdmitAttrONKEYUP STRIKE+instance AdmitAttrONKEYUP STRONG+instance AdmitAttrONKEYUP SUB+instance AdmitAttrONKEYUP SUP+instance AdmitAttrONKEYUP TABLE+instance AdmitAttrONKEYUP TBODY+instance AdmitAttrONKEYUP TD+instance AdmitAttrONKEYUP TEXTAREA+instance AdmitAttrONKEYUP TFOOT+instance AdmitAttrONKEYUP TH+instance AdmitAttrONKEYUP THEAD+instance AdmitAttrONKEYUP TR+instance AdmitAttrONKEYUP TT+instance AdmitAttrONKEYUP U+instance AdmitAttrONKEYUP UL+instance AdmitAttrONKEYUP VAR+instance AdmitAttrONLOAD BODY+instance AdmitAttrONLOAD FRAMESET+instance AdmitAttrONMOUSEDOWN A+instance AdmitAttrONMOUSEDOWN ABBR+instance AdmitAttrONMOUSEDOWN ACRONYM+instance AdmitAttrONMOUSEDOWN ADDRESS+instance AdmitAttrONMOUSEDOWN AREA+instance AdmitAttrONMOUSEDOWN B+instance AdmitAttrONMOUSEDOWN BIG+instance AdmitAttrONMOUSEDOWN BLOCKQUOTE+instance AdmitAttrONMOUSEDOWN BODY+instance AdmitAttrONMOUSEDOWN BUTTON+instance AdmitAttrONMOUSEDOWN CAPTION+instance AdmitAttrONMOUSEDOWN CENTER+instance AdmitAttrONMOUSEDOWN CITE+instance AdmitAttrONMOUSEDOWN CODE+instance AdmitAttrONMOUSEDOWN COL+instance AdmitAttrONMOUSEDOWN COLGROUP+instance AdmitAttrONMOUSEDOWN DD+instance AdmitAttrONMOUSEDOWN DEL+instance AdmitAttrONMOUSEDOWN DFN+instance AdmitAttrONMOUSEDOWN DIR+instance AdmitAttrONMOUSEDOWN DIV+instance AdmitAttrONMOUSEDOWN DL+instance AdmitAttrONMOUSEDOWN DT+instance AdmitAttrONMOUSEDOWN EM+instance AdmitAttrONMOUSEDOWN FIELDSET+instance AdmitAttrONMOUSEDOWN FORM+instance AdmitAttrONMOUSEDOWN H1+instance AdmitAttrONMOUSEDOWN H2+instance AdmitAttrONMOUSEDOWN H3+instance AdmitAttrONMOUSEDOWN H4+instance AdmitAttrONMOUSEDOWN H5+instance AdmitAttrONMOUSEDOWN H6+instance AdmitAttrONMOUSEDOWN HR+instance AdmitAttrONMOUSEDOWN I+instance AdmitAttrONMOUSEDOWN IMG+instance AdmitAttrONMOUSEDOWN INPUT+instance AdmitAttrONMOUSEDOWN INS+instance AdmitAttrONMOUSEDOWN KBD+instance AdmitAttrONMOUSEDOWN LABEL+instance AdmitAttrONMOUSEDOWN LEGEND+instance AdmitAttrONMOUSEDOWN LI+instance AdmitAttrONMOUSEDOWN LINK+instance AdmitAttrONMOUSEDOWN MAP+instance AdmitAttrONMOUSEDOWN MENU+instance AdmitAttrONMOUSEDOWN NOFRAMES+instance AdmitAttrONMOUSEDOWN NOSCRIPT+instance AdmitAttrONMOUSEDOWN OBJECT+instance AdmitAttrONMOUSEDOWN OL+instance AdmitAttrONMOUSEDOWN OPTGROUP+instance AdmitAttrONMOUSEDOWN OPTION+instance AdmitAttrONMOUSEDOWN P+instance AdmitAttrONMOUSEDOWN PRE+instance AdmitAttrONMOUSEDOWN Q+instance AdmitAttrONMOUSEDOWN S+instance AdmitAttrONMOUSEDOWN SAMP+instance AdmitAttrONMOUSEDOWN SELECT+instance AdmitAttrONMOUSEDOWN SMALL+instance AdmitAttrONMOUSEDOWN SPAN+instance AdmitAttrONMOUSEDOWN STRIKE+instance AdmitAttrONMOUSEDOWN STRONG+instance AdmitAttrONMOUSEDOWN SUB+instance AdmitAttrONMOUSEDOWN SUP+instance AdmitAttrONMOUSEDOWN TABLE+instance AdmitAttrONMOUSEDOWN TBODY+instance AdmitAttrONMOUSEDOWN TD+instance AdmitAttrONMOUSEDOWN TEXTAREA+instance AdmitAttrONMOUSEDOWN TFOOT+instance AdmitAttrONMOUSEDOWN TH+instance AdmitAttrONMOUSEDOWN THEAD+instance AdmitAttrONMOUSEDOWN TR+instance AdmitAttrONMOUSEDOWN TT+instance AdmitAttrONMOUSEDOWN U+instance AdmitAttrONMOUSEDOWN UL+instance AdmitAttrONMOUSEDOWN VAR+instance AdmitAttrONMOUSEMOVE A+instance AdmitAttrONMOUSEMOVE ABBR+instance AdmitAttrONMOUSEMOVE ACRONYM+instance AdmitAttrONMOUSEMOVE ADDRESS+instance AdmitAttrONMOUSEMOVE AREA+instance AdmitAttrONMOUSEMOVE B+instance AdmitAttrONMOUSEMOVE BIG+instance AdmitAttrONMOUSEMOVE BLOCKQUOTE+instance AdmitAttrONMOUSEMOVE BODY+instance AdmitAttrONMOUSEMOVE BUTTON+instance AdmitAttrONMOUSEMOVE CAPTION+instance AdmitAttrONMOUSEMOVE CENTER+instance AdmitAttrONMOUSEMOVE CITE+instance AdmitAttrONMOUSEMOVE CODE+instance AdmitAttrONMOUSEMOVE COL+instance AdmitAttrONMOUSEMOVE COLGROUP+instance AdmitAttrONMOUSEMOVE DD+instance AdmitAttrONMOUSEMOVE DEL+instance AdmitAttrONMOUSEMOVE DFN+instance AdmitAttrONMOUSEMOVE DIR+instance AdmitAttrONMOUSEMOVE DIV+instance AdmitAttrONMOUSEMOVE DL+instance AdmitAttrONMOUSEMOVE DT+instance AdmitAttrONMOUSEMOVE EM+instance AdmitAttrONMOUSEMOVE FIELDSET+instance AdmitAttrONMOUSEMOVE FORM+instance AdmitAttrONMOUSEMOVE H1+instance AdmitAttrONMOUSEMOVE H2+instance AdmitAttrONMOUSEMOVE H3+instance AdmitAttrONMOUSEMOVE H4+instance AdmitAttrONMOUSEMOVE H5+instance AdmitAttrONMOUSEMOVE H6+instance AdmitAttrONMOUSEMOVE HR+instance AdmitAttrONMOUSEMOVE I+instance AdmitAttrONMOUSEMOVE IMG+instance AdmitAttrONMOUSEMOVE INPUT+instance AdmitAttrONMOUSEMOVE INS+instance AdmitAttrONMOUSEMOVE KBD+instance AdmitAttrONMOUSEMOVE LABEL+instance AdmitAttrONMOUSEMOVE LEGEND+instance AdmitAttrONMOUSEMOVE LI+instance AdmitAttrONMOUSEMOVE LINK+instance AdmitAttrONMOUSEMOVE MAP+instance AdmitAttrONMOUSEMOVE MENU+instance AdmitAttrONMOUSEMOVE NOFRAMES+instance AdmitAttrONMOUSEMOVE NOSCRIPT+instance AdmitAttrONMOUSEMOVE OBJECT+instance AdmitAttrONMOUSEMOVE OL+instance AdmitAttrONMOUSEMOVE OPTGROUP+instance AdmitAttrONMOUSEMOVE OPTION+instance AdmitAttrONMOUSEMOVE P+instance AdmitAttrONMOUSEMOVE PRE+instance AdmitAttrONMOUSEMOVE Q+instance AdmitAttrONMOUSEMOVE S+instance AdmitAttrONMOUSEMOVE SAMP+instance AdmitAttrONMOUSEMOVE SELECT+instance AdmitAttrONMOUSEMOVE SMALL+instance AdmitAttrONMOUSEMOVE SPAN+instance AdmitAttrONMOUSEMOVE STRIKE+instance AdmitAttrONMOUSEMOVE STRONG+instance AdmitAttrONMOUSEMOVE SUB+instance AdmitAttrONMOUSEMOVE SUP+instance AdmitAttrONMOUSEMOVE TABLE+instance AdmitAttrONMOUSEMOVE TBODY+instance AdmitAttrONMOUSEMOVE TD+instance AdmitAttrONMOUSEMOVE TEXTAREA+instance AdmitAttrONMOUSEMOVE TFOOT+instance AdmitAttrONMOUSEMOVE TH+instance AdmitAttrONMOUSEMOVE THEAD+instance AdmitAttrONMOUSEMOVE TR+instance AdmitAttrONMOUSEMOVE TT+instance AdmitAttrONMOUSEMOVE U+instance AdmitAttrONMOUSEMOVE UL+instance AdmitAttrONMOUSEMOVE VAR+instance AdmitAttrONMOUSEOUT A+instance AdmitAttrONMOUSEOUT ABBR+instance AdmitAttrONMOUSEOUT ACRONYM+instance AdmitAttrONMOUSEOUT ADDRESS+instance AdmitAttrONMOUSEOUT AREA+instance AdmitAttrONMOUSEOUT B+instance AdmitAttrONMOUSEOUT BIG+instance AdmitAttrONMOUSEOUT BLOCKQUOTE+instance AdmitAttrONMOUSEOUT BODY+instance AdmitAttrONMOUSEOUT BUTTON+instance AdmitAttrONMOUSEOUT CAPTION+instance AdmitAttrONMOUSEOUT CENTER+instance AdmitAttrONMOUSEOUT CITE+instance AdmitAttrONMOUSEOUT CODE+instance AdmitAttrONMOUSEOUT COL+instance AdmitAttrONMOUSEOUT COLGROUP+instance AdmitAttrONMOUSEOUT DD+instance AdmitAttrONMOUSEOUT DEL+instance AdmitAttrONMOUSEOUT DFN+instance AdmitAttrONMOUSEOUT DIR+instance AdmitAttrONMOUSEOUT DIV+instance AdmitAttrONMOUSEOUT DL+instance AdmitAttrONMOUSEOUT DT+instance AdmitAttrONMOUSEOUT EM+instance AdmitAttrONMOUSEOUT FIELDSET+instance AdmitAttrONMOUSEOUT FORM+instance AdmitAttrONMOUSEOUT H1+instance AdmitAttrONMOUSEOUT H2+instance AdmitAttrONMOUSEOUT H3+instance AdmitAttrONMOUSEOUT H4+instance AdmitAttrONMOUSEOUT H5+instance AdmitAttrONMOUSEOUT H6+instance AdmitAttrONMOUSEOUT HR+instance AdmitAttrONMOUSEOUT I+instance AdmitAttrONMOUSEOUT IMG+instance AdmitAttrONMOUSEOUT INPUT+instance AdmitAttrONMOUSEOUT INS+instance AdmitAttrONMOUSEOUT KBD+instance AdmitAttrONMOUSEOUT LABEL+instance AdmitAttrONMOUSEOUT LEGEND+instance AdmitAttrONMOUSEOUT LI+instance AdmitAttrONMOUSEOUT LINK+instance AdmitAttrONMOUSEOUT MAP+instance AdmitAttrONMOUSEOUT MENU+instance AdmitAttrONMOUSEOUT NOFRAMES+instance AdmitAttrONMOUSEOUT NOSCRIPT+instance AdmitAttrONMOUSEOUT OBJECT+instance AdmitAttrONMOUSEOUT OL+instance AdmitAttrONMOUSEOUT OPTGROUP+instance AdmitAttrONMOUSEOUT OPTION+instance AdmitAttrONMOUSEOUT P+instance AdmitAttrONMOUSEOUT PRE+instance AdmitAttrONMOUSEOUT Q+instance AdmitAttrONMOUSEOUT S+instance AdmitAttrONMOUSEOUT SAMP+instance AdmitAttrONMOUSEOUT SELECT+instance AdmitAttrONMOUSEOUT SMALL+instance AdmitAttrONMOUSEOUT SPAN+instance AdmitAttrONMOUSEOUT STRIKE+instance AdmitAttrONMOUSEOUT STRONG+instance AdmitAttrONMOUSEOUT SUB+instance AdmitAttrONMOUSEOUT SUP+instance AdmitAttrONMOUSEOUT TABLE+instance AdmitAttrONMOUSEOUT TBODY+instance AdmitAttrONMOUSEOUT TD+instance AdmitAttrONMOUSEOUT TEXTAREA+instance AdmitAttrONMOUSEOUT TFOOT+instance AdmitAttrONMOUSEOUT TH+instance AdmitAttrONMOUSEOUT THEAD+instance AdmitAttrONMOUSEOUT TR+instance AdmitAttrONMOUSEOUT TT+instance AdmitAttrONMOUSEOUT U+instance AdmitAttrONMOUSEOUT UL+instance AdmitAttrONMOUSEOUT VAR+instance AdmitAttrONMOUSEOVER A+instance AdmitAttrONMOUSEOVER ABBR+instance AdmitAttrONMOUSEOVER ACRONYM+instance AdmitAttrONMOUSEOVER ADDRESS+instance AdmitAttrONMOUSEOVER AREA+instance AdmitAttrONMOUSEOVER B+instance AdmitAttrONMOUSEOVER BIG+instance AdmitAttrONMOUSEOVER BLOCKQUOTE+instance AdmitAttrONMOUSEOVER BODY+instance AdmitAttrONMOUSEOVER BUTTON+instance AdmitAttrONMOUSEOVER CAPTION+instance AdmitAttrONMOUSEOVER CENTER+instance AdmitAttrONMOUSEOVER CITE+instance AdmitAttrONMOUSEOVER CODE+instance AdmitAttrONMOUSEOVER COL+instance AdmitAttrONMOUSEOVER COLGROUP+instance AdmitAttrONMOUSEOVER DD+instance AdmitAttrONMOUSEOVER DEL+instance AdmitAttrONMOUSEOVER DFN+instance AdmitAttrONMOUSEOVER DIR+instance AdmitAttrONMOUSEOVER DIV+instance AdmitAttrONMOUSEOVER DL+instance AdmitAttrONMOUSEOVER DT+instance AdmitAttrONMOUSEOVER EM+instance AdmitAttrONMOUSEOVER FIELDSET+instance AdmitAttrONMOUSEOVER FORM+instance AdmitAttrONMOUSEOVER H1+instance AdmitAttrONMOUSEOVER H2+instance AdmitAttrONMOUSEOVER H3+instance AdmitAttrONMOUSEOVER H4+instance AdmitAttrONMOUSEOVER H5+instance AdmitAttrONMOUSEOVER H6+instance AdmitAttrONMOUSEOVER HR+instance AdmitAttrONMOUSEOVER I+instance AdmitAttrONMOUSEOVER IMG+instance AdmitAttrONMOUSEOVER INPUT+instance AdmitAttrONMOUSEOVER INS+instance AdmitAttrONMOUSEOVER KBD+instance AdmitAttrONMOUSEOVER LABEL+instance AdmitAttrONMOUSEOVER LEGEND+instance AdmitAttrONMOUSEOVER LI+instance AdmitAttrONMOUSEOVER LINK+instance AdmitAttrONMOUSEOVER MAP+instance AdmitAttrONMOUSEOVER MENU+instance AdmitAttrONMOUSEOVER NOFRAMES+instance AdmitAttrONMOUSEOVER NOSCRIPT+instance AdmitAttrONMOUSEOVER OBJECT+instance AdmitAttrONMOUSEOVER OL+instance AdmitAttrONMOUSEOVER OPTGROUP+instance AdmitAttrONMOUSEOVER OPTION+instance AdmitAttrONMOUSEOVER P+instance AdmitAttrONMOUSEOVER PRE+instance AdmitAttrONMOUSEOVER Q+instance AdmitAttrONMOUSEOVER S+instance AdmitAttrONMOUSEOVER SAMP+instance AdmitAttrONMOUSEOVER SELECT+instance AdmitAttrONMOUSEOVER SMALL+instance AdmitAttrONMOUSEOVER SPAN+instance AdmitAttrONMOUSEOVER STRIKE+instance AdmitAttrONMOUSEOVER STRONG+instance AdmitAttrONMOUSEOVER SUB+instance AdmitAttrONMOUSEOVER SUP+instance AdmitAttrONMOUSEOVER TABLE+instance AdmitAttrONMOUSEOVER TBODY+instance AdmitAttrONMOUSEOVER TD+instance AdmitAttrONMOUSEOVER TEXTAREA+instance AdmitAttrONMOUSEOVER TFOOT+instance AdmitAttrONMOUSEOVER TH+instance AdmitAttrONMOUSEOVER THEAD+instance AdmitAttrONMOUSEOVER TR+instance AdmitAttrONMOUSEOVER TT+instance AdmitAttrONMOUSEOVER U+instance AdmitAttrONMOUSEOVER UL+instance AdmitAttrONMOUSEOVER VAR+instance AdmitAttrONMOUSEUP A+instance AdmitAttrONMOUSEUP ABBR+instance AdmitAttrONMOUSEUP ACRONYM+instance AdmitAttrONMOUSEUP ADDRESS+instance AdmitAttrONMOUSEUP AREA+instance AdmitAttrONMOUSEUP B+instance AdmitAttrONMOUSEUP BIG+instance AdmitAttrONMOUSEUP BLOCKQUOTE+instance AdmitAttrONMOUSEUP BODY+instance AdmitAttrONMOUSEUP BUTTON+instance AdmitAttrONMOUSEUP CAPTION+instance AdmitAttrONMOUSEUP CENTER+instance AdmitAttrONMOUSEUP CITE+instance AdmitAttrONMOUSEUP CODE+instance AdmitAttrONMOUSEUP COL+instance AdmitAttrONMOUSEUP COLGROUP+instance AdmitAttrONMOUSEUP DD+instance AdmitAttrONMOUSEUP DEL+instance AdmitAttrONMOUSEUP DFN+instance AdmitAttrONMOUSEUP DIR+instance AdmitAttrONMOUSEUP DIV+instance AdmitAttrONMOUSEUP DL+instance AdmitAttrONMOUSEUP DT+instance AdmitAttrONMOUSEUP EM+instance AdmitAttrONMOUSEUP FIELDSET+instance AdmitAttrONMOUSEUP FORM+instance AdmitAttrONMOUSEUP H1+instance AdmitAttrONMOUSEUP H2+instance AdmitAttrONMOUSEUP H3+instance AdmitAttrONMOUSEUP H4+instance AdmitAttrONMOUSEUP H5+instance AdmitAttrONMOUSEUP H6+instance AdmitAttrONMOUSEUP HR+instance AdmitAttrONMOUSEUP I+instance AdmitAttrONMOUSEUP IMG+instance AdmitAttrONMOUSEUP INPUT+instance AdmitAttrONMOUSEUP INS+instance AdmitAttrONMOUSEUP KBD+instance AdmitAttrONMOUSEUP LABEL+instance AdmitAttrONMOUSEUP LEGEND+instance AdmitAttrONMOUSEUP LI+instance AdmitAttrONMOUSEUP LINK+instance AdmitAttrONMOUSEUP MAP+instance AdmitAttrONMOUSEUP MENU+instance AdmitAttrONMOUSEUP NOFRAMES+instance AdmitAttrONMOUSEUP NOSCRIPT+instance AdmitAttrONMOUSEUP OBJECT+instance AdmitAttrONMOUSEUP OL+instance AdmitAttrONMOUSEUP OPTGROUP+instance AdmitAttrONMOUSEUP OPTION+instance AdmitAttrONMOUSEUP P+instance AdmitAttrONMOUSEUP PRE+instance AdmitAttrONMOUSEUP Q+instance AdmitAttrONMOUSEUP S+instance AdmitAttrONMOUSEUP SAMP+instance AdmitAttrONMOUSEUP SELECT+instance AdmitAttrONMOUSEUP SMALL+instance AdmitAttrONMOUSEUP SPAN+instance AdmitAttrONMOUSEUP STRIKE+instance AdmitAttrONMOUSEUP STRONG+instance AdmitAttrONMOUSEUP SUB+instance AdmitAttrONMOUSEUP SUP+instance AdmitAttrONMOUSEUP TABLE+instance AdmitAttrONMOUSEUP TBODY+instance AdmitAttrONMOUSEUP TD+instance AdmitAttrONMOUSEUP TEXTAREA+instance AdmitAttrONMOUSEUP TFOOT+instance AdmitAttrONMOUSEUP TH+instance AdmitAttrONMOUSEUP THEAD+instance AdmitAttrONMOUSEUP TR+instance AdmitAttrONMOUSEUP TT+instance AdmitAttrONMOUSEUP U+instance AdmitAttrONMOUSEUP UL+instance AdmitAttrONMOUSEUP VAR+instance AdmitAttrONRESET FORM+instance AdmitAttrONSELECT INPUT+instance AdmitAttrONSELECT TEXTAREA+instance AdmitAttrONSUBMIT FORM+instance AdmitAttrONUNLOAD BODY+instance AdmitAttrONUNLOAD FRAMESET+instance AdmitAttrPROFILE HEAD+instance AdmitAttrPROMPT ISINDEX+instance AdmitAttrREADONLY INPUT+instance AdmitAttrREADONLY TEXTAREA+instance AdmitAttrREL A+instance AdmitAttrREL LINK+instance AdmitAttrREV A+instance AdmitAttrREV LINK+instance AdmitAttrROWS FRAMESET+instance AdmitAttrROWS TEXTAREA+instance AdmitAttrROWSPAN TD+instance AdmitAttrROWSPAN TH+instance AdmitAttrRULES TABLE+instance AdmitAttrSCHEME META+instance AdmitAttrSCOPE TD+instance AdmitAttrSCOPE TH+instance AdmitAttrSCROLLING FRAME+instance AdmitAttrSCROLLING IFRAME+instance AdmitAttrSELECTED OPTION+instance AdmitAttrSHAPE A+instance AdmitAttrSHAPE AREA+instance AdmitAttrSIZE BASEFONT+instance AdmitAttrSIZE FONT+instance AdmitAttrSIZE HR+instance AdmitAttrSIZE INPUT+instance AdmitAttrSIZE SELECT+instance AdmitAttrSPAN COL+instance AdmitAttrSPAN COLGROUP+instance AdmitAttrSRC FRAME+instance AdmitAttrSRC IFRAME+instance AdmitAttrSRC IMG+instance AdmitAttrSRC INPUT+instance AdmitAttrSRC SCRIPT+instance AdmitAttrSTANDBY OBJECT+instance AdmitAttrSTART OL+instance AdmitAttrSTYLE A+instance AdmitAttrSTYLE ABBR+instance AdmitAttrSTYLE ACRONYM+instance AdmitAttrSTYLE ADDRESS+instance AdmitAttrSTYLE APPLET+instance AdmitAttrSTYLE AREA+instance AdmitAttrSTYLE B+instance AdmitAttrSTYLE BDO+instance AdmitAttrSTYLE BIG+instance AdmitAttrSTYLE BLOCKQUOTE+instance AdmitAttrSTYLE BODY+instance AdmitAttrSTYLE BR+instance AdmitAttrSTYLE BUTTON+instance AdmitAttrSTYLE CAPTION+instance AdmitAttrSTYLE CENTER+instance AdmitAttrSTYLE CITE+instance AdmitAttrSTYLE CODE+instance AdmitAttrSTYLE COL+instance AdmitAttrSTYLE COLGROUP+instance AdmitAttrSTYLE DD+instance AdmitAttrSTYLE DEL+instance AdmitAttrSTYLE DFN+instance AdmitAttrSTYLE DIR+instance AdmitAttrSTYLE DIV+instance AdmitAttrSTYLE DL+instance AdmitAttrSTYLE DT+instance AdmitAttrSTYLE EM+instance AdmitAttrSTYLE FIELDSET+instance AdmitAttrSTYLE FONT+instance AdmitAttrSTYLE FORM+instance AdmitAttrSTYLE FRAME+instance AdmitAttrSTYLE FRAMESET+instance AdmitAttrSTYLE H1+instance AdmitAttrSTYLE H2+instance AdmitAttrSTYLE H3+instance AdmitAttrSTYLE H4+instance AdmitAttrSTYLE H5+instance AdmitAttrSTYLE H6+instance AdmitAttrSTYLE HR+instance AdmitAttrSTYLE I+instance AdmitAttrSTYLE IFRAME+instance AdmitAttrSTYLE IMG+instance AdmitAttrSTYLE INPUT+instance AdmitAttrSTYLE INS+instance AdmitAttrSTYLE ISINDEX+instance AdmitAttrSTYLE KBD+instance AdmitAttrSTYLE LABEL+instance AdmitAttrSTYLE LEGEND+instance AdmitAttrSTYLE LI+instance AdmitAttrSTYLE LINK+instance AdmitAttrSTYLE MAP+instance AdmitAttrSTYLE MENU+instance AdmitAttrSTYLE NOFRAMES+instance AdmitAttrSTYLE NOSCRIPT+instance AdmitAttrSTYLE OBJECT+instance AdmitAttrSTYLE OL+instance AdmitAttrSTYLE OPTGROUP+instance AdmitAttrSTYLE OPTION+instance AdmitAttrSTYLE P+instance AdmitAttrSTYLE PRE+instance AdmitAttrSTYLE Q+instance AdmitAttrSTYLE S+instance AdmitAttrSTYLE SAMP+instance AdmitAttrSTYLE SELECT+instance AdmitAttrSTYLE SMALL+instance AdmitAttrSTYLE SPAN+instance AdmitAttrSTYLE STRIKE+instance AdmitAttrSTYLE STRONG+instance AdmitAttrSTYLE SUB+instance AdmitAttrSTYLE SUP+instance AdmitAttrSTYLE TABLE+instance AdmitAttrSTYLE TBODY+instance AdmitAttrSTYLE TD+instance AdmitAttrSTYLE TEXTAREA+instance AdmitAttrSTYLE TFOOT+instance AdmitAttrSTYLE TH+instance AdmitAttrSTYLE THEAD+instance AdmitAttrSTYLE TR+instance AdmitAttrSTYLE TT+instance AdmitAttrSTYLE U+instance AdmitAttrSTYLE UL+instance AdmitAttrSTYLE VAR+instance AdmitAttrSUMMARY TABLE+instance AdmitAttrTABINDEX A+instance AdmitAttrTABINDEX AREA+instance AdmitAttrTABINDEX BUTTON+instance AdmitAttrTABINDEX INPUT+instance AdmitAttrTABINDEX OBJECT+instance AdmitAttrTABINDEX SELECT+instance AdmitAttrTABINDEX TEXTAREA+instance AdmitAttrTARGET A+instance AdmitAttrTARGET AREA+instance AdmitAttrTARGET BASE+instance AdmitAttrTARGET FORM+instance AdmitAttrTARGET LINK+instance AdmitAttrTEXT BODY+instance AdmitAttrTITLE A+instance AdmitAttrTITLE ABBR+instance AdmitAttrTITLE ACRONYM+instance AdmitAttrTITLE ADDRESS+instance AdmitAttrTITLE APPLET+instance AdmitAttrTITLE AREA+instance AdmitAttrTITLE B+instance AdmitAttrTITLE BDO+instance AdmitAttrTITLE BIG+instance AdmitAttrTITLE BLOCKQUOTE+instance AdmitAttrTITLE BODY+instance AdmitAttrTITLE BR+instance AdmitAttrTITLE BUTTON+instance AdmitAttrTITLE CAPTION+instance AdmitAttrTITLE CENTER+instance AdmitAttrTITLE CITE+instance AdmitAttrTITLE CODE+instance AdmitAttrTITLE COL+instance AdmitAttrTITLE COLGROUP+instance AdmitAttrTITLE DD+instance AdmitAttrTITLE DEL+instance AdmitAttrTITLE DFN+instance AdmitAttrTITLE DIR+instance AdmitAttrTITLE DIV+instance AdmitAttrTITLE DL+instance AdmitAttrTITLE DT+instance AdmitAttrTITLE EM+instance AdmitAttrTITLE FIELDSET+instance AdmitAttrTITLE FONT+instance AdmitAttrTITLE FORM+instance AdmitAttrTITLE FRAME+instance AdmitAttrTITLE FRAMESET+instance AdmitAttrTITLE H1+instance AdmitAttrTITLE H2+instance AdmitAttrTITLE H3+instance AdmitAttrTITLE H4+instance AdmitAttrTITLE H5+instance AdmitAttrTITLE H6+instance AdmitAttrTITLE HR+instance AdmitAttrTITLE I+instance AdmitAttrTITLE IFRAME+instance AdmitAttrTITLE IMG+instance AdmitAttrTITLE INPUT+instance AdmitAttrTITLE INS+instance AdmitAttrTITLE ISINDEX+instance AdmitAttrTITLE KBD+instance AdmitAttrTITLE LABEL+instance AdmitAttrTITLE LEGEND+instance AdmitAttrTITLE LI+instance AdmitAttrTITLE LINK+instance AdmitAttrTITLE MAP+instance AdmitAttrTITLE MENU+instance AdmitAttrTITLE NOFRAMES+instance AdmitAttrTITLE NOSCRIPT+instance AdmitAttrTITLE OBJECT+instance AdmitAttrTITLE OL+instance AdmitAttrTITLE OPTGROUP+instance AdmitAttrTITLE OPTION+instance AdmitAttrTITLE P+instance AdmitAttrTITLE PRE+instance AdmitAttrTITLE Q+instance AdmitAttrTITLE S+instance AdmitAttrTITLE SAMP+instance AdmitAttrTITLE SELECT+instance AdmitAttrTITLE SMALL+instance AdmitAttrTITLE SPAN+instance AdmitAttrTITLE STRIKE+instance AdmitAttrTITLE STRONG+instance AdmitAttrTITLE STYLE+instance AdmitAttrTITLE SUB+instance AdmitAttrTITLE SUP+instance AdmitAttrTITLE TABLE+instance AdmitAttrTITLE TBODY+instance AdmitAttrTITLE TD+instance AdmitAttrTITLE TEXTAREA+instance AdmitAttrTITLE TFOOT+instance AdmitAttrTITLE TH+instance AdmitAttrTITLE THEAD+instance AdmitAttrTITLE TR+instance AdmitAttrTITLE TT+instance AdmitAttrTITLE U+instance AdmitAttrTITLE UL+instance AdmitAttrTITLE VAR+instance AdmitAttrTYPE A+instance AdmitAttrTYPE BUTTON+instance AdmitAttrTYPE INPUT+instance AdmitAttrTYPE LI+instance AdmitAttrTYPE LINK+instance AdmitAttrTYPE OBJECT+instance AdmitAttrTYPE OL+instance AdmitAttrTYPE PARAM+instance AdmitAttrTYPE SCRIPT+instance AdmitAttrTYPE STYLE+instance AdmitAttrTYPE UL+instance AdmitAttrUSEMAP IMG+instance AdmitAttrUSEMAP INPUT+instance AdmitAttrUSEMAP OBJECT+instance AdmitAttrVALIGN COL+instance AdmitAttrVALIGN COLGROUP+instance AdmitAttrVALIGN TBODY+instance AdmitAttrVALIGN TD+instance AdmitAttrVALIGN TFOOT+instance AdmitAttrVALIGN TH+instance AdmitAttrVALIGN THEAD+instance AdmitAttrVALIGN TR+instance AdmitAttrVALUE BUTTON+instance AdmitAttrVALUE INPUT+instance AdmitAttrVALUE LI+instance AdmitAttrVALUE OPTION+instance AdmitAttrVALUE PARAM+instance AdmitAttrVALUETYPE PARAM+instance AdmitAttrVERSION HTML+instance AdmitAttrVLINK BODY+instance AdmitAttrVSPACE APPLET+instance AdmitAttrVSPACE IMG+instance AdmitAttrVSPACE OBJECT+instance AdmitAttrWIDTH APPLET+instance AdmitAttrWIDTH COL+instance AdmitAttrWIDTH COLGROUP+instance AdmitAttrWIDTH HR+instance AdmitAttrWIDTH IFRAME+instance AdmitAttrWIDTH IMG+instance AdmitAttrWIDTH OBJECT+instance AdmitAttrWIDTH PRE+instance AdmitAttrWIDTH TABLE+instance AdmitAttrWIDTH TD+instance AdmitAttrWIDTH TH
+ WASH/HTML/HTMLMonadAttrs.hs view
@@ -0,0 +1,250 @@+-- © 2001-2003 Peter Thiemann+-- this file is generated -- do not edit+module WASH.HTML.HTMLMonadAttrs +  (module WASH.HTML.HTMLMonadAttrs,module WASH.HTML.HTMLMonadBase)+  where+import Prelude hiding (id,span)+import WASH.HTML.HTMLMonadBase (attr, WithHTML)+-- end fixed prologue+abbr :: Monad m => String -> WithHTML x m ()+abbr =  attr "abbr"+accept :: Monad m => String -> WithHTML x m ()+accept =  attr "accept"+accept_charset :: Monad m => String -> WithHTML x m ()+accept_charset =  attr "accept-charset"+accesskey :: Monad m => String -> WithHTML x m ()+accesskey =  attr "accesskey"+action :: Monad m => String -> WithHTML x m ()+action =  attr "action"+align :: Monad m => String -> WithHTML x m ()+align =  attr "align"+alink :: Monad m => String -> WithHTML x m ()+alink =  attr "alink"+alt :: Monad m => String -> WithHTML x m ()+alt =  attr "alt"+archive :: Monad m => String -> WithHTML x m ()+archive =  attr "archive"+axis :: Monad m => String -> WithHTML x m ()+axis =  attr "axis"+background :: Monad m => String -> WithHTML x m ()+background =  attr "background"+bgcolor :: Monad m => String -> WithHTML x m ()+bgcolor =  attr "bgcolor"+border :: Monad m => String -> WithHTML x m ()+border =  attr "border"+cellpadding :: Monad m => String -> WithHTML x m ()+cellpadding =  attr "cellpadding"+cellspacing :: Monad m => String -> WithHTML x m ()+cellspacing =  attr "cellspacing"+char :: Monad m => String -> WithHTML x m ()+char =  attr "char"+charoff :: Monad m => String -> WithHTML x m ()+charoff =  attr "charoff"+charset :: Monad m => String -> WithHTML x m ()+charset =  attr "charset"+checked :: Monad m => String -> WithHTML x m ()+checked =  attr "checked"+cite :: Monad m => String -> WithHTML x m ()+cite =  attr "cite"+class' :: Monad m => String -> WithHTML x m ()+class' =  attr "class"+classid :: Monad m => String -> WithHTML x m ()+classid =  attr "classid"+clear :: Monad m => String -> WithHTML x m ()+clear =  attr "clear"+code :: Monad m => String -> WithHTML x m ()+code =  attr "code"+codebase :: Monad m => String -> WithHTML x m ()+codebase =  attr "codebase"+codetype :: Monad m => String -> WithHTML x m ()+codetype =  attr "codetype"+color :: Monad m => String -> WithHTML x m ()+color =  attr "color"+cols :: Monad m => String -> WithHTML x m ()+cols =  attr "cols"+colspan :: Monad m => String -> WithHTML x m ()+colspan =  attr "colspan"+compact :: Monad m => String -> WithHTML x m ()+compact =  attr "compact"+content :: Monad m => String -> WithHTML x m ()+content =  attr "content"+coords :: Monad m => String -> WithHTML x m ()+coords =  attr "coords"+data' :: Monad m => String -> WithHTML x m ()+data' =  attr "data"+datapagesize :: Monad m => String -> WithHTML x m ()+datapagesize =  attr "datapagesize"+datetime :: Monad m => String -> WithHTML x m ()+datetime =  attr "datetime"+declare :: Monad m => String -> WithHTML x m ()+declare =  attr "declare"+defer :: Monad m => String -> WithHTML x m ()+defer =  attr "defer"+dir :: Monad m => String -> WithHTML x m ()+dir =  attr "dir"+disabled :: Monad m => String -> WithHTML x m ()+disabled =  attr "disabled"+enctype :: Monad m => String -> WithHTML x m ()+enctype =  attr "enctype"+event :: Monad m => String -> WithHTML x m ()+event =  attr "event"+face :: Monad m => String -> WithHTML x m ()+face =  attr "face"+for :: Monad m => String -> WithHTML x m ()+for =  attr "for"+frame :: Monad m => String -> WithHTML x m ()+frame =  attr "frame"+frameborder :: Monad m => String -> WithHTML x m ()+frameborder =  attr "frameborder"+headers :: Monad m => String -> WithHTML x m ()+headers =  attr "headers"+height :: Monad m => String -> WithHTML x m ()+height =  attr "height"+href :: Monad m => String -> WithHTML x m ()+href =  attr "href"+hreflang :: Monad m => String -> WithHTML x m ()+hreflang =  attr "hreflang"+hspace :: Monad m => String -> WithHTML x m ()+hspace =  attr "hspace"+http_equiv :: Monad m => String -> WithHTML x m ()+http_equiv =  attr "http-equiv"+id :: Monad m => String -> WithHTML x m ()+id =  attr "id"+ismap :: Monad m => String -> WithHTML x m ()+ismap =  attr "ismap"+label :: Monad m => String -> WithHTML x m ()+label =  attr "label"+lang :: Monad m => String -> WithHTML x m ()+lang =  attr "lang"+language :: Monad m => String -> WithHTML x m ()+language =  attr "language"+link :: Monad m => String -> WithHTML x m ()+link =  attr "link"+longdesc :: Monad m => String -> WithHTML x m ()+longdesc =  attr "longdesc"+marginheight :: Monad m => String -> WithHTML x m ()+marginheight =  attr "marginheight"+marginwidth :: Monad m => String -> WithHTML x m ()+marginwidth =  attr "marginwidth"+maxlength :: Monad m => String -> WithHTML x m ()+maxlength =  attr "maxlength"+media :: Monad m => String -> WithHTML x m ()+media =  attr "media"+method :: Monad m => String -> WithHTML x m ()+method =  attr "method"+multiple :: Monad m => String -> WithHTML x m ()+multiple =  attr "multiple"+name :: Monad m => String -> WithHTML x m ()+name =  attr "name"+nohref :: Monad m => String -> WithHTML x m ()+nohref =  attr "nohref"+noresize :: Monad m => String -> WithHTML x m ()+noresize =  attr "noresize"+noshade :: Monad m => String -> WithHTML x m ()+noshade =  attr "noshade"+nowrap :: Monad m => String -> WithHTML x m ()+nowrap =  attr "nowrap"+object :: Monad m => String -> WithHTML x m ()+object =  attr "object"+onblur :: Monad m => String -> WithHTML x m ()+onblur =  attr "onblur"+onchange :: Monad m => String -> WithHTML x m ()+onchange =  attr "onchange"+onclick :: Monad m => String -> WithHTML x m ()+onclick =  attr "onclick"+ondblclick :: Monad m => String -> WithHTML x m ()+ondblclick =  attr "ondblclick"+onfocus :: Monad m => String -> WithHTML x m ()+onfocus =  attr "onfocus"+onkeydown :: Monad m => String -> WithHTML x m ()+onkeydown =  attr "onkeydown"+onkeypress :: Monad m => String -> WithHTML x m ()+onkeypress =  attr "onkeypress"+onkeyup :: Monad m => String -> WithHTML x m ()+onkeyup =  attr "onkeyup"+onload :: Monad m => String -> WithHTML x m ()+onload =  attr "onload"+onmousedown :: Monad m => String -> WithHTML x m ()+onmousedown =  attr "onmousedown"+onmousemove :: Monad m => String -> WithHTML x m ()+onmousemove =  attr "onmousemove"+onmouseout :: Monad m => String -> WithHTML x m ()+onmouseout =  attr "onmouseout"+onmouseover :: Monad m => String -> WithHTML x m ()+onmouseover =  attr "onmouseover"+onmouseup :: Monad m => String -> WithHTML x m ()+onmouseup =  attr "onmouseup"+onreset :: Monad m => String -> WithHTML x m ()+onreset =  attr "onreset"+onselect :: Monad m => String -> WithHTML x m ()+onselect =  attr "onselect"+onsubmit :: Monad m => String -> WithHTML x m ()+onsubmit =  attr "onsubmit"+onunload :: Monad m => String -> WithHTML x m ()+onunload =  attr "onunload"+profile :: Monad m => String -> WithHTML x m ()+profile =  attr "profile"+prompt :: Monad m => String -> WithHTML x m ()+prompt =  attr "prompt"+readonly :: Monad m => String -> WithHTML x m ()+readonly =  attr "readonly"+rel :: Monad m => String -> WithHTML x m ()+rel =  attr "rel"+rev :: Monad m => String -> WithHTML x m ()+rev =  attr "rev"+rows :: Monad m => String -> WithHTML x m ()+rows =  attr "rows"+rowspan :: Monad m => String -> WithHTML x m ()+rowspan =  attr "rowspan"+rules :: Monad m => String -> WithHTML x m ()+rules =  attr "rules"+scheme :: Monad m => String -> WithHTML x m ()+scheme =  attr "scheme"+scope :: Monad m => String -> WithHTML x m ()+scope =  attr "scope"+scrolling :: Monad m => String -> WithHTML x m ()+scrolling =  attr "scrolling"+selected :: Monad m => String -> WithHTML x m ()+selected =  attr "selected"+shape :: Monad m => String -> WithHTML x m ()+shape =  attr "shape"+size :: Monad m => String -> WithHTML x m ()+size =  attr "size"+span :: Monad m => String -> WithHTML x m ()+span =  attr "span"+src :: Monad m => String -> WithHTML x m ()+src =  attr "src"+standby :: Monad m => String -> WithHTML x m ()+standby =  attr "standby"+start :: Monad m => String -> WithHTML x m ()+start =  attr "start"+style :: Monad m => String -> WithHTML x m ()+style =  attr "style"+summary :: Monad m => String -> WithHTML x m ()+summary =  attr "summary"+tabindex :: Monad m => String -> WithHTML x m ()+tabindex =  attr "tabindex"+target :: Monad m => String -> WithHTML x m ()+target =  attr "target"+text :: Monad m => String -> WithHTML x m ()+text =  attr "text"+title :: Monad m => String -> WithHTML x m ()+title =  attr "title"+type' :: Monad m => String -> WithHTML x m ()+type' =  attr "type"+usemap :: Monad m => String -> WithHTML x m ()+usemap =  attr "usemap"+valign :: Monad m => String -> WithHTML x m ()+valign =  attr "valign"+value :: Monad m => String -> WithHTML x m ()+value =  attr "value"+valuetype :: Monad m => String -> WithHTML x m ()+valuetype =  attr "valuetype"+version :: Monad m => String -> WithHTML x m ()+version =  attr "version"+vlink :: Monad m => String -> WithHTML x m ()+vlink =  attr "vlink"+vspace :: Monad m => String -> WithHTML x m ()+vspace =  attr "vspace"+width :: Monad m => String -> WithHTML x m ()+width =  attr "width"
+ WASH/HTML/HTMLMonadBase.hs view
@@ -0,0 +1,92 @@+-- © 2001, 2002, 2005 Peter Thiemann+module WASH.HTML.HTMLMonadBase+  (module WASH.HTML.HTMLMonadBase, B.ELEMENT_, B.ATTR_, B.attr_name, B.attr_value)+  where+import qualified WASH.HTML.HTMLBase as B+type Element = B.ELEMENT_+type Attributes = [Attribute]+type Attribute = B.ATTR_+data WithHTML x m a =+  WithHTML { unWithHTML :: Element -> m (a, Element) }+type HTMLCons x y m a = WithHTML x m a -> WithHTML y m a+instance Monad m => Monad (WithHTML x m) where+  return a = WithHTML (\elem -> return (a, elem))+  ma >>= f = WithHTML (\elem -> unWithHTML ma elem >>= \(a, elem') ->+                                unWithHTML (f a) elem')+-- contributed by Frederik Eaton <frederik@ofb.net>+--instance MonadFix m => MonadFix (WithHTML x m) where+--  mfix f = WithHTML (\elem ->+--		     mfix (\x -> (unWithHTML (f x)) elem >>= (return.fst))+--		     >>= (\x -> return (x,elem)))+lift :: Monad m => m a -> WithHTML x m a+lift ma = WithHTML (\elem -> ma >>= \a -> return (a, elem))+get_attrs :: Monad m => WithHTML x m Attributes+get_attrs = WithHTML (\elem -> return (B.get_attrs_ elem, elem))+-- | empty node sequence+empty :: Monad m => WithHTML x m ()+empty = return ()+-- | concatenation of sequences+infixl 1 ##+x ## y = x >>= \a -> y >> return a+-- | cleanup of attribute values+av (str@('\"':_)) = let str1 = read str :: String in str1+av str = str+--+addNode add cdata =+  \s -> WithHTML (\elem -> return ((), add elem (cdata s)))+comment, comment_S, comment_T :: Monad m => String -> WithHTML x m ()+comment   = addNode B.add_ B.comment_+comment_S = addNode B.add_ B.comment_S+comment_T = addNode B.add_ B.comment_T+-- | create a text node with all illegal characters properly escaped+text :: Monad m => String -> WithHTML x m ()+text          = addNode B.add_ (B.cdata_ [])+-- | create a text node from any Showable type+showText :: (Monad m, Show a) => a -> WithHTML x m ()+showText x = text (av (show x))+-- | create a text node where the string is dropped into the webpage without+-- change, e.g., preserving entities +rawtext :: Monad m => String -> WithHTML x m ()+rawtext       = addNode B.add_ (B.cdata_ [B.CDATA_ENCODED])+formattedtext :: Monad m => String -> WithHTML x m ()+formattedtext = addNode B.add_ (B.cdata_ [B.CDATA_FORMATTED])+text_S, rawtext_S, formattedtext_S :: Monad m => String -> WithHTML x m ()+text_S          = addNode B.add_ (B.cdata_S [])+rawtext_S       = addNode B.add_ (B.cdata_S [B.CDATA_ENCODED])+formattedtext_S = addNode B.add_ (B.cdata_S [B.CDATA_FORMATTED])+text_T, rawtext_T, formattedtext_T :: Monad m => String -> WithHTML x m ()+text_T          = addNode B.add_ (B.cdata_T [])+rawtext_T       = addNode B.add_ (B.cdata_T [B.CDATA_ENCODED])+formattedtext_T = addNode B.add_ (B.cdata_T [B.CDATA_FORMATTED])+attr :: Monad m => String -> String -> WithHTML x m ()+attr a = addNode B.add_attr_ (B.attr_ a)+attr_SS :: Monad m => String -> String -> WithHTML x m ()+attr_SS a = addNode B.add_attr_ (B.attr_SS a)+attr_TS :: Monad m => String -> String -> WithHTML x m ()+attr_TS a = addNode B.add_attr_ (B.attr_TS a)+attr_TD :: Monad m => String -> String -> WithHTML x m ()+attr_TD a = addNode B.add_attr_ (B.attr_TD a)+attr_SD :: Monad m => String -> String -> WithHTML x m ()+attr_SD a = addNode B.add_attr_ (B.attr_SD a)+(@@) :: Monad m => String -> String -> WithHTML x m ()+a @@ v = attr a v+addMaker subelem ma =+  WithHTML (\elem -> unWithHTML ma subelem >>= \(a, subelem') ->+                     return (a, B.add_ elem subelem'))+mkElement, mkEmpty :: Monad m => String -> HTMLCons x y m a+mkElement tag = addMaker $ B.element_ tag [] []+mkEmpty tag   = addMaker $ B.empty_   tag []+mkElement_S, mkEmpty_S :: Monad m => String -> HTMLCons x y m a+mkElement_S tag = addMaker $ B.element_S tag [] []+mkEmpty_S tag   = addMaker $ B.empty_S   tag []+mkElement_T, mkEmpty_T :: Monad m => String -> HTMLCons x y m a+mkElement_T tag = addMaker $ B.element_T tag [] []+mkEmpty_T tag   = addMaker $ B.empty_T   tag []+build_document :: Monad m => WithHTML x m a -> m Element+build_document ma = unWithHTML ma+  (B.doctype_T +   [ "html"+   , "PUBLIC"+   , "\"-//W3C//DTD XHTML 1.0 Transitional//EN\""+   , "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\""] [])+  >>= \ (a, elem) -> return elem
+ WASH/HTML/HTMLPrelude.hs view
@@ -0,0 +1,5209 @@+{-# OPTIONS -fglasgow-exts #-}+-- © 2001 Peter Thiemann+module WASH.HTML.HTMLPrelude +  (module WASH.HTML.HTMLPrelude,module WASH.HTML.HTMLTypedBase)+  where+import Prelude hiding (div,head,map,span)+import WASH.HTML.HTMLTypedBase+-- identity function+empty x = x+-- reverse function application+( # ) = flip ($)	-- DON'T REMOVE THE SPACES+-- reverse function composition+( ## ) = flip (.)	-- DON'T REMOVE THE SPACES+-- +instance AddTo DOCUMENT HTML+build_document :: (ELT HTML -> ELT HTML) -> ELT DOCUMENT+build_document addToHTML = make DOCUMENT # html addToHTML+-- end fixed prologue+a f elt = elt `add` f (make A)+abbr f elt = elt `add` f (make ABBR)+acronym f elt = elt `add` f (make ACRONYM)+address f elt = elt `add` f (make ADDRESS)+applet f elt = elt `add` f (make APPLET)+area f elt = elt `add` f (make AREA)+b f elt = elt `add` f (make B)+base f elt = elt `add` f (make BASE)+basefont f elt = elt `add` f (make BASEFONT)+bdo f elt = elt `add` f (make BDO)+big f elt = elt `add` f (make BIG)+blockquote f elt = elt `add` f (make BLOCKQUOTE)+body f elt = elt `add` f (make BODY)+br f elt = elt `add` f (make BR)+button f elt = elt `add` f (make BUTTON)+caption f elt = elt `add` f (make CAPTION)+center f elt = elt `add` f (make CENTER)+cite f elt = elt `add` f (make CITE)+code f elt = elt `add` f (make CODE)+col f elt = elt `add` f (make COL)+colgroup f elt = elt `add` f (make COLGROUP)+dd f elt = elt `add` f (make DD)+del f elt = elt `add` f (make DEL)+dfn f elt = elt `add` f (make DFN)+dir f elt = elt `add` f (make DIR)+div f elt = elt `add` f (make DIV)+dl f elt = elt `add` f (make DL)+dt f elt = elt `add` f (make DT)+em f elt = elt `add` f (make EM)+fieldset f elt = elt `add` f (make FIELDSET)+font f elt = elt `add` f (make FONT)+form f elt = elt `add` f (make FORM)+h1 f elt = elt `add` f (make H1)+h2 f elt = elt `add` f (make H2)+h3 f elt = elt `add` f (make H3)+h4 f elt = elt `add` f (make H4)+h5 f elt = elt `add` f (make H5)+h6 f elt = elt `add` f (make H6)+head f elt = elt `add` f (make HEAD)+hr f elt = elt `add` f (make HR)+html f elt = elt `add` f (make HTML)+i f elt = elt `add` f (make I)+iframe f elt = elt `add` f (make IFRAME)+img f elt = elt `add` f (make IMG)+input f elt = elt `add` f (make INPUT)+ins f elt = elt `add` f (make INS)+isindex f elt = elt `add` f (make ISINDEX)+kbd f elt = elt `add` f (make KBD)+label f elt = elt `add` f (make LABEL)+legend f elt = elt `add` f (make LEGEND)+li f elt = elt `add` f (make LI)+link f elt = elt `add` f (make LINK)+map f elt = elt `add` f (make MAP)+menu f elt = elt `add` f (make MENU)+meta f elt = elt `add` f (make META)+noframes f elt = elt `add` f (make NOFRAMES)+noscript f elt = elt `add` f (make NOSCRIPT)+object f elt = elt `add` f (make OBJECT)+ol f elt = elt `add` f (make OL)+optgroup f elt = elt `add` f (make OPTGROUP)+option f elt = elt `add` f (make OPTION)+p f elt = elt `add` f (make P)+param f elt = elt `add` f (make PARAM)+pre f elt = elt `add` f (make PRE)+q f elt = elt `add` f (make Q)+s f elt = elt `add` f (make S)+samp f elt = elt `add` f (make SAMP)+script f elt = elt `add` f (make SCRIPT)+select f elt = elt `add` f (make SELECT)+small f elt = elt `add` f (make SMALL)+span f elt = elt `add` f (make SPAN)+strike f elt = elt `add` f (make STRIKE)+strong f elt = elt `add` f (make STRONG)+style f elt = elt `add` f (make STYLE)+sub f elt = elt `add` f (make SUB)+sup f elt = elt `add` f (make SUP)+table f elt = elt `add` f (make TABLE)+tbody f elt = elt `add` f (make TBODY)+td f elt = elt `add` f (make TD)+textarea f elt = elt `add` f (make TEXTAREA)+tfoot f elt = elt `add` f (make TFOOT)+th f elt = elt `add` f (make TH)+thead f elt = elt `add` f (make THEAD)+title f elt = elt `add` f (make TITLE)+tr f elt = elt `add` f (make TR)+tt f elt = elt `add` f (make TT)+u f elt = elt `add` f (make U)+ul f elt = elt `add` f (make UL)+var f elt = elt `add` f (make VAR)+data A = A+instance Show A where show A = "A"+data ABBR = ABBR+instance Show ABBR where show ABBR = "ABBR"+data ACRONYM = ACRONYM+instance Show ACRONYM where show ACRONYM = "ACRONYM"+data ADDRESS = ADDRESS+instance Show ADDRESS where show ADDRESS = "ADDRESS"+data APPLET = APPLET+instance Show APPLET where show APPLET = "APPLET"+data AREA = AREA+instance Show AREA where show AREA = "AREA"+data B = B+instance Show B where show B = "B"+data BASE = BASE+instance Show BASE where show BASE = "BASE"+data BASEFONT = BASEFONT+instance Show BASEFONT where show BASEFONT = "BASEFONT"+data BDO = BDO+instance Show BDO where show BDO = "BDO"+data BIG = BIG+instance Show BIG where show BIG = "BIG"+data BLOCKQUOTE = BLOCKQUOTE+instance Show BLOCKQUOTE where show BLOCKQUOTE = "BLOCKQUOTE"+data BODY = BODY+instance Show BODY where show BODY = "BODY"+data BR = BR+instance Show BR where show BR = "BR"+data BUTTON = BUTTON+instance Show BUTTON where show BUTTON = "BUTTON"+data CAPTION = CAPTION+instance Show CAPTION where show CAPTION = "CAPTION"+data CENTER = CENTER+instance Show CENTER where show CENTER = "CENTER"+data CITE = CITE+instance Show CITE where show CITE = "CITE"+data CODE = CODE+instance Show CODE where show CODE = "CODE"+data COL = COL+instance Show COL where show COL = "COL"+data COLGROUP = COLGROUP+instance Show COLGROUP where show COLGROUP = "COLGROUP"+data DD = DD+instance Show DD where show DD = "DD"+data DEL = DEL+instance Show DEL where show DEL = "DEL"+data DFN = DFN+instance Show DFN where show DFN = "DFN"+data DIR = DIR+instance Show DIR where show DIR = "DIR"+data DIV = DIV+instance Show DIV where show DIV = "DIV"+data DL = DL+instance Show DL where show DL = "DL"+data DT = DT+instance Show DT where show DT = "DT"+data EM = EM+instance Show EM where show EM = "EM"+data FIELDSET = FIELDSET+instance Show FIELDSET where show FIELDSET = "FIELDSET"+data FONT = FONT+instance Show FONT where show FONT = "FONT"+data FORM = FORM+instance Show FORM where show FORM = "FORM"+data H1 = H1+instance Show H1 where show H1 = "H1"+data H2 = H2+instance Show H2 where show H2 = "H2"+data H3 = H3+instance Show H3 where show H3 = "H3"+data H4 = H4+instance Show H4 where show H4 = "H4"+data H5 = H5+instance Show H5 where show H5 = "H5"+data H6 = H6+instance Show H6 where show H6 = "H6"+data HEAD = HEAD+instance Show HEAD where show HEAD = "HEAD"+data HR = HR+instance Show HR where show HR = "HR"+data HTML = HTML+instance Show HTML where show HTML = "HTML"+data I = I+instance Show I where show I = "I"+data IFRAME = IFRAME+instance Show IFRAME where show IFRAME = "IFRAME"+data IMG = IMG+instance Show IMG where show IMG = "IMG"+data INPUT = INPUT+instance Show INPUT where show INPUT = "INPUT"+data INS = INS+instance Show INS where show INS = "INS"+data ISINDEX = ISINDEX+instance Show ISINDEX where show ISINDEX = "ISINDEX"+data KBD = KBD+instance Show KBD where show KBD = "KBD"+data LABEL = LABEL+instance Show LABEL where show LABEL = "LABEL"+data LEGEND = LEGEND+instance Show LEGEND where show LEGEND = "LEGEND"+data LI = LI+instance Show LI where show LI = "LI"+data LINK = LINK+instance Show LINK where show LINK = "LINK"+data MAP = MAP+instance Show MAP where show MAP = "MAP"+data MENU = MENU+instance Show MENU where show MENU = "MENU"+data META = META+instance Show META where show META = "META"+data NOFRAMES = NOFRAMES+instance Show NOFRAMES where show NOFRAMES = "NOFRAMES"+data NOSCRIPT = NOSCRIPT+instance Show NOSCRIPT where show NOSCRIPT = "NOSCRIPT"+data OBJECT = OBJECT+instance Show OBJECT where show OBJECT = "OBJECT"+data OL = OL+instance Show OL where show OL = "OL"+data OPTGROUP = OPTGROUP+instance Show OPTGROUP where show OPTGROUP = "OPTGROUP"+data OPTION = OPTION+instance Show OPTION where show OPTION = "OPTION"+data P = P+instance Show P where show P = "P"+data PARAM = PARAM+instance Show PARAM where show PARAM = "PARAM"+data PRE = PRE+instance Show PRE where show PRE = "PRE"+data Q = Q+instance Show Q where show Q = "Q"+data S = S+instance Show S where show S = "S"+data SAMP = SAMP+instance Show SAMP where show SAMP = "SAMP"+data SCRIPT = SCRIPT+instance Show SCRIPT where show SCRIPT = "SCRIPT"+data SELECT = SELECT+instance Show SELECT where show SELECT = "SELECT"+data SMALL = SMALL+instance Show SMALL where show SMALL = "SMALL"+data SPAN = SPAN+instance Show SPAN where show SPAN = "SPAN"+data STRIKE = STRIKE+instance Show STRIKE where show STRIKE = "STRIKE"+data STRONG = STRONG+instance Show STRONG where show STRONG = "STRONG"+data STYLE = STYLE+instance Show STYLE where show STYLE = "STYLE"+data SUB = SUB+instance Show SUB where show SUB = "SUB"+data SUP = SUP+instance Show SUP where show SUP = "SUP"+data TABLE = TABLE+instance Show TABLE where show TABLE = "TABLE"+data TBODY = TBODY+instance Show TBODY where show TBODY = "TBODY"+data TD = TD+instance Show TD where show TD = "TD"+data TEXTAREA = TEXTAREA+instance Show TEXTAREA where show TEXTAREA = "TEXTAREA"+data TFOOT = TFOOT+instance Show TFOOT where show TFOOT = "TFOOT"+data TH = TH+instance Show TH where show TH = "TH"+data THEAD = THEAD+instance Show THEAD where show THEAD = "THEAD"+data TITLE = TITLE+instance Show TITLE where show TITLE = "TITLE"+data TR = TR+instance Show TR where show TR = "TR"+data TT = TT+instance Show TT where show TT = "TT"+data U = U+instance Show U where show U = "U"+data UL = UL+instance Show UL where show UL = "UL"+data VAR = VAR+instance Show VAR where show VAR = "VAR"+data VERSION = VERSION+instance Show VERSION where show VERSION = "VERSION"+data LANG = LANG+instance Show LANG where show LANG = "LANG"+data ONKEYUP = ONKEYUP+instance Show ONKEYUP where show ONKEYUP = "ONKEYUP"+data ONKEYDOWN = ONKEYDOWN+instance Show ONKEYDOWN where show ONKEYDOWN = "ONKEYDOWN"+data ONKEYPRESS = ONKEYPRESS+instance Show ONKEYPRESS where show ONKEYPRESS = "ONKEYPRESS"+data ONMOUSEOUT = ONMOUSEOUT+instance Show ONMOUSEOUT where show ONMOUSEOUT = "ONMOUSEOUT"+data ONMOUSEMOVE = ONMOUSEMOVE+instance Show ONMOUSEMOVE where show ONMOUSEMOVE = "ONMOUSEMOVE"+data ONMOUSEOVER = ONMOUSEOVER+instance Show ONMOUSEOVER where show ONMOUSEOVER = "ONMOUSEOVER"+data ONMOUSEUP = ONMOUSEUP+instance Show ONMOUSEUP where show ONMOUSEUP = "ONMOUSEUP"+data ONMOUSEDOWN = ONMOUSEDOWN+instance Show ONMOUSEDOWN where show ONMOUSEDOWN = "ONMOUSEDOWN"+data ONDBLCLICK = ONDBLCLICK+instance Show ONDBLCLICK where show ONDBLCLICK = "ONDBLCLICK"+data ONCLICK = ONCLICK+instance Show ONCLICK where show ONCLICK = "ONCLICK"+data CLASS = CLASS+instance Show CLASS where show CLASS = "CLASS"+data ID = ID+instance Show ID where show ID = "ID"+data FOR = FOR+instance Show FOR where show FOR = "FOR"+data EVENT = EVENT+instance Show EVENT where show EVENT = "EVENT"+data DEFER = DEFER+instance Show DEFER where show DEFER = "DEFER"+data SRC = SRC+instance Show SRC where show SRC = "SRC"+data LANGUAGE = LANGUAGE+instance Show LANGUAGE where show LANGUAGE = "LANGUAGE"+data TYPE = TYPE+instance Show TYPE where show TYPE = "TYPE"+data CHARSET = CHARSET+instance Show CHARSET where show CHARSET = "CHARSET"+data MEDIA = MEDIA+instance Show MEDIA where show MEDIA = "MEDIA"+data SCHEME = SCHEME+instance Show SCHEME where show SCHEME = "SCHEME"+data CONTENT = CONTENT+instance Show CONTENT where show CONTENT = "CONTENT"+data NAME = NAME+instance Show NAME where show NAME = "NAME"+data HTTP_EQUIV = HTTP_EQUIV+instance Show HTTP_EQUIV where show HTTP_EQUIV = "HTTP-EQUIV"+data TARGET = TARGET+instance Show TARGET where show TARGET = "TARGET"+data HREF = HREF+instance Show HREF where show HREF = "HREF"+data PROMPT = PROMPT+instance Show PROMPT where show PROMPT = "PROMPT"+data PROFILE = PROFILE+instance Show PROFILE where show PROFILE = "PROFILE"+data WIDTH = WIDTH+instance Show WIDTH where show WIDTH = "WIDTH"+data HEIGHT = HEIGHT+instance Show HEIGHT where show HEIGHT = "HEIGHT"+data ALIGN = ALIGN+instance Show ALIGN where show ALIGN = "ALIGN"+data SCROLLING = SCROLLING+instance Show SCROLLING where show SCROLLING = "SCROLLING"+data MARGINHEIGHT = MARGINHEIGHT+instance Show MARGINHEIGHT where show MARGINHEIGHT = "MARGINHEIGHT"+data MARGINWIDTH = MARGINWIDTH+instance Show MARGINWIDTH where show MARGINWIDTH = "MARGINWIDTH"+data FRAMEBORDER = FRAMEBORDER+instance Show FRAMEBORDER where show FRAMEBORDER = "FRAMEBORDER"+data LONGDESC = LONGDESC+instance Show LONGDESC where show LONGDESC = "LONGDESC"+data BGCOLOR = BGCOLOR+instance Show BGCOLOR where show BGCOLOR = "BGCOLOR"+data NOWRAP = NOWRAP+instance Show NOWRAP where show NOWRAP = "NOWRAP"+data VALIGN = VALIGN+instance Show VALIGN where show VALIGN = "VALIGN"+data CHAROFF = CHAROFF+instance Show CHAROFF where show CHAROFF = "CHAROFF"+data CHAR = CHAR+instance Show CHAR where show CHAR = "CHAR"+data COLSPAN = COLSPAN+instance Show COLSPAN where show COLSPAN = "COLSPAN"+data ROWSPAN = ROWSPAN+instance Show ROWSPAN where show ROWSPAN = "ROWSPAN"+data SCOPE = SCOPE+instance Show SCOPE where show SCOPE = "SCOPE"+data HEADERS = HEADERS+instance Show HEADERS where show HEADERS = "HEADERS"+data AXIS = AXIS+instance Show AXIS where show AXIS = "AXIS"+data DATAPAGESIZE = DATAPAGESIZE+instance Show DATAPAGESIZE where show DATAPAGESIZE = "DATAPAGESIZE"+data CELLPADDING = CELLPADDING+instance Show CELLPADDING where show CELLPADDING = "CELLPADDING"+data CELLSPACING = CELLSPACING+instance Show CELLSPACING where show CELLSPACING = "CELLSPACING"+data RULES = RULES+instance Show RULES where show RULES = "RULES"+data FRAME = FRAME+instance Show FRAME where show FRAME = "FRAME"+data BORDER = BORDER+instance Show BORDER where show BORDER = "BORDER"+data SUMMARY = SUMMARY+instance Show SUMMARY where show SUMMARY = "SUMMARY"+data ONBLUR = ONBLUR+instance Show ONBLUR where show ONBLUR = "ONBLUR"+data ONFOCUS = ONFOCUS+instance Show ONFOCUS where show ONFOCUS = "ONFOCUS"+data ACCESSKEY = ACCESSKEY+instance Show ACCESSKEY where show ACCESSKEY = "ACCESSKEY"+data TABINDEX = TABINDEX+instance Show TABINDEX where show TABINDEX = "TABINDEX"+data DISABLED = DISABLED+instance Show DISABLED where show DISABLED = "DISABLED"+data VALUE = VALUE+instance Show VALUE where show VALUE = "VALUE"+data ONCHANGE = ONCHANGE+instance Show ONCHANGE where show ONCHANGE = "ONCHANGE"+data ONSELECT = ONSELECT+instance Show ONSELECT where show ONSELECT = "ONSELECT"+data READONLY = READONLY+instance Show READONLY where show READONLY = "READONLY"+data COLS = COLS+instance Show COLS where show COLS = "COLS"+data ROWS = ROWS+instance Show ROWS where show ROWS = "ROWS"+data SELECTED = SELECTED+instance Show SELECTED where show SELECTED = "SELECTED"+data MULTIPLE = MULTIPLE+instance Show MULTIPLE where show MULTIPLE = "MULTIPLE"+data SIZE = SIZE+instance Show SIZE where show SIZE = "SIZE"+data ACCEPT = ACCEPT+instance Show ACCEPT where show ACCEPT = "ACCEPT"+data USEMAP = USEMAP+instance Show USEMAP where show USEMAP = "USEMAP"+data ALT = ALT+instance Show ALT where show ALT = "ALT"+data MAXLENGTH = MAXLENGTH+instance Show MAXLENGTH where show MAXLENGTH = "MAXLENGTH"+data CHECKED = CHECKED+instance Show CHECKED where show CHECKED = "CHECKED"+data ACCEPT_CHARSET = ACCEPT_CHARSET+instance Show ACCEPT_CHARSET where show ACCEPT_CHARSET = "ACCEPT-CHARSET"+data ONRESET = ONRESET+instance Show ONRESET where show ONRESET = "ONRESET"+data ONSUBMIT = ONSUBMIT+instance Show ONSUBMIT where show ONSUBMIT = "ONSUBMIT"+data ENCTYPE = ENCTYPE+instance Show ENCTYPE where show ENCTYPE = "ENCTYPE"+data METHOD = METHOD+instance Show METHOD where show METHOD = "METHOD"+data ACTION = ACTION+instance Show ACTION where show ACTION = "ACTION"+data COMPACT = COMPACT+instance Show COMPACT where show COMPACT = "COMPACT"+data START = START+instance Show START where show START = "START"+data DATETIME = DATETIME+instance Show DATETIME where show DATETIME = "DATETIME"+data NOSHADE = NOSHADE+instance Show NOSHADE where show NOSHADE = "NOSHADE"+data VSPACE = VSPACE+instance Show VSPACE where show VSPACE = "VSPACE"+data HSPACE = HSPACE+instance Show HSPACE where show HSPACE = "HSPACE"+data ARCHIVE = ARCHIVE+instance Show ARCHIVE where show ARCHIVE = "ARCHIVE"+data CODEBASE = CODEBASE+instance Show CODEBASE where show CODEBASE = "CODEBASE"+data VALUETYPE = VALUETYPE+instance Show VALUETYPE where show VALUETYPE = "VALUETYPE"+data STANDBY = STANDBY+instance Show STANDBY where show STANDBY = "STANDBY"+data CODETYPE = CODETYPE+instance Show CODETYPE where show CODETYPE = "CODETYPE"+data DATA = DATA+instance Show DATA where show DATA = "DATA"+data CLASSID = CLASSID+instance Show CLASSID where show CLASSID = "CLASSID"+data DECLARE = DECLARE+instance Show DECLARE where show DECLARE = "DECLARE"+data ISMAP = ISMAP+instance Show ISMAP where show ISMAP = "ISMAP"+data REV = REV+instance Show REV where show REV = "REV"+data REL = REL+instance Show REL where show REL = "REL"+data HREFLANG = HREFLANG+instance Show HREFLANG where show HREFLANG = "HREFLANG"+data NOHREF = NOHREF+instance Show NOHREF where show NOHREF = "NOHREF"+data COORDS = COORDS+instance Show COORDS where show COORDS = "COORDS"+data SHAPE = SHAPE+instance Show SHAPE where show SHAPE = "SHAPE"+data ALINK = ALINK+instance Show ALINK where show ALINK = "ALINK"+data VLINK = VLINK+instance Show VLINK where show VLINK = "VLINK"+data TEXT = TEXT+instance Show TEXT where show TEXT = "TEXT"+data BACKGROUND = BACKGROUND+instance Show BACKGROUND where show BACKGROUND = "BACKGROUND"+data ONUNLOAD = ONUNLOAD+instance Show ONUNLOAD where show ONUNLOAD = "ONUNLOAD"+data ONLOAD = ONLOAD+instance Show ONLOAD where show ONLOAD = "ONLOAD"+data CLEAR = CLEAR+instance Show CLEAR where show CLEAR = "CLEAR"+data FACE = FACE+instance Show FACE where show FACE = "FACE"+data COLOR = COLOR+instance Show COLOR where show COLOR = "COLOR"+instance TAG HTML+instance AddTo HTML HEAD+instance AddTo HTML BODY+instance TAG NOSCRIPT+instance AddTo NOSCRIPT P+instance AddTo NOSCRIPT H1+instance AddTo NOSCRIPT H2+instance AddTo NOSCRIPT H3+instance AddTo NOSCRIPT H4+instance AddTo NOSCRIPT H5+instance AddTo NOSCRIPT H6+instance AddTo NOSCRIPT UL+instance AddTo NOSCRIPT OL+instance AddTo NOSCRIPT DIR+instance AddTo NOSCRIPT MENU+instance AddTo NOSCRIPT PRE+instance AddTo NOSCRIPT DL+instance AddTo NOSCRIPT DIV+instance AddTo NOSCRIPT CENTER+instance AddTo NOSCRIPT NOSCRIPT+instance AddTo NOSCRIPT NOFRAMES+instance AddTo NOSCRIPT BLOCKQUOTE+instance AddTo NOSCRIPT FORM+instance AddTo NOSCRIPT ISINDEX+instance AddTo NOSCRIPT HR+instance AddTo NOSCRIPT TABLE+instance AddTo NOSCRIPT FIELDSET+instance AddTo NOSCRIPT ADDRESS+instance AddTo NOSCRIPT CDATA+instance AddTo NOSCRIPT TT+instance AddTo NOSCRIPT I+instance AddTo NOSCRIPT B+instance AddTo NOSCRIPT U+instance AddTo NOSCRIPT S+instance AddTo NOSCRIPT STRIKE+instance AddTo NOSCRIPT BIG+instance AddTo NOSCRIPT SMALL+instance AddTo NOSCRIPT EM+instance AddTo NOSCRIPT STRONG+instance AddTo NOSCRIPT DFN+instance AddTo NOSCRIPT CODE+instance AddTo NOSCRIPT SAMP+instance AddTo NOSCRIPT KBD+instance AddTo NOSCRIPT VAR+instance AddTo NOSCRIPT CITE+instance AddTo NOSCRIPT ABBR+instance AddTo NOSCRIPT ACRONYM+instance AddTo NOSCRIPT A+instance AddTo NOSCRIPT IMG+instance AddTo NOSCRIPT APPLET+instance AddTo NOSCRIPT OBJECT+instance AddTo NOSCRIPT FONT+instance AddTo NOSCRIPT BASEFONT+instance AddTo NOSCRIPT BR+instance AddTo NOSCRIPT SCRIPT+instance AddTo NOSCRIPT MAP+instance AddTo NOSCRIPT Q+instance AddTo NOSCRIPT SUB+instance AddTo NOSCRIPT SUP+instance AddTo NOSCRIPT SPAN+instance AddTo NOSCRIPT BDO+instance AddTo NOSCRIPT IFRAME+instance AddTo NOSCRIPT INPUT+instance AddTo NOSCRIPT SELECT+instance AddTo NOSCRIPT TEXTAREA+instance AddTo NOSCRIPT LABEL+instance AddTo NOSCRIPT BUTTON+instance TAG SCRIPT+instance AddTo SCRIPT CDATA+instance TAG STYLE+instance AddTo STYLE CDATA+instance TAG META where make = make_empty+instance TAG BASE where make = make_empty+instance TAG ISINDEX where make = make_empty+instance TAG TITLE+instance AddTo TITLE CDATA+instance TAG HEAD+instance AddTo HEAD TITLE+instance AddTo HEAD ISINDEX+instance AddTo HEAD BASE+instance AddTo HEAD SCRIPT+instance AddTo HEAD STYLE+instance AddTo HEAD META+instance AddTo HEAD LINK+instance AddTo HEAD OBJECT+instance TAG NOFRAMES+instance AddTo NOFRAMES P+instance AddTo NOFRAMES H1+instance AddTo NOFRAMES H2+instance AddTo NOFRAMES H3+instance AddTo NOFRAMES H4+instance AddTo NOFRAMES H5+instance AddTo NOFRAMES H6+instance AddTo NOFRAMES UL+instance AddTo NOFRAMES OL+instance AddTo NOFRAMES DIR+instance AddTo NOFRAMES MENU+instance AddTo NOFRAMES PRE+instance AddTo NOFRAMES DL+instance AddTo NOFRAMES DIV+instance AddTo NOFRAMES CENTER+instance AddTo NOFRAMES NOSCRIPT+instance AddTo NOFRAMES NOFRAMES+instance AddTo NOFRAMES BLOCKQUOTE+instance AddTo NOFRAMES FORM+instance AddTo NOFRAMES ISINDEX+instance AddTo NOFRAMES HR+instance AddTo NOFRAMES TABLE+instance AddTo NOFRAMES FIELDSET+instance AddTo NOFRAMES ADDRESS+instance AddTo NOFRAMES CDATA+instance AddTo NOFRAMES TT+instance AddTo NOFRAMES I+instance AddTo NOFRAMES B+instance AddTo NOFRAMES U+instance AddTo NOFRAMES S+instance AddTo NOFRAMES STRIKE+instance AddTo NOFRAMES BIG+instance AddTo NOFRAMES SMALL+instance AddTo NOFRAMES EM+instance AddTo NOFRAMES STRONG+instance AddTo NOFRAMES DFN+instance AddTo NOFRAMES CODE+instance AddTo NOFRAMES SAMP+instance AddTo NOFRAMES KBD+instance AddTo NOFRAMES VAR+instance AddTo NOFRAMES CITE+instance AddTo NOFRAMES ABBR+instance AddTo NOFRAMES ACRONYM+instance AddTo NOFRAMES A+instance AddTo NOFRAMES IMG+instance AddTo NOFRAMES APPLET+instance AddTo NOFRAMES OBJECT+instance AddTo NOFRAMES FONT+instance AddTo NOFRAMES BASEFONT+instance AddTo NOFRAMES BR+instance AddTo NOFRAMES SCRIPT+instance AddTo NOFRAMES MAP+instance AddTo NOFRAMES Q+instance AddTo NOFRAMES SUB+instance AddTo NOFRAMES SUP+instance AddTo NOFRAMES SPAN+instance AddTo NOFRAMES BDO+instance AddTo NOFRAMES IFRAME+instance AddTo NOFRAMES INPUT+instance AddTo NOFRAMES SELECT+instance AddTo NOFRAMES TEXTAREA+instance AddTo NOFRAMES LABEL+instance AddTo NOFRAMES BUTTON+instance TAG IFRAME+instance AddTo IFRAME P+instance AddTo IFRAME H1+instance AddTo IFRAME H2+instance AddTo IFRAME H3+instance AddTo IFRAME H4+instance AddTo IFRAME H5+instance AddTo IFRAME H6+instance AddTo IFRAME UL+instance AddTo IFRAME OL+instance AddTo IFRAME DIR+instance AddTo IFRAME MENU+instance AddTo IFRAME PRE+instance AddTo IFRAME DL+instance AddTo IFRAME DIV+instance AddTo IFRAME CENTER+instance AddTo IFRAME NOSCRIPT+instance AddTo IFRAME NOFRAMES+instance AddTo IFRAME BLOCKQUOTE+instance AddTo IFRAME FORM+instance AddTo IFRAME ISINDEX+instance AddTo IFRAME HR+instance AddTo IFRAME TABLE+instance AddTo IFRAME FIELDSET+instance AddTo IFRAME ADDRESS+instance AddTo IFRAME CDATA+instance AddTo IFRAME TT+instance AddTo IFRAME I+instance AddTo IFRAME B+instance AddTo IFRAME U+instance AddTo IFRAME S+instance AddTo IFRAME STRIKE+instance AddTo IFRAME BIG+instance AddTo IFRAME SMALL+instance AddTo IFRAME EM+instance AddTo IFRAME STRONG+instance AddTo IFRAME DFN+instance AddTo IFRAME CODE+instance AddTo IFRAME SAMP+instance AddTo IFRAME KBD+instance AddTo IFRAME VAR+instance AddTo IFRAME CITE+instance AddTo IFRAME ABBR+instance AddTo IFRAME ACRONYM+instance AddTo IFRAME A+instance AddTo IFRAME IMG+instance AddTo IFRAME APPLET+instance AddTo IFRAME OBJECT+instance AddTo IFRAME FONT+instance AddTo IFRAME BASEFONT+instance AddTo IFRAME BR+instance AddTo IFRAME SCRIPT+instance AddTo IFRAME MAP+instance AddTo IFRAME Q+instance AddTo IFRAME SUB+instance AddTo IFRAME SUP+instance AddTo IFRAME SPAN+instance AddTo IFRAME BDO+instance AddTo IFRAME IFRAME+instance AddTo IFRAME INPUT+instance AddTo IFRAME SELECT+instance AddTo IFRAME TEXTAREA+instance AddTo IFRAME LABEL+instance AddTo IFRAME BUTTON+instance TAG TH+instance AddTo TH P+instance AddTo TH H1+instance AddTo TH H2+instance AddTo TH H3+instance AddTo TH H4+instance AddTo TH H5+instance AddTo TH H6+instance AddTo TH UL+instance AddTo TH OL+instance AddTo TH DIR+instance AddTo TH MENU+instance AddTo TH PRE+instance AddTo TH DL+instance AddTo TH DIV+instance AddTo TH CENTER+instance AddTo TH NOSCRIPT+instance AddTo TH NOFRAMES+instance AddTo TH BLOCKQUOTE+instance AddTo TH FORM+instance AddTo TH ISINDEX+instance AddTo TH HR+instance AddTo TH TABLE+instance AddTo TH FIELDSET+instance AddTo TH ADDRESS+instance AddTo TH CDATA+instance AddTo TH TT+instance AddTo TH I+instance AddTo TH B+instance AddTo TH U+instance AddTo TH S+instance AddTo TH STRIKE+instance AddTo TH BIG+instance AddTo TH SMALL+instance AddTo TH EM+instance AddTo TH STRONG+instance AddTo TH DFN+instance AddTo TH CODE+instance AddTo TH SAMP+instance AddTo TH KBD+instance AddTo TH VAR+instance AddTo TH CITE+instance AddTo TH ABBR+instance AddTo TH ACRONYM+instance AddTo TH A+instance AddTo TH IMG+instance AddTo TH APPLET+instance AddTo TH OBJECT+instance AddTo TH FONT+instance AddTo TH BASEFONT+instance AddTo TH BR+instance AddTo TH SCRIPT+instance AddTo TH MAP+instance AddTo TH Q+instance AddTo TH SUB+instance AddTo TH SUP+instance AddTo TH SPAN+instance AddTo TH BDO+instance AddTo TH IFRAME+instance AddTo TH INPUT+instance AddTo TH SELECT+instance AddTo TH TEXTAREA+instance AddTo TH LABEL+instance AddTo TH BUTTON+instance TAG TD+instance AddTo TD P+instance AddTo TD H1+instance AddTo TD H2+instance AddTo TD H3+instance AddTo TD H4+instance AddTo TD H5+instance AddTo TD H6+instance AddTo TD UL+instance AddTo TD OL+instance AddTo TD DIR+instance AddTo TD MENU+instance AddTo TD PRE+instance AddTo TD DL+instance AddTo TD DIV+instance AddTo TD CENTER+instance AddTo TD NOSCRIPT+instance AddTo TD NOFRAMES+instance AddTo TD BLOCKQUOTE+instance AddTo TD FORM+instance AddTo TD ISINDEX+instance AddTo TD HR+instance AddTo TD TABLE+instance AddTo TD FIELDSET+instance AddTo TD ADDRESS+instance AddTo TD CDATA+instance AddTo TD TT+instance AddTo TD I+instance AddTo TD B+instance AddTo TD U+instance AddTo TD S+instance AddTo TD STRIKE+instance AddTo TD BIG+instance AddTo TD SMALL+instance AddTo TD EM+instance AddTo TD STRONG+instance AddTo TD DFN+instance AddTo TD CODE+instance AddTo TD SAMP+instance AddTo TD KBD+instance AddTo TD VAR+instance AddTo TD CITE+instance AddTo TD ABBR+instance AddTo TD ACRONYM+instance AddTo TD A+instance AddTo TD IMG+instance AddTo TD APPLET+instance AddTo TD OBJECT+instance AddTo TD FONT+instance AddTo TD BASEFONT+instance AddTo TD BR+instance AddTo TD SCRIPT+instance AddTo TD MAP+instance AddTo TD Q+instance AddTo TD SUB+instance AddTo TD SUP+instance AddTo TD SPAN+instance AddTo TD BDO+instance AddTo TD IFRAME+instance AddTo TD INPUT+instance AddTo TD SELECT+instance AddTo TD TEXTAREA+instance AddTo TD LABEL+instance AddTo TD BUTTON+instance TAG TR+instance AddTo TR TH+instance AddTo TR TD+instance TAG COL where make = make_empty+instance TAG COLGROUP+instance AddTo COLGROUP COL+instance TAG TBODY+instance AddTo TBODY TR+instance TAG TFOOT+instance AddTo TFOOT TR+instance TAG THEAD+instance AddTo THEAD TR+instance TAG CAPTION+instance AddTo CAPTION CDATA+instance AddTo CAPTION TT+instance AddTo CAPTION I+instance AddTo CAPTION B+instance AddTo CAPTION U+instance AddTo CAPTION S+instance AddTo CAPTION STRIKE+instance AddTo CAPTION BIG+instance AddTo CAPTION SMALL+instance AddTo CAPTION EM+instance AddTo CAPTION STRONG+instance AddTo CAPTION DFN+instance AddTo CAPTION CODE+instance AddTo CAPTION SAMP+instance AddTo CAPTION KBD+instance AddTo CAPTION VAR+instance AddTo CAPTION CITE+instance AddTo CAPTION ABBR+instance AddTo CAPTION ACRONYM+instance AddTo CAPTION A+instance AddTo CAPTION IMG+instance AddTo CAPTION APPLET+instance AddTo CAPTION OBJECT+instance AddTo CAPTION FONT+instance AddTo CAPTION BASEFONT+instance AddTo CAPTION BR+instance AddTo CAPTION SCRIPT+instance AddTo CAPTION MAP+instance AddTo CAPTION Q+instance AddTo CAPTION SUB+instance AddTo CAPTION SUP+instance AddTo CAPTION SPAN+instance AddTo CAPTION BDO+instance AddTo CAPTION IFRAME+instance AddTo CAPTION INPUT+instance AddTo CAPTION SELECT+instance AddTo CAPTION TEXTAREA+instance AddTo CAPTION LABEL+instance AddTo CAPTION BUTTON+instance TAG TABLE+instance AddTo TABLE CAPTION+instance AddTo TABLE COL+instance AddTo TABLE COLGROUP+instance AddTo TABLE THEAD+instance AddTo TABLE TFOOT+instance AddTo TABLE TBODY+instance TAG BUTTON+instance AddTo BUTTON P+instance AddTo BUTTON H1+instance AddTo BUTTON H2+instance AddTo BUTTON H3+instance AddTo BUTTON H4+instance AddTo BUTTON H5+instance AddTo BUTTON H6+instance AddTo BUTTON UL+instance AddTo BUTTON OL+instance AddTo BUTTON DIR+instance AddTo BUTTON MENU+instance AddTo BUTTON PRE+instance AddTo BUTTON DL+instance AddTo BUTTON DIV+instance AddTo BUTTON CENTER+instance AddTo BUTTON NOSCRIPT+instance AddTo BUTTON NOFRAMES+instance AddTo BUTTON BLOCKQUOTE+instance AddTo BUTTON HR+instance AddTo BUTTON TABLE+instance AddTo BUTTON ADDRESS+instance AddTo BUTTON CDATA+instance AddTo BUTTON TT+instance AddTo BUTTON I+instance AddTo BUTTON B+instance AddTo BUTTON U+instance AddTo BUTTON S+instance AddTo BUTTON STRIKE+instance AddTo BUTTON BIG+instance AddTo BUTTON SMALL+instance AddTo BUTTON EM+instance AddTo BUTTON STRONG+instance AddTo BUTTON DFN+instance AddTo BUTTON CODE+instance AddTo BUTTON SAMP+instance AddTo BUTTON KBD+instance AddTo BUTTON VAR+instance AddTo BUTTON CITE+instance AddTo BUTTON ABBR+instance AddTo BUTTON ACRONYM+instance AddTo BUTTON IMG+instance AddTo BUTTON APPLET+instance AddTo BUTTON OBJECT+instance AddTo BUTTON FONT+instance AddTo BUTTON BASEFONT+instance AddTo BUTTON BR+instance AddTo BUTTON SCRIPT+instance AddTo BUTTON MAP+instance AddTo BUTTON Q+instance AddTo BUTTON SUB+instance AddTo BUTTON SUP+instance AddTo BUTTON SPAN+instance AddTo BUTTON BDO+instance TAG LEGEND+instance AddTo LEGEND CDATA+instance AddTo LEGEND TT+instance AddTo LEGEND I+instance AddTo LEGEND B+instance AddTo LEGEND U+instance AddTo LEGEND S+instance AddTo LEGEND STRIKE+instance AddTo LEGEND BIG+instance AddTo LEGEND SMALL+instance AddTo LEGEND EM+instance AddTo LEGEND STRONG+instance AddTo LEGEND DFN+instance AddTo LEGEND CODE+instance AddTo LEGEND SAMP+instance AddTo LEGEND KBD+instance AddTo LEGEND VAR+instance AddTo LEGEND CITE+instance AddTo LEGEND ABBR+instance AddTo LEGEND ACRONYM+instance AddTo LEGEND A+instance AddTo LEGEND IMG+instance AddTo LEGEND APPLET+instance AddTo LEGEND OBJECT+instance AddTo LEGEND FONT+instance AddTo LEGEND BASEFONT+instance AddTo LEGEND BR+instance AddTo LEGEND SCRIPT+instance AddTo LEGEND MAP+instance AddTo LEGEND Q+instance AddTo LEGEND SUB+instance AddTo LEGEND SUP+instance AddTo LEGEND SPAN+instance AddTo LEGEND BDO+instance AddTo LEGEND IFRAME+instance AddTo LEGEND INPUT+instance AddTo LEGEND SELECT+instance AddTo LEGEND TEXTAREA+instance AddTo LEGEND LABEL+instance AddTo LEGEND BUTTON+instance TAG FIELDSET+instance AddTo FIELDSET CDATA+instance AddTo FIELDSET LEGEND+instance AddTo FIELDSET P+instance AddTo FIELDSET H1+instance AddTo FIELDSET H2+instance AddTo FIELDSET H3+instance AddTo FIELDSET H4+instance AddTo FIELDSET H5+instance AddTo FIELDSET H6+instance AddTo FIELDSET UL+instance AddTo FIELDSET OL+instance AddTo FIELDSET DIR+instance AddTo FIELDSET MENU+instance AddTo FIELDSET PRE+instance AddTo FIELDSET DL+instance AddTo FIELDSET DIV+instance AddTo FIELDSET CENTER+instance AddTo FIELDSET NOSCRIPT+instance AddTo FIELDSET NOFRAMES+instance AddTo FIELDSET BLOCKQUOTE+instance AddTo FIELDSET FORM+instance AddTo FIELDSET ISINDEX+instance AddTo FIELDSET HR+instance AddTo FIELDSET TABLE+instance AddTo FIELDSET FIELDSET+instance AddTo FIELDSET ADDRESS+instance AddTo FIELDSET TT+instance AddTo FIELDSET I+instance AddTo FIELDSET B+instance AddTo FIELDSET U+instance AddTo FIELDSET S+instance AddTo FIELDSET STRIKE+instance AddTo FIELDSET BIG+instance AddTo FIELDSET SMALL+instance AddTo FIELDSET EM+instance AddTo FIELDSET STRONG+instance AddTo FIELDSET DFN+instance AddTo FIELDSET CODE+instance AddTo FIELDSET SAMP+instance AddTo FIELDSET KBD+instance AddTo FIELDSET VAR+instance AddTo FIELDSET CITE+instance AddTo FIELDSET ABBR+instance AddTo FIELDSET ACRONYM+instance AddTo FIELDSET A+instance AddTo FIELDSET IMG+instance AddTo FIELDSET APPLET+instance AddTo FIELDSET OBJECT+instance AddTo FIELDSET FONT+instance AddTo FIELDSET BASEFONT+instance AddTo FIELDSET BR+instance AddTo FIELDSET SCRIPT+instance AddTo FIELDSET MAP+instance AddTo FIELDSET Q+instance AddTo FIELDSET SUB+instance AddTo FIELDSET SUP+instance AddTo FIELDSET SPAN+instance AddTo FIELDSET BDO+instance AddTo FIELDSET IFRAME+instance AddTo FIELDSET INPUT+instance AddTo FIELDSET SELECT+instance AddTo FIELDSET TEXTAREA+instance AddTo FIELDSET LABEL+instance AddTo FIELDSET BUTTON+instance TAG TEXTAREA+instance AddTo TEXTAREA CDATA+instance TAG OPTION+instance AddTo OPTION CDATA+instance TAG OPTGROUP+instance AddTo OPTGROUP OPTION+instance TAG SELECT+instance AddTo SELECT OPTGROUP+instance AddTo SELECT OPTION+instance TAG INPUT where make = make_empty+instance TAG LABEL+instance AddTo LABEL CDATA+instance AddTo LABEL TT+instance AddTo LABEL I+instance AddTo LABEL B+instance AddTo LABEL U+instance AddTo LABEL S+instance AddTo LABEL STRIKE+instance AddTo LABEL BIG+instance AddTo LABEL SMALL+instance AddTo LABEL EM+instance AddTo LABEL STRONG+instance AddTo LABEL DFN+instance AddTo LABEL CODE+instance AddTo LABEL SAMP+instance AddTo LABEL KBD+instance AddTo LABEL VAR+instance AddTo LABEL CITE+instance AddTo LABEL ABBR+instance AddTo LABEL ACRONYM+instance AddTo LABEL A+instance AddTo LABEL IMG+instance AddTo LABEL APPLET+instance AddTo LABEL OBJECT+instance AddTo LABEL FONT+instance AddTo LABEL BASEFONT+instance AddTo LABEL BR+instance AddTo LABEL SCRIPT+instance AddTo LABEL MAP+instance AddTo LABEL Q+instance AddTo LABEL SUB+instance AddTo LABEL SUP+instance AddTo LABEL SPAN+instance AddTo LABEL BDO+instance AddTo LABEL IFRAME+instance AddTo LABEL INPUT+instance AddTo LABEL SELECT+instance AddTo LABEL TEXTAREA+instance AddTo LABEL BUTTON+instance TAG FORM+instance AddTo FORM P+instance AddTo FORM H1+instance AddTo FORM H2+instance AddTo FORM H3+instance AddTo FORM H4+instance AddTo FORM H5+instance AddTo FORM H6+instance AddTo FORM UL+instance AddTo FORM OL+instance AddTo FORM DIR+instance AddTo FORM MENU+instance AddTo FORM PRE+instance AddTo FORM DL+instance AddTo FORM DIV+instance AddTo FORM CENTER+instance AddTo FORM NOSCRIPT+instance AddTo FORM NOFRAMES+instance AddTo FORM BLOCKQUOTE+instance AddTo FORM ISINDEX+instance AddTo FORM HR+instance AddTo FORM TABLE+instance AddTo FORM FIELDSET+instance AddTo FORM ADDRESS+instance AddTo FORM CDATA+instance AddTo FORM TT+instance AddTo FORM I+instance AddTo FORM B+instance AddTo FORM U+instance AddTo FORM S+instance AddTo FORM STRIKE+instance AddTo FORM BIG+instance AddTo FORM SMALL+instance AddTo FORM EM+instance AddTo FORM STRONG+instance AddTo FORM DFN+instance AddTo FORM CODE+instance AddTo FORM SAMP+instance AddTo FORM KBD+instance AddTo FORM VAR+instance AddTo FORM CITE+instance AddTo FORM ABBR+instance AddTo FORM ACRONYM+instance AddTo FORM A+instance AddTo FORM IMG+instance AddTo FORM APPLET+instance AddTo FORM OBJECT+instance AddTo FORM FONT+instance AddTo FORM BASEFONT+instance AddTo FORM BR+instance AddTo FORM SCRIPT+instance AddTo FORM MAP+instance AddTo FORM Q+instance AddTo FORM SUB+instance AddTo FORM SUP+instance AddTo FORM SPAN+instance AddTo FORM BDO+instance AddTo FORM IFRAME+instance AddTo FORM INPUT+instance AddTo FORM SELECT+instance AddTo FORM TEXTAREA+instance AddTo FORM LABEL+instance AddTo FORM BUTTON+instance TAG LI+instance AddTo LI P+instance AddTo LI H1+instance AddTo LI H2+instance AddTo LI H3+instance AddTo LI H4+instance AddTo LI H5+instance AddTo LI H6+instance AddTo LI UL+instance AddTo LI OL+instance AddTo LI DIR+instance AddTo LI MENU+instance AddTo LI PRE+instance AddTo LI DL+instance AddTo LI DIV+instance AddTo LI CENTER+instance AddTo LI NOSCRIPT+instance AddTo LI NOFRAMES+instance AddTo LI BLOCKQUOTE+instance AddTo LI FORM+instance AddTo LI ISINDEX+instance AddTo LI HR+instance AddTo LI TABLE+instance AddTo LI FIELDSET+instance AddTo LI ADDRESS+instance AddTo LI CDATA+instance AddTo LI TT+instance AddTo LI I+instance AddTo LI B+instance AddTo LI U+instance AddTo LI S+instance AddTo LI STRIKE+instance AddTo LI BIG+instance AddTo LI SMALL+instance AddTo LI EM+instance AddTo LI STRONG+instance AddTo LI DFN+instance AddTo LI CODE+instance AddTo LI SAMP+instance AddTo LI KBD+instance AddTo LI VAR+instance AddTo LI CITE+instance AddTo LI ABBR+instance AddTo LI ACRONYM+instance AddTo LI A+instance AddTo LI IMG+instance AddTo LI APPLET+instance AddTo LI OBJECT+instance AddTo LI FONT+instance AddTo LI BASEFONT+instance AddTo LI BR+instance AddTo LI SCRIPT+instance AddTo LI MAP+instance AddTo LI Q+instance AddTo LI SUB+instance AddTo LI SUP+instance AddTo LI SPAN+instance AddTo LI BDO+instance AddTo LI IFRAME+instance AddTo LI INPUT+instance AddTo LI SELECT+instance AddTo LI TEXTAREA+instance AddTo LI LABEL+instance AddTo LI BUTTON+instance TAG DIR+instance AddTo DIR LI+instance TAG MENU+instance AddTo MENU LI+instance TAG UL+instance AddTo UL LI+instance TAG OL+instance AddTo OL LI+instance TAG DD+instance AddTo DD P+instance AddTo DD H1+instance AddTo DD H2+instance AddTo DD H3+instance AddTo DD H4+instance AddTo DD H5+instance AddTo DD H6+instance AddTo DD UL+instance AddTo DD OL+instance AddTo DD DIR+instance AddTo DD MENU+instance AddTo DD PRE+instance AddTo DD DL+instance AddTo DD DIV+instance AddTo DD CENTER+instance AddTo DD NOSCRIPT+instance AddTo DD NOFRAMES+instance AddTo DD BLOCKQUOTE+instance AddTo DD FORM+instance AddTo DD ISINDEX+instance AddTo DD HR+instance AddTo DD TABLE+instance AddTo DD FIELDSET+instance AddTo DD ADDRESS+instance AddTo DD CDATA+instance AddTo DD TT+instance AddTo DD I+instance AddTo DD B+instance AddTo DD U+instance AddTo DD S+instance AddTo DD STRIKE+instance AddTo DD BIG+instance AddTo DD SMALL+instance AddTo DD EM+instance AddTo DD STRONG+instance AddTo DD DFN+instance AddTo DD CODE+instance AddTo DD SAMP+instance AddTo DD KBD+instance AddTo DD VAR+instance AddTo DD CITE+instance AddTo DD ABBR+instance AddTo DD ACRONYM+instance AddTo DD A+instance AddTo DD IMG+instance AddTo DD APPLET+instance AddTo DD OBJECT+instance AddTo DD FONT+instance AddTo DD BASEFONT+instance AddTo DD BR+instance AddTo DD SCRIPT+instance AddTo DD MAP+instance AddTo DD Q+instance AddTo DD SUB+instance AddTo DD SUP+instance AddTo DD SPAN+instance AddTo DD BDO+instance AddTo DD IFRAME+instance AddTo DD INPUT+instance AddTo DD SELECT+instance AddTo DD TEXTAREA+instance AddTo DD LABEL+instance AddTo DD BUTTON+instance TAG DT+instance AddTo DT CDATA+instance AddTo DT TT+instance AddTo DT I+instance AddTo DT B+instance AddTo DT U+instance AddTo DT S+instance AddTo DT STRIKE+instance AddTo DT BIG+instance AddTo DT SMALL+instance AddTo DT EM+instance AddTo DT STRONG+instance AddTo DT DFN+instance AddTo DT CODE+instance AddTo DT SAMP+instance AddTo DT KBD+instance AddTo DT VAR+instance AddTo DT CITE+instance AddTo DT ABBR+instance AddTo DT ACRONYM+instance AddTo DT A+instance AddTo DT IMG+instance AddTo DT APPLET+instance AddTo DT OBJECT+instance AddTo DT FONT+instance AddTo DT BASEFONT+instance AddTo DT BR+instance AddTo DT SCRIPT+instance AddTo DT MAP+instance AddTo DT Q+instance AddTo DT SUB+instance AddTo DT SUP+instance AddTo DT SPAN+instance AddTo DT BDO+instance AddTo DT IFRAME+instance AddTo DT INPUT+instance AddTo DT SELECT+instance AddTo DT TEXTAREA+instance AddTo DT LABEL+instance AddTo DT BUTTON+instance TAG DL+instance AddTo DL DT+instance AddTo DL DD+instance TAG INS+instance AddTo INS P+instance AddTo INS H1+instance AddTo INS H2+instance AddTo INS H3+instance AddTo INS H4+instance AddTo INS H5+instance AddTo INS H6+instance AddTo INS UL+instance AddTo INS OL+instance AddTo INS DIR+instance AddTo INS MENU+instance AddTo INS PRE+instance AddTo INS DL+instance AddTo INS DIV+instance AddTo INS CENTER+instance AddTo INS NOSCRIPT+instance AddTo INS NOFRAMES+instance AddTo INS BLOCKQUOTE+instance AddTo INS FORM+instance AddTo INS ISINDEX+instance AddTo INS HR+instance AddTo INS TABLE+instance AddTo INS FIELDSET+instance AddTo INS ADDRESS+instance AddTo INS CDATA+instance AddTo INS TT+instance AddTo INS I+instance AddTo INS B+instance AddTo INS U+instance AddTo INS S+instance AddTo INS STRIKE+instance AddTo INS BIG+instance AddTo INS SMALL+instance AddTo INS EM+instance AddTo INS STRONG+instance AddTo INS DFN+instance AddTo INS CODE+instance AddTo INS SAMP+instance AddTo INS KBD+instance AddTo INS VAR+instance AddTo INS CITE+instance AddTo INS ABBR+instance AddTo INS ACRONYM+instance AddTo INS A+instance AddTo INS IMG+instance AddTo INS APPLET+instance AddTo INS OBJECT+instance AddTo INS FONT+instance AddTo INS BASEFONT+instance AddTo INS BR+instance AddTo INS SCRIPT+instance AddTo INS MAP+instance AddTo INS Q+instance AddTo INS SUB+instance AddTo INS SUP+instance AddTo INS SPAN+instance AddTo INS BDO+instance AddTo INS IFRAME+instance AddTo INS INPUT+instance AddTo INS SELECT+instance AddTo INS TEXTAREA+instance AddTo INS LABEL+instance AddTo INS BUTTON+instance TAG DEL+instance AddTo DEL P+instance AddTo DEL H1+instance AddTo DEL H2+instance AddTo DEL H3+instance AddTo DEL H4+instance AddTo DEL H5+instance AddTo DEL H6+instance AddTo DEL UL+instance AddTo DEL OL+instance AddTo DEL DIR+instance AddTo DEL MENU+instance AddTo DEL PRE+instance AddTo DEL DL+instance AddTo DEL DIV+instance AddTo DEL CENTER+instance AddTo DEL NOSCRIPT+instance AddTo DEL NOFRAMES+instance AddTo DEL BLOCKQUOTE+instance AddTo DEL FORM+instance AddTo DEL ISINDEX+instance AddTo DEL HR+instance AddTo DEL TABLE+instance AddTo DEL FIELDSET+instance AddTo DEL ADDRESS+instance AddTo DEL CDATA+instance AddTo DEL TT+instance AddTo DEL I+instance AddTo DEL B+instance AddTo DEL U+instance AddTo DEL S+instance AddTo DEL STRIKE+instance AddTo DEL BIG+instance AddTo DEL SMALL+instance AddTo DEL EM+instance AddTo DEL STRONG+instance AddTo DEL DFN+instance AddTo DEL CODE+instance AddTo DEL SAMP+instance AddTo DEL KBD+instance AddTo DEL VAR+instance AddTo DEL CITE+instance AddTo DEL ABBR+instance AddTo DEL ACRONYM+instance AddTo DEL A+instance AddTo DEL IMG+instance AddTo DEL APPLET+instance AddTo DEL OBJECT+instance AddTo DEL FONT+instance AddTo DEL BASEFONT+instance AddTo DEL BR+instance AddTo DEL SCRIPT+instance AddTo DEL MAP+instance AddTo DEL Q+instance AddTo DEL SUB+instance AddTo DEL SUP+instance AddTo DEL SPAN+instance AddTo DEL BDO+instance AddTo DEL IFRAME+instance AddTo DEL INPUT+instance AddTo DEL SELECT+instance AddTo DEL TEXTAREA+instance AddTo DEL LABEL+instance AddTo DEL BUTTON+instance TAG BLOCKQUOTE+instance AddTo BLOCKQUOTE P+instance AddTo BLOCKQUOTE H1+instance AddTo BLOCKQUOTE H2+instance AddTo BLOCKQUOTE H3+instance AddTo BLOCKQUOTE H4+instance AddTo BLOCKQUOTE H5+instance AddTo BLOCKQUOTE H6+instance AddTo BLOCKQUOTE UL+instance AddTo BLOCKQUOTE OL+instance AddTo BLOCKQUOTE DIR+instance AddTo BLOCKQUOTE MENU+instance AddTo BLOCKQUOTE PRE+instance AddTo BLOCKQUOTE DL+instance AddTo BLOCKQUOTE DIV+instance AddTo BLOCKQUOTE CENTER+instance AddTo BLOCKQUOTE NOSCRIPT+instance AddTo BLOCKQUOTE NOFRAMES+instance AddTo BLOCKQUOTE BLOCKQUOTE+instance AddTo BLOCKQUOTE FORM+instance AddTo BLOCKQUOTE ISINDEX+instance AddTo BLOCKQUOTE HR+instance AddTo BLOCKQUOTE TABLE+instance AddTo BLOCKQUOTE FIELDSET+instance AddTo BLOCKQUOTE ADDRESS+instance AddTo BLOCKQUOTE CDATA+instance AddTo BLOCKQUOTE TT+instance AddTo BLOCKQUOTE I+instance AddTo BLOCKQUOTE B+instance AddTo BLOCKQUOTE U+instance AddTo BLOCKQUOTE S+instance AddTo BLOCKQUOTE STRIKE+instance AddTo BLOCKQUOTE BIG+instance AddTo BLOCKQUOTE SMALL+instance AddTo BLOCKQUOTE EM+instance AddTo BLOCKQUOTE STRONG+instance AddTo BLOCKQUOTE DFN+instance AddTo BLOCKQUOTE CODE+instance AddTo BLOCKQUOTE SAMP+instance AddTo BLOCKQUOTE KBD+instance AddTo BLOCKQUOTE VAR+instance AddTo BLOCKQUOTE CITE+instance AddTo BLOCKQUOTE ABBR+instance AddTo BLOCKQUOTE ACRONYM+instance AddTo BLOCKQUOTE A+instance AddTo BLOCKQUOTE IMG+instance AddTo BLOCKQUOTE APPLET+instance AddTo BLOCKQUOTE OBJECT+instance AddTo BLOCKQUOTE FONT+instance AddTo BLOCKQUOTE BASEFONT+instance AddTo BLOCKQUOTE BR+instance AddTo BLOCKQUOTE SCRIPT+instance AddTo BLOCKQUOTE MAP+instance AddTo BLOCKQUOTE Q+instance AddTo BLOCKQUOTE SUB+instance AddTo BLOCKQUOTE SUP+instance AddTo BLOCKQUOTE SPAN+instance AddTo BLOCKQUOTE BDO+instance AddTo BLOCKQUOTE IFRAME+instance AddTo BLOCKQUOTE INPUT+instance AddTo BLOCKQUOTE SELECT+instance AddTo BLOCKQUOTE TEXTAREA+instance AddTo BLOCKQUOTE LABEL+instance AddTo BLOCKQUOTE BUTTON+instance TAG Q+instance AddTo Q CDATA+instance AddTo Q TT+instance AddTo Q I+instance AddTo Q B+instance AddTo Q U+instance AddTo Q S+instance AddTo Q STRIKE+instance AddTo Q BIG+instance AddTo Q SMALL+instance AddTo Q EM+instance AddTo Q STRONG+instance AddTo Q DFN+instance AddTo Q CODE+instance AddTo Q SAMP+instance AddTo Q KBD+instance AddTo Q VAR+instance AddTo Q CITE+instance AddTo Q ABBR+instance AddTo Q ACRONYM+instance AddTo Q A+instance AddTo Q IMG+instance AddTo Q APPLET+instance AddTo Q OBJECT+instance AddTo Q FONT+instance AddTo Q BASEFONT+instance AddTo Q BR+instance AddTo Q SCRIPT+instance AddTo Q MAP+instance AddTo Q Q+instance AddTo Q SUB+instance AddTo Q SUP+instance AddTo Q SPAN+instance AddTo Q BDO+instance AddTo Q IFRAME+instance AddTo Q INPUT+instance AddTo Q SELECT+instance AddTo Q TEXTAREA+instance AddTo Q LABEL+instance AddTo Q BUTTON+instance TAG PRE+instance AddTo PRE CDATA+instance AddTo PRE TT+instance AddTo PRE I+instance AddTo PRE B+instance AddTo PRE U+instance AddTo PRE S+instance AddTo PRE STRIKE+instance AddTo PRE EM+instance AddTo PRE STRONG+instance AddTo PRE DFN+instance AddTo PRE CODE+instance AddTo PRE SAMP+instance AddTo PRE KBD+instance AddTo PRE VAR+instance AddTo PRE CITE+instance AddTo PRE ABBR+instance AddTo PRE ACRONYM+instance AddTo PRE A+instance AddTo PRE BR+instance AddTo PRE SCRIPT+instance AddTo PRE MAP+instance AddTo PRE Q+instance AddTo PRE SPAN+instance AddTo PRE BDO+instance AddTo PRE IFRAME+instance AddTo PRE INPUT+instance AddTo PRE SELECT+instance AddTo PRE TEXTAREA+instance AddTo PRE LABEL+instance AddTo PRE BUTTON+instance TAG H1+instance AddTo H1 CDATA+instance AddTo H1 TT+instance AddTo H1 I+instance AddTo H1 B+instance AddTo H1 U+instance AddTo H1 S+instance AddTo H1 STRIKE+instance AddTo H1 BIG+instance AddTo H1 SMALL+instance AddTo H1 EM+instance AddTo H1 STRONG+instance AddTo H1 DFN+instance AddTo H1 CODE+instance AddTo H1 SAMP+instance AddTo H1 KBD+instance AddTo H1 VAR+instance AddTo H1 CITE+instance AddTo H1 ABBR+instance AddTo H1 ACRONYM+instance AddTo H1 A+instance AddTo H1 IMG+instance AddTo H1 APPLET+instance AddTo H1 OBJECT+instance AddTo H1 FONT+instance AddTo H1 BASEFONT+instance AddTo H1 BR+instance AddTo H1 SCRIPT+instance AddTo H1 MAP+instance AddTo H1 Q+instance AddTo H1 SUB+instance AddTo H1 SUP+instance AddTo H1 SPAN+instance AddTo H1 BDO+instance AddTo H1 IFRAME+instance AddTo H1 INPUT+instance AddTo H1 SELECT+instance AddTo H1 TEXTAREA+instance AddTo H1 LABEL+instance AddTo H1 BUTTON+instance TAG H2+instance AddTo H2 CDATA+instance AddTo H2 TT+instance AddTo H2 I+instance AddTo H2 B+instance AddTo H2 U+instance AddTo H2 S+instance AddTo H2 STRIKE+instance AddTo H2 BIG+instance AddTo H2 SMALL+instance AddTo H2 EM+instance AddTo H2 STRONG+instance AddTo H2 DFN+instance AddTo H2 CODE+instance AddTo H2 SAMP+instance AddTo H2 KBD+instance AddTo H2 VAR+instance AddTo H2 CITE+instance AddTo H2 ABBR+instance AddTo H2 ACRONYM+instance AddTo H2 A+instance AddTo H2 IMG+instance AddTo H2 APPLET+instance AddTo H2 OBJECT+instance AddTo H2 FONT+instance AddTo H2 BASEFONT+instance AddTo H2 BR+instance AddTo H2 SCRIPT+instance AddTo H2 MAP+instance AddTo H2 Q+instance AddTo H2 SUB+instance AddTo H2 SUP+instance AddTo H2 SPAN+instance AddTo H2 BDO+instance AddTo H2 IFRAME+instance AddTo H2 INPUT+instance AddTo H2 SELECT+instance AddTo H2 TEXTAREA+instance AddTo H2 LABEL+instance AddTo H2 BUTTON+instance TAG H3+instance AddTo H3 CDATA+instance AddTo H3 TT+instance AddTo H3 I+instance AddTo H3 B+instance AddTo H3 U+instance AddTo H3 S+instance AddTo H3 STRIKE+instance AddTo H3 BIG+instance AddTo H3 SMALL+instance AddTo H3 EM+instance AddTo H3 STRONG+instance AddTo H3 DFN+instance AddTo H3 CODE+instance AddTo H3 SAMP+instance AddTo H3 KBD+instance AddTo H3 VAR+instance AddTo H3 CITE+instance AddTo H3 ABBR+instance AddTo H3 ACRONYM+instance AddTo H3 A+instance AddTo H3 IMG+instance AddTo H3 APPLET+instance AddTo H3 OBJECT+instance AddTo H3 FONT+instance AddTo H3 BASEFONT+instance AddTo H3 BR+instance AddTo H3 SCRIPT+instance AddTo H3 MAP+instance AddTo H3 Q+instance AddTo H3 SUB+instance AddTo H3 SUP+instance AddTo H3 SPAN+instance AddTo H3 BDO+instance AddTo H3 IFRAME+instance AddTo H3 INPUT+instance AddTo H3 SELECT+instance AddTo H3 TEXTAREA+instance AddTo H3 LABEL+instance AddTo H3 BUTTON+instance TAG H4+instance AddTo H4 CDATA+instance AddTo H4 TT+instance AddTo H4 I+instance AddTo H4 B+instance AddTo H4 U+instance AddTo H4 S+instance AddTo H4 STRIKE+instance AddTo H4 BIG+instance AddTo H4 SMALL+instance AddTo H4 EM+instance AddTo H4 STRONG+instance AddTo H4 DFN+instance AddTo H4 CODE+instance AddTo H4 SAMP+instance AddTo H4 KBD+instance AddTo H4 VAR+instance AddTo H4 CITE+instance AddTo H4 ABBR+instance AddTo H4 ACRONYM+instance AddTo H4 A+instance AddTo H4 IMG+instance AddTo H4 APPLET+instance AddTo H4 OBJECT+instance AddTo H4 FONT+instance AddTo H4 BASEFONT+instance AddTo H4 BR+instance AddTo H4 SCRIPT+instance AddTo H4 MAP+instance AddTo H4 Q+instance AddTo H4 SUB+instance AddTo H4 SUP+instance AddTo H4 SPAN+instance AddTo H4 BDO+instance AddTo H4 IFRAME+instance AddTo H4 INPUT+instance AddTo H4 SELECT+instance AddTo H4 TEXTAREA+instance AddTo H4 LABEL+instance AddTo H4 BUTTON+instance TAG H5+instance AddTo H5 CDATA+instance AddTo H5 TT+instance AddTo H5 I+instance AddTo H5 B+instance AddTo H5 U+instance AddTo H5 S+instance AddTo H5 STRIKE+instance AddTo H5 BIG+instance AddTo H5 SMALL+instance AddTo H5 EM+instance AddTo H5 STRONG+instance AddTo H5 DFN+instance AddTo H5 CODE+instance AddTo H5 SAMP+instance AddTo H5 KBD+instance AddTo H5 VAR+instance AddTo H5 CITE+instance AddTo H5 ABBR+instance AddTo H5 ACRONYM+instance AddTo H5 A+instance AddTo H5 IMG+instance AddTo H5 APPLET+instance AddTo H5 OBJECT+instance AddTo H5 FONT+instance AddTo H5 BASEFONT+instance AddTo H5 BR+instance AddTo H5 SCRIPT+instance AddTo H5 MAP+instance AddTo H5 Q+instance AddTo H5 SUB+instance AddTo H5 SUP+instance AddTo H5 SPAN+instance AddTo H5 BDO+instance AddTo H5 IFRAME+instance AddTo H5 INPUT+instance AddTo H5 SELECT+instance AddTo H5 TEXTAREA+instance AddTo H5 LABEL+instance AddTo H5 BUTTON+instance TAG H6+instance AddTo H6 CDATA+instance AddTo H6 TT+instance AddTo H6 I+instance AddTo H6 B+instance AddTo H6 U+instance AddTo H6 S+instance AddTo H6 STRIKE+instance AddTo H6 BIG+instance AddTo H6 SMALL+instance AddTo H6 EM+instance AddTo H6 STRONG+instance AddTo H6 DFN+instance AddTo H6 CODE+instance AddTo H6 SAMP+instance AddTo H6 KBD+instance AddTo H6 VAR+instance AddTo H6 CITE+instance AddTo H6 ABBR+instance AddTo H6 ACRONYM+instance AddTo H6 A+instance AddTo H6 IMG+instance AddTo H6 APPLET+instance AddTo H6 OBJECT+instance AddTo H6 FONT+instance AddTo H6 BASEFONT+instance AddTo H6 BR+instance AddTo H6 SCRIPT+instance AddTo H6 MAP+instance AddTo H6 Q+instance AddTo H6 SUB+instance AddTo H6 SUP+instance AddTo H6 SPAN+instance AddTo H6 BDO+instance AddTo H6 IFRAME+instance AddTo H6 INPUT+instance AddTo H6 SELECT+instance AddTo H6 TEXTAREA+instance AddTo H6 LABEL+instance AddTo H6 BUTTON+instance TAG P+instance AddTo P CDATA+instance AddTo P TT+instance AddTo P I+instance AddTo P B+instance AddTo P U+instance AddTo P S+instance AddTo P STRIKE+instance AddTo P BIG+instance AddTo P SMALL+instance AddTo P EM+instance AddTo P STRONG+instance AddTo P DFN+instance AddTo P CODE+instance AddTo P SAMP+instance AddTo P KBD+instance AddTo P VAR+instance AddTo P CITE+instance AddTo P ABBR+instance AddTo P ACRONYM+instance AddTo P A+instance AddTo P IMG+instance AddTo P APPLET+instance AddTo P OBJECT+instance AddTo P FONT+instance AddTo P BASEFONT+instance AddTo P BR+instance AddTo P SCRIPT+instance AddTo P MAP+instance AddTo P Q+instance AddTo P SUB+instance AddTo P SUP+instance AddTo P SPAN+instance AddTo P BDO+instance AddTo P IFRAME+instance AddTo P INPUT+instance AddTo P SELECT+instance AddTo P TEXTAREA+instance AddTo P LABEL+instance AddTo P BUTTON+instance TAG HR where make = make_empty+instance TAG APPLET+instance AddTo APPLET PARAM+instance AddTo APPLET P+instance AddTo APPLET H1+instance AddTo APPLET H2+instance AddTo APPLET H3+instance AddTo APPLET H4+instance AddTo APPLET H5+instance AddTo APPLET H6+instance AddTo APPLET UL+instance AddTo APPLET OL+instance AddTo APPLET DIR+instance AddTo APPLET MENU+instance AddTo APPLET PRE+instance AddTo APPLET DL+instance AddTo APPLET DIV+instance AddTo APPLET CENTER+instance AddTo APPLET NOSCRIPT+instance AddTo APPLET NOFRAMES+instance AddTo APPLET BLOCKQUOTE+instance AddTo APPLET FORM+instance AddTo APPLET ISINDEX+instance AddTo APPLET HR+instance AddTo APPLET TABLE+instance AddTo APPLET FIELDSET+instance AddTo APPLET ADDRESS+instance AddTo APPLET CDATA+instance AddTo APPLET TT+instance AddTo APPLET I+instance AddTo APPLET B+instance AddTo APPLET U+instance AddTo APPLET S+instance AddTo APPLET STRIKE+instance AddTo APPLET BIG+instance AddTo APPLET SMALL+instance AddTo APPLET EM+instance AddTo APPLET STRONG+instance AddTo APPLET DFN+instance AddTo APPLET CODE+instance AddTo APPLET SAMP+instance AddTo APPLET KBD+instance AddTo APPLET VAR+instance AddTo APPLET CITE+instance AddTo APPLET ABBR+instance AddTo APPLET ACRONYM+instance AddTo APPLET A+instance AddTo APPLET IMG+instance AddTo APPLET APPLET+instance AddTo APPLET OBJECT+instance AddTo APPLET FONT+instance AddTo APPLET BASEFONT+instance AddTo APPLET BR+instance AddTo APPLET SCRIPT+instance AddTo APPLET MAP+instance AddTo APPLET Q+instance AddTo APPLET SUB+instance AddTo APPLET SUP+instance AddTo APPLET SPAN+instance AddTo APPLET BDO+instance AddTo APPLET IFRAME+instance AddTo APPLET INPUT+instance AddTo APPLET SELECT+instance AddTo APPLET TEXTAREA+instance AddTo APPLET LABEL+instance AddTo APPLET BUTTON+instance TAG PARAM where make = make_empty+instance TAG OBJECT+instance AddTo OBJECT PARAM+instance AddTo OBJECT P+instance AddTo OBJECT H1+instance AddTo OBJECT H2+instance AddTo OBJECT H3+instance AddTo OBJECT H4+instance AddTo OBJECT H5+instance AddTo OBJECT H6+instance AddTo OBJECT UL+instance AddTo OBJECT OL+instance AddTo OBJECT DIR+instance AddTo OBJECT MENU+instance AddTo OBJECT PRE+instance AddTo OBJECT DL+instance AddTo OBJECT DIV+instance AddTo OBJECT CENTER+instance AddTo OBJECT NOSCRIPT+instance AddTo OBJECT NOFRAMES+instance AddTo OBJECT BLOCKQUOTE+instance AddTo OBJECT FORM+instance AddTo OBJECT ISINDEX+instance AddTo OBJECT HR+instance AddTo OBJECT TABLE+instance AddTo OBJECT FIELDSET+instance AddTo OBJECT ADDRESS+instance AddTo OBJECT CDATA+instance AddTo OBJECT TT+instance AddTo OBJECT I+instance AddTo OBJECT B+instance AddTo OBJECT U+instance AddTo OBJECT S+instance AddTo OBJECT STRIKE+instance AddTo OBJECT BIG+instance AddTo OBJECT SMALL+instance AddTo OBJECT EM+instance AddTo OBJECT STRONG+instance AddTo OBJECT DFN+instance AddTo OBJECT CODE+instance AddTo OBJECT SAMP+instance AddTo OBJECT KBD+instance AddTo OBJECT VAR+instance AddTo OBJECT CITE+instance AddTo OBJECT ABBR+instance AddTo OBJECT ACRONYM+instance AddTo OBJECT A+instance AddTo OBJECT IMG+instance AddTo OBJECT APPLET+instance AddTo OBJECT OBJECT+instance AddTo OBJECT FONT+instance AddTo OBJECT BASEFONT+instance AddTo OBJECT BR+instance AddTo OBJECT SCRIPT+instance AddTo OBJECT MAP+instance AddTo OBJECT Q+instance AddTo OBJECT SUB+instance AddTo OBJECT SUP+instance AddTo OBJECT SPAN+instance AddTo OBJECT BDO+instance AddTo OBJECT IFRAME+instance AddTo OBJECT INPUT+instance AddTo OBJECT SELECT+instance AddTo OBJECT TEXTAREA+instance AddTo OBJECT LABEL+instance AddTo OBJECT BUTTON+instance TAG IMG where make = make_empty+instance TAG LINK where make = make_empty+instance TAG AREA where make = make_empty+instance TAG MAP+instance AddTo MAP P+instance AddTo MAP H1+instance AddTo MAP H2+instance AddTo MAP H3+instance AddTo MAP H4+instance AddTo MAP H5+instance AddTo MAP H6+instance AddTo MAP UL+instance AddTo MAP OL+instance AddTo MAP DIR+instance AddTo MAP MENU+instance AddTo MAP PRE+instance AddTo MAP DL+instance AddTo MAP DIV+instance AddTo MAP CENTER+instance AddTo MAP NOSCRIPT+instance AddTo MAP NOFRAMES+instance AddTo MAP BLOCKQUOTE+instance AddTo MAP FORM+instance AddTo MAP ISINDEX+instance AddTo MAP HR+instance AddTo MAP TABLE+instance AddTo MAP FIELDSET+instance AddTo MAP ADDRESS+instance AddTo MAP AREA+instance TAG A+instance AddTo A CDATA+instance AddTo A TT+instance AddTo A I+instance AddTo A B+instance AddTo A U+instance AddTo A S+instance AddTo A STRIKE+instance AddTo A BIG+instance AddTo A SMALL+instance AddTo A EM+instance AddTo A STRONG+instance AddTo A DFN+instance AddTo A CODE+instance AddTo A SAMP+instance AddTo A KBD+instance AddTo A VAR+instance AddTo A CITE+instance AddTo A ABBR+instance AddTo A ACRONYM+instance AddTo A IMG+instance AddTo A APPLET+instance AddTo A OBJECT+instance AddTo A FONT+instance AddTo A BASEFONT+instance AddTo A BR+instance AddTo A SCRIPT+instance AddTo A MAP+instance AddTo A Q+instance AddTo A SUB+instance AddTo A SUP+instance AddTo A SPAN+instance AddTo A BDO+instance AddTo A IFRAME+instance AddTo A INPUT+instance AddTo A SELECT+instance AddTo A TEXTAREA+instance AddTo A LABEL+instance AddTo A BUTTON+instance TAG CENTER+instance AddTo CENTER P+instance AddTo CENTER H1+instance AddTo CENTER H2+instance AddTo CENTER H3+instance AddTo CENTER H4+instance AddTo CENTER H5+instance AddTo CENTER H6+instance AddTo CENTER UL+instance AddTo CENTER OL+instance AddTo CENTER DIR+instance AddTo CENTER MENU+instance AddTo CENTER PRE+instance AddTo CENTER DL+instance AddTo CENTER DIV+instance AddTo CENTER CENTER+instance AddTo CENTER NOSCRIPT+instance AddTo CENTER NOFRAMES+instance AddTo CENTER BLOCKQUOTE+instance AddTo CENTER FORM+instance AddTo CENTER ISINDEX+instance AddTo CENTER HR+instance AddTo CENTER TABLE+instance AddTo CENTER FIELDSET+instance AddTo CENTER ADDRESS+instance AddTo CENTER CDATA+instance AddTo CENTER TT+instance AddTo CENTER I+instance AddTo CENTER B+instance AddTo CENTER U+instance AddTo CENTER S+instance AddTo CENTER STRIKE+instance AddTo CENTER BIG+instance AddTo CENTER SMALL+instance AddTo CENTER EM+instance AddTo CENTER STRONG+instance AddTo CENTER DFN+instance AddTo CENTER CODE+instance AddTo CENTER SAMP+instance AddTo CENTER KBD+instance AddTo CENTER VAR+instance AddTo CENTER CITE+instance AddTo CENTER ABBR+instance AddTo CENTER ACRONYM+instance AddTo CENTER A+instance AddTo CENTER IMG+instance AddTo CENTER APPLET+instance AddTo CENTER OBJECT+instance AddTo CENTER FONT+instance AddTo CENTER BASEFONT+instance AddTo CENTER BR+instance AddTo CENTER SCRIPT+instance AddTo CENTER MAP+instance AddTo CENTER Q+instance AddTo CENTER SUB+instance AddTo CENTER SUP+instance AddTo CENTER SPAN+instance AddTo CENTER BDO+instance AddTo CENTER IFRAME+instance AddTo CENTER INPUT+instance AddTo CENTER SELECT+instance AddTo CENTER TEXTAREA+instance AddTo CENTER LABEL+instance AddTo CENTER BUTTON+instance TAG DIV+instance AddTo DIV P+instance AddTo DIV H1+instance AddTo DIV H2+instance AddTo DIV H3+instance AddTo DIV H4+instance AddTo DIV H5+instance AddTo DIV H6+instance AddTo DIV UL+instance AddTo DIV OL+instance AddTo DIV DIR+instance AddTo DIV MENU+instance AddTo DIV PRE+instance AddTo DIV DL+instance AddTo DIV DIV+instance AddTo DIV CENTER+instance AddTo DIV NOSCRIPT+instance AddTo DIV NOFRAMES+instance AddTo DIV BLOCKQUOTE+instance AddTo DIV FORM+instance AddTo DIV ISINDEX+instance AddTo DIV HR+instance AddTo DIV TABLE+instance AddTo DIV FIELDSET+instance AddTo DIV ADDRESS+instance AddTo DIV CDATA+instance AddTo DIV TT+instance AddTo DIV I+instance AddTo DIV B+instance AddTo DIV U+instance AddTo DIV S+instance AddTo DIV STRIKE+instance AddTo DIV BIG+instance AddTo DIV SMALL+instance AddTo DIV EM+instance AddTo DIV STRONG+instance AddTo DIV DFN+instance AddTo DIV CODE+instance AddTo DIV SAMP+instance AddTo DIV KBD+instance AddTo DIV VAR+instance AddTo DIV CITE+instance AddTo DIV ABBR+instance AddTo DIV ACRONYM+instance AddTo DIV A+instance AddTo DIV IMG+instance AddTo DIV APPLET+instance AddTo DIV OBJECT+instance AddTo DIV FONT+instance AddTo DIV BASEFONT+instance AddTo DIV BR+instance AddTo DIV SCRIPT+instance AddTo DIV MAP+instance AddTo DIV Q+instance AddTo DIV SUB+instance AddTo DIV SUP+instance AddTo DIV SPAN+instance AddTo DIV BDO+instance AddTo DIV IFRAME+instance AddTo DIV INPUT+instance AddTo DIV SELECT+instance AddTo DIV TEXTAREA+instance AddTo DIV LABEL+instance AddTo DIV BUTTON+instance TAG ADDRESS+instance AddTo ADDRESS CDATA+instance AddTo ADDRESS TT+instance AddTo ADDRESS I+instance AddTo ADDRESS B+instance AddTo ADDRESS U+instance AddTo ADDRESS S+instance AddTo ADDRESS STRIKE+instance AddTo ADDRESS BIG+instance AddTo ADDRESS SMALL+instance AddTo ADDRESS EM+instance AddTo ADDRESS STRONG+instance AddTo ADDRESS DFN+instance AddTo ADDRESS CODE+instance AddTo ADDRESS SAMP+instance AddTo ADDRESS KBD+instance AddTo ADDRESS VAR+instance AddTo ADDRESS CITE+instance AddTo ADDRESS ABBR+instance AddTo ADDRESS ACRONYM+instance AddTo ADDRESS A+instance AddTo ADDRESS IMG+instance AddTo ADDRESS APPLET+instance AddTo ADDRESS OBJECT+instance AddTo ADDRESS FONT+instance AddTo ADDRESS BASEFONT+instance AddTo ADDRESS BR+instance AddTo ADDRESS SCRIPT+instance AddTo ADDRESS MAP+instance AddTo ADDRESS Q+instance AddTo ADDRESS SUB+instance AddTo ADDRESS SUP+instance AddTo ADDRESS SPAN+instance AddTo ADDRESS BDO+instance AddTo ADDRESS IFRAME+instance AddTo ADDRESS INPUT+instance AddTo ADDRESS SELECT+instance AddTo ADDRESS TEXTAREA+instance AddTo ADDRESS LABEL+instance AddTo ADDRESS BUTTON+instance AddTo ADDRESS P+instance TAG BODY+instance AddTo BODY P+instance AddTo BODY H1+instance AddTo BODY H2+instance AddTo BODY H3+instance AddTo BODY H4+instance AddTo BODY H5+instance AddTo BODY H6+instance AddTo BODY UL+instance AddTo BODY OL+instance AddTo BODY DIR+instance AddTo BODY MENU+instance AddTo BODY PRE+instance AddTo BODY DL+instance AddTo BODY DIV+instance AddTo BODY CENTER+instance AddTo BODY NOSCRIPT+instance AddTo BODY NOFRAMES+instance AddTo BODY BLOCKQUOTE+instance AddTo BODY FORM+instance AddTo BODY ISINDEX+instance AddTo BODY HR+instance AddTo BODY TABLE+instance AddTo BODY FIELDSET+instance AddTo BODY ADDRESS+instance AddTo BODY CDATA+instance AddTo BODY TT+instance AddTo BODY I+instance AddTo BODY B+instance AddTo BODY U+instance AddTo BODY S+instance AddTo BODY STRIKE+instance AddTo BODY BIG+instance AddTo BODY SMALL+instance AddTo BODY EM+instance AddTo BODY STRONG+instance AddTo BODY DFN+instance AddTo BODY CODE+instance AddTo BODY SAMP+instance AddTo BODY KBD+instance AddTo BODY VAR+instance AddTo BODY CITE+instance AddTo BODY ABBR+instance AddTo BODY ACRONYM+instance AddTo BODY A+instance AddTo BODY IMG+instance AddTo BODY APPLET+instance AddTo BODY OBJECT+instance AddTo BODY FONT+instance AddTo BODY BASEFONT+instance AddTo BODY BR+instance AddTo BODY SCRIPT+instance AddTo BODY MAP+instance AddTo BODY Q+instance AddTo BODY SUB+instance AddTo BODY SUP+instance AddTo BODY SPAN+instance AddTo BODY BDO+instance AddTo BODY IFRAME+instance AddTo BODY INPUT+instance AddTo BODY SELECT+instance AddTo BODY TEXTAREA+instance AddTo BODY LABEL+instance AddTo BODY BUTTON+instance AddTo BODY INS+instance AddTo BODY DEL+instance TAG BR where make = make_empty+instance TAG FONT+instance AddTo FONT CDATA+instance AddTo FONT TT+instance AddTo FONT I+instance AddTo FONT B+instance AddTo FONT U+instance AddTo FONT S+instance AddTo FONT STRIKE+instance AddTo FONT BIG+instance AddTo FONT SMALL+instance AddTo FONT EM+instance AddTo FONT STRONG+instance AddTo FONT DFN+instance AddTo FONT CODE+instance AddTo FONT SAMP+instance AddTo FONT KBD+instance AddTo FONT VAR+instance AddTo FONT CITE+instance AddTo FONT ABBR+instance AddTo FONT ACRONYM+instance AddTo FONT A+instance AddTo FONT IMG+instance AddTo FONT APPLET+instance AddTo FONT OBJECT+instance AddTo FONT FONT+instance AddTo FONT BASEFONT+instance AddTo FONT BR+instance AddTo FONT SCRIPT+instance AddTo FONT MAP+instance AddTo FONT Q+instance AddTo FONT SUB+instance AddTo FONT SUP+instance AddTo FONT SPAN+instance AddTo FONT BDO+instance AddTo FONT IFRAME+instance AddTo FONT INPUT+instance AddTo FONT SELECT+instance AddTo FONT TEXTAREA+instance AddTo FONT LABEL+instance AddTo FONT BUTTON+instance TAG BASEFONT where make = make_empty+instance TAG BDO+instance AddTo BDO CDATA+instance AddTo BDO TT+instance AddTo BDO I+instance AddTo BDO B+instance AddTo BDO U+instance AddTo BDO S+instance AddTo BDO STRIKE+instance AddTo BDO BIG+instance AddTo BDO SMALL+instance AddTo BDO EM+instance AddTo BDO STRONG+instance AddTo BDO DFN+instance AddTo BDO CODE+instance AddTo BDO SAMP+instance AddTo BDO KBD+instance AddTo BDO VAR+instance AddTo BDO CITE+instance AddTo BDO ABBR+instance AddTo BDO ACRONYM+instance AddTo BDO A+instance AddTo BDO IMG+instance AddTo BDO APPLET+instance AddTo BDO OBJECT+instance AddTo BDO FONT+instance AddTo BDO BASEFONT+instance AddTo BDO BR+instance AddTo BDO SCRIPT+instance AddTo BDO MAP+instance AddTo BDO Q+instance AddTo BDO SUB+instance AddTo BDO SUP+instance AddTo BDO SPAN+instance AddTo BDO BDO+instance AddTo BDO IFRAME+instance AddTo BDO INPUT+instance AddTo BDO SELECT+instance AddTo BDO TEXTAREA+instance AddTo BDO LABEL+instance AddTo BDO BUTTON+instance TAG SPAN+instance AddTo SPAN CDATA+instance AddTo SPAN TT+instance AddTo SPAN I+instance AddTo SPAN B+instance AddTo SPAN U+instance AddTo SPAN S+instance AddTo SPAN STRIKE+instance AddTo SPAN BIG+instance AddTo SPAN SMALL+instance AddTo SPAN EM+instance AddTo SPAN STRONG+instance AddTo SPAN DFN+instance AddTo SPAN CODE+instance AddTo SPAN SAMP+instance AddTo SPAN KBD+instance AddTo SPAN VAR+instance AddTo SPAN CITE+instance AddTo SPAN ABBR+instance AddTo SPAN ACRONYM+instance AddTo SPAN A+instance AddTo SPAN IMG+instance AddTo SPAN APPLET+instance AddTo SPAN OBJECT+instance AddTo SPAN FONT+instance AddTo SPAN BASEFONT+instance AddTo SPAN BR+instance AddTo SPAN SCRIPT+instance AddTo SPAN MAP+instance AddTo SPAN Q+instance AddTo SPAN SUB+instance AddTo SPAN SUP+instance AddTo SPAN SPAN+instance AddTo SPAN BDO+instance AddTo SPAN IFRAME+instance AddTo SPAN INPUT+instance AddTo SPAN SELECT+instance AddTo SPAN TEXTAREA+instance AddTo SPAN LABEL+instance AddTo SPAN BUTTON+instance TAG SUB+instance AddTo SUB CDATA+instance AddTo SUB TT+instance AddTo SUB I+instance AddTo SUB B+instance AddTo SUB U+instance AddTo SUB S+instance AddTo SUB STRIKE+instance AddTo SUB BIG+instance AddTo SUB SMALL+instance AddTo SUB EM+instance AddTo SUB STRONG+instance AddTo SUB DFN+instance AddTo SUB CODE+instance AddTo SUB SAMP+instance AddTo SUB KBD+instance AddTo SUB VAR+instance AddTo SUB CITE+instance AddTo SUB ABBR+instance AddTo SUB ACRONYM+instance AddTo SUB A+instance AddTo SUB IMG+instance AddTo SUB APPLET+instance AddTo SUB OBJECT+instance AddTo SUB FONT+instance AddTo SUB BASEFONT+instance AddTo SUB BR+instance AddTo SUB SCRIPT+instance AddTo SUB MAP+instance AddTo SUB Q+instance AddTo SUB SUB+instance AddTo SUB SUP+instance AddTo SUB SPAN+instance AddTo SUB BDO+instance AddTo SUB IFRAME+instance AddTo SUB INPUT+instance AddTo SUB SELECT+instance AddTo SUB TEXTAREA+instance AddTo SUB LABEL+instance AddTo SUB BUTTON+instance TAG SUP+instance AddTo SUP CDATA+instance AddTo SUP TT+instance AddTo SUP I+instance AddTo SUP B+instance AddTo SUP U+instance AddTo SUP S+instance AddTo SUP STRIKE+instance AddTo SUP BIG+instance AddTo SUP SMALL+instance AddTo SUP EM+instance AddTo SUP STRONG+instance AddTo SUP DFN+instance AddTo SUP CODE+instance AddTo SUP SAMP+instance AddTo SUP KBD+instance AddTo SUP VAR+instance AddTo SUP CITE+instance AddTo SUP ABBR+instance AddTo SUP ACRONYM+instance AddTo SUP A+instance AddTo SUP IMG+instance AddTo SUP APPLET+instance AddTo SUP OBJECT+instance AddTo SUP FONT+instance AddTo SUP BASEFONT+instance AddTo SUP BR+instance AddTo SUP SCRIPT+instance AddTo SUP MAP+instance AddTo SUP Q+instance AddTo SUP SUB+instance AddTo SUP SUP+instance AddTo SUP SPAN+instance AddTo SUP BDO+instance AddTo SUP IFRAME+instance AddTo SUP INPUT+instance AddTo SUP SELECT+instance AddTo SUP TEXTAREA+instance AddTo SUP LABEL+instance AddTo SUP BUTTON+instance TAG TT+instance AddTo TT CDATA+instance AddTo TT TT+instance AddTo TT I+instance AddTo TT B+instance AddTo TT U+instance AddTo TT S+instance AddTo TT STRIKE+instance AddTo TT BIG+instance AddTo TT SMALL+instance AddTo TT EM+instance AddTo TT STRONG+instance AddTo TT DFN+instance AddTo TT CODE+instance AddTo TT SAMP+instance AddTo TT KBD+instance AddTo TT VAR+instance AddTo TT CITE+instance AddTo TT ABBR+instance AddTo TT ACRONYM+instance AddTo TT A+instance AddTo TT IMG+instance AddTo TT APPLET+instance AddTo TT OBJECT+instance AddTo TT FONT+instance AddTo TT BASEFONT+instance AddTo TT BR+instance AddTo TT SCRIPT+instance AddTo TT MAP+instance AddTo TT Q+instance AddTo TT SUB+instance AddTo TT SUP+instance AddTo TT SPAN+instance AddTo TT BDO+instance AddTo TT IFRAME+instance AddTo TT INPUT+instance AddTo TT SELECT+instance AddTo TT TEXTAREA+instance AddTo TT LABEL+instance AddTo TT BUTTON+instance TAG I+instance AddTo I CDATA+instance AddTo I TT+instance AddTo I I+instance AddTo I B+instance AddTo I U+instance AddTo I S+instance AddTo I STRIKE+instance AddTo I BIG+instance AddTo I SMALL+instance AddTo I EM+instance AddTo I STRONG+instance AddTo I DFN+instance AddTo I CODE+instance AddTo I SAMP+instance AddTo I KBD+instance AddTo I VAR+instance AddTo I CITE+instance AddTo I ABBR+instance AddTo I ACRONYM+instance AddTo I A+instance AddTo I IMG+instance AddTo I APPLET+instance AddTo I OBJECT+instance AddTo I FONT+instance AddTo I BASEFONT+instance AddTo I BR+instance AddTo I SCRIPT+instance AddTo I MAP+instance AddTo I Q+instance AddTo I SUB+instance AddTo I SUP+instance AddTo I SPAN+instance AddTo I BDO+instance AddTo I IFRAME+instance AddTo I INPUT+instance AddTo I SELECT+instance AddTo I TEXTAREA+instance AddTo I LABEL+instance AddTo I BUTTON+instance TAG B+instance AddTo B CDATA+instance AddTo B TT+instance AddTo B I+instance AddTo B B+instance AddTo B U+instance AddTo B S+instance AddTo B STRIKE+instance AddTo B BIG+instance AddTo B SMALL+instance AddTo B EM+instance AddTo B STRONG+instance AddTo B DFN+instance AddTo B CODE+instance AddTo B SAMP+instance AddTo B KBD+instance AddTo B VAR+instance AddTo B CITE+instance AddTo B ABBR+instance AddTo B ACRONYM+instance AddTo B A+instance AddTo B IMG+instance AddTo B APPLET+instance AddTo B OBJECT+instance AddTo B FONT+instance AddTo B BASEFONT+instance AddTo B BR+instance AddTo B SCRIPT+instance AddTo B MAP+instance AddTo B Q+instance AddTo B SUB+instance AddTo B SUP+instance AddTo B SPAN+instance AddTo B BDO+instance AddTo B IFRAME+instance AddTo B INPUT+instance AddTo B SELECT+instance AddTo B TEXTAREA+instance AddTo B LABEL+instance AddTo B BUTTON+instance TAG U+instance AddTo U CDATA+instance AddTo U TT+instance AddTo U I+instance AddTo U B+instance AddTo U U+instance AddTo U S+instance AddTo U STRIKE+instance AddTo U BIG+instance AddTo U SMALL+instance AddTo U EM+instance AddTo U STRONG+instance AddTo U DFN+instance AddTo U CODE+instance AddTo U SAMP+instance AddTo U KBD+instance AddTo U VAR+instance AddTo U CITE+instance AddTo U ABBR+instance AddTo U ACRONYM+instance AddTo U A+instance AddTo U IMG+instance AddTo U APPLET+instance AddTo U OBJECT+instance AddTo U FONT+instance AddTo U BASEFONT+instance AddTo U BR+instance AddTo U SCRIPT+instance AddTo U MAP+instance AddTo U Q+instance AddTo U SUB+instance AddTo U SUP+instance AddTo U SPAN+instance AddTo U BDO+instance AddTo U IFRAME+instance AddTo U INPUT+instance AddTo U SELECT+instance AddTo U TEXTAREA+instance AddTo U LABEL+instance AddTo U BUTTON+instance TAG S+instance AddTo S CDATA+instance AddTo S TT+instance AddTo S I+instance AddTo S B+instance AddTo S U+instance AddTo S S+instance AddTo S STRIKE+instance AddTo S BIG+instance AddTo S SMALL+instance AddTo S EM+instance AddTo S STRONG+instance AddTo S DFN+instance AddTo S CODE+instance AddTo S SAMP+instance AddTo S KBD+instance AddTo S VAR+instance AddTo S CITE+instance AddTo S ABBR+instance AddTo S ACRONYM+instance AddTo S A+instance AddTo S IMG+instance AddTo S APPLET+instance AddTo S OBJECT+instance AddTo S FONT+instance AddTo S BASEFONT+instance AddTo S BR+instance AddTo S SCRIPT+instance AddTo S MAP+instance AddTo S Q+instance AddTo S SUB+instance AddTo S SUP+instance AddTo S SPAN+instance AddTo S BDO+instance AddTo S IFRAME+instance AddTo S INPUT+instance AddTo S SELECT+instance AddTo S TEXTAREA+instance AddTo S LABEL+instance AddTo S BUTTON+instance TAG STRIKE+instance AddTo STRIKE CDATA+instance AddTo STRIKE TT+instance AddTo STRIKE I+instance AddTo STRIKE B+instance AddTo STRIKE U+instance AddTo STRIKE S+instance AddTo STRIKE STRIKE+instance AddTo STRIKE BIG+instance AddTo STRIKE SMALL+instance AddTo STRIKE EM+instance AddTo STRIKE STRONG+instance AddTo STRIKE DFN+instance AddTo STRIKE CODE+instance AddTo STRIKE SAMP+instance AddTo STRIKE KBD+instance AddTo STRIKE VAR+instance AddTo STRIKE CITE+instance AddTo STRIKE ABBR+instance AddTo STRIKE ACRONYM+instance AddTo STRIKE A+instance AddTo STRIKE IMG+instance AddTo STRIKE APPLET+instance AddTo STRIKE OBJECT+instance AddTo STRIKE FONT+instance AddTo STRIKE BASEFONT+instance AddTo STRIKE BR+instance AddTo STRIKE SCRIPT+instance AddTo STRIKE MAP+instance AddTo STRIKE Q+instance AddTo STRIKE SUB+instance AddTo STRIKE SUP+instance AddTo STRIKE SPAN+instance AddTo STRIKE BDO+instance AddTo STRIKE IFRAME+instance AddTo STRIKE INPUT+instance AddTo STRIKE SELECT+instance AddTo STRIKE TEXTAREA+instance AddTo STRIKE LABEL+instance AddTo STRIKE BUTTON+instance TAG BIG+instance AddTo BIG CDATA+instance AddTo BIG TT+instance AddTo BIG I+instance AddTo BIG B+instance AddTo BIG U+instance AddTo BIG S+instance AddTo BIG STRIKE+instance AddTo BIG BIG+instance AddTo BIG SMALL+instance AddTo BIG EM+instance AddTo BIG STRONG+instance AddTo BIG DFN+instance AddTo BIG CODE+instance AddTo BIG SAMP+instance AddTo BIG KBD+instance AddTo BIG VAR+instance AddTo BIG CITE+instance AddTo BIG ABBR+instance AddTo BIG ACRONYM+instance AddTo BIG A+instance AddTo BIG IMG+instance AddTo BIG APPLET+instance AddTo BIG OBJECT+instance AddTo BIG FONT+instance AddTo BIG BASEFONT+instance AddTo BIG BR+instance AddTo BIG SCRIPT+instance AddTo BIG MAP+instance AddTo BIG Q+instance AddTo BIG SUB+instance AddTo BIG SUP+instance AddTo BIG SPAN+instance AddTo BIG BDO+instance AddTo BIG IFRAME+instance AddTo BIG INPUT+instance AddTo BIG SELECT+instance AddTo BIG TEXTAREA+instance AddTo BIG LABEL+instance AddTo BIG BUTTON+instance TAG SMALL+instance AddTo SMALL CDATA+instance AddTo SMALL TT+instance AddTo SMALL I+instance AddTo SMALL B+instance AddTo SMALL U+instance AddTo SMALL S+instance AddTo SMALL STRIKE+instance AddTo SMALL BIG+instance AddTo SMALL SMALL+instance AddTo SMALL EM+instance AddTo SMALL STRONG+instance AddTo SMALL DFN+instance AddTo SMALL CODE+instance AddTo SMALL SAMP+instance AddTo SMALL KBD+instance AddTo SMALL VAR+instance AddTo SMALL CITE+instance AddTo SMALL ABBR+instance AddTo SMALL ACRONYM+instance AddTo SMALL A+instance AddTo SMALL IMG+instance AddTo SMALL APPLET+instance AddTo SMALL OBJECT+instance AddTo SMALL FONT+instance AddTo SMALL BASEFONT+instance AddTo SMALL BR+instance AddTo SMALL SCRIPT+instance AddTo SMALL MAP+instance AddTo SMALL Q+instance AddTo SMALL SUB+instance AddTo SMALL SUP+instance AddTo SMALL SPAN+instance AddTo SMALL BDO+instance AddTo SMALL IFRAME+instance AddTo SMALL INPUT+instance AddTo SMALL SELECT+instance AddTo SMALL TEXTAREA+instance AddTo SMALL LABEL+instance AddTo SMALL BUTTON+instance TAG EM+instance AddTo EM CDATA+instance AddTo EM TT+instance AddTo EM I+instance AddTo EM B+instance AddTo EM U+instance AddTo EM S+instance AddTo EM STRIKE+instance AddTo EM BIG+instance AddTo EM SMALL+instance AddTo EM EM+instance AddTo EM STRONG+instance AddTo EM DFN+instance AddTo EM CODE+instance AddTo EM SAMP+instance AddTo EM KBD+instance AddTo EM VAR+instance AddTo EM CITE+instance AddTo EM ABBR+instance AddTo EM ACRONYM+instance AddTo EM A+instance AddTo EM IMG+instance AddTo EM APPLET+instance AddTo EM OBJECT+instance AddTo EM FONT+instance AddTo EM BASEFONT+instance AddTo EM BR+instance AddTo EM SCRIPT+instance AddTo EM MAP+instance AddTo EM Q+instance AddTo EM SUB+instance AddTo EM SUP+instance AddTo EM SPAN+instance AddTo EM BDO+instance AddTo EM IFRAME+instance AddTo EM INPUT+instance AddTo EM SELECT+instance AddTo EM TEXTAREA+instance AddTo EM LABEL+instance AddTo EM BUTTON+instance TAG STRONG+instance AddTo STRONG CDATA+instance AddTo STRONG TT+instance AddTo STRONG I+instance AddTo STRONG B+instance AddTo STRONG U+instance AddTo STRONG S+instance AddTo STRONG STRIKE+instance AddTo STRONG BIG+instance AddTo STRONG SMALL+instance AddTo STRONG EM+instance AddTo STRONG STRONG+instance AddTo STRONG DFN+instance AddTo STRONG CODE+instance AddTo STRONG SAMP+instance AddTo STRONG KBD+instance AddTo STRONG VAR+instance AddTo STRONG CITE+instance AddTo STRONG ABBR+instance AddTo STRONG ACRONYM+instance AddTo STRONG A+instance AddTo STRONG IMG+instance AddTo STRONG APPLET+instance AddTo STRONG OBJECT+instance AddTo STRONG FONT+instance AddTo STRONG BASEFONT+instance AddTo STRONG BR+instance AddTo STRONG SCRIPT+instance AddTo STRONG MAP+instance AddTo STRONG Q+instance AddTo STRONG SUB+instance AddTo STRONG SUP+instance AddTo STRONG SPAN+instance AddTo STRONG BDO+instance AddTo STRONG IFRAME+instance AddTo STRONG INPUT+instance AddTo STRONG SELECT+instance AddTo STRONG TEXTAREA+instance AddTo STRONG LABEL+instance AddTo STRONG BUTTON+instance TAG DFN+instance AddTo DFN CDATA+instance AddTo DFN TT+instance AddTo DFN I+instance AddTo DFN B+instance AddTo DFN U+instance AddTo DFN S+instance AddTo DFN STRIKE+instance AddTo DFN BIG+instance AddTo DFN SMALL+instance AddTo DFN EM+instance AddTo DFN STRONG+instance AddTo DFN DFN+instance AddTo DFN CODE+instance AddTo DFN SAMP+instance AddTo DFN KBD+instance AddTo DFN VAR+instance AddTo DFN CITE+instance AddTo DFN ABBR+instance AddTo DFN ACRONYM+instance AddTo DFN A+instance AddTo DFN IMG+instance AddTo DFN APPLET+instance AddTo DFN OBJECT+instance AddTo DFN FONT+instance AddTo DFN BASEFONT+instance AddTo DFN BR+instance AddTo DFN SCRIPT+instance AddTo DFN MAP+instance AddTo DFN Q+instance AddTo DFN SUB+instance AddTo DFN SUP+instance AddTo DFN SPAN+instance AddTo DFN BDO+instance AddTo DFN IFRAME+instance AddTo DFN INPUT+instance AddTo DFN SELECT+instance AddTo DFN TEXTAREA+instance AddTo DFN LABEL+instance AddTo DFN BUTTON+instance TAG CODE+instance AddTo CODE CDATA+instance AddTo CODE TT+instance AddTo CODE I+instance AddTo CODE B+instance AddTo CODE U+instance AddTo CODE S+instance AddTo CODE STRIKE+instance AddTo CODE BIG+instance AddTo CODE SMALL+instance AddTo CODE EM+instance AddTo CODE STRONG+instance AddTo CODE DFN+instance AddTo CODE CODE+instance AddTo CODE SAMP+instance AddTo CODE KBD+instance AddTo CODE VAR+instance AddTo CODE CITE+instance AddTo CODE ABBR+instance AddTo CODE ACRONYM+instance AddTo CODE A+instance AddTo CODE IMG+instance AddTo CODE APPLET+instance AddTo CODE OBJECT+instance AddTo CODE FONT+instance AddTo CODE BASEFONT+instance AddTo CODE BR+instance AddTo CODE SCRIPT+instance AddTo CODE MAP+instance AddTo CODE Q+instance AddTo CODE SUB+instance AddTo CODE SUP+instance AddTo CODE SPAN+instance AddTo CODE BDO+instance AddTo CODE IFRAME+instance AddTo CODE INPUT+instance AddTo CODE SELECT+instance AddTo CODE TEXTAREA+instance AddTo CODE LABEL+instance AddTo CODE BUTTON+instance TAG SAMP+instance AddTo SAMP CDATA+instance AddTo SAMP TT+instance AddTo SAMP I+instance AddTo SAMP B+instance AddTo SAMP U+instance AddTo SAMP S+instance AddTo SAMP STRIKE+instance AddTo SAMP BIG+instance AddTo SAMP SMALL+instance AddTo SAMP EM+instance AddTo SAMP STRONG+instance AddTo SAMP DFN+instance AddTo SAMP CODE+instance AddTo SAMP SAMP+instance AddTo SAMP KBD+instance AddTo SAMP VAR+instance AddTo SAMP CITE+instance AddTo SAMP ABBR+instance AddTo SAMP ACRONYM+instance AddTo SAMP A+instance AddTo SAMP IMG+instance AddTo SAMP APPLET+instance AddTo SAMP OBJECT+instance AddTo SAMP FONT+instance AddTo SAMP BASEFONT+instance AddTo SAMP BR+instance AddTo SAMP SCRIPT+instance AddTo SAMP MAP+instance AddTo SAMP Q+instance AddTo SAMP SUB+instance AddTo SAMP SUP+instance AddTo SAMP SPAN+instance AddTo SAMP BDO+instance AddTo SAMP IFRAME+instance AddTo SAMP INPUT+instance AddTo SAMP SELECT+instance AddTo SAMP TEXTAREA+instance AddTo SAMP LABEL+instance AddTo SAMP BUTTON+instance TAG KBD+instance AddTo KBD CDATA+instance AddTo KBD TT+instance AddTo KBD I+instance AddTo KBD B+instance AddTo KBD U+instance AddTo KBD S+instance AddTo KBD STRIKE+instance AddTo KBD BIG+instance AddTo KBD SMALL+instance AddTo KBD EM+instance AddTo KBD STRONG+instance AddTo KBD DFN+instance AddTo KBD CODE+instance AddTo KBD SAMP+instance AddTo KBD KBD+instance AddTo KBD VAR+instance AddTo KBD CITE+instance AddTo KBD ABBR+instance AddTo KBD ACRONYM+instance AddTo KBD A+instance AddTo KBD IMG+instance AddTo KBD APPLET+instance AddTo KBD OBJECT+instance AddTo KBD FONT+instance AddTo KBD BASEFONT+instance AddTo KBD BR+instance AddTo KBD SCRIPT+instance AddTo KBD MAP+instance AddTo KBD Q+instance AddTo KBD SUB+instance AddTo KBD SUP+instance AddTo KBD SPAN+instance AddTo KBD BDO+instance AddTo KBD IFRAME+instance AddTo KBD INPUT+instance AddTo KBD SELECT+instance AddTo KBD TEXTAREA+instance AddTo KBD LABEL+instance AddTo KBD BUTTON+instance TAG VAR+instance AddTo VAR CDATA+instance AddTo VAR TT+instance AddTo VAR I+instance AddTo VAR B+instance AddTo VAR U+instance AddTo VAR S+instance AddTo VAR STRIKE+instance AddTo VAR BIG+instance AddTo VAR SMALL+instance AddTo VAR EM+instance AddTo VAR STRONG+instance AddTo VAR DFN+instance AddTo VAR CODE+instance AddTo VAR SAMP+instance AddTo VAR KBD+instance AddTo VAR VAR+instance AddTo VAR CITE+instance AddTo VAR ABBR+instance AddTo VAR ACRONYM+instance AddTo VAR A+instance AddTo VAR IMG+instance AddTo VAR APPLET+instance AddTo VAR OBJECT+instance AddTo VAR FONT+instance AddTo VAR BASEFONT+instance AddTo VAR BR+instance AddTo VAR SCRIPT+instance AddTo VAR MAP+instance AddTo VAR Q+instance AddTo VAR SUB+instance AddTo VAR SUP+instance AddTo VAR SPAN+instance AddTo VAR BDO+instance AddTo VAR IFRAME+instance AddTo VAR INPUT+instance AddTo VAR SELECT+instance AddTo VAR TEXTAREA+instance AddTo VAR LABEL+instance AddTo VAR BUTTON+instance TAG CITE+instance AddTo CITE CDATA+instance AddTo CITE TT+instance AddTo CITE I+instance AddTo CITE B+instance AddTo CITE U+instance AddTo CITE S+instance AddTo CITE STRIKE+instance AddTo CITE BIG+instance AddTo CITE SMALL+instance AddTo CITE EM+instance AddTo CITE STRONG+instance AddTo CITE DFN+instance AddTo CITE CODE+instance AddTo CITE SAMP+instance AddTo CITE KBD+instance AddTo CITE VAR+instance AddTo CITE CITE+instance AddTo CITE ABBR+instance AddTo CITE ACRONYM+instance AddTo CITE A+instance AddTo CITE IMG+instance AddTo CITE APPLET+instance AddTo CITE OBJECT+instance AddTo CITE FONT+instance AddTo CITE BASEFONT+instance AddTo CITE BR+instance AddTo CITE SCRIPT+instance AddTo CITE MAP+instance AddTo CITE Q+instance AddTo CITE SUB+instance AddTo CITE SUP+instance AddTo CITE SPAN+instance AddTo CITE BDO+instance AddTo CITE IFRAME+instance AddTo CITE INPUT+instance AddTo CITE SELECT+instance AddTo CITE TEXTAREA+instance AddTo CITE LABEL+instance AddTo CITE BUTTON+instance TAG ABBR+instance AddTo ABBR CDATA+instance AddTo ABBR TT+instance AddTo ABBR I+instance AddTo ABBR B+instance AddTo ABBR U+instance AddTo ABBR S+instance AddTo ABBR STRIKE+instance AddTo ABBR BIG+instance AddTo ABBR SMALL+instance AddTo ABBR EM+instance AddTo ABBR STRONG+instance AddTo ABBR DFN+instance AddTo ABBR CODE+instance AddTo ABBR SAMP+instance AddTo ABBR KBD+instance AddTo ABBR VAR+instance AddTo ABBR CITE+instance AddTo ABBR ABBR+instance AddTo ABBR ACRONYM+instance AddTo ABBR A+instance AddTo ABBR IMG+instance AddTo ABBR APPLET+instance AddTo ABBR OBJECT+instance AddTo ABBR FONT+instance AddTo ABBR BASEFONT+instance AddTo ABBR BR+instance AddTo ABBR SCRIPT+instance AddTo ABBR MAP+instance AddTo ABBR Q+instance AddTo ABBR SUB+instance AddTo ABBR SUP+instance AddTo ABBR SPAN+instance AddTo ABBR BDO+instance AddTo ABBR IFRAME+instance AddTo ABBR INPUT+instance AddTo ABBR SELECT+instance AddTo ABBR TEXTAREA+instance AddTo ABBR LABEL+instance AddTo ABBR BUTTON+instance TAG ACRONYM+instance AddTo ACRONYM CDATA+instance AddTo ACRONYM TT+instance AddTo ACRONYM I+instance AddTo ACRONYM B+instance AddTo ACRONYM U+instance AddTo ACRONYM S+instance AddTo ACRONYM STRIKE+instance AddTo ACRONYM BIG+instance AddTo ACRONYM SMALL+instance AddTo ACRONYM EM+instance AddTo ACRONYM STRONG+instance AddTo ACRONYM DFN+instance AddTo ACRONYM CODE+instance AddTo ACRONYM SAMP+instance AddTo ACRONYM KBD+instance AddTo ACRONYM VAR+instance AddTo ACRONYM CITE+instance AddTo ACRONYM ABBR+instance AddTo ACRONYM ACRONYM+instance AddTo ACRONYM A+instance AddTo ACRONYM IMG+instance AddTo ACRONYM APPLET+instance AddTo ACRONYM OBJECT+instance AddTo ACRONYM FONT+instance AddTo ACRONYM BASEFONT+instance AddTo ACRONYM BR+instance AddTo ACRONYM SCRIPT+instance AddTo ACRONYM MAP+instance AddTo ACRONYM Q+instance AddTo ACRONYM SUB+instance AddTo ACRONYM SUP+instance AddTo ACRONYM SPAN+instance AddTo ACRONYM BDO+instance AddTo ACRONYM IFRAME+instance AddTo ACRONYM INPUT+instance AddTo ACRONYM SELECT+instance AddTo ACRONYM TEXTAREA+instance AddTo ACRONYM LABEL+instance AddTo ACRONYM BUTTON+data ALIGN_bottom = ALIGN_bottom+data ALIGN_center = ALIGN_center+data ALIGN_char = ALIGN_char+data ALIGN_justify = ALIGN_justify+data ALIGN_left = ALIGN_left+data ALIGN_middle = ALIGN_middle+data ALIGN_right = ALIGN_right+data ALIGN_top = ALIGN_top+data CHECKED_checked = CHECKED_checked+data CLEAR_all = CLEAR_all+data CLEAR_left = CLEAR_left+data CLEAR_none = CLEAR_none+data CLEAR_right = CLEAR_right+data COMPACT_compact = COMPACT_compact+data DECLARE_declare = DECLARE_declare+data DEFER_defer = DEFER_defer+data DIR_ltr = DIR_ltr+data DIR_rtl = DIR_rtl+data DISABLED_disabled = DISABLED_disabled+data FRAME_above = FRAME_above+data FRAME_below = FRAME_below+data FRAME_border = FRAME_border+data FRAME_box = FRAME_box+data FRAME_hsides = FRAME_hsides+data FRAME_lhs = FRAME_lhs+data FRAME_rhs = FRAME_rhs+data FRAME_void = FRAME_void+data FRAME_vsides = FRAME_vsides+data ISMAP_ismap = ISMAP_ismap+data METHOD_GET = METHOD_GET+data METHOD_POST = METHOD_POST+data MULTIPLE_multiple = MULTIPLE_multiple+data NOHREF_nohref = NOHREF_nohref+data NOSHADE_noshade = NOSHADE_noshade+data NOWRAP_nowrap = NOWRAP_nowrap+data READONLY_readonly = READONLY_readonly+data RULES_all = RULES_all+data RULES_cols = RULES_cols+data RULES_groups = RULES_groups+data RULES_none = RULES_none+data RULES_rows = RULES_rows+data SCOPE_col = SCOPE_col+data SCOPE_colgroup = SCOPE_colgroup+data SCOPE_row = SCOPE_row+data SCOPE_rowgroup = SCOPE_rowgroup+data SCROLLING_auto = SCROLLING_auto+data SCROLLING_no = SCROLLING_no+data SCROLLING_yes = SCROLLING_yes+data SELECTED_selected = SELECTED_selected+data SHAPE_circle = SHAPE_circle+data SHAPE_default' = SHAPE_default'+data SHAPE_poly = SHAPE_poly+data SHAPE_rect = SHAPE_rect+data TYPE_BUTTON = TYPE_BUTTON+data TYPE_CHECKBOX = TYPE_CHECKBOX+data TYPE_FILE = TYPE_FILE+data TYPE_HIDDEN = TYPE_HIDDEN+data TYPE_IMAGE = TYPE_IMAGE+data TYPE_PASSWORD = TYPE_PASSWORD+data TYPE_RADIO = TYPE_RADIO+data TYPE_RESET = TYPE_RESET+data TYPE_SUBMIT = TYPE_SUBMIT+data TYPE_TEXT = TYPE_TEXT+data TYPE_button = TYPE_button+data TYPE_circle = TYPE_circle+data TYPE_disc = TYPE_disc+data TYPE_reset = TYPE_reset+data TYPE_square = TYPE_square+data TYPE_submit = TYPE_submit+data VALIGN_baseline = VALIGN_baseline+data VALIGN_bottom = VALIGN_bottom+data VALIGN_middle = VALIGN_middle+data VALIGN_top = VALIGN_top+data VALUETYPE_DATA = VALUETYPE_DATA+data VALUETYPE_OBJECT = VALUETYPE_OBJECT+data VALUETYPE_REF = VALUETYPE_REF+instance ATTRIBUTE ABBR+instance ATTRIBUTE ACCEPT+instance ATTRIBUTE ACCEPT_CHARSET+instance ATTRIBUTE ACCESSKEY+instance ATTRIBUTE ACTION+instance ATTRIBUTE ALIGN+instance ATTRIBUTE ALINK+instance ATTRIBUTE ALT+instance ATTRIBUTE ARCHIVE+instance ATTRIBUTE AXIS+instance ATTRIBUTE BACKGROUND+instance ATTRIBUTE BGCOLOR+instance ATTRIBUTE BORDER+instance ATTRIBUTE CELLPADDING+instance ATTRIBUTE CELLSPACING+instance ATTRIBUTE CHAR+instance ATTRIBUTE CHAROFF+instance ATTRIBUTE CHARSET+instance ATTRIBUTE CHECKED+instance ATTRIBUTE CITE+instance ATTRIBUTE CLASS+instance ATTRIBUTE CLASSID+instance ATTRIBUTE CLEAR+instance ATTRIBUTE CODE+instance ATTRIBUTE CODEBASE+instance ATTRIBUTE CODETYPE+instance ATTRIBUTE COLOR+instance ATTRIBUTE COLS+instance ATTRIBUTE COLSPAN+instance ATTRIBUTE COMPACT+instance ATTRIBUTE CONTENT+instance ATTRIBUTE COORDS+instance ATTRIBUTE DATA+instance ATTRIBUTE DATAPAGESIZE+instance ATTRIBUTE DATETIME+instance ATTRIBUTE DECLARE+instance ATTRIBUTE DEFER+instance ATTRIBUTE DIR+instance ATTRIBUTE DISABLED+instance ATTRIBUTE ENCTYPE+instance ATTRIBUTE EVENT+instance ATTRIBUTE FACE+instance ATTRIBUTE FOR+instance ATTRIBUTE FRAME+instance ATTRIBUTE FRAMEBORDER+instance ATTRIBUTE HEADERS+instance ATTRIBUTE HEIGHT+instance ATTRIBUTE HREF+instance ATTRIBUTE HREFLANG+instance ATTRIBUTE HSPACE+instance ATTRIBUTE HTTP_EQUIV+instance ATTRIBUTE ID+instance ATTRIBUTE ISMAP+instance ATTRIBUTE LABEL+instance ATTRIBUTE LANG+instance ATTRIBUTE LANGUAGE+instance ATTRIBUTE LINK+instance ATTRIBUTE LONGDESC+instance ATTRIBUTE MARGINHEIGHT+instance ATTRIBUTE MARGINWIDTH+instance ATTRIBUTE MAXLENGTH+instance ATTRIBUTE MEDIA+instance ATTRIBUTE METHOD+instance ATTRIBUTE MULTIPLE+instance ATTRIBUTE NAME+instance ATTRIBUTE NOHREF+instance ATTRIBUTE NOSHADE+instance ATTRIBUTE NOWRAP+instance ATTRIBUTE OBJECT+instance ATTRIBUTE ONBLUR+instance ATTRIBUTE ONCHANGE+instance ATTRIBUTE ONCLICK+instance ATTRIBUTE ONDBLCLICK+instance ATTRIBUTE ONFOCUS+instance ATTRIBUTE ONKEYDOWN+instance ATTRIBUTE ONKEYPRESS+instance ATTRIBUTE ONKEYUP+instance ATTRIBUTE ONLOAD+instance ATTRIBUTE ONMOUSEDOWN+instance ATTRIBUTE ONMOUSEMOVE+instance ATTRIBUTE ONMOUSEOUT+instance ATTRIBUTE ONMOUSEOVER+instance ATTRIBUTE ONMOUSEUP+instance ATTRIBUTE ONRESET+instance ATTRIBUTE ONSELECT+instance ATTRIBUTE ONSUBMIT+instance ATTRIBUTE ONUNLOAD+instance ATTRIBUTE PROFILE+instance ATTRIBUTE PROMPT+instance ATTRIBUTE READONLY+instance ATTRIBUTE REL+instance ATTRIBUTE REV+instance ATTRIBUTE ROWS+instance ATTRIBUTE ROWSPAN+instance ATTRIBUTE RULES+instance ATTRIBUTE SCHEME+instance ATTRIBUTE SCOPE+instance ATTRIBUTE SCROLLING+instance ATTRIBUTE SELECTED+instance ATTRIBUTE SHAPE+instance ATTRIBUTE SIZE+instance ATTRIBUTE SPAN+instance ATTRIBUTE SRC+instance ATTRIBUTE STANDBY+instance ATTRIBUTE START+instance ATTRIBUTE STYLE+instance ATTRIBUTE SUMMARY+instance ATTRIBUTE TABINDEX+instance ATTRIBUTE TARGET+instance ATTRIBUTE TEXT+instance ATTRIBUTE TITLE+instance ATTRIBUTE TYPE+instance ATTRIBUTE USEMAP+instance ATTRIBUTE VALIGN+instance ATTRIBUTE VALUE+instance ATTRIBUTE VALUETYPE+instance ATTRIBUTE VERSION+instance ATTRIBUTE VLINK+instance ATTRIBUTE VSPACE+instance ATTRIBUTE WIDTH+instance AttrValue ABBR String+instance AttrValue ACCEPT String+instance AttrValue ACCEPT_CHARSET String+instance AttrValue ACCESSKEY String+instance AttrValue ACTION String+instance AttrValue ALIGN ALIGN_bottom+instance AttrValue ALIGN ALIGN_center+instance AttrValue ALIGN ALIGN_char+instance AttrValue ALIGN ALIGN_justify+instance AttrValue ALIGN ALIGN_left+instance AttrValue ALIGN ALIGN_middle+instance AttrValue ALIGN ALIGN_right+instance AttrValue ALIGN ALIGN_top+instance AttrValue ALINK String+instance AttrValue ALT String+instance AttrValue ARCHIVE String+instance AttrValue AXIS String+instance AttrValue BACKGROUND String+instance AttrValue BGCOLOR String+instance AttrValue BORDER String+instance AttrValue CELLPADDING String+instance AttrValue CELLSPACING String+instance AttrValue CHAR String+instance AttrValue CHAROFF String+instance AttrValue CHARSET String+instance AttrValue CHECKED CHECKED_checked+instance AttrValue CITE String+instance AttrValue CLASS String+instance AttrValue CLASSID String+instance AttrValue CLEAR CLEAR_all+instance AttrValue CLEAR CLEAR_left+instance AttrValue CLEAR CLEAR_none+instance AttrValue CLEAR CLEAR_right+instance AttrValue CODE String+instance AttrValue CODEBASE String+instance AttrValue CODETYPE String+instance AttrValue COLOR String+instance AttrValue COLS Int+instance AttrValue COLSPAN Int+instance AttrValue COMPACT COMPACT_compact+instance AttrValue CONTENT String+instance AttrValue COORDS String+instance AttrValue DATA String+instance AttrValue DATAPAGESIZE String+instance AttrValue DATETIME String+instance AttrValue DECLARE DECLARE_declare+instance AttrValue DEFER DEFER_defer+instance AttrValue DIR DIR_ltr+instance AttrValue DIR DIR_rtl+instance AttrValue DISABLED DISABLED_disabled+instance AttrValue ENCTYPE String+instance AttrValue EVENT String+instance AttrValue FACE String+instance AttrValue FOR String+instance AttrValue FRAME FRAME_above+instance AttrValue FRAME FRAME_below+instance AttrValue FRAME FRAME_border+instance AttrValue FRAME FRAME_box+instance AttrValue FRAME FRAME_hsides+instance AttrValue FRAME FRAME_lhs+instance AttrValue FRAME FRAME_rhs+instance AttrValue FRAME FRAME_void+instance AttrValue FRAME FRAME_vsides+instance AttrValue FRAMEBORDER Int+instance AttrValue HEADERS [String]+instance AttrValue HEIGHT String+instance AttrValue HREF String+instance AttrValue HREFLANG String+instance AttrValue HSPACE String+instance AttrValue HTTP_EQUIV String+instance AttrValue ID String+instance AttrValue ISMAP ISMAP_ismap+instance AttrValue LABEL String+instance AttrValue LANG String+instance AttrValue LANGUAGE String+instance AttrValue LINK String+instance AttrValue LONGDESC String+instance AttrValue MARGINHEIGHT String+instance AttrValue MARGINWIDTH String+instance AttrValue MAXLENGTH Int+instance AttrValue MEDIA String+instance AttrValue METHOD METHOD_GET+instance AttrValue METHOD METHOD_POST+instance AttrValue MULTIPLE MULTIPLE_multiple+instance AttrValue NAME String+instance AttrValue NOHREF NOHREF_nohref+instance AttrValue NOSHADE NOSHADE_noshade+instance AttrValue NOWRAP NOWRAP_nowrap+instance AttrValue OBJECT String+instance AttrValue ONBLUR String+instance AttrValue ONCHANGE String+instance AttrValue ONCLICK String+instance AttrValue ONDBLCLICK String+instance AttrValue ONFOCUS String+instance AttrValue ONKEYDOWN String+instance AttrValue ONKEYPRESS String+instance AttrValue ONKEYUP String+instance AttrValue ONLOAD String+instance AttrValue ONMOUSEDOWN String+instance AttrValue ONMOUSEMOVE String+instance AttrValue ONMOUSEOUT String+instance AttrValue ONMOUSEOVER String+instance AttrValue ONMOUSEUP String+instance AttrValue ONRESET String+instance AttrValue ONSELECT String+instance AttrValue ONSUBMIT String+instance AttrValue ONUNLOAD String+instance AttrValue PROFILE String+instance AttrValue PROMPT String+instance AttrValue READONLY READONLY_readonly+instance AttrValue REL String+instance AttrValue REV String+instance AttrValue ROWS Int+instance AttrValue ROWSPAN Int+instance AttrValue RULES RULES_all+instance AttrValue RULES RULES_cols+instance AttrValue RULES RULES_groups+instance AttrValue RULES RULES_none+instance AttrValue RULES RULES_rows+instance AttrValue SCHEME String+instance AttrValue SCOPE SCOPE_col+instance AttrValue SCOPE SCOPE_colgroup+instance AttrValue SCOPE SCOPE_row+instance AttrValue SCOPE SCOPE_rowgroup+instance AttrValue SCROLLING SCROLLING_auto+instance AttrValue SCROLLING SCROLLING_no+instance AttrValue SCROLLING SCROLLING_yes+instance AttrValue SELECTED SELECTED_selected+instance AttrValue SHAPE SHAPE_circle+instance AttrValue SHAPE SHAPE_default'+instance AttrValue SHAPE SHAPE_poly+instance AttrValue SHAPE SHAPE_rect+instance AttrValue SIZE Int+instance AttrValue SIZE String+instance AttrValue SPAN Int+instance AttrValue SRC String+instance AttrValue STANDBY String+instance AttrValue START Int+instance AttrValue STYLE String+instance AttrValue SUMMARY String+instance AttrValue TABINDEX Int+instance AttrValue TARGET String+instance AttrValue TEXT String+instance AttrValue TITLE String+instance AttrValue TYPE String+instance AttrValue TYPE TYPE_BUTTON+instance AttrValue TYPE TYPE_CHECKBOX+instance AttrValue TYPE TYPE_FILE+instance AttrValue TYPE TYPE_HIDDEN+instance AttrValue TYPE TYPE_IMAGE+instance AttrValue TYPE TYPE_PASSWORD+instance AttrValue TYPE TYPE_RADIO+instance AttrValue TYPE TYPE_RESET+instance AttrValue TYPE TYPE_SUBMIT+instance AttrValue TYPE TYPE_TEXT+instance AttrValue TYPE TYPE_button+instance AttrValue TYPE TYPE_circle+instance AttrValue TYPE TYPE_disc+instance AttrValue TYPE TYPE_reset+instance AttrValue TYPE TYPE_square+instance AttrValue TYPE TYPE_submit+instance AttrValue USEMAP String+instance AttrValue VALIGN VALIGN_baseline+instance AttrValue VALIGN VALIGN_bottom+instance AttrValue VALIGN VALIGN_middle+instance AttrValue VALIGN VALIGN_top+instance AttrValue VALUE Int+instance AttrValue VALUE String+instance AttrValue VALUETYPE VALUETYPE_DATA+instance AttrValue VALUETYPE VALUETYPE_OBJECT+instance AttrValue VALUETYPE VALUETYPE_REF+instance AttrValue VERSION String+instance AttrValue VLINK String+instance AttrValue VSPACE String+instance AttrValue WIDTH Int+instance AttrValue WIDTH String+instance Show ALIGN_bottom where show ALIGN_bottom = "bottom"+instance Show ALIGN_center where show ALIGN_center = "center"+instance Show ALIGN_char where show ALIGN_char = "char"+instance Show ALIGN_justify where show ALIGN_justify = "justify"+instance Show ALIGN_left where show ALIGN_left = "left"+instance Show ALIGN_middle where show ALIGN_middle = "middle"+instance Show ALIGN_right where show ALIGN_right = "right"+instance Show ALIGN_top where show ALIGN_top = "top"+instance Show CHECKED_checked where show CHECKED_checked = "checked"+instance Show CLEAR_all where show CLEAR_all = "all"+instance Show CLEAR_left where show CLEAR_left = "left"+instance Show CLEAR_none where show CLEAR_none = "none"+instance Show CLEAR_right where show CLEAR_right = "right"+instance Show COMPACT_compact where show COMPACT_compact = "compact"+instance Show DECLARE_declare where show DECLARE_declare = "declare"+instance Show DEFER_defer where show DEFER_defer = "defer"+instance Show DIR_ltr where show DIR_ltr = "ltr"+instance Show DIR_rtl where show DIR_rtl = "rtl"+instance Show DISABLED_disabled where show DISABLED_disabled = "disabled"+instance Show FRAME_above where show FRAME_above = "above"+instance Show FRAME_below where show FRAME_below = "below"+instance Show FRAME_border where show FRAME_border = "border"+instance Show FRAME_box where show FRAME_box = "box"+instance Show FRAME_hsides where show FRAME_hsides = "hsides"+instance Show FRAME_lhs where show FRAME_lhs = "lhs"+instance Show FRAME_rhs where show FRAME_rhs = "rhs"+instance Show FRAME_void where show FRAME_void = "void"+instance Show FRAME_vsides where show FRAME_vsides = "vsides"+instance Show ISMAP_ismap where show ISMAP_ismap = "ismap"+instance Show METHOD_GET where show METHOD_GET = "GET"+instance Show METHOD_POST where show METHOD_POST = "POST"+instance Show MULTIPLE_multiple where show MULTIPLE_multiple = "multiple"+instance Show NOHREF_nohref where show NOHREF_nohref = "nohref"+instance Show NOSHADE_noshade where show NOSHADE_noshade = "noshade"+instance Show NOWRAP_nowrap where show NOWRAP_nowrap = "nowrap"+instance Show READONLY_readonly where show READONLY_readonly = "readonly"+instance Show RULES_all where show RULES_all = "all"+instance Show RULES_cols where show RULES_cols = "cols"+instance Show RULES_groups where show RULES_groups = "groups"+instance Show RULES_none where show RULES_none = "none"+instance Show RULES_rows where show RULES_rows = "rows"+instance Show SCOPE_col where show SCOPE_col = "col"+instance Show SCOPE_colgroup where show SCOPE_colgroup = "colgroup"+instance Show SCOPE_row where show SCOPE_row = "row"+instance Show SCOPE_rowgroup where show SCOPE_rowgroup = "rowgroup"+instance Show SCROLLING_auto where show SCROLLING_auto = "auto"+instance Show SCROLLING_no where show SCROLLING_no = "no"+instance Show SCROLLING_yes where show SCROLLING_yes = "yes"+instance Show SELECTED_selected where show SELECTED_selected = "selected"+instance Show SHAPE_circle where show SHAPE_circle = "circle"+instance Show SHAPE_default' where show SHAPE_default' = "default"+instance Show SHAPE_poly where show SHAPE_poly = "poly"+instance Show SHAPE_rect where show SHAPE_rect = "rect"+instance Show TYPE_BUTTON where show TYPE_BUTTON = "BUTTON"+instance Show TYPE_CHECKBOX where show TYPE_CHECKBOX = "CHECKBOX"+instance Show TYPE_FILE where show TYPE_FILE = "FILE"+instance Show TYPE_HIDDEN where show TYPE_HIDDEN = "HIDDEN"+instance Show TYPE_IMAGE where show TYPE_IMAGE = "IMAGE"+instance Show TYPE_PASSWORD where show TYPE_PASSWORD = "PASSWORD"+instance Show TYPE_RADIO where show TYPE_RADIO = "RADIO"+instance Show TYPE_RESET where show TYPE_RESET = "RESET"+instance Show TYPE_SUBMIT where show TYPE_SUBMIT = "SUBMIT"+instance Show TYPE_TEXT where show TYPE_TEXT = "TEXT"+instance Show TYPE_button where show TYPE_button = "button"+instance Show TYPE_circle where show TYPE_circle = "circle"+instance Show TYPE_disc where show TYPE_disc = "disc"+instance Show TYPE_reset where show TYPE_reset = "reset"+instance Show TYPE_square where show TYPE_square = "square"+instance Show TYPE_submit where show TYPE_submit = "submit"+instance Show VALIGN_baseline where show VALIGN_baseline = "baseline"+instance Show VALIGN_bottom where show VALIGN_bottom = "bottom"+instance Show VALIGN_middle where show VALIGN_middle = "middle"+instance Show VALIGN_top where show VALIGN_top = "top"+instance Show VALUETYPE_DATA where show VALUETYPE_DATA = "DATA"+instance Show VALUETYPE_OBJECT where show VALUETYPE_OBJECT = "OBJECT"+instance Show VALUETYPE_REF where show VALUETYPE_REF = "REF"+instance AddAttr A ACCESSKEY+instance AddAttr A CHARSET+instance AddAttr A CLASS+instance AddAttr A COORDS+instance AddAttr A DIR+instance AddAttr A HREF+instance AddAttr A HREFLANG+instance AddAttr A ID+instance AddAttr A LANG+instance AddAttr A NAME+instance AddAttr A ONBLUR+instance AddAttr A ONCLICK+instance AddAttr A ONDBLCLICK+instance AddAttr A ONFOCUS+instance AddAttr A ONKEYDOWN+instance AddAttr A ONKEYPRESS+instance AddAttr A ONKEYUP+instance AddAttr A ONMOUSEDOWN+instance AddAttr A ONMOUSEMOVE+instance AddAttr A ONMOUSEOUT+instance AddAttr A ONMOUSEOVER+instance AddAttr A ONMOUSEUP+instance AddAttr A REL+instance AddAttr A REV+instance AddAttr A SHAPE+instance AddAttr A STYLE+instance AddAttr A TABINDEX+instance AddAttr A TARGET+instance AddAttr A TITLE+instance AddAttr A TYPE+instance AddAttr ABBR CLASS+instance AddAttr ABBR DIR+instance AddAttr ABBR ID+instance AddAttr ABBR LANG+instance AddAttr ABBR ONCLICK+instance AddAttr ABBR ONDBLCLICK+instance AddAttr ABBR ONKEYDOWN+instance AddAttr ABBR ONKEYPRESS+instance AddAttr ABBR ONKEYUP+instance AddAttr ABBR ONMOUSEDOWN+instance AddAttr ABBR ONMOUSEMOVE+instance AddAttr ABBR ONMOUSEOUT+instance AddAttr ABBR ONMOUSEOVER+instance AddAttr ABBR ONMOUSEUP+instance AddAttr ABBR STYLE+instance AddAttr ABBR TITLE+instance AddAttr ACRONYM CLASS+instance AddAttr ACRONYM DIR+instance AddAttr ACRONYM ID+instance AddAttr ACRONYM LANG+instance AddAttr ACRONYM ONCLICK+instance AddAttr ACRONYM ONDBLCLICK+instance AddAttr ACRONYM ONKEYDOWN+instance AddAttr ACRONYM ONKEYPRESS+instance AddAttr ACRONYM ONKEYUP+instance AddAttr ACRONYM ONMOUSEDOWN+instance AddAttr ACRONYM ONMOUSEMOVE+instance AddAttr ACRONYM ONMOUSEOUT+instance AddAttr ACRONYM ONMOUSEOVER+instance AddAttr ACRONYM ONMOUSEUP+instance AddAttr ACRONYM STYLE+instance AddAttr ACRONYM TITLE+instance AddAttr ADDRESS CLASS+instance AddAttr ADDRESS DIR+instance AddAttr ADDRESS ID+instance AddAttr ADDRESS LANG+instance AddAttr ADDRESS ONCLICK+instance AddAttr ADDRESS ONDBLCLICK+instance AddAttr ADDRESS ONKEYDOWN+instance AddAttr ADDRESS ONKEYPRESS+instance AddAttr ADDRESS ONKEYUP+instance AddAttr ADDRESS ONMOUSEDOWN+instance AddAttr ADDRESS ONMOUSEMOVE+instance AddAttr ADDRESS ONMOUSEOUT+instance AddAttr ADDRESS ONMOUSEOVER+instance AddAttr ADDRESS ONMOUSEUP+instance AddAttr ADDRESS STYLE+instance AddAttr ADDRESS TITLE+instance AddAttr APPLET ALIGN+instance AddAttr APPLET ALT+instance AddAttr APPLET ARCHIVE+instance AddAttr APPLET CLASS+instance AddAttr APPLET CODE+instance AddAttr APPLET CODEBASE+instance AddAttr APPLET HEIGHT+instance AddAttr APPLET HSPACE+instance AddAttr APPLET ID+instance AddAttr APPLET NAME+instance AddAttr APPLET OBJECT+instance AddAttr APPLET STYLE+instance AddAttr APPLET TITLE+instance AddAttr APPLET VSPACE+instance AddAttr APPLET WIDTH+instance AddAttr AREA ACCESSKEY+instance AddAttr AREA ALT+instance AddAttr AREA CLASS+instance AddAttr AREA COORDS+instance AddAttr AREA DIR+instance AddAttr AREA HREF+instance AddAttr AREA ID+instance AddAttr AREA LANG+instance AddAttr AREA NOHREF+instance AddAttr AREA ONBLUR+instance AddAttr AREA ONCLICK+instance AddAttr AREA ONDBLCLICK+instance AddAttr AREA ONFOCUS+instance AddAttr AREA ONKEYDOWN+instance AddAttr AREA ONKEYPRESS+instance AddAttr AREA ONKEYUP+instance AddAttr AREA ONMOUSEDOWN+instance AddAttr AREA ONMOUSEMOVE+instance AddAttr AREA ONMOUSEOUT+instance AddAttr AREA ONMOUSEOVER+instance AddAttr AREA ONMOUSEUP+instance AddAttr AREA SHAPE+instance AddAttr AREA STYLE+instance AddAttr AREA TABINDEX+instance AddAttr AREA TARGET+instance AddAttr AREA TITLE+instance AddAttr B CLASS+instance AddAttr B DIR+instance AddAttr B ID+instance AddAttr B LANG+instance AddAttr B ONCLICK+instance AddAttr B ONDBLCLICK+instance AddAttr B ONKEYDOWN+instance AddAttr B ONKEYPRESS+instance AddAttr B ONKEYUP+instance AddAttr B ONMOUSEDOWN+instance AddAttr B ONMOUSEMOVE+instance AddAttr B ONMOUSEOUT+instance AddAttr B ONMOUSEOVER+instance AddAttr B ONMOUSEUP+instance AddAttr B STYLE+instance AddAttr B TITLE+instance AddAttr BASE HREF+instance AddAttr BASE TARGET+instance AddAttr BASEFONT COLOR+instance AddAttr BASEFONT FACE+instance AddAttr BASEFONT ID+instance AddAttr BASEFONT SIZE+instance AddAttr BDO CLASS+instance AddAttr BDO DIR+instance AddAttr BDO ID+instance AddAttr BDO LANG+instance AddAttr BDO STYLE+instance AddAttr BDO TITLE+instance AddAttr BIG CLASS+instance AddAttr BIG DIR+instance AddAttr BIG ID+instance AddAttr BIG LANG+instance AddAttr BIG ONCLICK+instance AddAttr BIG ONDBLCLICK+instance AddAttr BIG ONKEYDOWN+instance AddAttr BIG ONKEYPRESS+instance AddAttr BIG ONKEYUP+instance AddAttr BIG ONMOUSEDOWN+instance AddAttr BIG ONMOUSEMOVE+instance AddAttr BIG ONMOUSEOUT+instance AddAttr BIG ONMOUSEOVER+instance AddAttr BIG ONMOUSEUP+instance AddAttr BIG STYLE+instance AddAttr BIG TITLE+instance AddAttr BLOCKQUOTE CITE+instance AddAttr BLOCKQUOTE CLASS+instance AddAttr BLOCKQUOTE DIR+instance AddAttr BLOCKQUOTE ID+instance AddAttr BLOCKQUOTE LANG+instance AddAttr BLOCKQUOTE ONCLICK+instance AddAttr BLOCKQUOTE ONDBLCLICK+instance AddAttr BLOCKQUOTE ONKEYDOWN+instance AddAttr BLOCKQUOTE ONKEYPRESS+instance AddAttr BLOCKQUOTE ONKEYUP+instance AddAttr BLOCKQUOTE ONMOUSEDOWN+instance AddAttr BLOCKQUOTE ONMOUSEMOVE+instance AddAttr BLOCKQUOTE ONMOUSEOUT+instance AddAttr BLOCKQUOTE ONMOUSEOVER+instance AddAttr BLOCKQUOTE ONMOUSEUP+instance AddAttr BLOCKQUOTE STYLE+instance AddAttr BLOCKQUOTE TITLE+instance AddAttr BODY ALINK+instance AddAttr BODY BACKGROUND+instance AddAttr BODY BGCOLOR+instance AddAttr BODY CLASS+instance AddAttr BODY DIR+instance AddAttr BODY ID+instance AddAttr BODY LANG+instance AddAttr BODY LINK+instance AddAttr BODY ONCLICK+instance AddAttr BODY ONDBLCLICK+instance AddAttr BODY ONKEYDOWN+instance AddAttr BODY ONKEYPRESS+instance AddAttr BODY ONKEYUP+instance AddAttr BODY ONLOAD+instance AddAttr BODY ONMOUSEDOWN+instance AddAttr BODY ONMOUSEMOVE+instance AddAttr BODY ONMOUSEOUT+instance AddAttr BODY ONMOUSEOVER+instance AddAttr BODY ONMOUSEUP+instance AddAttr BODY ONUNLOAD+instance AddAttr BODY STYLE+instance AddAttr BODY TEXT+instance AddAttr BODY TITLE+instance AddAttr BODY VLINK+instance AddAttr BR CLASS+instance AddAttr BR CLEAR+instance AddAttr BR ID+instance AddAttr BR STYLE+instance AddAttr BR TITLE+instance AddAttr BUTTON ACCESSKEY+instance AddAttr BUTTON CLASS+instance AddAttr BUTTON DIR+instance AddAttr BUTTON DISABLED+instance AddAttr BUTTON ID+instance AddAttr BUTTON LANG+instance AddAttr BUTTON NAME+instance AddAttr BUTTON ONBLUR+instance AddAttr BUTTON ONCLICK+instance AddAttr BUTTON ONDBLCLICK+instance AddAttr BUTTON ONFOCUS+instance AddAttr BUTTON ONKEYDOWN+instance AddAttr BUTTON ONKEYPRESS+instance AddAttr BUTTON ONKEYUP+instance AddAttr BUTTON ONMOUSEDOWN+instance AddAttr BUTTON ONMOUSEMOVE+instance AddAttr BUTTON ONMOUSEOUT+instance AddAttr BUTTON ONMOUSEOVER+instance AddAttr BUTTON ONMOUSEUP+instance AddAttr BUTTON STYLE+instance AddAttr BUTTON TABINDEX+instance AddAttr BUTTON TITLE+instance AddAttr BUTTON TYPE+instance AddAttr BUTTON VALUE+instance AddAttr CAPTION ALIGN+instance AddAttr CAPTION CLASS+instance AddAttr CAPTION DIR+instance AddAttr CAPTION ID+instance AddAttr CAPTION LANG+instance AddAttr CAPTION ONCLICK+instance AddAttr CAPTION ONDBLCLICK+instance AddAttr CAPTION ONKEYDOWN+instance AddAttr CAPTION ONKEYPRESS+instance AddAttr CAPTION ONKEYUP+instance AddAttr CAPTION ONMOUSEDOWN+instance AddAttr CAPTION ONMOUSEMOVE+instance AddAttr CAPTION ONMOUSEOUT+instance AddAttr CAPTION ONMOUSEOVER+instance AddAttr CAPTION ONMOUSEUP+instance AddAttr CAPTION STYLE+instance AddAttr CAPTION TITLE+instance AddAttr CENTER CLASS+instance AddAttr CENTER DIR+instance AddAttr CENTER ID+instance AddAttr CENTER LANG+instance AddAttr CENTER ONCLICK+instance AddAttr CENTER ONDBLCLICK+instance AddAttr CENTER ONKEYDOWN+instance AddAttr CENTER ONKEYPRESS+instance AddAttr CENTER ONKEYUP+instance AddAttr CENTER ONMOUSEDOWN+instance AddAttr CENTER ONMOUSEMOVE+instance AddAttr CENTER ONMOUSEOUT+instance AddAttr CENTER ONMOUSEOVER+instance AddAttr CENTER ONMOUSEUP+instance AddAttr CENTER STYLE+instance AddAttr CENTER TITLE+instance AddAttr CITE CLASS+instance AddAttr CITE DIR+instance AddAttr CITE ID+instance AddAttr CITE LANG+instance AddAttr CITE ONCLICK+instance AddAttr CITE ONDBLCLICK+instance AddAttr CITE ONKEYDOWN+instance AddAttr CITE ONKEYPRESS+instance AddAttr CITE ONKEYUP+instance AddAttr CITE ONMOUSEDOWN+instance AddAttr CITE ONMOUSEMOVE+instance AddAttr CITE ONMOUSEOUT+instance AddAttr CITE ONMOUSEOVER+instance AddAttr CITE ONMOUSEUP+instance AddAttr CITE STYLE+instance AddAttr CITE TITLE+instance AddAttr CODE CLASS+instance AddAttr CODE DIR+instance AddAttr CODE ID+instance AddAttr CODE LANG+instance AddAttr CODE ONCLICK+instance AddAttr CODE ONDBLCLICK+instance AddAttr CODE ONKEYDOWN+instance AddAttr CODE ONKEYPRESS+instance AddAttr CODE ONKEYUP+instance AddAttr CODE ONMOUSEDOWN+instance AddAttr CODE ONMOUSEMOVE+instance AddAttr CODE ONMOUSEOUT+instance AddAttr CODE ONMOUSEOVER+instance AddAttr CODE ONMOUSEUP+instance AddAttr CODE STYLE+instance AddAttr CODE TITLE+instance AddAttr COL ALIGN+instance AddAttr COL CHAR+instance AddAttr COL CHAROFF+instance AddAttr COL CLASS+instance AddAttr COL DIR+instance AddAttr COL ID+instance AddAttr COL LANG+instance AddAttr COL ONCLICK+instance AddAttr COL ONDBLCLICK+instance AddAttr COL ONKEYDOWN+instance AddAttr COL ONKEYPRESS+instance AddAttr COL ONKEYUP+instance AddAttr COL ONMOUSEDOWN+instance AddAttr COL ONMOUSEMOVE+instance AddAttr COL ONMOUSEOUT+instance AddAttr COL ONMOUSEOVER+instance AddAttr COL ONMOUSEUP+instance AddAttr COL SPAN+instance AddAttr COL STYLE+instance AddAttr COL TITLE+instance AddAttr COL VALIGN+instance AddAttr COL WIDTH+instance AddAttr COLGROUP ALIGN+instance AddAttr COLGROUP CHAR+instance AddAttr COLGROUP CHAROFF+instance AddAttr COLGROUP CLASS+instance AddAttr COLGROUP DIR+instance AddAttr COLGROUP ID+instance AddAttr COLGROUP LANG+instance AddAttr COLGROUP ONCLICK+instance AddAttr COLGROUP ONDBLCLICK+instance AddAttr COLGROUP ONKEYDOWN+instance AddAttr COLGROUP ONKEYPRESS+instance AddAttr COLGROUP ONKEYUP+instance AddAttr COLGROUP ONMOUSEDOWN+instance AddAttr COLGROUP ONMOUSEMOVE+instance AddAttr COLGROUP ONMOUSEOUT+instance AddAttr COLGROUP ONMOUSEOVER+instance AddAttr COLGROUP ONMOUSEUP+instance AddAttr COLGROUP SPAN+instance AddAttr COLGROUP STYLE+instance AddAttr COLGROUP TITLE+instance AddAttr COLGROUP VALIGN+instance AddAttr COLGROUP WIDTH+instance AddAttr DD CLASS+instance AddAttr DD DIR+instance AddAttr DD ID+instance AddAttr DD LANG+instance AddAttr DD ONCLICK+instance AddAttr DD ONDBLCLICK+instance AddAttr DD ONKEYDOWN+instance AddAttr DD ONKEYPRESS+instance AddAttr DD ONKEYUP+instance AddAttr DD ONMOUSEDOWN+instance AddAttr DD ONMOUSEMOVE+instance AddAttr DD ONMOUSEOUT+instance AddAttr DD ONMOUSEOVER+instance AddAttr DD ONMOUSEUP+instance AddAttr DD STYLE+instance AddAttr DD TITLE+instance AddAttr DEL CITE+instance AddAttr DEL CLASS+instance AddAttr DEL DATETIME+instance AddAttr DEL DIR+instance AddAttr DEL ID+instance AddAttr DEL LANG+instance AddAttr DEL ONCLICK+instance AddAttr DEL ONDBLCLICK+instance AddAttr DEL ONKEYDOWN+instance AddAttr DEL ONKEYPRESS+instance AddAttr DEL ONKEYUP+instance AddAttr DEL ONMOUSEDOWN+instance AddAttr DEL ONMOUSEMOVE+instance AddAttr DEL ONMOUSEOUT+instance AddAttr DEL ONMOUSEOVER+instance AddAttr DEL ONMOUSEUP+instance AddAttr DEL STYLE+instance AddAttr DEL TITLE+instance AddAttr DFN CLASS+instance AddAttr DFN DIR+instance AddAttr DFN ID+instance AddAttr DFN LANG+instance AddAttr DFN ONCLICK+instance AddAttr DFN ONDBLCLICK+instance AddAttr DFN ONKEYDOWN+instance AddAttr DFN ONKEYPRESS+instance AddAttr DFN ONKEYUP+instance AddAttr DFN ONMOUSEDOWN+instance AddAttr DFN ONMOUSEMOVE+instance AddAttr DFN ONMOUSEOUT+instance AddAttr DFN ONMOUSEOVER+instance AddAttr DFN ONMOUSEUP+instance AddAttr DFN STYLE+instance AddAttr DFN TITLE+instance AddAttr DIR CLASS+instance AddAttr DIR COMPACT+instance AddAttr DIR DIR+instance AddAttr DIR ID+instance AddAttr DIR LANG+instance AddAttr DIR ONCLICK+instance AddAttr DIR ONDBLCLICK+instance AddAttr DIR ONKEYDOWN+instance AddAttr DIR ONKEYPRESS+instance AddAttr DIR ONKEYUP+instance AddAttr DIR ONMOUSEDOWN+instance AddAttr DIR ONMOUSEMOVE+instance AddAttr DIR ONMOUSEOUT+instance AddAttr DIR ONMOUSEOVER+instance AddAttr DIR ONMOUSEUP+instance AddAttr DIR STYLE+instance AddAttr DIR TITLE+instance AddAttr DIV ALIGN+instance AddAttr DIV CLASS+instance AddAttr DIV DIR+instance AddAttr DIV ID+instance AddAttr DIV LANG+instance AddAttr DIV ONCLICK+instance AddAttr DIV ONDBLCLICK+instance AddAttr DIV ONKEYDOWN+instance AddAttr DIV ONKEYPRESS+instance AddAttr DIV ONKEYUP+instance AddAttr DIV ONMOUSEDOWN+instance AddAttr DIV ONMOUSEMOVE+instance AddAttr DIV ONMOUSEOUT+instance AddAttr DIV ONMOUSEOVER+instance AddAttr DIV ONMOUSEUP+instance AddAttr DIV STYLE+instance AddAttr DIV TITLE+instance AddAttr DL CLASS+instance AddAttr DL COMPACT+instance AddAttr DL DIR+instance AddAttr DL ID+instance AddAttr DL LANG+instance AddAttr DL ONCLICK+instance AddAttr DL ONDBLCLICK+instance AddAttr DL ONKEYDOWN+instance AddAttr DL ONKEYPRESS+instance AddAttr DL ONKEYUP+instance AddAttr DL ONMOUSEDOWN+instance AddAttr DL ONMOUSEMOVE+instance AddAttr DL ONMOUSEOUT+instance AddAttr DL ONMOUSEOVER+instance AddAttr DL ONMOUSEUP+instance AddAttr DL STYLE+instance AddAttr DL TITLE+instance AddAttr DT CLASS+instance AddAttr DT DIR+instance AddAttr DT ID+instance AddAttr DT LANG+instance AddAttr DT ONCLICK+instance AddAttr DT ONDBLCLICK+instance AddAttr DT ONKEYDOWN+instance AddAttr DT ONKEYPRESS+instance AddAttr DT ONKEYUP+instance AddAttr DT ONMOUSEDOWN+instance AddAttr DT ONMOUSEMOVE+instance AddAttr DT ONMOUSEOUT+instance AddAttr DT ONMOUSEOVER+instance AddAttr DT ONMOUSEUP+instance AddAttr DT STYLE+instance AddAttr DT TITLE+instance AddAttr EM CLASS+instance AddAttr EM DIR+instance AddAttr EM ID+instance AddAttr EM LANG+instance AddAttr EM ONCLICK+instance AddAttr EM ONDBLCLICK+instance AddAttr EM ONKEYDOWN+instance AddAttr EM ONKEYPRESS+instance AddAttr EM ONKEYUP+instance AddAttr EM ONMOUSEDOWN+instance AddAttr EM ONMOUSEMOVE+instance AddAttr EM ONMOUSEOUT+instance AddAttr EM ONMOUSEOVER+instance AddAttr EM ONMOUSEUP+instance AddAttr EM STYLE+instance AddAttr EM TITLE+instance AddAttr FIELDSET CLASS+instance AddAttr FIELDSET DIR+instance AddAttr FIELDSET ID+instance AddAttr FIELDSET LANG+instance AddAttr FIELDSET ONCLICK+instance AddAttr FIELDSET ONDBLCLICK+instance AddAttr FIELDSET ONKEYDOWN+instance AddAttr FIELDSET ONKEYPRESS+instance AddAttr FIELDSET ONKEYUP+instance AddAttr FIELDSET ONMOUSEDOWN+instance AddAttr FIELDSET ONMOUSEMOVE+instance AddAttr FIELDSET ONMOUSEOUT+instance AddAttr FIELDSET ONMOUSEOVER+instance AddAttr FIELDSET ONMOUSEUP+instance AddAttr FIELDSET STYLE+instance AddAttr FIELDSET TITLE+instance AddAttr FONT CLASS+instance AddAttr FONT COLOR+instance AddAttr FONT DIR+instance AddAttr FONT FACE+instance AddAttr FONT ID+instance AddAttr FONT LANG+instance AddAttr FONT SIZE+instance AddAttr FONT STYLE+instance AddAttr FONT TITLE+instance AddAttr FORM ACCEPT_CHARSET+instance AddAttr FORM ACTION+instance AddAttr FORM CLASS+instance AddAttr FORM DIR+instance AddAttr FORM ENCTYPE+instance AddAttr FORM ID+instance AddAttr FORM LANG+instance AddAttr FORM METHOD+instance AddAttr FORM ONCLICK+instance AddAttr FORM ONDBLCLICK+instance AddAttr FORM ONKEYDOWN+instance AddAttr FORM ONKEYPRESS+instance AddAttr FORM ONKEYUP+instance AddAttr FORM ONMOUSEDOWN+instance AddAttr FORM ONMOUSEMOVE+instance AddAttr FORM ONMOUSEOUT+instance AddAttr FORM ONMOUSEOVER+instance AddAttr FORM ONMOUSEUP+instance AddAttr FORM ONRESET+instance AddAttr FORM ONSUBMIT+instance AddAttr FORM STYLE+instance AddAttr FORM TARGET+instance AddAttr FORM TITLE+instance AddAttr H1 ALIGN+instance AddAttr H1 CLASS+instance AddAttr H1 DIR+instance AddAttr H1 ID+instance AddAttr H1 LANG+instance AddAttr H1 ONCLICK+instance AddAttr H1 ONDBLCLICK+instance AddAttr H1 ONKEYDOWN+instance AddAttr H1 ONKEYPRESS+instance AddAttr H1 ONKEYUP+instance AddAttr H1 ONMOUSEDOWN+instance AddAttr H1 ONMOUSEMOVE+instance AddAttr H1 ONMOUSEOUT+instance AddAttr H1 ONMOUSEOVER+instance AddAttr H1 ONMOUSEUP+instance AddAttr H1 STYLE+instance AddAttr H1 TITLE+instance AddAttr H2 ALIGN+instance AddAttr H2 CLASS+instance AddAttr H2 DIR+instance AddAttr H2 ID+instance AddAttr H2 LANG+instance AddAttr H2 ONCLICK+instance AddAttr H2 ONDBLCLICK+instance AddAttr H2 ONKEYDOWN+instance AddAttr H2 ONKEYPRESS+instance AddAttr H2 ONKEYUP+instance AddAttr H2 ONMOUSEDOWN+instance AddAttr H2 ONMOUSEMOVE+instance AddAttr H2 ONMOUSEOUT+instance AddAttr H2 ONMOUSEOVER+instance AddAttr H2 ONMOUSEUP+instance AddAttr H2 STYLE+instance AddAttr H2 TITLE+instance AddAttr H3 ALIGN+instance AddAttr H3 CLASS+instance AddAttr H3 DIR+instance AddAttr H3 ID+instance AddAttr H3 LANG+instance AddAttr H3 ONCLICK+instance AddAttr H3 ONDBLCLICK+instance AddAttr H3 ONKEYDOWN+instance AddAttr H3 ONKEYPRESS+instance AddAttr H3 ONKEYUP+instance AddAttr H3 ONMOUSEDOWN+instance AddAttr H3 ONMOUSEMOVE+instance AddAttr H3 ONMOUSEOUT+instance AddAttr H3 ONMOUSEOVER+instance AddAttr H3 ONMOUSEUP+instance AddAttr H3 STYLE+instance AddAttr H3 TITLE+instance AddAttr H4 ALIGN+instance AddAttr H4 CLASS+instance AddAttr H4 DIR+instance AddAttr H4 ID+instance AddAttr H4 LANG+instance AddAttr H4 ONCLICK+instance AddAttr H4 ONDBLCLICK+instance AddAttr H4 ONKEYDOWN+instance AddAttr H4 ONKEYPRESS+instance AddAttr H4 ONKEYUP+instance AddAttr H4 ONMOUSEDOWN+instance AddAttr H4 ONMOUSEMOVE+instance AddAttr H4 ONMOUSEOUT+instance AddAttr H4 ONMOUSEOVER+instance AddAttr H4 ONMOUSEUP+instance AddAttr H4 STYLE+instance AddAttr H4 TITLE+instance AddAttr H5 ALIGN+instance AddAttr H5 CLASS+instance AddAttr H5 DIR+instance AddAttr H5 ID+instance AddAttr H5 LANG+instance AddAttr H5 ONCLICK+instance AddAttr H5 ONDBLCLICK+instance AddAttr H5 ONKEYDOWN+instance AddAttr H5 ONKEYPRESS+instance AddAttr H5 ONKEYUP+instance AddAttr H5 ONMOUSEDOWN+instance AddAttr H5 ONMOUSEMOVE+instance AddAttr H5 ONMOUSEOUT+instance AddAttr H5 ONMOUSEOVER+instance AddAttr H5 ONMOUSEUP+instance AddAttr H5 STYLE+instance AddAttr H5 TITLE+instance AddAttr H6 ALIGN+instance AddAttr H6 CLASS+instance AddAttr H6 DIR+instance AddAttr H6 ID+instance AddAttr H6 LANG+instance AddAttr H6 ONCLICK+instance AddAttr H6 ONDBLCLICK+instance AddAttr H6 ONKEYDOWN+instance AddAttr H6 ONKEYPRESS+instance AddAttr H6 ONKEYUP+instance AddAttr H6 ONMOUSEDOWN+instance AddAttr H6 ONMOUSEMOVE+instance AddAttr H6 ONMOUSEOUT+instance AddAttr H6 ONMOUSEOVER+instance AddAttr H6 ONMOUSEUP+instance AddAttr H6 STYLE+instance AddAttr H6 TITLE+instance AddAttr HEAD DIR+instance AddAttr HEAD LANG+instance AddAttr HEAD PROFILE+instance AddAttr HR ALIGN+instance AddAttr HR CLASS+instance AddAttr HR ID+instance AddAttr HR NOSHADE+instance AddAttr HR ONCLICK+instance AddAttr HR ONDBLCLICK+instance AddAttr HR ONKEYDOWN+instance AddAttr HR ONKEYPRESS+instance AddAttr HR ONKEYUP+instance AddAttr HR ONMOUSEDOWN+instance AddAttr HR ONMOUSEMOVE+instance AddAttr HR ONMOUSEOUT+instance AddAttr HR ONMOUSEOVER+instance AddAttr HR ONMOUSEUP+instance AddAttr HR SIZE+instance AddAttr HR STYLE+instance AddAttr HR TITLE+instance AddAttr HR WIDTH+instance AddAttr HTML DIR+instance AddAttr HTML LANG+instance AddAttr HTML VERSION+instance AddAttr I CLASS+instance AddAttr I DIR+instance AddAttr I ID+instance AddAttr I LANG+instance AddAttr I ONCLICK+instance AddAttr I ONDBLCLICK+instance AddAttr I ONKEYDOWN+instance AddAttr I ONKEYPRESS+instance AddAttr I ONKEYUP+instance AddAttr I ONMOUSEDOWN+instance AddAttr I ONMOUSEMOVE+instance AddAttr I ONMOUSEOUT+instance AddAttr I ONMOUSEOVER+instance AddAttr I ONMOUSEUP+instance AddAttr I STYLE+instance AddAttr I TITLE+instance AddAttr IFRAME ALIGN+instance AddAttr IFRAME CLASS+instance AddAttr IFRAME FRAMEBORDER+instance AddAttr IFRAME HEIGHT+instance AddAttr IFRAME ID+instance AddAttr IFRAME LONGDESC+instance AddAttr IFRAME MARGINHEIGHT+instance AddAttr IFRAME MARGINWIDTH+instance AddAttr IFRAME NAME+instance AddAttr IFRAME SCROLLING+instance AddAttr IFRAME SRC+instance AddAttr IFRAME STYLE+instance AddAttr IFRAME TITLE+instance AddAttr IFRAME WIDTH+instance AddAttr IMG ALIGN+instance AddAttr IMG ALT+instance AddAttr IMG BORDER+instance AddAttr IMG CLASS+instance AddAttr IMG DIR+instance AddAttr IMG HEIGHT+instance AddAttr IMG HSPACE+instance AddAttr IMG ID+instance AddAttr IMG ISMAP+instance AddAttr IMG LANG+instance AddAttr IMG LONGDESC+instance AddAttr IMG ONCLICK+instance AddAttr IMG ONDBLCLICK+instance AddAttr IMG ONKEYDOWN+instance AddAttr IMG ONKEYPRESS+instance AddAttr IMG ONKEYUP+instance AddAttr IMG ONMOUSEDOWN+instance AddAttr IMG ONMOUSEMOVE+instance AddAttr IMG ONMOUSEOUT+instance AddAttr IMG ONMOUSEOVER+instance AddAttr IMG ONMOUSEUP+instance AddAttr IMG SRC+instance AddAttr IMG STYLE+instance AddAttr IMG TITLE+instance AddAttr IMG USEMAP+instance AddAttr IMG VSPACE+instance AddAttr IMG WIDTH+instance AddAttr INPUT ACCEPT+instance AddAttr INPUT ACCESSKEY+instance AddAttr INPUT ALIGN+instance AddAttr INPUT ALT+instance AddAttr INPUT CHECKED+instance AddAttr INPUT CLASS+instance AddAttr INPUT DIR+instance AddAttr INPUT DISABLED+instance AddAttr INPUT ID+instance AddAttr INPUT LANG+instance AddAttr INPUT MAXLENGTH+instance AddAttr INPUT NAME+instance AddAttr INPUT ONBLUR+instance AddAttr INPUT ONCHANGE+instance AddAttr INPUT ONCLICK+instance AddAttr INPUT ONDBLCLICK+instance AddAttr INPUT ONFOCUS+instance AddAttr INPUT ONKEYDOWN+instance AddAttr INPUT ONKEYPRESS+instance AddAttr INPUT ONKEYUP+instance AddAttr INPUT ONMOUSEDOWN+instance AddAttr INPUT ONMOUSEMOVE+instance AddAttr INPUT ONMOUSEOUT+instance AddAttr INPUT ONMOUSEOVER+instance AddAttr INPUT ONMOUSEUP+instance AddAttr INPUT ONSELECT+instance AddAttr INPUT READONLY+instance AddAttr INPUT SIZE+instance AddAttr INPUT SRC+instance AddAttr INPUT STYLE+instance AddAttr INPUT TABINDEX+instance AddAttr INPUT TITLE+instance AddAttr INPUT TYPE+instance AddAttr INPUT USEMAP+instance AddAttr INPUT VALUE+instance AddAttr INS CITE+instance AddAttr INS CLASS+instance AddAttr INS DATETIME+instance AddAttr INS DIR+instance AddAttr INS ID+instance AddAttr INS LANG+instance AddAttr INS ONCLICK+instance AddAttr INS ONDBLCLICK+instance AddAttr INS ONKEYDOWN+instance AddAttr INS ONKEYPRESS+instance AddAttr INS ONKEYUP+instance AddAttr INS ONMOUSEDOWN+instance AddAttr INS ONMOUSEMOVE+instance AddAttr INS ONMOUSEOUT+instance AddAttr INS ONMOUSEOVER+instance AddAttr INS ONMOUSEUP+instance AddAttr INS STYLE+instance AddAttr INS TITLE+instance AddAttr ISINDEX CLASS+instance AddAttr ISINDEX DIR+instance AddAttr ISINDEX ID+instance AddAttr ISINDEX LANG+instance AddAttr ISINDEX PROMPT+instance AddAttr ISINDEX STYLE+instance AddAttr ISINDEX TITLE+instance AddAttr KBD CLASS+instance AddAttr KBD DIR+instance AddAttr KBD ID+instance AddAttr KBD LANG+instance AddAttr KBD ONCLICK+instance AddAttr KBD ONDBLCLICK+instance AddAttr KBD ONKEYDOWN+instance AddAttr KBD ONKEYPRESS+instance AddAttr KBD ONKEYUP+instance AddAttr KBD ONMOUSEDOWN+instance AddAttr KBD ONMOUSEMOVE+instance AddAttr KBD ONMOUSEOUT+instance AddAttr KBD ONMOUSEOVER+instance AddAttr KBD ONMOUSEUP+instance AddAttr KBD STYLE+instance AddAttr KBD TITLE+instance AddAttr LABEL ACCESSKEY+instance AddAttr LABEL CLASS+instance AddAttr LABEL DIR+instance AddAttr LABEL FOR+instance AddAttr LABEL ID+instance AddAttr LABEL LANG+instance AddAttr LABEL ONBLUR+instance AddAttr LABEL ONCLICK+instance AddAttr LABEL ONDBLCLICK+instance AddAttr LABEL ONFOCUS+instance AddAttr LABEL ONKEYDOWN+instance AddAttr LABEL ONKEYPRESS+instance AddAttr LABEL ONKEYUP+instance AddAttr LABEL ONMOUSEDOWN+instance AddAttr LABEL ONMOUSEMOVE+instance AddAttr LABEL ONMOUSEOUT+instance AddAttr LABEL ONMOUSEOVER+instance AddAttr LABEL ONMOUSEUP+instance AddAttr LABEL STYLE+instance AddAttr LABEL TITLE+instance AddAttr LEGEND ACCESSKEY+instance AddAttr LEGEND ALIGN+instance AddAttr LEGEND CLASS+instance AddAttr LEGEND DIR+instance AddAttr LEGEND ID+instance AddAttr LEGEND LANG+instance AddAttr LEGEND ONCLICK+instance AddAttr LEGEND ONDBLCLICK+instance AddAttr LEGEND ONKEYDOWN+instance AddAttr LEGEND ONKEYPRESS+instance AddAttr LEGEND ONKEYUP+instance AddAttr LEGEND ONMOUSEDOWN+instance AddAttr LEGEND ONMOUSEMOVE+instance AddAttr LEGEND ONMOUSEOUT+instance AddAttr LEGEND ONMOUSEOVER+instance AddAttr LEGEND ONMOUSEUP+instance AddAttr LEGEND STYLE+instance AddAttr LEGEND TITLE+instance AddAttr LI CLASS+instance AddAttr LI DIR+instance AddAttr LI ID+instance AddAttr LI LANG+instance AddAttr LI ONCLICK+instance AddAttr LI ONDBLCLICK+instance AddAttr LI ONKEYDOWN+instance AddAttr LI ONKEYPRESS+instance AddAttr LI ONKEYUP+instance AddAttr LI ONMOUSEDOWN+instance AddAttr LI ONMOUSEMOVE+instance AddAttr LI ONMOUSEOUT+instance AddAttr LI ONMOUSEOVER+instance AddAttr LI ONMOUSEUP+instance AddAttr LI STYLE+instance AddAttr LI TITLE+instance AddAttr LI TYPE+instance AddAttr LI VALUE+instance AddAttr LINK CHARSET+instance AddAttr LINK CLASS+instance AddAttr LINK DIR+instance AddAttr LINK HREF+instance AddAttr LINK HREFLANG+instance AddAttr LINK ID+instance AddAttr LINK LANG+instance AddAttr LINK MEDIA+instance AddAttr LINK ONCLICK+instance AddAttr LINK ONDBLCLICK+instance AddAttr LINK ONKEYDOWN+instance AddAttr LINK ONKEYPRESS+instance AddAttr LINK ONKEYUP+instance AddAttr LINK ONMOUSEDOWN+instance AddAttr LINK ONMOUSEMOVE+instance AddAttr LINK ONMOUSEOUT+instance AddAttr LINK ONMOUSEOVER+instance AddAttr LINK ONMOUSEUP+instance AddAttr LINK REL+instance AddAttr LINK REV+instance AddAttr LINK STYLE+instance AddAttr LINK TARGET+instance AddAttr LINK TITLE+instance AddAttr LINK TYPE+instance AddAttr MAP CLASS+instance AddAttr MAP DIR+instance AddAttr MAP ID+instance AddAttr MAP LANG+instance AddAttr MAP NAME+instance AddAttr MAP ONCLICK+instance AddAttr MAP ONDBLCLICK+instance AddAttr MAP ONKEYDOWN+instance AddAttr MAP ONKEYPRESS+instance AddAttr MAP ONKEYUP+instance AddAttr MAP ONMOUSEDOWN+instance AddAttr MAP ONMOUSEMOVE+instance AddAttr MAP ONMOUSEOUT+instance AddAttr MAP ONMOUSEOVER+instance AddAttr MAP ONMOUSEUP+instance AddAttr MAP STYLE+instance AddAttr MAP TITLE+instance AddAttr MENU CLASS+instance AddAttr MENU COMPACT+instance AddAttr MENU DIR+instance AddAttr MENU ID+instance AddAttr MENU LANG+instance AddAttr MENU ONCLICK+instance AddAttr MENU ONDBLCLICK+instance AddAttr MENU ONKEYDOWN+instance AddAttr MENU ONKEYPRESS+instance AddAttr MENU ONKEYUP+instance AddAttr MENU ONMOUSEDOWN+instance AddAttr MENU ONMOUSEMOVE+instance AddAttr MENU ONMOUSEOUT+instance AddAttr MENU ONMOUSEOVER+instance AddAttr MENU ONMOUSEUP+instance AddAttr MENU STYLE+instance AddAttr MENU TITLE+instance AddAttr META CONTENT+instance AddAttr META DIR+instance AddAttr META HTTP_EQUIV+instance AddAttr META LANG+instance AddAttr META NAME+instance AddAttr META SCHEME+instance AddAttr NOFRAMES CLASS+instance AddAttr NOFRAMES DIR+instance AddAttr NOFRAMES ID+instance AddAttr NOFRAMES LANG+instance AddAttr NOFRAMES ONCLICK+instance AddAttr NOFRAMES ONDBLCLICK+instance AddAttr NOFRAMES ONKEYDOWN+instance AddAttr NOFRAMES ONKEYPRESS+instance AddAttr NOFRAMES ONKEYUP+instance AddAttr NOFRAMES ONMOUSEDOWN+instance AddAttr NOFRAMES ONMOUSEMOVE+instance AddAttr NOFRAMES ONMOUSEOUT+instance AddAttr NOFRAMES ONMOUSEOVER+instance AddAttr NOFRAMES ONMOUSEUP+instance AddAttr NOFRAMES STYLE+instance AddAttr NOFRAMES TITLE+instance AddAttr NOSCRIPT CLASS+instance AddAttr NOSCRIPT DIR+instance AddAttr NOSCRIPT ID+instance AddAttr NOSCRIPT LANG+instance AddAttr NOSCRIPT ONCLICK+instance AddAttr NOSCRIPT ONDBLCLICK+instance AddAttr NOSCRIPT ONKEYDOWN+instance AddAttr NOSCRIPT ONKEYPRESS+instance AddAttr NOSCRIPT ONKEYUP+instance AddAttr NOSCRIPT ONMOUSEDOWN+instance AddAttr NOSCRIPT ONMOUSEMOVE+instance AddAttr NOSCRIPT ONMOUSEOUT+instance AddAttr NOSCRIPT ONMOUSEOVER+instance AddAttr NOSCRIPT ONMOUSEUP+instance AddAttr NOSCRIPT STYLE+instance AddAttr NOSCRIPT TITLE+instance AddAttr OBJECT ALIGN+instance AddAttr OBJECT ARCHIVE+instance AddAttr OBJECT BORDER+instance AddAttr OBJECT CLASS+instance AddAttr OBJECT CLASSID+instance AddAttr OBJECT CODEBASE+instance AddAttr OBJECT CODETYPE+instance AddAttr OBJECT DATA+instance AddAttr OBJECT DECLARE+instance AddAttr OBJECT DIR+instance AddAttr OBJECT HEIGHT+instance AddAttr OBJECT HSPACE+instance AddAttr OBJECT ID+instance AddAttr OBJECT LANG+instance AddAttr OBJECT NAME+instance AddAttr OBJECT ONCLICK+instance AddAttr OBJECT ONDBLCLICK+instance AddAttr OBJECT ONKEYDOWN+instance AddAttr OBJECT ONKEYPRESS+instance AddAttr OBJECT ONKEYUP+instance AddAttr OBJECT ONMOUSEDOWN+instance AddAttr OBJECT ONMOUSEMOVE+instance AddAttr OBJECT ONMOUSEOUT+instance AddAttr OBJECT ONMOUSEOVER+instance AddAttr OBJECT ONMOUSEUP+instance AddAttr OBJECT STANDBY+instance AddAttr OBJECT STYLE+instance AddAttr OBJECT TABINDEX+instance AddAttr OBJECT TITLE+instance AddAttr OBJECT TYPE+instance AddAttr OBJECT USEMAP+instance AddAttr OBJECT VSPACE+instance AddAttr OBJECT WIDTH+instance AddAttr OL CLASS+instance AddAttr OL COMPACT+instance AddAttr OL DIR+instance AddAttr OL ID+instance AddAttr OL LANG+instance AddAttr OL ONCLICK+instance AddAttr OL ONDBLCLICK+instance AddAttr OL ONKEYDOWN+instance AddAttr OL ONKEYPRESS+instance AddAttr OL ONKEYUP+instance AddAttr OL ONMOUSEDOWN+instance AddAttr OL ONMOUSEMOVE+instance AddAttr OL ONMOUSEOUT+instance AddAttr OL ONMOUSEOVER+instance AddAttr OL ONMOUSEUP+instance AddAttr OL START+instance AddAttr OL STYLE+instance AddAttr OL TITLE+instance AddAttr OL TYPE+instance AddAttr OPTGROUP CLASS+instance AddAttr OPTGROUP DIR+instance AddAttr OPTGROUP DISABLED+instance AddAttr OPTGROUP ID+instance AddAttr OPTGROUP LABEL+instance AddAttr OPTGROUP LANG+instance AddAttr OPTGROUP ONCLICK+instance AddAttr OPTGROUP ONDBLCLICK+instance AddAttr OPTGROUP ONKEYDOWN+instance AddAttr OPTGROUP ONKEYPRESS+instance AddAttr OPTGROUP ONKEYUP+instance AddAttr OPTGROUP ONMOUSEDOWN+instance AddAttr OPTGROUP ONMOUSEMOVE+instance AddAttr OPTGROUP ONMOUSEOUT+instance AddAttr OPTGROUP ONMOUSEOVER+instance AddAttr OPTGROUP ONMOUSEUP+instance AddAttr OPTGROUP STYLE+instance AddAttr OPTGROUP TITLE+instance AddAttr OPTION CLASS+instance AddAttr OPTION DIR+instance AddAttr OPTION DISABLED+instance AddAttr OPTION ID+instance AddAttr OPTION LABEL+instance AddAttr OPTION LANG+instance AddAttr OPTION ONCLICK+instance AddAttr OPTION ONDBLCLICK+instance AddAttr OPTION ONKEYDOWN+instance AddAttr OPTION ONKEYPRESS+instance AddAttr OPTION ONKEYUP+instance AddAttr OPTION ONMOUSEDOWN+instance AddAttr OPTION ONMOUSEMOVE+instance AddAttr OPTION ONMOUSEOUT+instance AddAttr OPTION ONMOUSEOVER+instance AddAttr OPTION ONMOUSEUP+instance AddAttr OPTION SELECTED+instance AddAttr OPTION STYLE+instance AddAttr OPTION TITLE+instance AddAttr OPTION VALUE+instance AddAttr P ALIGN+instance AddAttr P CLASS+instance AddAttr P DIR+instance AddAttr P ID+instance AddAttr P LANG+instance AddAttr P ONCLICK+instance AddAttr P ONDBLCLICK+instance AddAttr P ONKEYDOWN+instance AddAttr P ONKEYPRESS+instance AddAttr P ONKEYUP+instance AddAttr P ONMOUSEDOWN+instance AddAttr P ONMOUSEMOVE+instance AddAttr P ONMOUSEOUT+instance AddAttr P ONMOUSEOVER+instance AddAttr P ONMOUSEUP+instance AddAttr P STYLE+instance AddAttr P TITLE+instance AddAttr PARAM ID+instance AddAttr PARAM NAME+instance AddAttr PARAM TYPE+instance AddAttr PARAM VALUE+instance AddAttr PARAM VALUETYPE+instance AddAttr PRE CLASS+instance AddAttr PRE DIR+instance AddAttr PRE ID+instance AddAttr PRE LANG+instance AddAttr PRE ONCLICK+instance AddAttr PRE ONDBLCLICK+instance AddAttr PRE ONKEYDOWN+instance AddAttr PRE ONKEYPRESS+instance AddAttr PRE ONKEYUP+instance AddAttr PRE ONMOUSEDOWN+instance AddAttr PRE ONMOUSEMOVE+instance AddAttr PRE ONMOUSEOUT+instance AddAttr PRE ONMOUSEOVER+instance AddAttr PRE ONMOUSEUP+instance AddAttr PRE STYLE+instance AddAttr PRE TITLE+instance AddAttr PRE WIDTH+instance AddAttr Q CITE+instance AddAttr Q CLASS+instance AddAttr Q DIR+instance AddAttr Q ID+instance AddAttr Q LANG+instance AddAttr Q ONCLICK+instance AddAttr Q ONDBLCLICK+instance AddAttr Q ONKEYDOWN+instance AddAttr Q ONKEYPRESS+instance AddAttr Q ONKEYUP+instance AddAttr Q ONMOUSEDOWN+instance AddAttr Q ONMOUSEMOVE+instance AddAttr Q ONMOUSEOUT+instance AddAttr Q ONMOUSEOVER+instance AddAttr Q ONMOUSEUP+instance AddAttr Q STYLE+instance AddAttr Q TITLE+instance AddAttr S CLASS+instance AddAttr S DIR+instance AddAttr S ID+instance AddAttr S LANG+instance AddAttr S ONCLICK+instance AddAttr S ONDBLCLICK+instance AddAttr S ONKEYDOWN+instance AddAttr S ONKEYPRESS+instance AddAttr S ONKEYUP+instance AddAttr S ONMOUSEDOWN+instance AddAttr S ONMOUSEMOVE+instance AddAttr S ONMOUSEOUT+instance AddAttr S ONMOUSEOVER+instance AddAttr S ONMOUSEUP+instance AddAttr S STYLE+instance AddAttr S TITLE+instance AddAttr SAMP CLASS+instance AddAttr SAMP DIR+instance AddAttr SAMP ID+instance AddAttr SAMP LANG+instance AddAttr SAMP ONCLICK+instance AddAttr SAMP ONDBLCLICK+instance AddAttr SAMP ONKEYDOWN+instance AddAttr SAMP ONKEYPRESS+instance AddAttr SAMP ONKEYUP+instance AddAttr SAMP ONMOUSEDOWN+instance AddAttr SAMP ONMOUSEMOVE+instance AddAttr SAMP ONMOUSEOUT+instance AddAttr SAMP ONMOUSEOVER+instance AddAttr SAMP ONMOUSEUP+instance AddAttr SAMP STYLE+instance AddAttr SAMP TITLE+instance AddAttr SCRIPT CHARSET+instance AddAttr SCRIPT DEFER+instance AddAttr SCRIPT EVENT+instance AddAttr SCRIPT FOR+instance AddAttr SCRIPT LANGUAGE+instance AddAttr SCRIPT SRC+instance AddAttr SCRIPT TYPE+instance AddAttr SELECT CLASS+instance AddAttr SELECT DIR+instance AddAttr SELECT DISABLED+instance AddAttr SELECT ID+instance AddAttr SELECT LANG+instance AddAttr SELECT MULTIPLE+instance AddAttr SELECT NAME+instance AddAttr SELECT ONBLUR+instance AddAttr SELECT ONCHANGE+instance AddAttr SELECT ONCLICK+instance AddAttr SELECT ONDBLCLICK+instance AddAttr SELECT ONFOCUS+instance AddAttr SELECT ONKEYDOWN+instance AddAttr SELECT ONKEYPRESS+instance AddAttr SELECT ONKEYUP+instance AddAttr SELECT ONMOUSEDOWN+instance AddAttr SELECT ONMOUSEMOVE+instance AddAttr SELECT ONMOUSEOUT+instance AddAttr SELECT ONMOUSEOVER+instance AddAttr SELECT ONMOUSEUP+instance AddAttr SELECT SIZE+instance AddAttr SELECT STYLE+instance AddAttr SELECT TABINDEX+instance AddAttr SELECT TITLE+instance AddAttr SMALL CLASS+instance AddAttr SMALL DIR+instance AddAttr SMALL ID+instance AddAttr SMALL LANG+instance AddAttr SMALL ONCLICK+instance AddAttr SMALL ONDBLCLICK+instance AddAttr SMALL ONKEYDOWN+instance AddAttr SMALL ONKEYPRESS+instance AddAttr SMALL ONKEYUP+instance AddAttr SMALL ONMOUSEDOWN+instance AddAttr SMALL ONMOUSEMOVE+instance AddAttr SMALL ONMOUSEOUT+instance AddAttr SMALL ONMOUSEOVER+instance AddAttr SMALL ONMOUSEUP+instance AddAttr SMALL STYLE+instance AddAttr SMALL TITLE+instance AddAttr SPAN CLASS+instance AddAttr SPAN DIR+instance AddAttr SPAN ID+instance AddAttr SPAN LANG+instance AddAttr SPAN ONCLICK+instance AddAttr SPAN ONDBLCLICK+instance AddAttr SPAN ONKEYDOWN+instance AddAttr SPAN ONKEYPRESS+instance AddAttr SPAN ONKEYUP+instance AddAttr SPAN ONMOUSEDOWN+instance AddAttr SPAN ONMOUSEMOVE+instance AddAttr SPAN ONMOUSEOUT+instance AddAttr SPAN ONMOUSEOVER+instance AddAttr SPAN ONMOUSEUP+instance AddAttr SPAN STYLE+instance AddAttr SPAN TITLE+instance AddAttr STRIKE CLASS+instance AddAttr STRIKE DIR+instance AddAttr STRIKE ID+instance AddAttr STRIKE LANG+instance AddAttr STRIKE ONCLICK+instance AddAttr STRIKE ONDBLCLICK+instance AddAttr STRIKE ONKEYDOWN+instance AddAttr STRIKE ONKEYPRESS+instance AddAttr STRIKE ONKEYUP+instance AddAttr STRIKE ONMOUSEDOWN+instance AddAttr STRIKE ONMOUSEMOVE+instance AddAttr STRIKE ONMOUSEOUT+instance AddAttr STRIKE ONMOUSEOVER+instance AddAttr STRIKE ONMOUSEUP+instance AddAttr STRIKE STYLE+instance AddAttr STRIKE TITLE+instance AddAttr STRONG CLASS+instance AddAttr STRONG DIR+instance AddAttr STRONG ID+instance AddAttr STRONG LANG+instance AddAttr STRONG ONCLICK+instance AddAttr STRONG ONDBLCLICK+instance AddAttr STRONG ONKEYDOWN+instance AddAttr STRONG ONKEYPRESS+instance AddAttr STRONG ONKEYUP+instance AddAttr STRONG ONMOUSEDOWN+instance AddAttr STRONG ONMOUSEMOVE+instance AddAttr STRONG ONMOUSEOUT+instance AddAttr STRONG ONMOUSEOVER+instance AddAttr STRONG ONMOUSEUP+instance AddAttr STRONG STYLE+instance AddAttr STRONG TITLE+instance AddAttr STYLE DIR+instance AddAttr STYLE LANG+instance AddAttr STYLE MEDIA+instance AddAttr STYLE TITLE+instance AddAttr STYLE TYPE+instance AddAttr SUB CLASS+instance AddAttr SUB DIR+instance AddAttr SUB ID+instance AddAttr SUB LANG+instance AddAttr SUB ONCLICK+instance AddAttr SUB ONDBLCLICK+instance AddAttr SUB ONKEYDOWN+instance AddAttr SUB ONKEYPRESS+instance AddAttr SUB ONKEYUP+instance AddAttr SUB ONMOUSEDOWN+instance AddAttr SUB ONMOUSEMOVE+instance AddAttr SUB ONMOUSEOUT+instance AddAttr SUB ONMOUSEOVER+instance AddAttr SUB ONMOUSEUP+instance AddAttr SUB STYLE+instance AddAttr SUB TITLE+instance AddAttr SUP CLASS+instance AddAttr SUP DIR+instance AddAttr SUP ID+instance AddAttr SUP LANG+instance AddAttr SUP ONCLICK+instance AddAttr SUP ONDBLCLICK+instance AddAttr SUP ONKEYDOWN+instance AddAttr SUP ONKEYPRESS+instance AddAttr SUP ONKEYUP+instance AddAttr SUP ONMOUSEDOWN+instance AddAttr SUP ONMOUSEMOVE+instance AddAttr SUP ONMOUSEOUT+instance AddAttr SUP ONMOUSEOVER+instance AddAttr SUP ONMOUSEUP+instance AddAttr SUP STYLE+instance AddAttr SUP TITLE+instance AddAttr TABLE ALIGN+instance AddAttr TABLE BGCOLOR+instance AddAttr TABLE BORDER+instance AddAttr TABLE CELLPADDING+instance AddAttr TABLE CELLSPACING+instance AddAttr TABLE CLASS+instance AddAttr TABLE DATAPAGESIZE+instance AddAttr TABLE DIR+instance AddAttr TABLE FRAME+instance AddAttr TABLE ID+instance AddAttr TABLE LANG+instance AddAttr TABLE ONCLICK+instance AddAttr TABLE ONDBLCLICK+instance AddAttr TABLE ONKEYDOWN+instance AddAttr TABLE ONKEYPRESS+instance AddAttr TABLE ONKEYUP+instance AddAttr TABLE ONMOUSEDOWN+instance AddAttr TABLE ONMOUSEMOVE+instance AddAttr TABLE ONMOUSEOUT+instance AddAttr TABLE ONMOUSEOVER+instance AddAttr TABLE ONMOUSEUP+instance AddAttr TABLE RULES+instance AddAttr TABLE STYLE+instance AddAttr TABLE SUMMARY+instance AddAttr TABLE TITLE+instance AddAttr TABLE WIDTH+instance AddAttr TBODY ALIGN+instance AddAttr TBODY CHAR+instance AddAttr TBODY CHAROFF+instance AddAttr TBODY CLASS+instance AddAttr TBODY DIR+instance AddAttr TBODY ID+instance AddAttr TBODY LANG+instance AddAttr TBODY ONCLICK+instance AddAttr TBODY ONDBLCLICK+instance AddAttr TBODY ONKEYDOWN+instance AddAttr TBODY ONKEYPRESS+instance AddAttr TBODY ONKEYUP+instance AddAttr TBODY ONMOUSEDOWN+instance AddAttr TBODY ONMOUSEMOVE+instance AddAttr TBODY ONMOUSEOUT+instance AddAttr TBODY ONMOUSEOVER+instance AddAttr TBODY ONMOUSEUP+instance AddAttr TBODY STYLE+instance AddAttr TBODY TITLE+instance AddAttr TBODY VALIGN+instance AddAttr TD ABBR+instance AddAttr TD ALIGN+instance AddAttr TD AXIS+instance AddAttr TD BGCOLOR+instance AddAttr TD CHAR+instance AddAttr TD CHAROFF+instance AddAttr TD CLASS+instance AddAttr TD COLSPAN+instance AddAttr TD DIR+instance AddAttr TD HEADERS+instance AddAttr TD HEIGHT+instance AddAttr TD ID+instance AddAttr TD LANG+instance AddAttr TD NOWRAP+instance AddAttr TD ONCLICK+instance AddAttr TD ONDBLCLICK+instance AddAttr TD ONKEYDOWN+instance AddAttr TD ONKEYPRESS+instance AddAttr TD ONKEYUP+instance AddAttr TD ONMOUSEDOWN+instance AddAttr TD ONMOUSEMOVE+instance AddAttr TD ONMOUSEOUT+instance AddAttr TD ONMOUSEOVER+instance AddAttr TD ONMOUSEUP+instance AddAttr TD ROWSPAN+instance AddAttr TD SCOPE+instance AddAttr TD STYLE+instance AddAttr TD TITLE+instance AddAttr TD VALIGN+instance AddAttr TD WIDTH+instance AddAttr TEXTAREA ACCESSKEY+instance AddAttr TEXTAREA CLASS+instance AddAttr TEXTAREA COLS+instance AddAttr TEXTAREA DIR+instance AddAttr TEXTAREA DISABLED+instance AddAttr TEXTAREA ID+instance AddAttr TEXTAREA LANG+instance AddAttr TEXTAREA NAME+instance AddAttr TEXTAREA ONBLUR+instance AddAttr TEXTAREA ONCHANGE+instance AddAttr TEXTAREA ONCLICK+instance AddAttr TEXTAREA ONDBLCLICK+instance AddAttr TEXTAREA ONFOCUS+instance AddAttr TEXTAREA ONKEYDOWN+instance AddAttr TEXTAREA ONKEYPRESS+instance AddAttr TEXTAREA ONKEYUP+instance AddAttr TEXTAREA ONMOUSEDOWN+instance AddAttr TEXTAREA ONMOUSEMOVE+instance AddAttr TEXTAREA ONMOUSEOUT+instance AddAttr TEXTAREA ONMOUSEOVER+instance AddAttr TEXTAREA ONMOUSEUP+instance AddAttr TEXTAREA ONSELECT+instance AddAttr TEXTAREA READONLY+instance AddAttr TEXTAREA ROWS+instance AddAttr TEXTAREA STYLE+instance AddAttr TEXTAREA TABINDEX+instance AddAttr TEXTAREA TITLE+instance AddAttr TFOOT ALIGN+instance AddAttr TFOOT CHAR+instance AddAttr TFOOT CHAROFF+instance AddAttr TFOOT CLASS+instance AddAttr TFOOT DIR+instance AddAttr TFOOT ID+instance AddAttr TFOOT LANG+instance AddAttr TFOOT ONCLICK+instance AddAttr TFOOT ONDBLCLICK+instance AddAttr TFOOT ONKEYDOWN+instance AddAttr TFOOT ONKEYPRESS+instance AddAttr TFOOT ONKEYUP+instance AddAttr TFOOT ONMOUSEDOWN+instance AddAttr TFOOT ONMOUSEMOVE+instance AddAttr TFOOT ONMOUSEOUT+instance AddAttr TFOOT ONMOUSEOVER+instance AddAttr TFOOT ONMOUSEUP+instance AddAttr TFOOT STYLE+instance AddAttr TFOOT TITLE+instance AddAttr TFOOT VALIGN+instance AddAttr TH ABBR+instance AddAttr TH ALIGN+instance AddAttr TH AXIS+instance AddAttr TH BGCOLOR+instance AddAttr TH CHAR+instance AddAttr TH CHAROFF+instance AddAttr TH CLASS+instance AddAttr TH COLSPAN+instance AddAttr TH DIR+instance AddAttr TH HEADERS+instance AddAttr TH HEIGHT+instance AddAttr TH ID+instance AddAttr TH LANG+instance AddAttr TH NOWRAP+instance AddAttr TH ONCLICK+instance AddAttr TH ONDBLCLICK+instance AddAttr TH ONKEYDOWN+instance AddAttr TH ONKEYPRESS+instance AddAttr TH ONKEYUP+instance AddAttr TH ONMOUSEDOWN+instance AddAttr TH ONMOUSEMOVE+instance AddAttr TH ONMOUSEOUT+instance AddAttr TH ONMOUSEOVER+instance AddAttr TH ONMOUSEUP+instance AddAttr TH ROWSPAN+instance AddAttr TH SCOPE+instance AddAttr TH STYLE+instance AddAttr TH TITLE+instance AddAttr TH VALIGN+instance AddAttr TH WIDTH+instance AddAttr THEAD ALIGN+instance AddAttr THEAD CHAR+instance AddAttr THEAD CHAROFF+instance AddAttr THEAD CLASS+instance AddAttr THEAD DIR+instance AddAttr THEAD ID+instance AddAttr THEAD LANG+instance AddAttr THEAD ONCLICK+instance AddAttr THEAD ONDBLCLICK+instance AddAttr THEAD ONKEYDOWN+instance AddAttr THEAD ONKEYPRESS+instance AddAttr THEAD ONKEYUP+instance AddAttr THEAD ONMOUSEDOWN+instance AddAttr THEAD ONMOUSEMOVE+instance AddAttr THEAD ONMOUSEOUT+instance AddAttr THEAD ONMOUSEOVER+instance AddAttr THEAD ONMOUSEUP+instance AddAttr THEAD STYLE+instance AddAttr THEAD TITLE+instance AddAttr THEAD VALIGN+instance AddAttr TITLE DIR+instance AddAttr TITLE LANG+instance AddAttr TR ALIGN+instance AddAttr TR BGCOLOR+instance AddAttr TR CHAR+instance AddAttr TR CHAROFF+instance AddAttr TR CLASS+instance AddAttr TR DIR+instance AddAttr TR ID+instance AddAttr TR LANG+instance AddAttr TR ONCLICK+instance AddAttr TR ONDBLCLICK+instance AddAttr TR ONKEYDOWN+instance AddAttr TR ONKEYPRESS+instance AddAttr TR ONKEYUP+instance AddAttr TR ONMOUSEDOWN+instance AddAttr TR ONMOUSEMOVE+instance AddAttr TR ONMOUSEOUT+instance AddAttr TR ONMOUSEOVER+instance AddAttr TR ONMOUSEUP+instance AddAttr TR STYLE+instance AddAttr TR TITLE+instance AddAttr TR VALIGN+instance AddAttr TT CLASS+instance AddAttr TT DIR+instance AddAttr TT ID+instance AddAttr TT LANG+instance AddAttr TT ONCLICK+instance AddAttr TT ONDBLCLICK+instance AddAttr TT ONKEYDOWN+instance AddAttr TT ONKEYPRESS+instance AddAttr TT ONKEYUP+instance AddAttr TT ONMOUSEDOWN+instance AddAttr TT ONMOUSEMOVE+instance AddAttr TT ONMOUSEOUT+instance AddAttr TT ONMOUSEOVER+instance AddAttr TT ONMOUSEUP+instance AddAttr TT STYLE+instance AddAttr TT TITLE+instance AddAttr U CLASS+instance AddAttr U DIR+instance AddAttr U ID+instance AddAttr U LANG+instance AddAttr U ONCLICK+instance AddAttr U ONDBLCLICK+instance AddAttr U ONKEYDOWN+instance AddAttr U ONKEYPRESS+instance AddAttr U ONKEYUP+instance AddAttr U ONMOUSEDOWN+instance AddAttr U ONMOUSEMOVE+instance AddAttr U ONMOUSEOUT+instance AddAttr U ONMOUSEOVER+instance AddAttr U ONMOUSEUP+instance AddAttr U STYLE+instance AddAttr U TITLE+instance AddAttr UL CLASS+instance AddAttr UL COMPACT+instance AddAttr UL DIR+instance AddAttr UL ID+instance AddAttr UL LANG+instance AddAttr UL ONCLICK+instance AddAttr UL ONDBLCLICK+instance AddAttr UL ONKEYDOWN+instance AddAttr UL ONKEYPRESS+instance AddAttr UL ONKEYUP+instance AddAttr UL ONMOUSEDOWN+instance AddAttr UL ONMOUSEMOVE+instance AddAttr UL ONMOUSEOUT+instance AddAttr UL ONMOUSEOVER+instance AddAttr UL ONMOUSEUP+instance AddAttr UL STYLE+instance AddAttr UL TITLE+instance AddAttr UL TYPE+instance AddAttr VAR CLASS+instance AddAttr VAR DIR+instance AddAttr VAR ID+instance AddAttr VAR LANG+instance AddAttr VAR ONCLICK+instance AddAttr VAR ONDBLCLICK+instance AddAttr VAR ONKEYDOWN+instance AddAttr VAR ONKEYPRESS+instance AddAttr VAR ONKEYUP+instance AddAttr VAR ONMOUSEDOWN+instance AddAttr VAR ONMOUSEMOVE+instance AddAttr VAR ONMOUSEOUT+instance AddAttr VAR ONMOUSEOVER+instance AddAttr VAR ONMOUSEUP+instance AddAttr VAR STYLE+instance AddAttr VAR TITLE
+ WASH/HTML/HTMLPrelude98.hs view
@@ -0,0 +1,6195 @@+-- © 2001, 2002 Peter Thiemann+-- this file is generated -- do not edit+module WASH.HTML.HTMLPrelude98+  (module WASH.HTML.HTMLPrelude98,module WASH.HTML.HTMLTypedBase98)+  where+import Prelude hiding (div,head,map,span)+import WASH.HTML.HTMLTypedBase98+-- identity function+empty x = x+-- reverse function application+( # ) = flip ($)	-- DON'T REMOVE THE SPACES+-- reverse function composition+( ## ) = flip (.)	-- DON'T REMOVE THE SPACES+-- +instance AdmitChildHTML DOCUMENT+build_document :: (ELT HTML -> ELT HTML) -> ELT DOCUMENT+build_document addToHTML = make DOCUMENT # html addToHTML+-- end fixed prologue+class AdmitAttrVERSION e where+  uaVERSION :: String -> ELT e -> ELT e+  uaVERSION str into = add_attr into (mkUAttr VERSION str)+  atVERSION :: AttrValueVERSION v => v -> ELT e -> ELT e+  atVERSION v into = add_attr into (mkUAttr VERSION (av $ show v))+class AdmitAttrDIR e where+  uaDIR :: String -> ELT e -> ELT e+  uaDIR str into = add_attr into (mkUAttr DIR str)+  atDIR :: AttrValueDIR v => v -> ELT e -> ELT e+  atDIR v into = add_attr into (mkUAttr DIR (av $ show v))+class AdmitAttrLANG e where+  uaLANG :: String -> ELT e -> ELT e+  uaLANG str into = add_attr into (mkUAttr LANG str)+  atLANG :: AttrValueLANG v => v -> ELT e -> ELT e+  atLANG v into = add_attr into (mkUAttr LANG (av $ show v))+class AdmitAttrONKEYUP e where+  uaONKEYUP :: String -> ELT e -> ELT e+  uaONKEYUP str into = add_attr into (mkUAttr ONKEYUP str)+  atONKEYUP :: AttrValueONKEYUP v => v -> ELT e -> ELT e+  atONKEYUP v into = add_attr into (mkUAttr ONKEYUP (av $ show v))+class AdmitAttrONKEYDOWN e where+  uaONKEYDOWN :: String -> ELT e -> ELT e+  uaONKEYDOWN str into = add_attr into (mkUAttr ONKEYDOWN str)+  atONKEYDOWN :: AttrValueONKEYDOWN v => v -> ELT e -> ELT e+  atONKEYDOWN v into = add_attr into (mkUAttr ONKEYDOWN (av $ show v))+class AdmitAttrONKEYPRESS e where+  uaONKEYPRESS :: String -> ELT e -> ELT e+  uaONKEYPRESS str into = add_attr into (mkUAttr ONKEYPRESS str)+  atONKEYPRESS :: AttrValueONKEYPRESS v => v -> ELT e -> ELT e+  atONKEYPRESS v into = add_attr into (mkUAttr ONKEYPRESS (av $ show v))+class AdmitAttrONMOUSEOUT e where+  uaONMOUSEOUT :: String -> ELT e -> ELT e+  uaONMOUSEOUT str into = add_attr into (mkUAttr ONMOUSEOUT str)+  atONMOUSEOUT :: AttrValueONMOUSEOUT v => v -> ELT e -> ELT e+  atONMOUSEOUT v into = add_attr into (mkUAttr ONMOUSEOUT (av $ show v))+class AdmitAttrONMOUSEMOVE e where+  uaONMOUSEMOVE :: String -> ELT e -> ELT e+  uaONMOUSEMOVE str into = add_attr into (mkUAttr ONMOUSEMOVE str)+  atONMOUSEMOVE :: AttrValueONMOUSEMOVE v => v -> ELT e -> ELT e+  atONMOUSEMOVE v into = add_attr into (mkUAttr ONMOUSEMOVE (av $ show v))+class AdmitAttrONMOUSEOVER e where+  uaONMOUSEOVER :: String -> ELT e -> ELT e+  uaONMOUSEOVER str into = add_attr into (mkUAttr ONMOUSEOVER str)+  atONMOUSEOVER :: AttrValueONMOUSEOVER v => v -> ELT e -> ELT e+  atONMOUSEOVER v into = add_attr into (mkUAttr ONMOUSEOVER (av $ show v))+class AdmitAttrONMOUSEUP e where+  uaONMOUSEUP :: String -> ELT e -> ELT e+  uaONMOUSEUP str into = add_attr into (mkUAttr ONMOUSEUP str)+  atONMOUSEUP :: AttrValueONMOUSEUP v => v -> ELT e -> ELT e+  atONMOUSEUP v into = add_attr into (mkUAttr ONMOUSEUP (av $ show v))+class AdmitAttrONMOUSEDOWN e where+  uaONMOUSEDOWN :: String -> ELT e -> ELT e+  uaONMOUSEDOWN str into = add_attr into (mkUAttr ONMOUSEDOWN str)+  atONMOUSEDOWN :: AttrValueONMOUSEDOWN v => v -> ELT e -> ELT e+  atONMOUSEDOWN v into = add_attr into (mkUAttr ONMOUSEDOWN (av $ show v))+class AdmitAttrONDBLCLICK e where+  uaONDBLCLICK :: String -> ELT e -> ELT e+  uaONDBLCLICK str into = add_attr into (mkUAttr ONDBLCLICK str)+  atONDBLCLICK :: AttrValueONDBLCLICK v => v -> ELT e -> ELT e+  atONDBLCLICK v into = add_attr into (mkUAttr ONDBLCLICK (av $ show v))+class AdmitAttrONCLICK e where+  uaONCLICK :: String -> ELT e -> ELT e+  uaONCLICK str into = add_attr into (mkUAttr ONCLICK str)+  atONCLICK :: AttrValueONCLICK v => v -> ELT e -> ELT e+  atONCLICK v into = add_attr into (mkUAttr ONCLICK (av $ show v))+class AdmitAttrTITLE e where+  uaTITLE :: String -> ELT e -> ELT e+  uaTITLE str into = add_attr into (mkUAttr TITLE str)+  atTITLE :: AttrValueTITLE v => v -> ELT e -> ELT e+  atTITLE v into = add_attr into (mkUAttr TITLE (av $ show v))+class AdmitAttrSTYLE e where+  uaSTYLE :: String -> ELT e -> ELT e+  uaSTYLE str into = add_attr into (mkUAttr STYLE str)+  atSTYLE :: AttrValueSTYLE v => v -> ELT e -> ELT e+  atSTYLE v into = add_attr into (mkUAttr STYLE (av $ show v))+class AdmitAttrCLASS e where+  uaCLASS :: String -> ELT e -> ELT e+  uaCLASS str into = add_attr into (mkUAttr CLASS str)+  atCLASS :: AttrValueCLASS v => v -> ELT e -> ELT e+  atCLASS v into = add_attr into (mkUAttr CLASS (av $ show v))+class AdmitAttrID e where+  uaID :: String -> ELT e -> ELT e+  uaID str into = add_attr into (mkUAttr ID str)+  atID :: AttrValueID v => v -> ELT e -> ELT e+  atID v into = add_attr into (mkUAttr ID (av $ show v))+class AdmitAttrFOR e where+  uaFOR :: String -> ELT e -> ELT e+  uaFOR str into = add_attr into (mkUAttr FOR str)+  atFOR :: AttrValueFOR v => v -> ELT e -> ELT e+  atFOR v into = add_attr into (mkUAttr FOR (av $ show v))+class AdmitAttrEVENT e where+  uaEVENT :: String -> ELT e -> ELT e+  uaEVENT str into = add_attr into (mkUAttr EVENT str)+  atEVENT :: AttrValueEVENT v => v -> ELT e -> ELT e+  atEVENT v into = add_attr into (mkUAttr EVENT (av $ show v))+class AdmitAttrDEFER e where+  uaDEFER :: String -> ELT e -> ELT e+  uaDEFER str into = add_attr into (mkUAttr DEFER str)+  atDEFER :: AttrValueDEFER v => v -> ELT e -> ELT e+  atDEFER v into = add_attr into (mkUAttr DEFER (av $ show v))+class AdmitAttrSRC e where+  uaSRC :: String -> ELT e -> ELT e+  uaSRC str into = add_attr into (mkUAttr SRC str)+  atSRC :: AttrValueSRC v => v -> ELT e -> ELT e+  atSRC v into = add_attr into (mkUAttr SRC (av $ show v))+class AdmitAttrLANGUAGE e where+  uaLANGUAGE :: String -> ELT e -> ELT e+  uaLANGUAGE str into = add_attr into (mkUAttr LANGUAGE str)+  atLANGUAGE :: AttrValueLANGUAGE v => v -> ELT e -> ELT e+  atLANGUAGE v into = add_attr into (mkUAttr LANGUAGE (av $ show v))+class AdmitAttrTYPE e where+  uaTYPE :: String -> ELT e -> ELT e+  uaTYPE str into = add_attr into (mkUAttr TYPE str)+  atTYPE :: AttrValueTYPE v => v -> ELT e -> ELT e+  atTYPE v into = add_attr into (mkUAttr TYPE (av $ show v))+class AdmitAttrCHARSET e where+  uaCHARSET :: String -> ELT e -> ELT e+  uaCHARSET str into = add_attr into (mkUAttr CHARSET str)+  atCHARSET :: AttrValueCHARSET v => v -> ELT e -> ELT e+  atCHARSET v into = add_attr into (mkUAttr CHARSET (av $ show v))+class AdmitAttrMEDIA e where+  uaMEDIA :: String -> ELT e -> ELT e+  uaMEDIA str into = add_attr into (mkUAttr MEDIA str)+  atMEDIA :: AttrValueMEDIA v => v -> ELT e -> ELT e+  atMEDIA v into = add_attr into (mkUAttr MEDIA (av $ show v))+class AdmitAttrSCHEME e where+  uaSCHEME :: String -> ELT e -> ELT e+  uaSCHEME str into = add_attr into (mkUAttr SCHEME str)+  atSCHEME :: AttrValueSCHEME v => v -> ELT e -> ELT e+  atSCHEME v into = add_attr into (mkUAttr SCHEME (av $ show v))+class AdmitAttrCONTENT e where+  uaCONTENT :: String -> ELT e -> ELT e+  uaCONTENT str into = add_attr into (mkUAttr CONTENT str)+  atCONTENT :: AttrValueCONTENT v => v -> ELT e -> ELT e+  atCONTENT v into = add_attr into (mkUAttr CONTENT (av $ show v))+class AdmitAttrNAME e where+  uaNAME :: String -> ELT e -> ELT e+  uaNAME str into = add_attr into (mkUAttr NAME str)+  atNAME :: AttrValueNAME v => v -> ELT e -> ELT e+  atNAME v into = add_attr into (mkUAttr NAME (av $ show v))+class AdmitAttrHTTP_EQUIV e where+  uaHTTP_EQUIV :: String -> ELT e -> ELT e+  uaHTTP_EQUIV str into = add_attr into (mkUAttr HTTP_EQUIV str)+  atHTTP_EQUIV :: AttrValueHTTP_EQUIV v => v -> ELT e -> ELT e+  atHTTP_EQUIV v into = add_attr into (mkUAttr HTTP_EQUIV (av $ show v))+class AdmitAttrTARGET e where+  uaTARGET :: String -> ELT e -> ELT e+  uaTARGET str into = add_attr into (mkUAttr TARGET str)+  atTARGET :: AttrValueTARGET v => v -> ELT e -> ELT e+  atTARGET v into = add_attr into (mkUAttr TARGET (av $ show v))+class AdmitAttrHREF e where+  uaHREF :: String -> ELT e -> ELT e+  uaHREF str into = add_attr into (mkUAttr HREF str)+  atHREF :: AttrValueHREF v => v -> ELT e -> ELT e+  atHREF v into = add_attr into (mkUAttr HREF (av $ show v))+class AdmitAttrPROMPT e where+  uaPROMPT :: String -> ELT e -> ELT e+  uaPROMPT str into = add_attr into (mkUAttr PROMPT str)+  atPROMPT :: AttrValuePROMPT v => v -> ELT e -> ELT e+  atPROMPT v into = add_attr into (mkUAttr PROMPT (av $ show v))+class AdmitAttrPROFILE e where+  uaPROFILE :: String -> ELT e -> ELT e+  uaPROFILE str into = add_attr into (mkUAttr PROFILE str)+  atPROFILE :: AttrValuePROFILE v => v -> ELT e -> ELT e+  atPROFILE v into = add_attr into (mkUAttr PROFILE (av $ show v))+class AdmitAttrWIDTH e where+  uaWIDTH :: String -> ELT e -> ELT e+  uaWIDTH str into = add_attr into (mkUAttr WIDTH str)+  atWIDTH :: AttrValueWIDTH v => v -> ELT e -> ELT e+  atWIDTH v into = add_attr into (mkUAttr WIDTH (av $ show v))+class AdmitAttrHEIGHT e where+  uaHEIGHT :: String -> ELT e -> ELT e+  uaHEIGHT str into = add_attr into (mkUAttr HEIGHT str)+  atHEIGHT :: AttrValueHEIGHT v => v -> ELT e -> ELT e+  atHEIGHT v into = add_attr into (mkUAttr HEIGHT (av $ show v))+class AdmitAttrALIGN e where+  uaALIGN :: String -> ELT e -> ELT e+  uaALIGN str into = add_attr into (mkUAttr ALIGN str)+  atALIGN :: AttrValueALIGN v => v -> ELT e -> ELT e+  atALIGN v into = add_attr into (mkUAttr ALIGN (av $ show v))+class AdmitAttrSCROLLING e where+  uaSCROLLING :: String -> ELT e -> ELT e+  uaSCROLLING str into = add_attr into (mkUAttr SCROLLING str)+  atSCROLLING :: AttrValueSCROLLING v => v -> ELT e -> ELT e+  atSCROLLING v into = add_attr into (mkUAttr SCROLLING (av $ show v))+class AdmitAttrMARGINHEIGHT e where+  uaMARGINHEIGHT :: String -> ELT e -> ELT e+  uaMARGINHEIGHT str into = add_attr into (mkUAttr MARGINHEIGHT str)+  atMARGINHEIGHT :: AttrValueMARGINHEIGHT v => v -> ELT e -> ELT e+  atMARGINHEIGHT v into = add_attr into (mkUAttr MARGINHEIGHT (av $ show v))+class AdmitAttrMARGINWIDTH e where+  uaMARGINWIDTH :: String -> ELT e -> ELT e+  uaMARGINWIDTH str into = add_attr into (mkUAttr MARGINWIDTH str)+  atMARGINWIDTH :: AttrValueMARGINWIDTH v => v -> ELT e -> ELT e+  atMARGINWIDTH v into = add_attr into (mkUAttr MARGINWIDTH (av $ show v))+class AdmitAttrFRAMEBORDER e where+  uaFRAMEBORDER :: String -> ELT e -> ELT e+  uaFRAMEBORDER str into = add_attr into (mkUAttr FRAMEBORDER str)+  atFRAMEBORDER :: AttrValueFRAMEBORDER v => v -> ELT e -> ELT e+  atFRAMEBORDER v into = add_attr into (mkUAttr FRAMEBORDER (av $ show v))+class AdmitAttrLONGDESC e where+  uaLONGDESC :: String -> ELT e -> ELT e+  uaLONGDESC str into = add_attr into (mkUAttr LONGDESC str)+  atLONGDESC :: AttrValueLONGDESC v => v -> ELT e -> ELT e+  atLONGDESC v into = add_attr into (mkUAttr LONGDESC (av $ show v))+class AdmitAttrBGCOLOR e where+  uaBGCOLOR :: String -> ELT e -> ELT e+  uaBGCOLOR str into = add_attr into (mkUAttr BGCOLOR str)+  atBGCOLOR :: AttrValueBGCOLOR v => v -> ELT e -> ELT e+  atBGCOLOR v into = add_attr into (mkUAttr BGCOLOR (av $ show v))+class AdmitAttrNOWRAP e where+  uaNOWRAP :: String -> ELT e -> ELT e+  uaNOWRAP str into = add_attr into (mkUAttr NOWRAP str)+  atNOWRAP :: AttrValueNOWRAP v => v -> ELT e -> ELT e+  atNOWRAP v into = add_attr into (mkUAttr NOWRAP (av $ show v))+class AdmitAttrVALIGN e where+  uaVALIGN :: String -> ELT e -> ELT e+  uaVALIGN str into = add_attr into (mkUAttr VALIGN str)+  atVALIGN :: AttrValueVALIGN v => v -> ELT e -> ELT e+  atVALIGN v into = add_attr into (mkUAttr VALIGN (av $ show v))+class AdmitAttrCHAROFF e where+  uaCHAROFF :: String -> ELT e -> ELT e+  uaCHAROFF str into = add_attr into (mkUAttr CHAROFF str)+  atCHAROFF :: AttrValueCHAROFF v => v -> ELT e -> ELT e+  atCHAROFF v into = add_attr into (mkUAttr CHAROFF (av $ show v))+class AdmitAttrCHAR e where+  uaCHAR :: String -> ELT e -> ELT e+  uaCHAR str into = add_attr into (mkUAttr CHAR str)+  atCHAR :: AttrValueCHAR v => v -> ELT e -> ELT e+  atCHAR v into = add_attr into (mkUAttr CHAR (av $ show v))+class AdmitAttrCOLSPAN e where+  uaCOLSPAN :: String -> ELT e -> ELT e+  uaCOLSPAN str into = add_attr into (mkUAttr COLSPAN str)+  atCOLSPAN :: AttrValueCOLSPAN v => v -> ELT e -> ELT e+  atCOLSPAN v into = add_attr into (mkUAttr COLSPAN (av $ show v))+class AdmitAttrROWSPAN e where+  uaROWSPAN :: String -> ELT e -> ELT e+  uaROWSPAN str into = add_attr into (mkUAttr ROWSPAN str)+  atROWSPAN :: AttrValueROWSPAN v => v -> ELT e -> ELT e+  atROWSPAN v into = add_attr into (mkUAttr ROWSPAN (av $ show v))+class AdmitAttrSCOPE e where+  uaSCOPE :: String -> ELT e -> ELT e+  uaSCOPE str into = add_attr into (mkUAttr SCOPE str)+  atSCOPE :: AttrValueSCOPE v => v -> ELT e -> ELT e+  atSCOPE v into = add_attr into (mkUAttr SCOPE (av $ show v))+class AdmitAttrHEADERS e where+  uaHEADERS :: String -> ELT e -> ELT e+  uaHEADERS str into = add_attr into (mkUAttr HEADERS str)+  atHEADERS :: AttrValueHEADERS v => v -> ELT e -> ELT e+  atHEADERS v into = add_attr into (mkUAttr HEADERS (av $ show v))+class AdmitAttrAXIS e where+  uaAXIS :: String -> ELT e -> ELT e+  uaAXIS str into = add_attr into (mkUAttr AXIS str)+  atAXIS :: AttrValueAXIS v => v -> ELT e -> ELT e+  atAXIS v into = add_attr into (mkUAttr AXIS (av $ show v))+class AdmitAttrABBR e where+  uaABBR :: String -> ELT e -> ELT e+  uaABBR str into = add_attr into (mkUAttr ABBR str)+  atABBR :: AttrValueABBR v => v -> ELT e -> ELT e+  atABBR v into = add_attr into (mkUAttr ABBR (av $ show v))+class AdmitAttrSPAN e where+  uaSPAN :: String -> ELT e -> ELT e+  uaSPAN str into = add_attr into (mkUAttr SPAN str)+  atSPAN :: AttrValueSPAN v => v -> ELT e -> ELT e+  atSPAN v into = add_attr into (mkUAttr SPAN (av $ show v))+class AdmitAttrDATAPAGESIZE e where+  uaDATAPAGESIZE :: String -> ELT e -> ELT e+  uaDATAPAGESIZE str into = add_attr into (mkUAttr DATAPAGESIZE str)+  atDATAPAGESIZE :: AttrValueDATAPAGESIZE v => v -> ELT e -> ELT e+  atDATAPAGESIZE v into = add_attr into (mkUAttr DATAPAGESIZE (av $ show v))+class AdmitAttrCELLPADDING e where+  uaCELLPADDING :: String -> ELT e -> ELT e+  uaCELLPADDING str into = add_attr into (mkUAttr CELLPADDING str)+  atCELLPADDING :: AttrValueCELLPADDING v => v -> ELT e -> ELT e+  atCELLPADDING v into = add_attr into (mkUAttr CELLPADDING (av $ show v))+class AdmitAttrCELLSPACING e where+  uaCELLSPACING :: String -> ELT e -> ELT e+  uaCELLSPACING str into = add_attr into (mkUAttr CELLSPACING str)+  atCELLSPACING :: AttrValueCELLSPACING v => v -> ELT e -> ELT e+  atCELLSPACING v into = add_attr into (mkUAttr CELLSPACING (av $ show v))+class AdmitAttrRULES e where+  uaRULES :: String -> ELT e -> ELT e+  uaRULES str into = add_attr into (mkUAttr RULES str)+  atRULES :: AttrValueRULES v => v -> ELT e -> ELT e+  atRULES v into = add_attr into (mkUAttr RULES (av $ show v))+class AdmitAttrFRAME e where+  uaFRAME :: String -> ELT e -> ELT e+  uaFRAME str into = add_attr into (mkUAttr FRAME str)+  atFRAME :: AttrValueFRAME v => v -> ELT e -> ELT e+  atFRAME v into = add_attr into (mkUAttr FRAME (av $ show v))+class AdmitAttrBORDER e where+  uaBORDER :: String -> ELT e -> ELT e+  uaBORDER str into = add_attr into (mkUAttr BORDER str)+  atBORDER :: AttrValueBORDER v => v -> ELT e -> ELT e+  atBORDER v into = add_attr into (mkUAttr BORDER (av $ show v))+class AdmitAttrSUMMARY e where+  uaSUMMARY :: String -> ELT e -> ELT e+  uaSUMMARY str into = add_attr into (mkUAttr SUMMARY str)+  atSUMMARY :: AttrValueSUMMARY v => v -> ELT e -> ELT e+  atSUMMARY v into = add_attr into (mkUAttr SUMMARY (av $ show v))+class AdmitAttrONBLUR e where+  uaONBLUR :: String -> ELT e -> ELT e+  uaONBLUR str into = add_attr into (mkUAttr ONBLUR str)+  atONBLUR :: AttrValueONBLUR v => v -> ELT e -> ELT e+  atONBLUR v into = add_attr into (mkUAttr ONBLUR (av $ show v))+class AdmitAttrONFOCUS e where+  uaONFOCUS :: String -> ELT e -> ELT e+  uaONFOCUS str into = add_attr into (mkUAttr ONFOCUS str)+  atONFOCUS :: AttrValueONFOCUS v => v -> ELT e -> ELT e+  atONFOCUS v into = add_attr into (mkUAttr ONFOCUS (av $ show v))+class AdmitAttrACCESSKEY e where+  uaACCESSKEY :: String -> ELT e -> ELT e+  uaACCESSKEY str into = add_attr into (mkUAttr ACCESSKEY str)+  atACCESSKEY :: AttrValueACCESSKEY v => v -> ELT e -> ELT e+  atACCESSKEY v into = add_attr into (mkUAttr ACCESSKEY (av $ show v))+class AdmitAttrTABINDEX e where+  uaTABINDEX :: String -> ELT e -> ELT e+  uaTABINDEX str into = add_attr into (mkUAttr TABINDEX str)+  atTABINDEX :: AttrValueTABINDEX v => v -> ELT e -> ELT e+  atTABINDEX v into = add_attr into (mkUAttr TABINDEX (av $ show v))+class AdmitAttrDISABLED e where+  uaDISABLED :: String -> ELT e -> ELT e+  uaDISABLED str into = add_attr into (mkUAttr DISABLED str)+  atDISABLED :: AttrValueDISABLED v => v -> ELT e -> ELT e+  atDISABLED v into = add_attr into (mkUAttr DISABLED (av $ show v))+class AdmitAttrVALUE e where+  uaVALUE :: String -> ELT e -> ELT e+  uaVALUE str into = add_attr into (mkUAttr VALUE str)+  atVALUE :: AttrValueVALUE v => v -> ELT e -> ELT e+  atVALUE v into = add_attr into (mkUAttr VALUE (av $ show v))+class AdmitAttrONCHANGE e where+  uaONCHANGE :: String -> ELT e -> ELT e+  uaONCHANGE str into = add_attr into (mkUAttr ONCHANGE str)+  atONCHANGE :: AttrValueONCHANGE v => v -> ELT e -> ELT e+  atONCHANGE v into = add_attr into (mkUAttr ONCHANGE (av $ show v))+class AdmitAttrONSELECT e where+  uaONSELECT :: String -> ELT e -> ELT e+  uaONSELECT str into = add_attr into (mkUAttr ONSELECT str)+  atONSELECT :: AttrValueONSELECT v => v -> ELT e -> ELT e+  atONSELECT v into = add_attr into (mkUAttr ONSELECT (av $ show v))+class AdmitAttrREADONLY e where+  uaREADONLY :: String -> ELT e -> ELT e+  uaREADONLY str into = add_attr into (mkUAttr READONLY str)+  atREADONLY :: AttrValueREADONLY v => v -> ELT e -> ELT e+  atREADONLY v into = add_attr into (mkUAttr READONLY (av $ show v))+class AdmitAttrCOLS e where+  uaCOLS :: String -> ELT e -> ELT e+  uaCOLS str into = add_attr into (mkUAttr COLS str)+  atCOLS :: AttrValueCOLS v => v -> ELT e -> ELT e+  atCOLS v into = add_attr into (mkUAttr COLS (av $ show v))+class AdmitAttrROWS e where+  uaROWS :: String -> ELT e -> ELT e+  uaROWS str into = add_attr into (mkUAttr ROWS str)+  atROWS :: AttrValueROWS v => v -> ELT e -> ELT e+  atROWS v into = add_attr into (mkUAttr ROWS (av $ show v))+class AdmitAttrLABEL e where+  uaLABEL :: String -> ELT e -> ELT e+  uaLABEL str into = add_attr into (mkUAttr LABEL str)+  atLABEL :: AttrValueLABEL v => v -> ELT e -> ELT e+  atLABEL v into = add_attr into (mkUAttr LABEL (av $ show v))+class AdmitAttrSELECTED e where+  uaSELECTED :: String -> ELT e -> ELT e+  uaSELECTED str into = add_attr into (mkUAttr SELECTED str)+  atSELECTED :: AttrValueSELECTED v => v -> ELT e -> ELT e+  atSELECTED v into = add_attr into (mkUAttr SELECTED (av $ show v))+class AdmitAttrMULTIPLE e where+  uaMULTIPLE :: String -> ELT e -> ELT e+  uaMULTIPLE str into = add_attr into (mkUAttr MULTIPLE str)+  atMULTIPLE :: AttrValueMULTIPLE v => v -> ELT e -> ELT e+  atMULTIPLE v into = add_attr into (mkUAttr MULTIPLE (av $ show v))+class AdmitAttrSIZE e where+  uaSIZE :: String -> ELT e -> ELT e+  uaSIZE str into = add_attr into (mkUAttr SIZE str)+  atSIZE :: AttrValueSIZE v => v -> ELT e -> ELT e+  atSIZE v into = add_attr into (mkUAttr SIZE (av $ show v))+class AdmitAttrACCEPT e where+  uaACCEPT :: String -> ELT e -> ELT e+  uaACCEPT str into = add_attr into (mkUAttr ACCEPT str)+  atACCEPT :: AttrValueACCEPT v => v -> ELT e -> ELT e+  atACCEPT v into = add_attr into (mkUAttr ACCEPT (av $ show v))+class AdmitAttrUSEMAP e where+  uaUSEMAP :: String -> ELT e -> ELT e+  uaUSEMAP str into = add_attr into (mkUAttr USEMAP str)+  atUSEMAP :: AttrValueUSEMAP v => v -> ELT e -> ELT e+  atUSEMAP v into = add_attr into (mkUAttr USEMAP (av $ show v))+class AdmitAttrALT e where+  uaALT :: String -> ELT e -> ELT e+  uaALT str into = add_attr into (mkUAttr ALT str)+  atALT :: AttrValueALT v => v -> ELT e -> ELT e+  atALT v into = add_attr into (mkUAttr ALT (av $ show v))+class AdmitAttrMAXLENGTH e where+  uaMAXLENGTH :: String -> ELT e -> ELT e+  uaMAXLENGTH str into = add_attr into (mkUAttr MAXLENGTH str)+  atMAXLENGTH :: AttrValueMAXLENGTH v => v -> ELT e -> ELT e+  atMAXLENGTH v into = add_attr into (mkUAttr MAXLENGTH (av $ show v))+class AdmitAttrCHECKED e where+  uaCHECKED :: String -> ELT e -> ELT e+  uaCHECKED str into = add_attr into (mkUAttr CHECKED str)+  atCHECKED :: AttrValueCHECKED v => v -> ELT e -> ELT e+  atCHECKED v into = add_attr into (mkUAttr CHECKED (av $ show v))+class AdmitAttrACCEPT_CHARSET e where+  uaACCEPT_CHARSET :: String -> ELT e -> ELT e+  uaACCEPT_CHARSET str into = add_attr into (mkUAttr ACCEPT_CHARSET str)+  atACCEPT_CHARSET :: AttrValueACCEPT_CHARSET v => v -> ELT e -> ELT e+  atACCEPT_CHARSET v into = add_attr into (mkUAttr ACCEPT_CHARSET (av $ show v))+class AdmitAttrONRESET e where+  uaONRESET :: String -> ELT e -> ELT e+  uaONRESET str into = add_attr into (mkUAttr ONRESET str)+  atONRESET :: AttrValueONRESET v => v -> ELT e -> ELT e+  atONRESET v into = add_attr into (mkUAttr ONRESET (av $ show v))+class AdmitAttrONSUBMIT e where+  uaONSUBMIT :: String -> ELT e -> ELT e+  uaONSUBMIT str into = add_attr into (mkUAttr ONSUBMIT str)+  atONSUBMIT :: AttrValueONSUBMIT v => v -> ELT e -> ELT e+  atONSUBMIT v into = add_attr into (mkUAttr ONSUBMIT (av $ show v))+class AdmitAttrENCTYPE e where+  uaENCTYPE :: String -> ELT e -> ELT e+  uaENCTYPE str into = add_attr into (mkUAttr ENCTYPE str)+  atENCTYPE :: AttrValueENCTYPE v => v -> ELT e -> ELT e+  atENCTYPE v into = add_attr into (mkUAttr ENCTYPE (av $ show v))+class AdmitAttrMETHOD e where+  uaMETHOD :: String -> ELT e -> ELT e+  uaMETHOD str into = add_attr into (mkUAttr METHOD str)+  atMETHOD :: AttrValueMETHOD v => v -> ELT e -> ELT e+  atMETHOD v into = add_attr into (mkUAttr METHOD (av $ show v))+class AdmitAttrACTION e where+  uaACTION :: String -> ELT e -> ELT e+  uaACTION str into = add_attr into (mkUAttr ACTION str)+  atACTION :: AttrValueACTION v => v -> ELT e -> ELT e+  atACTION v into = add_attr into (mkUAttr ACTION (av $ show v))+class AdmitAttrCOMPACT e where+  uaCOMPACT :: String -> ELT e -> ELT e+  uaCOMPACT str into = add_attr into (mkUAttr COMPACT str)+  atCOMPACT :: AttrValueCOMPACT v => v -> ELT e -> ELT e+  atCOMPACT v into = add_attr into (mkUAttr COMPACT (av $ show v))+class AdmitAttrSTART e where+  uaSTART :: String -> ELT e -> ELT e+  uaSTART str into = add_attr into (mkUAttr START str)+  atSTART :: AttrValueSTART v => v -> ELT e -> ELT e+  atSTART v into = add_attr into (mkUAttr START (av $ show v))+class AdmitAttrDATETIME e where+  uaDATETIME :: String -> ELT e -> ELT e+  uaDATETIME str into = add_attr into (mkUAttr DATETIME str)+  atDATETIME :: AttrValueDATETIME v => v -> ELT e -> ELT e+  atDATETIME v into = add_attr into (mkUAttr DATETIME (av $ show v))+class AdmitAttrCITE e where+  uaCITE :: String -> ELT e -> ELT e+  uaCITE str into = add_attr into (mkUAttr CITE str)+  atCITE :: AttrValueCITE v => v -> ELT e -> ELT e+  atCITE v into = add_attr into (mkUAttr CITE (av $ show v))+class AdmitAttrNOSHADE e where+  uaNOSHADE :: String -> ELT e -> ELT e+  uaNOSHADE str into = add_attr into (mkUAttr NOSHADE str)+  atNOSHADE :: AttrValueNOSHADE v => v -> ELT e -> ELT e+  atNOSHADE v into = add_attr into (mkUAttr NOSHADE (av $ show v))+class AdmitAttrVSPACE e where+  uaVSPACE :: String -> ELT e -> ELT e+  uaVSPACE str into = add_attr into (mkUAttr VSPACE str)+  atVSPACE :: AttrValueVSPACE v => v -> ELT e -> ELT e+  atVSPACE v into = add_attr into (mkUAttr VSPACE (av $ show v))+class AdmitAttrHSPACE e where+  uaHSPACE :: String -> ELT e -> ELT e+  uaHSPACE str into = add_attr into (mkUAttr HSPACE str)+  atHSPACE :: AttrValueHSPACE v => v -> ELT e -> ELT e+  atHSPACE v into = add_attr into (mkUAttr HSPACE (av $ show v))+class AdmitAttrOBJECT e where+  uaOBJECT :: String -> ELT e -> ELT e+  uaOBJECT str into = add_attr into (mkUAttr OBJECT str)+  atOBJECT :: AttrValueOBJECT v => v -> ELT e -> ELT e+  atOBJECT v into = add_attr into (mkUAttr OBJECT (av $ show v))+class AdmitAttrCODE e where+  uaCODE :: String -> ELT e -> ELT e+  uaCODE str into = add_attr into (mkUAttr CODE str)+  atCODE :: AttrValueCODE v => v -> ELT e -> ELT e+  atCODE v into = add_attr into (mkUAttr CODE (av $ show v))+class AdmitAttrARCHIVE e where+  uaARCHIVE :: String -> ELT e -> ELT e+  uaARCHIVE str into = add_attr into (mkUAttr ARCHIVE str)+  atARCHIVE :: AttrValueARCHIVE v => v -> ELT e -> ELT e+  atARCHIVE v into = add_attr into (mkUAttr ARCHIVE (av $ show v))+class AdmitAttrCODEBASE e where+  uaCODEBASE :: String -> ELT e -> ELT e+  uaCODEBASE str into = add_attr into (mkUAttr CODEBASE str)+  atCODEBASE :: AttrValueCODEBASE v => v -> ELT e -> ELT e+  atCODEBASE v into = add_attr into (mkUAttr CODEBASE (av $ show v))+class AdmitAttrVALUETYPE e where+  uaVALUETYPE :: String -> ELT e -> ELT e+  uaVALUETYPE str into = add_attr into (mkUAttr VALUETYPE str)+  atVALUETYPE :: AttrValueVALUETYPE v => v -> ELT e -> ELT e+  atVALUETYPE v into = add_attr into (mkUAttr VALUETYPE (av $ show v))+class AdmitAttrSTANDBY e where+  uaSTANDBY :: String -> ELT e -> ELT e+  uaSTANDBY str into = add_attr into (mkUAttr STANDBY str)+  atSTANDBY :: AttrValueSTANDBY v => v -> ELT e -> ELT e+  atSTANDBY v into = add_attr into (mkUAttr STANDBY (av $ show v))+class AdmitAttrCODETYPE e where+  uaCODETYPE :: String -> ELT e -> ELT e+  uaCODETYPE str into = add_attr into (mkUAttr CODETYPE str)+  atCODETYPE :: AttrValueCODETYPE v => v -> ELT e -> ELT e+  atCODETYPE v into = add_attr into (mkUAttr CODETYPE (av $ show v))+class AdmitAttrDATA e where+  uaDATA :: String -> ELT e -> ELT e+  uaDATA str into = add_attr into (mkUAttr DATA str)+  atDATA :: AttrValueDATA v => v -> ELT e -> ELT e+  atDATA v into = add_attr into (mkUAttr DATA (av $ show v))+class AdmitAttrCLASSID e where+  uaCLASSID :: String -> ELT e -> ELT e+  uaCLASSID str into = add_attr into (mkUAttr CLASSID str)+  atCLASSID :: AttrValueCLASSID v => v -> ELT e -> ELT e+  atCLASSID v into = add_attr into (mkUAttr CLASSID (av $ show v))+class AdmitAttrDECLARE e where+  uaDECLARE :: String -> ELT e -> ELT e+  uaDECLARE str into = add_attr into (mkUAttr DECLARE str)+  atDECLARE :: AttrValueDECLARE v => v -> ELT e -> ELT e+  atDECLARE v into = add_attr into (mkUAttr DECLARE (av $ show v))+class AdmitAttrISMAP e where+  uaISMAP :: String -> ELT e -> ELT e+  uaISMAP str into = add_attr into (mkUAttr ISMAP str)+  atISMAP :: AttrValueISMAP v => v -> ELT e -> ELT e+  atISMAP v into = add_attr into (mkUAttr ISMAP (av $ show v))+class AdmitAttrREV e where+  uaREV :: String -> ELT e -> ELT e+  uaREV str into = add_attr into (mkUAttr REV str)+  atREV :: AttrValueREV v => v -> ELT e -> ELT e+  atREV v into = add_attr into (mkUAttr REV (av $ show v))+class AdmitAttrREL e where+  uaREL :: String -> ELT e -> ELT e+  uaREL str into = add_attr into (mkUAttr REL str)+  atREL :: AttrValueREL v => v -> ELT e -> ELT e+  atREL v into = add_attr into (mkUAttr REL (av $ show v))+class AdmitAttrHREFLANG e where+  uaHREFLANG :: String -> ELT e -> ELT e+  uaHREFLANG str into = add_attr into (mkUAttr HREFLANG str)+  atHREFLANG :: AttrValueHREFLANG v => v -> ELT e -> ELT e+  atHREFLANG v into = add_attr into (mkUAttr HREFLANG (av $ show v))+class AdmitAttrNOHREF e where+  uaNOHREF :: String -> ELT e -> ELT e+  uaNOHREF str into = add_attr into (mkUAttr NOHREF str)+  atNOHREF :: AttrValueNOHREF v => v -> ELT e -> ELT e+  atNOHREF v into = add_attr into (mkUAttr NOHREF (av $ show v))+class AdmitAttrCOORDS e where+  uaCOORDS :: String -> ELT e -> ELT e+  uaCOORDS str into = add_attr into (mkUAttr COORDS str)+  atCOORDS :: AttrValueCOORDS v => v -> ELT e -> ELT e+  atCOORDS v into = add_attr into (mkUAttr COORDS (av $ show v))+class AdmitAttrSHAPE e where+  uaSHAPE :: String -> ELT e -> ELT e+  uaSHAPE str into = add_attr into (mkUAttr SHAPE str)+  atSHAPE :: AttrValueSHAPE v => v -> ELT e -> ELT e+  atSHAPE v into = add_attr into (mkUAttr SHAPE (av $ show v))+class AdmitAttrALINK e where+  uaALINK :: String -> ELT e -> ELT e+  uaALINK str into = add_attr into (mkUAttr ALINK str)+  atALINK :: AttrValueALINK v => v -> ELT e -> ELT e+  atALINK v into = add_attr into (mkUAttr ALINK (av $ show v))+class AdmitAttrVLINK e where+  uaVLINK :: String -> ELT e -> ELT e+  uaVLINK str into = add_attr into (mkUAttr VLINK str)+  atVLINK :: AttrValueVLINK v => v -> ELT e -> ELT e+  atVLINK v into = add_attr into (mkUAttr VLINK (av $ show v))+class AdmitAttrLINK e where+  uaLINK :: String -> ELT e -> ELT e+  uaLINK str into = add_attr into (mkUAttr LINK str)+  atLINK :: AttrValueLINK v => v -> ELT e -> ELT e+  atLINK v into = add_attr into (mkUAttr LINK (av $ show v))+class AdmitAttrTEXT e where+  uaTEXT :: String -> ELT e -> ELT e+  uaTEXT str into = add_attr into (mkUAttr TEXT str)+  atTEXT :: AttrValueTEXT v => v -> ELT e -> ELT e+  atTEXT v into = add_attr into (mkUAttr TEXT (av $ show v))+class AdmitAttrBACKGROUND e where+  uaBACKGROUND :: String -> ELT e -> ELT e+  uaBACKGROUND str into = add_attr into (mkUAttr BACKGROUND str)+  atBACKGROUND :: AttrValueBACKGROUND v => v -> ELT e -> ELT e+  atBACKGROUND v into = add_attr into (mkUAttr BACKGROUND (av $ show v))+class AdmitAttrONUNLOAD e where+  uaONUNLOAD :: String -> ELT e -> ELT e+  uaONUNLOAD str into = add_attr into (mkUAttr ONUNLOAD str)+  atONUNLOAD :: AttrValueONUNLOAD v => v -> ELT e -> ELT e+  atONUNLOAD v into = add_attr into (mkUAttr ONUNLOAD (av $ show v))+class AdmitAttrONLOAD e where+  uaONLOAD :: String -> ELT e -> ELT e+  uaONLOAD str into = add_attr into (mkUAttr ONLOAD str)+  atONLOAD :: AttrValueONLOAD v => v -> ELT e -> ELT e+  atONLOAD v into = add_attr into (mkUAttr ONLOAD (av $ show v))+class AdmitAttrCLEAR e where+  uaCLEAR :: String -> ELT e -> ELT e+  uaCLEAR str into = add_attr into (mkUAttr CLEAR str)+  atCLEAR :: AttrValueCLEAR v => v -> ELT e -> ELT e+  atCLEAR v into = add_attr into (mkUAttr CLEAR (av $ show v))+class AdmitAttrFACE e where+  uaFACE :: String -> ELT e -> ELT e+  uaFACE str into = add_attr into (mkUAttr FACE str)+  atFACE :: AttrValueFACE v => v -> ELT e -> ELT e+  atFACE v into = add_attr into (mkUAttr FACE (av $ show v))+class AdmitAttrCOLOR e where+  uaCOLOR :: String -> ELT e -> ELT e+  uaCOLOR str into = add_attr into (mkUAttr COLOR str)+  atCOLOR :: AttrValueCOLOR v => v -> ELT e -> ELT e+  atCOLOR v into = add_attr into (mkUAttr COLOR (av $ show v))+class Show v => AttrValueABBR v+class Show v => AttrValueACCEPT v+class Show v => AttrValueACCEPT_CHARSET v+class Show v => AttrValueACCESSKEY v+class Show v => AttrValueACTION v+class Show v => AttrValueALIGN v+class Show v => AttrValueALINK v+class Show v => AttrValueALT v+class Show v => AttrValueARCHIVE v+class Show v => AttrValueAXIS v+class Show v => AttrValueBACKGROUND v+class Show v => AttrValueBGCOLOR v+class Show v => AttrValueBORDER v+class Show v => AttrValueCELLPADDING v+class Show v => AttrValueCELLSPACING v+class Show v => AttrValueCHAR v+class Show v => AttrValueCHAROFF v+class Show v => AttrValueCHARSET v+class Show v => AttrValueCHECKED v+class Show v => AttrValueCITE v+class Show v => AttrValueCLASS v+class Show v => AttrValueCLASSID v+class Show v => AttrValueCLEAR v+class Show v => AttrValueCODE v+class Show v => AttrValueCODEBASE v+class Show v => AttrValueCODETYPE v+class Show v => AttrValueCOLOR v+class Show v => AttrValueCOLS v+class Show v => AttrValueCOLSPAN v+class Show v => AttrValueCOMPACT v+class Show v => AttrValueCONTENT v+class Show v => AttrValueCOORDS v+class Show v => AttrValueDATA v+class Show v => AttrValueDATAPAGESIZE v+class Show v => AttrValueDATETIME v+class Show v => AttrValueDECLARE v+class Show v => AttrValueDEFER v+class Show v => AttrValueDIR v+class Show v => AttrValueDISABLED v+class Show v => AttrValueENCTYPE v+class Show v => AttrValueEVENT v+class Show v => AttrValueFACE v+class Show v => AttrValueFOR v+class Show v => AttrValueFRAME v+class Show v => AttrValueFRAMEBORDER v+class Show v => AttrValueHEADERS v+class Show v => AttrValueHEIGHT v+class Show v => AttrValueHREF v+class Show v => AttrValueHREFLANG v+class Show v => AttrValueHSPACE v+class Show v => AttrValueHTTP_EQUIV v+class Show v => AttrValueID v+class Show v => AttrValueISMAP v+class Show v => AttrValueLABEL v+class Show v => AttrValueLANG v+class Show v => AttrValueLANGUAGE v+class Show v => AttrValueLINK v+class Show v => AttrValueLONGDESC v+class Show v => AttrValueMARGINHEIGHT v+class Show v => AttrValueMARGINWIDTH v+class Show v => AttrValueMAXLENGTH v+class Show v => AttrValueMEDIA v+class Show v => AttrValueMETHOD v+class Show v => AttrValueMULTIPLE v+class Show v => AttrValueNAME v+class Show v => AttrValueNOHREF v+class Show v => AttrValueNOSHADE v+class Show v => AttrValueNOWRAP v+class Show v => AttrValueOBJECT v+class Show v => AttrValueONBLUR v+class Show v => AttrValueONCHANGE v+class Show v => AttrValueONCLICK v+class Show v => AttrValueONDBLCLICK v+class Show v => AttrValueONFOCUS v+class Show v => AttrValueONKEYDOWN v+class Show v => AttrValueONKEYPRESS v+class Show v => AttrValueONKEYUP v+class Show v => AttrValueONLOAD v+class Show v => AttrValueONMOUSEDOWN v+class Show v => AttrValueONMOUSEMOVE v+class Show v => AttrValueONMOUSEOUT v+class Show v => AttrValueONMOUSEOVER v+class Show v => AttrValueONMOUSEUP v+class Show v => AttrValueONRESET v+class Show v => AttrValueONSELECT v+class Show v => AttrValueONSUBMIT v+class Show v => AttrValueONUNLOAD v+class Show v => AttrValuePROFILE v+class Show v => AttrValuePROMPT v+class Show v => AttrValueREADONLY v+class Show v => AttrValueREL v+class Show v => AttrValueREV v+class Show v => AttrValueROWS v+class Show v => AttrValueROWSPAN v+class Show v => AttrValueRULES v+class Show v => AttrValueSCHEME v+class Show v => AttrValueSCOPE v+class Show v => AttrValueSCROLLING v+class Show v => AttrValueSELECTED v+class Show v => AttrValueSHAPE v+class Show v => AttrValueSIZE v+class Show v => AttrValueSPAN v+class Show v => AttrValueSRC v+class Show v => AttrValueSTANDBY v+class Show v => AttrValueSTART v+class Show v => AttrValueSTYLE v+class Show v => AttrValueSUMMARY v+class Show v => AttrValueTABINDEX v+class Show v => AttrValueTARGET v+class Show v => AttrValueTEXT v+class Show v => AttrValueTITLE v+class Show v => AttrValueTYPE v+class Show v => AttrValueUSEMAP v+class Show v => AttrValueVALIGN v+class Show v => AttrValueVALUE v+class Show v => AttrValueVALUETYPE v+class Show v => AttrValueVERSION v+class Show v => AttrValueVLINK v+class Show v => AttrValueVSPACE v+class Show v => AttrValueWIDTH v+class AdmitChildA e where+  a :: (ELT A -> ELT A) -> ELT e -> ELT e+  a f elt = elt `add` f (make A)+class AdmitChildABBR e where+  abbr :: (ELT ABBR -> ELT ABBR) -> ELT e -> ELT e+  abbr f elt = elt `add` f (make ABBR)+class AdmitChildACRONYM e where+  acronym :: (ELT ACRONYM -> ELT ACRONYM) -> ELT e -> ELT e+  acronym f elt = elt `add` f (make ACRONYM)+class AdmitChildADDRESS e where+  address :: (ELT ADDRESS -> ELT ADDRESS) -> ELT e -> ELT e+  address f elt = elt `add` f (make ADDRESS)+class AdmitChildAPPLET e where+  applet :: (ELT APPLET -> ELT APPLET) -> ELT e -> ELT e+  applet f elt = elt `add` f (make APPLET)+class AdmitChildAREA e where+  area :: (ELT AREA -> ELT AREA) -> ELT e -> ELT e+  area f elt = elt `add` f (make AREA)+class AdmitChildB e where+  b :: (ELT B -> ELT B) -> ELT e -> ELT e+  b f elt = elt `add` f (make B)+class AdmitChildBASE e where+  base :: (ELT BASE -> ELT BASE) -> ELT e -> ELT e+  base f elt = elt `add` f (make BASE)+class AdmitChildBASEFONT e where+  basefont :: (ELT BASEFONT -> ELT BASEFONT) -> ELT e -> ELT e+  basefont f elt = elt `add` f (make BASEFONT)+class AdmitChildBDO e where+  bdo :: (ELT BDO -> ELT BDO) -> ELT e -> ELT e+  bdo f elt = elt `add` f (make BDO)+class AdmitChildBIG e where+  big :: (ELT BIG -> ELT BIG) -> ELT e -> ELT e+  big f elt = elt `add` f (make BIG)+class AdmitChildBLOCKQUOTE e where+  blockquote :: (ELT BLOCKQUOTE -> ELT BLOCKQUOTE) -> ELT e -> ELT e+  blockquote f elt = elt `add` f (make BLOCKQUOTE)+class AdmitChildBODY e where+  body :: (ELT BODY -> ELT BODY) -> ELT e -> ELT e+  body f elt = elt `add` f (make BODY)+class AdmitChildBR e where+  br :: (ELT BR -> ELT BR) -> ELT e -> ELT e+  br f elt = elt `add` f (make BR)+class AdmitChildBUTTON e where+  button :: (ELT BUTTON -> ELT BUTTON) -> ELT e -> ELT e+  button f elt = elt `add` f (make BUTTON)+class AdmitChildCAPTION e where+  caption :: (ELT CAPTION -> ELT CAPTION) -> ELT e -> ELT e+  caption f elt = elt `add` f (make CAPTION)+class AdmitChildCENTER e where+  center :: (ELT CENTER -> ELT CENTER) -> ELT e -> ELT e+  center f elt = elt `add` f (make CENTER)+class AdmitChildCITE e where+  cite :: (ELT CITE -> ELT CITE) -> ELT e -> ELT e+  cite f elt = elt `add` f (make CITE)+class AdmitChildCODE e where+  code :: (ELT CODE -> ELT CODE) -> ELT e -> ELT e+  code f elt = elt `add` f (make CODE)+class AdmitChildCOL e where+  col :: (ELT COL -> ELT COL) -> ELT e -> ELT e+  col f elt = elt `add` f (make COL)+class AdmitChildCOLGROUP e where+  colgroup :: (ELT COLGROUP -> ELT COLGROUP) -> ELT e -> ELT e+  colgroup f elt = elt `add` f (make COLGROUP)+class AdmitChildDD e where+  dd :: (ELT DD -> ELT DD) -> ELT e -> ELT e+  dd f elt = elt `add` f (make DD)+class AdmitChildDEL e where+  del :: (ELT DEL -> ELT DEL) -> ELT e -> ELT e+  del f elt = elt `add` f (make DEL)+class AdmitChildDFN e where+  dfn :: (ELT DFN -> ELT DFN) -> ELT e -> ELT e+  dfn f elt = elt `add` f (make DFN)+class AdmitChildDIR e where+  dir :: (ELT DIR -> ELT DIR) -> ELT e -> ELT e+  dir f elt = elt `add` f (make DIR)+class AdmitChildDIV e where+  div :: (ELT DIV -> ELT DIV) -> ELT e -> ELT e+  div f elt = elt `add` f (make DIV)+class AdmitChildDL e where+  dl :: (ELT DL -> ELT DL) -> ELT e -> ELT e+  dl f elt = elt `add` f (make DL)+class AdmitChildDT e where+  dt :: (ELT DT -> ELT DT) -> ELT e -> ELT e+  dt f elt = elt `add` f (make DT)+class AdmitChildEM e where+  em :: (ELT EM -> ELT EM) -> ELT e -> ELT e+  em f elt = elt `add` f (make EM)+class AdmitChildFIELDSET e where+  fieldset :: (ELT FIELDSET -> ELT FIELDSET) -> ELT e -> ELT e+  fieldset f elt = elt `add` f (make FIELDSET)+class AdmitChildFONT e where+  font :: (ELT FONT -> ELT FONT) -> ELT e -> ELT e+  font f elt = elt `add` f (make FONT)+class AdmitChildFORM e where+  form :: (ELT FORM -> ELT FORM) -> ELT e -> ELT e+  form f elt = elt `add` f (make FORM)+class AdmitChildH1 e where+  h1 :: (ELT H1 -> ELT H1) -> ELT e -> ELT e+  h1 f elt = elt `add` f (make H1)+class AdmitChildH2 e where+  h2 :: (ELT H2 -> ELT H2) -> ELT e -> ELT e+  h2 f elt = elt `add` f (make H2)+class AdmitChildH3 e where+  h3 :: (ELT H3 -> ELT H3) -> ELT e -> ELT e+  h3 f elt = elt `add` f (make H3)+class AdmitChildH4 e where+  h4 :: (ELT H4 -> ELT H4) -> ELT e -> ELT e+  h4 f elt = elt `add` f (make H4)+class AdmitChildH5 e where+  h5 :: (ELT H5 -> ELT H5) -> ELT e -> ELT e+  h5 f elt = elt `add` f (make H5)+class AdmitChildH6 e where+  h6 :: (ELT H6 -> ELT H6) -> ELT e -> ELT e+  h6 f elt = elt `add` f (make H6)+class AdmitChildHEAD e where+  head :: (ELT HEAD -> ELT HEAD) -> ELT e -> ELT e+  head f elt = elt `add` f (make HEAD)+class AdmitChildHR e where+  hr :: (ELT HR -> ELT HR) -> ELT e -> ELT e+  hr f elt = elt `add` f (make HR)+class AdmitChildHTML e where+  html :: (ELT HTML -> ELT HTML) -> ELT e -> ELT e+  html f elt = elt `add` f (make HTML)+class AdmitChildI e where+  i :: (ELT I -> ELT I) -> ELT e -> ELT e+  i f elt = elt `add` f (make I)+class AdmitChildIFRAME e where+  iframe :: (ELT IFRAME -> ELT IFRAME) -> ELT e -> ELT e+  iframe f elt = elt `add` f (make IFRAME)+class AdmitChildIMG e where+  img :: (ELT IMG -> ELT IMG) -> ELT e -> ELT e+  img f elt = elt `add` f (make IMG)+class AdmitChildINPUT e where+  input :: (ELT INPUT -> ELT INPUT) -> ELT e -> ELT e+  input f elt = elt `add` f (make INPUT)+class AdmitChildINS e where+  ins :: (ELT INS -> ELT INS) -> ELT e -> ELT e+  ins f elt = elt `add` f (make INS)+class AdmitChildISINDEX e where+  isindex :: (ELT ISINDEX -> ELT ISINDEX) -> ELT e -> ELT e+  isindex f elt = elt `add` f (make ISINDEX)+class AdmitChildKBD e where+  kbd :: (ELT KBD -> ELT KBD) -> ELT e -> ELT e+  kbd f elt = elt `add` f (make KBD)+class AdmitChildLABEL e where+  label :: (ELT LABEL -> ELT LABEL) -> ELT e -> ELT e+  label f elt = elt `add` f (make LABEL)+class AdmitChildLEGEND e where+  legend :: (ELT LEGEND -> ELT LEGEND) -> ELT e -> ELT e+  legend f elt = elt `add` f (make LEGEND)+class AdmitChildLI e where+  li :: (ELT LI -> ELT LI) -> ELT e -> ELT e+  li f elt = elt `add` f (make LI)+class AdmitChildLINK e where+  link :: (ELT LINK -> ELT LINK) -> ELT e -> ELT e+  link f elt = elt `add` f (make LINK)+class AdmitChildMAP e where+  map :: (ELT MAP -> ELT MAP) -> ELT e -> ELT e+  map f elt = elt `add` f (make MAP)+class AdmitChildMENU e where+  menu :: (ELT MENU -> ELT MENU) -> ELT e -> ELT e+  menu f elt = elt `add` f (make MENU)+class AdmitChildMETA e where+  meta :: (ELT META -> ELT META) -> ELT e -> ELT e+  meta f elt = elt `add` f (make META)+class AdmitChildNOFRAMES e where+  noframes :: (ELT NOFRAMES -> ELT NOFRAMES) -> ELT e -> ELT e+  noframes f elt = elt `add` f (make NOFRAMES)+class AdmitChildNOSCRIPT e where+  noscript :: (ELT NOSCRIPT -> ELT NOSCRIPT) -> ELT e -> ELT e+  noscript f elt = elt `add` f (make NOSCRIPT)+class AdmitChildOBJECT e where+  object :: (ELT OBJECT -> ELT OBJECT) -> ELT e -> ELT e+  object f elt = elt `add` f (make OBJECT)+class AdmitChildOL e where+  ol :: (ELT OL -> ELT OL) -> ELT e -> ELT e+  ol f elt = elt `add` f (make OL)+class AdmitChildOPTGROUP e where+  optgroup :: (ELT OPTGROUP -> ELT OPTGROUP) -> ELT e -> ELT e+  optgroup f elt = elt `add` f (make OPTGROUP)+class AdmitChildOPTION e where+  option :: (ELT OPTION -> ELT OPTION) -> ELT e -> ELT e+  option f elt = elt `add` f (make OPTION)+class AdmitChildP e where+  p :: (ELT P -> ELT P) -> ELT e -> ELT e+  p f elt = elt `add` f (make P)+class AdmitChildPARAM e where+  param :: (ELT PARAM -> ELT PARAM) -> ELT e -> ELT e+  param f elt = elt `add` f (make PARAM)+class AdmitChildPRE e where+  pre :: (ELT PRE -> ELT PRE) -> ELT e -> ELT e+  pre f elt = elt `add` f (make PRE)+class AdmitChildQ e where+  q :: (ELT Q -> ELT Q) -> ELT e -> ELT e+  q f elt = elt `add` f (make Q)+class AdmitChildS e where+  s :: (ELT S -> ELT S) -> ELT e -> ELT e+  s f elt = elt `add` f (make S)+class AdmitChildSAMP e where+  samp :: (ELT SAMP -> ELT SAMP) -> ELT e -> ELT e+  samp f elt = elt `add` f (make SAMP)+class AdmitChildSCRIPT e where+  script :: (ELT SCRIPT -> ELT SCRIPT) -> ELT e -> ELT e+  script f elt = elt `add` f (make SCRIPT)+class AdmitChildSELECT e where+  select :: (ELT SELECT -> ELT SELECT) -> ELT e -> ELT e+  select f elt = elt `add` f (make SELECT)+class AdmitChildSMALL e where+  small :: (ELT SMALL -> ELT SMALL) -> ELT e -> ELT e+  small f elt = elt `add` f (make SMALL)+class AdmitChildSPAN e where+  span :: (ELT SPAN -> ELT SPAN) -> ELT e -> ELT e+  span f elt = elt `add` f (make SPAN)+class AdmitChildSTRIKE e where+  strike :: (ELT STRIKE -> ELT STRIKE) -> ELT e -> ELT e+  strike f elt = elt `add` f (make STRIKE)+class AdmitChildSTRONG e where+  strong :: (ELT STRONG -> ELT STRONG) -> ELT e -> ELT e+  strong f elt = elt `add` f (make STRONG)+class AdmitChildSTYLE e where+  style :: (ELT STYLE -> ELT STYLE) -> ELT e -> ELT e+  style f elt = elt `add` f (make STYLE)+class AdmitChildSUB e where+  sub :: (ELT SUB -> ELT SUB) -> ELT e -> ELT e+  sub f elt = elt `add` f (make SUB)+class AdmitChildSUP e where+  sup :: (ELT SUP -> ELT SUP) -> ELT e -> ELT e+  sup f elt = elt `add` f (make SUP)+class AdmitChildTABLE e where+  table :: (ELT TABLE -> ELT TABLE) -> ELT e -> ELT e+  table f elt = elt `add` f (make TABLE)+class AdmitChildTBODY e where+  tbody :: (ELT TBODY -> ELT TBODY) -> ELT e -> ELT e+  tbody f elt = elt `add` f (make TBODY)+class AdmitChildTD e where+  td :: (ELT TD -> ELT TD) -> ELT e -> ELT e+  td f elt = elt `add` f (make TD)+class AdmitChildTEXTAREA e where+  textarea :: (ELT TEXTAREA -> ELT TEXTAREA) -> ELT e -> ELT e+  textarea f elt = elt `add` f (make TEXTAREA)+class AdmitChildTFOOT e where+  tfoot :: (ELT TFOOT -> ELT TFOOT) -> ELT e -> ELT e+  tfoot f elt = elt `add` f (make TFOOT)+class AdmitChildTH e where+  th :: (ELT TH -> ELT TH) -> ELT e -> ELT e+  th f elt = elt `add` f (make TH)+class AdmitChildTHEAD e where+  thead :: (ELT THEAD -> ELT THEAD) -> ELT e -> ELT e+  thead f elt = elt `add` f (make THEAD)+class AdmitChildTITLE e where+  title :: (ELT TITLE -> ELT TITLE) -> ELT e -> ELT e+  title f elt = elt `add` f (make TITLE)+class AdmitChildTR e where+  tr :: (ELT TR -> ELT TR) -> ELT e -> ELT e+  tr f elt = elt `add` f (make TR)+class AdmitChildTT e where+  tt :: (ELT TT -> ELT TT) -> ELT e -> ELT e+  tt f elt = elt `add` f (make TT)+class AdmitChildU e where+  u :: (ELT U -> ELT U) -> ELT e -> ELT e+  u f elt = elt `add` f (make U)+class AdmitChildUL e where+  ul :: (ELT UL -> ELT UL) -> ELT e -> ELT e+  ul f elt = elt `add` f (make UL)+class AdmitChildVAR e where+  var :: (ELT VAR -> ELT VAR) -> ELT e -> ELT e+  var f elt = elt `add` f (make VAR)+data A = A+instance Show A where show A = "A"+data ABBR = ABBR+instance Show ABBR where show ABBR = "ABBR"+data ACRONYM = ACRONYM+instance Show ACRONYM where show ACRONYM = "ACRONYM"+data ADDRESS = ADDRESS+instance Show ADDRESS where show ADDRESS = "ADDRESS"+data APPLET = APPLET+instance Show APPLET where show APPLET = "APPLET"+data AREA = AREA+instance Show AREA where show AREA = "AREA"+data B = B+instance Show B where show B = "B"+data BASE = BASE+instance Show BASE where show BASE = "BASE"+data BASEFONT = BASEFONT+instance Show BASEFONT where show BASEFONT = "BASEFONT"+data BDO = BDO+instance Show BDO where show BDO = "BDO"+data BIG = BIG+instance Show BIG where show BIG = "BIG"+data BLOCKQUOTE = BLOCKQUOTE+instance Show BLOCKQUOTE where show BLOCKQUOTE = "BLOCKQUOTE"+data BODY = BODY+instance Show BODY where show BODY = "BODY"+data BR = BR+instance Show BR where show BR = "BR"+data BUTTON = BUTTON+instance Show BUTTON where show BUTTON = "BUTTON"+data CAPTION = CAPTION+instance Show CAPTION where show CAPTION = "CAPTION"+data CENTER = CENTER+instance Show CENTER where show CENTER = "CENTER"+data CITE = CITE+instance Show CITE where show CITE = "CITE"+data CODE = CODE+instance Show CODE where show CODE = "CODE"+data COL = COL+instance Show COL where show COL = "COL"+data COLGROUP = COLGROUP+instance Show COLGROUP where show COLGROUP = "COLGROUP"+data DD = DD+instance Show DD where show DD = "DD"+data DEL = DEL+instance Show DEL where show DEL = "DEL"+data DFN = DFN+instance Show DFN where show DFN = "DFN"+data DIR = DIR+instance Show DIR where show DIR = "DIR"+data DIV = DIV+instance Show DIV where show DIV = "DIV"+data DL = DL+instance Show DL where show DL = "DL"+data DT = DT+instance Show DT where show DT = "DT"+data EM = EM+instance Show EM where show EM = "EM"+data FIELDSET = FIELDSET+instance Show FIELDSET where show FIELDSET = "FIELDSET"+data FONT = FONT+instance Show FONT where show FONT = "FONT"+data FORM = FORM+instance Show FORM where show FORM = "FORM"+data H1 = H1+instance Show H1 where show H1 = "H1"+data H2 = H2+instance Show H2 where show H2 = "H2"+data H3 = H3+instance Show H3 where show H3 = "H3"+data H4 = H4+instance Show H4 where show H4 = "H4"+data H5 = H5+instance Show H5 where show H5 = "H5"+data H6 = H6+instance Show H6 where show H6 = "H6"+data HEAD = HEAD+instance Show HEAD where show HEAD = "HEAD"+data HR = HR+instance Show HR where show HR = "HR"+data HTML = HTML+instance Show HTML where show HTML = "HTML"+data I = I+instance Show I where show I = "I"+data IFRAME = IFRAME+instance Show IFRAME where show IFRAME = "IFRAME"+data IMG = IMG+instance Show IMG where show IMG = "IMG"+data INPUT = INPUT+instance Show INPUT where show INPUT = "INPUT"+data INS = INS+instance Show INS where show INS = "INS"+data ISINDEX = ISINDEX+instance Show ISINDEX where show ISINDEX = "ISINDEX"+data KBD = KBD+instance Show KBD where show KBD = "KBD"+data LABEL = LABEL+instance Show LABEL where show LABEL = "LABEL"+data LEGEND = LEGEND+instance Show LEGEND where show LEGEND = "LEGEND"+data LI = LI+instance Show LI where show LI = "LI"+data LINK = LINK+instance Show LINK where show LINK = "LINK"+data MAP = MAP+instance Show MAP where show MAP = "MAP"+data MENU = MENU+instance Show MENU where show MENU = "MENU"+data META = META+instance Show META where show META = "META"+data NOFRAMES = NOFRAMES+instance Show NOFRAMES where show NOFRAMES = "NOFRAMES"+data NOSCRIPT = NOSCRIPT+instance Show NOSCRIPT where show NOSCRIPT = "NOSCRIPT"+data OBJECT = OBJECT+instance Show OBJECT where show OBJECT = "OBJECT"+data OL = OL+instance Show OL where show OL = "OL"+data OPTGROUP = OPTGROUP+instance Show OPTGROUP where show OPTGROUP = "OPTGROUP"+data OPTION = OPTION+instance Show OPTION where show OPTION = "OPTION"+data P = P+instance Show P where show P = "P"+data PARAM = PARAM+instance Show PARAM where show PARAM = "PARAM"+data PRE = PRE+instance Show PRE where show PRE = "PRE"+data Q = Q+instance Show Q where show Q = "Q"+data S = S+instance Show S where show S = "S"+data SAMP = SAMP+instance Show SAMP where show SAMP = "SAMP"+data SCRIPT = SCRIPT+instance Show SCRIPT where show SCRIPT = "SCRIPT"+data SELECT = SELECT+instance Show SELECT where show SELECT = "SELECT"+data SMALL = SMALL+instance Show SMALL where show SMALL = "SMALL"+data SPAN = SPAN+instance Show SPAN where show SPAN = "SPAN"+data STRIKE = STRIKE+instance Show STRIKE where show STRIKE = "STRIKE"+data STRONG = STRONG+instance Show STRONG where show STRONG = "STRONG"+data STYLE = STYLE+instance Show STYLE where show STYLE = "STYLE"+data SUB = SUB+instance Show SUB where show SUB = "SUB"+data SUP = SUP+instance Show SUP where show SUP = "SUP"+data TABLE = TABLE+instance Show TABLE where show TABLE = "TABLE"+data TBODY = TBODY+instance Show TBODY where show TBODY = "TBODY"+data TD = TD+instance Show TD where show TD = "TD"+data TEXTAREA = TEXTAREA+instance Show TEXTAREA where show TEXTAREA = "TEXTAREA"+data TFOOT = TFOOT+instance Show TFOOT where show TFOOT = "TFOOT"+data TH = TH+instance Show TH where show TH = "TH"+data THEAD = THEAD+instance Show THEAD where show THEAD = "THEAD"+data TITLE = TITLE+instance Show TITLE where show TITLE = "TITLE"+data TR = TR+instance Show TR where show TR = "TR"+data TT = TT+instance Show TT where show TT = "TT"+data U = U+instance Show U where show U = "U"+data UL = UL+instance Show UL where show UL = "UL"+data VAR = VAR+instance Show VAR where show VAR = "VAR"+data VERSION = VERSION+instance Show VERSION where show VERSION = "VERSION"+data LANG = LANG+instance Show LANG where show LANG = "LANG"+data ONKEYUP = ONKEYUP+instance Show ONKEYUP where show ONKEYUP = "ONKEYUP"+data ONKEYDOWN = ONKEYDOWN+instance Show ONKEYDOWN where show ONKEYDOWN = "ONKEYDOWN"+data ONKEYPRESS = ONKEYPRESS+instance Show ONKEYPRESS where show ONKEYPRESS = "ONKEYPRESS"+data ONMOUSEOUT = ONMOUSEOUT+instance Show ONMOUSEOUT where show ONMOUSEOUT = "ONMOUSEOUT"+data ONMOUSEMOVE = ONMOUSEMOVE+instance Show ONMOUSEMOVE where show ONMOUSEMOVE = "ONMOUSEMOVE"+data ONMOUSEOVER = ONMOUSEOVER+instance Show ONMOUSEOVER where show ONMOUSEOVER = "ONMOUSEOVER"+data ONMOUSEUP = ONMOUSEUP+instance Show ONMOUSEUP where show ONMOUSEUP = "ONMOUSEUP"+data ONMOUSEDOWN = ONMOUSEDOWN+instance Show ONMOUSEDOWN where show ONMOUSEDOWN = "ONMOUSEDOWN"+data ONDBLCLICK = ONDBLCLICK+instance Show ONDBLCLICK where show ONDBLCLICK = "ONDBLCLICK"+data ONCLICK = ONCLICK+instance Show ONCLICK where show ONCLICK = "ONCLICK"+data CLASS = CLASS+instance Show CLASS where show CLASS = "CLASS"+data ID = ID+instance Show ID where show ID = "ID"+data FOR = FOR+instance Show FOR where show FOR = "FOR"+data EVENT = EVENT+instance Show EVENT where show EVENT = "EVENT"+data DEFER = DEFER+instance Show DEFER where show DEFER = "DEFER"+data SRC = SRC+instance Show SRC where show SRC = "SRC"+data LANGUAGE = LANGUAGE+instance Show LANGUAGE where show LANGUAGE = "LANGUAGE"+data TYPE = TYPE+instance Show TYPE where show TYPE = "TYPE"+data CHARSET = CHARSET+instance Show CHARSET where show CHARSET = "CHARSET"+data MEDIA = MEDIA+instance Show MEDIA where show MEDIA = "MEDIA"+data SCHEME = SCHEME+instance Show SCHEME where show SCHEME = "SCHEME"+data CONTENT = CONTENT+instance Show CONTENT where show CONTENT = "CONTENT"+data NAME = NAME+instance Show NAME where show NAME = "NAME"+data HTTP_EQUIV = HTTP_EQUIV+instance Show HTTP_EQUIV where show HTTP_EQUIV = "HTTP_EQUIV"+data TARGET = TARGET+instance Show TARGET where show TARGET = "TARGET"+data HREF = HREF+instance Show HREF where show HREF = "HREF"+data PROMPT = PROMPT+instance Show PROMPT where show PROMPT = "PROMPT"+data PROFILE = PROFILE+instance Show PROFILE where show PROFILE = "PROFILE"+data WIDTH = WIDTH+instance Show WIDTH where show WIDTH = "WIDTH"+data HEIGHT = HEIGHT+instance Show HEIGHT where show HEIGHT = "HEIGHT"+data ALIGN = ALIGN+instance Show ALIGN where show ALIGN = "ALIGN"+data SCROLLING = SCROLLING+instance Show SCROLLING where show SCROLLING = "SCROLLING"+data MARGINHEIGHT = MARGINHEIGHT+instance Show MARGINHEIGHT where show MARGINHEIGHT = "MARGINHEIGHT"+data MARGINWIDTH = MARGINWIDTH+instance Show MARGINWIDTH where show MARGINWIDTH = "MARGINWIDTH"+data FRAMEBORDER = FRAMEBORDER+instance Show FRAMEBORDER where show FRAMEBORDER = "FRAMEBORDER"+data LONGDESC = LONGDESC+instance Show LONGDESC where show LONGDESC = "LONGDESC"+data BGCOLOR = BGCOLOR+instance Show BGCOLOR where show BGCOLOR = "BGCOLOR"+data NOWRAP = NOWRAP+instance Show NOWRAP where show NOWRAP = "NOWRAP"+data VALIGN = VALIGN+instance Show VALIGN where show VALIGN = "VALIGN"+data CHAROFF = CHAROFF+instance Show CHAROFF where show CHAROFF = "CHAROFF"+data CHAR = CHAR+instance Show CHAR where show CHAR = "CHAR"+data COLSPAN = COLSPAN+instance Show COLSPAN where show COLSPAN = "COLSPAN"+data ROWSPAN = ROWSPAN+instance Show ROWSPAN where show ROWSPAN = "ROWSPAN"+data SCOPE = SCOPE+instance Show SCOPE where show SCOPE = "SCOPE"+data HEADERS = HEADERS+instance Show HEADERS where show HEADERS = "HEADERS"+data AXIS = AXIS+instance Show AXIS where show AXIS = "AXIS"+data DATAPAGESIZE = DATAPAGESIZE+instance Show DATAPAGESIZE where show DATAPAGESIZE = "DATAPAGESIZE"+data CELLPADDING = CELLPADDING+instance Show CELLPADDING where show CELLPADDING = "CELLPADDING"+data CELLSPACING = CELLSPACING+instance Show CELLSPACING where show CELLSPACING = "CELLSPACING"+data RULES = RULES+instance Show RULES where show RULES = "RULES"+data FRAME = FRAME+instance Show FRAME where show FRAME = "FRAME"+data BORDER = BORDER+instance Show BORDER where show BORDER = "BORDER"+data SUMMARY = SUMMARY+instance Show SUMMARY where show SUMMARY = "SUMMARY"+data ONBLUR = ONBLUR+instance Show ONBLUR where show ONBLUR = "ONBLUR"+data ONFOCUS = ONFOCUS+instance Show ONFOCUS where show ONFOCUS = "ONFOCUS"+data ACCESSKEY = ACCESSKEY+instance Show ACCESSKEY where show ACCESSKEY = "ACCESSKEY"+data TABINDEX = TABINDEX+instance Show TABINDEX where show TABINDEX = "TABINDEX"+data DISABLED = DISABLED+instance Show DISABLED where show DISABLED = "DISABLED"+data VALUE = VALUE+instance Show VALUE where show VALUE = "VALUE"+data ONCHANGE = ONCHANGE+instance Show ONCHANGE where show ONCHANGE = "ONCHANGE"+data ONSELECT = ONSELECT+instance Show ONSELECT where show ONSELECT = "ONSELECT"+data READONLY = READONLY+instance Show READONLY where show READONLY = "READONLY"+data COLS = COLS+instance Show COLS where show COLS = "COLS"+data ROWS = ROWS+instance Show ROWS where show ROWS = "ROWS"+data SELECTED = SELECTED+instance Show SELECTED where show SELECTED = "SELECTED"+data MULTIPLE = MULTIPLE+instance Show MULTIPLE where show MULTIPLE = "MULTIPLE"+data SIZE = SIZE+instance Show SIZE where show SIZE = "SIZE"+data ACCEPT = ACCEPT+instance Show ACCEPT where show ACCEPT = "ACCEPT"+data USEMAP = USEMAP+instance Show USEMAP where show USEMAP = "USEMAP"+data ALT = ALT+instance Show ALT where show ALT = "ALT"+data MAXLENGTH = MAXLENGTH+instance Show MAXLENGTH where show MAXLENGTH = "MAXLENGTH"+data CHECKED = CHECKED+instance Show CHECKED where show CHECKED = "CHECKED"+data ACCEPT_CHARSET = ACCEPT_CHARSET+instance Show ACCEPT_CHARSET where show ACCEPT_CHARSET = "ACCEPT_CHARSET"+data ONRESET = ONRESET+instance Show ONRESET where show ONRESET = "ONRESET"+data ONSUBMIT = ONSUBMIT+instance Show ONSUBMIT where show ONSUBMIT = "ONSUBMIT"+data ENCTYPE = ENCTYPE+instance Show ENCTYPE where show ENCTYPE = "ENCTYPE"+data METHOD = METHOD+instance Show METHOD where show METHOD = "METHOD"+data ACTION = ACTION+instance Show ACTION where show ACTION = "ACTION"+data COMPACT = COMPACT+instance Show COMPACT where show COMPACT = "COMPACT"+data START = START+instance Show START where show START = "START"+data DATETIME = DATETIME+instance Show DATETIME where show DATETIME = "DATETIME"+data NOSHADE = NOSHADE+instance Show NOSHADE where show NOSHADE = "NOSHADE"+data VSPACE = VSPACE+instance Show VSPACE where show VSPACE = "VSPACE"+data HSPACE = HSPACE+instance Show HSPACE where show HSPACE = "HSPACE"+data ARCHIVE = ARCHIVE+instance Show ARCHIVE where show ARCHIVE = "ARCHIVE"+data CODEBASE = CODEBASE+instance Show CODEBASE where show CODEBASE = "CODEBASE"+data VALUETYPE = VALUETYPE+instance Show VALUETYPE where show VALUETYPE = "VALUETYPE"+data STANDBY = STANDBY+instance Show STANDBY where show STANDBY = "STANDBY"+data CODETYPE = CODETYPE+instance Show CODETYPE where show CODETYPE = "CODETYPE"+data DATA = DATA+instance Show DATA where show DATA = "DATA"+data CLASSID = CLASSID+instance Show CLASSID where show CLASSID = "CLASSID"+data DECLARE = DECLARE+instance Show DECLARE where show DECLARE = "DECLARE"+data ISMAP = ISMAP+instance Show ISMAP where show ISMAP = "ISMAP"+data REV = REV+instance Show REV where show REV = "REV"+data REL = REL+instance Show REL where show REL = "REL"+data HREFLANG = HREFLANG+instance Show HREFLANG where show HREFLANG = "HREFLANG"+data NOHREF = NOHREF+instance Show NOHREF where show NOHREF = "NOHREF"+data COORDS = COORDS+instance Show COORDS where show COORDS = "COORDS"+data SHAPE = SHAPE+instance Show SHAPE where show SHAPE = "SHAPE"+data ALINK = ALINK+instance Show ALINK where show ALINK = "ALINK"+data VLINK = VLINK+instance Show VLINK where show VLINK = "VLINK"+data TEXT = TEXT+instance Show TEXT where show TEXT = "TEXT"+data BACKGROUND = BACKGROUND+instance Show BACKGROUND where show BACKGROUND = "BACKGROUND"+data ONUNLOAD = ONUNLOAD+instance Show ONUNLOAD where show ONUNLOAD = "ONUNLOAD"+data ONLOAD = ONLOAD+instance Show ONLOAD where show ONLOAD = "ONLOAD"+data CLEAR = CLEAR+instance Show CLEAR where show CLEAR = "CLEAR"+data FACE = FACE+instance Show FACE where show FACE = "FACE"+data COLOR = COLOR+instance Show COLOR where show COLOR = "COLOR"+instance TAG HTML+instance AdmitChildHEAD HTML+instance AdmitChildBODY HTML+instance TAG NOSCRIPT+instance AdmitChildP NOSCRIPT+instance AdmitChildH1 NOSCRIPT+instance AdmitChildH2 NOSCRIPT+instance AdmitChildH3 NOSCRIPT+instance AdmitChildH4 NOSCRIPT+instance AdmitChildH5 NOSCRIPT+instance AdmitChildH6 NOSCRIPT+instance AdmitChildUL NOSCRIPT+instance AdmitChildOL NOSCRIPT+instance AdmitChildDIR NOSCRIPT+instance AdmitChildMENU NOSCRIPT+instance AdmitChildPRE NOSCRIPT+instance AdmitChildDL NOSCRIPT+instance AdmitChildDIV NOSCRIPT+instance AdmitChildCENTER NOSCRIPT+instance AdmitChildNOSCRIPT NOSCRIPT+instance AdmitChildNOFRAMES NOSCRIPT+instance AdmitChildBLOCKQUOTE NOSCRIPT+instance AdmitChildFORM NOSCRIPT+instance AdmitChildISINDEX NOSCRIPT+instance AdmitChildHR NOSCRIPT+instance AdmitChildTABLE NOSCRIPT+instance AdmitChildFIELDSET NOSCRIPT+instance AdmitChildADDRESS NOSCRIPT+instance AdmitChildCDATA NOSCRIPT+instance AdmitChildTT NOSCRIPT+instance AdmitChildI NOSCRIPT+instance AdmitChildB NOSCRIPT+instance AdmitChildU NOSCRIPT+instance AdmitChildS NOSCRIPT+instance AdmitChildSTRIKE NOSCRIPT+instance AdmitChildBIG NOSCRIPT+instance AdmitChildSMALL NOSCRIPT+instance AdmitChildEM NOSCRIPT+instance AdmitChildSTRONG NOSCRIPT+instance AdmitChildDFN NOSCRIPT+instance AdmitChildCODE NOSCRIPT+instance AdmitChildSAMP NOSCRIPT+instance AdmitChildKBD NOSCRIPT+instance AdmitChildVAR NOSCRIPT+instance AdmitChildCITE NOSCRIPT+instance AdmitChildABBR NOSCRIPT+instance AdmitChildACRONYM NOSCRIPT+instance AdmitChildA NOSCRIPT+instance AdmitChildIMG NOSCRIPT+instance AdmitChildAPPLET NOSCRIPT+instance AdmitChildOBJECT NOSCRIPT+instance AdmitChildFONT NOSCRIPT+instance AdmitChildBASEFONT NOSCRIPT+instance AdmitChildBR NOSCRIPT+instance AdmitChildSCRIPT NOSCRIPT+instance AdmitChildMAP NOSCRIPT+instance AdmitChildQ NOSCRIPT+instance AdmitChildSUB NOSCRIPT+instance AdmitChildSUP NOSCRIPT+instance AdmitChildSPAN NOSCRIPT+instance AdmitChildBDO NOSCRIPT+instance AdmitChildIFRAME NOSCRIPT+instance AdmitChildINPUT NOSCRIPT+instance AdmitChildSELECT NOSCRIPT+instance AdmitChildTEXTAREA NOSCRIPT+instance AdmitChildLABEL NOSCRIPT+instance AdmitChildBUTTON NOSCRIPT+instance TAG SCRIPT+instance AdmitChildCDATA SCRIPT+instance TAG STYLE+instance AdmitChildCDATA STYLE+instance TAG META where make = make_empty+instance TAG BASE where make = make_empty+instance TAG ISINDEX where make = make_empty+instance TAG TITLE+instance AdmitChildCDATA TITLE+instance TAG HEAD+instance AdmitChildTITLE HEAD+instance AdmitChildISINDEX HEAD+instance AdmitChildBASE HEAD+instance AdmitChildSCRIPT HEAD+instance AdmitChildSTYLE HEAD+instance AdmitChildMETA HEAD+instance AdmitChildLINK HEAD+instance AdmitChildOBJECT HEAD+instance TAG NOFRAMES+instance AdmitChildP NOFRAMES+instance AdmitChildH1 NOFRAMES+instance AdmitChildH2 NOFRAMES+instance AdmitChildH3 NOFRAMES+instance AdmitChildH4 NOFRAMES+instance AdmitChildH5 NOFRAMES+instance AdmitChildH6 NOFRAMES+instance AdmitChildUL NOFRAMES+instance AdmitChildOL NOFRAMES+instance AdmitChildDIR NOFRAMES+instance AdmitChildMENU NOFRAMES+instance AdmitChildPRE NOFRAMES+instance AdmitChildDL NOFRAMES+instance AdmitChildDIV NOFRAMES+instance AdmitChildCENTER NOFRAMES+instance AdmitChildNOSCRIPT NOFRAMES+instance AdmitChildNOFRAMES NOFRAMES+instance AdmitChildBLOCKQUOTE NOFRAMES+instance AdmitChildFORM NOFRAMES+instance AdmitChildISINDEX NOFRAMES+instance AdmitChildHR NOFRAMES+instance AdmitChildTABLE NOFRAMES+instance AdmitChildFIELDSET NOFRAMES+instance AdmitChildADDRESS NOFRAMES+instance AdmitChildCDATA NOFRAMES+instance AdmitChildTT NOFRAMES+instance AdmitChildI NOFRAMES+instance AdmitChildB NOFRAMES+instance AdmitChildU NOFRAMES+instance AdmitChildS NOFRAMES+instance AdmitChildSTRIKE NOFRAMES+instance AdmitChildBIG NOFRAMES+instance AdmitChildSMALL NOFRAMES+instance AdmitChildEM NOFRAMES+instance AdmitChildSTRONG NOFRAMES+instance AdmitChildDFN NOFRAMES+instance AdmitChildCODE NOFRAMES+instance AdmitChildSAMP NOFRAMES+instance AdmitChildKBD NOFRAMES+instance AdmitChildVAR NOFRAMES+instance AdmitChildCITE NOFRAMES+instance AdmitChildABBR NOFRAMES+instance AdmitChildACRONYM NOFRAMES+instance AdmitChildA NOFRAMES+instance AdmitChildIMG NOFRAMES+instance AdmitChildAPPLET NOFRAMES+instance AdmitChildOBJECT NOFRAMES+instance AdmitChildFONT NOFRAMES+instance AdmitChildBASEFONT NOFRAMES+instance AdmitChildBR NOFRAMES+instance AdmitChildSCRIPT NOFRAMES+instance AdmitChildMAP NOFRAMES+instance AdmitChildQ NOFRAMES+instance AdmitChildSUB NOFRAMES+instance AdmitChildSUP NOFRAMES+instance AdmitChildSPAN NOFRAMES+instance AdmitChildBDO NOFRAMES+instance AdmitChildIFRAME NOFRAMES+instance AdmitChildINPUT NOFRAMES+instance AdmitChildSELECT NOFRAMES+instance AdmitChildTEXTAREA NOFRAMES+instance AdmitChildLABEL NOFRAMES+instance AdmitChildBUTTON NOFRAMES+instance TAG IFRAME+instance AdmitChildP IFRAME+instance AdmitChildH1 IFRAME+instance AdmitChildH2 IFRAME+instance AdmitChildH3 IFRAME+instance AdmitChildH4 IFRAME+instance AdmitChildH5 IFRAME+instance AdmitChildH6 IFRAME+instance AdmitChildUL IFRAME+instance AdmitChildOL IFRAME+instance AdmitChildDIR IFRAME+instance AdmitChildMENU IFRAME+instance AdmitChildPRE IFRAME+instance AdmitChildDL IFRAME+instance AdmitChildDIV IFRAME+instance AdmitChildCENTER IFRAME+instance AdmitChildNOSCRIPT IFRAME+instance AdmitChildNOFRAMES IFRAME+instance AdmitChildBLOCKQUOTE IFRAME+instance AdmitChildFORM IFRAME+instance AdmitChildISINDEX IFRAME+instance AdmitChildHR IFRAME+instance AdmitChildTABLE IFRAME+instance AdmitChildFIELDSET IFRAME+instance AdmitChildADDRESS IFRAME+instance AdmitChildCDATA IFRAME+instance AdmitChildTT IFRAME+instance AdmitChildI IFRAME+instance AdmitChildB IFRAME+instance AdmitChildU IFRAME+instance AdmitChildS IFRAME+instance AdmitChildSTRIKE IFRAME+instance AdmitChildBIG IFRAME+instance AdmitChildSMALL IFRAME+instance AdmitChildEM IFRAME+instance AdmitChildSTRONG IFRAME+instance AdmitChildDFN IFRAME+instance AdmitChildCODE IFRAME+instance AdmitChildSAMP IFRAME+instance AdmitChildKBD IFRAME+instance AdmitChildVAR IFRAME+instance AdmitChildCITE IFRAME+instance AdmitChildABBR IFRAME+instance AdmitChildACRONYM IFRAME+instance AdmitChildA IFRAME+instance AdmitChildIMG IFRAME+instance AdmitChildAPPLET IFRAME+instance AdmitChildOBJECT IFRAME+instance AdmitChildFONT IFRAME+instance AdmitChildBASEFONT IFRAME+instance AdmitChildBR IFRAME+instance AdmitChildSCRIPT IFRAME+instance AdmitChildMAP IFRAME+instance AdmitChildQ IFRAME+instance AdmitChildSUB IFRAME+instance AdmitChildSUP IFRAME+instance AdmitChildSPAN IFRAME+instance AdmitChildBDO IFRAME+instance AdmitChildIFRAME IFRAME+instance AdmitChildINPUT IFRAME+instance AdmitChildSELECT IFRAME+instance AdmitChildTEXTAREA IFRAME+instance AdmitChildLABEL IFRAME+instance AdmitChildBUTTON IFRAME+instance TAG TH+instance AdmitChildP TH+instance AdmitChildH1 TH+instance AdmitChildH2 TH+instance AdmitChildH3 TH+instance AdmitChildH4 TH+instance AdmitChildH5 TH+instance AdmitChildH6 TH+instance AdmitChildUL TH+instance AdmitChildOL TH+instance AdmitChildDIR TH+instance AdmitChildMENU TH+instance AdmitChildPRE TH+instance AdmitChildDL TH+instance AdmitChildDIV TH+instance AdmitChildCENTER TH+instance AdmitChildNOSCRIPT TH+instance AdmitChildNOFRAMES TH+instance AdmitChildBLOCKQUOTE TH+instance AdmitChildFORM TH+instance AdmitChildISINDEX TH+instance AdmitChildHR TH+instance AdmitChildTABLE TH+instance AdmitChildFIELDSET TH+instance AdmitChildADDRESS TH+instance AdmitChildCDATA TH+instance AdmitChildTT TH+instance AdmitChildI TH+instance AdmitChildB TH+instance AdmitChildU TH+instance AdmitChildS TH+instance AdmitChildSTRIKE TH+instance AdmitChildBIG TH+instance AdmitChildSMALL TH+instance AdmitChildEM TH+instance AdmitChildSTRONG TH+instance AdmitChildDFN TH+instance AdmitChildCODE TH+instance AdmitChildSAMP TH+instance AdmitChildKBD TH+instance AdmitChildVAR TH+instance AdmitChildCITE TH+instance AdmitChildABBR TH+instance AdmitChildACRONYM TH+instance AdmitChildA TH+instance AdmitChildIMG TH+instance AdmitChildAPPLET TH+instance AdmitChildOBJECT TH+instance AdmitChildFONT TH+instance AdmitChildBASEFONT TH+instance AdmitChildBR TH+instance AdmitChildSCRIPT TH+instance AdmitChildMAP TH+instance AdmitChildQ TH+instance AdmitChildSUB TH+instance AdmitChildSUP TH+instance AdmitChildSPAN TH+instance AdmitChildBDO TH+instance AdmitChildIFRAME TH+instance AdmitChildINPUT TH+instance AdmitChildSELECT TH+instance AdmitChildTEXTAREA TH+instance AdmitChildLABEL TH+instance AdmitChildBUTTON TH+instance TAG TD+instance AdmitChildP TD+instance AdmitChildH1 TD+instance AdmitChildH2 TD+instance AdmitChildH3 TD+instance AdmitChildH4 TD+instance AdmitChildH5 TD+instance AdmitChildH6 TD+instance AdmitChildUL TD+instance AdmitChildOL TD+instance AdmitChildDIR TD+instance AdmitChildMENU TD+instance AdmitChildPRE TD+instance AdmitChildDL TD+instance AdmitChildDIV TD+instance AdmitChildCENTER TD+instance AdmitChildNOSCRIPT TD+instance AdmitChildNOFRAMES TD+instance AdmitChildBLOCKQUOTE TD+instance AdmitChildFORM TD+instance AdmitChildISINDEX TD+instance AdmitChildHR TD+instance AdmitChildTABLE TD+instance AdmitChildFIELDSET TD+instance AdmitChildADDRESS TD+instance AdmitChildCDATA TD+instance AdmitChildTT TD+instance AdmitChildI TD+instance AdmitChildB TD+instance AdmitChildU TD+instance AdmitChildS TD+instance AdmitChildSTRIKE TD+instance AdmitChildBIG TD+instance AdmitChildSMALL TD+instance AdmitChildEM TD+instance AdmitChildSTRONG TD+instance AdmitChildDFN TD+instance AdmitChildCODE TD+instance AdmitChildSAMP TD+instance AdmitChildKBD TD+instance AdmitChildVAR TD+instance AdmitChildCITE TD+instance AdmitChildABBR TD+instance AdmitChildACRONYM TD+instance AdmitChildA TD+instance AdmitChildIMG TD+instance AdmitChildAPPLET TD+instance AdmitChildOBJECT TD+instance AdmitChildFONT TD+instance AdmitChildBASEFONT TD+instance AdmitChildBR TD+instance AdmitChildSCRIPT TD+instance AdmitChildMAP TD+instance AdmitChildQ TD+instance AdmitChildSUB TD+instance AdmitChildSUP TD+instance AdmitChildSPAN TD+instance AdmitChildBDO TD+instance AdmitChildIFRAME TD+instance AdmitChildINPUT TD+instance AdmitChildSELECT TD+instance AdmitChildTEXTAREA TD+instance AdmitChildLABEL TD+instance AdmitChildBUTTON TD+instance TAG TR+instance AdmitChildTH TR+instance AdmitChildTD TR+instance TAG COL where make = make_empty+instance TAG COLGROUP+instance AdmitChildCOL COLGROUP+instance TAG TBODY+instance AdmitChildTR TBODY+instance TAG TFOOT+instance AdmitChildTR TFOOT+instance TAG THEAD+instance AdmitChildTR THEAD+instance TAG CAPTION+instance AdmitChildCDATA CAPTION+instance AdmitChildTT CAPTION+instance AdmitChildI CAPTION+instance AdmitChildB CAPTION+instance AdmitChildU CAPTION+instance AdmitChildS CAPTION+instance AdmitChildSTRIKE CAPTION+instance AdmitChildBIG CAPTION+instance AdmitChildSMALL CAPTION+instance AdmitChildEM CAPTION+instance AdmitChildSTRONG CAPTION+instance AdmitChildDFN CAPTION+instance AdmitChildCODE CAPTION+instance AdmitChildSAMP CAPTION+instance AdmitChildKBD CAPTION+instance AdmitChildVAR CAPTION+instance AdmitChildCITE CAPTION+instance AdmitChildABBR CAPTION+instance AdmitChildACRONYM CAPTION+instance AdmitChildA CAPTION+instance AdmitChildIMG CAPTION+instance AdmitChildAPPLET CAPTION+instance AdmitChildOBJECT CAPTION+instance AdmitChildFONT CAPTION+instance AdmitChildBASEFONT CAPTION+instance AdmitChildBR CAPTION+instance AdmitChildSCRIPT CAPTION+instance AdmitChildMAP CAPTION+instance AdmitChildQ CAPTION+instance AdmitChildSUB CAPTION+instance AdmitChildSUP CAPTION+instance AdmitChildSPAN CAPTION+instance AdmitChildBDO CAPTION+instance AdmitChildIFRAME CAPTION+instance AdmitChildINPUT CAPTION+instance AdmitChildSELECT CAPTION+instance AdmitChildTEXTAREA CAPTION+instance AdmitChildLABEL CAPTION+instance AdmitChildBUTTON CAPTION+instance TAG TABLE+instance AdmitChildCAPTION TABLE+instance AdmitChildCOL TABLE+instance AdmitChildCOLGROUP TABLE+instance AdmitChildTHEAD TABLE+instance AdmitChildTFOOT TABLE+instance AdmitChildTBODY TABLE+instance TAG BUTTON+instance AdmitChildP BUTTON+instance AdmitChildH1 BUTTON+instance AdmitChildH2 BUTTON+instance AdmitChildH3 BUTTON+instance AdmitChildH4 BUTTON+instance AdmitChildH5 BUTTON+instance AdmitChildH6 BUTTON+instance AdmitChildUL BUTTON+instance AdmitChildOL BUTTON+instance AdmitChildDIR BUTTON+instance AdmitChildMENU BUTTON+instance AdmitChildPRE BUTTON+instance AdmitChildDL BUTTON+instance AdmitChildDIV BUTTON+instance AdmitChildCENTER BUTTON+instance AdmitChildNOSCRIPT BUTTON+instance AdmitChildNOFRAMES BUTTON+instance AdmitChildBLOCKQUOTE BUTTON+instance AdmitChildHR BUTTON+instance AdmitChildTABLE BUTTON+instance AdmitChildADDRESS BUTTON+instance AdmitChildCDATA BUTTON+instance AdmitChildTT BUTTON+instance AdmitChildI BUTTON+instance AdmitChildB BUTTON+instance AdmitChildU BUTTON+instance AdmitChildS BUTTON+instance AdmitChildSTRIKE BUTTON+instance AdmitChildBIG BUTTON+instance AdmitChildSMALL BUTTON+instance AdmitChildEM BUTTON+instance AdmitChildSTRONG BUTTON+instance AdmitChildDFN BUTTON+instance AdmitChildCODE BUTTON+instance AdmitChildSAMP BUTTON+instance AdmitChildKBD BUTTON+instance AdmitChildVAR BUTTON+instance AdmitChildCITE BUTTON+instance AdmitChildABBR BUTTON+instance AdmitChildACRONYM BUTTON+instance AdmitChildIMG BUTTON+instance AdmitChildAPPLET BUTTON+instance AdmitChildOBJECT BUTTON+instance AdmitChildFONT BUTTON+instance AdmitChildBASEFONT BUTTON+instance AdmitChildBR BUTTON+instance AdmitChildSCRIPT BUTTON+instance AdmitChildMAP BUTTON+instance AdmitChildQ BUTTON+instance AdmitChildSUB BUTTON+instance AdmitChildSUP BUTTON+instance AdmitChildSPAN BUTTON+instance AdmitChildBDO BUTTON+instance TAG LEGEND+instance AdmitChildCDATA LEGEND+instance AdmitChildTT LEGEND+instance AdmitChildI LEGEND+instance AdmitChildB LEGEND+instance AdmitChildU LEGEND+instance AdmitChildS LEGEND+instance AdmitChildSTRIKE LEGEND+instance AdmitChildBIG LEGEND+instance AdmitChildSMALL LEGEND+instance AdmitChildEM LEGEND+instance AdmitChildSTRONG LEGEND+instance AdmitChildDFN LEGEND+instance AdmitChildCODE LEGEND+instance AdmitChildSAMP LEGEND+instance AdmitChildKBD LEGEND+instance AdmitChildVAR LEGEND+instance AdmitChildCITE LEGEND+instance AdmitChildABBR LEGEND+instance AdmitChildACRONYM LEGEND+instance AdmitChildA LEGEND+instance AdmitChildIMG LEGEND+instance AdmitChildAPPLET LEGEND+instance AdmitChildOBJECT LEGEND+instance AdmitChildFONT LEGEND+instance AdmitChildBASEFONT LEGEND+instance AdmitChildBR LEGEND+instance AdmitChildSCRIPT LEGEND+instance AdmitChildMAP LEGEND+instance AdmitChildQ LEGEND+instance AdmitChildSUB LEGEND+instance AdmitChildSUP LEGEND+instance AdmitChildSPAN LEGEND+instance AdmitChildBDO LEGEND+instance AdmitChildIFRAME LEGEND+instance AdmitChildINPUT LEGEND+instance AdmitChildSELECT LEGEND+instance AdmitChildTEXTAREA LEGEND+instance AdmitChildLABEL LEGEND+instance AdmitChildBUTTON LEGEND+instance TAG FIELDSET+instance AdmitChildCDATA FIELDSET+instance AdmitChildLEGEND FIELDSET+instance AdmitChildP FIELDSET+instance AdmitChildH1 FIELDSET+instance AdmitChildH2 FIELDSET+instance AdmitChildH3 FIELDSET+instance AdmitChildH4 FIELDSET+instance AdmitChildH5 FIELDSET+instance AdmitChildH6 FIELDSET+instance AdmitChildUL FIELDSET+instance AdmitChildOL FIELDSET+instance AdmitChildDIR FIELDSET+instance AdmitChildMENU FIELDSET+instance AdmitChildPRE FIELDSET+instance AdmitChildDL FIELDSET+instance AdmitChildDIV FIELDSET+instance AdmitChildCENTER FIELDSET+instance AdmitChildNOSCRIPT FIELDSET+instance AdmitChildNOFRAMES FIELDSET+instance AdmitChildBLOCKQUOTE FIELDSET+instance AdmitChildFORM FIELDSET+instance AdmitChildISINDEX FIELDSET+instance AdmitChildHR FIELDSET+instance AdmitChildTABLE FIELDSET+instance AdmitChildFIELDSET FIELDSET+instance AdmitChildADDRESS FIELDSET+instance AdmitChildTT FIELDSET+instance AdmitChildI FIELDSET+instance AdmitChildB FIELDSET+instance AdmitChildU FIELDSET+instance AdmitChildS FIELDSET+instance AdmitChildSTRIKE FIELDSET+instance AdmitChildBIG FIELDSET+instance AdmitChildSMALL FIELDSET+instance AdmitChildEM FIELDSET+instance AdmitChildSTRONG FIELDSET+instance AdmitChildDFN FIELDSET+instance AdmitChildCODE FIELDSET+instance AdmitChildSAMP FIELDSET+instance AdmitChildKBD FIELDSET+instance AdmitChildVAR FIELDSET+instance AdmitChildCITE FIELDSET+instance AdmitChildABBR FIELDSET+instance AdmitChildACRONYM FIELDSET+instance AdmitChildA FIELDSET+instance AdmitChildIMG FIELDSET+instance AdmitChildAPPLET FIELDSET+instance AdmitChildOBJECT FIELDSET+instance AdmitChildFONT FIELDSET+instance AdmitChildBASEFONT FIELDSET+instance AdmitChildBR FIELDSET+instance AdmitChildSCRIPT FIELDSET+instance AdmitChildMAP FIELDSET+instance AdmitChildQ FIELDSET+instance AdmitChildSUB FIELDSET+instance AdmitChildSUP FIELDSET+instance AdmitChildSPAN FIELDSET+instance AdmitChildBDO FIELDSET+instance AdmitChildIFRAME FIELDSET+instance AdmitChildINPUT FIELDSET+instance AdmitChildSELECT FIELDSET+instance AdmitChildTEXTAREA FIELDSET+instance AdmitChildLABEL FIELDSET+instance AdmitChildBUTTON FIELDSET+instance TAG TEXTAREA+instance AdmitChildCDATA TEXTAREA+instance TAG OPTION+instance AdmitChildCDATA OPTION+instance TAG OPTGROUP+instance AdmitChildOPTION OPTGROUP+instance TAG SELECT+instance AdmitChildOPTGROUP SELECT+instance AdmitChildOPTION SELECT+instance TAG INPUT where make = make_empty+instance TAG LABEL+instance AdmitChildCDATA LABEL+instance AdmitChildTT LABEL+instance AdmitChildI LABEL+instance AdmitChildB LABEL+instance AdmitChildU LABEL+instance AdmitChildS LABEL+instance AdmitChildSTRIKE LABEL+instance AdmitChildBIG LABEL+instance AdmitChildSMALL LABEL+instance AdmitChildEM LABEL+instance AdmitChildSTRONG LABEL+instance AdmitChildDFN LABEL+instance AdmitChildCODE LABEL+instance AdmitChildSAMP LABEL+instance AdmitChildKBD LABEL+instance AdmitChildVAR LABEL+instance AdmitChildCITE LABEL+instance AdmitChildABBR LABEL+instance AdmitChildACRONYM LABEL+instance AdmitChildA LABEL+instance AdmitChildIMG LABEL+instance AdmitChildAPPLET LABEL+instance AdmitChildOBJECT LABEL+instance AdmitChildFONT LABEL+instance AdmitChildBASEFONT LABEL+instance AdmitChildBR LABEL+instance AdmitChildSCRIPT LABEL+instance AdmitChildMAP LABEL+instance AdmitChildQ LABEL+instance AdmitChildSUB LABEL+instance AdmitChildSUP LABEL+instance AdmitChildSPAN LABEL+instance AdmitChildBDO LABEL+instance AdmitChildIFRAME LABEL+instance AdmitChildINPUT LABEL+instance AdmitChildSELECT LABEL+instance AdmitChildTEXTAREA LABEL+instance AdmitChildBUTTON LABEL+instance TAG FORM+instance AdmitChildP FORM+instance AdmitChildH1 FORM+instance AdmitChildH2 FORM+instance AdmitChildH3 FORM+instance AdmitChildH4 FORM+instance AdmitChildH5 FORM+instance AdmitChildH6 FORM+instance AdmitChildUL FORM+instance AdmitChildOL FORM+instance AdmitChildDIR FORM+instance AdmitChildMENU FORM+instance AdmitChildPRE FORM+instance AdmitChildDL FORM+instance AdmitChildDIV FORM+instance AdmitChildCENTER FORM+instance AdmitChildNOSCRIPT FORM+instance AdmitChildNOFRAMES FORM+instance AdmitChildBLOCKQUOTE FORM+instance AdmitChildISINDEX FORM+instance AdmitChildHR FORM+instance AdmitChildTABLE FORM+instance AdmitChildFIELDSET FORM+instance AdmitChildADDRESS FORM+instance AdmitChildCDATA FORM+instance AdmitChildTT FORM+instance AdmitChildI FORM+instance AdmitChildB FORM+instance AdmitChildU FORM+instance AdmitChildS FORM+instance AdmitChildSTRIKE FORM+instance AdmitChildBIG FORM+instance AdmitChildSMALL FORM+instance AdmitChildEM FORM+instance AdmitChildSTRONG FORM+instance AdmitChildDFN FORM+instance AdmitChildCODE FORM+instance AdmitChildSAMP FORM+instance AdmitChildKBD FORM+instance AdmitChildVAR FORM+instance AdmitChildCITE FORM+instance AdmitChildABBR FORM+instance AdmitChildACRONYM FORM+instance AdmitChildA FORM+instance AdmitChildIMG FORM+instance AdmitChildAPPLET FORM+instance AdmitChildOBJECT FORM+instance AdmitChildFONT FORM+instance AdmitChildBASEFONT FORM+instance AdmitChildBR FORM+instance AdmitChildSCRIPT FORM+instance AdmitChildMAP FORM+instance AdmitChildQ FORM+instance AdmitChildSUB FORM+instance AdmitChildSUP FORM+instance AdmitChildSPAN FORM+instance AdmitChildBDO FORM+instance AdmitChildIFRAME FORM+instance AdmitChildINPUT FORM+instance AdmitChildSELECT FORM+instance AdmitChildTEXTAREA FORM+instance AdmitChildLABEL FORM+instance AdmitChildBUTTON FORM+instance TAG LI+instance AdmitChildP LI+instance AdmitChildH1 LI+instance AdmitChildH2 LI+instance AdmitChildH3 LI+instance AdmitChildH4 LI+instance AdmitChildH5 LI+instance AdmitChildH6 LI+instance AdmitChildUL LI+instance AdmitChildOL LI+instance AdmitChildDIR LI+instance AdmitChildMENU LI+instance AdmitChildPRE LI+instance AdmitChildDL LI+instance AdmitChildDIV LI+instance AdmitChildCENTER LI+instance AdmitChildNOSCRIPT LI+instance AdmitChildNOFRAMES LI+instance AdmitChildBLOCKQUOTE LI+instance AdmitChildFORM LI+instance AdmitChildISINDEX LI+instance AdmitChildHR LI+instance AdmitChildTABLE LI+instance AdmitChildFIELDSET LI+instance AdmitChildADDRESS LI+instance AdmitChildCDATA LI+instance AdmitChildTT LI+instance AdmitChildI LI+instance AdmitChildB LI+instance AdmitChildU LI+instance AdmitChildS LI+instance AdmitChildSTRIKE LI+instance AdmitChildBIG LI+instance AdmitChildSMALL LI+instance AdmitChildEM LI+instance AdmitChildSTRONG LI+instance AdmitChildDFN LI+instance AdmitChildCODE LI+instance AdmitChildSAMP LI+instance AdmitChildKBD LI+instance AdmitChildVAR LI+instance AdmitChildCITE LI+instance AdmitChildABBR LI+instance AdmitChildACRONYM LI+instance AdmitChildA LI+instance AdmitChildIMG LI+instance AdmitChildAPPLET LI+instance AdmitChildOBJECT LI+instance AdmitChildFONT LI+instance AdmitChildBASEFONT LI+instance AdmitChildBR LI+instance AdmitChildSCRIPT LI+instance AdmitChildMAP LI+instance AdmitChildQ LI+instance AdmitChildSUB LI+instance AdmitChildSUP LI+instance AdmitChildSPAN LI+instance AdmitChildBDO LI+instance AdmitChildIFRAME LI+instance AdmitChildINPUT LI+instance AdmitChildSELECT LI+instance AdmitChildTEXTAREA LI+instance AdmitChildLABEL LI+instance AdmitChildBUTTON LI+instance TAG DIR+instance AdmitChildLI DIR+instance TAG MENU+instance AdmitChildLI MENU+instance TAG UL+instance AdmitChildLI UL+instance TAG OL+instance AdmitChildLI OL+instance TAG DD+instance AdmitChildP DD+instance AdmitChildH1 DD+instance AdmitChildH2 DD+instance AdmitChildH3 DD+instance AdmitChildH4 DD+instance AdmitChildH5 DD+instance AdmitChildH6 DD+instance AdmitChildUL DD+instance AdmitChildOL DD+instance AdmitChildDIR DD+instance AdmitChildMENU DD+instance AdmitChildPRE DD+instance AdmitChildDL DD+instance AdmitChildDIV DD+instance AdmitChildCENTER DD+instance AdmitChildNOSCRIPT DD+instance AdmitChildNOFRAMES DD+instance AdmitChildBLOCKQUOTE DD+instance AdmitChildFORM DD+instance AdmitChildISINDEX DD+instance AdmitChildHR DD+instance AdmitChildTABLE DD+instance AdmitChildFIELDSET DD+instance AdmitChildADDRESS DD+instance AdmitChildCDATA DD+instance AdmitChildTT DD+instance AdmitChildI DD+instance AdmitChildB DD+instance AdmitChildU DD+instance AdmitChildS DD+instance AdmitChildSTRIKE DD+instance AdmitChildBIG DD+instance AdmitChildSMALL DD+instance AdmitChildEM DD+instance AdmitChildSTRONG DD+instance AdmitChildDFN DD+instance AdmitChildCODE DD+instance AdmitChildSAMP DD+instance AdmitChildKBD DD+instance AdmitChildVAR DD+instance AdmitChildCITE DD+instance AdmitChildABBR DD+instance AdmitChildACRONYM DD+instance AdmitChildA DD+instance AdmitChildIMG DD+instance AdmitChildAPPLET DD+instance AdmitChildOBJECT DD+instance AdmitChildFONT DD+instance AdmitChildBASEFONT DD+instance AdmitChildBR DD+instance AdmitChildSCRIPT DD+instance AdmitChildMAP DD+instance AdmitChildQ DD+instance AdmitChildSUB DD+instance AdmitChildSUP DD+instance AdmitChildSPAN DD+instance AdmitChildBDO DD+instance AdmitChildIFRAME DD+instance AdmitChildINPUT DD+instance AdmitChildSELECT DD+instance AdmitChildTEXTAREA DD+instance AdmitChildLABEL DD+instance AdmitChildBUTTON DD+instance TAG DT+instance AdmitChildCDATA DT+instance AdmitChildTT DT+instance AdmitChildI DT+instance AdmitChildB DT+instance AdmitChildU DT+instance AdmitChildS DT+instance AdmitChildSTRIKE DT+instance AdmitChildBIG DT+instance AdmitChildSMALL DT+instance AdmitChildEM DT+instance AdmitChildSTRONG DT+instance AdmitChildDFN DT+instance AdmitChildCODE DT+instance AdmitChildSAMP DT+instance AdmitChildKBD DT+instance AdmitChildVAR DT+instance AdmitChildCITE DT+instance AdmitChildABBR DT+instance AdmitChildACRONYM DT+instance AdmitChildA DT+instance AdmitChildIMG DT+instance AdmitChildAPPLET DT+instance AdmitChildOBJECT DT+instance AdmitChildFONT DT+instance AdmitChildBASEFONT DT+instance AdmitChildBR DT+instance AdmitChildSCRIPT DT+instance AdmitChildMAP DT+instance AdmitChildQ DT+instance AdmitChildSUB DT+instance AdmitChildSUP DT+instance AdmitChildSPAN DT+instance AdmitChildBDO DT+instance AdmitChildIFRAME DT+instance AdmitChildINPUT DT+instance AdmitChildSELECT DT+instance AdmitChildTEXTAREA DT+instance AdmitChildLABEL DT+instance AdmitChildBUTTON DT+instance TAG DL+instance AdmitChildDT DL+instance AdmitChildDD DL+instance TAG INS+instance AdmitChildP INS+instance AdmitChildH1 INS+instance AdmitChildH2 INS+instance AdmitChildH3 INS+instance AdmitChildH4 INS+instance AdmitChildH5 INS+instance AdmitChildH6 INS+instance AdmitChildUL INS+instance AdmitChildOL INS+instance AdmitChildDIR INS+instance AdmitChildMENU INS+instance AdmitChildPRE INS+instance AdmitChildDL INS+instance AdmitChildDIV INS+instance AdmitChildCENTER INS+instance AdmitChildNOSCRIPT INS+instance AdmitChildNOFRAMES INS+instance AdmitChildBLOCKQUOTE INS+instance AdmitChildFORM INS+instance AdmitChildISINDEX INS+instance AdmitChildHR INS+instance AdmitChildTABLE INS+instance AdmitChildFIELDSET INS+instance AdmitChildADDRESS INS+instance AdmitChildCDATA INS+instance AdmitChildTT INS+instance AdmitChildI INS+instance AdmitChildB INS+instance AdmitChildU INS+instance AdmitChildS INS+instance AdmitChildSTRIKE INS+instance AdmitChildBIG INS+instance AdmitChildSMALL INS+instance AdmitChildEM INS+instance AdmitChildSTRONG INS+instance AdmitChildDFN INS+instance AdmitChildCODE INS+instance AdmitChildSAMP INS+instance AdmitChildKBD INS+instance AdmitChildVAR INS+instance AdmitChildCITE INS+instance AdmitChildABBR INS+instance AdmitChildACRONYM INS+instance AdmitChildA INS+instance AdmitChildIMG INS+instance AdmitChildAPPLET INS+instance AdmitChildOBJECT INS+instance AdmitChildFONT INS+instance AdmitChildBASEFONT INS+instance AdmitChildBR INS+instance AdmitChildSCRIPT INS+instance AdmitChildMAP INS+instance AdmitChildQ INS+instance AdmitChildSUB INS+instance AdmitChildSUP INS+instance AdmitChildSPAN INS+instance AdmitChildBDO INS+instance AdmitChildIFRAME INS+instance AdmitChildINPUT INS+instance AdmitChildSELECT INS+instance AdmitChildTEXTAREA INS+instance AdmitChildLABEL INS+instance AdmitChildBUTTON INS+instance TAG DEL+instance AdmitChildP DEL+instance AdmitChildH1 DEL+instance AdmitChildH2 DEL+instance AdmitChildH3 DEL+instance AdmitChildH4 DEL+instance AdmitChildH5 DEL+instance AdmitChildH6 DEL+instance AdmitChildUL DEL+instance AdmitChildOL DEL+instance AdmitChildDIR DEL+instance AdmitChildMENU DEL+instance AdmitChildPRE DEL+instance AdmitChildDL DEL+instance AdmitChildDIV DEL+instance AdmitChildCENTER DEL+instance AdmitChildNOSCRIPT DEL+instance AdmitChildNOFRAMES DEL+instance AdmitChildBLOCKQUOTE DEL+instance AdmitChildFORM DEL+instance AdmitChildISINDEX DEL+instance AdmitChildHR DEL+instance AdmitChildTABLE DEL+instance AdmitChildFIELDSET DEL+instance AdmitChildADDRESS DEL+instance AdmitChildCDATA DEL+instance AdmitChildTT DEL+instance AdmitChildI DEL+instance AdmitChildB DEL+instance AdmitChildU DEL+instance AdmitChildS DEL+instance AdmitChildSTRIKE DEL+instance AdmitChildBIG DEL+instance AdmitChildSMALL DEL+instance AdmitChildEM DEL+instance AdmitChildSTRONG DEL+instance AdmitChildDFN DEL+instance AdmitChildCODE DEL+instance AdmitChildSAMP DEL+instance AdmitChildKBD DEL+instance AdmitChildVAR DEL+instance AdmitChildCITE DEL+instance AdmitChildABBR DEL+instance AdmitChildACRONYM DEL+instance AdmitChildA DEL+instance AdmitChildIMG DEL+instance AdmitChildAPPLET DEL+instance AdmitChildOBJECT DEL+instance AdmitChildFONT DEL+instance AdmitChildBASEFONT DEL+instance AdmitChildBR DEL+instance AdmitChildSCRIPT DEL+instance AdmitChildMAP DEL+instance AdmitChildQ DEL+instance AdmitChildSUB DEL+instance AdmitChildSUP DEL+instance AdmitChildSPAN DEL+instance AdmitChildBDO DEL+instance AdmitChildIFRAME DEL+instance AdmitChildINPUT DEL+instance AdmitChildSELECT DEL+instance AdmitChildTEXTAREA DEL+instance AdmitChildLABEL DEL+instance AdmitChildBUTTON DEL+instance TAG BLOCKQUOTE+instance AdmitChildP BLOCKQUOTE+instance AdmitChildH1 BLOCKQUOTE+instance AdmitChildH2 BLOCKQUOTE+instance AdmitChildH3 BLOCKQUOTE+instance AdmitChildH4 BLOCKQUOTE+instance AdmitChildH5 BLOCKQUOTE+instance AdmitChildH6 BLOCKQUOTE+instance AdmitChildUL BLOCKQUOTE+instance AdmitChildOL BLOCKQUOTE+instance AdmitChildDIR BLOCKQUOTE+instance AdmitChildMENU BLOCKQUOTE+instance AdmitChildPRE BLOCKQUOTE+instance AdmitChildDL BLOCKQUOTE+instance AdmitChildDIV BLOCKQUOTE+instance AdmitChildCENTER BLOCKQUOTE+instance AdmitChildNOSCRIPT BLOCKQUOTE+instance AdmitChildNOFRAMES BLOCKQUOTE+instance AdmitChildBLOCKQUOTE BLOCKQUOTE+instance AdmitChildFORM BLOCKQUOTE+instance AdmitChildISINDEX BLOCKQUOTE+instance AdmitChildHR BLOCKQUOTE+instance AdmitChildTABLE BLOCKQUOTE+instance AdmitChildFIELDSET BLOCKQUOTE+instance AdmitChildADDRESS BLOCKQUOTE+instance AdmitChildCDATA BLOCKQUOTE+instance AdmitChildTT BLOCKQUOTE+instance AdmitChildI BLOCKQUOTE+instance AdmitChildB BLOCKQUOTE+instance AdmitChildU BLOCKQUOTE+instance AdmitChildS BLOCKQUOTE+instance AdmitChildSTRIKE BLOCKQUOTE+instance AdmitChildBIG BLOCKQUOTE+instance AdmitChildSMALL BLOCKQUOTE+instance AdmitChildEM BLOCKQUOTE+instance AdmitChildSTRONG BLOCKQUOTE+instance AdmitChildDFN BLOCKQUOTE+instance AdmitChildCODE BLOCKQUOTE+instance AdmitChildSAMP BLOCKQUOTE+instance AdmitChildKBD BLOCKQUOTE+instance AdmitChildVAR BLOCKQUOTE+instance AdmitChildCITE BLOCKQUOTE+instance AdmitChildABBR BLOCKQUOTE+instance AdmitChildACRONYM BLOCKQUOTE+instance AdmitChildA BLOCKQUOTE+instance AdmitChildIMG BLOCKQUOTE+instance AdmitChildAPPLET BLOCKQUOTE+instance AdmitChildOBJECT BLOCKQUOTE+instance AdmitChildFONT BLOCKQUOTE+instance AdmitChildBASEFONT BLOCKQUOTE+instance AdmitChildBR BLOCKQUOTE+instance AdmitChildSCRIPT BLOCKQUOTE+instance AdmitChildMAP BLOCKQUOTE+instance AdmitChildQ BLOCKQUOTE+instance AdmitChildSUB BLOCKQUOTE+instance AdmitChildSUP BLOCKQUOTE+instance AdmitChildSPAN BLOCKQUOTE+instance AdmitChildBDO BLOCKQUOTE+instance AdmitChildIFRAME BLOCKQUOTE+instance AdmitChildINPUT BLOCKQUOTE+instance AdmitChildSELECT BLOCKQUOTE+instance AdmitChildTEXTAREA BLOCKQUOTE+instance AdmitChildLABEL BLOCKQUOTE+instance AdmitChildBUTTON BLOCKQUOTE+instance TAG Q+instance AdmitChildCDATA Q+instance AdmitChildTT Q+instance AdmitChildI Q+instance AdmitChildB Q+instance AdmitChildU Q+instance AdmitChildS Q+instance AdmitChildSTRIKE Q+instance AdmitChildBIG Q+instance AdmitChildSMALL Q+instance AdmitChildEM Q+instance AdmitChildSTRONG Q+instance AdmitChildDFN Q+instance AdmitChildCODE Q+instance AdmitChildSAMP Q+instance AdmitChildKBD Q+instance AdmitChildVAR Q+instance AdmitChildCITE Q+instance AdmitChildABBR Q+instance AdmitChildACRONYM Q+instance AdmitChildA Q+instance AdmitChildIMG Q+instance AdmitChildAPPLET Q+instance AdmitChildOBJECT Q+instance AdmitChildFONT Q+instance AdmitChildBASEFONT Q+instance AdmitChildBR Q+instance AdmitChildSCRIPT Q+instance AdmitChildMAP Q+instance AdmitChildQ Q+instance AdmitChildSUB Q+instance AdmitChildSUP Q+instance AdmitChildSPAN Q+instance AdmitChildBDO Q+instance AdmitChildIFRAME Q+instance AdmitChildINPUT Q+instance AdmitChildSELECT Q+instance AdmitChildTEXTAREA Q+instance AdmitChildLABEL Q+instance AdmitChildBUTTON Q+instance TAG PRE+instance AdmitChildCDATA PRE+instance AdmitChildTT PRE+instance AdmitChildI PRE+instance AdmitChildB PRE+instance AdmitChildU PRE+instance AdmitChildS PRE+instance AdmitChildSTRIKE PRE+instance AdmitChildEM PRE+instance AdmitChildSTRONG PRE+instance AdmitChildDFN PRE+instance AdmitChildCODE PRE+instance AdmitChildSAMP PRE+instance AdmitChildKBD PRE+instance AdmitChildVAR PRE+instance AdmitChildCITE PRE+instance AdmitChildABBR PRE+instance AdmitChildACRONYM PRE+instance AdmitChildA PRE+instance AdmitChildBR PRE+instance AdmitChildSCRIPT PRE+instance AdmitChildMAP PRE+instance AdmitChildQ PRE+instance AdmitChildSPAN PRE+instance AdmitChildBDO PRE+instance AdmitChildIFRAME PRE+instance AdmitChildINPUT PRE+instance AdmitChildSELECT PRE+instance AdmitChildTEXTAREA PRE+instance AdmitChildLABEL PRE+instance AdmitChildBUTTON PRE+instance TAG H1+instance AdmitChildCDATA H1+instance AdmitChildTT H1+instance AdmitChildI H1+instance AdmitChildB H1+instance AdmitChildU H1+instance AdmitChildS H1+instance AdmitChildSTRIKE H1+instance AdmitChildBIG H1+instance AdmitChildSMALL H1+instance AdmitChildEM H1+instance AdmitChildSTRONG H1+instance AdmitChildDFN H1+instance AdmitChildCODE H1+instance AdmitChildSAMP H1+instance AdmitChildKBD H1+instance AdmitChildVAR H1+instance AdmitChildCITE H1+instance AdmitChildABBR H1+instance AdmitChildACRONYM H1+instance AdmitChildA H1+instance AdmitChildIMG H1+instance AdmitChildAPPLET H1+instance AdmitChildOBJECT H1+instance AdmitChildFONT H1+instance AdmitChildBASEFONT H1+instance AdmitChildBR H1+instance AdmitChildSCRIPT H1+instance AdmitChildMAP H1+instance AdmitChildQ H1+instance AdmitChildSUB H1+instance AdmitChildSUP H1+instance AdmitChildSPAN H1+instance AdmitChildBDO H1+instance AdmitChildIFRAME H1+instance AdmitChildINPUT H1+instance AdmitChildSELECT H1+instance AdmitChildTEXTAREA H1+instance AdmitChildLABEL H1+instance AdmitChildBUTTON H1+instance TAG H2+instance AdmitChildCDATA H2+instance AdmitChildTT H2+instance AdmitChildI H2+instance AdmitChildB H2+instance AdmitChildU H2+instance AdmitChildS H2+instance AdmitChildSTRIKE H2+instance AdmitChildBIG H2+instance AdmitChildSMALL H2+instance AdmitChildEM H2+instance AdmitChildSTRONG H2+instance AdmitChildDFN H2+instance AdmitChildCODE H2+instance AdmitChildSAMP H2+instance AdmitChildKBD H2+instance AdmitChildVAR H2+instance AdmitChildCITE H2+instance AdmitChildABBR H2+instance AdmitChildACRONYM H2+instance AdmitChildA H2+instance AdmitChildIMG H2+instance AdmitChildAPPLET H2+instance AdmitChildOBJECT H2+instance AdmitChildFONT H2+instance AdmitChildBASEFONT H2+instance AdmitChildBR H2+instance AdmitChildSCRIPT H2+instance AdmitChildMAP H2+instance AdmitChildQ H2+instance AdmitChildSUB H2+instance AdmitChildSUP H2+instance AdmitChildSPAN H2+instance AdmitChildBDO H2+instance AdmitChildIFRAME H2+instance AdmitChildINPUT H2+instance AdmitChildSELECT H2+instance AdmitChildTEXTAREA H2+instance AdmitChildLABEL H2+instance AdmitChildBUTTON H2+instance TAG H3+instance AdmitChildCDATA H3+instance AdmitChildTT H3+instance AdmitChildI H3+instance AdmitChildB H3+instance AdmitChildU H3+instance AdmitChildS H3+instance AdmitChildSTRIKE H3+instance AdmitChildBIG H3+instance AdmitChildSMALL H3+instance AdmitChildEM H3+instance AdmitChildSTRONG H3+instance AdmitChildDFN H3+instance AdmitChildCODE H3+instance AdmitChildSAMP H3+instance AdmitChildKBD H3+instance AdmitChildVAR H3+instance AdmitChildCITE H3+instance AdmitChildABBR H3+instance AdmitChildACRONYM H3+instance AdmitChildA H3+instance AdmitChildIMG H3+instance AdmitChildAPPLET H3+instance AdmitChildOBJECT H3+instance AdmitChildFONT H3+instance AdmitChildBASEFONT H3+instance AdmitChildBR H3+instance AdmitChildSCRIPT H3+instance AdmitChildMAP H3+instance AdmitChildQ H3+instance AdmitChildSUB H3+instance AdmitChildSUP H3+instance AdmitChildSPAN H3+instance AdmitChildBDO H3+instance AdmitChildIFRAME H3+instance AdmitChildINPUT H3+instance AdmitChildSELECT H3+instance AdmitChildTEXTAREA H3+instance AdmitChildLABEL H3+instance AdmitChildBUTTON H3+instance TAG H4+instance AdmitChildCDATA H4+instance AdmitChildTT H4+instance AdmitChildI H4+instance AdmitChildB H4+instance AdmitChildU H4+instance AdmitChildS H4+instance AdmitChildSTRIKE H4+instance AdmitChildBIG H4+instance AdmitChildSMALL H4+instance AdmitChildEM H4+instance AdmitChildSTRONG H4+instance AdmitChildDFN H4+instance AdmitChildCODE H4+instance AdmitChildSAMP H4+instance AdmitChildKBD H4+instance AdmitChildVAR H4+instance AdmitChildCITE H4+instance AdmitChildABBR H4+instance AdmitChildACRONYM H4+instance AdmitChildA H4+instance AdmitChildIMG H4+instance AdmitChildAPPLET H4+instance AdmitChildOBJECT H4+instance AdmitChildFONT H4+instance AdmitChildBASEFONT H4+instance AdmitChildBR H4+instance AdmitChildSCRIPT H4+instance AdmitChildMAP H4+instance AdmitChildQ H4+instance AdmitChildSUB H4+instance AdmitChildSUP H4+instance AdmitChildSPAN H4+instance AdmitChildBDO H4+instance AdmitChildIFRAME H4+instance AdmitChildINPUT H4+instance AdmitChildSELECT H4+instance AdmitChildTEXTAREA H4+instance AdmitChildLABEL H4+instance AdmitChildBUTTON H4+instance TAG H5+instance AdmitChildCDATA H5+instance AdmitChildTT H5+instance AdmitChildI H5+instance AdmitChildB H5+instance AdmitChildU H5+instance AdmitChildS H5+instance AdmitChildSTRIKE H5+instance AdmitChildBIG H5+instance AdmitChildSMALL H5+instance AdmitChildEM H5+instance AdmitChildSTRONG H5+instance AdmitChildDFN H5+instance AdmitChildCODE H5+instance AdmitChildSAMP H5+instance AdmitChildKBD H5+instance AdmitChildVAR H5+instance AdmitChildCITE H5+instance AdmitChildABBR H5+instance AdmitChildACRONYM H5+instance AdmitChildA H5+instance AdmitChildIMG H5+instance AdmitChildAPPLET H5+instance AdmitChildOBJECT H5+instance AdmitChildFONT H5+instance AdmitChildBASEFONT H5+instance AdmitChildBR H5+instance AdmitChildSCRIPT H5+instance AdmitChildMAP H5+instance AdmitChildQ H5+instance AdmitChildSUB H5+instance AdmitChildSUP H5+instance AdmitChildSPAN H5+instance AdmitChildBDO H5+instance AdmitChildIFRAME H5+instance AdmitChildINPUT H5+instance AdmitChildSELECT H5+instance AdmitChildTEXTAREA H5+instance AdmitChildLABEL H5+instance AdmitChildBUTTON H5+instance TAG H6+instance AdmitChildCDATA H6+instance AdmitChildTT H6+instance AdmitChildI H6+instance AdmitChildB H6+instance AdmitChildU H6+instance AdmitChildS H6+instance AdmitChildSTRIKE H6+instance AdmitChildBIG H6+instance AdmitChildSMALL H6+instance AdmitChildEM H6+instance AdmitChildSTRONG H6+instance AdmitChildDFN H6+instance AdmitChildCODE H6+instance AdmitChildSAMP H6+instance AdmitChildKBD H6+instance AdmitChildVAR H6+instance AdmitChildCITE H6+instance AdmitChildABBR H6+instance AdmitChildACRONYM H6+instance AdmitChildA H6+instance AdmitChildIMG H6+instance AdmitChildAPPLET H6+instance AdmitChildOBJECT H6+instance AdmitChildFONT H6+instance AdmitChildBASEFONT H6+instance AdmitChildBR H6+instance AdmitChildSCRIPT H6+instance AdmitChildMAP H6+instance AdmitChildQ H6+instance AdmitChildSUB H6+instance AdmitChildSUP H6+instance AdmitChildSPAN H6+instance AdmitChildBDO H6+instance AdmitChildIFRAME H6+instance AdmitChildINPUT H6+instance AdmitChildSELECT H6+instance AdmitChildTEXTAREA H6+instance AdmitChildLABEL H6+instance AdmitChildBUTTON H6+instance TAG P+instance AdmitChildCDATA P+instance AdmitChildTT P+instance AdmitChildI P+instance AdmitChildB P+instance AdmitChildU P+instance AdmitChildS P+instance AdmitChildSTRIKE P+instance AdmitChildBIG P+instance AdmitChildSMALL P+instance AdmitChildEM P+instance AdmitChildSTRONG P+instance AdmitChildDFN P+instance AdmitChildCODE P+instance AdmitChildSAMP P+instance AdmitChildKBD P+instance AdmitChildVAR P+instance AdmitChildCITE P+instance AdmitChildABBR P+instance AdmitChildACRONYM P+instance AdmitChildA P+instance AdmitChildIMG P+instance AdmitChildAPPLET P+instance AdmitChildOBJECT P+instance AdmitChildFONT P+instance AdmitChildBASEFONT P+instance AdmitChildBR P+instance AdmitChildSCRIPT P+instance AdmitChildMAP P+instance AdmitChildQ P+instance AdmitChildSUB P+instance AdmitChildSUP P+instance AdmitChildSPAN P+instance AdmitChildBDO P+instance AdmitChildIFRAME P+instance AdmitChildINPUT P+instance AdmitChildSELECT P+instance AdmitChildTEXTAREA P+instance AdmitChildLABEL P+instance AdmitChildBUTTON P+instance TAG HR where make = make_empty+instance TAG APPLET+instance AdmitChildPARAM APPLET+instance AdmitChildP APPLET+instance AdmitChildH1 APPLET+instance AdmitChildH2 APPLET+instance AdmitChildH3 APPLET+instance AdmitChildH4 APPLET+instance AdmitChildH5 APPLET+instance AdmitChildH6 APPLET+instance AdmitChildUL APPLET+instance AdmitChildOL APPLET+instance AdmitChildDIR APPLET+instance AdmitChildMENU APPLET+instance AdmitChildPRE APPLET+instance AdmitChildDL APPLET+instance AdmitChildDIV APPLET+instance AdmitChildCENTER APPLET+instance AdmitChildNOSCRIPT APPLET+instance AdmitChildNOFRAMES APPLET+instance AdmitChildBLOCKQUOTE APPLET+instance AdmitChildFORM APPLET+instance AdmitChildISINDEX APPLET+instance AdmitChildHR APPLET+instance AdmitChildTABLE APPLET+instance AdmitChildFIELDSET APPLET+instance AdmitChildADDRESS APPLET+instance AdmitChildCDATA APPLET+instance AdmitChildTT APPLET+instance AdmitChildI APPLET+instance AdmitChildB APPLET+instance AdmitChildU APPLET+instance AdmitChildS APPLET+instance AdmitChildSTRIKE APPLET+instance AdmitChildBIG APPLET+instance AdmitChildSMALL APPLET+instance AdmitChildEM APPLET+instance AdmitChildSTRONG APPLET+instance AdmitChildDFN APPLET+instance AdmitChildCODE APPLET+instance AdmitChildSAMP APPLET+instance AdmitChildKBD APPLET+instance AdmitChildVAR APPLET+instance AdmitChildCITE APPLET+instance AdmitChildABBR APPLET+instance AdmitChildACRONYM APPLET+instance AdmitChildA APPLET+instance AdmitChildIMG APPLET+instance AdmitChildAPPLET APPLET+instance AdmitChildOBJECT APPLET+instance AdmitChildFONT APPLET+instance AdmitChildBASEFONT APPLET+instance AdmitChildBR APPLET+instance AdmitChildSCRIPT APPLET+instance AdmitChildMAP APPLET+instance AdmitChildQ APPLET+instance AdmitChildSUB APPLET+instance AdmitChildSUP APPLET+instance AdmitChildSPAN APPLET+instance AdmitChildBDO APPLET+instance AdmitChildIFRAME APPLET+instance AdmitChildINPUT APPLET+instance AdmitChildSELECT APPLET+instance AdmitChildTEXTAREA APPLET+instance AdmitChildLABEL APPLET+instance AdmitChildBUTTON APPLET+instance TAG PARAM where make = make_empty+instance TAG OBJECT+instance AdmitChildPARAM OBJECT+instance AdmitChildP OBJECT+instance AdmitChildH1 OBJECT+instance AdmitChildH2 OBJECT+instance AdmitChildH3 OBJECT+instance AdmitChildH4 OBJECT+instance AdmitChildH5 OBJECT+instance AdmitChildH6 OBJECT+instance AdmitChildUL OBJECT+instance AdmitChildOL OBJECT+instance AdmitChildDIR OBJECT+instance AdmitChildMENU OBJECT+instance AdmitChildPRE OBJECT+instance AdmitChildDL OBJECT+instance AdmitChildDIV OBJECT+instance AdmitChildCENTER OBJECT+instance AdmitChildNOSCRIPT OBJECT+instance AdmitChildNOFRAMES OBJECT+instance AdmitChildBLOCKQUOTE OBJECT+instance AdmitChildFORM OBJECT+instance AdmitChildISINDEX OBJECT+instance AdmitChildHR OBJECT+instance AdmitChildTABLE OBJECT+instance AdmitChildFIELDSET OBJECT+instance AdmitChildADDRESS OBJECT+instance AdmitChildCDATA OBJECT+instance AdmitChildTT OBJECT+instance AdmitChildI OBJECT+instance AdmitChildB OBJECT+instance AdmitChildU OBJECT+instance AdmitChildS OBJECT+instance AdmitChildSTRIKE OBJECT+instance AdmitChildBIG OBJECT+instance AdmitChildSMALL OBJECT+instance AdmitChildEM OBJECT+instance AdmitChildSTRONG OBJECT+instance AdmitChildDFN OBJECT+instance AdmitChildCODE OBJECT+instance AdmitChildSAMP OBJECT+instance AdmitChildKBD OBJECT+instance AdmitChildVAR OBJECT+instance AdmitChildCITE OBJECT+instance AdmitChildABBR OBJECT+instance AdmitChildACRONYM OBJECT+instance AdmitChildA OBJECT+instance AdmitChildIMG OBJECT+instance AdmitChildAPPLET OBJECT+instance AdmitChildOBJECT OBJECT+instance AdmitChildFONT OBJECT+instance AdmitChildBASEFONT OBJECT+instance AdmitChildBR OBJECT+instance AdmitChildSCRIPT OBJECT+instance AdmitChildMAP OBJECT+instance AdmitChildQ OBJECT+instance AdmitChildSUB OBJECT+instance AdmitChildSUP OBJECT+instance AdmitChildSPAN OBJECT+instance AdmitChildBDO OBJECT+instance AdmitChildIFRAME OBJECT+instance AdmitChildINPUT OBJECT+instance AdmitChildSELECT OBJECT+instance AdmitChildTEXTAREA OBJECT+instance AdmitChildLABEL OBJECT+instance AdmitChildBUTTON OBJECT+instance TAG IMG where make = make_empty+instance TAG LINK where make = make_empty+instance TAG AREA where make = make_empty+instance TAG MAP+instance AdmitChildP MAP+instance AdmitChildH1 MAP+instance AdmitChildH2 MAP+instance AdmitChildH3 MAP+instance AdmitChildH4 MAP+instance AdmitChildH5 MAP+instance AdmitChildH6 MAP+instance AdmitChildUL MAP+instance AdmitChildOL MAP+instance AdmitChildDIR MAP+instance AdmitChildMENU MAP+instance AdmitChildPRE MAP+instance AdmitChildDL MAP+instance AdmitChildDIV MAP+instance AdmitChildCENTER MAP+instance AdmitChildNOSCRIPT MAP+instance AdmitChildNOFRAMES MAP+instance AdmitChildBLOCKQUOTE MAP+instance AdmitChildFORM MAP+instance AdmitChildISINDEX MAP+instance AdmitChildHR MAP+instance AdmitChildTABLE MAP+instance AdmitChildFIELDSET MAP+instance AdmitChildADDRESS MAP+instance AdmitChildAREA MAP+instance TAG A+instance AdmitChildCDATA A+instance AdmitChildTT A+instance AdmitChildI A+instance AdmitChildB A+instance AdmitChildU A+instance AdmitChildS A+instance AdmitChildSTRIKE A+instance AdmitChildBIG A+instance AdmitChildSMALL A+instance AdmitChildEM A+instance AdmitChildSTRONG A+instance AdmitChildDFN A+instance AdmitChildCODE A+instance AdmitChildSAMP A+instance AdmitChildKBD A+instance AdmitChildVAR A+instance AdmitChildCITE A+instance AdmitChildABBR A+instance AdmitChildACRONYM A+instance AdmitChildIMG A+instance AdmitChildAPPLET A+instance AdmitChildOBJECT A+instance AdmitChildFONT A+instance AdmitChildBASEFONT A+instance AdmitChildBR A+instance AdmitChildSCRIPT A+instance AdmitChildMAP A+instance AdmitChildQ A+instance AdmitChildSUB A+instance AdmitChildSUP A+instance AdmitChildSPAN A+instance AdmitChildBDO A+instance AdmitChildIFRAME A+instance AdmitChildINPUT A+instance AdmitChildSELECT A+instance AdmitChildTEXTAREA A+instance AdmitChildLABEL A+instance AdmitChildBUTTON A+instance TAG CENTER+instance AdmitChildP CENTER+instance AdmitChildH1 CENTER+instance AdmitChildH2 CENTER+instance AdmitChildH3 CENTER+instance AdmitChildH4 CENTER+instance AdmitChildH5 CENTER+instance AdmitChildH6 CENTER+instance AdmitChildUL CENTER+instance AdmitChildOL CENTER+instance AdmitChildDIR CENTER+instance AdmitChildMENU CENTER+instance AdmitChildPRE CENTER+instance AdmitChildDL CENTER+instance AdmitChildDIV CENTER+instance AdmitChildCENTER CENTER+instance AdmitChildNOSCRIPT CENTER+instance AdmitChildNOFRAMES CENTER+instance AdmitChildBLOCKQUOTE CENTER+instance AdmitChildFORM CENTER+instance AdmitChildISINDEX CENTER+instance AdmitChildHR CENTER+instance AdmitChildTABLE CENTER+instance AdmitChildFIELDSET CENTER+instance AdmitChildADDRESS CENTER+instance AdmitChildCDATA CENTER+instance AdmitChildTT CENTER+instance AdmitChildI CENTER+instance AdmitChildB CENTER+instance AdmitChildU CENTER+instance AdmitChildS CENTER+instance AdmitChildSTRIKE CENTER+instance AdmitChildBIG CENTER+instance AdmitChildSMALL CENTER+instance AdmitChildEM CENTER+instance AdmitChildSTRONG CENTER+instance AdmitChildDFN CENTER+instance AdmitChildCODE CENTER+instance AdmitChildSAMP CENTER+instance AdmitChildKBD CENTER+instance AdmitChildVAR CENTER+instance AdmitChildCITE CENTER+instance AdmitChildABBR CENTER+instance AdmitChildACRONYM CENTER+instance AdmitChildA CENTER+instance AdmitChildIMG CENTER+instance AdmitChildAPPLET CENTER+instance AdmitChildOBJECT CENTER+instance AdmitChildFONT CENTER+instance AdmitChildBASEFONT CENTER+instance AdmitChildBR CENTER+instance AdmitChildSCRIPT CENTER+instance AdmitChildMAP CENTER+instance AdmitChildQ CENTER+instance AdmitChildSUB CENTER+instance AdmitChildSUP CENTER+instance AdmitChildSPAN CENTER+instance AdmitChildBDO CENTER+instance AdmitChildIFRAME CENTER+instance AdmitChildINPUT CENTER+instance AdmitChildSELECT CENTER+instance AdmitChildTEXTAREA CENTER+instance AdmitChildLABEL CENTER+instance AdmitChildBUTTON CENTER+instance TAG DIV+instance AdmitChildP DIV+instance AdmitChildH1 DIV+instance AdmitChildH2 DIV+instance AdmitChildH3 DIV+instance AdmitChildH4 DIV+instance AdmitChildH5 DIV+instance AdmitChildH6 DIV+instance AdmitChildUL DIV+instance AdmitChildOL DIV+instance AdmitChildDIR DIV+instance AdmitChildMENU DIV+instance AdmitChildPRE DIV+instance AdmitChildDL DIV+instance AdmitChildDIV DIV+instance AdmitChildCENTER DIV+instance AdmitChildNOSCRIPT DIV+instance AdmitChildNOFRAMES DIV+instance AdmitChildBLOCKQUOTE DIV+instance AdmitChildFORM DIV+instance AdmitChildISINDEX DIV+instance AdmitChildHR DIV+instance AdmitChildTABLE DIV+instance AdmitChildFIELDSET DIV+instance AdmitChildADDRESS DIV+instance AdmitChildCDATA DIV+instance AdmitChildTT DIV+instance AdmitChildI DIV+instance AdmitChildB DIV+instance AdmitChildU DIV+instance AdmitChildS DIV+instance AdmitChildSTRIKE DIV+instance AdmitChildBIG DIV+instance AdmitChildSMALL DIV+instance AdmitChildEM DIV+instance AdmitChildSTRONG DIV+instance AdmitChildDFN DIV+instance AdmitChildCODE DIV+instance AdmitChildSAMP DIV+instance AdmitChildKBD DIV+instance AdmitChildVAR DIV+instance AdmitChildCITE DIV+instance AdmitChildABBR DIV+instance AdmitChildACRONYM DIV+instance AdmitChildA DIV+instance AdmitChildIMG DIV+instance AdmitChildAPPLET DIV+instance AdmitChildOBJECT DIV+instance AdmitChildFONT DIV+instance AdmitChildBASEFONT DIV+instance AdmitChildBR DIV+instance AdmitChildSCRIPT DIV+instance AdmitChildMAP DIV+instance AdmitChildQ DIV+instance AdmitChildSUB DIV+instance AdmitChildSUP DIV+instance AdmitChildSPAN DIV+instance AdmitChildBDO DIV+instance AdmitChildIFRAME DIV+instance AdmitChildINPUT DIV+instance AdmitChildSELECT DIV+instance AdmitChildTEXTAREA DIV+instance AdmitChildLABEL DIV+instance AdmitChildBUTTON DIV+instance TAG ADDRESS+instance AdmitChildCDATA ADDRESS+instance AdmitChildTT ADDRESS+instance AdmitChildI ADDRESS+instance AdmitChildB ADDRESS+instance AdmitChildU ADDRESS+instance AdmitChildS ADDRESS+instance AdmitChildSTRIKE ADDRESS+instance AdmitChildBIG ADDRESS+instance AdmitChildSMALL ADDRESS+instance AdmitChildEM ADDRESS+instance AdmitChildSTRONG ADDRESS+instance AdmitChildDFN ADDRESS+instance AdmitChildCODE ADDRESS+instance AdmitChildSAMP ADDRESS+instance AdmitChildKBD ADDRESS+instance AdmitChildVAR ADDRESS+instance AdmitChildCITE ADDRESS+instance AdmitChildABBR ADDRESS+instance AdmitChildACRONYM ADDRESS+instance AdmitChildA ADDRESS+instance AdmitChildIMG ADDRESS+instance AdmitChildAPPLET ADDRESS+instance AdmitChildOBJECT ADDRESS+instance AdmitChildFONT ADDRESS+instance AdmitChildBASEFONT ADDRESS+instance AdmitChildBR ADDRESS+instance AdmitChildSCRIPT ADDRESS+instance AdmitChildMAP ADDRESS+instance AdmitChildQ ADDRESS+instance AdmitChildSUB ADDRESS+instance AdmitChildSUP ADDRESS+instance AdmitChildSPAN ADDRESS+instance AdmitChildBDO ADDRESS+instance AdmitChildIFRAME ADDRESS+instance AdmitChildINPUT ADDRESS+instance AdmitChildSELECT ADDRESS+instance AdmitChildTEXTAREA ADDRESS+instance AdmitChildLABEL ADDRESS+instance AdmitChildBUTTON ADDRESS+instance AdmitChildP ADDRESS+instance TAG BODY+instance AdmitChildP BODY+instance AdmitChildH1 BODY+instance AdmitChildH2 BODY+instance AdmitChildH3 BODY+instance AdmitChildH4 BODY+instance AdmitChildH5 BODY+instance AdmitChildH6 BODY+instance AdmitChildUL BODY+instance AdmitChildOL BODY+instance AdmitChildDIR BODY+instance AdmitChildMENU BODY+instance AdmitChildPRE BODY+instance AdmitChildDL BODY+instance AdmitChildDIV BODY+instance AdmitChildCENTER BODY+instance AdmitChildNOSCRIPT BODY+instance AdmitChildNOFRAMES BODY+instance AdmitChildBLOCKQUOTE BODY+instance AdmitChildFORM BODY+instance AdmitChildISINDEX BODY+instance AdmitChildHR BODY+instance AdmitChildTABLE BODY+instance AdmitChildFIELDSET BODY+instance AdmitChildADDRESS BODY+instance AdmitChildCDATA BODY+instance AdmitChildTT BODY+instance AdmitChildI BODY+instance AdmitChildB BODY+instance AdmitChildU BODY+instance AdmitChildS BODY+instance AdmitChildSTRIKE BODY+instance AdmitChildBIG BODY+instance AdmitChildSMALL BODY+instance AdmitChildEM BODY+instance AdmitChildSTRONG BODY+instance AdmitChildDFN BODY+instance AdmitChildCODE BODY+instance AdmitChildSAMP BODY+instance AdmitChildKBD BODY+instance AdmitChildVAR BODY+instance AdmitChildCITE BODY+instance AdmitChildABBR BODY+instance AdmitChildACRONYM BODY+instance AdmitChildA BODY+instance AdmitChildIMG BODY+instance AdmitChildAPPLET BODY+instance AdmitChildOBJECT BODY+instance AdmitChildFONT BODY+instance AdmitChildBASEFONT BODY+instance AdmitChildBR BODY+instance AdmitChildSCRIPT BODY+instance AdmitChildMAP BODY+instance AdmitChildQ BODY+instance AdmitChildSUB BODY+instance AdmitChildSUP BODY+instance AdmitChildSPAN BODY+instance AdmitChildBDO BODY+instance AdmitChildIFRAME BODY+instance AdmitChildINPUT BODY+instance AdmitChildSELECT BODY+instance AdmitChildTEXTAREA BODY+instance AdmitChildLABEL BODY+instance AdmitChildBUTTON BODY+instance AdmitChildINS BODY+instance AdmitChildDEL BODY+instance TAG BR where make = make_empty+instance TAG FONT+instance AdmitChildCDATA FONT+instance AdmitChildTT FONT+instance AdmitChildI FONT+instance AdmitChildB FONT+instance AdmitChildU FONT+instance AdmitChildS FONT+instance AdmitChildSTRIKE FONT+instance AdmitChildBIG FONT+instance AdmitChildSMALL FONT+instance AdmitChildEM FONT+instance AdmitChildSTRONG FONT+instance AdmitChildDFN FONT+instance AdmitChildCODE FONT+instance AdmitChildSAMP FONT+instance AdmitChildKBD FONT+instance AdmitChildVAR FONT+instance AdmitChildCITE FONT+instance AdmitChildABBR FONT+instance AdmitChildACRONYM FONT+instance AdmitChildA FONT+instance AdmitChildIMG FONT+instance AdmitChildAPPLET FONT+instance AdmitChildOBJECT FONT+instance AdmitChildFONT FONT+instance AdmitChildBASEFONT FONT+instance AdmitChildBR FONT+instance AdmitChildSCRIPT FONT+instance AdmitChildMAP FONT+instance AdmitChildQ FONT+instance AdmitChildSUB FONT+instance AdmitChildSUP FONT+instance AdmitChildSPAN FONT+instance AdmitChildBDO FONT+instance AdmitChildIFRAME FONT+instance AdmitChildINPUT FONT+instance AdmitChildSELECT FONT+instance AdmitChildTEXTAREA FONT+instance AdmitChildLABEL FONT+instance AdmitChildBUTTON FONT+instance TAG BASEFONT where make = make_empty+instance TAG BDO+instance AdmitChildCDATA BDO+instance AdmitChildTT BDO+instance AdmitChildI BDO+instance AdmitChildB BDO+instance AdmitChildU BDO+instance AdmitChildS BDO+instance AdmitChildSTRIKE BDO+instance AdmitChildBIG BDO+instance AdmitChildSMALL BDO+instance AdmitChildEM BDO+instance AdmitChildSTRONG BDO+instance AdmitChildDFN BDO+instance AdmitChildCODE BDO+instance AdmitChildSAMP BDO+instance AdmitChildKBD BDO+instance AdmitChildVAR BDO+instance AdmitChildCITE BDO+instance AdmitChildABBR BDO+instance AdmitChildACRONYM BDO+instance AdmitChildA BDO+instance AdmitChildIMG BDO+instance AdmitChildAPPLET BDO+instance AdmitChildOBJECT BDO+instance AdmitChildFONT BDO+instance AdmitChildBASEFONT BDO+instance AdmitChildBR BDO+instance AdmitChildSCRIPT BDO+instance AdmitChildMAP BDO+instance AdmitChildQ BDO+instance AdmitChildSUB BDO+instance AdmitChildSUP BDO+instance AdmitChildSPAN BDO+instance AdmitChildBDO BDO+instance AdmitChildIFRAME BDO+instance AdmitChildINPUT BDO+instance AdmitChildSELECT BDO+instance AdmitChildTEXTAREA BDO+instance AdmitChildLABEL BDO+instance AdmitChildBUTTON BDO+instance TAG SPAN+instance AdmitChildCDATA SPAN+instance AdmitChildTT SPAN+instance AdmitChildI SPAN+instance AdmitChildB SPAN+instance AdmitChildU SPAN+instance AdmitChildS SPAN+instance AdmitChildSTRIKE SPAN+instance AdmitChildBIG SPAN+instance AdmitChildSMALL SPAN+instance AdmitChildEM SPAN+instance AdmitChildSTRONG SPAN+instance AdmitChildDFN SPAN+instance AdmitChildCODE SPAN+instance AdmitChildSAMP SPAN+instance AdmitChildKBD SPAN+instance AdmitChildVAR SPAN+instance AdmitChildCITE SPAN+instance AdmitChildABBR SPAN+instance AdmitChildACRONYM SPAN+instance AdmitChildA SPAN+instance AdmitChildIMG SPAN+instance AdmitChildAPPLET SPAN+instance AdmitChildOBJECT SPAN+instance AdmitChildFONT SPAN+instance AdmitChildBASEFONT SPAN+instance AdmitChildBR SPAN+instance AdmitChildSCRIPT SPAN+instance AdmitChildMAP SPAN+instance AdmitChildQ SPAN+instance AdmitChildSUB SPAN+instance AdmitChildSUP SPAN+instance AdmitChildSPAN SPAN+instance AdmitChildBDO SPAN+instance AdmitChildIFRAME SPAN+instance AdmitChildINPUT SPAN+instance AdmitChildSELECT SPAN+instance AdmitChildTEXTAREA SPAN+instance AdmitChildLABEL SPAN+instance AdmitChildBUTTON SPAN+instance TAG SUB+instance AdmitChildCDATA SUB+instance AdmitChildTT SUB+instance AdmitChildI SUB+instance AdmitChildB SUB+instance AdmitChildU SUB+instance AdmitChildS SUB+instance AdmitChildSTRIKE SUB+instance AdmitChildBIG SUB+instance AdmitChildSMALL SUB+instance AdmitChildEM SUB+instance AdmitChildSTRONG SUB+instance AdmitChildDFN SUB+instance AdmitChildCODE SUB+instance AdmitChildSAMP SUB+instance AdmitChildKBD SUB+instance AdmitChildVAR SUB+instance AdmitChildCITE SUB+instance AdmitChildABBR SUB+instance AdmitChildACRONYM SUB+instance AdmitChildA SUB+instance AdmitChildIMG SUB+instance AdmitChildAPPLET SUB+instance AdmitChildOBJECT SUB+instance AdmitChildFONT SUB+instance AdmitChildBASEFONT SUB+instance AdmitChildBR SUB+instance AdmitChildSCRIPT SUB+instance AdmitChildMAP SUB+instance AdmitChildQ SUB+instance AdmitChildSUB SUB+instance AdmitChildSUP SUB+instance AdmitChildSPAN SUB+instance AdmitChildBDO SUB+instance AdmitChildIFRAME SUB+instance AdmitChildINPUT SUB+instance AdmitChildSELECT SUB+instance AdmitChildTEXTAREA SUB+instance AdmitChildLABEL SUB+instance AdmitChildBUTTON SUB+instance TAG SUP+instance AdmitChildCDATA SUP+instance AdmitChildTT SUP+instance AdmitChildI SUP+instance AdmitChildB SUP+instance AdmitChildU SUP+instance AdmitChildS SUP+instance AdmitChildSTRIKE SUP+instance AdmitChildBIG SUP+instance AdmitChildSMALL SUP+instance AdmitChildEM SUP+instance AdmitChildSTRONG SUP+instance AdmitChildDFN SUP+instance AdmitChildCODE SUP+instance AdmitChildSAMP SUP+instance AdmitChildKBD SUP+instance AdmitChildVAR SUP+instance AdmitChildCITE SUP+instance AdmitChildABBR SUP+instance AdmitChildACRONYM SUP+instance AdmitChildA SUP+instance AdmitChildIMG SUP+instance AdmitChildAPPLET SUP+instance AdmitChildOBJECT SUP+instance AdmitChildFONT SUP+instance AdmitChildBASEFONT SUP+instance AdmitChildBR SUP+instance AdmitChildSCRIPT SUP+instance AdmitChildMAP SUP+instance AdmitChildQ SUP+instance AdmitChildSUB SUP+instance AdmitChildSUP SUP+instance AdmitChildSPAN SUP+instance AdmitChildBDO SUP+instance AdmitChildIFRAME SUP+instance AdmitChildINPUT SUP+instance AdmitChildSELECT SUP+instance AdmitChildTEXTAREA SUP+instance AdmitChildLABEL SUP+instance AdmitChildBUTTON SUP+instance TAG TT+instance AdmitChildCDATA TT+instance AdmitChildTT TT+instance AdmitChildI TT+instance AdmitChildB TT+instance AdmitChildU TT+instance AdmitChildS TT+instance AdmitChildSTRIKE TT+instance AdmitChildBIG TT+instance AdmitChildSMALL TT+instance AdmitChildEM TT+instance AdmitChildSTRONG TT+instance AdmitChildDFN TT+instance AdmitChildCODE TT+instance AdmitChildSAMP TT+instance AdmitChildKBD TT+instance AdmitChildVAR TT+instance AdmitChildCITE TT+instance AdmitChildABBR TT+instance AdmitChildACRONYM TT+instance AdmitChildA TT+instance AdmitChildIMG TT+instance AdmitChildAPPLET TT+instance AdmitChildOBJECT TT+instance AdmitChildFONT TT+instance AdmitChildBASEFONT TT+instance AdmitChildBR TT+instance AdmitChildSCRIPT TT+instance AdmitChildMAP TT+instance AdmitChildQ TT+instance AdmitChildSUB TT+instance AdmitChildSUP TT+instance AdmitChildSPAN TT+instance AdmitChildBDO TT+instance AdmitChildIFRAME TT+instance AdmitChildINPUT TT+instance AdmitChildSELECT TT+instance AdmitChildTEXTAREA TT+instance AdmitChildLABEL TT+instance AdmitChildBUTTON TT+instance TAG I+instance AdmitChildCDATA I+instance AdmitChildTT I+instance AdmitChildI I+instance AdmitChildB I+instance AdmitChildU I+instance AdmitChildS I+instance AdmitChildSTRIKE I+instance AdmitChildBIG I+instance AdmitChildSMALL I+instance AdmitChildEM I+instance AdmitChildSTRONG I+instance AdmitChildDFN I+instance AdmitChildCODE I+instance AdmitChildSAMP I+instance AdmitChildKBD I+instance AdmitChildVAR I+instance AdmitChildCITE I+instance AdmitChildABBR I+instance AdmitChildACRONYM I+instance AdmitChildA I+instance AdmitChildIMG I+instance AdmitChildAPPLET I+instance AdmitChildOBJECT I+instance AdmitChildFONT I+instance AdmitChildBASEFONT I+instance AdmitChildBR I+instance AdmitChildSCRIPT I+instance AdmitChildMAP I+instance AdmitChildQ I+instance AdmitChildSUB I+instance AdmitChildSUP I+instance AdmitChildSPAN I+instance AdmitChildBDO I+instance AdmitChildIFRAME I+instance AdmitChildINPUT I+instance AdmitChildSELECT I+instance AdmitChildTEXTAREA I+instance AdmitChildLABEL I+instance AdmitChildBUTTON I+instance TAG B+instance AdmitChildCDATA B+instance AdmitChildTT B+instance AdmitChildI B+instance AdmitChildB B+instance AdmitChildU B+instance AdmitChildS B+instance AdmitChildSTRIKE B+instance AdmitChildBIG B+instance AdmitChildSMALL B+instance AdmitChildEM B+instance AdmitChildSTRONG B+instance AdmitChildDFN B+instance AdmitChildCODE B+instance AdmitChildSAMP B+instance AdmitChildKBD B+instance AdmitChildVAR B+instance AdmitChildCITE B+instance AdmitChildABBR B+instance AdmitChildACRONYM B+instance AdmitChildA B+instance AdmitChildIMG B+instance AdmitChildAPPLET B+instance AdmitChildOBJECT B+instance AdmitChildFONT B+instance AdmitChildBASEFONT B+instance AdmitChildBR B+instance AdmitChildSCRIPT B+instance AdmitChildMAP B+instance AdmitChildQ B+instance AdmitChildSUB B+instance AdmitChildSUP B+instance AdmitChildSPAN B+instance AdmitChildBDO B+instance AdmitChildIFRAME B+instance AdmitChildINPUT B+instance AdmitChildSELECT B+instance AdmitChildTEXTAREA B+instance AdmitChildLABEL B+instance AdmitChildBUTTON B+instance TAG U+instance AdmitChildCDATA U+instance AdmitChildTT U+instance AdmitChildI U+instance AdmitChildB U+instance AdmitChildU U+instance AdmitChildS U+instance AdmitChildSTRIKE U+instance AdmitChildBIG U+instance AdmitChildSMALL U+instance AdmitChildEM U+instance AdmitChildSTRONG U+instance AdmitChildDFN U+instance AdmitChildCODE U+instance AdmitChildSAMP U+instance AdmitChildKBD U+instance AdmitChildVAR U+instance AdmitChildCITE U+instance AdmitChildABBR U+instance AdmitChildACRONYM U+instance AdmitChildA U+instance AdmitChildIMG U+instance AdmitChildAPPLET U+instance AdmitChildOBJECT U+instance AdmitChildFONT U+instance AdmitChildBASEFONT U+instance AdmitChildBR U+instance AdmitChildSCRIPT U+instance AdmitChildMAP U+instance AdmitChildQ U+instance AdmitChildSUB U+instance AdmitChildSUP U+instance AdmitChildSPAN U+instance AdmitChildBDO U+instance AdmitChildIFRAME U+instance AdmitChildINPUT U+instance AdmitChildSELECT U+instance AdmitChildTEXTAREA U+instance AdmitChildLABEL U+instance AdmitChildBUTTON U+instance TAG S+instance AdmitChildCDATA S+instance AdmitChildTT S+instance AdmitChildI S+instance AdmitChildB S+instance AdmitChildU S+instance AdmitChildS S+instance AdmitChildSTRIKE S+instance AdmitChildBIG S+instance AdmitChildSMALL S+instance AdmitChildEM S+instance AdmitChildSTRONG S+instance AdmitChildDFN S+instance AdmitChildCODE S+instance AdmitChildSAMP S+instance AdmitChildKBD S+instance AdmitChildVAR S+instance AdmitChildCITE S+instance AdmitChildABBR S+instance AdmitChildACRONYM S+instance AdmitChildA S+instance AdmitChildIMG S+instance AdmitChildAPPLET S+instance AdmitChildOBJECT S+instance AdmitChildFONT S+instance AdmitChildBASEFONT S+instance AdmitChildBR S+instance AdmitChildSCRIPT S+instance AdmitChildMAP S+instance AdmitChildQ S+instance AdmitChildSUB S+instance AdmitChildSUP S+instance AdmitChildSPAN S+instance AdmitChildBDO S+instance AdmitChildIFRAME S+instance AdmitChildINPUT S+instance AdmitChildSELECT S+instance AdmitChildTEXTAREA S+instance AdmitChildLABEL S+instance AdmitChildBUTTON S+instance TAG STRIKE+instance AdmitChildCDATA STRIKE+instance AdmitChildTT STRIKE+instance AdmitChildI STRIKE+instance AdmitChildB STRIKE+instance AdmitChildU STRIKE+instance AdmitChildS STRIKE+instance AdmitChildSTRIKE STRIKE+instance AdmitChildBIG STRIKE+instance AdmitChildSMALL STRIKE+instance AdmitChildEM STRIKE+instance AdmitChildSTRONG STRIKE+instance AdmitChildDFN STRIKE+instance AdmitChildCODE STRIKE+instance AdmitChildSAMP STRIKE+instance AdmitChildKBD STRIKE+instance AdmitChildVAR STRIKE+instance AdmitChildCITE STRIKE+instance AdmitChildABBR STRIKE+instance AdmitChildACRONYM STRIKE+instance AdmitChildA STRIKE+instance AdmitChildIMG STRIKE+instance AdmitChildAPPLET STRIKE+instance AdmitChildOBJECT STRIKE+instance AdmitChildFONT STRIKE+instance AdmitChildBASEFONT STRIKE+instance AdmitChildBR STRIKE+instance AdmitChildSCRIPT STRIKE+instance AdmitChildMAP STRIKE+instance AdmitChildQ STRIKE+instance AdmitChildSUB STRIKE+instance AdmitChildSUP STRIKE+instance AdmitChildSPAN STRIKE+instance AdmitChildBDO STRIKE+instance AdmitChildIFRAME STRIKE+instance AdmitChildINPUT STRIKE+instance AdmitChildSELECT STRIKE+instance AdmitChildTEXTAREA STRIKE+instance AdmitChildLABEL STRIKE+instance AdmitChildBUTTON STRIKE+instance TAG BIG+instance AdmitChildCDATA BIG+instance AdmitChildTT BIG+instance AdmitChildI BIG+instance AdmitChildB BIG+instance AdmitChildU BIG+instance AdmitChildS BIG+instance AdmitChildSTRIKE BIG+instance AdmitChildBIG BIG+instance AdmitChildSMALL BIG+instance AdmitChildEM BIG+instance AdmitChildSTRONG BIG+instance AdmitChildDFN BIG+instance AdmitChildCODE BIG+instance AdmitChildSAMP BIG+instance AdmitChildKBD BIG+instance AdmitChildVAR BIG+instance AdmitChildCITE BIG+instance AdmitChildABBR BIG+instance AdmitChildACRONYM BIG+instance AdmitChildA BIG+instance AdmitChildIMG BIG+instance AdmitChildAPPLET BIG+instance AdmitChildOBJECT BIG+instance AdmitChildFONT BIG+instance AdmitChildBASEFONT BIG+instance AdmitChildBR BIG+instance AdmitChildSCRIPT BIG+instance AdmitChildMAP BIG+instance AdmitChildQ BIG+instance AdmitChildSUB BIG+instance AdmitChildSUP BIG+instance AdmitChildSPAN BIG+instance AdmitChildBDO BIG+instance AdmitChildIFRAME BIG+instance AdmitChildINPUT BIG+instance AdmitChildSELECT BIG+instance AdmitChildTEXTAREA BIG+instance AdmitChildLABEL BIG+instance AdmitChildBUTTON BIG+instance TAG SMALL+instance AdmitChildCDATA SMALL+instance AdmitChildTT SMALL+instance AdmitChildI SMALL+instance AdmitChildB SMALL+instance AdmitChildU SMALL+instance AdmitChildS SMALL+instance AdmitChildSTRIKE SMALL+instance AdmitChildBIG SMALL+instance AdmitChildSMALL SMALL+instance AdmitChildEM SMALL+instance AdmitChildSTRONG SMALL+instance AdmitChildDFN SMALL+instance AdmitChildCODE SMALL+instance AdmitChildSAMP SMALL+instance AdmitChildKBD SMALL+instance AdmitChildVAR SMALL+instance AdmitChildCITE SMALL+instance AdmitChildABBR SMALL+instance AdmitChildACRONYM SMALL+instance AdmitChildA SMALL+instance AdmitChildIMG SMALL+instance AdmitChildAPPLET SMALL+instance AdmitChildOBJECT SMALL+instance AdmitChildFONT SMALL+instance AdmitChildBASEFONT SMALL+instance AdmitChildBR SMALL+instance AdmitChildSCRIPT SMALL+instance AdmitChildMAP SMALL+instance AdmitChildQ SMALL+instance AdmitChildSUB SMALL+instance AdmitChildSUP SMALL+instance AdmitChildSPAN SMALL+instance AdmitChildBDO SMALL+instance AdmitChildIFRAME SMALL+instance AdmitChildINPUT SMALL+instance AdmitChildSELECT SMALL+instance AdmitChildTEXTAREA SMALL+instance AdmitChildLABEL SMALL+instance AdmitChildBUTTON SMALL+instance TAG EM+instance AdmitChildCDATA EM+instance AdmitChildTT EM+instance AdmitChildI EM+instance AdmitChildB EM+instance AdmitChildU EM+instance AdmitChildS EM+instance AdmitChildSTRIKE EM+instance AdmitChildBIG EM+instance AdmitChildSMALL EM+instance AdmitChildEM EM+instance AdmitChildSTRONG EM+instance AdmitChildDFN EM+instance AdmitChildCODE EM+instance AdmitChildSAMP EM+instance AdmitChildKBD EM+instance AdmitChildVAR EM+instance AdmitChildCITE EM+instance AdmitChildABBR EM+instance AdmitChildACRONYM EM+instance AdmitChildA EM+instance AdmitChildIMG EM+instance AdmitChildAPPLET EM+instance AdmitChildOBJECT EM+instance AdmitChildFONT EM+instance AdmitChildBASEFONT EM+instance AdmitChildBR EM+instance AdmitChildSCRIPT EM+instance AdmitChildMAP EM+instance AdmitChildQ EM+instance AdmitChildSUB EM+instance AdmitChildSUP EM+instance AdmitChildSPAN EM+instance AdmitChildBDO EM+instance AdmitChildIFRAME EM+instance AdmitChildINPUT EM+instance AdmitChildSELECT EM+instance AdmitChildTEXTAREA EM+instance AdmitChildLABEL EM+instance AdmitChildBUTTON EM+instance TAG STRONG+instance AdmitChildCDATA STRONG+instance AdmitChildTT STRONG+instance AdmitChildI STRONG+instance AdmitChildB STRONG+instance AdmitChildU STRONG+instance AdmitChildS STRONG+instance AdmitChildSTRIKE STRONG+instance AdmitChildBIG STRONG+instance AdmitChildSMALL STRONG+instance AdmitChildEM STRONG+instance AdmitChildSTRONG STRONG+instance AdmitChildDFN STRONG+instance AdmitChildCODE STRONG+instance AdmitChildSAMP STRONG+instance AdmitChildKBD STRONG+instance AdmitChildVAR STRONG+instance AdmitChildCITE STRONG+instance AdmitChildABBR STRONG+instance AdmitChildACRONYM STRONG+instance AdmitChildA STRONG+instance AdmitChildIMG STRONG+instance AdmitChildAPPLET STRONG+instance AdmitChildOBJECT STRONG+instance AdmitChildFONT STRONG+instance AdmitChildBASEFONT STRONG+instance AdmitChildBR STRONG+instance AdmitChildSCRIPT STRONG+instance AdmitChildMAP STRONG+instance AdmitChildQ STRONG+instance AdmitChildSUB STRONG+instance AdmitChildSUP STRONG+instance AdmitChildSPAN STRONG+instance AdmitChildBDO STRONG+instance AdmitChildIFRAME STRONG+instance AdmitChildINPUT STRONG+instance AdmitChildSELECT STRONG+instance AdmitChildTEXTAREA STRONG+instance AdmitChildLABEL STRONG+instance AdmitChildBUTTON STRONG+instance TAG DFN+instance AdmitChildCDATA DFN+instance AdmitChildTT DFN+instance AdmitChildI DFN+instance AdmitChildB DFN+instance AdmitChildU DFN+instance AdmitChildS DFN+instance AdmitChildSTRIKE DFN+instance AdmitChildBIG DFN+instance AdmitChildSMALL DFN+instance AdmitChildEM DFN+instance AdmitChildSTRONG DFN+instance AdmitChildDFN DFN+instance AdmitChildCODE DFN+instance AdmitChildSAMP DFN+instance AdmitChildKBD DFN+instance AdmitChildVAR DFN+instance AdmitChildCITE DFN+instance AdmitChildABBR DFN+instance AdmitChildACRONYM DFN+instance AdmitChildA DFN+instance AdmitChildIMG DFN+instance AdmitChildAPPLET DFN+instance AdmitChildOBJECT DFN+instance AdmitChildFONT DFN+instance AdmitChildBASEFONT DFN+instance AdmitChildBR DFN+instance AdmitChildSCRIPT DFN+instance AdmitChildMAP DFN+instance AdmitChildQ DFN+instance AdmitChildSUB DFN+instance AdmitChildSUP DFN+instance AdmitChildSPAN DFN+instance AdmitChildBDO DFN+instance AdmitChildIFRAME DFN+instance AdmitChildINPUT DFN+instance AdmitChildSELECT DFN+instance AdmitChildTEXTAREA DFN+instance AdmitChildLABEL DFN+instance AdmitChildBUTTON DFN+instance TAG CODE+instance AdmitChildCDATA CODE+instance AdmitChildTT CODE+instance AdmitChildI CODE+instance AdmitChildB CODE+instance AdmitChildU CODE+instance AdmitChildS CODE+instance AdmitChildSTRIKE CODE+instance AdmitChildBIG CODE+instance AdmitChildSMALL CODE+instance AdmitChildEM CODE+instance AdmitChildSTRONG CODE+instance AdmitChildDFN CODE+instance AdmitChildCODE CODE+instance AdmitChildSAMP CODE+instance AdmitChildKBD CODE+instance AdmitChildVAR CODE+instance AdmitChildCITE CODE+instance AdmitChildABBR CODE+instance AdmitChildACRONYM CODE+instance AdmitChildA CODE+instance AdmitChildIMG CODE+instance AdmitChildAPPLET CODE+instance AdmitChildOBJECT CODE+instance AdmitChildFONT CODE+instance AdmitChildBASEFONT CODE+instance AdmitChildBR CODE+instance AdmitChildSCRIPT CODE+instance AdmitChildMAP CODE+instance AdmitChildQ CODE+instance AdmitChildSUB CODE+instance AdmitChildSUP CODE+instance AdmitChildSPAN CODE+instance AdmitChildBDO CODE+instance AdmitChildIFRAME CODE+instance AdmitChildINPUT CODE+instance AdmitChildSELECT CODE+instance AdmitChildTEXTAREA CODE+instance AdmitChildLABEL CODE+instance AdmitChildBUTTON CODE+instance TAG SAMP+instance AdmitChildCDATA SAMP+instance AdmitChildTT SAMP+instance AdmitChildI SAMP+instance AdmitChildB SAMP+instance AdmitChildU SAMP+instance AdmitChildS SAMP+instance AdmitChildSTRIKE SAMP+instance AdmitChildBIG SAMP+instance AdmitChildSMALL SAMP+instance AdmitChildEM SAMP+instance AdmitChildSTRONG SAMP+instance AdmitChildDFN SAMP+instance AdmitChildCODE SAMP+instance AdmitChildSAMP SAMP+instance AdmitChildKBD SAMP+instance AdmitChildVAR SAMP+instance AdmitChildCITE SAMP+instance AdmitChildABBR SAMP+instance AdmitChildACRONYM SAMP+instance AdmitChildA SAMP+instance AdmitChildIMG SAMP+instance AdmitChildAPPLET SAMP+instance AdmitChildOBJECT SAMP+instance AdmitChildFONT SAMP+instance AdmitChildBASEFONT SAMP+instance AdmitChildBR SAMP+instance AdmitChildSCRIPT SAMP+instance AdmitChildMAP SAMP+instance AdmitChildQ SAMP+instance AdmitChildSUB SAMP+instance AdmitChildSUP SAMP+instance AdmitChildSPAN SAMP+instance AdmitChildBDO SAMP+instance AdmitChildIFRAME SAMP+instance AdmitChildINPUT SAMP+instance AdmitChildSELECT SAMP+instance AdmitChildTEXTAREA SAMP+instance AdmitChildLABEL SAMP+instance AdmitChildBUTTON SAMP+instance TAG KBD+instance AdmitChildCDATA KBD+instance AdmitChildTT KBD+instance AdmitChildI KBD+instance AdmitChildB KBD+instance AdmitChildU KBD+instance AdmitChildS KBD+instance AdmitChildSTRIKE KBD+instance AdmitChildBIG KBD+instance AdmitChildSMALL KBD+instance AdmitChildEM KBD+instance AdmitChildSTRONG KBD+instance AdmitChildDFN KBD+instance AdmitChildCODE KBD+instance AdmitChildSAMP KBD+instance AdmitChildKBD KBD+instance AdmitChildVAR KBD+instance AdmitChildCITE KBD+instance AdmitChildABBR KBD+instance AdmitChildACRONYM KBD+instance AdmitChildA KBD+instance AdmitChildIMG KBD+instance AdmitChildAPPLET KBD+instance AdmitChildOBJECT KBD+instance AdmitChildFONT KBD+instance AdmitChildBASEFONT KBD+instance AdmitChildBR KBD+instance AdmitChildSCRIPT KBD+instance AdmitChildMAP KBD+instance AdmitChildQ KBD+instance AdmitChildSUB KBD+instance AdmitChildSUP KBD+instance AdmitChildSPAN KBD+instance AdmitChildBDO KBD+instance AdmitChildIFRAME KBD+instance AdmitChildINPUT KBD+instance AdmitChildSELECT KBD+instance AdmitChildTEXTAREA KBD+instance AdmitChildLABEL KBD+instance AdmitChildBUTTON KBD+instance TAG VAR+instance AdmitChildCDATA VAR+instance AdmitChildTT VAR+instance AdmitChildI VAR+instance AdmitChildB VAR+instance AdmitChildU VAR+instance AdmitChildS VAR+instance AdmitChildSTRIKE VAR+instance AdmitChildBIG VAR+instance AdmitChildSMALL VAR+instance AdmitChildEM VAR+instance AdmitChildSTRONG VAR+instance AdmitChildDFN VAR+instance AdmitChildCODE VAR+instance AdmitChildSAMP VAR+instance AdmitChildKBD VAR+instance AdmitChildVAR VAR+instance AdmitChildCITE VAR+instance AdmitChildABBR VAR+instance AdmitChildACRONYM VAR+instance AdmitChildA VAR+instance AdmitChildIMG VAR+instance AdmitChildAPPLET VAR+instance AdmitChildOBJECT VAR+instance AdmitChildFONT VAR+instance AdmitChildBASEFONT VAR+instance AdmitChildBR VAR+instance AdmitChildSCRIPT VAR+instance AdmitChildMAP VAR+instance AdmitChildQ VAR+instance AdmitChildSUB VAR+instance AdmitChildSUP VAR+instance AdmitChildSPAN VAR+instance AdmitChildBDO VAR+instance AdmitChildIFRAME VAR+instance AdmitChildINPUT VAR+instance AdmitChildSELECT VAR+instance AdmitChildTEXTAREA VAR+instance AdmitChildLABEL VAR+instance AdmitChildBUTTON VAR+instance TAG CITE+instance AdmitChildCDATA CITE+instance AdmitChildTT CITE+instance AdmitChildI CITE+instance AdmitChildB CITE+instance AdmitChildU CITE+instance AdmitChildS CITE+instance AdmitChildSTRIKE CITE+instance AdmitChildBIG CITE+instance AdmitChildSMALL CITE+instance AdmitChildEM CITE+instance AdmitChildSTRONG CITE+instance AdmitChildDFN CITE+instance AdmitChildCODE CITE+instance AdmitChildSAMP CITE+instance AdmitChildKBD CITE+instance AdmitChildVAR CITE+instance AdmitChildCITE CITE+instance AdmitChildABBR CITE+instance AdmitChildACRONYM CITE+instance AdmitChildA CITE+instance AdmitChildIMG CITE+instance AdmitChildAPPLET CITE+instance AdmitChildOBJECT CITE+instance AdmitChildFONT CITE+instance AdmitChildBASEFONT CITE+instance AdmitChildBR CITE+instance AdmitChildSCRIPT CITE+instance AdmitChildMAP CITE+instance AdmitChildQ CITE+instance AdmitChildSUB CITE+instance AdmitChildSUP CITE+instance AdmitChildSPAN CITE+instance AdmitChildBDO CITE+instance AdmitChildIFRAME CITE+instance AdmitChildINPUT CITE+instance AdmitChildSELECT CITE+instance AdmitChildTEXTAREA CITE+instance AdmitChildLABEL CITE+instance AdmitChildBUTTON CITE+instance TAG ABBR+instance AdmitChildCDATA ABBR+instance AdmitChildTT ABBR+instance AdmitChildI ABBR+instance AdmitChildB ABBR+instance AdmitChildU ABBR+instance AdmitChildS ABBR+instance AdmitChildSTRIKE ABBR+instance AdmitChildBIG ABBR+instance AdmitChildSMALL ABBR+instance AdmitChildEM ABBR+instance AdmitChildSTRONG ABBR+instance AdmitChildDFN ABBR+instance AdmitChildCODE ABBR+instance AdmitChildSAMP ABBR+instance AdmitChildKBD ABBR+instance AdmitChildVAR ABBR+instance AdmitChildCITE ABBR+instance AdmitChildABBR ABBR+instance AdmitChildACRONYM ABBR+instance AdmitChildA ABBR+instance AdmitChildIMG ABBR+instance AdmitChildAPPLET ABBR+instance AdmitChildOBJECT ABBR+instance AdmitChildFONT ABBR+instance AdmitChildBASEFONT ABBR+instance AdmitChildBR ABBR+instance AdmitChildSCRIPT ABBR+instance AdmitChildMAP ABBR+instance AdmitChildQ ABBR+instance AdmitChildSUB ABBR+instance AdmitChildSUP ABBR+instance AdmitChildSPAN ABBR+instance AdmitChildBDO ABBR+instance AdmitChildIFRAME ABBR+instance AdmitChildINPUT ABBR+instance AdmitChildSELECT ABBR+instance AdmitChildTEXTAREA ABBR+instance AdmitChildLABEL ABBR+instance AdmitChildBUTTON ABBR+instance TAG ACRONYM+instance AdmitChildCDATA ACRONYM+instance AdmitChildTT ACRONYM+instance AdmitChildI ACRONYM+instance AdmitChildB ACRONYM+instance AdmitChildU ACRONYM+instance AdmitChildS ACRONYM+instance AdmitChildSTRIKE ACRONYM+instance AdmitChildBIG ACRONYM+instance AdmitChildSMALL ACRONYM+instance AdmitChildEM ACRONYM+instance AdmitChildSTRONG ACRONYM+instance AdmitChildDFN ACRONYM+instance AdmitChildCODE ACRONYM+instance AdmitChildSAMP ACRONYM+instance AdmitChildKBD ACRONYM+instance AdmitChildVAR ACRONYM+instance AdmitChildCITE ACRONYM+instance AdmitChildABBR ACRONYM+instance AdmitChildACRONYM ACRONYM+instance AdmitChildA ACRONYM+instance AdmitChildIMG ACRONYM+instance AdmitChildAPPLET ACRONYM+instance AdmitChildOBJECT ACRONYM+instance AdmitChildFONT ACRONYM+instance AdmitChildBASEFONT ACRONYM+instance AdmitChildBR ACRONYM+instance AdmitChildSCRIPT ACRONYM+instance AdmitChildMAP ACRONYM+instance AdmitChildQ ACRONYM+instance AdmitChildSUB ACRONYM+instance AdmitChildSUP ACRONYM+instance AdmitChildSPAN ACRONYM+instance AdmitChildBDO ACRONYM+instance AdmitChildIFRAME ACRONYM+instance AdmitChildINPUT ACRONYM+instance AdmitChildSELECT ACRONYM+instance AdmitChildTEXTAREA ACRONYM+instance AdmitChildLABEL ACRONYM+instance AdmitChildBUTTON ACRONYM+data ALIGN_bottom = ALIGN_bottom+data ALIGN_center = ALIGN_center+data ALIGN_char = ALIGN_char+data ALIGN_justify = ALIGN_justify+data ALIGN_left = ALIGN_left+data ALIGN_middle = ALIGN_middle+data ALIGN_right = ALIGN_right+data ALIGN_top = ALIGN_top+data CHECKED_checked = CHECKED_checked+data CLEAR_all = CLEAR_all+data CLEAR_left = CLEAR_left+data CLEAR_none = CLEAR_none+data CLEAR_right = CLEAR_right+data COMPACT_compact = COMPACT_compact+data DECLARE_declare = DECLARE_declare+data DEFER_defer = DEFER_defer+data DIR_ltr = DIR_ltr+data DIR_rtl = DIR_rtl+data DISABLED_disabled = DISABLED_disabled+data FRAME_above = FRAME_above+data FRAME_below = FRAME_below+data FRAME_border = FRAME_border+data FRAME_box = FRAME_box+data FRAME_hsides = FRAME_hsides+data FRAME_lhs = FRAME_lhs+data FRAME_rhs = FRAME_rhs+data FRAME_void = FRAME_void+data FRAME_vsides = FRAME_vsides+data ISMAP_ismap = ISMAP_ismap+data METHOD_GET = METHOD_GET+data METHOD_POST = METHOD_POST+data MULTIPLE_multiple = MULTIPLE_multiple+data NOHREF_nohref = NOHREF_nohref+data NOSHADE_noshade = NOSHADE_noshade+data NOWRAP_nowrap = NOWRAP_nowrap+data READONLY_readonly = READONLY_readonly+data RULES_all = RULES_all+data RULES_cols = RULES_cols+data RULES_groups = RULES_groups+data RULES_none = RULES_none+data RULES_rows = RULES_rows+data SCOPE_col = SCOPE_col+data SCOPE_colgroup = SCOPE_colgroup+data SCOPE_row = SCOPE_row+data SCOPE_rowgroup = SCOPE_rowgroup+data SCROLLING_auto = SCROLLING_auto+data SCROLLING_no = SCROLLING_no+data SCROLLING_yes = SCROLLING_yes+data SELECTED_selected = SELECTED_selected+data SHAPE_circle = SHAPE_circle+data SHAPE_default' = SHAPE_default'+data SHAPE_poly = SHAPE_poly+data SHAPE_rect = SHAPE_rect+data TYPE_BUTTON = TYPE_BUTTON+data TYPE_CHECKBOX = TYPE_CHECKBOX+data TYPE_FILE = TYPE_FILE+data TYPE_HIDDEN = TYPE_HIDDEN+data TYPE_IMAGE = TYPE_IMAGE+data TYPE_PASSWORD = TYPE_PASSWORD+data TYPE_RADIO = TYPE_RADIO+data TYPE_RESET = TYPE_RESET+data TYPE_SUBMIT = TYPE_SUBMIT+data TYPE_TEXT = TYPE_TEXT+data TYPE_button = TYPE_button+data TYPE_circle = TYPE_circle+data TYPE_disc = TYPE_disc+data TYPE_reset = TYPE_reset+data TYPE_square = TYPE_square+data TYPE_submit = TYPE_submit+data VALIGN_baseline = VALIGN_baseline+data VALIGN_bottom = VALIGN_bottom+data VALIGN_middle = VALIGN_middle+data VALIGN_top = VALIGN_top+data VALUETYPE_DATA = VALUETYPE_DATA+data VALUETYPE_OBJECT = VALUETYPE_OBJECT+data VALUETYPE_REF = VALUETYPE_REF+instance ATTRIBUTE ABBR+instance ATTRIBUTE ACCEPT+instance ATTRIBUTE ACCEPT_CHARSET+instance ATTRIBUTE ACCESSKEY+instance ATTRIBUTE ACTION+instance ATTRIBUTE ALIGN+instance ATTRIBUTE ALINK+instance ATTRIBUTE ALT+instance ATTRIBUTE ARCHIVE+instance ATTRIBUTE AXIS+instance ATTRIBUTE BACKGROUND+instance ATTRIBUTE BGCOLOR+instance ATTRIBUTE BORDER+instance ATTRIBUTE CELLPADDING+instance ATTRIBUTE CELLSPACING+instance ATTRIBUTE CHAR+instance ATTRIBUTE CHAROFF+instance ATTRIBUTE CHARSET+instance ATTRIBUTE CHECKED+instance ATTRIBUTE CITE+instance ATTRIBUTE CLASS+instance ATTRIBUTE CLASSID+instance ATTRIBUTE CLEAR+instance ATTRIBUTE CODE+instance ATTRIBUTE CODEBASE+instance ATTRIBUTE CODETYPE+instance ATTRIBUTE COLOR+instance ATTRIBUTE COLS+instance ATTRIBUTE COLSPAN+instance ATTRIBUTE COMPACT+instance ATTRIBUTE CONTENT+instance ATTRIBUTE COORDS+instance ATTRIBUTE DATA+instance ATTRIBUTE DATAPAGESIZE+instance ATTRIBUTE DATETIME+instance ATTRIBUTE DECLARE+instance ATTRIBUTE DEFER+instance ATTRIBUTE DIR+instance ATTRIBUTE DISABLED+instance ATTRIBUTE ENCTYPE+instance ATTRIBUTE EVENT+instance ATTRIBUTE FACE+instance ATTRIBUTE FOR+instance ATTRIBUTE FRAME+instance ATTRIBUTE FRAMEBORDER+instance ATTRIBUTE HEADERS+instance ATTRIBUTE HEIGHT+instance ATTRIBUTE HREF+instance ATTRIBUTE HREFLANG+instance ATTRIBUTE HSPACE+instance ATTRIBUTE HTTP_EQUIV+instance ATTRIBUTE ID+instance ATTRIBUTE ISMAP+instance ATTRIBUTE LABEL+instance ATTRIBUTE LANG+instance ATTRIBUTE LANGUAGE+instance ATTRIBUTE LINK+instance ATTRIBUTE LONGDESC+instance ATTRIBUTE MARGINHEIGHT+instance ATTRIBUTE MARGINWIDTH+instance ATTRIBUTE MAXLENGTH+instance ATTRIBUTE MEDIA+instance ATTRIBUTE METHOD+instance ATTRIBUTE MULTIPLE+instance ATTRIBUTE NAME+instance ATTRIBUTE NOHREF+instance ATTRIBUTE NOSHADE+instance ATTRIBUTE NOWRAP+instance ATTRIBUTE OBJECT+instance ATTRIBUTE ONBLUR+instance ATTRIBUTE ONCHANGE+instance ATTRIBUTE ONCLICK+instance ATTRIBUTE ONDBLCLICK+instance ATTRIBUTE ONFOCUS+instance ATTRIBUTE ONKEYDOWN+instance ATTRIBUTE ONKEYPRESS+instance ATTRIBUTE ONKEYUP+instance ATTRIBUTE ONLOAD+instance ATTRIBUTE ONMOUSEDOWN+instance ATTRIBUTE ONMOUSEMOVE+instance ATTRIBUTE ONMOUSEOUT+instance ATTRIBUTE ONMOUSEOVER+instance ATTRIBUTE ONMOUSEUP+instance ATTRIBUTE ONRESET+instance ATTRIBUTE ONSELECT+instance ATTRIBUTE ONSUBMIT+instance ATTRIBUTE ONUNLOAD+instance ATTRIBUTE PROFILE+instance ATTRIBUTE PROMPT+instance ATTRIBUTE READONLY+instance ATTRIBUTE REL+instance ATTRIBUTE REV+instance ATTRIBUTE ROWS+instance ATTRIBUTE ROWSPAN+instance ATTRIBUTE RULES+instance ATTRIBUTE SCHEME+instance ATTRIBUTE SCOPE+instance ATTRIBUTE SCROLLING+instance ATTRIBUTE SELECTED+instance ATTRIBUTE SHAPE+instance ATTRIBUTE SIZE+instance ATTRIBUTE SPAN+instance ATTRIBUTE SRC+instance ATTRIBUTE STANDBY+instance ATTRIBUTE START+instance ATTRIBUTE STYLE+instance ATTRIBUTE SUMMARY+instance ATTRIBUTE TABINDEX+instance ATTRIBUTE TARGET+instance ATTRIBUTE TEXT+instance ATTRIBUTE TITLE+instance ATTRIBUTE TYPE+instance ATTRIBUTE USEMAP+instance ATTRIBUTE VALIGN+instance ATTRIBUTE VALUE+instance ATTRIBUTE VALUETYPE+instance ATTRIBUTE VERSION+instance ATTRIBUTE VLINK+instance ATTRIBUTE VSPACE+instance ATTRIBUTE WIDTH+instance AttrValueABBR Char+instance AttrValueABBR a => AttrValueABBR [a]+instance AttrValueACCEPT Char+instance AttrValueACCEPT a => AttrValueACCEPT [a]+instance AttrValueACCEPT_CHARSET Char+instance AttrValueACCEPT_CHARSET a => AttrValueACCEPT_CHARSET [a]+instance AttrValueACCESSKEY Char+instance AttrValueACCESSKEY a => AttrValueACCESSKEY [a]+instance AttrValueACTION Char+instance AttrValueACTION a => AttrValueACTION [a]+instance AttrValueALIGN ALIGN_bottom+instance AttrValueALIGN ALIGN_center+instance AttrValueALIGN ALIGN_char+instance AttrValueALIGN ALIGN_justify+instance AttrValueALIGN ALIGN_left+instance AttrValueALIGN ALIGN_middle+instance AttrValueALIGN ALIGN_right+instance AttrValueALIGN ALIGN_top+instance AttrValueALINK Char+instance AttrValueALINK a => AttrValueALINK [a]+instance AttrValueALT Char+instance AttrValueALT a => AttrValueALT [a]+instance AttrValueARCHIVE Char+instance AttrValueARCHIVE a => AttrValueARCHIVE [a]+instance AttrValueAXIS Char+instance AttrValueAXIS a => AttrValueAXIS [a]+instance AttrValueBACKGROUND Char+instance AttrValueBACKGROUND a => AttrValueBACKGROUND [a]+instance AttrValueBGCOLOR Char+instance AttrValueBGCOLOR a => AttrValueBGCOLOR [a]+instance AttrValueBORDER Char+instance AttrValueBORDER a => AttrValueBORDER [a]+instance AttrValueCELLPADDING Char+instance AttrValueCELLPADDING a => AttrValueCELLPADDING [a]+instance AttrValueCELLSPACING Char+instance AttrValueCELLSPACING a => AttrValueCELLSPACING [a]+instance AttrValueCHAR Char+instance AttrValueCHAR a => AttrValueCHAR [a]+instance AttrValueCHAROFF Char+instance AttrValueCHAROFF a => AttrValueCHAROFF [a]+instance AttrValueCHARSET Char+instance AttrValueCHARSET a => AttrValueCHARSET [a]+instance AttrValueCHECKED CHECKED_checked+instance AttrValueCITE Char+instance AttrValueCITE a => AttrValueCITE [a]+instance AttrValueCLASS Char+instance AttrValueCLASS a => AttrValueCLASS [a]+instance AttrValueCLASSID Char+instance AttrValueCLASSID a => AttrValueCLASSID [a]+instance AttrValueCLEAR CLEAR_all+instance AttrValueCLEAR CLEAR_left+instance AttrValueCLEAR CLEAR_none+instance AttrValueCLEAR CLEAR_right+instance AttrValueCODE Char+instance AttrValueCODE a => AttrValueCODE [a]+instance AttrValueCODEBASE Char+instance AttrValueCODEBASE a => AttrValueCODEBASE [a]+instance AttrValueCODETYPE Char+instance AttrValueCODETYPE a => AttrValueCODETYPE [a]+instance AttrValueCOLOR Char+instance AttrValueCOLOR a => AttrValueCOLOR [a]+instance AttrValueCOLS Int+instance AttrValueCOLSPAN Int+instance AttrValueCOMPACT COMPACT_compact+instance AttrValueCONTENT Char+instance AttrValueCONTENT a => AttrValueCONTENT [a]+instance AttrValueCOORDS Char+instance AttrValueCOORDS a => AttrValueCOORDS [a]+instance AttrValueDATA Char+instance AttrValueDATA a => AttrValueDATA [a]+instance AttrValueDATAPAGESIZE Char+instance AttrValueDATAPAGESIZE a => AttrValueDATAPAGESIZE [a]+instance AttrValueDATETIME Char+instance AttrValueDATETIME a => AttrValueDATETIME [a]+instance AttrValueDECLARE DECLARE_declare+instance AttrValueDEFER DEFER_defer+instance AttrValueDIR DIR_ltr+instance AttrValueDIR DIR_rtl+instance AttrValueDISABLED DISABLED_disabled+instance AttrValueENCTYPE Char+instance AttrValueENCTYPE a => AttrValueENCTYPE [a]+instance AttrValueEVENT Char+instance AttrValueEVENT a => AttrValueEVENT [a]+instance AttrValueFACE Char+instance AttrValueFACE a => AttrValueFACE [a]+instance AttrValueFOR Char+instance AttrValueFOR a => AttrValueFOR [a]+instance AttrValueFRAME FRAME_above+instance AttrValueFRAME FRAME_below+instance AttrValueFRAME FRAME_border+instance AttrValueFRAME FRAME_box+instance AttrValueFRAME FRAME_hsides+instance AttrValueFRAME FRAME_lhs+instance AttrValueFRAME FRAME_rhs+instance AttrValueFRAME FRAME_void+instance AttrValueFRAME FRAME_vsides+instance AttrValueFRAMEBORDER Int+instance AttrValueHEADERS Char+instance AttrValueHEADERS a => AttrValueHEADERS [a]+instance AttrValueHEIGHT Char+instance AttrValueHEIGHT a => AttrValueHEIGHT [a]+instance AttrValueHREF Char+instance AttrValueHREF a => AttrValueHREF [a]+instance AttrValueHREFLANG Char+instance AttrValueHREFLANG a => AttrValueHREFLANG [a]+instance AttrValueHSPACE Char+instance AttrValueHSPACE a => AttrValueHSPACE [a]+instance AttrValueHTTP_EQUIV Char+instance AttrValueHTTP_EQUIV a => AttrValueHTTP_EQUIV [a]+instance AttrValueID Char+instance AttrValueID a => AttrValueID [a]+instance AttrValueISMAP ISMAP_ismap+instance AttrValueLABEL Char+instance AttrValueLABEL a => AttrValueLABEL [a]+instance AttrValueLANG Char+instance AttrValueLANG a => AttrValueLANG [a]+instance AttrValueLANGUAGE Char+instance AttrValueLANGUAGE a => AttrValueLANGUAGE [a]+instance AttrValueLINK Char+instance AttrValueLINK a => AttrValueLINK [a]+instance AttrValueLONGDESC Char+instance AttrValueLONGDESC a => AttrValueLONGDESC [a]+instance AttrValueMARGINHEIGHT Char+instance AttrValueMARGINHEIGHT a => AttrValueMARGINHEIGHT [a]+instance AttrValueMARGINWIDTH Char+instance AttrValueMARGINWIDTH a => AttrValueMARGINWIDTH [a]+instance AttrValueMAXLENGTH Int+instance AttrValueMEDIA Char+instance AttrValueMEDIA a => AttrValueMEDIA [a]+instance AttrValueMETHOD METHOD_GET+instance AttrValueMETHOD METHOD_POST+instance AttrValueMULTIPLE MULTIPLE_multiple+instance AttrValueNAME Char+instance AttrValueNAME a => AttrValueNAME [a]+instance AttrValueNOHREF NOHREF_nohref+instance AttrValueNOSHADE NOSHADE_noshade+instance AttrValueNOWRAP NOWRAP_nowrap+instance AttrValueOBJECT Char+instance AttrValueOBJECT a => AttrValueOBJECT [a]+instance AttrValueONBLUR Char+instance AttrValueONBLUR a => AttrValueONBLUR [a]+instance AttrValueONCHANGE Char+instance AttrValueONCHANGE a => AttrValueONCHANGE [a]+instance AttrValueONCLICK Char+instance AttrValueONCLICK a => AttrValueONCLICK [a]+instance AttrValueONDBLCLICK Char+instance AttrValueONDBLCLICK a => AttrValueONDBLCLICK [a]+instance AttrValueONFOCUS Char+instance AttrValueONFOCUS a => AttrValueONFOCUS [a]+instance AttrValueONKEYDOWN Char+instance AttrValueONKEYDOWN a => AttrValueONKEYDOWN [a]+instance AttrValueONKEYPRESS Char+instance AttrValueONKEYPRESS a => AttrValueONKEYPRESS [a]+instance AttrValueONKEYUP Char+instance AttrValueONKEYUP a => AttrValueONKEYUP [a]+instance AttrValueONLOAD Char+instance AttrValueONLOAD a => AttrValueONLOAD [a]+instance AttrValueONMOUSEDOWN Char+instance AttrValueONMOUSEDOWN a => AttrValueONMOUSEDOWN [a]+instance AttrValueONMOUSEMOVE Char+instance AttrValueONMOUSEMOVE a => AttrValueONMOUSEMOVE [a]+instance AttrValueONMOUSEOUT Char+instance AttrValueONMOUSEOUT a => AttrValueONMOUSEOUT [a]+instance AttrValueONMOUSEOVER Char+instance AttrValueONMOUSEOVER a => AttrValueONMOUSEOVER [a]+instance AttrValueONMOUSEUP Char+instance AttrValueONMOUSEUP a => AttrValueONMOUSEUP [a]+instance AttrValueONRESET Char+instance AttrValueONRESET a => AttrValueONRESET [a]+instance AttrValueONSELECT Char+instance AttrValueONSELECT a => AttrValueONSELECT [a]+instance AttrValueONSUBMIT Char+instance AttrValueONSUBMIT a => AttrValueONSUBMIT [a]+instance AttrValueONUNLOAD Char+instance AttrValueONUNLOAD a => AttrValueONUNLOAD [a]+instance AttrValuePROFILE Char+instance AttrValuePROFILE a => AttrValuePROFILE [a]+instance AttrValuePROMPT Char+instance AttrValuePROMPT a => AttrValuePROMPT [a]+instance AttrValueREADONLY READONLY_readonly+instance AttrValueREL Char+instance AttrValueREL a => AttrValueREL [a]+instance AttrValueREV Char+instance AttrValueREV a => AttrValueREV [a]+instance AttrValueROWS Int+instance AttrValueROWSPAN Int+instance AttrValueRULES RULES_all+instance AttrValueRULES RULES_cols+instance AttrValueRULES RULES_groups+instance AttrValueRULES RULES_none+instance AttrValueRULES RULES_rows+instance AttrValueSCHEME Char+instance AttrValueSCHEME a => AttrValueSCHEME [a]+instance AttrValueSCOPE SCOPE_col+instance AttrValueSCOPE SCOPE_colgroup+instance AttrValueSCOPE SCOPE_row+instance AttrValueSCOPE SCOPE_rowgroup+instance AttrValueSCROLLING SCROLLING_auto+instance AttrValueSCROLLING SCROLLING_no+instance AttrValueSCROLLING SCROLLING_yes+instance AttrValueSELECTED SELECTED_selected+instance AttrValueSHAPE SHAPE_circle+instance AttrValueSHAPE SHAPE_default'+instance AttrValueSHAPE SHAPE_poly+instance AttrValueSHAPE SHAPE_rect+instance AttrValueSIZE Char+instance AttrValueSIZE Int+instance AttrValueSIZE a => AttrValueSIZE [a]+instance AttrValueSPAN Int+instance AttrValueSRC Char+instance AttrValueSRC a => AttrValueSRC [a]+instance AttrValueSTANDBY Char+instance AttrValueSTANDBY a => AttrValueSTANDBY [a]+instance AttrValueSTART Int+instance AttrValueSTYLE Char+instance AttrValueSTYLE a => AttrValueSTYLE [a]+instance AttrValueSUMMARY Char+instance AttrValueSUMMARY a => AttrValueSUMMARY [a]+instance AttrValueTABINDEX Int+instance AttrValueTARGET Char+instance AttrValueTARGET a => AttrValueTARGET [a]+instance AttrValueTEXT Char+instance AttrValueTEXT a => AttrValueTEXT [a]+instance AttrValueTITLE Char+instance AttrValueTITLE a => AttrValueTITLE [a]+instance AttrValueTYPE Char+instance AttrValueTYPE TYPE_BUTTON+instance AttrValueTYPE TYPE_CHECKBOX+instance AttrValueTYPE TYPE_FILE+instance AttrValueTYPE TYPE_HIDDEN+instance AttrValueTYPE TYPE_IMAGE+instance AttrValueTYPE TYPE_PASSWORD+instance AttrValueTYPE TYPE_RADIO+instance AttrValueTYPE TYPE_RESET+instance AttrValueTYPE TYPE_SUBMIT+instance AttrValueTYPE TYPE_TEXT+instance AttrValueTYPE TYPE_button+instance AttrValueTYPE TYPE_circle+instance AttrValueTYPE TYPE_disc+instance AttrValueTYPE TYPE_reset+instance AttrValueTYPE TYPE_square+instance AttrValueTYPE TYPE_submit+instance AttrValueTYPE a => AttrValueTYPE [a]+instance AttrValueUSEMAP Char+instance AttrValueUSEMAP a => AttrValueUSEMAP [a]+instance AttrValueVALIGN VALIGN_baseline+instance AttrValueVALIGN VALIGN_bottom+instance AttrValueVALIGN VALIGN_middle+instance AttrValueVALIGN VALIGN_top+instance AttrValueVALUE Char+instance AttrValueVALUE Int+instance AttrValueVALUE a => AttrValueVALUE [a]+instance AttrValueVALUETYPE VALUETYPE_DATA+instance AttrValueVALUETYPE VALUETYPE_OBJECT+instance AttrValueVALUETYPE VALUETYPE_REF+instance AttrValueVERSION Char+instance AttrValueVERSION a => AttrValueVERSION [a]+instance AttrValueVLINK Char+instance AttrValueVLINK a => AttrValueVLINK [a]+instance AttrValueVSPACE Char+instance AttrValueVSPACE a => AttrValueVSPACE [a]+instance AttrValueWIDTH Char+instance AttrValueWIDTH Int+instance AttrValueWIDTH a => AttrValueWIDTH [a]+instance Show ALIGN_bottom where show ALIGN_bottom = "bottom"+instance Show ALIGN_center where show ALIGN_center = "center"+instance Show ALIGN_char where show ALIGN_char = "char"+instance Show ALIGN_justify where show ALIGN_justify = "justify"+instance Show ALIGN_left where show ALIGN_left = "left"+instance Show ALIGN_middle where show ALIGN_middle = "middle"+instance Show ALIGN_right where show ALIGN_right = "right"+instance Show ALIGN_top where show ALIGN_top = "top"+instance Show CHECKED_checked where show CHECKED_checked = "checked"+instance Show CLEAR_all where show CLEAR_all = "all"+instance Show CLEAR_left where show CLEAR_left = "left"+instance Show CLEAR_none where show CLEAR_none = "none"+instance Show CLEAR_right where show CLEAR_right = "right"+instance Show COMPACT_compact where show COMPACT_compact = "compact"+instance Show DECLARE_declare where show DECLARE_declare = "declare"+instance Show DEFER_defer where show DEFER_defer = "defer"+instance Show DIR_ltr where show DIR_ltr = "ltr"+instance Show DIR_rtl where show DIR_rtl = "rtl"+instance Show DISABLED_disabled where show DISABLED_disabled = "disabled"+instance Show FRAME_above where show FRAME_above = "above"+instance Show FRAME_below where show FRAME_below = "below"+instance Show FRAME_border where show FRAME_border = "border"+instance Show FRAME_box where show FRAME_box = "box"+instance Show FRAME_hsides where show FRAME_hsides = "hsides"+instance Show FRAME_lhs where show FRAME_lhs = "lhs"+instance Show FRAME_rhs where show FRAME_rhs = "rhs"+instance Show FRAME_void where show FRAME_void = "void"+instance Show FRAME_vsides where show FRAME_vsides = "vsides"+instance Show ISMAP_ismap where show ISMAP_ismap = "ismap"+instance Show METHOD_GET where show METHOD_GET = "GET"+instance Show METHOD_POST where show METHOD_POST = "POST"+instance Show MULTIPLE_multiple where show MULTIPLE_multiple = "multiple"+instance Show NOHREF_nohref where show NOHREF_nohref = "nohref"+instance Show NOSHADE_noshade where show NOSHADE_noshade = "noshade"+instance Show NOWRAP_nowrap where show NOWRAP_nowrap = "nowrap"+instance Show READONLY_readonly where show READONLY_readonly = "readonly"+instance Show RULES_all where show RULES_all = "all"+instance Show RULES_cols where show RULES_cols = "cols"+instance Show RULES_groups where show RULES_groups = "groups"+instance Show RULES_none where show RULES_none = "none"+instance Show RULES_rows where show RULES_rows = "rows"+instance Show SCOPE_col where show SCOPE_col = "col"+instance Show SCOPE_colgroup where show SCOPE_colgroup = "colgroup"+instance Show SCOPE_row where show SCOPE_row = "row"+instance Show SCOPE_rowgroup where show SCOPE_rowgroup = "rowgroup"+instance Show SCROLLING_auto where show SCROLLING_auto = "auto"+instance Show SCROLLING_no where show SCROLLING_no = "no"+instance Show SCROLLING_yes where show SCROLLING_yes = "yes"+instance Show SELECTED_selected where show SELECTED_selected = "selected"+instance Show SHAPE_circle where show SHAPE_circle = "circle"+instance Show SHAPE_default' where show SHAPE_default' = "default"+instance Show SHAPE_poly where show SHAPE_poly = "poly"+instance Show SHAPE_rect where show SHAPE_rect = "rect"+instance Show TYPE_BUTTON where show TYPE_BUTTON = "BUTTON"+instance Show TYPE_CHECKBOX where show TYPE_CHECKBOX = "CHECKBOX"+instance Show TYPE_FILE where show TYPE_FILE = "FILE"+instance Show TYPE_HIDDEN where show TYPE_HIDDEN = "HIDDEN"+instance Show TYPE_IMAGE where show TYPE_IMAGE = "IMAGE"+instance Show TYPE_PASSWORD where show TYPE_PASSWORD = "PASSWORD"+instance Show TYPE_RADIO where show TYPE_RADIO = "RADIO"+instance Show TYPE_RESET where show TYPE_RESET = "RESET"+instance Show TYPE_SUBMIT where show TYPE_SUBMIT = "SUBMIT"+instance Show TYPE_TEXT where show TYPE_TEXT = "TEXT"+instance Show TYPE_button where show TYPE_button = "button"+instance Show TYPE_circle where show TYPE_circle = "circle"+instance Show TYPE_disc where show TYPE_disc = "disc"+instance Show TYPE_reset where show TYPE_reset = "reset"+instance Show TYPE_square where show TYPE_square = "square"+instance Show TYPE_submit where show TYPE_submit = "submit"+instance Show VALIGN_baseline where show VALIGN_baseline = "baseline"+instance Show VALIGN_bottom where show VALIGN_bottom = "bottom"+instance Show VALIGN_middle where show VALIGN_middle = "middle"+instance Show VALIGN_top where show VALIGN_top = "top"+instance Show VALUETYPE_DATA where show VALUETYPE_DATA = "DATA"+instance Show VALUETYPE_OBJECT where show VALUETYPE_OBJECT = "OBJECT"+instance Show VALUETYPE_REF where show VALUETYPE_REF = "REF"+instance AdmitAttrABBR TD+instance AdmitAttrABBR TH+instance AdmitAttrACCEPT INPUT+instance AdmitAttrACCEPT_CHARSET FORM+instance AdmitAttrACCESSKEY A+instance AdmitAttrACCESSKEY AREA+instance AdmitAttrACCESSKEY BUTTON+instance AdmitAttrACCESSKEY INPUT+instance AdmitAttrACCESSKEY LABEL+instance AdmitAttrACCESSKEY LEGEND+instance AdmitAttrACCESSKEY TEXTAREA+instance AdmitAttrACTION FORM+instance AdmitAttrALIGN APPLET+instance AdmitAttrALIGN CAPTION+instance AdmitAttrALIGN COL+instance AdmitAttrALIGN COLGROUP+instance AdmitAttrALIGN DIV+instance AdmitAttrALIGN H1+instance AdmitAttrALIGN H2+instance AdmitAttrALIGN H3+instance AdmitAttrALIGN H4+instance AdmitAttrALIGN H5+instance AdmitAttrALIGN H6+instance AdmitAttrALIGN HR+instance AdmitAttrALIGN IFRAME+instance AdmitAttrALIGN IMG+instance AdmitAttrALIGN INPUT+instance AdmitAttrALIGN LEGEND+instance AdmitAttrALIGN OBJECT+instance AdmitAttrALIGN P+instance AdmitAttrALIGN TABLE+instance AdmitAttrALIGN TBODY+instance AdmitAttrALIGN TD+instance AdmitAttrALIGN TFOOT+instance AdmitAttrALIGN TH+instance AdmitAttrALIGN THEAD+instance AdmitAttrALIGN TR+instance AdmitAttrALINK BODY+instance AdmitAttrALT APPLET+instance AdmitAttrALT AREA+instance AdmitAttrALT IMG+instance AdmitAttrALT INPUT+instance AdmitAttrARCHIVE APPLET+instance AdmitAttrARCHIVE OBJECT+instance AdmitAttrAXIS TD+instance AdmitAttrAXIS TH+instance AdmitAttrBACKGROUND BODY+instance AdmitAttrBGCOLOR BODY+instance AdmitAttrBGCOLOR TABLE+instance AdmitAttrBGCOLOR TD+instance AdmitAttrBGCOLOR TH+instance AdmitAttrBGCOLOR TR+instance AdmitAttrBORDER IMG+instance AdmitAttrBORDER OBJECT+instance AdmitAttrBORDER TABLE+instance AdmitAttrCELLPADDING TABLE+instance AdmitAttrCELLSPACING TABLE+instance AdmitAttrCHAR COL+instance AdmitAttrCHAR COLGROUP+instance AdmitAttrCHAR TBODY+instance AdmitAttrCHAR TD+instance AdmitAttrCHAR TFOOT+instance AdmitAttrCHAR TH+instance AdmitAttrCHAR THEAD+instance AdmitAttrCHAR TR+instance AdmitAttrCHAROFF COL+instance AdmitAttrCHAROFF COLGROUP+instance AdmitAttrCHAROFF TBODY+instance AdmitAttrCHAROFF TD+instance AdmitAttrCHAROFF TFOOT+instance AdmitAttrCHAROFF TH+instance AdmitAttrCHAROFF THEAD+instance AdmitAttrCHAROFF TR+instance AdmitAttrCHARSET A+instance AdmitAttrCHARSET LINK+instance AdmitAttrCHARSET SCRIPT+instance AdmitAttrCHECKED INPUT+instance AdmitAttrCITE BLOCKQUOTE+instance AdmitAttrCITE DEL+instance AdmitAttrCITE INS+instance AdmitAttrCITE Q+instance AdmitAttrCLASS A+instance AdmitAttrCLASS ABBR+instance AdmitAttrCLASS ACRONYM+instance AdmitAttrCLASS ADDRESS+instance AdmitAttrCLASS APPLET+instance AdmitAttrCLASS AREA+instance AdmitAttrCLASS B+instance AdmitAttrCLASS BDO+instance AdmitAttrCLASS BIG+instance AdmitAttrCLASS BLOCKQUOTE+instance AdmitAttrCLASS BODY+instance AdmitAttrCLASS BR+instance AdmitAttrCLASS BUTTON+instance AdmitAttrCLASS CAPTION+instance AdmitAttrCLASS CENTER+instance AdmitAttrCLASS CITE+instance AdmitAttrCLASS CODE+instance AdmitAttrCLASS COL+instance AdmitAttrCLASS COLGROUP+instance AdmitAttrCLASS DD+instance AdmitAttrCLASS DEL+instance AdmitAttrCLASS DFN+instance AdmitAttrCLASS DIR+instance AdmitAttrCLASS DIV+instance AdmitAttrCLASS DL+instance AdmitAttrCLASS DT+instance AdmitAttrCLASS EM+instance AdmitAttrCLASS FIELDSET+instance AdmitAttrCLASS FONT+instance AdmitAttrCLASS FORM+instance AdmitAttrCLASS H1+instance AdmitAttrCLASS H2+instance AdmitAttrCLASS H3+instance AdmitAttrCLASS H4+instance AdmitAttrCLASS H5+instance AdmitAttrCLASS H6+instance AdmitAttrCLASS HR+instance AdmitAttrCLASS I+instance AdmitAttrCLASS IFRAME+instance AdmitAttrCLASS IMG+instance AdmitAttrCLASS INPUT+instance AdmitAttrCLASS INS+instance AdmitAttrCLASS ISINDEX+instance AdmitAttrCLASS KBD+instance AdmitAttrCLASS LABEL+instance AdmitAttrCLASS LEGEND+instance AdmitAttrCLASS LI+instance AdmitAttrCLASS LINK+instance AdmitAttrCLASS MAP+instance AdmitAttrCLASS MENU+instance AdmitAttrCLASS NOFRAMES+instance AdmitAttrCLASS NOSCRIPT+instance AdmitAttrCLASS OBJECT+instance AdmitAttrCLASS OL+instance AdmitAttrCLASS OPTGROUP+instance AdmitAttrCLASS OPTION+instance AdmitAttrCLASS P+instance AdmitAttrCLASS PRE+instance AdmitAttrCLASS Q+instance AdmitAttrCLASS S+instance AdmitAttrCLASS SAMP+instance AdmitAttrCLASS SELECT+instance AdmitAttrCLASS SMALL+instance AdmitAttrCLASS SPAN+instance AdmitAttrCLASS STRIKE+instance AdmitAttrCLASS STRONG+instance AdmitAttrCLASS SUB+instance AdmitAttrCLASS SUP+instance AdmitAttrCLASS TABLE+instance AdmitAttrCLASS TBODY+instance AdmitAttrCLASS TD+instance AdmitAttrCLASS TEXTAREA+instance AdmitAttrCLASS TFOOT+instance AdmitAttrCLASS TH+instance AdmitAttrCLASS THEAD+instance AdmitAttrCLASS TR+instance AdmitAttrCLASS TT+instance AdmitAttrCLASS U+instance AdmitAttrCLASS UL+instance AdmitAttrCLASS VAR+instance AdmitAttrCLASSID OBJECT+instance AdmitAttrCLEAR BR+instance AdmitAttrCODE APPLET+instance AdmitAttrCODEBASE APPLET+instance AdmitAttrCODEBASE OBJECT+instance AdmitAttrCODETYPE OBJECT+instance AdmitAttrCOLOR BASEFONT+instance AdmitAttrCOLOR FONT+instance AdmitAttrCOLS TEXTAREA+instance AdmitAttrCOLSPAN TD+instance AdmitAttrCOLSPAN TH+instance AdmitAttrCOMPACT DIR+instance AdmitAttrCOMPACT DL+instance AdmitAttrCOMPACT MENU+instance AdmitAttrCOMPACT OL+instance AdmitAttrCOMPACT UL+instance AdmitAttrCONTENT META+instance AdmitAttrCOORDS A+instance AdmitAttrCOORDS AREA+instance AdmitAttrDATA OBJECT+instance AdmitAttrDATAPAGESIZE TABLE+instance AdmitAttrDATETIME DEL+instance AdmitAttrDATETIME INS+instance AdmitAttrDECLARE OBJECT+instance AdmitAttrDEFER SCRIPT+instance AdmitAttrDIR A+instance AdmitAttrDIR ABBR+instance AdmitAttrDIR ACRONYM+instance AdmitAttrDIR ADDRESS+instance AdmitAttrDIR AREA+instance AdmitAttrDIR B+instance AdmitAttrDIR BDO+instance AdmitAttrDIR BIG+instance AdmitAttrDIR BLOCKQUOTE+instance AdmitAttrDIR BODY+instance AdmitAttrDIR BUTTON+instance AdmitAttrDIR CAPTION+instance AdmitAttrDIR CENTER+instance AdmitAttrDIR CITE+instance AdmitAttrDIR CODE+instance AdmitAttrDIR COL+instance AdmitAttrDIR COLGROUP+instance AdmitAttrDIR DD+instance AdmitAttrDIR DEL+instance AdmitAttrDIR DFN+instance AdmitAttrDIR DIR+instance AdmitAttrDIR DIV+instance AdmitAttrDIR DL+instance AdmitAttrDIR DT+instance AdmitAttrDIR EM+instance AdmitAttrDIR FIELDSET+instance AdmitAttrDIR FONT+instance AdmitAttrDIR FORM+instance AdmitAttrDIR H1+instance AdmitAttrDIR H2+instance AdmitAttrDIR H3+instance AdmitAttrDIR H4+instance AdmitAttrDIR H5+instance AdmitAttrDIR H6+instance AdmitAttrDIR HEAD+instance AdmitAttrDIR HTML+instance AdmitAttrDIR I+instance AdmitAttrDIR IMG+instance AdmitAttrDIR INPUT+instance AdmitAttrDIR INS+instance AdmitAttrDIR ISINDEX+instance AdmitAttrDIR KBD+instance AdmitAttrDIR LABEL+instance AdmitAttrDIR LEGEND+instance AdmitAttrDIR LI+instance AdmitAttrDIR LINK+instance AdmitAttrDIR MAP+instance AdmitAttrDIR MENU+instance AdmitAttrDIR META+instance AdmitAttrDIR NOFRAMES+instance AdmitAttrDIR NOSCRIPT+instance AdmitAttrDIR OBJECT+instance AdmitAttrDIR OL+instance AdmitAttrDIR OPTGROUP+instance AdmitAttrDIR OPTION+instance AdmitAttrDIR P+instance AdmitAttrDIR PRE+instance AdmitAttrDIR Q+instance AdmitAttrDIR S+instance AdmitAttrDIR SAMP+instance AdmitAttrDIR SELECT+instance AdmitAttrDIR SMALL+instance AdmitAttrDIR SPAN+instance AdmitAttrDIR STRIKE+instance AdmitAttrDIR STRONG+instance AdmitAttrDIR STYLE+instance AdmitAttrDIR SUB+instance AdmitAttrDIR SUP+instance AdmitAttrDIR TABLE+instance AdmitAttrDIR TBODY+instance AdmitAttrDIR TD+instance AdmitAttrDIR TEXTAREA+instance AdmitAttrDIR TFOOT+instance AdmitAttrDIR TH+instance AdmitAttrDIR THEAD+instance AdmitAttrDIR TITLE+instance AdmitAttrDIR TR+instance AdmitAttrDIR TT+instance AdmitAttrDIR U+instance AdmitAttrDIR UL+instance AdmitAttrDIR VAR+instance AdmitAttrDISABLED BUTTON+instance AdmitAttrDISABLED INPUT+instance AdmitAttrDISABLED OPTGROUP+instance AdmitAttrDISABLED OPTION+instance AdmitAttrDISABLED SELECT+instance AdmitAttrDISABLED TEXTAREA+instance AdmitAttrENCTYPE FORM+instance AdmitAttrEVENT SCRIPT+instance AdmitAttrFACE BASEFONT+instance AdmitAttrFACE FONT+instance AdmitAttrFOR LABEL+instance AdmitAttrFOR SCRIPT+instance AdmitAttrFRAME TABLE+instance AdmitAttrFRAMEBORDER IFRAME+instance AdmitAttrHEADERS TD+instance AdmitAttrHEADERS TH+instance AdmitAttrHEIGHT APPLET+instance AdmitAttrHEIGHT IFRAME+instance AdmitAttrHEIGHT IMG+instance AdmitAttrHEIGHT OBJECT+instance AdmitAttrHEIGHT TD+instance AdmitAttrHEIGHT TH+instance AdmitAttrHREF A+instance AdmitAttrHREF AREA+instance AdmitAttrHREF BASE+instance AdmitAttrHREF LINK+instance AdmitAttrHREFLANG A+instance AdmitAttrHREFLANG LINK+instance AdmitAttrHSPACE APPLET+instance AdmitAttrHSPACE IMG+instance AdmitAttrHSPACE OBJECT+instance AdmitAttrHTTP_EQUIV META+instance AdmitAttrID A+instance AdmitAttrID ABBR+instance AdmitAttrID ACRONYM+instance AdmitAttrID ADDRESS+instance AdmitAttrID APPLET+instance AdmitAttrID AREA+instance AdmitAttrID B+instance AdmitAttrID BASEFONT+instance AdmitAttrID BDO+instance AdmitAttrID BIG+instance AdmitAttrID BLOCKQUOTE+instance AdmitAttrID BODY+instance AdmitAttrID BR+instance AdmitAttrID BUTTON+instance AdmitAttrID CAPTION+instance AdmitAttrID CENTER+instance AdmitAttrID CITE+instance AdmitAttrID CODE+instance AdmitAttrID COL+instance AdmitAttrID COLGROUP+instance AdmitAttrID DD+instance AdmitAttrID DEL+instance AdmitAttrID DFN+instance AdmitAttrID DIR+instance AdmitAttrID DIV+instance AdmitAttrID DL+instance AdmitAttrID DT+instance AdmitAttrID EM+instance AdmitAttrID FIELDSET+instance AdmitAttrID FONT+instance AdmitAttrID FORM+instance AdmitAttrID H1+instance AdmitAttrID H2+instance AdmitAttrID H3+instance AdmitAttrID H4+instance AdmitAttrID H5+instance AdmitAttrID H6+instance AdmitAttrID HR+instance AdmitAttrID I+instance AdmitAttrID IFRAME+instance AdmitAttrID IMG+instance AdmitAttrID INPUT+instance AdmitAttrID INS+instance AdmitAttrID ISINDEX+instance AdmitAttrID KBD+instance AdmitAttrID LABEL+instance AdmitAttrID LEGEND+instance AdmitAttrID LI+instance AdmitAttrID LINK+instance AdmitAttrID MAP+instance AdmitAttrID MENU+instance AdmitAttrID NOFRAMES+instance AdmitAttrID NOSCRIPT+instance AdmitAttrID OBJECT+instance AdmitAttrID OL+instance AdmitAttrID OPTGROUP+instance AdmitAttrID OPTION+instance AdmitAttrID P+instance AdmitAttrID PARAM+instance AdmitAttrID PRE+instance AdmitAttrID Q+instance AdmitAttrID S+instance AdmitAttrID SAMP+instance AdmitAttrID SELECT+instance AdmitAttrID SMALL+instance AdmitAttrID SPAN+instance AdmitAttrID STRIKE+instance AdmitAttrID STRONG+instance AdmitAttrID SUB+instance AdmitAttrID SUP+instance AdmitAttrID TABLE+instance AdmitAttrID TBODY+instance AdmitAttrID TD+instance AdmitAttrID TEXTAREA+instance AdmitAttrID TFOOT+instance AdmitAttrID TH+instance AdmitAttrID THEAD+instance AdmitAttrID TR+instance AdmitAttrID TT+instance AdmitAttrID U+instance AdmitAttrID UL+instance AdmitAttrID VAR+instance AdmitAttrISMAP IMG+instance AdmitAttrLABEL OPTGROUP+instance AdmitAttrLABEL OPTION+instance AdmitAttrLANG A+instance AdmitAttrLANG ABBR+instance AdmitAttrLANG ACRONYM+instance AdmitAttrLANG ADDRESS+instance AdmitAttrLANG AREA+instance AdmitAttrLANG B+instance AdmitAttrLANG BDO+instance AdmitAttrLANG BIG+instance AdmitAttrLANG BLOCKQUOTE+instance AdmitAttrLANG BODY+instance AdmitAttrLANG BUTTON+instance AdmitAttrLANG CAPTION+instance AdmitAttrLANG CENTER+instance AdmitAttrLANG CITE+instance AdmitAttrLANG CODE+instance AdmitAttrLANG COL+instance AdmitAttrLANG COLGROUP+instance AdmitAttrLANG DD+instance AdmitAttrLANG DEL+instance AdmitAttrLANG DFN+instance AdmitAttrLANG DIR+instance AdmitAttrLANG DIV+instance AdmitAttrLANG DL+instance AdmitAttrLANG DT+instance AdmitAttrLANG EM+instance AdmitAttrLANG FIELDSET+instance AdmitAttrLANG FONT+instance AdmitAttrLANG FORM+instance AdmitAttrLANG H1+instance AdmitAttrLANG H2+instance AdmitAttrLANG H3+instance AdmitAttrLANG H4+instance AdmitAttrLANG H5+instance AdmitAttrLANG H6+instance AdmitAttrLANG HEAD+instance AdmitAttrLANG HTML+instance AdmitAttrLANG I+instance AdmitAttrLANG IMG+instance AdmitAttrLANG INPUT+instance AdmitAttrLANG INS+instance AdmitAttrLANG ISINDEX+instance AdmitAttrLANG KBD+instance AdmitAttrLANG LABEL+instance AdmitAttrLANG LEGEND+instance AdmitAttrLANG LI+instance AdmitAttrLANG LINK+instance AdmitAttrLANG MAP+instance AdmitAttrLANG MENU+instance AdmitAttrLANG META+instance AdmitAttrLANG NOFRAMES+instance AdmitAttrLANG NOSCRIPT+instance AdmitAttrLANG OBJECT+instance AdmitAttrLANG OL+instance AdmitAttrLANG OPTGROUP+instance AdmitAttrLANG OPTION+instance AdmitAttrLANG P+instance AdmitAttrLANG PRE+instance AdmitAttrLANG Q+instance AdmitAttrLANG S+instance AdmitAttrLANG SAMP+instance AdmitAttrLANG SELECT+instance AdmitAttrLANG SMALL+instance AdmitAttrLANG SPAN+instance AdmitAttrLANG STRIKE+instance AdmitAttrLANG STRONG+instance AdmitAttrLANG STYLE+instance AdmitAttrLANG SUB+instance AdmitAttrLANG SUP+instance AdmitAttrLANG TABLE+instance AdmitAttrLANG TBODY+instance AdmitAttrLANG TD+instance AdmitAttrLANG TEXTAREA+instance AdmitAttrLANG TFOOT+instance AdmitAttrLANG TH+instance AdmitAttrLANG THEAD+instance AdmitAttrLANG TITLE+instance AdmitAttrLANG TR+instance AdmitAttrLANG TT+instance AdmitAttrLANG U+instance AdmitAttrLANG UL+instance AdmitAttrLANG VAR+instance AdmitAttrLANGUAGE SCRIPT+instance AdmitAttrLINK BODY+instance AdmitAttrLONGDESC IFRAME+instance AdmitAttrLONGDESC IMG+instance AdmitAttrMARGINHEIGHT IFRAME+instance AdmitAttrMARGINWIDTH IFRAME+instance AdmitAttrMAXLENGTH INPUT+instance AdmitAttrMEDIA LINK+instance AdmitAttrMEDIA STYLE+instance AdmitAttrMETHOD FORM+instance AdmitAttrMULTIPLE SELECT+instance AdmitAttrNAME A+instance AdmitAttrNAME APPLET+instance AdmitAttrNAME BUTTON+instance AdmitAttrNAME IFRAME+instance AdmitAttrNAME INPUT+instance AdmitAttrNAME MAP+instance AdmitAttrNAME META+instance AdmitAttrNAME OBJECT+instance AdmitAttrNAME PARAM+instance AdmitAttrNAME SELECT+instance AdmitAttrNAME TEXTAREA+instance AdmitAttrNOHREF AREA+instance AdmitAttrNOSHADE HR+instance AdmitAttrNOWRAP TD+instance AdmitAttrNOWRAP TH+instance AdmitAttrOBJECT APPLET+instance AdmitAttrONBLUR A+instance AdmitAttrONBLUR AREA+instance AdmitAttrONBLUR BUTTON+instance AdmitAttrONBLUR INPUT+instance AdmitAttrONBLUR LABEL+instance AdmitAttrONBLUR SELECT+instance AdmitAttrONBLUR TEXTAREA+instance AdmitAttrONCHANGE INPUT+instance AdmitAttrONCHANGE SELECT+instance AdmitAttrONCHANGE TEXTAREA+instance AdmitAttrONCLICK A+instance AdmitAttrONCLICK ABBR+instance AdmitAttrONCLICK ACRONYM+instance AdmitAttrONCLICK ADDRESS+instance AdmitAttrONCLICK AREA+instance AdmitAttrONCLICK B+instance AdmitAttrONCLICK BIG+instance AdmitAttrONCLICK BLOCKQUOTE+instance AdmitAttrONCLICK BODY+instance AdmitAttrONCLICK BUTTON+instance AdmitAttrONCLICK CAPTION+instance AdmitAttrONCLICK CENTER+instance AdmitAttrONCLICK CITE+instance AdmitAttrONCLICK CODE+instance AdmitAttrONCLICK COL+instance AdmitAttrONCLICK COLGROUP+instance AdmitAttrONCLICK DD+instance AdmitAttrONCLICK DEL+instance AdmitAttrONCLICK DFN+instance AdmitAttrONCLICK DIR+instance AdmitAttrONCLICK DIV+instance AdmitAttrONCLICK DL+instance AdmitAttrONCLICK DT+instance AdmitAttrONCLICK EM+instance AdmitAttrONCLICK FIELDSET+instance AdmitAttrONCLICK FORM+instance AdmitAttrONCLICK H1+instance AdmitAttrONCLICK H2+instance AdmitAttrONCLICK H3+instance AdmitAttrONCLICK H4+instance AdmitAttrONCLICK H5+instance AdmitAttrONCLICK H6+instance AdmitAttrONCLICK HR+instance AdmitAttrONCLICK I+instance AdmitAttrONCLICK IMG+instance AdmitAttrONCLICK INPUT+instance AdmitAttrONCLICK INS+instance AdmitAttrONCLICK KBD+instance AdmitAttrONCLICK LABEL+instance AdmitAttrONCLICK LEGEND+instance AdmitAttrONCLICK LI+instance AdmitAttrONCLICK LINK+instance AdmitAttrONCLICK MAP+instance AdmitAttrONCLICK MENU+instance AdmitAttrONCLICK NOFRAMES+instance AdmitAttrONCLICK NOSCRIPT+instance AdmitAttrONCLICK OBJECT+instance AdmitAttrONCLICK OL+instance AdmitAttrONCLICK OPTGROUP+instance AdmitAttrONCLICK OPTION+instance AdmitAttrONCLICK P+instance AdmitAttrONCLICK PRE+instance AdmitAttrONCLICK Q+instance AdmitAttrONCLICK S+instance AdmitAttrONCLICK SAMP+instance AdmitAttrONCLICK SELECT+instance AdmitAttrONCLICK SMALL+instance AdmitAttrONCLICK SPAN+instance AdmitAttrONCLICK STRIKE+instance AdmitAttrONCLICK STRONG+instance AdmitAttrONCLICK SUB+instance AdmitAttrONCLICK SUP+instance AdmitAttrONCLICK TABLE+instance AdmitAttrONCLICK TBODY+instance AdmitAttrONCLICK TD+instance AdmitAttrONCLICK TEXTAREA+instance AdmitAttrONCLICK TFOOT+instance AdmitAttrONCLICK TH+instance AdmitAttrONCLICK THEAD+instance AdmitAttrONCLICK TR+instance AdmitAttrONCLICK TT+instance AdmitAttrONCLICK U+instance AdmitAttrONCLICK UL+instance AdmitAttrONCLICK VAR+instance AdmitAttrONDBLCLICK A+instance AdmitAttrONDBLCLICK ABBR+instance AdmitAttrONDBLCLICK ACRONYM+instance AdmitAttrONDBLCLICK ADDRESS+instance AdmitAttrONDBLCLICK AREA+instance AdmitAttrONDBLCLICK B+instance AdmitAttrONDBLCLICK BIG+instance AdmitAttrONDBLCLICK BLOCKQUOTE+instance AdmitAttrONDBLCLICK BODY+instance AdmitAttrONDBLCLICK BUTTON+instance AdmitAttrONDBLCLICK CAPTION+instance AdmitAttrONDBLCLICK CENTER+instance AdmitAttrONDBLCLICK CITE+instance AdmitAttrONDBLCLICK CODE+instance AdmitAttrONDBLCLICK COL+instance AdmitAttrONDBLCLICK COLGROUP+instance AdmitAttrONDBLCLICK DD+instance AdmitAttrONDBLCLICK DEL+instance AdmitAttrONDBLCLICK DFN+instance AdmitAttrONDBLCLICK DIR+instance AdmitAttrONDBLCLICK DIV+instance AdmitAttrONDBLCLICK DL+instance AdmitAttrONDBLCLICK DT+instance AdmitAttrONDBLCLICK EM+instance AdmitAttrONDBLCLICK FIELDSET+instance AdmitAttrONDBLCLICK FORM+instance AdmitAttrONDBLCLICK H1+instance AdmitAttrONDBLCLICK H2+instance AdmitAttrONDBLCLICK H3+instance AdmitAttrONDBLCLICK H4+instance AdmitAttrONDBLCLICK H5+instance AdmitAttrONDBLCLICK H6+instance AdmitAttrONDBLCLICK HR+instance AdmitAttrONDBLCLICK I+instance AdmitAttrONDBLCLICK IMG+instance AdmitAttrONDBLCLICK INPUT+instance AdmitAttrONDBLCLICK INS+instance AdmitAttrONDBLCLICK KBD+instance AdmitAttrONDBLCLICK LABEL+instance AdmitAttrONDBLCLICK LEGEND+instance AdmitAttrONDBLCLICK LI+instance AdmitAttrONDBLCLICK LINK+instance AdmitAttrONDBLCLICK MAP+instance AdmitAttrONDBLCLICK MENU+instance AdmitAttrONDBLCLICK NOFRAMES+instance AdmitAttrONDBLCLICK NOSCRIPT+instance AdmitAttrONDBLCLICK OBJECT+instance AdmitAttrONDBLCLICK OL+instance AdmitAttrONDBLCLICK OPTGROUP+instance AdmitAttrONDBLCLICK OPTION+instance AdmitAttrONDBLCLICK P+instance AdmitAttrONDBLCLICK PRE+instance AdmitAttrONDBLCLICK Q+instance AdmitAttrONDBLCLICK S+instance AdmitAttrONDBLCLICK SAMP+instance AdmitAttrONDBLCLICK SELECT+instance AdmitAttrONDBLCLICK SMALL+instance AdmitAttrONDBLCLICK SPAN+instance AdmitAttrONDBLCLICK STRIKE+instance AdmitAttrONDBLCLICK STRONG+instance AdmitAttrONDBLCLICK SUB+instance AdmitAttrONDBLCLICK SUP+instance AdmitAttrONDBLCLICK TABLE+instance AdmitAttrONDBLCLICK TBODY+instance AdmitAttrONDBLCLICK TD+instance AdmitAttrONDBLCLICK TEXTAREA+instance AdmitAttrONDBLCLICK TFOOT+instance AdmitAttrONDBLCLICK TH+instance AdmitAttrONDBLCLICK THEAD+instance AdmitAttrONDBLCLICK TR+instance AdmitAttrONDBLCLICK TT+instance AdmitAttrONDBLCLICK U+instance AdmitAttrONDBLCLICK UL+instance AdmitAttrONDBLCLICK VAR+instance AdmitAttrONFOCUS A+instance AdmitAttrONFOCUS AREA+instance AdmitAttrONFOCUS BUTTON+instance AdmitAttrONFOCUS INPUT+instance AdmitAttrONFOCUS LABEL+instance AdmitAttrONFOCUS SELECT+instance AdmitAttrONFOCUS TEXTAREA+instance AdmitAttrONKEYDOWN A+instance AdmitAttrONKEYDOWN ABBR+instance AdmitAttrONKEYDOWN ACRONYM+instance AdmitAttrONKEYDOWN ADDRESS+instance AdmitAttrONKEYDOWN AREA+instance AdmitAttrONKEYDOWN B+instance AdmitAttrONKEYDOWN BIG+instance AdmitAttrONKEYDOWN BLOCKQUOTE+instance AdmitAttrONKEYDOWN BODY+instance AdmitAttrONKEYDOWN BUTTON+instance AdmitAttrONKEYDOWN CAPTION+instance AdmitAttrONKEYDOWN CENTER+instance AdmitAttrONKEYDOWN CITE+instance AdmitAttrONKEYDOWN CODE+instance AdmitAttrONKEYDOWN COL+instance AdmitAttrONKEYDOWN COLGROUP+instance AdmitAttrONKEYDOWN DD+instance AdmitAttrONKEYDOWN DEL+instance AdmitAttrONKEYDOWN DFN+instance AdmitAttrONKEYDOWN DIR+instance AdmitAttrONKEYDOWN DIV+instance AdmitAttrONKEYDOWN DL+instance AdmitAttrONKEYDOWN DT+instance AdmitAttrONKEYDOWN EM+instance AdmitAttrONKEYDOWN FIELDSET+instance AdmitAttrONKEYDOWN FORM+instance AdmitAttrONKEYDOWN H1+instance AdmitAttrONKEYDOWN H2+instance AdmitAttrONKEYDOWN H3+instance AdmitAttrONKEYDOWN H4+instance AdmitAttrONKEYDOWN H5+instance AdmitAttrONKEYDOWN H6+instance AdmitAttrONKEYDOWN HR+instance AdmitAttrONKEYDOWN I+instance AdmitAttrONKEYDOWN IMG+instance AdmitAttrONKEYDOWN INPUT+instance AdmitAttrONKEYDOWN INS+instance AdmitAttrONKEYDOWN KBD+instance AdmitAttrONKEYDOWN LABEL+instance AdmitAttrONKEYDOWN LEGEND+instance AdmitAttrONKEYDOWN LI+instance AdmitAttrONKEYDOWN LINK+instance AdmitAttrONKEYDOWN MAP+instance AdmitAttrONKEYDOWN MENU+instance AdmitAttrONKEYDOWN NOFRAMES+instance AdmitAttrONKEYDOWN NOSCRIPT+instance AdmitAttrONKEYDOWN OBJECT+instance AdmitAttrONKEYDOWN OL+instance AdmitAttrONKEYDOWN OPTGROUP+instance AdmitAttrONKEYDOWN OPTION+instance AdmitAttrONKEYDOWN P+instance AdmitAttrONKEYDOWN PRE+instance AdmitAttrONKEYDOWN Q+instance AdmitAttrONKEYDOWN S+instance AdmitAttrONKEYDOWN SAMP+instance AdmitAttrONKEYDOWN SELECT+instance AdmitAttrONKEYDOWN SMALL+instance AdmitAttrONKEYDOWN SPAN+instance AdmitAttrONKEYDOWN STRIKE+instance AdmitAttrONKEYDOWN STRONG+instance AdmitAttrONKEYDOWN SUB+instance AdmitAttrONKEYDOWN SUP+instance AdmitAttrONKEYDOWN TABLE+instance AdmitAttrONKEYDOWN TBODY+instance AdmitAttrONKEYDOWN TD+instance AdmitAttrONKEYDOWN TEXTAREA+instance AdmitAttrONKEYDOWN TFOOT+instance AdmitAttrONKEYDOWN TH+instance AdmitAttrONKEYDOWN THEAD+instance AdmitAttrONKEYDOWN TR+instance AdmitAttrONKEYDOWN TT+instance AdmitAttrONKEYDOWN U+instance AdmitAttrONKEYDOWN UL+instance AdmitAttrONKEYDOWN VAR+instance AdmitAttrONKEYPRESS A+instance AdmitAttrONKEYPRESS ABBR+instance AdmitAttrONKEYPRESS ACRONYM+instance AdmitAttrONKEYPRESS ADDRESS+instance AdmitAttrONKEYPRESS AREA+instance AdmitAttrONKEYPRESS B+instance AdmitAttrONKEYPRESS BIG+instance AdmitAttrONKEYPRESS BLOCKQUOTE+instance AdmitAttrONKEYPRESS BODY+instance AdmitAttrONKEYPRESS BUTTON+instance AdmitAttrONKEYPRESS CAPTION+instance AdmitAttrONKEYPRESS CENTER+instance AdmitAttrONKEYPRESS CITE+instance AdmitAttrONKEYPRESS CODE+instance AdmitAttrONKEYPRESS COL+instance AdmitAttrONKEYPRESS COLGROUP+instance AdmitAttrONKEYPRESS DD+instance AdmitAttrONKEYPRESS DEL+instance AdmitAttrONKEYPRESS DFN+instance AdmitAttrONKEYPRESS DIR+instance AdmitAttrONKEYPRESS DIV+instance AdmitAttrONKEYPRESS DL+instance AdmitAttrONKEYPRESS DT+instance AdmitAttrONKEYPRESS EM+instance AdmitAttrONKEYPRESS FIELDSET+instance AdmitAttrONKEYPRESS FORM+instance AdmitAttrONKEYPRESS H1+instance AdmitAttrONKEYPRESS H2+instance AdmitAttrONKEYPRESS H3+instance AdmitAttrONKEYPRESS H4+instance AdmitAttrONKEYPRESS H5+instance AdmitAttrONKEYPRESS H6+instance AdmitAttrONKEYPRESS HR+instance AdmitAttrONKEYPRESS I+instance AdmitAttrONKEYPRESS IMG+instance AdmitAttrONKEYPRESS INPUT+instance AdmitAttrONKEYPRESS INS+instance AdmitAttrONKEYPRESS KBD+instance AdmitAttrONKEYPRESS LABEL+instance AdmitAttrONKEYPRESS LEGEND+instance AdmitAttrONKEYPRESS LI+instance AdmitAttrONKEYPRESS LINK+instance AdmitAttrONKEYPRESS MAP+instance AdmitAttrONKEYPRESS MENU+instance AdmitAttrONKEYPRESS NOFRAMES+instance AdmitAttrONKEYPRESS NOSCRIPT+instance AdmitAttrONKEYPRESS OBJECT+instance AdmitAttrONKEYPRESS OL+instance AdmitAttrONKEYPRESS OPTGROUP+instance AdmitAttrONKEYPRESS OPTION+instance AdmitAttrONKEYPRESS P+instance AdmitAttrONKEYPRESS PRE+instance AdmitAttrONKEYPRESS Q+instance AdmitAttrONKEYPRESS S+instance AdmitAttrONKEYPRESS SAMP+instance AdmitAttrONKEYPRESS SELECT+instance AdmitAttrONKEYPRESS SMALL+instance AdmitAttrONKEYPRESS SPAN+instance AdmitAttrONKEYPRESS STRIKE+instance AdmitAttrONKEYPRESS STRONG+instance AdmitAttrONKEYPRESS SUB+instance AdmitAttrONKEYPRESS SUP+instance AdmitAttrONKEYPRESS TABLE+instance AdmitAttrONKEYPRESS TBODY+instance AdmitAttrONKEYPRESS TD+instance AdmitAttrONKEYPRESS TEXTAREA+instance AdmitAttrONKEYPRESS TFOOT+instance AdmitAttrONKEYPRESS TH+instance AdmitAttrONKEYPRESS THEAD+instance AdmitAttrONKEYPRESS TR+instance AdmitAttrONKEYPRESS TT+instance AdmitAttrONKEYPRESS U+instance AdmitAttrONKEYPRESS UL+instance AdmitAttrONKEYPRESS VAR+instance AdmitAttrONKEYUP A+instance AdmitAttrONKEYUP ABBR+instance AdmitAttrONKEYUP ACRONYM+instance AdmitAttrONKEYUP ADDRESS+instance AdmitAttrONKEYUP AREA+instance AdmitAttrONKEYUP B+instance AdmitAttrONKEYUP BIG+instance AdmitAttrONKEYUP BLOCKQUOTE+instance AdmitAttrONKEYUP BODY+instance AdmitAttrONKEYUP BUTTON+instance AdmitAttrONKEYUP CAPTION+instance AdmitAttrONKEYUP CENTER+instance AdmitAttrONKEYUP CITE+instance AdmitAttrONKEYUP CODE+instance AdmitAttrONKEYUP COL+instance AdmitAttrONKEYUP COLGROUP+instance AdmitAttrONKEYUP DD+instance AdmitAttrONKEYUP DEL+instance AdmitAttrONKEYUP DFN+instance AdmitAttrONKEYUP DIR+instance AdmitAttrONKEYUP DIV+instance AdmitAttrONKEYUP DL+instance AdmitAttrONKEYUP DT+instance AdmitAttrONKEYUP EM+instance AdmitAttrONKEYUP FIELDSET+instance AdmitAttrONKEYUP FORM+instance AdmitAttrONKEYUP H1+instance AdmitAttrONKEYUP H2+instance AdmitAttrONKEYUP H3+instance AdmitAttrONKEYUP H4+instance AdmitAttrONKEYUP H5+instance AdmitAttrONKEYUP H6+instance AdmitAttrONKEYUP HR+instance AdmitAttrONKEYUP I+instance AdmitAttrONKEYUP IMG+instance AdmitAttrONKEYUP INPUT+instance AdmitAttrONKEYUP INS+instance AdmitAttrONKEYUP KBD+instance AdmitAttrONKEYUP LABEL+instance AdmitAttrONKEYUP LEGEND+instance AdmitAttrONKEYUP LI+instance AdmitAttrONKEYUP LINK+instance AdmitAttrONKEYUP MAP+instance AdmitAttrONKEYUP MENU+instance AdmitAttrONKEYUP NOFRAMES+instance AdmitAttrONKEYUP NOSCRIPT+instance AdmitAttrONKEYUP OBJECT+instance AdmitAttrONKEYUP OL+instance AdmitAttrONKEYUP OPTGROUP+instance AdmitAttrONKEYUP OPTION+instance AdmitAttrONKEYUP P+instance AdmitAttrONKEYUP PRE+instance AdmitAttrONKEYUP Q+instance AdmitAttrONKEYUP S+instance AdmitAttrONKEYUP SAMP+instance AdmitAttrONKEYUP SELECT+instance AdmitAttrONKEYUP SMALL+instance AdmitAttrONKEYUP SPAN+instance AdmitAttrONKEYUP STRIKE+instance AdmitAttrONKEYUP STRONG+instance AdmitAttrONKEYUP SUB+instance AdmitAttrONKEYUP SUP+instance AdmitAttrONKEYUP TABLE+instance AdmitAttrONKEYUP TBODY+instance AdmitAttrONKEYUP TD+instance AdmitAttrONKEYUP TEXTAREA+instance AdmitAttrONKEYUP TFOOT+instance AdmitAttrONKEYUP TH+instance AdmitAttrONKEYUP THEAD+instance AdmitAttrONKEYUP TR+instance AdmitAttrONKEYUP TT+instance AdmitAttrONKEYUP U+instance AdmitAttrONKEYUP UL+instance AdmitAttrONKEYUP VAR+instance AdmitAttrONLOAD BODY+instance AdmitAttrONMOUSEDOWN A+instance AdmitAttrONMOUSEDOWN ABBR+instance AdmitAttrONMOUSEDOWN ACRONYM+instance AdmitAttrONMOUSEDOWN ADDRESS+instance AdmitAttrONMOUSEDOWN AREA+instance AdmitAttrONMOUSEDOWN B+instance AdmitAttrONMOUSEDOWN BIG+instance AdmitAttrONMOUSEDOWN BLOCKQUOTE+instance AdmitAttrONMOUSEDOWN BODY+instance AdmitAttrONMOUSEDOWN BUTTON+instance AdmitAttrONMOUSEDOWN CAPTION+instance AdmitAttrONMOUSEDOWN CENTER+instance AdmitAttrONMOUSEDOWN CITE+instance AdmitAttrONMOUSEDOWN CODE+instance AdmitAttrONMOUSEDOWN COL+instance AdmitAttrONMOUSEDOWN COLGROUP+instance AdmitAttrONMOUSEDOWN DD+instance AdmitAttrONMOUSEDOWN DEL+instance AdmitAttrONMOUSEDOWN DFN+instance AdmitAttrONMOUSEDOWN DIR+instance AdmitAttrONMOUSEDOWN DIV+instance AdmitAttrONMOUSEDOWN DL+instance AdmitAttrONMOUSEDOWN DT+instance AdmitAttrONMOUSEDOWN EM+instance AdmitAttrONMOUSEDOWN FIELDSET+instance AdmitAttrONMOUSEDOWN FORM+instance AdmitAttrONMOUSEDOWN H1+instance AdmitAttrONMOUSEDOWN H2+instance AdmitAttrONMOUSEDOWN H3+instance AdmitAttrONMOUSEDOWN H4+instance AdmitAttrONMOUSEDOWN H5+instance AdmitAttrONMOUSEDOWN H6+instance AdmitAttrONMOUSEDOWN HR+instance AdmitAttrONMOUSEDOWN I+instance AdmitAttrONMOUSEDOWN IMG+instance AdmitAttrONMOUSEDOWN INPUT+instance AdmitAttrONMOUSEDOWN INS+instance AdmitAttrONMOUSEDOWN KBD+instance AdmitAttrONMOUSEDOWN LABEL+instance AdmitAttrONMOUSEDOWN LEGEND+instance AdmitAttrONMOUSEDOWN LI+instance AdmitAttrONMOUSEDOWN LINK+instance AdmitAttrONMOUSEDOWN MAP+instance AdmitAttrONMOUSEDOWN MENU+instance AdmitAttrONMOUSEDOWN NOFRAMES+instance AdmitAttrONMOUSEDOWN NOSCRIPT+instance AdmitAttrONMOUSEDOWN OBJECT+instance AdmitAttrONMOUSEDOWN OL+instance AdmitAttrONMOUSEDOWN OPTGROUP+instance AdmitAttrONMOUSEDOWN OPTION+instance AdmitAttrONMOUSEDOWN P+instance AdmitAttrONMOUSEDOWN PRE+instance AdmitAttrONMOUSEDOWN Q+instance AdmitAttrONMOUSEDOWN S+instance AdmitAttrONMOUSEDOWN SAMP+instance AdmitAttrONMOUSEDOWN SELECT+instance AdmitAttrONMOUSEDOWN SMALL+instance AdmitAttrONMOUSEDOWN SPAN+instance AdmitAttrONMOUSEDOWN STRIKE+instance AdmitAttrONMOUSEDOWN STRONG+instance AdmitAttrONMOUSEDOWN SUB+instance AdmitAttrONMOUSEDOWN SUP+instance AdmitAttrONMOUSEDOWN TABLE+instance AdmitAttrONMOUSEDOWN TBODY+instance AdmitAttrONMOUSEDOWN TD+instance AdmitAttrONMOUSEDOWN TEXTAREA+instance AdmitAttrONMOUSEDOWN TFOOT+instance AdmitAttrONMOUSEDOWN TH+instance AdmitAttrONMOUSEDOWN THEAD+instance AdmitAttrONMOUSEDOWN TR+instance AdmitAttrONMOUSEDOWN TT+instance AdmitAttrONMOUSEDOWN U+instance AdmitAttrONMOUSEDOWN UL+instance AdmitAttrONMOUSEDOWN VAR+instance AdmitAttrONMOUSEMOVE A+instance AdmitAttrONMOUSEMOVE ABBR+instance AdmitAttrONMOUSEMOVE ACRONYM+instance AdmitAttrONMOUSEMOVE ADDRESS+instance AdmitAttrONMOUSEMOVE AREA+instance AdmitAttrONMOUSEMOVE B+instance AdmitAttrONMOUSEMOVE BIG+instance AdmitAttrONMOUSEMOVE BLOCKQUOTE+instance AdmitAttrONMOUSEMOVE BODY+instance AdmitAttrONMOUSEMOVE BUTTON+instance AdmitAttrONMOUSEMOVE CAPTION+instance AdmitAttrONMOUSEMOVE CENTER+instance AdmitAttrONMOUSEMOVE CITE+instance AdmitAttrONMOUSEMOVE CODE+instance AdmitAttrONMOUSEMOVE COL+instance AdmitAttrONMOUSEMOVE COLGROUP+instance AdmitAttrONMOUSEMOVE DD+instance AdmitAttrONMOUSEMOVE DEL+instance AdmitAttrONMOUSEMOVE DFN+instance AdmitAttrONMOUSEMOVE DIR+instance AdmitAttrONMOUSEMOVE DIV+instance AdmitAttrONMOUSEMOVE DL+instance AdmitAttrONMOUSEMOVE DT+instance AdmitAttrONMOUSEMOVE EM+instance AdmitAttrONMOUSEMOVE FIELDSET+instance AdmitAttrONMOUSEMOVE FORM+instance AdmitAttrONMOUSEMOVE H1+instance AdmitAttrONMOUSEMOVE H2+instance AdmitAttrONMOUSEMOVE H3+instance AdmitAttrONMOUSEMOVE H4+instance AdmitAttrONMOUSEMOVE H5+instance AdmitAttrONMOUSEMOVE H6+instance AdmitAttrONMOUSEMOVE HR+instance AdmitAttrONMOUSEMOVE I+instance AdmitAttrONMOUSEMOVE IMG+instance AdmitAttrONMOUSEMOVE INPUT+instance AdmitAttrONMOUSEMOVE INS+instance AdmitAttrONMOUSEMOVE KBD+instance AdmitAttrONMOUSEMOVE LABEL+instance AdmitAttrONMOUSEMOVE LEGEND+instance AdmitAttrONMOUSEMOVE LI+instance AdmitAttrONMOUSEMOVE LINK+instance AdmitAttrONMOUSEMOVE MAP+instance AdmitAttrONMOUSEMOVE MENU+instance AdmitAttrONMOUSEMOVE NOFRAMES+instance AdmitAttrONMOUSEMOVE NOSCRIPT+instance AdmitAttrONMOUSEMOVE OBJECT+instance AdmitAttrONMOUSEMOVE OL+instance AdmitAttrONMOUSEMOVE OPTGROUP+instance AdmitAttrONMOUSEMOVE OPTION+instance AdmitAttrONMOUSEMOVE P+instance AdmitAttrONMOUSEMOVE PRE+instance AdmitAttrONMOUSEMOVE Q+instance AdmitAttrONMOUSEMOVE S+instance AdmitAttrONMOUSEMOVE SAMP+instance AdmitAttrONMOUSEMOVE SELECT+instance AdmitAttrONMOUSEMOVE SMALL+instance AdmitAttrONMOUSEMOVE SPAN+instance AdmitAttrONMOUSEMOVE STRIKE+instance AdmitAttrONMOUSEMOVE STRONG+instance AdmitAttrONMOUSEMOVE SUB+instance AdmitAttrONMOUSEMOVE SUP+instance AdmitAttrONMOUSEMOVE TABLE+instance AdmitAttrONMOUSEMOVE TBODY+instance AdmitAttrONMOUSEMOVE TD+instance AdmitAttrONMOUSEMOVE TEXTAREA+instance AdmitAttrONMOUSEMOVE TFOOT+instance AdmitAttrONMOUSEMOVE TH+instance AdmitAttrONMOUSEMOVE THEAD+instance AdmitAttrONMOUSEMOVE TR+instance AdmitAttrONMOUSEMOVE TT+instance AdmitAttrONMOUSEMOVE U+instance AdmitAttrONMOUSEMOVE UL+instance AdmitAttrONMOUSEMOVE VAR+instance AdmitAttrONMOUSEOUT A+instance AdmitAttrONMOUSEOUT ABBR+instance AdmitAttrONMOUSEOUT ACRONYM+instance AdmitAttrONMOUSEOUT ADDRESS+instance AdmitAttrONMOUSEOUT AREA+instance AdmitAttrONMOUSEOUT B+instance AdmitAttrONMOUSEOUT BIG+instance AdmitAttrONMOUSEOUT BLOCKQUOTE+instance AdmitAttrONMOUSEOUT BODY+instance AdmitAttrONMOUSEOUT BUTTON+instance AdmitAttrONMOUSEOUT CAPTION+instance AdmitAttrONMOUSEOUT CENTER+instance AdmitAttrONMOUSEOUT CITE+instance AdmitAttrONMOUSEOUT CODE+instance AdmitAttrONMOUSEOUT COL+instance AdmitAttrONMOUSEOUT COLGROUP+instance AdmitAttrONMOUSEOUT DD+instance AdmitAttrONMOUSEOUT DEL+instance AdmitAttrONMOUSEOUT DFN+instance AdmitAttrONMOUSEOUT DIR+instance AdmitAttrONMOUSEOUT DIV+instance AdmitAttrONMOUSEOUT DL+instance AdmitAttrONMOUSEOUT DT+instance AdmitAttrONMOUSEOUT EM+instance AdmitAttrONMOUSEOUT FIELDSET+instance AdmitAttrONMOUSEOUT FORM+instance AdmitAttrONMOUSEOUT H1+instance AdmitAttrONMOUSEOUT H2+instance AdmitAttrONMOUSEOUT H3+instance AdmitAttrONMOUSEOUT H4+instance AdmitAttrONMOUSEOUT H5+instance AdmitAttrONMOUSEOUT H6+instance AdmitAttrONMOUSEOUT HR+instance AdmitAttrONMOUSEOUT I+instance AdmitAttrONMOUSEOUT IMG+instance AdmitAttrONMOUSEOUT INPUT+instance AdmitAttrONMOUSEOUT INS+instance AdmitAttrONMOUSEOUT KBD+instance AdmitAttrONMOUSEOUT LABEL+instance AdmitAttrONMOUSEOUT LEGEND+instance AdmitAttrONMOUSEOUT LI+instance AdmitAttrONMOUSEOUT LINK+instance AdmitAttrONMOUSEOUT MAP+instance AdmitAttrONMOUSEOUT MENU+instance AdmitAttrONMOUSEOUT NOFRAMES+instance AdmitAttrONMOUSEOUT NOSCRIPT+instance AdmitAttrONMOUSEOUT OBJECT+instance AdmitAttrONMOUSEOUT OL+instance AdmitAttrONMOUSEOUT OPTGROUP+instance AdmitAttrONMOUSEOUT OPTION+instance AdmitAttrONMOUSEOUT P+instance AdmitAttrONMOUSEOUT PRE+instance AdmitAttrONMOUSEOUT Q+instance AdmitAttrONMOUSEOUT S+instance AdmitAttrONMOUSEOUT SAMP+instance AdmitAttrONMOUSEOUT SELECT+instance AdmitAttrONMOUSEOUT SMALL+instance AdmitAttrONMOUSEOUT SPAN+instance AdmitAttrONMOUSEOUT STRIKE+instance AdmitAttrONMOUSEOUT STRONG+instance AdmitAttrONMOUSEOUT SUB+instance AdmitAttrONMOUSEOUT SUP+instance AdmitAttrONMOUSEOUT TABLE+instance AdmitAttrONMOUSEOUT TBODY+instance AdmitAttrONMOUSEOUT TD+instance AdmitAttrONMOUSEOUT TEXTAREA+instance AdmitAttrONMOUSEOUT TFOOT+instance AdmitAttrONMOUSEOUT TH+instance AdmitAttrONMOUSEOUT THEAD+instance AdmitAttrONMOUSEOUT TR+instance AdmitAttrONMOUSEOUT TT+instance AdmitAttrONMOUSEOUT U+instance AdmitAttrONMOUSEOUT UL+instance AdmitAttrONMOUSEOUT VAR+instance AdmitAttrONMOUSEOVER A+instance AdmitAttrONMOUSEOVER ABBR+instance AdmitAttrONMOUSEOVER ACRONYM+instance AdmitAttrONMOUSEOVER ADDRESS+instance AdmitAttrONMOUSEOVER AREA+instance AdmitAttrONMOUSEOVER B+instance AdmitAttrONMOUSEOVER BIG+instance AdmitAttrONMOUSEOVER BLOCKQUOTE+instance AdmitAttrONMOUSEOVER BODY+instance AdmitAttrONMOUSEOVER BUTTON+instance AdmitAttrONMOUSEOVER CAPTION+instance AdmitAttrONMOUSEOVER CENTER+instance AdmitAttrONMOUSEOVER CITE+instance AdmitAttrONMOUSEOVER CODE+instance AdmitAttrONMOUSEOVER COL+instance AdmitAttrONMOUSEOVER COLGROUP+instance AdmitAttrONMOUSEOVER DD+instance AdmitAttrONMOUSEOVER DEL+instance AdmitAttrONMOUSEOVER DFN+instance AdmitAttrONMOUSEOVER DIR+instance AdmitAttrONMOUSEOVER DIV+instance AdmitAttrONMOUSEOVER DL+instance AdmitAttrONMOUSEOVER DT+instance AdmitAttrONMOUSEOVER EM+instance AdmitAttrONMOUSEOVER FIELDSET+instance AdmitAttrONMOUSEOVER FORM+instance AdmitAttrONMOUSEOVER H1+instance AdmitAttrONMOUSEOVER H2+instance AdmitAttrONMOUSEOVER H3+instance AdmitAttrONMOUSEOVER H4+instance AdmitAttrONMOUSEOVER H5+instance AdmitAttrONMOUSEOVER H6+instance AdmitAttrONMOUSEOVER HR+instance AdmitAttrONMOUSEOVER I+instance AdmitAttrONMOUSEOVER IMG+instance AdmitAttrONMOUSEOVER INPUT+instance AdmitAttrONMOUSEOVER INS+instance AdmitAttrONMOUSEOVER KBD+instance AdmitAttrONMOUSEOVER LABEL+instance AdmitAttrONMOUSEOVER LEGEND+instance AdmitAttrONMOUSEOVER LI+instance AdmitAttrONMOUSEOVER LINK+instance AdmitAttrONMOUSEOVER MAP+instance AdmitAttrONMOUSEOVER MENU+instance AdmitAttrONMOUSEOVER NOFRAMES+instance AdmitAttrONMOUSEOVER NOSCRIPT+instance AdmitAttrONMOUSEOVER OBJECT+instance AdmitAttrONMOUSEOVER OL+instance AdmitAttrONMOUSEOVER OPTGROUP+instance AdmitAttrONMOUSEOVER OPTION+instance AdmitAttrONMOUSEOVER P+instance AdmitAttrONMOUSEOVER PRE+instance AdmitAttrONMOUSEOVER Q+instance AdmitAttrONMOUSEOVER S+instance AdmitAttrONMOUSEOVER SAMP+instance AdmitAttrONMOUSEOVER SELECT+instance AdmitAttrONMOUSEOVER SMALL+instance AdmitAttrONMOUSEOVER SPAN+instance AdmitAttrONMOUSEOVER STRIKE+instance AdmitAttrONMOUSEOVER STRONG+instance AdmitAttrONMOUSEOVER SUB+instance AdmitAttrONMOUSEOVER SUP+instance AdmitAttrONMOUSEOVER TABLE+instance AdmitAttrONMOUSEOVER TBODY+instance AdmitAttrONMOUSEOVER TD+instance AdmitAttrONMOUSEOVER TEXTAREA+instance AdmitAttrONMOUSEOVER TFOOT+instance AdmitAttrONMOUSEOVER TH+instance AdmitAttrONMOUSEOVER THEAD+instance AdmitAttrONMOUSEOVER TR+instance AdmitAttrONMOUSEOVER TT+instance AdmitAttrONMOUSEOVER U+instance AdmitAttrONMOUSEOVER UL+instance AdmitAttrONMOUSEOVER VAR+instance AdmitAttrONMOUSEUP A+instance AdmitAttrONMOUSEUP ABBR+instance AdmitAttrONMOUSEUP ACRONYM+instance AdmitAttrONMOUSEUP ADDRESS+instance AdmitAttrONMOUSEUP AREA+instance AdmitAttrONMOUSEUP B+instance AdmitAttrONMOUSEUP BIG+instance AdmitAttrONMOUSEUP BLOCKQUOTE+instance AdmitAttrONMOUSEUP BODY+instance AdmitAttrONMOUSEUP BUTTON+instance AdmitAttrONMOUSEUP CAPTION+instance AdmitAttrONMOUSEUP CENTER+instance AdmitAttrONMOUSEUP CITE+instance AdmitAttrONMOUSEUP CODE+instance AdmitAttrONMOUSEUP COL+instance AdmitAttrONMOUSEUP COLGROUP+instance AdmitAttrONMOUSEUP DD+instance AdmitAttrONMOUSEUP DEL+instance AdmitAttrONMOUSEUP DFN+instance AdmitAttrONMOUSEUP DIR+instance AdmitAttrONMOUSEUP DIV+instance AdmitAttrONMOUSEUP DL+instance AdmitAttrONMOUSEUP DT+instance AdmitAttrONMOUSEUP EM+instance AdmitAttrONMOUSEUP FIELDSET+instance AdmitAttrONMOUSEUP FORM+instance AdmitAttrONMOUSEUP H1+instance AdmitAttrONMOUSEUP H2+instance AdmitAttrONMOUSEUP H3+instance AdmitAttrONMOUSEUP H4+instance AdmitAttrONMOUSEUP H5+instance AdmitAttrONMOUSEUP H6+instance AdmitAttrONMOUSEUP HR+instance AdmitAttrONMOUSEUP I+instance AdmitAttrONMOUSEUP IMG+instance AdmitAttrONMOUSEUP INPUT+instance AdmitAttrONMOUSEUP INS+instance AdmitAttrONMOUSEUP KBD+instance AdmitAttrONMOUSEUP LABEL+instance AdmitAttrONMOUSEUP LEGEND+instance AdmitAttrONMOUSEUP LI+instance AdmitAttrONMOUSEUP LINK+instance AdmitAttrONMOUSEUP MAP+instance AdmitAttrONMOUSEUP MENU+instance AdmitAttrONMOUSEUP NOFRAMES+instance AdmitAttrONMOUSEUP NOSCRIPT+instance AdmitAttrONMOUSEUP OBJECT+instance AdmitAttrONMOUSEUP OL+instance AdmitAttrONMOUSEUP OPTGROUP+instance AdmitAttrONMOUSEUP OPTION+instance AdmitAttrONMOUSEUP P+instance AdmitAttrONMOUSEUP PRE+instance AdmitAttrONMOUSEUP Q+instance AdmitAttrONMOUSEUP S+instance AdmitAttrONMOUSEUP SAMP+instance AdmitAttrONMOUSEUP SELECT+instance AdmitAttrONMOUSEUP SMALL+instance AdmitAttrONMOUSEUP SPAN+instance AdmitAttrONMOUSEUP STRIKE+instance AdmitAttrONMOUSEUP STRONG+instance AdmitAttrONMOUSEUP SUB+instance AdmitAttrONMOUSEUP SUP+instance AdmitAttrONMOUSEUP TABLE+instance AdmitAttrONMOUSEUP TBODY+instance AdmitAttrONMOUSEUP TD+instance AdmitAttrONMOUSEUP TEXTAREA+instance AdmitAttrONMOUSEUP TFOOT+instance AdmitAttrONMOUSEUP TH+instance AdmitAttrONMOUSEUP THEAD+instance AdmitAttrONMOUSEUP TR+instance AdmitAttrONMOUSEUP TT+instance AdmitAttrONMOUSEUP U+instance AdmitAttrONMOUSEUP UL+instance AdmitAttrONMOUSEUP VAR+instance AdmitAttrONRESET FORM+instance AdmitAttrONSELECT INPUT+instance AdmitAttrONSELECT TEXTAREA+instance AdmitAttrONSUBMIT FORM+instance AdmitAttrONUNLOAD BODY+instance AdmitAttrPROFILE HEAD+instance AdmitAttrPROMPT ISINDEX+instance AdmitAttrREADONLY INPUT+instance AdmitAttrREADONLY TEXTAREA+instance AdmitAttrREL A+instance AdmitAttrREL LINK+instance AdmitAttrREV A+instance AdmitAttrREV LINK+instance AdmitAttrROWS TEXTAREA+instance AdmitAttrROWSPAN TD+instance AdmitAttrROWSPAN TH+instance AdmitAttrRULES TABLE+instance AdmitAttrSCHEME META+instance AdmitAttrSCOPE TD+instance AdmitAttrSCOPE TH+instance AdmitAttrSCROLLING IFRAME+instance AdmitAttrSELECTED OPTION+instance AdmitAttrSHAPE A+instance AdmitAttrSHAPE AREA+instance AdmitAttrSIZE BASEFONT+instance AdmitAttrSIZE FONT+instance AdmitAttrSIZE HR+instance AdmitAttrSIZE INPUT+instance AdmitAttrSIZE SELECT+instance AdmitAttrSPAN COL+instance AdmitAttrSPAN COLGROUP+instance AdmitAttrSRC IFRAME+instance AdmitAttrSRC IMG+instance AdmitAttrSRC INPUT+instance AdmitAttrSRC SCRIPT+instance AdmitAttrSTANDBY OBJECT+instance AdmitAttrSTART OL+instance AdmitAttrSTYLE A+instance AdmitAttrSTYLE ABBR+instance AdmitAttrSTYLE ACRONYM+instance AdmitAttrSTYLE ADDRESS+instance AdmitAttrSTYLE APPLET+instance AdmitAttrSTYLE AREA+instance AdmitAttrSTYLE B+instance AdmitAttrSTYLE BDO+instance AdmitAttrSTYLE BIG+instance AdmitAttrSTYLE BLOCKQUOTE+instance AdmitAttrSTYLE BODY+instance AdmitAttrSTYLE BR+instance AdmitAttrSTYLE BUTTON+instance AdmitAttrSTYLE CAPTION+instance AdmitAttrSTYLE CENTER+instance AdmitAttrSTYLE CITE+instance AdmitAttrSTYLE CODE+instance AdmitAttrSTYLE COL+instance AdmitAttrSTYLE COLGROUP+instance AdmitAttrSTYLE DD+instance AdmitAttrSTYLE DEL+instance AdmitAttrSTYLE DFN+instance AdmitAttrSTYLE DIR+instance AdmitAttrSTYLE DIV+instance AdmitAttrSTYLE DL+instance AdmitAttrSTYLE DT+instance AdmitAttrSTYLE EM+instance AdmitAttrSTYLE FIELDSET+instance AdmitAttrSTYLE FONT+instance AdmitAttrSTYLE FORM+instance AdmitAttrSTYLE H1+instance AdmitAttrSTYLE H2+instance AdmitAttrSTYLE H3+instance AdmitAttrSTYLE H4+instance AdmitAttrSTYLE H5+instance AdmitAttrSTYLE H6+instance AdmitAttrSTYLE HR+instance AdmitAttrSTYLE I+instance AdmitAttrSTYLE IFRAME+instance AdmitAttrSTYLE IMG+instance AdmitAttrSTYLE INPUT+instance AdmitAttrSTYLE INS+instance AdmitAttrSTYLE ISINDEX+instance AdmitAttrSTYLE KBD+instance AdmitAttrSTYLE LABEL+instance AdmitAttrSTYLE LEGEND+instance AdmitAttrSTYLE LI+instance AdmitAttrSTYLE LINK+instance AdmitAttrSTYLE MAP+instance AdmitAttrSTYLE MENU+instance AdmitAttrSTYLE NOFRAMES+instance AdmitAttrSTYLE NOSCRIPT+instance AdmitAttrSTYLE OBJECT+instance AdmitAttrSTYLE OL+instance AdmitAttrSTYLE OPTGROUP+instance AdmitAttrSTYLE OPTION+instance AdmitAttrSTYLE P+instance AdmitAttrSTYLE PRE+instance AdmitAttrSTYLE Q+instance AdmitAttrSTYLE S+instance AdmitAttrSTYLE SAMP+instance AdmitAttrSTYLE SELECT+instance AdmitAttrSTYLE SMALL+instance AdmitAttrSTYLE SPAN+instance AdmitAttrSTYLE STRIKE+instance AdmitAttrSTYLE STRONG+instance AdmitAttrSTYLE SUB+instance AdmitAttrSTYLE SUP+instance AdmitAttrSTYLE TABLE+instance AdmitAttrSTYLE TBODY+instance AdmitAttrSTYLE TD+instance AdmitAttrSTYLE TEXTAREA+instance AdmitAttrSTYLE TFOOT+instance AdmitAttrSTYLE TH+instance AdmitAttrSTYLE THEAD+instance AdmitAttrSTYLE TR+instance AdmitAttrSTYLE TT+instance AdmitAttrSTYLE U+instance AdmitAttrSTYLE UL+instance AdmitAttrSTYLE VAR+instance AdmitAttrSUMMARY TABLE+instance AdmitAttrTABINDEX A+instance AdmitAttrTABINDEX AREA+instance AdmitAttrTABINDEX BUTTON+instance AdmitAttrTABINDEX INPUT+instance AdmitAttrTABINDEX OBJECT+instance AdmitAttrTABINDEX SELECT+instance AdmitAttrTABINDEX TEXTAREA+instance AdmitAttrTARGET A+instance AdmitAttrTARGET AREA+instance AdmitAttrTARGET BASE+instance AdmitAttrTARGET FORM+instance AdmitAttrTARGET LINK+instance AdmitAttrTEXT BODY+instance AdmitAttrTITLE A+instance AdmitAttrTITLE ABBR+instance AdmitAttrTITLE ACRONYM+instance AdmitAttrTITLE ADDRESS+instance AdmitAttrTITLE APPLET+instance AdmitAttrTITLE AREA+instance AdmitAttrTITLE B+instance AdmitAttrTITLE BDO+instance AdmitAttrTITLE BIG+instance AdmitAttrTITLE BLOCKQUOTE+instance AdmitAttrTITLE BODY+instance AdmitAttrTITLE BR+instance AdmitAttrTITLE BUTTON+instance AdmitAttrTITLE CAPTION+instance AdmitAttrTITLE CENTER+instance AdmitAttrTITLE CITE+instance AdmitAttrTITLE CODE+instance AdmitAttrTITLE COL+instance AdmitAttrTITLE COLGROUP+instance AdmitAttrTITLE DD+instance AdmitAttrTITLE DEL+instance AdmitAttrTITLE DFN+instance AdmitAttrTITLE DIR+instance AdmitAttrTITLE DIV+instance AdmitAttrTITLE DL+instance AdmitAttrTITLE DT+instance AdmitAttrTITLE EM+instance AdmitAttrTITLE FIELDSET+instance AdmitAttrTITLE FONT+instance AdmitAttrTITLE FORM+instance AdmitAttrTITLE H1+instance AdmitAttrTITLE H2+instance AdmitAttrTITLE H3+instance AdmitAttrTITLE H4+instance AdmitAttrTITLE H5+instance AdmitAttrTITLE H6+instance AdmitAttrTITLE HR+instance AdmitAttrTITLE I+instance AdmitAttrTITLE IFRAME+instance AdmitAttrTITLE IMG+instance AdmitAttrTITLE INPUT+instance AdmitAttrTITLE INS+instance AdmitAttrTITLE ISINDEX+instance AdmitAttrTITLE KBD+instance AdmitAttrTITLE LABEL+instance AdmitAttrTITLE LEGEND+instance AdmitAttrTITLE LI+instance AdmitAttrTITLE LINK+instance AdmitAttrTITLE MAP+instance AdmitAttrTITLE MENU+instance AdmitAttrTITLE NOFRAMES+instance AdmitAttrTITLE NOSCRIPT+instance AdmitAttrTITLE OBJECT+instance AdmitAttrTITLE OL+instance AdmitAttrTITLE OPTGROUP+instance AdmitAttrTITLE OPTION+instance AdmitAttrTITLE P+instance AdmitAttrTITLE PRE+instance AdmitAttrTITLE Q+instance AdmitAttrTITLE S+instance AdmitAttrTITLE SAMP+instance AdmitAttrTITLE SELECT+instance AdmitAttrTITLE SMALL+instance AdmitAttrTITLE SPAN+instance AdmitAttrTITLE STRIKE+instance AdmitAttrTITLE STRONG+instance AdmitAttrTITLE STYLE+instance AdmitAttrTITLE SUB+instance AdmitAttrTITLE SUP+instance AdmitAttrTITLE TABLE+instance AdmitAttrTITLE TBODY+instance AdmitAttrTITLE TD+instance AdmitAttrTITLE TEXTAREA+instance AdmitAttrTITLE TFOOT+instance AdmitAttrTITLE TH+instance AdmitAttrTITLE THEAD+instance AdmitAttrTITLE TR+instance AdmitAttrTITLE TT+instance AdmitAttrTITLE U+instance AdmitAttrTITLE UL+instance AdmitAttrTITLE VAR+instance AdmitAttrTYPE A+instance AdmitAttrTYPE BUTTON+instance AdmitAttrTYPE INPUT+instance AdmitAttrTYPE LI+instance AdmitAttrTYPE LINK+instance AdmitAttrTYPE OBJECT+instance AdmitAttrTYPE OL+instance AdmitAttrTYPE PARAM+instance AdmitAttrTYPE SCRIPT+instance AdmitAttrTYPE STYLE+instance AdmitAttrTYPE UL+instance AdmitAttrUSEMAP IMG+instance AdmitAttrUSEMAP INPUT+instance AdmitAttrUSEMAP OBJECT+instance AdmitAttrVALIGN COL+instance AdmitAttrVALIGN COLGROUP+instance AdmitAttrVALIGN TBODY+instance AdmitAttrVALIGN TD+instance AdmitAttrVALIGN TFOOT+instance AdmitAttrVALIGN TH+instance AdmitAttrVALIGN THEAD+instance AdmitAttrVALIGN TR+instance AdmitAttrVALUE BUTTON+instance AdmitAttrVALUE INPUT+instance AdmitAttrVALUE LI+instance AdmitAttrVALUE OPTION+instance AdmitAttrVALUE PARAM+instance AdmitAttrVALUETYPE PARAM+instance AdmitAttrVERSION HTML+instance AdmitAttrVLINK BODY+instance AdmitAttrVSPACE APPLET+instance AdmitAttrVSPACE IMG+instance AdmitAttrVSPACE OBJECT+instance AdmitAttrWIDTH APPLET+instance AdmitAttrWIDTH COL+instance AdmitAttrWIDTH COLGROUP+instance AdmitAttrWIDTH HR+instance AdmitAttrWIDTH IFRAME+instance AdmitAttrWIDTH IMG+instance AdmitAttrWIDTH OBJECT+instance AdmitAttrWIDTH PRE+instance AdmitAttrWIDTH TABLE+instance AdmitAttrWIDTH TD+instance AdmitAttrWIDTH TH
+ WASH/HTML/HTMLTemplates.hs view
@@ -0,0 +1,516 @@+module WASH.HTML.HTMLTemplates where++import WASH.HTML.HTMLBase+import WASH.Utility.SHA1+import WASH.Utility.JavaScript+import qualified WASH.Utility.Base32 as Base32++import Monad (unless)+import List ((\\))++data ST s a =  ST { unST :: s -> (a, s) }+instance Monad (ST s) where+  return x = ST (\s -> (x, s))+  m >>= f  = ST (\s -> let (x', s') = unST m s+		       in  unST (f x') s')++runST :: s -> ST s a -> a+runST s m = fst (unST m s)++getST :: ST s s+getST = ST (\s -> (s, s))++setST :: s -> ST s ()+setST s = ST (const ((), s))++data Names = Names { ntable :: [(String, Int)], nseen :: [Int] }++----------------------------------------------------------------------+-- template generation+----------------------------------------------------------------------+showTemplatified :: ELEMENT_ -> ShowS+showTemplatified = showTemplate . analyze++showTemplate :: (Template, Mt) -> ShowS+showTemplate (tis, mt) =+  let ts = closed mt+      ndefs = length ts +      at = actuals mt+      st = buildStringTableArgs at+      cst = cleanupStringTable ndefs st+      shownargs = runST (Names { ntable = cst, nseen = [] })+			(showActualArgs at)+  in+  showDefinitions ndefs ts .+  showString "<script name=\"BODY\">\n" .+  -- showStringTable cst .+  showString "S(" . shownargs . showString ",document)" .+  showString "\n</script>\n"++showDefinitions n [] =+  let scriptName = "STRINGBASE"+  in+  showString "<script name=\"" . showString scriptName . showString "\">\n" .+  showString "function S (template, out) {\n" .+  showString "  var ty = typeof template;\n" .+  showString "  if (ty == \"string\") out.write (template);\n" .+  showString "  else if (ty == \"object\")\n" .+  showString "    for (var i = 0; i<template.length; i++)\n" .+  showString "      S (template[i], out);\n" .+  showString "}\n" .+  showString "</script>\n"+    +showDefinitions n ((scriptName, (nr, nformals, t1)) :ts) =+  showString "<script name=\"" . showString scriptName . showString "\">\n" .+  (if nformals==0 then showString "var " else showString "function ") . showsIdent n . +  (if nformals==0 then showString "=" else showString "(" . showFormals nformals . showString ")" .+  showString "{return") .+  showString "[" .+  showBody t1 .+  showString "]" .+  (if nformals==0 then id else showString "}\n") .+  showString "</script>\n" .+  showDefinitions (n-1) ts++showsIdent n = showString (identlist !! n)++charlist = (['A'..'Z'] ++ ['a'..'z'])+alphanumlist = ['0'..'9'] ++ charlist++identlist = ([ [c] | c <- charlist ]+	 ++ [ [c,d] | c <- charlist, d <- alphanumlist ])+	 \\ ["S","o","v"]++  +showBody [] = +  id+showBody [ti] =+  showStatement ti+showBody (ti:tis) =+  showBody tis .+  showString "," .+  showStatement ti++showStatement (TOut str) =+  showString (jsShow str)+showStatement (TVar n) =+  showsIdent n+showStatement (TCall fname args) =+  error "this should not happen"++showFormals 0 =+  id+showFormals n =+  (if n>1 then showFormals (n-1) . showString "," else id) .+  showsIdent n++showActual (TOut str) =+  do names <- getST+     let cst = ntable names+	 seen = nseen names+     case lookup str cst of+       Nothing ->+	 return $ showString (jsShow str)+       Just strident ->+	 if strident `elem` seen+	 then return $ showsIdent strident+	 else+           do setST (names { nseen = strident : seen })+	      return $+		(showsIdent strident . showChar '=' . showString (jsShow str))+showActual (TVar n) =+  error "this should not happen"+showActual (TCall fname []) =+  return $ showsIdent fname+showActual (TCall fname args) =+  do saa <- showActualArgs args+     return (showsIdent fname . showString "(" .+	     saa .+	     showString ")")++showActualArgs [] = +  return id+showActualArgs [arg] =+  showActualArg arg+showActualArgs (arg: args) =+  do x1 <- showActualArgs args+     x2 <- showActualArg arg+     return (x1 . showString "," . x2)++showActualArg [x] =+  showActual x+showActualArg xs = +  do hxs <- h xs+     return (showString "[" . hxs . showString "]")+  where +    h [] = return id+    h [x] = showActual x+    h (x:xs) = do sax <- showActual x+		  hxs <- h xs+		  return (sax . showChar ',' . hxs)++showStringTable =+  foldr g id+  where+    g (str, n) showrest =+      showString "var " . showsIdent n . showString "=" . showString (jsShow str) .+      showString ";\n" . showrest++cleanupStringTable ndefs st =+  zip [str | (str, n) <- st, n > 3 || length str > 2 && n > 1]+      [(ndefs+1) ..]+unite st1 st2 =+  foldr g st1 st2+  where g p@(str,i) st1 =+	  case lookup str st1 of+	    Nothing -> p:st1+	    Just j -> (str, i+j):[ p | (p@(str',_)) <- st1, str' /= str ]+buildStringTableArgs = +  foldr unite [] . map buildStringTableArg+buildStringTableArg =+  foldr unite [] . map buildStringTableActual+buildStringTableActual (TOut str) =+  [(str, 1)]+buildStringTableActual (TVar n) =+  error "this should not happen"+buildStringTableActual (TCall fname args) =+  buildStringTableArgs args+	  +----------------------------------------------------------------------+-- template analysis+----------------------------------------------------------------------++analyze :: ELEMENT_ -> (Template, Mt)+analyze e = unM (collect e STATIC []) mt0++data Mt = Mt+    { open :: Templates+    , closed :: [(String, (Int, Int, Template))]+    , dynamics :: [Templates]+    , actuals :: Templates+    , count :: Int+    }+    deriving Show++mt0 = Mt { open = []+	 , closed = []+	 , dynamics = []+	 , actuals = []+	 , count = 0+	 }++type Templates = [Template]++type Template = [TemplateItem]++data TemplateItem+  = TOut String+  | TVar Int+  | TCall Int [Template]+  deriving Show++tout :: String -> [TemplateItem] -> [TemplateItem]+tout s (TOut s' : rest) = (TOut (s'++s) : rest) +tout s tis = TOut s : tis++data M a = M { unM :: Mt -> (a, Mt) }++instance Monad M where+  return a = M (\t -> (a, t))+  m >>= f  = M (\t -> let (a,t') = unM m t in unM (f a) t')++pushOpen :: Template -> M ()+pushOpen t = M (\mt -> ((), mt { open = t : open mt+			       , dynamics = actuals mt : dynamics mt +			       , actuals = []+			       } ))+popOpen :: M Template+popOpen = M (\mt -> (head (open mt), mt { open = tail (open mt)+					, actuals = head (dynamics mt)+					, dynamics = tail (dynamics mt)+					}))++pushClosed :: Template -> M Int+pushClosed tis = +  M (\mt -> +     let defs = closed mt +	 name = Base32.encode (sha1 (show tis)) +     in+     case lookup name defs of+       Nothing ->+	 let next = length (closed mt) + 1 in+	 (next, mt { closed = (name, (next, length (actuals mt), tis)) : defs })+       Just (last, nargs, _) ->+	 (last, mt))++pushActuals :: Template -> M Int+pushActuals tis = +  M (\mt -> (length (actuals mt) + 1, mt { actuals = tis : actuals mt }))++getActuals :: M Templates+getActuals = M (\mt -> (actuals mt, mt))++get :: (Mt -> x) -> M x+get f = M (\mt -> (f mt, mt))++mergeActuals :: Template -> M ()+mergeActuals tis =+  M (\mt -> +     let act0 : acts = actuals mt in+     ((), mt { actuals = (act0 ++ tis) : actuals mt }))++maybePushActuals :: Template -> Template -> M Template+maybePushActuals cur tis =+  case cur of+    TVar _ : _ ->+      do mergeActuals tis+	 return cur+    _ ->+      do vname <- pushActuals tis+	 return (TVar vname : cur)++-- |collect takes an element, a list of open templates, a list of finished+-- templates, and returns a pair (open templates, finished templates).+collect :: ELEMENT_ -> BT -> Template -> M Template+collect (EMPTY_ bt tag atts) cbt cur =+  let t1 = TOut ('<' : tag)+      t2 = tout "/>"+  in+  case bt of +    TOPLEVEL -> +      do pushOpen cur+	 ts <- collectAttrs atts STATIC [t1]+	 fname <- pushClosed (t2 ts)+	 parms <- get actuals+	 cur' <- popOpen+	 maybePushActuals cur' [TCall fname parms]+    DYNAMIC ->+      case cbt of+	STATIC ->+	  do ts <- collectAttrs atts DYNAMIC [t1]+	     maybePushActuals cur (t2 ts)+	DYNAMIC ->+	  do ts <- collectAttrs atts DYNAMIC (t1 : cur)+	     return (t2 ts)+    STATIC ->+      case cbt of+	STATIC ->+	  do ts <- collectAttrs atts STATIC (t1 : cur)+	     return (t2 ts)+	DYNAMIC ->+	  do pushOpen cur+	     ts <- collectAttrs atts STATIC [t1]+	     fname <- pushClosed (t2 ts)+	     parms <- get actuals+	     cur' <- popOpen+	     maybePushActuals cur' [TCall fname parms]++collect (ELEMENT_ bt tag atts elems) cbt cur =+  let t1 = TOut ('<' : tag)+      t1' = tout ('<' : tag)+      t2 = tout ">"+      t3 = tout ("</" ++ tag ++ ">")+  in+  case bt of +    TOPLEVEL -> +      do pushOpen cur+	 ts1 <- collectAttrs atts STATIC [t1]+	 ts2 <- collectElems elems STATIC (t2 ts1)+	 fname <- pushClosed (t3 ts2)+	 parms <- get actuals+	 cur' <- popOpen+	 maybePushActuals cur' [TCall fname parms]+    DYNAMIC ->+      case cbt of+	STATIC ->+	  do ts1 <- collectAttrs atts DYNAMIC [t1]+	     ts2 <- collectElems elems DYNAMIC (t2 ts1)+	     maybePushActuals cur (t3 ts2)+	DYNAMIC ->+	  do ts1 <- collectAttrs atts DYNAMIC (t1' cur)+	     ts2 <- collectElems elems DYNAMIC (t2 ts1)+	     return (t3 ts2)+    STATIC ->+      case cbt of+	STATIC ->+	  do ts1 <- collectAttrs atts STATIC (t1' cur)+	     ts2 <- collectElems elems STATIC (t2 ts1)+	     return (t3 ts2)+	DYNAMIC ->+	  do pushOpen cur+	     ts1 <- collectAttrs atts STATIC [t1]+	     ts2 <- collectElems elems STATIC (t2 ts1)+	     fname <- pushClosed (t3 ts2)+	     parms <- get actuals+	     cur' <- popOpen+	     maybePushActuals cur' [TCall fname parms]++collect (DOCTYPE_ bt strs elems) cbt cur =+  let t1 = TOut ("<!DOCTYPE" +++		 (foldr (\str f -> showChar ' ' . showString str . f) id strs .+		  showString ">")+		 "<!-- generated by WASH/HTML 0.11\n-->")+  in+  case bt of +    TOPLEVEL -> +      do pushOpen cur+	 ts2 <- collectElems elems STATIC [t1]+	 fname <- pushClosed ts2+	 parms <- get actuals+	 cur' <- popOpen+	 maybePushActuals cur' [TCall fname parms]+    DYNAMIC ->+      case cbt of+	STATIC ->+	  do ts2 <- collectElems elems DYNAMIC [t1]+	     maybePushActuals cur ts2+	DYNAMIC ->+	  do collectElems elems DYNAMIC (t1 : cur)+    STATIC ->+      case cbt of+	STATIC ->+	  do collectElems elems STATIC (t1 : cur)+	DYNAMIC ->+	  do pushOpen cur+	     ts2 <- collectElems elems STATIC [t1]+	     fname <- pushClosed ts2+	     parms <- get actuals+	     cur' <- popOpen+	     maybePushActuals cur' [TCall fname parms]++collect (CDATA_ bt str) cbt cur =+  let t0 = TOut str+      t0' = tout str in+  case bt of +    TOPLEVEL -> +      do pushOpen cur+	 fname <- pushClosed [t0]+	 parms <- get actuals+	 cur' <- popOpen+	 maybePushActuals cur' [TCall fname parms]+    DYNAMIC ->+      case cbt of+	STATIC ->+	  do maybePushActuals cur [t0]+	DYNAMIC ->+	  do return [t0]+    STATIC ->+      case cbt of+	STATIC ->+	  do return (t0' cur)+	DYNAMIC ->+	  do pushOpen cur+	     fname <- pushClosed [t0]+	     parms <- get actuals+	     cur' <- popOpen+	     maybePushActuals cur' [TCall fname parms]++collect (COMMENT_ bt str) cbt cur =+  let t0 = TOut str+      t0' = tout str in+  case bt of +    TOPLEVEL -> +      do pushOpen cur+	 fname <- pushClosed [t0]+	 parms <- get actuals+	 cur' <- popOpen+	 maybePushActuals cur' [TCall fname parms]+    DYNAMIC ->+      case cbt of+	STATIC ->+	  do maybePushActuals cur [t0]+	DYNAMIC ->+	  do return [t0]+    STATIC ->+      case cbt of+	STATIC ->+	  do return (t0' cur)+	DYNAMIC ->+	  do pushOpen cur+	     fname <- pushClosed [t0]+	     parms <- get actuals+	     cur' <- popOpen+	     maybePushActuals cur' [TCall fname parms]++collectElems [] cbt cur =+  return cur+collectElems (at:ats) cbt cur =+  do ts <- collectElems ats cbt cur+     collect at cbt ts++collectAttrs [] cbt cur =+  return cur+collectAttrs (at:ats) cbt cur =+  do ts <- collectAttr at cbt cur+     collectAttrs ats cbt ts++collectAttr+  ATTR_ { attr_BT = bt+	, attr_value_BT = vbt+	, attr_name = aname+        , attr_value = aval+	} +  cbt+  cur = let { t1 = TOut (' ' : aname ++ "=\"") ; t2 = TOut "\"";+	      t1' = tout (' ' : aname ++ "=\"") ; t2' = tout "\""; } in+  case bt of+    TOPLEVEL ->+      do pushOpen cur+	 ts <- collectAttrValue aval vbt STATIC [t1]+	 fname <- pushClosed (t2' ts)+	 parms <- get actuals+	 cur' <- popOpen+	 maybePushActuals cur' [TCall fname parms]+    DYNAMIC ->+      case cbt of+	STATIC ->+	  do ts <- collectAttrValue aval vbt DYNAMIC [t1]+	     maybePushActuals cur (t2' ts)+	DYNAMIC ->+	  do ts <- collectAttrValue aval vbt DYNAMIC (t1' cur)+	     return (t2' ts)+    STATIC ->+      case cbt of+	STATIC ->+	  do ts <- collectAttrValue aval vbt STATIC (t1' cur)+	     return (t2' ts)+	DYNAMIC ->+	  do pushOpen cur+	     ts <- collectAttrValue aval vbt STATIC [t1]+	     fname <- pushClosed (t2' ts)+	     parms <- get actuals+	     cur' <- popOpen+	     maybePushActuals cur' [TCall fname parms]++collectAttrValue aval bt cbt cur =+  let encVal = (htmlAttr aval "")+      t0 = TOut encVal+      t0' = tout encVal in+  case bt of+    TOPLEVEL ->+      do pushOpen cur+	 fname <- pushClosed [t0]+	 parms <- get actuals+	 cur' <- popOpen+	 maybePushActuals cur' [TCall fname parms]+    DYNAMIC ->+      case cbt of+	STATIC ->+	  do maybePushActuals cur [t0]+	DYNAMIC ->+	  do return [t0]+    STATIC ->+      case cbt of+	STATIC ->+	  do return (t0' cur)+	DYNAMIC ->+	  do pushOpen cur+	     fname <- pushClosed [t0]+	     parms <- get actuals+	     cur' <- popOpen+	     maybePushActuals cur' [TCall fname parms]+++-- Local Variables: +-- haskell-prog-switches: ("/home/thiemann/src/haskell/Utility/sha1lib.o")+-- End: 
+ WASH/HTML/HTMLTypedBase.hs view
@@ -0,0 +1,109 @@+{-# OPTIONS -fglasgow-exts #-}+-- © 2001 Peter Thiemann+module WASH.HTML.HTMLTypedBase+  (module WASH.HTML.HTMLBase, module WASH.HTML.HTMLTypedBase) +  where++import Char+import WASH.HTML.HTMLBase++-- typed layer+-- attributes++data ATTRIBUTE a => ATTR a =				    -- a phantom type+  ATTR { unATTR :: ATTR_ }++class Show a => ATTRIBUTE a where+  show_name :: a -> String+-- +  show_name = map toLower . show++-- attribute values++class (ATTRIBUTE a, Show v) => AttrValue a v++mkUAttr :: ATTRIBUTE a => a -> String -> ATTR a+mkUAttr a vstr = ATTR (attr_ (show_name a) vstr)++mkAttr :: (AttrValue a v) => a -> v -> ATTR a+mkAttr a v = +  mkUAttr a (av raw)+  where raw = show v+	av (str@('\"':_)) = let str1 = read str :: String in str1+	av str = str++attr a v into = add_attr into (mkAttr a v)++uattr a vstr into = add_attr into (mkUAttr a vstr)++--  elements++data TAG t => ELT t =+    ELT { unELT :: ELEMENT_ }++class Show t => TAG t where+  make :: t -> ELT t+  show_tag :: t -> String+--+  make = make_standard+  show_tag = map toLower . show++make_standard t = ELT (element_ (show_tag t) [] [])+make_empty    t = ELT (empty_   (show_tag t) [])++--+class (TAG s, TAG t) => AddTo s t++add :: (AddTo s t) => ELT s -> ELT t -> ELT s+add (ELT e_) (ELT e'_) =+  ELT (add_ e_ e'_)++add' :: (AddTo s t) => ELT t -> ELT s -> ELT s+add' = flip add++class (TAG t) => AddAttr t a++add_attr :: (AddAttr t a) => ELT t -> ATTR a -> ELT t+add_attr (ELT e_) (ATTR att) =+  ELT (add_attr_ e_ att)++attr' :: (AddAttr t a) => ATTR a -> ELT t -> ELT t+attr' = flip add_attr+ +-- --================= FUNCTIONS =================----++-- --show functions------------------++show_html (ELT e_) = show e_++-- creating text elements++text, rawtext, formattedtext :: (AddTo a CDATA) => String -> ELT a -> ELT a+text str = add' (ELT (cdata_ [] str) :: ELT CDATA)+rawtext str = add' (ELT (cdata_ [CDATA_ENCODED] str) :: ELT CDATA)+formattedtext str = add' (ELT (cdata_ [CDATA_FORMATTED] str) :: ELT CDATA)++data CDATA = CDATA deriving Show+instance TAG CDATA++-- creating comment elements++comment :: String -> ELT a -> ELT a+comment str (ELT e_) = ELT (add_ e_ (comment_ str))++-- creating the main document++data DOCUMENT = DOCUMENT deriving Show+instance TAG DOCUMENT where+  make DOCUMENT = +    ELT (doctype_+  	  ["HTML"+          ,"PUBLIC"+	  ,"\"-//W3C//DTD HTML 4.01//EN\""+	  ,"\"http://www.w3.org/TR/html4/strict.dtd\""]+	  [])++-- instance AddTo DOCUMENT HTML -- must be in HTMLPrelude++show_document :: ELT DOCUMENT -> String+show_document = show_html
+ WASH/HTML/HTMLTypedBase98.hs view
@@ -0,0 +1,110 @@+-- © 2002 Peter Thiemann+module WASH.HTML.HTMLTypedBase98 +  (module WASH.HTML.HTMLBase, module WASH.HTML.HTMLTypedBase98)+  where++import Char+import WASH.HTML.HTMLBase++-- typed layer+-- attributes++data ATTRIBUTE a => ATTR a =				    -- a phantom type+  ATTR { unATTR :: ATTR_ }++class Show a => ATTRIBUTE a where+  show_name :: a -> String+-- +  show_name = map toLower . show++-- attribute values++-- class (ATTRIBUTE a, Show v) => AttrValue a v++mkUAttr :: ATTRIBUTE a => a -> String -> ATTR a+mkUAttr a vstr = ATTR (attr_ (show_name a) vstr)++-- mkAttr :: (AttrValue a v) => a -> v -> ATTR a+-- mkAttr a v = +--   mkUAttr a (av raw)+--   where raw = show v++av (str@('\"':_)) = let str1 = read str :: String in str1+av str = str++-- attr a v into = add_attr into (mkAttr a v)++uattr a vstr into = add_attr into (mkUAttr a vstr)++--  elements++data TAG t => ELT t =+    ELT { unELT :: ELEMENT_ }++class Show t => TAG t where+  make :: t -> ELT t+  show_tag :: t -> String+--+  make = make_standard+  show_tag = map toLower . show++make_standard t = ELT (element_ (show_tag t) [] [])+make_empty    t = ELT (empty_   (show_tag t) [])++--+-- class (TAG s, TAG t) => AddTo s t++-- add :: (AddTo s t) => ELT s -> ELT t -> ELT s+add (ELT e_) (ELT e'_) =+  ELT (add_ e_ e'_)++-- add' :: (AddTo s t) => ELT t -> ELT s -> ELT s+add' = flip add++-- class (TAG t) => AddAttr t a++-- add_attr :: (AddAttr t a) => ELT t -> ATTR a -> ELT t+add_attr (ELT e_) (ATTR att) =+  ELT (add_attr_ e_ att)++-- attr' :: (AddAttr t a) => ATTR a -> ELT t -> ELT t+attr' = flip add_attr++-- --================= FUNCTIONS =================----++-- --show functions------------------++show_html (ELT e_) = show e_++-- creating text elements++class AdmitChildCDATA a where+  text, rawtext, formattedtext :: String -> ELT a -> ELT a+  text str = add' (ELT (cdata_ [] str) :: ELT CDATA)+  rawtext str = add' (ELT (cdata_ [CDATA_ENCODED] str) :: ELT CDATA)+  formattedtext str = add' (ELT (cdata_ [CDATA_FORMATTED] str) :: ELT CDATA)++data CDATA = CDATA deriving Show+instance TAG CDATA++-- creating comment elements++comment :: String -> ELT a -> ELT a+comment str (ELT e_) = ELT (add_ e_ (comment_ str))++-- creating the main document++data DOCUMENT = DOCUMENT deriving Show+instance TAG DOCUMENT where+  make DOCUMENT = +    ELT (doctype_+  	  ["HTML"+          ,"PUBLIC"+	  ,"\"-//W3C//DTD HTML 4.01//EN\""+	  ,"\"http://www.w3.org/TR/html4/strict.dtd\""]+	  [])++-- instance AddTo DOCUMENT HTML -- must be in HTMLPrelude++show_document :: ELT DOCUMENT -> String+show_document = show_html
+ WASH/Mail/ContentDisposition.hs view
@@ -0,0 +1,38 @@+module WASH.Mail.ContentDisposition where++import WASH.Mail.RFC2822+			  +data ContentDisposition =+    None+  | Inline     { parameters :: [ContentDispositionParm] }+  | Attachment { parameters :: [ContentDispositionParm] }++data ContentDispositionParm =+    FileNameParm String+  | CreationDateParm DateTime2822+  | ModificationDateParm DateTime2822+  | ReadDateParm DateTime2822+  | SizeParm Int++hasContentDisposition None = False+hasContentDisposition _ = True++toString (None) =+  ""+toString (Inline { parameters = cdps }) =+  "inline" ++ cdpsToString cdps+toString (Attachment { parameters = cdps }) =+  "attachment" ++ cdpsToString cdps++cdpsToString = concatMap cdpToString+cdpToString (FileNameParm file) =+  "; filename=\""++file++"\""+cdpToString (CreationDateParm dt) =+  "; creation-date=\""++shows dt "\""+cdpToString (ModificationDateParm dt) =+  "; modification-date=\""++shows dt "\""+cdpToString (ReadDateParm dt) =+  "; read-date=\""++shows dt "\""+cdpToString (SizeParm n) =+  "; size="++show n+
+ WASH/Mail/Email.hs view
@@ -0,0 +1,110 @@+-- © 2001, 2002 Peter Thiemann+module WASH.Mail.Email (+	sendmail, inventMessageId, exitcodeToSYSEXIT, SYSEXIT(..),+	module WASH.Mail.MIME, module WASH.Mail.HeaderField) where++-- from standard library+import IO+import System++-- from utility+import WASH.Utility.Auxiliary+import WASH.Utility.Unique++-- from package+import WASH.Mail.EmailConfig+import WASH.Mail.HeaderField+import WASH.Mail.MIME++-- |from sysexit.h+data SYSEXIT =+	EX_OK		--		0	/* successful termination */+      | EX_USAGE	--		64	/* command line usage error */+      | EX_DATAERR	--		65	/* data format error */+      | EX_NOINPUT	--		66	/* cannot open input */+      | EX_NOUSER	--		67	/* addressee unknown */+      | EX_NOHOST	--		68	/* host name unknown */+      | EX_UNAVAILABLE	--		69	/* service unavailable */+      | EX_SOFTWARE	--		70	/* internal software error */+      | EX_OSERR	--		71	/* system error (e.g., can't fork) */+      | EX_OSFILE	--		72	/* critical OS file missing */+      | EX_CANTCREAT	--		73	/* can't create (user) output file */+      | EX_IOERR	--		74	/* input/output error */+      | EX_TEMPFAIL	--		75	/* temp failure; user is invited to retry */+      | EX_PROTOCOL	--		76	/* remote error in protocol */+      | EX_NOPERM	--		77	/* permission denied */+      | EX_CONFIG	--		78	/* configuration error */+      | EX_UNKNOWN Int++exitcodeToSYSEXIT :: ExitCode -> SYSEXIT+exitcodeToSYSEXIT exitcode =+  case exitcode of+    ExitSuccess -> EX_OK+    ExitFailure 64 -> EX_USAGE+    ExitFailure 65 -> EX_DATAERR+    ExitFailure 66 -> EX_NOINPUT+    ExitFailure 67 -> EX_NOUSER+    ExitFailure 68 -> EX_NOHOST+    ExitFailure 69 -> EX_UNAVAILABLE+    ExitFailure 70 -> EX_SOFTWARE+    ExitFailure 71 -> EX_OSERR+    ExitFailure 72 -> EX_OSFILE+    ExitFailure 73 -> EX_CANTCREAT+    ExitFailure 74 -> EX_IOERR+    ExitFailure 75 -> EX_TEMPFAIL+    ExitFailure 76 -> EX_PROTOCOL+    ExitFailure 77 -> EX_NOPERM+    ExitFailure 78 -> EX_CONFIG+    ExitFailure sc -> EX_UNKNOWN sc++instance Show SYSEXIT where+  showsPrec i se = case se of+      EX_OK	-> showString "successful termination"+      EX_USAGE	-> showString "command line usage error"+      EX_DATAERR	-> showString "data format error"+      EX_NOINPUT	-> showString "cannot open input"+      EX_NOUSER	-> showString "addressee unknown"+      EX_NOHOST	-> showString "host name unknown"+      EX_UNAVAILABLE	-> showString "service unavailable"+      EX_SOFTWARE	-> showString "internal software error"+      EX_OSERR	-> showString "system error (e.g., can't fork)"+      EX_OSFILE	-> showString "critical OS file missing"+      EX_CANTCREAT	-> showString "can't create (user) output file"+      EX_IOERR	-> showString "input/output error"+      EX_TEMPFAIL	-> showString "temp failure; user is invited to retry"+      EX_PROTOCOL	-> showString "remote error in protocol"+      EX_NOPERM	-> showString "permission denied"+      EX_CONFIG	-> showString "configuration error"+      EX_UNKNOWN sc -> showString "unknown return code: " . shows sc++-- facilities for sending email++sendmailFlags   = +	["-i"			    -- ignore dots alone on a line+	,"-t"			    -- read message for recipients+	,"--"                       -- end of flag arguments+	]			    -- , "-v" for verbose mode++sendmail :: Mail -> IO ExitCode+sendmail mail =+  do filename <- inventBoundary+     let tempfilename  = emailTmpDir ++ filename+         tempfilename2 = emailTmpDir ++ "T" ++ filename+     h <- openFile tempfilename WriteMode+     hSend smtpSendControl{ sendH = h } mail+     hClose h+     exitcode <- system (sendmailProgram ++ pFlags sendmailFlags ++ " < " ++ tempfilename ++ " > " ++ tempfilename2)+     system ("rm " ++ tempfilename)+     system ("rm " ++ tempfilename2)+     return exitcode++pFlags [] = ""+pFlags (flag:flags) = ' ' : flag ++ pFlags flags++inventMessageId :: IO Header+inventMessageId =+  do randomKey <- inventStdKey+     hostname  <- protectedGetEnv "SERVER_NAME" "localhost"+     let messageId = "<" ++ randomKey ++ ".Email@" ++ hostname ++ ">"+     return (Header ("Message-Id", messageId))+
+ WASH/Mail/EmailConfig.hs view
@@ -0,0 +1,13 @@+module WASH.Mail.EmailConfig where++tmpDir, varDir, emailTmpDir, sendmailProgram :: String++-- |temporary storage+tmpDir = "/tmp/"+-- |persistent, mutable storage+varDir = "/tmp/"++-- |temporary email files+emailTmpDir 	= tmpDir+-- |path of sendmail program+sendmailProgram	= "/usr/sbin/sendmail"
+ WASH/Mail/HeaderField.hs view
@@ -0,0 +1,53 @@+module WASH.Mail.HeaderField where++import WASH.Utility.RFC2047++-- +newtype Header = Header (String, String)+newtype KV = KV (String, String)+newtype MediaType = MediaType (String, String)+-- ++instance Show Header where+  show (Header (key, value)) = +    if null value then "" else+    key ++ ':' : ' ' : encodeValue value ++ "\r\n"++instance Show KV where+  show (KV (key, value)) =+    key ++ '=' : value++instance Show MediaType where+  show (MediaType (ty, subty)) =+    ty ++ '/' : subty++-- ++mimeHeader = +  Header ("MIME-Version", "1.0")++identHeader =+  Header ("X-Mailer", "WASH/Mail 0.1")++makeContentType mtype subtype parameters = +  Header ("Content-Type", mtype ++ "/" ++ subtype ++ p parameters)+  where p = concat . map p1+	p1 parameter = ';' : show parameter++makeContentTransferEncoding enc =+  Header ("Content-Transfer-Encoding", enc)++makeContentDisposition name =+  Header ("Content-Disposition", name)++makeX what recipients = +  Header (what, l recipients)+  where l [] = []+	l [xs] = xs+	l (xs:xss) = xs ++ ", " ++ l xss++makeTO = makeX "To"+makeCC = makeX "Cc"+makeBCC = makeX "Bcc"+makeSubject s = makeX "Subject" [s]+
+ WASH/Mail/MIME.hs view
@@ -0,0 +1,192 @@+-- © 2001, 2002 Peter Thiemann+module WASH.Mail.MIME where+-- RFC 2045+-- RFC 2046++import Char+import IO+import Monad+import Random++import qualified WASH.Utility.Base64 as Base64+import qualified WASH.Mail.ContentDisposition as CD+import qualified WASH.Utility.QuotedPrintable as QuotedPrintable+import WASH.Mail.HeaderField+import qualified WASH.Utility.RFC2279 as RFC2279	    -- UTF-8+++-- --------------------------------------------------------------------++textDOC subty docLines =+  DOC {	mediatype= "text",+	subtype= subty,+	textLines= docLines,+	parameters= [],+	filename= "",					    -- obsolete+	contentDisposition = CD.Inline [],+	messageData="",+	parts=[]+      }++binaryDOC ty subty bindata =+  DOC {	mediatype= ty,+	subtype= subty,+	messageData= bindata,+	textLines= [],+	parameters= [],+	filename= "",					    -- obsolete+	contentDisposition = CD.Attachment [],+	parts=[]+      }+  +multipartDOC subty subdocs =+  DOC {	mediatype= "multipart",+	subtype= subty,+	messageData= "",+	textLines= [],+	parameters= [],+	filename= "",					    -- obsolete+	contentDisposition = CD.None,+	parts= subdocs+      }++data DOC =+     DOC {+	mediatype :: String,			    -- type+	subtype :: String,			    -- subtype+	parameters  :: [KV],			    -- ^ parameters of the media type+	filename :: String,			    -- ^ suggested filename, OBSOLETE+	contentDisposition :: CD.ContentDisposition,   -- ^ sets Content-Disposition, e.g. for suggesting a filename+	-- depending on mediatype only one of the following is relevant:+	messageData :: String,			    -- ^ data, only relevant for binary data+	textLines :: [String],			    -- ^ lines, only relevant for text mediatypes+	parts :: [DOC]				    -- ^ data, only relevant for multipart mediatypes+	}++recommend_cte h doc = +  case mediatype doc of+    "text" -> +       case sendMode h of+         SevenBit -> "quoted-printable"+	 EightBit -> "8bit"+    "multipart" -> "7bit"+    _ ->+      case sendMode h of +	SevenBit -> "base64"+	EightBit -> "8bit"++inventBoundary =+  inventKey 10 (init Base64.alphabet_list)+  where+    inventKey len chars =+      do g <- getStdGen+	 let candidate = take len $ map (chars !!) $ randomRs (0, length chars - 1) g+	 return ("=_" ++ candidate ++ "=_")+	 -- see RFC 2045, 6.7 for reasoning about this choice of boundary string++data SendMode =+  EightBit | SevenBit+data SendControl = +  SendControl {+    sendH :: Handle,+    sendMode :: SendMode+  }++smtpSendControl = +  SendControl { sendH = stdout, sendMode = SevenBit }++httpSendControl =+  SendControl { sendH = stdout, sendMode = EightBit }++instance Send DOC where+  hSend h doc =+    let cte = recommend_cte h doc in+    do boundary <- inventBoundary+       let extraParameter +	     | mediatype doc == "multipart"  = [KV ("boundary", '\"':boundary++"\"")]+	     | mediatype doc == "text" = [KV ("charset", "utf-8")]+	     | otherwise = []+       hSend h (makeContentType (mediatype doc)+       			     (subtype doc) +       			     (extraParameter ++ parameters doc))+       hSend h (makeContentTransferEncoding cte)+       when (CD.hasContentDisposition $ contentDisposition doc) $+	 hSend h (makeContentDisposition (CD.toString (contentDisposition doc)))+       -- hSend h (makeContentDisposition (filename doc))+       hSend h CRLF+       case mediatype doc of +	 "text" -> hSendText h doc+	 "multipart" -> hSendMultipart h boundary doc+	 _ -> hSendBinary h doc++hSendText h doc =+  case sendMode h of+    EightBit -> +      hPutStr hdl str+    SevenBit ->+      hPutStr hdl (QuotedPrintable.encode str)+  where hdl = sendH h+	str = RFC2279.encode $ flat (textLines doc)+	flat [] = []+	flat (xs:xss) = xs ++ "\r\n" ++ flat xss++hSendBinary h doc =+  case sendMode h of+    SevenBit ->+      hPutStr (sendH h) (Base64.encode (messageData doc))+    EightBit ->+      hPutStr (sendH h) (messageData doc)++hSendMultipart h boundary doc =+  do -- may send a preamble for non-MIME-able MUAs at this point+     sendParts (parts doc)+  where hdl = sendH h+	sendParts [] = +	  do hPutStr hdl "--"+	     hPutStr hdl boundary+	     hPutStr hdl "--"+	     hSend h CRLF+	sendParts (doc:docs) =+	  do hPutStr hdl "--"+	     hPutStr hdl boundary+	     hSend h CRLF+	     hSend h doc+	     sendParts docs++data CRLF = CRLF++instance Send CRLF where+  hSend h CRLF = hPutStr (sendH h) "\n"++data Mail =+     Mail {+	to :: [String],+	subject :: String,+	cc :: [String],+	bcc :: [String],+	headers :: [Header],+	contents :: DOC+        }++simpleMail recipients subj doc =+  Mail { to= recipients, subject= subj, cc=[], bcc=[], headers=[], contents=doc }++class Send m where+  send :: m -> IO ()+  hSend :: SendControl -> m -> IO ()+  send = hSend smtpSendControl++instance Send Header where+  hSend h header = hPutStr (sendH h) (show header)++instance Send Mail where+  hSend h mail =+    do hSend h (makeTO (to mail))+       hSend h (makeSubject (subject mail))+       hSend h (makeCC (cc mail))+       hSend h (makeBCC (bcc mail))+       hSend h mimeHeader+       hSend h identHeader+       sequence (map (hSend h) (headers mail))+       hSend h (contents mail)+
+ WASH/Mail/MailParser.hs view
@@ -0,0 +1,217 @@+module WASH.Mail.MailParser where++-- see RFC 2822+-- TODO: check against their definition of token+import Char+import List+import Maybe+-- +import Text.ParserCombinators.Parsec+-- +import qualified WASH.Utility.Base64 as Base64+import qualified WASH.Utility.QuotedPrintable as QuotedPrintable+import WASH.Utility.RFC2047  as RFC2047 (p_token)+import WASH.Mail.RFC2822+import WASH.Mail.Message+import WASH.Mail.HeaderField++parseMessageFromFile fname =+  parseFromFile message fname++parseMessageFromString str =+  parse message "MailParser" str++parseDateTimeFromString str =+  parse parseDateTime "DateTimeParser" (' ':str)++data RawMessage =+     RawMessage+     	{ rawHeaders	:: [Header]+	, rawLines	:: [String]+	}+  deriving Show++lexeme p = do x <- p; many ws1; return x+literalString = do char '\"'+		   str <- many (noneOf "\"\\" <|> quoted_pair)+		   char '\"'+		   return str++no_ws_ctl_chars = map chr ([1..8] ++ [11,12] ++ [14..31] ++ [127])+no_ws_ctl = oneOf no_ws_ctl_chars++text_chars = map chr ([1..9] ++ [11,12] ++ [14..127])+p_text = oneOf text_chars++quoted_pair = do char '\\'+		 p_text++-- RFC 2045, 5.1 says: +-- "The type, subtype, and parameter names are not case sensitive."++p_parameter =+  do lexeme $ char ';'+     p_name <- lexeme $ p_token+     lexeme $ char '='+     p_value <- literalString <|> p_token+     return (map toLower p_name, p_value)++p_contentType = +  do many ws1+     c_type <- p_token+     lexeme $ char '/'+     c_subtype <- lexeme $ p_token+     c_parameters <- many p_parameter+     return $ ContentType (map toLower c_type) (map toLower c_subtype) c_parameters++-- RFC 2045, 6.1+-- "these values are not case sensitive"++p_contentTransferEncoding =+  do many ws1+     c_cte <- RFC2047.p_token+     return $ ContentTransferEncoding (map toLower c_cte)++p_contentDisposition =+  do many ws1+     c_cd <- RFC2047.p_token+     c_parameters <- many p_parameter+     return $ ContentDisposition (map toLower c_cd) c_parameters++p_contentID = +  do many ws1+     c_cid <- RFC2047.p_token+     return $ ContentID c_cid++p_contentDescription =+  do many ws1+     c_desc <- many lineChar+     return $ ContentDescription c_desc++header = do name <- many1 headerNameChar+	    char ':'+	    line <- do many ws1; lineString+	    crLf+	    extraLines <- many extraHeaderLine+	    return (Header (map toLower name, concat (line:extraLines)))++extraHeaderLine = do sp <- ws1+		     line <- lineString+		     crLf+		     return (sp:line)++lineString = many (noneOf "\n\r")++headerBodySep = do crLf; return ()++body = many (do line <- many lineChar; crLf; return line)++message =+  do hs <- many header+     headerBodySep+     b <- body+     return (RawMessage hs b)++lookupHeader name msg =+  lookupInHeaders name (getHeaders msg)+lookupRawHeader name raw =+  lookupInHeaders name (rawHeaders raw)+lookupInHeaders name headers = g headers+  where g [] = Nothing+	g (Header (name', text):_) | name == name' = Just text+	g (_:rest) = g rest++parseHeader raw name deflt parser =+  fromMaybe deflt $+  do str <- lookupRawHeader name raw+     case parse parser name str of+       Right v -> return v+       Left _  -> Nothing++digestMessage :: RawMessage -> Message+digestMessage =+  digestMessage' (ContentType "text" "plain" [( "charset", "us-ascii")])++digestMessage' :: ContentType -> RawMessage -> Message+digestMessage' defcty raw =+  let cty = parseHeader raw+      	"content-type" defcty p_contentType+      cte = parseHeader raw+      	"content-transfer-encoding" (ContentTransferEncoding "7bit") p_contentTransferEncoding+      cdn = parseHeader raw+      	"content-disposition" (ContentDisposition "inline" []) p_contentDisposition+      cid = parseHeader raw+      	"content-id" (ContentID "(none)") p_contentID+      cdc = parseHeader raw+      	"content-description" (ContentDescription "(none)") p_contentDescription+      defaultMessage =+        Singlepart+      	{ getHeaders = rawHeaders raw+	, getLines = rawLines raw+	, getDecoded = decode cte (unlines (rawLines raw))+	, getContentType= cty+	, getContentTransferEncoding= cte+	, getContentDisposition= cdn+	}+  in+  case cty of+    ContentType "multipart" c_subtype c_parameters ->+      case lookup "boundary" c_parameters of+        Just boundary ->+	  let defcte +	        | c_subtype == "digest" = +		  ContentType "message" "rfc822" []+		| otherwise = +		  ContentType "text" "plain" [("charset", "us-ascii")] in+	  Multipart+	  	{ getHeaders = rawHeaders raw+		, getLines = rawLines raw+		, getParts = map (digestMessage' defcte)+				 (splitBody boundary (rawLines raw))+		, getContentType= cty+		, getContentTransferEncoding= cte+		, getContentDisposition= cdn+		}+	_ ->+	  defaultMessage+    _ ->+      defaultMessage++splitBody boundary lines =+  g False lines (showChar '\n') []+  where +    finish shower showers =+      reverse (map (\shower -> parseSuccessfully message "body part" (shower ""))+                   (shower:showers))+    g afterPreamble [] shower showers =+      finish shower showers+    g afterPreamble (xs : rest) shower showers =+      if innerboundary `isPrefixOf` xs +      then if finalboundary `isPrefixOf` xs +           then if afterPreamble +	        then finish shower showers+		else finish (showChar '\n') []+	   else if afterPreamble+	        then g afterPreamble rest id (shower : showers)+		else g True rest (showChar '\n') []+      else+      g afterPreamble rest (shower . showString xs . showString "\n") showers+    innerboundary = '-':'-':boundary+    finalboundary = innerboundary ++ "--"++decode (ContentTransferEncoding "quoted-printable") rawlines =+  QuotedPrintable.decode rawlines+decode (ContentTransferEncoding "base64") rawlines =+  Base64.decode rawlines+-- "7bit", "8bit", "binary", and everything else+decode (ContentTransferEncoding _) rawlines =+  rawlines+++parseSuccessfully p n inp =+  case parse p n inp of+    Left pError ->+      error (show pError)+    Right x ->+      x+
+ WASH/Mail/Message.hs view
@@ -0,0 +1,78 @@+module WASH.Mail.Message where++import WASH.Mail.HeaderField++data Message =+     Singlepart +     	{ getHeaders 		:: [Header]+	, getLines   		:: [String]+	, getDecoded		:: [Char]+	, getContentType 	:: ContentType+	, getContentTransferEncoding :: ContentTransferEncoding+	, getContentDisposition :: ContentDisposition+	}+   | Multipart+	{ getHeaders		:: [Header]+	, getLines		:: [String]+	, getParts		:: [Message]+	, getContentType 	:: ContentType+	, getContentTransferEncoding :: ContentTransferEncoding+	, getContentDisposition :: ContentDisposition+	}+    deriving Show++isSinglePart (Singlepart {}) = True+isSinglePart _ = False++isMultiPart (Multipart {}) = True+isMultiPart _ = False++showHeader (Header (n, v)) = n ++ ": " ++ v++showParameters c_parameters =+    foldr (\(n,v) f -> showString " ;" .+    		       showString n .+		       showString "=\"" .+		       showString v .+		       showChar '\"' . f) id c_parameters++data ContentType = +	ContentType String -- type+		    String -- subtype+		    [(String, String)] -- parameters+instance Show ContentType where+  showsPrec i (ContentType c_type c_subtype c_parameters) =+    showString "Content-Type: " .+    showString c_type .+    showChar '/' .+    showString c_subtype .+    showParameters c_parameters+    +data ContentTransferEncoding =+	ContentTransferEncoding String+instance Show ContentTransferEncoding where+  showsPrec i (ContentTransferEncoding cte) =+    showString "Content-Transfer-Encoding: " .+    showString cte++data ContentDisposition =+	ContentDisposition String [(String, String)]+instance Show ContentDisposition where+  showsPrec i (ContentDisposition cdn c_parameters) =+    showString "Content-Disposition: " .+    showString cdn .+    showParameters c_parameters++data ContentID =+	ContentID String+instance Show ContentID where+  showsPrec i (ContentID cid) =+    showString "Content-ID: " .+    showString cid++data ContentDescription =+	ContentDescription String+instance Show ContentDescription where+  showsPrec i (ContentDescription txt) =+    showString "Content-Description: " .+    showString txt
+ WASH/Mail/RFC2822.hs view
@@ -0,0 +1,196 @@+module WASH.Mail.RFC2822 where++import Char+-- +import Text.ParserCombinators.Parsec++crLf = try (string "\n\r" <|> string "\r\n") <|> string "\n" <|> string "\r"++fws =+  do many1 ws1+     option "" (do crLf+		   many1 ws1)+  <|> +  do crLf+     many1 ws1++ws1 = oneOf " \t"+lineChar = noneOf "\n\r"+headerNameChar = noneOf "\n\r:"++-- |parse contents of Date field according to RFC2822+data DateTime2822 =+  DateTime2822 (Maybe DayOfWeek) Date2822 Time2822+instance Show DateTime2822 where+  showsPrec i (DateTime2822 mDayOfWeek date2822 time2822) =+    (case mDayOfWeek of+      Just dayOfWeek ->+	showsDayOfWeek dayOfWeek . showString ", "+      Nothing ->+	id) .+    shows date2822 .+    showChar ' ' .+    shows time2822++parseDateTime =+  do mdow <- option Nothing (try $ do fws+				      dow <- parseDayOfWeek+				      char ','+				      return (Just dow))+     date <- parseDate+     fws+     time <- parseTime+     return (DateTime2822 mdow date time)++type DayOfWeek = Int+showsDayOfWeek 1 = showString "Mon"+showsDayOfWeek 2 = showString "Tue"+showsDayOfWeek 3 = showString "Wed"+showsDayOfWeek 4 = showString "Thu"+showsDayOfWeek 5 = showString "Fri"+showsDayOfWeek 6 = showString "Sat"+showsDayOfWeek 7 = showString "Sun"+parseDayOfWeek =+      (try (string "Mon") >> return (1 :: DayOfWeek))+  <|> (try (string "Tue") >> return 2)+  <|> (try (string "Wed") >> return 3)+  <|> (try (string "Thu") >> return 4)+  <|> (try (string "Fri") >> return 5)+  <|> (try (string "Sat") >> return 6)+  <|> (try (string "Sun") >> return 7)+  +data Date2822 =+  Date2822 Int Int Int++instance Show Date2822 where+  showsPrec i (Date2822 d m y) =+    showsDay d .+    showChar ' ' .+    showsMonth m .+    showChar ' ' .+    showsYear y++parseDate =+  do d <- parseDay+     m <- parseMonth+     y <- parseYear+     return (Date2822 d m y)++showsDay i = shows i+parseDay =+  do fws+     d1 <- digit+     md2 <- option Nothing (digit >>= (return . Just))+     case md2 of+       Nothing ->+	 return (digitToInt d1)+       Just d2 ->+	 return (digitToInt d2 + 10 * digitToInt d1)++monthList = +  ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]+parseMonthName =+  foldr1 (<|>) (zipWith g monthList [1::Int ..])+  where +    g mname mnr = try (string mname) >> return mnr++showsMonth m =+  showString (monthList !! (m-1))+parseMonth =+  do fws+     m <- parseMonthName+     fws+     return m++showsYear y =+  showString (drop 1 (show (10000 + y)))+parseYear =+  do y1 <- digit+     y2 <- digit+     my3 <- option Nothing (digit >>= (return . Just))+     my4 <- option Nothing (digit >>= (return . Just))+     case (my3, my4) of+       (Just y3, Just y4) ->+	 return (1000 * digitToInt y1 + 100 * digitToInt y2 +		 + 10 * digitToInt y3 + digitToInt y4)+       -- interpretation of obs-year from RFC2822, 4.3+       (Just y3, Nothing) ->+         return (1900 + 100 * digitToInt y1 + 10 * digitToInt y2 + digitToInt y3)+       (Nothing, Nothing) ->+         let rawVal = 10 * digitToInt y1 + digitToInt y2 in+	 if rawVal < 50 +	 then return (2000 + rawVal)+	 else return (1900 + rawVal)+       _ ->+	 fail "parseYear"+data Time2822 =+  Time2822 TimeOfDay2822 Zone2822+instance Show Time2822 where+  showsPrec i (Time2822 timeOfDay2822 zone2822) =+    shows timeOfDay2822 .+    showChar ' ' .+    shows zone2822++parseTime =+  do tod <- parseTimeOfDay+     fws+     zone <- parseZone+     return (Time2822 tod zone)++data TimeOfDay2822 =+  TimeOfDay2822 Int Int Int+instance Show TimeOfDay2822 where+  showsPrec i (TimeOfDay2822 hh mm ss) =+    showString (drop 1 $ show (100+hh)) .+    showChar ':' .+    showString (drop 1 $ show (100+mm)) .+    showChar ':' .+    showString (drop 1 $ show (100+ss))++parseTimeOfDay =+  do hh <- parseTwoDigits+     char ':'+     mm <- parseTwoDigits+     ss <- option 0 (try $ do char ':'+			      parseTwoDigits)+     return (TimeOfDay2822 hh mm ss)++zoneInfoList =+  [( "UT",  (Zone2822 '+' 0 0))+  ,( "GMT", (Zone2822 '+' 0 0))+  ,( "EDT", (Zone2822 '-' 4 0))+  ,( "EST", (Zone2822 '-' 5 0))+  ,( "CDT", (Zone2822 '-' 5 0))+  ,( "CST", (Zone2822 '-' 6 0))+  ,( "MDT", (Zone2822 '-' 6 0))+  ,( "MST", (Zone2822 '-' 7 0))+  ,( "PDT", (Zone2822 '-' 7 0))+  ,( "PST", (Zone2822 '-' 8 0))+  ]++parseZoneInfo =+  foldr1 (<|>) (map g zoneInfoList)+  where +    g (zname, zinfo) = try (string zname) >> return zinfo++data Zone2822 =+  Zone2822 Char Int Int+instance Show Zone2822 where+  showsPrec i (Zone2822 sign hh mm) =+    showChar sign .+    showString (drop 1 $ show (100+hh)) .+    showString (drop 1 $ show (100+mm))+    +parseZone =+  do sign <- oneOf "+-"+     hh <- parseTwoDigits+     mm <- parseTwoDigits+     return (Zone2822 sign hh mm)+  <|> parseZoneInfo+  -- anything else should be mapped to (Zone2822 '-' 0 0)++parseTwoDigits =+  do d1 <- digit+     d2 <- digit+     return (10 * digitToInt d1 + digitToInt d2)+
+ WASH/Utility/Auxiliary.hs view
@@ -0,0 +1,49 @@+module WASH.Utility.Auxiliary where++import IO+import System+import Directory+import WASH.Utility.FileNames+import qualified WASH.Utility.Shell as Shell++protectedGetEnv :: String -> String -> IO String+protectedGetEnv var deflt =+  catch (getEnv var) (const $ return deflt)++readFileNonExistent :: FilePath -> String -> IO String+readFileNonExistent fileName def =+  do existent <- doesFileExist fileName+     if existent then readFile fileName else return def++readFileStrictly :: FilePath -> IO String+readFileStrictly filePath =+  do h <- openFile filePath ReadMode+     contents <- hGetContents h+     hClose (g contents h)+     return contents+  where+    g [] h = h+    g (_:rest) h = g rest h++assertDirectoryExists :: FilePath -> IO () -> IO ()+assertDirectoryExists dirname existsAction =+  catch (createDirectory dirname)+        (\ ioe -> +	   if isAlreadyExistsError ioe then existsAction+	   else if isDoesNotExistError ioe then+	     do assertDirectoryExists (dropLastComponent dirname) (return ())+		assertDirectoryExists dirname existsAction+	   else do hPutStrLn stderr ("assertDirectoryExists " ++ show dirname)+		   ioError ioe)++writeDebugFile :: String -> String -> IO ()+writeDebugFile filename str =+  do writeFile filename str+     system ("chmod 666 " ++ Shell.quote filename)+     return ()++appendDebugFile :: String -> String -> IO ()+appendDebugFile filename str =+  do appendFile filename ('\n':str)+     system ("chmod 666 " ++ Shell.quote filename)+     return ()
+ WASH/Utility/Base32.hs view
@@ -0,0 +1,96 @@+-- Base32 standard:+-- http://www.ietf.org/rfc/rfc3548.txt+-- Author: Niklas Deutschmann++module WASH.Utility.Base32 (encode, decode) where++import Bits+import Char+import List++encode :: String -> String+encode = encBase32++decode :: String -> String+decode = decBase32++-- Partitions a list into groups of length n.+makeGroups :: Int -> [a] -> [[a]]+makeGroups 0 lst = error "makeGroups: Invalid group length"+makeGroups n [] = []+makeGroups n lst =  take n lst : makeGroups n (drop n lst)++-- Converts an array of characters to a large number, generalized for+-- characters of any number of bits and any alphabet.+-- charLength: Number of bits in a character+-- ordFunc:	Function that is used for mapping characters to numbers.+makeBits charLength ordFunc str = foldr (+) 0 bitValues+	where +	bitValues = zipWith (\a b -> intVal a `shiftL` b) (reverse str) [0,charLength..]+	intVal a = toInteger (ordFunc a)+	+makeBitsASCII = makeBits 8 ord+makeBitsBase32 = makeBits 5 b32Ord++-- Converts an array of characters into a m-bit number, where m is+-- is smallest multiple of n that is greater or equal to the +-- (length of str) * chrSize.+-- Extension of "makeBits".+makeMultipleOfNBits bitFunc charSize n str +	| len `mod` n == 0	= bitFunc str+	| otherwise			= (bitFunc str) `shiftL` (remBitCount len)+	where +	remBitCount m = (0 - (m `mod` n) + n) `mod` n+	len = length str * charSize;++makeMultipleOfNBitsASCII = makeMultipleOfNBits (makeBits 8 ord) 8 +makeMultipleOfNBitsBase32 = makeMultipleOfNBits (makeBits 5 b32Ord) 5++-- The Base32 alphabet+-- Int -> Base32 character+b32Chr n = b32tab !! (fromEnum n)+	where+	b32tab = ['A'..'Z'] ++ ['2'..'7']++-- Base32 character -> Int+b32Ord c +	| c >= 'A' && c <= 'Z'	= ord(c) - 65+	| c >= '2' && c <= '7'	= ord(c) - 24+	| otherwise = error "b32Ord: No Base character"+	+-- Encodes one block (1-5 ASCII Characters)+encBase32Block str +	| len == 0	= ""+	| len == 1	= concat (b32Map [5,0]) ++ "======"+	| len == 2	= concat (b32Map [15,10..0]) ++ "===="+	| len == 3	= concat (b32Map [20,15..0]) ++ "==="+	| len == 4	= concat (b32Map [30,25..0]) ++ "="+	| len == 5	= concat (b32Map [35,30..0])+	| otherwise = error "encBase32Block: Invalid block length"+ 	where +	b32Map = map (\x -> [b32Chr(bitStr `shiftR` x .&. 31)])+	bitStr = makeMultipleOfNBitsASCII 5 str+	len = length str++-- Decodes one block (2,4,5,7 or 8 Base32 character + '=' padding character)+decBase32Block str+	| len == 0 = ""+	| len == 2 = concat . (shiftAndMap [0] 2) . makeBitsBase32 $ code+	| len == 4 = concat . (shiftAndMap [8,0] 4) . makeBitsBase32 $ code+	| len == 5 = concat . (shiftAndMap [16,8,0] 1) . makeBitsBase32 $ code+	| len == 7 = concat . (shiftAndMap [24,16..0] 3) . makeBitsBase32 $ code+	| len == 8 = concat . (shiftAndMap [32,24..0] 0) . makeBitsBase32 $ code+	| otherwise = error "decBase32Block: Invalid block length"+	where+	shiftAndMap sf n = (asciiMap sf) . (`shiftR` n)+	asciiMap sf c = map (\x -> [chr . fromEnum $ (c `shiftR` x .&. 255)]) sf+	len = length code+	code = filter (/= '=') str+		+encBase32 :: String -> String+encBase32 = concat . map encBase32Block . makeGroups 5++decBase32 :: String -> String+decBase32 = concat . map decBase32Block . makeGroups 8++
+ WASH/Utility/Base64.hs view
@@ -0,0 +1,124 @@+-- © 2002 Peter Thiemann+-- |Implements RFC 2045 MIME coding.+module WASH.Utility.Base64+       (encode, encode', decode, decode'+       ,alphabet_list+       )+       where++import Array+import Char++--+-- |Yields encoded input cropped to lines of less than 76 characters. Directly+-- usable as email body.+encode :: String -> String+encode = encode_base64+-- |yields continuous stream of bytes.+encode' :: String -> String+encode' = encode_base64'+-- |Directly applicable to email body.+decode :: String -> String+decode = decode_base64+-- |Only applicable to stream of Base64 characters.+decode' :: String -> String+decode' = decode_base64'+-- |Applicable to list of lines.+decode_lines :: [String] -> String+decode_lines = decode_base64_lines++-- --------------------------------------------------------------------+-- |Base64 alphabet in encoding order.+alphabet_list :: String+alphabet_list =+  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"++encode_base64_alphabet_index =+  zip [0 .. (63::Int)] alphabet_list++decode_base64_alphabet_index =+  zip alphabet_list [0 .. (63::Int)]++encode_base64_alphabet =+  array (0 :: Int, 63 :: Int) encode_base64_alphabet_index++decode_base64_alphabet =+  array (' ','z') decode_base64_alphabet_index++base64_character =+  array (chr 0, chr 255) [(c, c `elem` alphabet_list || c == '=') | c <- [chr 0 .. chr 255]]++encode_base64 = linebreak 76 . encode_base64'++linebreak m xs = lb m xs+  where+    lb n [] = "\r\n"+    lb 0 xs = '\r':'\n': lb m xs+    lb n (x:xs) = x: lb (n-1) xs++encode_base64' [] = []++encode_base64' [ch] = +  encode_base64_alphabet!b1 : +  encode_base64_alphabet!b2 :+  "=="+  where (b1, b2, _, _) = encode_base64_group (ch, chr 0, chr 0)++encode_base64' [ch1, ch2] =+  encode_base64_alphabet!b1 : +  encode_base64_alphabet!b2 :+  encode_base64_alphabet!b3 :+  "="+  where (b1, b2, b3, _) = encode_base64_group (ch1, ch2, chr 0)++encode_base64' (ch1: ch2: ch3: rest) =+  encode_base64_alphabet!b1 : +  encode_base64_alphabet!b2 :+  encode_base64_alphabet!b3 :+  encode_base64_alphabet!b4 :+  encode_base64' rest+  where (b1, b2, b3, b4) = encode_base64_group (ch1, ch2, ch3)++-- 111111 112222 222233 333333+encode_base64_group (ch1, ch2, ch3) = (b1, b2, b3, b4)+  where o1 = ord ch1+	o2 = ord ch2+	o3 = ord ch3+	b1 = o1 `div` 4+	b2 = (o1 `mod` 4) * 16 + o2 `div` 16+	b3 = (o2 `mod` 16) * 4 + o3 `div` 64+	b4 = o3 `mod` 64++decode_base64_group (b1, b2, b3, b4) = (ch1, ch2, ch3)+  where ch1 = chr (b1 * 4 + b2 `div` 16)+	ch2 = chr (b2 `mod` 16 * 16 + b3 `div` 4)+	ch3 = chr (b3 `mod` 4 * 64 + b4)++decode_base64' [] = []++decode_base64' [cin1, cin2, '=', '='] = [cout1]+  where (cout1, _, _) = +          decode_base64_group (decode_base64_alphabet!cin1+	  		      ,decode_base64_alphabet!cin2+			      ,0+			      ,0)++decode_base64' [cin1, cin2, cin3, '='] = [cout1, cout2]+  where (cout1, cout2, _) = +          decode_base64_group (decode_base64_alphabet!cin1+	  		      ,decode_base64_alphabet!cin2+			      ,decode_base64_alphabet!cin3+			      ,0)++decode_base64' (cin1: cin2: cin3: cin4: rest) = +  cout1: cout2: cout3: decode_base64' rest+  where (cout1, cout2, cout3) = +          decode_base64_group (decode_base64_alphabet!cin1+	  		      ,decode_base64_alphabet!cin2+			      ,decode_base64_alphabet!cin3+			      ,decode_base64_alphabet!cin4)++decode_base64 = decode_base64' . filter (base64_character!)++decode_base64_lines = decode_base64' . concat+
+ WASH/Utility/BulkIO.hs view
@@ -0,0 +1,33 @@+module WASH.Utility.BulkIO where++import IO++import Ptr+import CString+import CTypes+import Foreign.Marshal.Alloc (mallocBytes, free)+import System.IO (hGetBuf, hPutBuf)+		   +rawGetBytes :: Handle -> Int -> IO String+rawGetBytes h n =+  do buf   <- mallocBytes n 	:: IO (Ptr CChar)+     count <- hGetBuf h buf n+     str   <- peekCStringLen (buf, count)+     free buf+     return str++bufferSize = 4096 :: Int++-- buffers could be shared at the price of MVars, which are not portable+rawHandleCopy :: Handle -> Handle -> IO ()+rawHandleCopy hin hout =+  do buf <- mallocBytes bufferSize+     let copy =+	   hGetBuf hin buf bufferSize >>= \count ->+	   if count == 0 +	      then return ()+	      else do+	        hPutBuf hout buf count+		copy+     copy+     free buf
+ WASH/Utility/FileNames.hs view
@@ -0,0 +1,49 @@+-- © 2002-2005 Peter Thiemann+-- |Collection of function for manipulating file names.+module WASH.Utility.FileNames where++longestSuffix :: (a -> Bool) -> [a] -> [a]+longestSuffix p xs =+  let f [] suffix = suffix+      f (x : xs) suffix = f xs (if p x then xs else suffix)+  in  f xs xs+++-- |longest suffix of path that does not contain '/'+filePart :: String -> String+filePart =+  longestSuffix (=='/')++-- |longest suffix of path that does not contain '.'+extName :: String -> String+extName =+  longestSuffix (=='.')++-- |longest prefix so that the rest contains '.'; entire string if no '.' present+baseName :: String -> String+baseName filename =+  let f "" = ""+      f ('.':rest) = g rest rest+      f (x:rest) = x:f rest+      g "" lst = ""+      g ('.':rest) lst = '.':f lst+      g (x:rest) lst = g rest lst+  in  f filename++-- |splits input at each '/'+fileToPath :: String -> [String]+fileToPath filename =+  let f acc path "" = reverse (reverse acc: path)+      f acc path ('/':xs) = f "" (reverse acc: path) xs+      f acc path (x:xs) = f (x:acc) path xs+  in  f "" [] filename++-- |drop the last component of a file path+dropLastComponent :: String -> String+dropLastComponent path =+  let f "" = ""+      f rpath = g rpath+      g ('/':rest) = g rest+      g "" = "/"+      g rpath = dropWhile (/='/') rpath+  in reverse (f (reverse path))
+ WASH/Utility/Hex.hs view
@@ -0,0 +1,49 @@+-- © 2001, 2003 Peter Thiemann+module WASH.Utility.Hex where++import Array+import Char++hexdigit :: Int -> Char+hexdigit i = hexdigits ! i++hexdigits' = "0123456789ABCDEF"+alternative_digits = "abcdef"+alternative_indices :: [(Int, Char)]+alternative_indices = zip [10..15] alternative_digits+hexdigits'_indices :: [(Int, Char)]+hexdigits'_indices = [(i, hexdigits'!!i) | i <- [0..15]]++hexdigits = array (0, 15) hexdigits'_indices++fromHexdigits =+  array (chr 0, chr 127) +        (map (\ (x,y) -> (y, x)) (hexdigits'_indices ++ alternative_indices))++isHexdigitArray =+  array (chr 0, chr 127)+	(map (\ c -> (c, isHexdigit c)) [chr 0 .. chr 127])+  where+    isHexdigit :: Char -> Bool+    isHexdigit x = +      (x >= '0' && x <= '9') || +      (x >= 'a' && x <= 'f') ||+      (x >= 'A' && x <= 'F')++isHexdigit :: Char -> Bool+isHexdigit x = +  x <= chr 127 && isHexdigitArray ! x++showHex2 :: Int -> String+showHex2 ox = showsHex 2 ox ""++showsHex :: Int -> Int -> ShowS+showsHex 0 x = id+showsHex i x = let (d,m) = x `divMod` 16 in showsHex (i-1) d . showChar (hexdigits ! m)++hexDigitVal :: Char -> Int+hexDigitVal x | isHexdigit x = fromHexdigits ! x+	      | otherwise    = 0++allDigits = hexdigits' ++ alternative_digits+
+ WASH/Utility/ISO8601.hs view
@@ -0,0 +1,758 @@+-- © 2002 Peter Thiemann+module WASH.Utility.ISO8601 where++import Char+import Monad+import Time++import System.IO.Unsafe++import WASH.Utility.IntToString+import WASH.Utility.SimpleParser++secondsToString seconds =+  intToString 20 seconds++isoDateToString isoDate = +  let seconds = unsafePerformIO $ isoDateToSeconds isoDate +  in secondsToString seconds++isoDateAndTimeToString isoDateAndTime =+  let seconds = unsafePerformIO $ isoDateAndTimeToSeconds isoDateAndTime +  in secondsToString seconds++applyToCalT :: (CalendarTime -> a) -> IO a+applyToCalT g =+  do clkT <- getClockTime+     calT <- toCalendarTime clkT+     return $ g calT++isoDateAndTimeToSeconds :: ISODateAndTime -> IO Integer+isoDateAndTimeToSeconds isoDateAndTime =+  applyToCalT $ toSeconds isoDateAndTime++isoTimeToSeconds :: ISOTime -> IO Integer+isoTimeToSeconds isoTime =+  applyToCalT $ toSeconds isoTime+  +isoDateToSeconds :: ISODate -> IO Integer+isoDateToSeconds isoDate =+  applyToCalT $ toSeconds isoDate++class ToSeconds iso where+  -- |returns number of seconds since reference point+  toSeconds :: iso -> CalendarTime -> Integer+  toRawSeconds :: iso -> CalendarTime -> Integer+  --+  toRawSeconds = toSeconds++instance ToSeconds ISODateAndTime where+  toSeconds isoDateAndTime@(ISODateAndTime isoDate isoTime) calT =+    let rawseconds = toRawSeconds isoDateAndTime calT in+    case addLeapSeconds leapSeconds rawseconds of+      NotLeapSecond seconds -> seconds+      LeapSecond seconds -> seconds + leapSecondCorrection isoTime++  toRawSeconds (ISODateAndTime isoDate isoTime) calT =+    toRawSeconds isoDate calT + toRawSeconds isoTime calT++-- |problem: 19720630T235960 and 19720701T000000 are both mapped to the same+-- number, 78796800, and then addLeapSeconds adds one yielding 78796801. While+-- this is correct for 19720701T000000, 19720630T235960 must be+-- 78796800. Implemented solution: if the current second specification is 0 and+-- the time to convert is the leap second, then add 1.+leapSecondCorrection (ISOTime isoHourSpec isoMinuteSpec isoSecondSpec isoTimeZoneSpec) =+  case isoSecondSpec of+    Second ss -> if ss == 0 then 1 else 0+    NoSecond  -> 1++instance ToSeconds ISODate where+  toSeconds isoDate calT =+    case addLeapSeconds leapSeconds (toRawSeconds isoDate calT) of+      NotLeapSecond seconds -> seconds+      LeapSecond seconds -> seconds + 1			    -- we always mean 00:00:00+	+  toRawSeconds (ISODate isoYearSpec isoDayOfYearSpec) calT =+    let year = isoYearSpecToYear isoYearSpec calT +    in+    secondsPerDay * fromIntegral (yearsToDays year) ++    isoDaysOfYearToSeconds year isoDayOfYearSpec calT++isoDaysOfYearToSeconds year NoDayOfYear calT =+  0+isoDaysOfYearToSeconds year (MonthDay isoMonthSpec isoDayOfMonthSpec) calT =+  let month = isoMonthSpecToMonth isoMonthSpec calT+      dayOfMonth = isoDayOfMonthSpecToDayOfMonth isoDayOfMonthSpec calT+  in+  fromIntegral(dayOfMonth - 1 + daysUptoMonth year month) * secondsPerDay+isoDaysOfYearToSeconds year (DayOfYear ddd) calT =+  fromIntegral ddd * secondsPerDay+isoDaysOfYearToSeconds year (WeekAndDay (Week ww) NoDayOfWeek) calT =+  fromIntegral (7 * (ww - 1)) * secondsPerDay+isoDaysOfYearToSeconds year (WeekAndDay (Week ww) (DayOfWeek d)) calT =+  let weekdayOfJan1 = yearsToWeekDay year in+  fromIntegral (7 * (ww - 1) + d - weekdayOfJan1) * secondsPerDay+isoDaysOfYearToSeconds year (WeekAndDay ImplicitWeek (DayOfWeek d)) calT =+  let weekdayOfJan1 = yearsToWeekDay year +      ww = (ctYDay calT + weekdayOfJan1 + 5) `div` 7 +  in+  fromIntegral (7 * (ww - 1) + d - weekdayOfJan1) * secondsPerDay+isoDaysOfYearToSeconds year (WeekAndDay _ _) calT =+  error "Sorry, this combination of week and day does not make sense!"++isoMonthSpecToMonth ImplicitMonth calT =+  fromEnum (ctMonth calT) + 1+isoMonthSpecToMonth (Month mm) calT =+  mm++isoDayOfMonthSpecToDayOfMonth NoDayOfMonth calT =+  1+isoDayOfMonthSpecToDayOfMonth (DayOfMonth dd) calT =+  dd++daysUptoMonth year month = +  let daysPerMonth = [31, 28 + leapDays year, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] in+  sum (take (month-1) daysPerMonth)++isoYearSpecToYear ImplicitYear calT = +  (ctYear calT)+isoYearSpecToYear (ImplicitCentury yy) calT =+  (100 * (ctYear calT `div` 100) + yy)+isoYearSpecToYear (Century cc) calT =+  (100 * cc)+isoYearSpecToYear (ImplicitDecade y) calT =+  (10 * (ctYear calT `div` 10) + y)+isoYearSpecToYear (Year ccyy) calT =+  ccyy++leapDays year =+  if leapYear year then 1 else 0++leapYear year =+  year `mod` 4 == 0 && (year `mod` 100 /= 0 || year `mod` 400 == 0)++yearsToDays ccyy =+  let nrOfYears = ccyy - 1970+      leapYears = [ year | year <- [1970 .. ccyy-1] , leapYear year ]+      nrOfLeapDays = length leapYears+  in +  365 * nrOfYears + nrOfLeapDays++-- |compute weekday of Jan 1+yearsToWeekDay ccyy =+  let nrOfDays = yearsToDays ccyy+      jan_1_1970 = 4 -- Thursday+  in  1 + (nrOfDays + 6) `mod` 7++-- |in seconds from epoch; needs to be updated when time leaps again+leapSeconds :: [Integer]+leapSeconds = +  [ -- Leap	1972	Jun	30	23:59:60	+	S+    00000000000078796800,+    -- Leap	1972	Dec	31	23:59:60	+	S+    00000000000094694400 + 1,+    -- Leap	1973	Dec	31	23:59:60	+	S+    00000000000126230400 + 2,+    -- Leap	1974	Dec	31	23:59:60	+	S+    00000000000157766400 + 3,+    -- Leap	1975	Dec	31	23:59:60	+	S+    00000000000189302400 + 4,+    -- Leap	1976	Dec	31	23:59:60	+	S+    00000000000220924800 + 5,+    -- Leap	1977	Dec	31	23:59:60	+	S+    00000000000252460800 + 6,+    -- Leap	1978	Dec	31	23:59:60	+	S+    00000000000283996800 + 7,+    -- Leap	1979	Dec	31	23:59:60	+	S+    00000000000315532800 + 8,+    -- Leap	1981	Jun	30	23:59:60	+	S+    00000000000362793600 + 9,+    -- Leap	1982	Jun	30	23:59:60	+	S+    00000000000394329600 + 10,+    -- Leap	1983	Jun	30	23:59:60	+	S+    00000000000425865600 + 11,+    -- Leap	1985	Jun	30	23:59:60	+	S+    00000000000489024000 + 12,+    -- Leap	1987	Dec	31	23:59:60	+	S+    00000000000567993600 + 13,+    -- Leap	1989	Dec	31	23:59:60	+	S+    00000000000631152000 + 14,+    -- Leap	1990	Dec	31	23:59:60	+	S+    00000000000662688000 + 15,+    -- Leap	1992	Jun	30	23:59:60	+	S+    00000000000709948800 + 16,+    -- Leap	1993	Jun	30	23:59:60	+	S+    00000000000741484800 + 17,+    -- Leap	1994	Jun	30	23:59:60	+	S+    00000000000773020800 + 18,+    -- Leap	1995	Dec	31	23:59:60	+	S+    00000000000820454400 + 19,+    -- Leap	1997	Jun	30	23:59:60	+	S+    00000000000867715200 + 20,+    -- Leap	1998	Dec	31	23:59:60	+	S+    00000000000915148800 + 21+  ]++data LeapSeconds = LeapSecond Integer | NotLeapSecond Integer+  deriving Show++addLeapSeconds [] seconds = NotLeapSecond seconds+addLeapSeconds (ls: rest) seconds =+  if ls > seconds then NotLeapSecond seconds else+  if ls == seconds then LeapSecond seconds else+  addLeapSeconds rest (seconds+1)+  +secondsPerMinute = 60+secondsPerHour = 60 * secondsPerMinute+secondsPerDay = 24 * secondsPerHour+secondsPerYear = 365 * secondsPerDay++instance ToSeconds ISOTime where+  -- seconds to 0:00 UTC+  -- may become negative to indicate previous day!+  toSeconds (ISOTime isoHourSpec isoMinuteSpec isoSecondSpec isoTimeZoneSpec) calT =+    toSeconds isoHourSpec calT ++    toSeconds isoMinuteSpec calT ++    toSeconds isoSecondSpec calT ++    toSeconds isoTimeZoneSpec calT+    +instance ToSeconds ISOHourSpec where+  toSeconds ImplicitHour calT = fromIntegral (3600 * ctHour calT - ctTZ calT)+  toSeconds (Hour hh) calT    = fromIntegral (3600 * hh - ctTZ calT)++instance ToSeconds ISOMinuteSpec where+  toSeconds ImplicitMinute calT = fromIntegral (60 * ctMin calT)+  toSeconds (Minute mm) calT = fromIntegral (60 * mm)+  toSeconds NoMinute calT = 0++instance ToSeconds ISOSecondSpec where+  toSeconds (Second ss) calT = fromIntegral ss+  toSeconds NoSecond calT = 0++instance ToSeconds ISOTimeZoneSpec where+  toSeconds LocalTime calT = 0+  toSeconds UTCTime calT = fromIntegral (ctTZ calT)+  toSeconds (PlusTime (Hour hh) isoMinuteSpec) calT = +    fromIntegral (ctTZ calT - (3600 * hh + 60 * minutes isoMinuteSpec))+  toSeconds (MinusTime (Hour hh) isoMinuteSpec) calT =+    fromIntegral (ctTZ calT + (3600 * hh + 60 * minutes isoMinuteSpec))++minutes ImplicitMinute = 0+minutes (Minute mm) = mm+minutes NoMinute = 0++isoDateToClockTime :: ISODate -> ClockTime+isoDateToClockTime isoDate =+  let seconds = unsafePerformIO $ isoDateToSeconds isoDate +  in secondsToClockTime seconds++isoDateAndTimeToClockTime :: ISODateAndTime -> ClockTime+isoDateAndTimeToClockTime isoDateAndTime =+  let seconds = unsafePerformIO $ isoDateAndTimeToSeconds isoDateAndTime +  in secondsToClockTime seconds++secondsToClockTime seconds =+  let tdiff = TimeDiff { tdYear =0,+			 tdMonth =0,+			 tdDay =0,+			 tdHour =0,+			 tdMin =0,+			 tdSec = fromIntegral seconds,+			 tdPicosec =0+		       }+  in addToClockTime tdiff epochClkT+      +epochClkT = toClockTime epoch+epoch = CalendarTime {  ctYear   = 1970,+			ctMonth  = January,+			ctDay    = 1,+			ctHour   = 0,+			ctMin    = 0,+			ctSec    = 0,+			ctPicosec= 0,+			ctWDay   = Thursday,		    -- ignored+			ctYDay   = 0,			    -- ignored+			ctTZName = "UTC",		    -- ignored+			ctTZ     = 0,+			ctIsDST  = False		    -- ignored+		     }++    +-- |data type for representing ISO time+data ISODateAndTime =+  ISODateAndTime ISODate ISOTime+  deriving Show++data ISODate =+  ISODate ISOYearSpec ISODayOfYearSpec+  deriving Show++data ISOYearSpec+	= ImplicitYear | ImplicitCentury Int | Century Int | ImplicitDecade Int | Year Int+  deriving Show+data ISODayOfYearSpec+	= NoDayOfYear+	| MonthDay ISOMonthSpec ISODayOfMonthSpec+	| DayOfYear Int+	| WeekAndDay ISOWeekSpec ISODayOfWeekSpec+  deriving Show+data ISOMonthSpec+	= ImplicitMonth | Month Int+  deriving Show+data ISODayOfMonthSpec+	= NoDayOfMonth | DayOfMonth Int+  deriving Show+data ISOWeekSpec+	= ImplicitWeek | AnyWeek | Week Int+  deriving Show+data ISODayOfWeekSpec+	= NoDayOfWeek | DayOfWeek Int+  deriving Show+data ISOTime+	= ISOTime ISOHourSpec ISOMinuteSpec ISOSecondSpec ISOTimeZoneSpec+  deriving Show+data ISOHourSpec+	= ImplicitHour | Hour Int+  deriving Show+data ISOMinuteSpec+	= ImplicitMinute | Minute Int | NoMinute+  deriving Show+data ISOSecondSpec+	= Second Int | NoSecond+  deriving Show+data ISOTimeZoneSpec+	= LocalTime | UTCTime | PlusTime ISOHourSpec ISOMinuteSpec | MinusTime ISOHourSpec ISOMinuteSpec+  deriving Show++updateTZ (ISOTime isoHourSpec isoMinuteSpec isoSecondSpec _) isoTimeZoneSpec =+	ISOTime isoHourSpec isoMinuteSpec isoSecondSpec isoTimeZoneSpec++digitval = digitToInt++skipHyphen	= char '-' >> return ()+skipColon	= char ':' >> return ()+skipSolidus	= char '/' >> return ()+skipMinus	= char '-' >> return ()+skipPlus	= char '+' >> return ()+skipP		= oneOf "pP" >> return ()+skipT		= oneOf "tT" >> return ()+skipW		= oneOf "wW" >> return ()+skipZ		= oneOf "zZ" >> return ()++parseDateFromString :: String -> Maybe ISODate+parseDateFromString = parseFromString parseDate+parseTimeFromString :: String -> Maybe ISOTime+parseTimeFromString = parseFromString parseTime+parseDateAndTimeFromString :: String -> Maybe ISODateAndTime+parseDateAndTimeFromString = parseFromString parseDateAndTime++-- |external entry point+parseDate = +  parseBasicOrExtended parseDateInternal++parseTime =+  parseBasicOrExtended parseTimeInternal++parseDateAndTime =+  parseBasicOrExtended parseTimeAndDateInternal++parseBasicOrExtended parser = +  parser True <|> parser False++parseTimeAndDateInternal extended =+  do isodate <- parseDateInternal extended+     isotime <- option (ISOTime (Hour 0) NoMinute NoSecond UTCTime) +                       (skipT >> parseTimeInternal extended)+     return $ ISODateAndTime isodate isotime++-- I was pretty much fed up with the irregular format of ISO 8601. After a few+-- tries, I decided that the simplest approach was to just list all the+-- alternatives from the standard.++-- |argument determines whether extended format is parsed+parseDateInternal False =+  -- 5.2.1.1, complete representation, basic format: CCYYMMDD+  (try $ do ccyy <- parseFourDigits+	    mm <- parseTwoDigits+	    dd <- parseTwoDigits+	    return $ ISODate (Year ccyy) $ MonthDay (Month mm) (DayOfMonth dd))+  <|>+  -- !!! CHECK THIS !!!+  -- 5.2.1.2.a, a specific month, basic format: CCYY-MM+  (try $ do ccyy <- parseFourDigits+	    skipHyphen+	    mm <- parseTwoDigits+	    return $ ISODate (Year ccyy) $ MonthDay (Month mm) NoDayOfMonth)+  <|>+  -- 5.2.1.2.b, a specific year, basic format: CCYY+  (try $ do ccyy <- parseFourDigits+	    return $ ISODate (Year ccyy) NoDayOfYear)+  <|>+  -- 5.2.1.2.c, a specific century, basic format: CC+  (try $ do cc <- parseTwoDigits+	    return $ ISODate (Century cc) NoDayOfYear)+  <|>+  -- 5.2.1.3.a, truncated representation, specific date in current century, basic format: YYMMDD+  (try $ do yy <- parseTwoDigits+	    mm <- parseTwoDigits+	    dd <- parseTwoDigits+	    return $ ISODate (ImplicitCentury yy) $ MonthDay (Month mm) (DayOfMonth dd))+  <|>+  -- 5.2.1.3.b, truncated representation, specific year and month in current century, basic format: -YYMM+  (try $ do skipHyphen+	    yy <- parseTwoDigits+	    mm <- parseTwoDigits+	    return $ ISODate (ImplicitCentury yy) $ MonthDay (Month mm) NoDayOfMonth)+  <|>+  -- 5.2.1.3.c, truncated representation, specific year in current century, basic format: -YY+  (try $ do skipHyphen+	    yy <- parseTwoDigits+	    return $ ISODate (ImplicitCentury yy) NoDayOfYear)+  <|>+  -- 5.2.1.3.d, truncated representation, specific day of a month, basic format: --MMDD+  (try $ do skipHyphen+	    skipHyphen+	    mm <- parseTwoDigits+	    dd <- parseTwoDigits+	    return $ ISODate ImplicitYear $ MonthDay (Month mm) (DayOfMonth dd))+  <|>+  -- 5.2.1.3.e, truncated representation, specific month, basic format: --MM+  (try $ do skipHyphen+	    skipHyphen+	    mm <- parseTwoDigits+	    return $ ISODate ImplicitYear $ MonthDay (Month mm) NoDayOfMonth)+  <|>+  -- 5.2.1.3.f, truncated representation, specific day, basic format: ---DD+  (try $ do skipHyphen+	    skipHyphen+	    skipHyphen+	    dd <- parseTwoDigits+	    return $ ISODate ImplicitYear $ MonthDay ImplicitMonth (DayOfMonth dd))+  <|>+  -- 5.2.2 Ordinal date+  -- 5.2.2.1, complete representation, basic format: CCYYDDD+  (try $ do ccyy <- parseFourDigits+	    ddd <- parseOrdinalDay+	    return $ ISODate (Year ccyy) $ DayOfYear ddd)+  <|>+  -- 5.2.2.2.a, truncated representation, specific year and day in current century, basic format: YYDDD+  (try $ do yy <- parseTwoDigits+	    ddd <- parseOrdinalDay+	    return $ ISODate (ImplicitCentury yy) $ DayOfYear ddd)+  <|>+  -- 5.2.2.2.b, truncated representation, specific day only, basic format: -DDD+  (try $ do skipHyphen+	    ddd <- parseOrdinalDay+	    return $ ISODate ImplicitYear $ DayOfYear ddd)+  <|>+  -- 5.2.3 date by calendar week and day number+  -- 5.2.3.1, complete representation, basic format: CCYYWwwD+  (try $ do ccyy <- parseFourDigits+	    skipW+	    ww <- parseTwoDigits+	    checkWeeks ww+	    d <- parseWeekDay+	    return $ ISODate (Year ccyy) $ WeekAndDay (Week ww) (DayOfWeek d))+  <|>+  -- 5.2.3.2, reduced prec representation, basic format: CCYYWww+  (try $ do ccyy <- parseFourDigits+	    skipW+	    ww <- parseTwoDigits+	    checkWeeks ww+	    return $ ISODate (Year ccyy) $ WeekAndDay (Week ww) NoDayOfWeek)+  <|>+  -- 5.2.3.3.a, truncated representation, current century, basic format: YYWwwD+  (try $ do yy <- parseTwoDigits+	    skipW+	    ww <- parseTwoDigits+	    checkWeeks ww+	    d <- parseWeekDay+	    return $ ISODate (ImplicitCentury yy) $ WeekAndDay (Week ww) (DayOfWeek d))+  <|>+  -- 5.2.3.3.b, truncated representation, current century, year and week only, basic format: YYWww+  (try $ do yy <- parseTwoDigits+	    skipW+	    ww <- parseTwoDigits+	    checkWeeks ww+	    return $ ISODate (ImplicitCentury yy) $ WeekAndDay (Week ww) NoDayOfWeek)+  <|>+  -- 5.2.3.3.c, truncated representation, current decade, week, and day, basic format: -YWwwD+  (try $ do skipHyphen+	    y <- parseOneDigit+	    skipW+	    ww <- parseTwoDigits+	    checkWeeks ww+	    d <- parseWeekDay+	    return $ ISODate (ImplicitDecade y) $ WeekAndDay (Week ww) (DayOfWeek d))+  <|>+  -- 5.2.3.3.d, truncated representation, current year, week, and day, basic format: -WwwD+  (try $ do skipHyphen+	    skipW+	    ww <- parseTwoDigits+	    checkWeeks ww+	    d <- parseWeekDay+	    return $ ISODate ImplicitYear $ WeekAndDay (Week ww) (DayOfWeek d))+  <|>+  -- 5.2.3.3.e, truncated representation, current year, week only, basic format: -Www+  (try $ do skipHyphen+	    skipW+	    ww <- parseTwoDigits+	    checkWeeks ww+	    return $ ISODate ImplicitYear $ WeekAndDay (Week ww) NoDayOfWeek)+  <|>+  -- 5.2.3.3.f, truncated representation, day only of current week, basic format: -W-D+  (try $ do skipHyphen+	    skipW+	    skipHyphen+	    d <- parseWeekDay+	    return $ ISODate ImplicitYear $ WeekAndDay ImplicitWeek (DayOfWeek d))+  <|>+  -- 5.2.3.3.g, truncated representation, day only of any week, basic format: ---D+  (try $ do skipHyphen+	    skipHyphen+	    skipHyphen+	    d <- parseWeekDay+	    return $ ISODate ImplicitYear $ WeekAndDay AnyWeek (DayOfWeek d))+++-- ----------------------------------------------------------------------+-- extended formats  +parseDateInternal True =+  -- 5.2.1.1, complete representation, extended format CCYY-MM-DD+  (try $ do ccyy <- parseFourDigits+	    skipHyphen+	    mm <- parseTwoDigits+	    skipHyphen+	    dd <- parseTwoDigits+	    return $ ISODate (Year ccyy) $ MonthDay (Month mm) (DayOfMonth dd))+  <|>+  -- 5.2.1.3.a, truncated representation, extended format: YY-MM-DD+  (try $ do yy <- parseTwoDigits+	    skipHyphen+	    mm <- parseTwoDigits+	    skipHyphen+	    dd <- parseTwoDigits+	    return $ ISODate (ImplicitCentury yy) $ MonthDay (Month mm) (DayOfMonth dd))+  <|>+  -- 5.2.1.3.b, truncated representation, specific year and month in current century, extended format: -YY-MM+  (try $ do skipHyphen+	    yy <- parseTwoDigits+	    skipHyphen+	    mm <- parseTwoDigits+	    return $ ISODate (ImplicitCentury yy) $ MonthDay (Month mm) NoDayOfMonth)+  <|>+  -- 5.2.1.3.d, truncated representation, specific day of a month, extended format: --MM-DD+  (try $ do skipHyphen+	    skipHyphen+	    mm <- parseTwoDigits+	    skipHyphen+	    dd <- parseTwoDigits+	    return $ ISODate ImplicitYear $ MonthDay (Month mm) (DayOfMonth dd))+  <|>+  -- 5.2.2 Ordinal date+  -- 5.2.2.1, complete representation, extended format: CCYY-DDD+  (try $ do ccyy <- parseFourDigits+	    skipHyphen+	    ddd <- parseOrdinalDay+	    return $ ISODate (Year ccyy) $ DayOfYear ddd)+  <|>+  -- 5.2.2.2.a, truncated representation, specific year and day in current century, extended format: YY-DDD+  (try $ do yy <- parseTwoDigits+	    skipHyphen+	    ddd <- parseOrdinalDay+	    return $ ISODate (ImplicitCentury yy) $ DayOfYear ddd)+  <|>+  -- 5.2.3 date by calendar week and day number+  -- 5.2.3.1, complete representation, extended format: CCYY-Www-D+  (try $ do ccyy <- parseFourDigits+	    skipHyphen+	    skipW+	    ww <- parseTwoDigits+	    checkWeeks ww+	    skipHyphen+	    d <- parseWeekDay+	    return $ ISODate (Year ccyy) $ WeekAndDay (Week ww) (DayOfWeek d))+  <|>+  -- 5.2.3.2, reduced prec representation, extended format: CCYY-Www+  (try $ do ccyy <- parseFourDigits+	    skipHyphen+	    skipW+	    ww <- parseTwoDigits+	    checkWeeks ww+	    return $ ISODate (Year ccyy) $ WeekAndDay (Week ww) NoDayOfWeek)+  <|>+  -- 5.2.3.3.a, truncated representation, current century, extended format: YY-Www-D+  (try $ do yy <- parseTwoDigits+	    skipHyphen+	    skipW+	    ww <- parseTwoDigits+	    checkWeeks ww+	    skipHyphen+	    d <- parseWeekDay+	    return $ ISODate (ImplicitCentury yy) $ WeekAndDay (Week ww) (DayOfWeek d))+  <|>+  -- 5.2.3.3.b, truncated representation, current century, year and week only, extended format: YY-Www+  (try $ do yy <- parseTwoDigits+	    skipHyphen+	    skipW+	    ww <- parseTwoDigits+	    checkWeeks ww+	    return $ ISODate (ImplicitCentury yy) $ WeekAndDay (Week ww) NoDayOfWeek)+  <|>+  -- 5.2.3.3.c, truncated representation, current decade, week, and day, extended format: -Y-Www-D+  (try $ do skipHyphen+	    y <- parseOneDigit+	    skipHyphen+	    skipW+	    ww <- parseTwoDigits+	    checkWeeks ww+	    skipHyphen+	    d <- parseWeekDay+	    return $ ISODate (ImplicitDecade y) $ WeekAndDay (Week ww) (DayOfWeek d))+  <|>+  -- !!! CHECK THIS+  -- 5.2.3.3.d, truncated representation, current year, week, and day, extended format: -Www-D+  (try $ do skipHyphen+	    skipW+	    ww <- parseTwoDigits+	    checkWeeks ww+	    skipHyphen+	    d <- parseWeekDay+	    return $ ISODate ImplicitYear $ WeekAndDay (Week ww) (DayOfWeek d))++-- |time parsers+parseTimeInternal extended =+  do localtime <- parseLocalTimeInternal extended+     tzsuffix  <- option LocalTime $ parseTZsuffix extended+     return $ updateTZ localtime tzsuffix++parseTZsuffix extended =+  (do skipZ +      return UTCTime)+  <|>+  (do skipPlus+      (hours, minutes) <- parseHoursMinutes extended+      return $ PlusTime hours minutes)+  <|>+  (do skipMinus+      (hours, minutes) <- parseHoursMinutes extended+      return $ MinusTime hours minutes)++parseHoursMinutes False =+  do hh <- parseTwoDigits+     mm <- option NoMinute $ (liftM Minute) parseTwoDigits+     return (Hour hh, mm)++parseHoursMinutes True =+  do hh <- parseTwoDigits+     mm <- option NoMinute $ (liftM Minute) (skipColon >> parseTwoDigits)+     return (Hour hh, mm)++parseLocalTimeInternal False =+  -- 5.3.1.1, local time, basic format: hhmmss+  (try $ do hh <- parseTwoDigits+	    mm <- parseTwoDigits+	    ss <- parseTwoDigits+	    checkHours hh+	    checkMinutes mm+	    checkSeconds ss+	    return $ ISOTime (Hour hh) (Minute mm) (Second ss) LocalTime)+  <|>+  -- 5.3.1.2, local time, reduced precision, basic format: hhmm ; hh+  (try $ do hh <- parseTwoDigits+	    mm <- parseTwoDigits+	    checkHours hh+	    checkMinutes mm+	    return $ ISOTime (Hour hh) (Minute mm) NoSecond LocalTime)+  <|>+  (try $ do hh <- parseTwoDigits+	    checkHours hh+	    return $ ISOTime (Hour hh) NoMinute NoSecond LocalTime)+  <|>+  -- 5.3.1.4.a, local time, truncated, basic format: -mmss+  (try $ do skipHyphen+	    mm <- parseTwoDigits+	    ss <- parseTwoDigits+	    checkMinutes mm+	    checkSeconds ss+	    return $ ISOTime ImplicitHour (Minute mm) (Second ss) LocalTime)+  <|>+  -- 5.3.1.4.b, local time, truncated, basic format: -mm+  (try $ do skipHyphen+	    mm <- parseTwoDigits+	    checkMinutes mm+	    return $ ISOTime ImplicitHour (Minute mm) NoSecond LocalTime)+  <|>+  -- 5.3.1.4.c, local time, truncated, basic format: --ss+  (try $ do skipHyphen+	    skipHyphen+	    ss <- parseTwoDigits+	    checkSeconds ss+	    return $ ISOTime ImplicitHour ImplicitMinute (Second ss) LocalTime)+  ++parseLocalTimeInternal True =+  -- 5.3.1.1, local time, extended format: hh:mm:ss+  (try $ do hh <- parseTwoDigits+	    skipColon+	    mm <- parseTwoDigits+	    skipColon+	    ss <- parseTwoDigits+	    checkHours hh+	    checkMinutes mm+	    checkSeconds ss+	    return $ ISOTime (Hour hh) (Minute mm) (Second ss) LocalTime)+  <|>+  -- 5.3.1.2, local time, reduced precision, extended format: hh:mm+  (try $ do hh <- parseTwoDigits+	    skipColon+	    mm <- parseTwoDigits+	    checkHours hh+	    checkMinutes mm+	    return $ ISOTime (Hour hh) (Minute mm) NoSecond LocalTime)+  <|>+  -- 5.3.1.4.a, local time, truncated, extended format: -mm:ss+  (try $ do skipHyphen+	    mm <- parseTwoDigits+	    skipColon+	    ss <- parseTwoDigits+	    checkMinutes mm+	    checkSeconds ss+	    return $ ISOTime ImplicitHour (Minute mm) (Second ss) LocalTime)++-- make ISOTime, ISODate, ISODateAndTime instances of Read+instance Read ISOTime where+  readsPrec i = parserToRead parseTime++instance Read ISODate where+  readsPrec i = parserToRead parseDate++instance Read ISODateAndTime where+  readsPrec i = parserToRead parseDateAndTime+-- auxiliary parsers++checkSeconds ss = if ss > 60 then fail "more than 60 seconds" else return ()+checkMinutes mm = if mm > 59 then fail "more than 59 minutes" else return ()+checkHours   hh = if hh > 24 then fail "more than 24 hours" else return ()+checkDays   ddd = if ddd < 1 || ddd > 366 then fail "illegal ordinal day" else return ()+checkWeeks   ww = if ww < 1 || ww > 53 then fail "illegal week nr" else return ()++parseWeekDay = do d0 <- oneOf "1234567"+		  return (digitval d0)++parseOneDigit = do d0 <- digit+		   return (digitval d0)+parseTwoDigits = do d1 <- digit+		    vv <- parseOneDigit+		    return (10 * digitval d1 + vv)+parseThreeDigits = do d2 <- digit+		      vv <- parseTwoDigits+		      let vvv = 100 * digitval d2 + vv+		      return vvv+parseOrdinalDay = do vvv <- parseThreeDigits+		     checkDays vvv+		     return vvv+parseFourDigits = do d3 <- digit+		     vvv <- parseThreeDigits+		     return (1000 * digitval d3 + vvv)+
+ WASH/Utility/IntToString.hs view
@@ -0,0 +1,10 @@+-- © 2002 Peter Thiemann+module WASH.Utility.IntToString where++import Char++intToString ndigits i =+  let g x = h $ divMod x 10+      h (q,r) = chr (ord '0' + fromInteger r) : g q+  in+  reverse $ take ndigits $ g i
+ WASH/Utility/JavaScript.hs view
@@ -0,0 +1,27 @@+-- © 2003 Peter Thiemann+module WASH.Utility.JavaScript where++import Char++import WASH.Utility.Hex++jsShow :: String -> String+jsShow xs = '\'' : g xs+  where+    g "" = "'"+    g (x:xs) = +      case x of+	'\'' -> h x xs+	'\"' -> h x xs+	'<' -> h x xs+	'>' -> h x xs+	'&' -> h x xs+	x | isPrint x -> x : g xs+	  | otherwise -> h x xs+    h x xs =+      let ox = ord x in+      if ox < 256 then+	 '\\' : 'x' : showsHex 2 ox (g xs)+      else+	 '\\' : 'u' : showsHex 4 ox (g xs)+				 
+ WASH/Utility/Locking.hs view
@@ -0,0 +1,41 @@+-- © 2003 Peter Thiemann+{-|+Implements Locking via directory creation, which seems to be the only portable+way to do it through Haskell's standard IO library.+-}+module WASH.Utility.Locking (obtainLock, releaseLock) where++import WASH.Utility.Auxiliary+import Directory+import IO+import System+import Time++obtainLock  :: FilePath -> IO ()+releaseLock :: FilePath -> IO ()++lockPath name = name ++ ".lockdir"++obtainLock name =+  assertDirectoryExists (lockPath name)+                        (system "sleep 1" >> obtainLockLoop name)++releaseLock name =+  removeDirectory (lockPath name)++obtainLockLoop name =+  let lp = lockPath name in+  do b <- doesDirectoryExist lp+     if b then do -- check if lock is stale+		  mtime <- getModificationTime lp+		  ftime <- getModificationTime name+		  ctime <- getClockTime+		  let td = diffClockTimes ctime mtime+		      tf = diffClockTimes ctime ftime+		  if tdSec td > 60 && tdSec tf > 60+		    then do removeDirectory lp+			    obtainLock name+		    else do system "sleep 1"+			    obtainLockLoop name+		    +          else obtainLock name
+ WASH/Utility/QuotedPrintable.hs view
@@ -0,0 +1,50 @@+-- © 2003 Peter Thiemann+module WASH.Utility.QuotedPrintable +       (encode, encode', decode+       -- deprecated: encode_quoted, encode_quoted', decode_quoted+       ) where++import Char+import WASH.Utility.Hex++encode, encode', decode :: String -> String+encode = encode_quoted+encode' = encode_quoted'+decode = decode_quoted+++encode_hexadecimal c = '=' : showHex2 c++quoted_printable x = +  ox >= 33 && ox <= 126 && ox /= 61+  where ox = ord x++end_of_line [] = True+end_of_line ('\r':'\n':_) = True+end_of_line _ = False++encode_quoted' (x:xs) | x `elem` "\t " = +  if end_of_line xs then encode_hexadecimal (ord x) ++ encode_quoted' xs+                    else x : encode_quoted' xs+encode_quoted' (x:xs) | quoted_printable x = x : encode_quoted' xs+encode_quoted' ('\r':'\n':xs) = '\r':'\n': encode_quoted' xs+encode_quoted' (x:xs) = encode_hexadecimal (ord x) ++ encode_quoted' xs+encode_quoted' [] = ""++encode_quoted = softLineBreak 76 . encode_quoted'++softLineBreak n [] = "\r\n"+softLineBreak 0 xs | not (end_of_line xs) = '=':'\r':'\n': softLineBreak 76 xs+softLineBreak n ('\r':'\n':xs) = '\r':'\n': softLineBreak 76 xs+softLineBreak n (xs@('=':_)) | n < 4 = '=':'\r':'\n': softLineBreak 76 xs+softLineBreak n (x:xs) = x : softLineBreak (n-1) xs++decode_quoted [] = []+decode_quoted ('=':'\r':'\n':xs) =+  decode_quoted xs+decode_quoted ('=':'\n':xs) =+  decode_quoted xs+decode_quoted ('=':upper:lower:xs) | isHexdigit upper && isHexdigit lower = +  chr (16 * hexDigitVal upper + hexDigitVal lower) : decode_quoted xs+decode_quoted (x:xs) = +  x : decode_quoted xs
+ WASH/Utility/RFC2047.hs view
@@ -0,0 +1,72 @@+-- © 2003 Peter Thiemann+module WASH.Utility.RFC2047 where+-- decoding of header fields+import Char+import List++import qualified WASH.Utility.Base64 as Base64+import qualified WASH.Utility.QuotedPrintable as QuotedPrintable+import WASH.Utility.Hex+import Text.ParserCombinators.Parsec++lineString =+  do initial <- many (noneOf "\n\r=")+     rest <- option "" (do xs <- try encoded_words <|> string "=" +			   ys <- lineString+			   return (xs ++ ys))+     return (initial ++ rest)++especials = "()<>@,;:\\\"/[]?.="+tokenchar = "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" \\ especials+p_token = many1 (oneOf tokenchar)+p_encoded_text = many1 $ oneOf "!\"#$%&'()*+,-./0123456789:;<=>@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"+allchar = "\NUL\SOH\STX\ETX\EOT\ENQ\ACK\a\b\t\n\v\f\r\SO\SI\DLE\DC1\DC2\DC3\DC4\NAK\SYN\ETB\CAN\EM\SUB\ESC\FS\GS\RS\US !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\DEL"++-- supress linear white space between adjacent encoded_word+encoded_words =+  do ew <- encoded_word+     ws <- many space+     option (ew++ws) (encoded_words >>= \ews -> return (ew++ews))++encoded_word =+  do string "=?"+     charset <- p_token+     char '?'+     encoding <- p_token+     char '?'+     encoded_text <- p_encoded_text+     string "?="+     return $ decode charset (map toUpper encoding) encoded_text++decode charset "B" encoded_text =+  Base64.decode' encoded_text+decode charset "Q" encoded_text =+  decode_quoted encoded_text+decode charset encoding encoded_text =+  error ("Unknown encoding: " ++ encoding)+  +decode_quoted [] = []+decode_quoted ('=':upper:lower:xs) = +  chr (16 * hexDigitVal upper + hexDigitVal lower) : decode_quoted xs+decode_quoted ('_':xs) = +  ' ' : decode_quoted xs+decode_quoted (x:xs) = +  x : decode_quoted xs++-- --------------------------------------------------------------------+-- RFC 2047: encoding of header fields++encodeWord w =+  "=?" ++ charset ++ "?" ++ encoding ++ "?" ++ QuotedPrintable.encode' w ++ "?="+  where encoding = "q"+	charset  = "iso-8859-1"++encodeValue v = +  case span (not . flip elem " ()<>@.!,") v of+    ([], []) -> []+    (word, []) -> maybeEncode word+    (word, x:rest) -> maybeEncode word ++ x : encodeValue rest++maybeEncode word | all p word = word+                 | otherwise = encodeWord word+  where p x = let ox = ord x in ox >= 33 && ox <= 126
+ WASH/Utility/RFC2279.hs view
@@ -0,0 +1,110 @@+-- © 2003 Peter Thiemann+{-|+  Implements UTF-8 encoding++  UCS-4 range (hex.)           UTF-8 octet sequence (binary)+  0000 0000-0000 007F   0xxxxxxx+  0000 0080-0000 07FF   110xxxxx 10xxxxxx+  0000 0800-0000 FFFF   1110xxxx 10xxxxxx 10xxxxxx+  0001 0000-001F FFFF   11110xxx 10xxxxxx 10xxxxxx 10xxxxxx+  0020 0000-03FF FFFF   111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx+  0400 0000-7FFF FFFF   1111110x 10xxxxxx ... 10xxxxxx+-}+module WASH.Utility.RFC2279 (encode, decode) where++import Char+++-- |maps Unicode string to list of octets+encode :: String -> String++-- |maps list of octets in UTF-8 encoding to Unicode string+decode :: String -> String++factors = iterate (* 0x40) 1+f1 = factors !! 1+f2 = factors !! 2+f3 = factors !! 3+f4 = factors !! 4+f5 = factors !! 5++encode [] = []+encode (x:xs) = +  let r0 = ord x in+  if r0 < 0x80 then+    x : encode xs+  else if r0 < 0x800 then+    let c1 = 0xC0 + r0 `div` f1+	c2 = 0x80 + r0 `mod` f1+    in  chr c1 : chr c2 : encode xs+  else if r0 < 0x10000 then+    let c1 = 0xE0 + r0 `div` f2+	r1 = r0 `mod` f2+	c2 = 0x80 + r1 `div` f1+	c3 = 0x80 + r1 `mod` f1+    in  chr c1 : chr c2 : chr c3 : encode xs+  else if r0 < 0x200000 then+    let c1 = 0xF0 + r0 `div` f3+	r1 = r0 `mod` f3+	c2 = 0x80 + r1 `div` f2+	r2 = r1 `mod` f2+	c3 = 0x80 + r2 `div` f1+	c4 = 0x80 + r2 `mod` f1+    in  chr c1 : chr c2 : chr c3 : chr c4 : encode xs+  else if r0 < 0x4000000 then+    let c1 = 0xF8 + r0 `div` f4+	r1 = r0 `mod` f4+	c2 = 0x80 + r1 `div` f3+	r2 = r1 `mod` f3+	c3 = 0x80 + r2 `div` f2+	r3 = r2 `mod` f2+	c4 = 0x80 + r3 `div` f1+	c5 = 0x80 + r3 `mod` f1+    in  chr c1 : chr c2 : chr c3 : chr c4 : chr c5 : encode xs+  else +    let c1 = 0xFC + r0 `div` f5+	r1 = r0 `mod` f5+	c2 = 0x80 + r1 `div` f4+	r2 = r1 `mod` f4+	c3 = 0x80 + r2 `div` f3+	r3 = r2 `mod` f3+	c4 = 0x80 + r3 `div` f2+	r4 = r3 `mod` f2+	c5 = 0x80 + r4 `div` f1+	c6 = 0x80 + r4 `mod` f1+    in  chr c1 : chr c2 : chr c3 : chr c4 : chr c5 : chr c6 : encode xs+++decode [] = []+decode (x : xs) =+  let ordx = ord x in +  if ordx < 0x80 then+    x : decode xs+  else if ordx < 0xC0 then+    error "UTF-8 decoding out of sync"+  else if ordx < 0xE0 then+    decoden 1 (ordx - 0xC0) xs+  else if ordx < 0xF0 then+    decoden 2 (ordx - 0xE0) xs+  else if ordx < 0xF8 then+    decoden 3 (ordx - 0xF0) xs+  else if ordx < 0xFC then+    decoden 4 (ordx - 0xF8) xs+  else if ordx < 0xFE then+    decoden 5 (ordx - 0xFC) xs+  else+    error "UTF-8 decoding found illegal start octet"+      +decoden :: Int -> Int -> String -> String+decoden 0 v xs =+  chr v : decode xs+decoden n v (x : xs) =+  let ordx = ord x+      v' = f1 * v + ordx - 0x80+  in +  if ordx >= 0x80 && ordx < 0xC0 then+    decoden (n-1) v' xs+  else +    error "UTF-8 decoding found illegal continuation octet"++	       
+ WASH/Utility/RFC2397.hs view
@@ -0,0 +1,65 @@+-- © 2002-2005 Peter Thiemann+module WASH.Utility.RFC2397 where++import WASH.Utility.URLCoding as URLCoding+import WASH.Utility.Base64 as Base64++data ENC = BASE64 | URL+  deriving Eq++-- |maps (mediatype, contents) to data URL+encode :: (String, String) -> String+encode (mediatype, thedata) =+  "data:" ++ mediatype ++ ";base64," ++ Base64.encode' thedata++-- |maps data URL to @Just (mediatype, contents)@ or @Nothing@ in case of a+-- syntax error.+decode :: String -> Maybe (String, String)+decode url = +  let (scheme, rest) = break (==':') url in+  case rest of+    ':' : contents | scheme == "data" -> +      decodeContents contents+    _ -> Nothing++decodeContents xs =+  let (prefix, restdata) = break (==',') xs in+  case restdata of+    ',' : thedata ->+      decodePrefix prefix thedata+    _ -> Nothing+      +decodePrefix prefix thedata =+  let fragments = breakList (==';') prefix +      enc = case reverse fragments of+	      ("base64":_) -> BASE64+	      _ -> URL+      mediapart | enc == BASE64 = init fragments+                | otherwise     = fragments+  in+  case mediapart of+    (xs:_) ->+      case break (=='/') xs of+	(_, []) -> +	  decodeData ("text/plain" : mediapart) enc thedata+	_ ->+	  decodeData mediapart enc thedata+    _ ->  decodeData ["text/plain", "charset=US-ASCII"] enc thedata++decodeData mediatype enc thedata =+  Just ( unparse mediatype+       , case enc of+	   URL    -> URLCoding.decode thedata+	   BASE64 -> Base64.decode thedata+       )++breakList :: (x -> Bool) -> [x] -> [[x]]+breakList p xs =+  let (pre, post) = break p xs in+  case post of+    [] -> [pre]+    y:ys -> pre : breakList p ys++unparse [] = ""+unparse [xs] = xs+unparse (xs:xss) = xs ++ ';' : unparse xss
+ WASH/Utility/SHA1.hs view
@@ -0,0 +1,119 @@+-- exchanged C-wrapper with Ian Lynagh's code+-- from http://web.comlab.ox.ac.uk/oucl/work/ian.lynagh/sha1/+-- under permission of license BSD++module WASH.Utility.SHA1 (sha1, sha1_size) where++import Char+import Bits+import Word++type ABCDE = (Word32, Word32, Word32, Word32, Word32)+type XYZ = (Word32, Word32, Word32)+type Rotation = Int++sha1 :: String -> String+sha1 s = s5+ where s1_2 = sha1_step_1_2_pad_length s+       abcde = sha1_step_3_init+       abcde' = sha1_step_4_main abcde s1_2+       s5 = sha1_step_5_display abcde'++sha1_size :: (Integral a) => a -> String -> String+sha1_size l s = s5+ where s1_2 = s ++ sha1_step_1_2_work (fromIntegral ((toInteger l) `mod` (2^64))) ""+       abcde = sha1_step_3_init+       abcde' = sha1_step_4_main abcde s1_2+       s5 = sha1_step_5_display abcde'++sha1_step_1_2_pad_length :: String -> String+sha1_step_1_2_pad_length s = sha1_step_1_2_work 0 s++sha1_step_1_2_work :: Integer -> String -> String+sha1_step_1_2_work c64 "" = padding ++ len+ where padding = '\128':replicate' (shiftR (fromIntegral $ (440 - c64) `mod` 512) 3) '\000'+       len = map chr $ size_split 8 c64+sha1_step_1_2_work c64 (c:cs) = c:sha1_step_1_2_work ((c64 + 8) `mod` (2^64)) cs++replicate' :: Word16 -> a -> [a]+replicate' 0 _ = []+replicate' n x = x:replicate' (n-1) x++size_split :: Int -> Integer -> [Int]+size_split 0 _ = []+size_split p n = size_split (p-1) n' ++ [fromIntegral d]+ where (n', d) = divMod n 256++sha1_step_3_init :: ABCDE+sha1_step_3_init = (0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0)++{- +[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]++wm3 = [13,14,15]+wm8 = [8,9,10,11,12,13,14,15]+wm14 = [2,3,4,5,6,7,8,9,10,11,12,13,14,15]+wm16 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]+-}++sha1_step_4_main :: ABCDE -> String -> ABCDE+sha1_step_4_main abcde "" = {- abcde -} abcde+sha1_step_4_main abcde0 s = sha1_step_4_main abcde5 s'+ where (s64, s') = takeDrop 64 s+       s16 = get_word_32s s64+       s80 = s16 ++ sha1_add_ws 16 (drop 13 s16, drop 8 s16, drop 2 s16, s16)+       (s20_0, s60) = takeDrop 20 s80+       (s20_1, s40) = takeDrop 20 s60+       (s20_2, s20_3) = takeDrop 20 s40+       abcde1 = foldl (doit f1 0x5a827999) abcde0 s20_0+       abcde2 = foldl (doit f2 0x6ed9eba1) abcde1 s20_1+       abcde3 = foldl (doit f3 0x8f1bbcdc) abcde2 s20_2+       abcde4 = foldl (doit f2 0xca62c1d6) abcde3 s20_3+       f1 (x, y, z) = (x .&. y) .|. ((complement x) .&. z)+       f2 (x, y, z) = x `xor` y `xor` z+       f3 (x, y, z) = (x .&. y) .|. (x .&. z) .|. (y .&. z)+       (a,  b,  c,  d,  e ) = abcde0+       (a', b', c', d', e') = abcde4+       abcde5 = (a + a', b + b', c + c', d + d', e + e')++doit :: (XYZ -> Word32) -> Word32 -> ABCDE -> Word32 -> ABCDE+doit f k (a, b, c, d, e) w = (a', a, rotL b 30, c, d)+ where a' = rotL a 5 + f(b, c, d) + e + w + k++sha1_add_ws :: Int -> ([Word32], [Word32], [Word32], [Word32]) -> [Word32]+sha1_add_ws 80 _ = []+sha1_add_ws n (w1:w1s, w2:w2s, w3:w3s, w4:w4s)+ = w:sha1_add_ws (n + 1) (w1s ++ [w], w2s ++ [w], w3s ++ [w], w4s ++ [w])+ where w = rotL (foldr1 xor [w1, w2, w3, w4]) 1++get_word_32s :: String -> [Word32]+get_word_32s "" = []+get_word_32s ss = this:rest+ where (s, ss') = takeDrop 4 ss+       this = sum $ zipWith shiftL (map (fromIntegral.ord) s) [24, 16, 8, 0]+       rest = get_word_32s ss'++takeDrop :: Int -> [a] -> ([a], [a])+takeDrop _ [] = ([], [])+takeDrop 0 xs = ([], xs)+takeDrop n (x:xs) = (x:ys, zs)+ where (ys, zs) = takeDrop (n-1) xs++sha1_step_5_display :: ABCDE -> String+sha1_step_5_display (a, b, c, d, e)+ = foldr (\x y -> display_32bits_as_hex x ++ y) "" [a, b, c, d, e]++display_32bits_as_hex :: Word32 -> String+display_32bits_as_hex x0 = map getc [y8,y7,y6,y5,y4,y3,y2,y1]+ where (x1, y1) = divMod x0 16+       (x2, y2) = divMod x1 16+       (x3, y3) = divMod x2 16+       (x4, y4) = divMod x3 16+       (x5, y5) = divMod x4 16+       (x6, y6) = divMod x5 16+       (y8, y7) = divMod x6 16+       getc n = (['0'..'9'] ++ ['a'..'f']) !! (fromIntegral n)++rotL :: Word32 -> Rotation -> Word32+rotL a s = shiftL a s .|. shiftL a (s-32)+
+ WASH/Utility/Shell.hs view
@@ -0,0 +1,20 @@+-- © 2002 Peter Thiemann+-- |Defines functions for shell quotation.+module WASH.Utility.Shell where++import Char++-- |Shell meta characters are /! & ; \` \' \" | * ? ~ \< \> ^ ( ) [ ] true $ n r/+metaCharacters :: String+metaCharacters = " !&;`\'\"|*?~<>^()[]$\\%{}"++-- |Quotes all shell meta characters and removes non printable ones.+quote :: String -> String+quote "" = ""+quote (x:xs) | isPrint x =+	       if x `elem` metaCharacters +	       then '\\' : x : quote xs+	       else x : quote xs+	     | otherwise = +	       quote xs+
+ WASH/Utility/SimpleParser.hs view
@@ -0,0 +1,60 @@+-- © 2002 Peter Thiemann+module WASH.Utility.SimpleParser where++import Char++-- very simple parser combinators: Parsec is too sophisticated!+newtype Parser a b = Parser (a -> [(b, a)])+unParser (Parser g) = g+instance Monad (Parser a) where+  return x = Parser (\ w -> [(x, w)])+  m >>=  f = let g = unParser m in+	     Parser (\ w -> [ (y, w'') | (x, w') <- g w, (y, w'') <- unParser (f x) w'])+  fail str = Parser (\ w -> [])++satisfy p = Parser (\ w -> [(x, w') | x:w' <- [w], p x])++print = satisfy isPrint+alphaNum = satisfy isAlphaNum+alpha = satisfy isAlpha+ascii = satisfy isAscii+digit = satisfy isDigit+char c = satisfy (==c)+string s = foldr (\ x p -> do { c <- char x; cs <- p; return (c:cs); }) (return "") s+oneOf cs = satisfy (`elem` cs)+noneOf cs = satisfy (not . (`elem` cs))++eof = Parser (\ w -> if null w then [((),[])] else [])+try parser = parser+p1 <|> p2 = let g1 = unParser p1+		g2 = unParser p2+	    in  Parser (\w -> g1 w ++ g2 w)++option :: x -> Parser a x -> Parser a x+option x parser = parser <|> return x++many1 p = +  do x <- p+     xs <- many p+     return (x : xs)++many p = +  option [] (many1 p)++manyn n p =+  if n <= 0 +  then return []+  else do x <- p+	  xs <- manyn (n-1) p+	  return (x : xs)+++parseFromString :: Parser String x -> String -> Maybe x+parseFromString parser str =+  let g = unParser (parser >>= (\x -> eof >> return x)) in+  case g str of+    (x, ""): _ -> Just x+    _ -> Nothing++parserToRead :: Parser String x -> ReadS x+parserToRead parser = unParser parser
+ WASH/Utility/URLCoding.hs view
@@ -0,0 +1,38 @@+-- © 2001, 2002, 2006 Peter Thiemann+-- |Implements coding of non-alphanumeric characters in URLs and CGI-requests.+module WASH.Utility.URLCoding (encode, decode) where++import Char+import WASH.Utility.Hex++-- |Perform URI encoding of a list of bytes. See +-- <http://www.w3.org/International/O-URL-code.html>+-- To encode a list of characters, the string first has to be UTF-8 encoded!+encode :: String -> String+encode = urlEncode++-- |Perform URI decoding to a list of bytes.+decode :: String -> String+decode = urlDecode++-- implementations++urlEncode :: String -> String+urlEncode xs =+  urlEncode' xs ""+urlEncode' "" = id+urlEncode' (x:xs) = +  (if isAlphaNum x +  then showChar x+  else showChar '%' .+       showsHex 2 (ord x)) . urlEncode' xs++urlDecode :: String -> String+urlDecode "" = ""+urlDecode ('+':xs) =+	' ' : urlDecode xs+urlDecode ('%':upper:lower:xs) =+	chr (16 * hexDigitVal upper + hexDigitVal lower) : urlDecode xs+urlDecode (x:xs) = +	x : urlDecode xs+
+ WASH/Utility/Unique.hs view
@@ -0,0 +1,67 @@+-- © 2001 Peter Thiemann+module WASH.Utility.Unique (inventStdKey, inventKey, inventFilePath) where++import Random+import IO+import Directory+import WASH.Utility.Auxiliary+import List+import Monad+import WASH.Utility.Locking++registryDir = "/tmp/Unique/"++-- |Creates a random string of 20 letters and digits.+inventStdKey :: IO String+inventStdKey = inventKey 20 stdKeyChars++stdKeyChars = ['A'..'Z'] ++ ['a'..'z'] ++ ['0'..'9']++-- |Creates a unique string from a given length and alphabet.+inventKey :: Int -> String -> IO String+inventKey len chars =+  do g <- newStdGen+     let candidate = take len $ map (chars !!) $ randomRs (0, length chars - 1) g+	 dirname = registryDir ++ candidate+     catch (do createDirectory dirname+	       return candidate)+	   (\ ioe -> +	   if isAlreadyExistsError ioe then+	      -- might want to check here for timeout+	      inventKey len chars+	   else if isDoesNotExistError ioe then+	     do assertDirectoryExists registryDir (return ())+		setPermissions registryDir (Permissions True True True True)+		inventKey len chars+	   else do hPutStrLn stderr ("inventKey could not create " ++ show dirname)+		   ioError ioe)++-- |Create a unique temporary file name+inventFilePath :: IO String+inventFilePath =+  do key <- inventStdKey+     return (registryDir ++ key ++ "/f")++-- obsolete. registryFile is a bottleneck.++registryFile = registryDir ++ "REGISTRY"++inventKey' :: Int -> String -> IO String+inventKey' len chars =+  do g <- newStdGen+     let candidate = take len $ map (chars !!) $ randomRs (0, length chars - 1) g+     obtainLock registryFile+     registry <- readRegistry+     let passwords = lines registry+     if candidate `elem` passwords +       then do releaseLock registryFile+	       inventKey' len chars+       else do appendFile registryFile (candidate ++ "\n")+	       releaseLock registryFile+	       return candidate++readRegistry :: IO String+readRegistry =+  let registryPath = init registryDir in+  do assertDirectoryExists registryPath (return ())+     readFileNonExistent registryFile ""
+ WashNGo.cabal view
@@ -0,0 +1,124 @@+Name: WashNGo+Version: 2.12+License: BSD3+License-File: LICENSE+Build-Type : Simple++Author: Peter Thiemann <thiemann@informatik.uni-freiburg.de>+maintainer: Marc Weber <marco-oweber@gmx.de>+-- note: CC both: Peter Thiemann and Marc Weber++Copyright: Copyright 2001-2006, Peter Thiemann+Homepage: http://www.informatik.uni-freiburg.de/~thiemann/haskell/WASH/+Category: Web+Stability: Beta+Synopsis: WASH is a family of embedded domain specific languages (EDSL) for programming Web applications in Haskell.+Cabal-Version: >= 1.2++-- source-repository head+--  type:     darcs+--  location: http://code.haskell.org/WASH/++Library+  Build-Depends: base < 5, regex-compat, haskell98, parsec+  Extensions: ForeignFunctionInterface+  build-depends: containers+  Exposed-Modules:+          WASH.CGI.AbstractSelector+          WASH.CGI.BaseCombinators+          WASH.CGI.CGI+          WASH.CGI.CGIConfig+          WASH.CGI.CGIGraphics+          WASH.CGI.CGIHistory+          WASH.CGI.CGIInternals+          WASH.CGI.CGIMonad+          WASH.CGI.CGIOutput+          WASH.CGI.CGITypes+          WASH.CGI.CGIXX+          WASH.CGI.ContentType+          WASH.CGI.Cookie+          WASH.CGI.CookieIO+          WASH.CGI.Debug+          WASH.CGI.EventHandlers+          WASH.CGI.Fields+          WASH.CGI.Frames+          WASH.CGI.GuaranteedCGI+          WASH.CGI.HTMLMail+          WASH.CGI.HTMLWrapper+          WASH.CGI.HTTP+          WASH.CGI.Images+          WASH.CGI.InputHandle+          WASH.CGI.MakeTypedName+          WASH.CGI.LogEntry+          WASH.CGI.PPM+          WASH.CGI.Persistent2+          WASH.CGI.RawCGITypes+          WASH.CGI.RawCGI+          WASH.CGI.RawCGIInternal+          WASH.CGI.StateItem+          WASH.CGI.Style+          WASH.CGI.Submit98+          WASH.CGI.SubmitXX+          WASH.CGI.TCGI+          WASH.CGI.Transaction+          WASH.CGI.TransactionUtil+          WASH.CGI.Types+          WASH.HTML.HTMLBase+          WASH.HTML.HTMLMonad+          WASH.HTML.HTMLMonadAttrs+          WASH.HTML.HTMLMonad98+          WASH.HTML.HTMLMonadBase+          WASH.HTML.HTMLPrelude+          WASH.HTML.HTMLPrelude98+          WASH.HTML.HTMLTypedBase+          WASH.HTML.HTMLTypedBase98+          WASH.HTML.HTMLTemplates+          WASH.Mail.ContentDisposition+          WASH.Mail.Email+          WASH.Mail.EmailConfig+          WASH.Mail.HeaderField+          WASH.Mail.MIME+          WASH.Mail.MailParser+          WASH.Mail.Message+          WASH.Mail.RFC2822+          WASH.Utility.Auxiliary+          WASH.Utility.Base32+          WASH.Utility.Base64+          WASH.Utility.BulkIO+          WASH.Utility.FileNames+          WASH.Utility.Hex+          WASH.Utility.ISO8601+          WASH.Utility.IntToString+          WASH.Utility.JavaScript+          WASH.Utility.Locking+          WASH.Utility.QuotedPrintable+          WASH.Utility.RFC2047+          WASH.Utility.RFC2279+          WASH.Utility.RFC2397+          WASH.Utility.SHA1+          WASH.Utility.SimpleParser+          WASH.Utility.Shell+          WASH.Utility.URLCoding+          WASH.Utility.Unique++Executable wash2hs+  Main-Is: WASHMain.hs+  Other-Modules:+          WASHFlags+          WASHUtil+          WASHOut+          WASHFlags+          WASHData+          WASHClean+          WASHExpression+          WASHMain+          WASHParser+          WASHGenerator++  Hs-Source-Dirs: washparser/hs+++Executable washc+  Main-Is: WASHC.hs+  Hs-Source-Dirs: washc/hs+  Build-Depends: ghc-paths, process, directory
+ washc/hs/WASHC.hs view
@@ -0,0 +1,40 @@+module Main where+import System.IO+import System.Process+import System.Environment+import GHC.Paths+import System.Exit+import System.Directory++-- in the past this was a shell script+-- I didn't know how to get the installation path from Cabal - so I rewrite it+-- as Haskell application++main = do+  -- custom addiotional arguments:+  args <- getArgs+++  case args of+    [] -> do+      n <- getProgName+      putStrLn $ "usage: " ++ n ++ " --make Main.hs"+      putStrLn $ "where Main.hs is a file such as the first hello world example found on "+      putStrLn $ "http://haskell.org/haskellwiki/WASH"++    _ -> do++      mwash2hs <- findExecutable "wash2hs"++      case mwash2hs of++        Nothing -> error "wash2hs not found in PATH"++        Just wash2hs -> do+              n <- getProgName+              let allArgs = ["-pgmF", wash2hs, "-F", "-package", "WashNGo" {- TODO: add version ? -}]+                            ++ args++              p <- runProcess GHC.Paths.ghc allArgs Nothing Nothing Nothing Nothing Nothing+              ec <- waitForProcess p+              exitWith ec
+ washparser/hs/WASHClean.hs view
@@ -0,0 +1,58 @@+module WASHClean where++import Char++import WASHData++data CM a = CM ([String] -> a)+instance Monad CM where -- Reader monad+  return x = CM (const x)+  m >>= f  = CM (\strs ->+		 case m of+		   CM mfun -> +		     case f (mfun strs) of+		       CM ffun ->+			 ffun strs)++class Clean n where+  clean :: n -> CM n++cleanCodeFragList :: [CodeFrag] -> [CodeFrag]+cleanCodeFragList = map g+  where g (EFrag el) = EFrag (cleanElement el)+	g (CFrag cs) = CFrag (cleanContentList cs)+	g cf         = cf++cleanElement :: Element -> Element+cleanElement e@Element{elemName = en, elemContent = ec} =+  if en == "pre"+  then e+  else let ec' = cleanContentList ec in+       e{elemContent = ec'}++cleanContentList :: [Content] -> [Content]+cleanContentList = remove . map g . combine+  where g c = case c of CElement{celem = el} -> CElement{celem = cleanElement el}+			CText{ctext = et}    -> CText{ctext = et { textString = cleanText (textString et) }}+			CCode{ccode = ec}    -> CCode{ccode = cleanCodeFragList ec}+			_ -> c+	combine (CText {ctext = t1} : CText {ctext = t2} : rest ) = +		combine (CText {ctext = Text {textString = textString t1++ textString t2, textMode = textMode t1}} : rest)+	combine (x : xs) = x : combine xs+	combine [] = []+	remove  (CText{ctext = tt} : rest) | textString tt == " " = remove rest+	-- remove  (CText{ctext = tt} : rest@(CElement{} : _)) = CText{ctext = dropRight tt} : remove rest+	-- remove  (e@CElement{} : (CText{ctext = tt} : rest)) = e : remove (CText{ctext = dropLeft tt} : rest)+	remove  (x : rest) = x : remove rest+	remove  [] = []++cleanText "" = ""+cleanText xs@[x] | isSpace x = " "+		 | otherwise = xs+cleanText (x : ys@(y : _)) | isSpace x = if isSpace y +					 then cleanText ys+					 else ' ' : cleanText ys+			   | otherwise = x : cleanText ys++dropRight tt = tt { textString = reverse (dropWhile isSpace (reverse (textString tt))) }+dropLeft  tt = tt { textString = dropWhile isSpace (textString tt) }
+ washparser/hs/WASHData.hs view
@@ -0,0 +1,74 @@+module WASHData						    -- derived from HSPData+    ( File (..)+    , Mode (..)+    , Element (..)+    , Text (..)+    , Content (..)+    , CodeFrag (..)+    , Attribute (..)+    , AttrValue (..)+    )+where {+++-- Data type.++data File = File { +    fcode :: [CodeFrag],+    topElem :: Element+    } deriving Show;++data Mode = V | S | F +  deriving (Eq,Show);++data Element = Element +    { elemMode :: Mode+    , elemName :: String+    , elemAttrs :: [Attribute]+    , elemContent :: [Content]+    , elemEmptyTag :: Bool }+    deriving Show;++data Text = Text +    { textMode :: Mode+    , textString :: String+    }+    deriving Show;++data Content +    = CElement { celem :: Element }+    | CText { ctext :: Text }+    | CReference { creference :: Text }+    | CPI { cpi :: String }+    | CComment { ccomment :: String }+    | CCode { ccode :: [CodeFrag] }+    deriving Show;+    +data CodeFrag +    = HFrag String+    | EFrag Element+    | HSFrag String+    | CFrag [Content]+    | AFrag [Attribute]+    | VFrag String+    deriving Show;++data Attribute+  = Attribute+    { attrMode :: Mode+    , attrName :: String+    , attrValue :: AttrValue }+  | AttrPattern+    { attrPattern :: String }+    deriving Show;++data AttrValue+    = AText String+    | ACode String+    deriving Show;++data Reference = Reference String deriving Show;+    +++}
+ washparser/hs/WASHExpression.hs view
@@ -0,0 +1,418 @@+module WASHExpression where++import List+import Monad++import WASHFlags+import qualified WASHUtil+import WASHData+import WASHOut++code :: FLAGS -> [CodeFrag] -> ShowS+code flags [] = id+code flags (x:xs) = code' flags x . code flags xs++code' :: FLAGS -> CodeFrag -> ShowS+code' flags (HFrag h) = +  showString h+code' flags (EFrag e) =+  runOut $ element flags e+code' flags (CFrag cnts) =+  showChar '(' .+  runOut (contents flags [] cnts) .+  showChar ')'+code' flags (AFrag attrs) =+  showChar '(' .+  WASHUtil.itemList (attribute flags) "CGI.empty" " >> " attrs .+  showChar ')'+code' flags (VFrag var) = +  id+code' flags _ = error "Unknown type: code"++outMode :: Mode -> Out ()+outMode = outShowS . showMode++showMode :: Mode -> ShowS+showMode V = id+showMode S = showString "_T"+showMode F = showString "_S"++element :: FLAGS -> Element -> Out [String]+element flags el@(Element mode nm ats cnt et) =+  case break (==':') nm of+    (ns, ':' : elnm) ->+      ns_element flags ns elnm el +    ("input", "") ->+      input_element flags mode nm ats cnt et+    ("textarea", "") ->+      textarea_element flags mode nm ats cnt et+    _ ->+      do outChar '('+	 outString "CGI."+	 outString nm+	 when (generateBT flags) $ outMode mode+	 outChar '('+	 outShowS $ attributes flags ats+	 rvs <- contents flags [] cnt+	 outString "))"+	 return rvs++textarea_element flags mode nm ats cnt et =+  let at_name = getAttribute ats "name"+      preset = getTextualContentAsStringExpression cnt+      processedAttributes = ["name"]+      cleanedAttributes = removeAttributes (`elem` processedAttributes) ats+  in+      do outString "(CGI."+	 outString "makeTextarea"+	 -- attention: the preset text is raw so it may contain character references!+	 outString preset+	 outChar '('+	 outShowS $ attributes flags cleanedAttributes+	 outString "empty))"+	 return [at_name]++input_element flags mode nm ats cnt et =+  let at_type = getAttribute ats "type"+      at_name = getAttribute ats "name"+      parms    = getAttribute ats "WASH:parms"+      callback = getAttribute ats "WASH:callback"+      call     = getAttribute ats "WASH:call"+      preset = getTextualContent cnt+      processedAttributes = ["type", "name", "WASH:parms", "WASH:callback", "WASH:call"]+      cleanedAttributes = removeAttributes (`elem` processedAttributes) ats+      do_element elnm =+	do outChar '('+	   outString "CGI."+	   outString elnm+	   outChar '('+	   outShowS $ attributes flags cleanedAttributes+	   outString "empty))"+	   return [at_name]+  in+  case at_type of+    "text" ->+      do_element "inputField"+    "password" ->+      do_element "passwordInputField"+    "checkbox" ->+      do_element "checkboxInputField"+    -- "radio" -> -- use the RB abstraction+    "submit" ->+      let Just (funpart, args) = +	       parse_WASH_call call `mplus`+	       parse_WASH_callback callback parms+	  largs = length args+      in+      do outString "(CGI."+	 outString at_type+	 foldr (\arg out -> do outString " (CGI.F2 ("+			       outString arg+			       outString ") "+			       out+			       outString ")")+	       (outString " CGI.F0") +	       args+	 outString "(\\"+	 convertArgs largs+	 outString " -> "+	 outChar '('+	 outString funpart -- funpart :: (arg1, ..., argn) -> CGI ()+	 outChar ')'+	 unless (null args) $ convertRess '(' largs+	 outChar ')'+	 outChar '('+	 outShowS $ attributes flags cleanedAttributes+	 outString "empty))"+	 return []+    "reset" ->+      do_element "resetField"+    "file" ->+      do_element "fileInputField"+    -- "hidden" -> -- useless in WASH+    -- "image" ->  -- ???+    -- "button" -> -- ???++convertArgs 0 =+  outString " CGI.F0"+convertArgs n =+  do outString "(CGI.F2 xxxx____"+     outString (show n)+     convertArgs (n-1)+     outString ")"++convertRess c 0 =+  outChar ')'+convertRess c n =+  do outString (c:"CGI.value xxxx____")+     outString (show n)+     convertRess ',' (n-1)++parse_WASH_callback cb parms =+  Just (cb, parse_WASH_call_args [] parms)++parse_WASH_call str =+  case break (=='(') str of+    (funpart, '(':rest1 ) ->+      Just (funpart, parse_WASH_call_args [] rest1)+    ("", "") ->+      Nothing+    (funpart, "") ->+      Just (funpart, [])+    _ -> Nothing++parse_WASH_call_args acc str =+  case break (`elem` ",)") str of+    (arg, ',': rest) ->+      parse_WASH_call_args (arg:acc) rest+    (arg, ')': rest) ->+      reverse (arg:acc)+    ("", "") ->+      reverse (acc)+    (arg, "") ->+      reverse (arg:acc)++ns_element flags "WASH" elnm (Element mode _ ats cnt et) =+  let var = getAttribute ats "WASH:name"+      chk = getAttribute ats "WASH:check"+      parms    = getAttribute ats "WASH:parms"+      callback = getAttribute ats "WASH:callback"+      preset = getTextualContent cnt+  in+  if elnm `elem` [ "submit", "submitLink"] then+      let args     = words parms in+      do outString "(CGI."+	 outString elnm+	 if null args+	   then outChar '0'+	   else do outString ("(CGI.F" ++ show (length args))+		   mapM (\arg -> outString (' ' : arg)) args+		   outChar ')'+	 outChar '('+	 outString callback+	 outChar ')'+	 outChar '('+	 outShowS $ attributes flags (removeAttributes (isPrefixOf "WASH:") ats)+	 outString "empty))"+	 return []+  else if elnm `elem` [ "inputField", "textInputField"+		      , "passwordInputField", "checkboxInputField"+		      , "fileInputField"] then+      do outChar '('+	 outString "CGI."+	 outString elnm+	 outChar '('+	 outShowS $ attributes flags (removeAttributes (isPrefixOf "WASH:") ats)+	 outString "empty))"+	 return [var]+  else if elnm `elem` [ "checkedTextInputField", "checkedFileInputField"] then+      do outChar '('+	 outString "CGI."+	 outString elnm+	 outChar '('+	 outString chk+	 outChar ')'+	 outChar '('+	 outShowS $ attributes flags (removeAttributes (isPrefixOf "WASH:") ats)+	 outString "empty))"+	 return [var]+  else if elnm `elem` ["makeTextarea"] then+      do outString "(CGI."+	 outString elnm+	 -- attention: the preset text is raw so it may contain character references!+	 outString (show preset)+	 outChar '('+	 outShowS $ attributes flags (removeAttributes (isPrefixOf "WASH:") ats)+	 outString "empty))"+	 return [var]+  else if elnm `elem` ["makeButton"] then+      do outString "(CGI."+	 outString elnm+	 outChar '('+	 outShowS $ attributes flags (removeAttributes (isPrefixOf "WASH:") ats)+	 rvs <- contents flags [] cnt+	 outString "))"+	 return (var:rvs)+  else if elnm `elem` ["makeForm"] then+      do outString "(CGI."+	 outString elnm+	 outChar '('+	 outShowS $ attributes flags (removeAttributes (isPrefixOf "WASH:") ats)+	 rvs <- contents flags [] cnt+	 outString "))"+	 return rvs+  else+      error ("WASH element "++elnm++" not defined, yet")+ns_element flags ns elnm (Element mode nm ats cnt et) =+  do outChar '('+     outString "CGI.mkElement"+     when (generateBT flags) $ outMode mode+     outString (show nm)+     outChar '('+     outShowS $ attributes flags ats+     rvs <- contents flags [] cnt+     outString "))"+     return rvs++outRVS :: [String] -> Out ()+outRVS [] = outString "()"+outRVS (x:xs) =+  do outChar '('+     outString x+     mapM_ g xs+     outChar ')'+  where g x = do { outChar ','; outString x; }++outRVSpat :: [String] -> Out ()+outRVSpat [] = outString "(_)"+outRVSpat xs = outRVS xs++contents :: FLAGS -> [String] -> [Content] -> Out [String]+contents flags inRVS cts =+  case cts of+    [] ->+      do outString "return"+	 outRVS inRVS+	 return inRVS+    ct:cts ->+      do rvs <- content flags ct+	 case rvs of+	   [] ->+             case (cts, inRVS) of+	       ([],[]) ->+	         return []+	       _ ->+		 do outString " >> "+		    contents flags inRVS cts+	   _ ->+	     case (cts, inRVS) of+	       ([],[]) ->+	         return rvs+	       _ ->+		 do outString " >>= \\ "+		    outRVSpat rvs+		    outString " -> "+		    contents flags (rvs ++ inRVS) cts++content :: FLAGS -> Content -> Out [String]+content flags (CElement elem)  = +  element flags elem+content flags (CText txt) =+  do text flags txt+     return []+content flags (CCode (VFrag var:c)) =+  do outShowS $ (showChar '(' . code flags c . showChar ')')+     return [var]+content flags (CCode c) =+  do outShowS $ (showChar '(' . code flags c . showChar ')')+     return []+content flags (CComment cc) =+  do outShowS $ (showString "return (const () " . shows cc . showChar ')')+     return []+content flags (CReference txt) =+  do text flags txt+     return []+content flags c = +  error $ "Unknown type: content -- " ++ (show c)++text :: FLAGS -> Text -> Out [String]+text flags txt =+  do outString "CGI.rawtext"+     when (generateBT flags) $ outMode (textMode txt)+     outChar ' '+     outs (textString txt)+     return []++attributes :: FLAGS -> [Attribute] -> ShowS+attributes flags atts = +  f atts+    where+      f [] = id+      f (att:atts) = +	attribute flags att .+	showString " >> " .+	f atts++attribute :: FLAGS -> Attribute -> ShowS+attribute flags (Attribute m n v) = +  showString "(CGI.attr" .+  (if generateBT flags then (attrvalueBT m v) else id) .+  showChar ' ' .+  shows n . +  showString " " .+  attrvalue v .+  showString ")"+attribute flags (AttrPattern pat) =+  showString "( " .+  showString pat .+  showString " )"+attribute flags a = error $ "Unknown type: attribute -- " ++ (show a)++attrvalue :: AttrValue -> ShowS+attrvalue (AText t) = +  shows t+attrvalue (ACode c) =+  showString "( " .+  showString c .+  showString " )"+attrvalue a = error $ "Unknown type: attrvalue -- " ++ (show a)++raw_attrvalue :: AttrValue -> String+raw_attrvalue (AText t) = t+raw_attrvalue (ACode c) = c+raw_attrvalue a = error $ "Unknown type: raw_attrvalue -- " ++ show a++attrvalueBT :: Mode -> AttrValue -> ShowS+attrvalueBT V _ = id+attrvalueBT m (AText _) = showMode m . showChar 'S'+attrvalueBT m (ACode _) = showMode m . showChar 'D'+attrvalueBT m a = error $ "Unknown type: attrvalueBT -- " ++ (show a)++getAttribute :: [Attribute] -> String -> String+getAttribute [] atname = ""+getAttribute (Attribute m n v : rest) atname +  | n == atname = raw_attrvalue v+  | otherwise   = getAttribute rest atname+getAttribute (_ : rest) atname =+  getAttribute rest atname++removeAttributes :: (String -> Bool) -> [Attribute] -> [Attribute]+removeAttributes p = +  filter g+  where+    g (Attribute m n v) = not (p n)+    g (AttrPattern _) = True++getTextualContent :: [Content] -> String+getTextualContent = concatMap g+  where+  g (CElement _)  = "" +  g (CText txt) = textString txt+  g (CCode _) = ""+  g (CComment _) = ""+  g (CReference txt) = textString txt++getTextualContentAsStringExpression :: [Content] -> String+getTextualContentAsStringExpression = +  wrap . foldrx h z . map g+  where+  foldrx a b [] = b+  foldrx a b xs = foldr1 a xs+  z = "\"\""+  h e1 e2 = e1 ++ " ++ " ++ e2+  g (CElement _)  = z+  g (CText txt) = show (textString txt)+  g (CCode ccode) = getCodeFragsAsStringExpression ccode+  g (CComment _) = z+  g (CReference txt) = show (textString txt)+  wrap s = '(' : s ++ ")"++getCodeFragsAsStringExpression =+  concatMap g+  where+  g (HFrag str) = str+  g (EFrag element) = ""+  g (HSFrag str) = str+  g (CFrag conts) = ""+  g (AFrag attrs) = ""+  g (VFrag str) = str
+ washparser/hs/WASHFlags.hs view
@@ -0,0 +1,7 @@+module WASHFlags where+-- +flags0 = FLAGS { generateBT = False }++data FLAGS = FLAGS { generateBT :: Bool }++
+ washparser/hs/WASHGenerator.hs view
@@ -0,0 +1,57 @@+module WASHGenerator (preprocess, preprocessPIPE) where {++import List;+import IO;++import WASHData ;+import Text.ParserCombinators.Parsec hiding (try) ;+import qualified WASHParser ;+import qualified WASHExpression ;+import qualified WASHClean ;+import WASHFlags ;++-- import Trace;++preprocess :: FLAGS -> String -> String -> String -> IO ();+preprocess flags srcName dstName globalDefs =+  bracket (openFile srcName ReadMode)+    (\ srcHandle -> hClose srcHandle)+    (\ srcHandle -> +       bracket (openFile dstName WriteMode)+	 (\ dstHandle -> hClose dstHandle)+	 (\ dstHandle -> +	  preprocessPIPE flags srcName srcHandle dstHandle globalDefs));+++preprocessPIPE :: FLAGS -> String -> Handle -> Handle -> String -> IO ();+preprocessPIPE flags srcName srcHandle dstHandle globalDefs = do {+    input <- hGetContents srcHandle;+    let { parsing = parse WASHParser.washfile srcName input };+    case parsing of {+        Left error -> ioError $ userError $ show error;+        Right washfile ->+        hPutStrLn dstHandle (postprocess $ file flags globalDefs washfile "");+    };+};++file :: FLAGS -> String -> [CodeFrag] -> ShowS ;+file flags globalDefs fcode = +  WASHExpression.code flags (WASHClean.cleanCodeFragList fcode) .+  showString globalDefs .+  showString "\n"+  ;++imports ::  [String] -> String ;+imports is = concat $ map (\m -> "import " ++ m ++ ";\n") is ;++postprocess :: String -> String ;+postprocess = unlines . postprocess' . lines ;++postprocess' :: [String] -> [String] ;+postprocess' [] = [] ;+postprocess' xs'@(x:xs) = +  if "import" `isPrefixOf` x+  then "import qualified WASH.CGI.CGI as CGI" : xs'+  else x : postprocess' xs ;++}
+ washparser/hs/WASHMain.hs view
@@ -0,0 +1,43 @@+module Main where++-- ghc --make WASHMain -package text -o WASHMain++import Directory+import IO+import List+import System+import WASHGenerator+import WASHFlags++main =+  do args <- getArgs+     runPreprocessor flags0 args++runPreprocessor flags [washfile] =+  do fileExists <- doesFileExist washfile+     if ".wash" `isSuffixOf` washfile +	then+	preprocess flags washfile (take (length washfile - 5) washfile ++ ".hs") ""+	else if fileExists+	then+	bracket (openFile washfile ReadMode)+	  hClose+	  (\ inhandle -> preprocessPIPE flags washfile inhandle stdout "")+	else+	preprocess flags+             (washfile ++ ".wash")+	     (washfile ++ ".hs")+	     ""+runPreprocessor flags [washfile, hsfile] =+  preprocess flags (washfile) (hsfile) ""+runPreprocessor flags [originalFile, washfile, hsfile] =+  preprocess flags (washfile) (hsfile) ""+runPreprocessor flags [] =+  preprocessPIPE flags "<stdin>" stdin stdout ""+runPreprocessor flags args =+  do progName <- getProgName+     hPutStrLn stderr ("Usage: " ++ progName ++ " washfile [hsfile]")+     hPutStrLn stderr ("   or: " ++ progName ++ " originalFile infile outfile")+     hPutStrLn stderr ("   or: " ++ progName)+     hPutStrLn stderr ("       to run as pipe processor")+     hPutStrLn stderr ("Actual arguments: " ++ show args)
+ washparser/hs/WASHOut.hs view
@@ -0,0 +1,30 @@+module WASHOut where++-- output monad++data Out a = Out a ShowS++instance Monad Out where+  return a = Out a id+  m >>= f  = case m of+	       Out x shw1 ->+		 case f x of+                   Out y shw2 ->+		     Out y (shw1 . shw2)++runOut :: Out a -> ShowS+runOut (Out a shw) = shw++wrapper = (Out () .)++outString :: String -> Out ()+outString = wrapper showString++outChar :: Char -> Out ()+outChar = wrapper showChar++outs :: Show a => a -> Out ()+outs = wrapper shows++outShowS :: ShowS -> Out ()+outShowS = Out ()
+ washparser/hs/WASHParser.hs view
@@ -0,0 +1,624 @@+module WASHParser ( xmlfile, washfile ) where {++import Char ;+import Text.ParserCombinators.Parsec hiding (letter) ;+import WASHData;+import WASHUtil;+++notImplemented what = char '\xff' >> return undefined +    <?> (what ++ " isn't implemented yet");++f <$> p = do { x <- p; return $ f x; };++testParser p s = +    case parse (do { x <- p; eof; return x; }) "bla" s of {+        Left x -> print x;+        Right y -> print y;+    };++washfile :: Parser [CodeFrag] ;+washfile = +  do code <- hBody+     eof+     return $ code+  ;++setMode :: Bool -> Mode ;+setMode toplevel = if toplevel then S else F ;++-- The numbers given for each parser identify the section and+-- grammar production within the XML 1.0 definition (W3C +-- REC-xml-19980210).+++-- 2.1 / 1+xmlfile :: Parser File;+xmlfile = do { +    prolog;+    code <- option [] (do {+        hs <- haskell;+        s0;+        return hs+    });+    elem <- element True;+    many misc;+    eof;+    return $ File { fcode = code, topElem = elem };+};+++-- 2.2 / 2+char' = (char '\t' <|> char '\n' <|> char '\r' <|> +    satisfy (>= ' ')) <?> "character";+++-- 2.3 / 3+s = (try $ many1 (char ' ' <|> char '\t' <|> +    char '\r' <|> char '\n')) <?> "whitespace";+s0 = option "" s;+{-+s0 = (try $ many (char ' ' <|> char '\t' <|> +    char '\r' <|> char '\n')) <?> "optional whitespace";+-}++-- 2.3 / 4+nameChar = letter <|> digit <|> char '.' <|> char '-' <|> +    char '_' <|> char ':' <|> combiningChar <|> extender;+++-- 2.3 / 5+name :: Parser String;+name = do {+    c <- letter <|> char '_' <|> char ':';+    cs <- many nameChar;+    return $ c:cs;+} <?> "name";+++-- 2.3 / 6+names :: Parser [String];+names = sepBy1 name s;+++-- 2.3 / 7+nmtoken :: Parser String;+nmtoken = many1 nameChar <?> "nmtoken";+++-- 2.3 / 8+nmtokens :: Parser [String];+nmtokens = sepBy1 name s;+++-- 2.3 / 10+attValue :: Parser AttrValue;+attValue = (((AText . concat) <$> (+        between (char '\"') (char '\"') (many (p '\"')) +    <|> between (char '\'') (char '\'') (many (p '\'')) ))+    <|> ACode <$> haskellAttr) <?> "attvalue"+where {+    p end = (\x -> [x]) <$> satisfy (f end) <|> reference;+    f end = \c -> c /= '<' && c /= '&' && c /= end;+};++-- 2.3 / 11+systemLiteral = do{+  char '\'';+  sl <- many (satisfy (\c -> c /= '\''));+  char '\'';+  return sl;+} <|> do{+  char '\"';+  sl <- many (satisfy (\c -> c /= '\"'));+  char '\"';+  return sl;+};++-- 2.3 / 12+pubidLiteral = do {+  char '\'';+  sl <- many (pubidChar False);+  char '\'';+  return sl;+} <|> do{+  char '\"';+  sl <- many (pubidChar True);+  char '\"';+  return sl;+};++-- 2.3 / 13+pubidChar w = satisfy (\c -> c >= 'A' && c <= 'Z' +		          || c >= 'a' && c <= 'z'+			  || c >= '0' && c <= '9'+			  || c `elem` " \n\r-()+,./:=?;!*#@$_%"+			  || w && c == '\'');++-- 2.4 / 14+charData :: Bool -> Parser Text;+charData toplevel =+  do { s <- many1 charData'; return $ Text (setMode toplevel) $ concat s; }+  <?> "#PCDATA";++charData' :: Parser String;+charData' = do {+    c <- satisfy f;+    return [c];+} <|> do {+    string "]]";+    c <- satisfy (\c -> f c && c /= '>');+    return $ ']':']':[c];+}+where { +    f c = c /= '<' && c /= '&' && c /= ']';+};+++-- 2.5 / 15+comment :: Parser String;+comment = do {+    try $ string "<!--";+    comment';+} <?> "comment";++comment' = +    (do {+        c <- charInComment;+        cs <- comment';+        return $ c:cs; +    }) <|>+    (do { +        char '-';+        (do {+            try $ string "->";+            return "";+        }) <|>+        (do {+            c <- charInComment;+            cs <- comment';+            return $ c:cs;+        });+    });++charInComment = +   (char '\t' <|> char '\n' <|> char '\r' <|> +   satisfy (\c -> c >= ' ' && c /= '-')) <?> "character";+++-- 2.6 / 16+pI = notImplemented "processing instruction" >> return "";+++-- 2.7 / 18+cdSect = notImplemented "cdsect" >> return "";+++-- 2.8 / 22+prolog = do {+    option ("UTF-8", False) xmlDecl;+    many misc;+    option [[]] (docTypeDecl >> many misc);+    return ();+};+++-- 2.8 / 23+xmlDecl = do {+  try $ string "<?xml" ;+  versionInfo ;+  enc <- option [] encodingDecl ;+  sdd <- option False sDDecl ;+  s0;+  string "?>" ;+  return (enc, sdd)+};++-- 2.7 / 24+versionInfo = do {+  s ;+  string "version";+  eq ;+  ( do {char '\"'; versionNum; char '\"' } <|>+    do {char '\''; versionNum; char '\'' } );+};++-- 2.8 / 25+eq = do { s0; char '='; s0; };++-- 2.8 / 26+versionNum = string "1.0" ;++-- 2.8 / 27+misc = comment <|> pI <|> s;+++-- 2.8 / 28+-- [28] doctypedecl ::=+--        '<!DOCTYPE' S Name (S ExternalID)? S? ('[' intSubset ']' S?)? '>'+docTypeDecl = do{+  try $ string "<!DOCTYPE";+  s;+  name;+  option [] (do {s; externalID;});+  s0;+  option [] (do {char '[';intSubset; char ']'; s0; });+  char '>';+};++-- 2.8 / 28b+-- [28b]    intSubset    ::=    (markupdecl | DeclSep)*+intSubset = notImplemented "intSubset";++-- 2.9 / 32+sDDecl = do {+  s;+  string "standalone";+  eq;+  ( do {char '\"'; x <- yesNo; char '\"'; return x; } <|>+    do {char '\''; x <- yesNo; char '\''; return x; } ) ;+};++yesNo = do {string "yes"; return True;} <|> do {string "no" ; return False;};++-- 3 / 39, 3.1 / 40, 3.1 / 42, 3.1 / 44+element :: Bool -> Parser Element;+element toplevel = do {+    name <- try $ do { char '<'; name };+    attrs <- attributes False;+    (do {+        char '>';+        content <- content False;+        try $ do { string "</"; string name; s0; char '>'; };+        return $ Element (setMode toplevel) name attrs content False;+    }) <|>+    (do {+        try $ string "/>";+        return $ Element (setMode toplevel) name attrs [] True;+    })+} <|> do {+    try $ do { string "<%@" };+    s;+    string "include";+    s;+    AText filename <- attValue;+    s;+    subs <- substitutions;+    string "%>";+    let { str = openFile filename; } ;+    return $ +      case parse xmlfile filename str of {+	Left err ->+	  Element (setMode toplevel) "include-failed" +		  [Attribute (setMode toplevel) "file" (AText filename)]+		  [CText (Text (setMode toplevel) (show err))]+		  True;+	Right file ->+	  topElem file;+	}+} <?> "element";++attributes :: Bool -> Parser [Attribute];+attributes toplevel = do { s; attributes' toplevel; } <|> return [];++attributes' :: Bool -> Parser [Attribute];+attributes' toplevel = do { a <- attribute toplevel;+			    as <- attributes toplevel;+			    return (a:as);+			  }+		       <|> return [];++-- 3.1 / 41+attribute :: Bool -> Parser Attribute;+attribute toplevel = try (+  do { string "<%" ;+       pat <- hCode ;+       string "%>" ;+       return $ AttrPattern pat ;+    }+<|> +  do {+    name <- name;+    eq;+    value <- attValue;+    return $ Attribute (setMode toplevel) name value;+  }+) <?> "attribute";+++-- 3.1 / 43+content :: Bool -> Parser [Content];+content toplevel = many (+        (element toplevel  >>= (return . CElement))+    <|> (charData toplevel  >>= (return . CText))+    <|> (haskellText>>= (return . CCode))+    <|> (haskell   >>= (return . CCode))+    <|> (reference >>= (return . CReference . Text (setMode toplevel)))+    <|> (cdSect    >>  (return undefined))+    <|> (pI        >>= (return . CPI))+    <|> (comment   >>= (return . CComment))+);+++-- 4.1 / 66, 4.1 / 68+reference = do {+    char '&';+    r <- (do { +        char '#';+        r <- many1 digit <|> +            do { char 'x'; r <- many1 hexDigit; return $ 'x':r; };+        return $ '#':r;+    }) <|> name;+    char ';';+    return $ "&" ++ r ++ ";";+} <?> "reference";++-- 4.2.2 / 75+-- [75]    ExternalID    ::=    'SYSTEM' S SystemLiteral+--                            | 'PUBLIC' S PubidLiteral S SystemLiteral+externalID = do{+  string "SYSTEM";+  s;+  systemLiteral;+} <|>+do {+  string "PUBLIC";+  s;+  pubidLiteral;+  s;+  systemLiteral;+};++-- 4.3 / 80+encodingDecl = do {+  s;+  string "encoding";+  eq;+  ( do {char '\"'; x <- encName; char '\"'; return x;} <|>+    do {char '\''; x <- encName; char '\''; return x;});+};++-- 4.3 / 81+-- [81]    EncName    ::=    [A-Za-z] ([A-Za-z0-9._] | '-')*+encName = do {+  c <- satisfy (\c -> c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z') ;+  cs <- many (satisfy (\c -> c >= 'A' && c <= 'Z' +		          || c >= 'a' && c <= 'z'+			  || c >= '0' && c <= '9'+			  || c `elem` "._-"));+  return (c:cs)+};++-- B / 84+letter = baseChar <|> ideographic;++-- B / 85+baseChar = +    satisfy (\c -> +        (c >= '\x41' && c <= '\x5a') || +        (c >= '\x61' && c <= '\x7a') || +        (c >= '\xc0' && c <= '\xd6') || +        (c >= '\xd8' && c <= '\xf6') || +        (c >= '\xf8' && c <= '\xff')); -- and some Unicode characters++-- B / 86+ideographic = notImplemented "ideographic";++-- B / 87+combiningChar = notImplemented "combiningChar";++-- B / 88+--digit = digit; -- and some Unicode characters++-- B / 89+extender = char '\xb7'; -- and some Unicode characters+++haskell :: Parser [CodeFrag];+haskell = do {+    try $ string "<%";+    frags <- hStmt <|> hBody;+    try $ string "%>";+    return frags;+};++-- Haskell comment to end of line+-- see chapter 2.2 of report+hLineComment = do {+    ds <- try $ do { char '-';+		     ds <- many1 (char '-');+		     notFollowedBy (oneOf hAscSymbolString);+		     return ('-':ds);+		   };+    rest <- many (noneOf "\r\n\f");+    nl <- hNewline;+    return (ds ++ rest ++ nl);+};++hAscSymbolString = "!#$%&*+./<=>?@\\^|~";++hNewline = +  try (string "\r\n")+  <|> string "\r"+  <|> string "\n"+  <|> string "\f"+;++hNestedComment = do {+    let {stuff = "{-";};+    try (string stuff);+    hCommentContinuation stuff;+};++hCommentContinuation stuff = do {+    b <- many (noneOf "-{");+    let {moreStuff = stuff ++ b;};+    hCommentMinus moreStuff <|> hTryNestedComment moreStuff ;+};++hTryNestedComment stuff = do {+    nestedStuff <- hNestedComment;+    hCommentContinuation (stuff ++ nestedStuff);+} <|> do {+    char '{';+    hCommentContinuation (stuff ++ "{");+};++hCommentMinus stuff = do {+    char '-';+    let {moreStuff = stuff ++ "-";};+    hCommentClosing moreStuff <|> hCommentContinuation moreStuff;+};++hCommentClosing stuff = do {+    char '}';+    return (stuff++"}");+};++hIdentChar = letter <|> digit <|> char '\'' <|> char '_';++hStmt :: Parser [CodeFrag];+hStmt = do {+    var <- try $ do { s0 ;+		      v0 <- letter ;+		      vr <- many hIdentChar ;+		      s0 ;+		      string "<-" ;+		      return (v0:vr)+		    };+    body <- hBody ;+    return (VFrag var : body)+};++hBody :: Parser [CodeFrag];+hBody = many (+            (hCode >>= (return . HFrag))+        <|> (element True >>= (return . EFrag))+        <|> (nakedAttributes >>= (return . AFrag))+        <|> (nakedContent >>= (return . CFrag))+    );++nakedAttributes = do {+    s0 ;+    try $ string "<[" ;+    s0 ;+    attrs <- attributes' True ;+    try $ string "]>" ;+    return attrs;+};++nakedContent = do {+    try $ string "<#>" ;+    cnts <- content True ;+    try $ string "</#>";+    return cnts;+};++haskellAttr :: Parser String;+haskellAttr = haskellUnnested "<%";++haskellText :: Parser [CodeFrag];+haskellText = do {+  str <- haskellUnnested "<%=";+  return [HFrag "showText(", HFrag str, HFrag ")"]+};++haskellUnnested :: String -> Parser String;+haskellUnnested start = do {+    try $ string start;+    code <- hCode;+    try $ string "%>";+    return code;+} <?> "haskell code";++hCode = try $ do { sp <- getPosition;+		   str <- hcode' '%' (not . (`elem` "#[%"));+		   return (reindent sp str);+		 };+hPatt = try $ hcode' '#' (const True);++reindent :: SourcePos -> String -> String;+reindent sp = +  showString "\n{-# LINE " .+  shows (sourceLine sp) .+  showChar ' ' .+  shows (sourceName sp) .+  showString " #-}" .+  reindent' (sourceColumn sp - 1) ;+reindent' 0 = showChar '\n' ;+reindent' n = reindent' (n-1) . showChar ' ' ;++hSinglePatt = try $ do {+    s0 ;+    char '[' ;+    id <- name ;+    char ']' ;+    s0 ;+    return id ;+} ;+    ++hcode' escChar patC = +  let stopChars = escChar : "<\"'{-" in+  do { +    t <- many1 $ (  hcNorm stopChars+                <|> hcString+		<|> hcChar+		<|> hcLineComment+		<|> hcNestedComment+                <|> hcIsTag patC+                <|> hcIsEnd escChar ) ;+    return $ concat t+};++hcNorm stopChars = try . many1 $ noneOf stopChars;++hcLineComment =+  hLineComment <|> many1 (char '-');++hcNestedComment =+  hNestedComment <|> string "{";++-- only an approximation...+hcChar = do {+    char '\'' ;+    (try $ do { c <- noneOf "'\\" ;+	       char '\'' ;+	       return ['\'', c, '\''] ;+    }) <|> (try $ do {char '\\' ;+		    x <- satisfy (not . isSpace) ;+		    rest <- many (noneOf "'") ;+		    char '\'' ;+		    return ("'\\" ++ (x:rest) ++ "\'") ;})+    <|> return "\'";+};++hcString = try $ do {+    char '\"' ;+    strs <- many ((many1 $ noneOf "\"\\")+              <|> (char '\\' >> (+		   (do x <- satisfy (not . isSpace)+		       return ['\\',x])+ 	       <|> (do xs <- many1 $ satisfy isSpace+		       char '\\'+		       return ('\\' : xs ++ "\\"))))) ;+    char '\"' ;+    return ('\"' : concat strs ++ "\"")+};++hcIsTag patC = try $ do { +    char '<' ;+    t <- satisfy (\c -> (not.isAlpha $ c) && patC c) ;+    return ('<':t:[]) ;+};++hcIsEnd escChar = try $ do { +    char escChar ;+    t <- satisfy (/='>') ;+    return (escChar:t:[]) ;+};++-- experimental+substitutions = return [];++}
+ washparser/hs/WASHUtil.hs view
@@ -0,0 +1,82 @@+module WASHUtil 
+    ( normalize
+    , outList
+    , itemList
+    , openFile
+    ) where {
+
+import System.IO.Unsafe ;
+import WASHData ;
+
+itemList :: (item -> ShowS) -> String -> String -> [item] -> ShowS ;
+itemList showsItem empty glue items =
+  f items 
+  where { f []     = showString empty ;
+	  f [item] = showsItem item ;
+	  f (item:items) = showsItem item . showString glue . f items ;
+	};
+
+
+normalize :: [Content] -> [Content] ;
+normalize xs = shortContent.dropEmpty $ xs ;
+
+dropEmpty :: [Content] -> [Content] ;
+dropEmpty [] = [] ;
+dropEmpty (c:cs) = if isWhite c 
+                   then dropEmpty cs 
+                   else c:(dropEmpty cs);
+
+isWhite :: Content -> Bool ;
+isWhite (CText txt) = and $ map isWhite' (textString txt)
+    where { isWhite' c =  c == ' '
+                       || c == '\n'
+                       || c == '\t'
+                       || c == '\r' ;
+    } ;
+isWhite _ = False;
+
+hasText :: Content -> Bool;
+hasText (CText {}) = True ;
+hasText (CReference {}) = True ;
+hasText _ = False ;
+
+textOf :: Content -> Text;
+textOf (CText t) = t;
+textOf (CReference t) = t;
+textOf c = error ("textOf " ++ show c);
+
+joinable :: Text -> Text -> Bool;
+joinable t1 t2 = g (textMode t1) (textMode t2)
+  where { g S F = True;
+	  g S S = False;
+	  g F F = True;
+	  g V V = True;
+	  g _ _ = False;
+	};
+
+joinText :: Text -> Text -> Text;
+joinText t1 t2 = Text (textMode t1) (textString t1 ++ textString t2);
+
+shortContent :: [Content] -> [Content] ;
+shortContent [] = [] ;
+shortContent (CPI pi:cs) = shortContent cs ;
+shortContent (CComment c:cs) = shortContent cs ;
+shortContent (c1:c2:cs) | hasText c1 && hasText c2 =
+	     let { t1 = textOf c1 ; t2 = textOf c2 } in
+	     if joinable t1 t2 then shortContent (CText (joinText t1 t2):cs)
+			       else c1:shortContent (c2:cs);
+shortContent (c:cs) = c:shortContent cs ;
+
+outList :: [String] -> String ;
+outList xs = "[" ++ (outList' $ filter (/= []) xs) ++ "]" ;
+
+outList' ([])     = "" ;
+outList' (x:y:[]) = x ++ ", " ++ y ;
+outList' (x:y:xs) = x ++ ", " ++ outList' (y:xs) ;
+outList' (x:[])   = x ;
+outList' _        = error "ERROR: in processing showList" ;
+
+openFile :: String -> String ;
+openFile fname = unsafePerformIO (readFile fname) ;
+
+}