tagstew (empty) → 0
raw patch · 8 files changed
+2558/−0 lines, 8 filesdep +basedep +bytestringdep +compactsetup-changed
Dependencies added: base, bytestring, compact, tagsoup, tagstew, text, unicode-show, unordered-containers, utf8-string
Files
- CHANGELOG.md +5/−0
- LICENSE +30/−0
- README.md +7/−0
- Setup.hs +2/−0
- Text/HTML/TagStew.hs +144/−0
- Text/HTML/TagStew/Entity.hs +2303/−0
- app/Main.hs +28/−0
- tagstew.cabal +39/−0
+ CHANGELOG.md view
@@ -0,0 +1,5 @@+# Revision history for tagstew++## 0 -- YYYY-mm-dd++* First version. Released on an unsuspecting world.
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright Fumiaki Kinoshita (c) 2018++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++ * Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.++ * 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.++ * Neither the name of Fumiaki Kinoshita nor the names of other+ contributors may be used to endorse or promote products derived+ from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ README.md view
@@ -0,0 +1,7 @@+tagstew+====++tagstew is an HTML decoder which produces a stream of tags defined in the+[tagsoup](http://hackage.haskell.org/package/tagsoup-0.14.8/docs/Text-HTML-TagSoup.html) package. It is ~25% faster than tagsoup.++__It's likely to be incorrect; avoid using it in production.__
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ Text/HTML/TagStew.hs view
@@ -0,0 +1,144 @@+{-# LANGUAGE LambdaCase, BangPatterns, OverloadedStrings #-}+{-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE ViewPatterns #-}+{-# OPTIONS -ddump-simpl -dsuppress-all -ddump-to-file #-}+module Text.HTML.TagStew (parseTags) where++import qualified Data.ByteString.Unsafe as B+import qualified Data.ByteString.Char8 as BC+import qualified Data.ByteString as B+import qualified Text.HTML.TagSoup as S+import Text.HTML.TagStew.Entity (lookupEntity)+import Data.Bits+import Data.Char+import Data.Word (Word8)++data Stack = Text !Int+ | Entity !Int+ | TagOpen !Int+ | TagClose !Int+ | Attrs !Range !Attrs+ | AttrName !Range !Int !Attrs+ | AttrValue !Quote !Range !Range !Int !Attrs+ | Comment !Int+ | Script !Int+ deriving Show++newtype Range = MkRange Int deriving Show+data Quote = QNone | QSingle | QDouble+ deriving Show++type Attrs = [(Range, Range)]++pattern Range :: Int -> Int -> Range+pattern Range i j <- (unpack -> (i, j)) where+ Range i j = MkRange $ i `shiftL` 32 .|. j+{-# COMPLETE Range #-}++unpack :: Range -> (Int, Int)+unpack (MkRange x) = (x `shiftR` 32, x .&. 0xffffffff)+{-# INLINE unpack #-}++parseTags :: B.ByteString -> [S.Tag B.ByteString]+parseTags bs = go 0 (Text 0) where+ slice (Range i j) = B.unsafeTake (j - i) $ B.unsafeDrop i bs+ isScript (Range i j) = BC.map toLower (B.unsafeTake (j - i) (B.unsafeDrop i bs)) == "script"+ {-# INLINE isScript #-}+ go :: Int -> Stack -> [S.Tag B.ByteString]+ go loc _ | loc >= B.length bs = []+ go !loc !st = case st of+ Comment i+ | B.take 3 (B.drop loc bs) == "-->" ->+ S.TagComment (slice $ Range i loc)+ : go (loc + 3) (Text (loc + 3))+ | otherwise -> char+ Entity i -> case ch of+ C_SC -> do+ case lookupEntity (B.take (loc - i) $ B.drop i bs) of+ Just x -> S.TagText x : next (Text loc')+ Nothing -> S.TagText (slice $ Range i loc) : next (Text loc')+ C_NS -> char+ _ | isAlphaNum (toEnum (fromEnum ch)) -> char+ _ -> go loc $ Text (i - 1)+ Text i -> case ch of+ C_LT -> pushText (Range i loc) $ next (TagOpen loc')+ C_AMP -> pushText (Range i loc) $ next (Entity loc')+ _ -> char+ TagOpen i -> case ch of+ C_GT -> pushOpen 1 (Range i loc) []+ C_SL -> next $ TagClose loc'+ _ | isSpace' ch -> next $ AttrName (Range i loc) loc' []+ 33 | B.unsafeIndex bs loc' == c2w '-',+ B.unsafeIndex bs (loc + 2) == c2w '-' -> go (loc + 3) (Comment (loc + 3))+ _ -> char+ Attrs tname attrs -> case ch of+ C_GT -> pushOpen 1 tname attrs+ C_SL -> pushOpen 2 tname attrs+ _ | isSpace' ch -> next $ AttrName tname loc' attrs+ _ -> char+ AttrName tname i attrs -> case ch of+ C_SQ -> next $ AttrValue QSingle tname (Range 0 0) loc' attrs+ C_DQ -> next $ AttrValue QDouble tname (Range 0 0) loc' attrs+ C_EQ -> next $ AttrValue QNone tname (Range i loc) loc' attrs+ C_SL -> pushOpen 2 tname attrs+ C_GT -> pushOpen 1 tname attrs+ _ | isSpace' ch -> next $ AttrName tname loc' ((Range i loc, Range 0 0) : attrs)+ _ -> char+ AttrValue QSingle tname aname i attrs -> case ch of+ C_SQ -> next $ Attrs tname $ (aname, Range i loc) : attrs+ C_BS -> go (loc + 2) st+ _ -> char+ AttrValue QDouble tname aname i attrs -> case ch of+ C_DQ -> next $ Attrs tname $ (aname, Range i loc) : attrs+ C_BS -> go (loc + 2) st+ _ -> char+ AttrValue QNone tname aname i attrs -> case ch of+ C_SQ -> next $ AttrValue QSingle tname aname (i + 1) attrs+ C_DQ -> next $ AttrValue QDouble tname aname (i + 1) attrs+ C_SL -> pushOpen 2 tname $ (aname, Range i loc) : attrs+ C_GT -> pushOpen 1 tname $ (aname, Range i loc) : attrs+ _ | isSpace' ch -> next $ AttrName tname loc' $ (aname, Range i loc) : attrs+ _ -> char+ TagClose i -> case ch of+ C_GT -> (S.TagClose $! slice $ Range i loc) : next (Text $ loc + 1)+ _ -> char+ Script i+ | map toLower (BC.unpack (B.take 9 (B.drop loc bs))) == "</script>" -> do+ pushText (Range i loc)+ $ S.TagClose (slice $ Range (loc + 2) (loc + 8))+ : next (Text $ loc + 9)+ | otherwise -> char+ where+ pushText str@(Range i j) cont+ | i == j = cont+ | otherwise = S.TagText (slice str) : cont+ pushOpen ofs tname attrs =+ fmap slice (S.TagOpen tname attrs)+ : if isScript tname+ then go (loc + ofs) $ Script loc'+ else next $ Text $ loc + ofs+ {-# INLINE pushOpen #-}+ loc' = loc + 1+ next = go loc'+ ch = B.unsafeIndex bs loc+ byteCount = max 1 $ countLeadingZeros (complement ch)+ char = go (loc + byteCount) st++isSpace' :: Word8 -> Bool+isSpace' ch = ch == 13 || ch == 10 || ch == 32++pattern C_LT, C_EQ, C_GT, C_SL, C_SQ, C_DQ, C_BS, C_AMP, C_SC, C_NS :: Word8+pattern C_LT = 60+pattern C_EQ = 61+pattern C_GT = 62+pattern C_SL = 47+pattern C_SQ = 39+pattern C_DQ = 34+pattern C_BS = 92+pattern C_AMP = 38+pattern C_SC = 59+pattern C_NS = 35+++c2w :: Char -> Word8+c2w = toEnum . fromEnum
+ Text/HTML/TagStew/Entity.hs view
@@ -0,0 +1,2303 @@+{-# LANGUAGE OverloadedStrings #-}+{-# OPTIONS -Wno-name-shadowing #-}+-- | This module converts between HTML/XML entities (i.e. @&@) and+-- the characters they represent.+module Text.HTML.TagStew.Entity(+ lookupEntity+ ) where++import Data.Char (chr, ord)+import Data.Ix+import qualified Data.HashMap.Strict as HM+import Numeric (readHex)+import qualified Data.ByteString.Short as SB+import qualified Data.ByteString.Char8 as B+import Data.Compact+import Data.Text.Encoding (encodeUtf8)+import qualified Data.Text as T+import System.IO.Unsafe+++-- | Lookup an entity, using 'lookupNumericEntity' if it starts with+-- @#@ and 'lookupNamedEntity' otherwise+lookupEntity :: B.ByteString -> Maybe B.ByteString+lookupEntity bs+ | B.head bs == '#' = lookupNumericEntity (B.tail bs)+ | otherwise = lookupNamedEntity bs++-- | Lookup a numeric entity, the leading @\'#\'@ must have already been removed.+--+-- > lookupNumericEntity "65" == Just "A"+-- > lookupNumericEntity "x41" == Just "A"+-- > lookupNumericEntity "x4E" === Just "N"+-- > lookupNumericEntity "x4e" === Just "N"+-- > lookupNumericEntity "X4e" === Just "N"+-- > lookupNumericEntity "Haskell" == Nothing+-- > lookupNumericEntity "" == Nothing+-- > lookupNumericEntity "89439085908539082" == Nothing+lookupNumericEntity :: B.ByteString -> Maybe B.ByteString+lookupNumericEntity = fmap (encodeUtf8 . T.pack) . f . B.unpack+ -- entity = '&#' [0-9]+ ';' | '&#x' [0-9a-fA-F]+ ';'+ where+ f (x:xs) | x `elem` ("xX" :: String) = g [('0','9'),('a','f'),('A','F')] readHex xs+ f xs = g [('0','9')] reads xs++ g :: [(Char,Char)] -> ReadS Integer -> String -> Maybe String+ g valid reader xs = do+ let test b = if b then Just () else Nothing+ test $ isValid valid xs+ test $ not $ null xs+ case reader xs of+ [(a,"")] -> do+ test $ inRange (toInteger $ ord minBound, toInteger $ ord maxBound) a+ return [chr $ fromInteger a]+ _ -> Nothing++ isValid :: [(Char,Char)] -> String -> Bool+ isValid valid xs = all (\x -> any (`inRange` x) valid) xs+++-- | Lookup a named entity, using 'htmlEntities'+--+-- > lookupNamedEntity "amp" == Just "&"+-- > lookupNamedEntity "haskell" == Nothing+lookupNamedEntity :: B.ByteString -> Maybe B.ByteString+lookupNamedEntity x = SB.fromShort <$> HM.lookup (SB.toShort x) (getCompact htmlEntities)++-- | A table mapping HTML entity names to resolved strings. Most resolved strings are a single character long,+-- but some (e.g. @"ngeqq"@) are two characters long. The list is taken from+-- <http://www.w3.org/TR/html5/syntax.html#named-character-references>.+htmlEntities :: Compact (HM.HashMap SB.ShortByteString SB.ShortByteString)+htmlEntities = unsafePerformIO $ compact $ HM.fromList $ let a * b = (a, SB.toShort $ encodeUtf8 b) in+ ["Aacute" * "\x00C1"+ ,"aacute" * "\x00E1"+ ,"Aacute;" * "\x00C1"+ ,"aacute;" * "\x00E1"+ ,"Abreve;" * "\x0102"+ ,"abreve;" * "\x0103"+ ,"ac;" * "\x223E"+ ,"acd;" * "\x223F"+ ,"acE;" * "\x223E\x0333"+ ,"Acirc" * "\x00C2"+ ,"acirc" * "\x00E2"+ ,"Acirc;" * "\x00C2"+ ,"acirc;" * "\x00E2"+ ,"acute" * "\x00B4"+ ,"acute;" * "\x00B4"+ ,"Acy;" * "\x0410"+ ,"acy;" * "\x0430"+ ,"AElig" * "\x00C6"+ ,"aelig" * "\x00E6"+ ,"AElig;" * "\x00C6"+ ,"aelig;" * "\x00E6"+ ,"af;" * "\x2061"+ ,"Afr;" * "\x1D504"+ ,"afr;" * "\x1D51E"+ ,"Agrave" * "\x00C0"+ ,"agrave" * "\x00E0"+ ,"Agrave;" * "\x00C0"+ ,"agrave;" * "\x00E0"+ ,"alefsym;" * "\x2135"+ ,"aleph;" * "\x2135"+ ,"Alpha;" * "\x0391"+ ,"alpha;" * "\x03B1"+ ,"Amacr;" * "\x0100"+ ,"amacr;" * "\x0101"+ ,"amalg;" * "\x2A3F"+ ,"AMP" * "\x0026"+ ,"amp" * "\x0026"+ ,"AMP;" * "\x0026"+ ,"amp;" * "\x0026"+ ,"and;" * "\x2227"+ ,"And;" * "\x2A53"+ ,"andand;" * "\x2A55"+ ,"andd;" * "\x2A5C"+ ,"andslope;" * "\x2A58"+ ,"andv;" * "\x2A5A"+ ,"ang;" * "\x2220"+ ,"ange;" * "\x29A4"+ ,"angle;" * "\x2220"+ ,"angmsd;" * "\x2221"+ ,"angmsdaa;" * "\x29A8"+ ,"angmsdab;" * "\x29A9"+ ,"angmsdac;" * "\x29AA"+ ,"angmsdad;" * "\x29AB"+ ,"angmsdae;" * "\x29AC"+ ,"angmsdaf;" * "\x29AD"+ ,"angmsdag;" * "\x29AE"+ ,"angmsdah;" * "\x29AF"+ ,"angrt;" * "\x221F"+ ,"angrtvb;" * "\x22BE"+ ,"angrtvbd;" * "\x299D"+ ,"angsph;" * "\x2222"+ ,"angst;" * "\x00C5"+ ,"angzarr;" * "\x237C"+ ,"Aogon;" * "\x0104"+ ,"aogon;" * "\x0105"+ ,"Aopf;" * "\x1D538"+ ,"aopf;" * "\x1D552"+ ,"ap;" * "\x2248"+ ,"apacir;" * "\x2A6F"+ ,"ape;" * "\x224A"+ ,"apE;" * "\x2A70"+ ,"apid;" * "\x224B"+ ,"apos;" * "\x0027"+ ,"ApplyFunction;" * "\x2061"+ ,"approx;" * "\x2248"+ ,"approxeq;" * "\x224A"+ ,"Aring" * "\x00C5"+ ,"aring" * "\x00E5"+ ,"Aring;" * "\x00C5"+ ,"aring;" * "\x00E5"+ ,"Ascr;" * "\x1D49C"+ ,"ascr;" * "\x1D4B6"+ ,"Assign;" * "\x2254"+ ,"ast;" * "\x002A"+ ,"asymp;" * "\x2248"+ ,"asympeq;" * "\x224D"+ ,"Atilde" * "\x00C3"+ ,"atilde" * "\x00E3"+ ,"Atilde;" * "\x00C3"+ ,"atilde;" * "\x00E3"+ ,"Auml" * "\x00C4"+ ,"auml" * "\x00E4"+ ,"Auml;" * "\x00C4"+ ,"auml;" * "\x00E4"+ ,"awconint;" * "\x2233"+ ,"awint;" * "\x2A11"+ ,"backcong;" * "\x224C"+ ,"backepsilon;" * "\x03F6"+ ,"backprime;" * "\x2035"+ ,"backsim;" * "\x223D"+ ,"backsimeq;" * "\x22CD"+ ,"Backslash;" * "\x2216"+ ,"Barv;" * "\x2AE7"+ ,"barvee;" * "\x22BD"+ ,"barwed;" * "\x2305"+ ,"Barwed;" * "\x2306"+ ,"barwedge;" * "\x2305"+ ,"bbrk;" * "\x23B5"+ ,"bbrktbrk;" * "\x23B6"+ ,"bcong;" * "\x224C"+ ,"Bcy;" * "\x0411"+ ,"bcy;" * "\x0431"+ ,"bdquo;" * "\x201E"+ ,"becaus;" * "\x2235"+ ,"Because;" * "\x2235"+ ,"because;" * "\x2235"+ ,"bemptyv;" * "\x29B0"+ ,"bepsi;" * "\x03F6"+ ,"bernou;" * "\x212C"+ ,"Bernoullis;" * "\x212C"+ ,"Beta;" * "\x0392"+ ,"beta;" * "\x03B2"+ ,"beth;" * "\x2136"+ ,"between;" * "\x226C"+ ,"Bfr;" * "\x1D505"+ ,"bfr;" * "\x1D51F"+ ,"bigcap;" * "\x22C2"+ ,"bigcirc;" * "\x25EF"+ ,"bigcup;" * "\x22C3"+ ,"bigodot;" * "\x2A00"+ ,"bigoplus;" * "\x2A01"+ ,"bigotimes;" * "\x2A02"+ ,"bigsqcup;" * "\x2A06"+ ,"bigstar;" * "\x2605"+ ,"bigtriangledown;" * "\x25BD"+ ,"bigtriangleup;" * "\x25B3"+ ,"biguplus;" * "\x2A04"+ ,"bigvee;" * "\x22C1"+ ,"bigwedge;" * "\x22C0"+ ,"bkarow;" * "\x290D"+ ,"blacklozenge;" * "\x29EB"+ ,"blacksquare;" * "\x25AA"+ ,"blacktriangle;" * "\x25B4"+ ,"blacktriangledown;" * "\x25BE"+ ,"blacktriangleleft;" * "\x25C2"+ ,"blacktriangleright;" * "\x25B8"+ ,"blank;" * "\x2423"+ ,"blk12;" * "\x2592"+ ,"blk14;" * "\x2591"+ ,"blk34;" * "\x2593"+ ,"block;" * "\x2588"+ ,"bne;" * "\x003D\x20E5"+ ,"bnequiv;" * "\x2261\x20E5"+ ,"bnot;" * "\x2310"+ ,"bNot;" * "\x2AED"+ ,"Bopf;" * "\x1D539"+ ,"bopf;" * "\x1D553"+ ,"bot;" * "\x22A5"+ ,"bottom;" * "\x22A5"+ ,"bowtie;" * "\x22C8"+ ,"boxbox;" * "\x29C9"+ ,"boxdl;" * "\x2510"+ ,"boxdL;" * "\x2555"+ ,"boxDl;" * "\x2556"+ ,"boxDL;" * "\x2557"+ ,"boxdr;" * "\x250C"+ ,"boxdR;" * "\x2552"+ ,"boxDr;" * "\x2553"+ ,"boxDR;" * "\x2554"+ ,"boxh;" * "\x2500"+ ,"boxH;" * "\x2550"+ ,"boxhd;" * "\x252C"+ ,"boxHd;" * "\x2564"+ ,"boxhD;" * "\x2565"+ ,"boxHD;" * "\x2566"+ ,"boxhu;" * "\x2534"+ ,"boxHu;" * "\x2567"+ ,"boxhU;" * "\x2568"+ ,"boxHU;" * "\x2569"+ ,"boxminus;" * "\x229F"+ ,"boxplus;" * "\x229E"+ ,"boxtimes;" * "\x22A0"+ ,"boxul;" * "\x2518"+ ,"boxuL;" * "\x255B"+ ,"boxUl;" * "\x255C"+ ,"boxUL;" * "\x255D"+ ,"boxur;" * "\x2514"+ ,"boxuR;" * "\x2558"+ ,"boxUr;" * "\x2559"+ ,"boxUR;" * "\x255A"+ ,"boxv;" * "\x2502"+ ,"boxV;" * "\x2551"+ ,"boxvh;" * "\x253C"+ ,"boxvH;" * "\x256A"+ ,"boxVh;" * "\x256B"+ ,"boxVH;" * "\x256C"+ ,"boxvl;" * "\x2524"+ ,"boxvL;" * "\x2561"+ ,"boxVl;" * "\x2562"+ ,"boxVL;" * "\x2563"+ ,"boxvr;" * "\x251C"+ ,"boxvR;" * "\x255E"+ ,"boxVr;" * "\x255F"+ ,"boxVR;" * "\x2560"+ ,"bprime;" * "\x2035"+ ,"Breve;" * "\x02D8"+ ,"breve;" * "\x02D8"+ ,"brvbar" * "\x00A6"+ ,"brvbar;" * "\x00A6"+ ,"Bscr;" * "\x212C"+ ,"bscr;" * "\x1D4B7"+ ,"bsemi;" * "\x204F"+ ,"bsim;" * "\x223D"+ ,"bsime;" * "\x22CD"+ ,"bsol;" * "\x005C"+ ,"bsolb;" * "\x29C5"+ ,"bsolhsub;" * "\x27C8"+ ,"bull;" * "\x2022"+ ,"bullet;" * "\x2022"+ ,"bump;" * "\x224E"+ ,"bumpe;" * "\x224F"+ ,"bumpE;" * "\x2AAE"+ ,"Bumpeq;" * "\x224E"+ ,"bumpeq;" * "\x224F"+ ,"Cacute;" * "\x0106"+ ,"cacute;" * "\x0107"+ ,"cap;" * "\x2229"+ ,"Cap;" * "\x22D2"+ ,"capand;" * "\x2A44"+ ,"capbrcup;" * "\x2A49"+ ,"capcap;" * "\x2A4B"+ ,"capcup;" * "\x2A47"+ ,"capdot;" * "\x2A40"+ ,"CapitalDifferentialD;" * "\x2145"+ ,"caps;" * "\x2229\xFE00"+ ,"caret;" * "\x2041"+ ,"caron;" * "\x02C7"+ ,"Cayleys;" * "\x212D"+ ,"ccaps;" * "\x2A4D"+ ,"Ccaron;" * "\x010C"+ ,"ccaron;" * "\x010D"+ ,"Ccedil" * "\x00C7"+ ,"ccedil" * "\x00E7"+ ,"Ccedil;" * "\x00C7"+ ,"ccedil;" * "\x00E7"+ ,"Ccirc;" * "\x0108"+ ,"ccirc;" * "\x0109"+ ,"Cconint;" * "\x2230"+ ,"ccups;" * "\x2A4C"+ ,"ccupssm;" * "\x2A50"+ ,"Cdot;" * "\x010A"+ ,"cdot;" * "\x010B"+ ,"cedil" * "\x00B8"+ ,"cedil;" * "\x00B8"+ ,"Cedilla;" * "\x00B8"+ ,"cemptyv;" * "\x29B2"+ ,"cent" * "\x00A2"+ ,"cent;" * "\x00A2"+ ,"CenterDot;" * "\x00B7"+ ,"centerdot;" * "\x00B7"+ ,"Cfr;" * "\x212D"+ ,"cfr;" * "\x1D520"+ ,"CHcy;" * "\x0427"+ ,"chcy;" * "\x0447"+ ,"check;" * "\x2713"+ ,"checkmark;" * "\x2713"+ ,"Chi;" * "\x03A7"+ ,"chi;" * "\x03C7"+ ,"cir;" * "\x25CB"+ ,"circ;" * "\x02C6"+ ,"circeq;" * "\x2257"+ ,"circlearrowleft;" * "\x21BA"+ ,"circlearrowright;" * "\x21BB"+ ,"circledast;" * "\x229B"+ ,"circledcirc;" * "\x229A"+ ,"circleddash;" * "\x229D"+ ,"CircleDot;" * "\x2299"+ ,"circledR;" * "\x00AE"+ ,"circledS;" * "\x24C8"+ ,"CircleMinus;" * "\x2296"+ ,"CirclePlus;" * "\x2295"+ ,"CircleTimes;" * "\x2297"+ ,"cire;" * "\x2257"+ ,"cirE;" * "\x29C3"+ ,"cirfnint;" * "\x2A10"+ ,"cirmid;" * "\x2AEF"+ ,"cirscir;" * "\x29C2"+ ,"ClockwiseContourIntegral;" * "\x2232"+ ,"CloseCurlyDoubleQuote;" * "\x201D"+ ,"CloseCurlyQuote;" * "\x2019"+ ,"clubs;" * "\x2663"+ ,"clubsuit;" * "\x2663"+ ,"colon;" * "\x003A"+ ,"Colon;" * "\x2237"+ ,"colone;" * "\x2254"+ ,"Colone;" * "\x2A74"+ ,"coloneq;" * "\x2254"+ ,"comma;" * "\x002C"+ ,"commat;" * "\x0040"+ ,"comp;" * "\x2201"+ ,"compfn;" * "\x2218"+ ,"complement;" * "\x2201"+ ,"complexes;" * "\x2102"+ ,"cong;" * "\x2245"+ ,"congdot;" * "\x2A6D"+ ,"Congruent;" * "\x2261"+ ,"conint;" * "\x222E"+ ,"Conint;" * "\x222F"+ ,"ContourIntegral;" * "\x222E"+ ,"Copf;" * "\x2102"+ ,"copf;" * "\x1D554"+ ,"coprod;" * "\x2210"+ ,"Coproduct;" * "\x2210"+ ,"COPY" * "\x00A9"+ ,"copy" * "\x00A9"+ ,"COPY;" * "\x00A9"+ ,"copy;" * "\x00A9"+ ,"copysr;" * "\x2117"+ ,"CounterClockwiseContourIntegral;" * "\x2233"+ ,"crarr;" * "\x21B5"+ ,"cross;" * "\x2717"+ ,"Cross;" * "\x2A2F"+ ,"Cscr;" * "\x1D49E"+ ,"cscr;" * "\x1D4B8"+ ,"csub;" * "\x2ACF"+ ,"csube;" * "\x2AD1"+ ,"csup;" * "\x2AD0"+ ,"csupe;" * "\x2AD2"+ ,"ctdot;" * "\x22EF"+ ,"cudarrl;" * "\x2938"+ ,"cudarrr;" * "\x2935"+ ,"cuepr;" * "\x22DE"+ ,"cuesc;" * "\x22DF"+ ,"cularr;" * "\x21B6"+ ,"cularrp;" * "\x293D"+ ,"cup;" * "\x222A"+ ,"Cup;" * "\x22D3"+ ,"cupbrcap;" * "\x2A48"+ ,"CupCap;" * "\x224D"+ ,"cupcap;" * "\x2A46"+ ,"cupcup;" * "\x2A4A"+ ,"cupdot;" * "\x228D"+ ,"cupor;" * "\x2A45"+ ,"cups;" * "\x222A\xFE00"+ ,"curarr;" * "\x21B7"+ ,"curarrm;" * "\x293C"+ ,"curlyeqprec;" * "\x22DE"+ ,"curlyeqsucc;" * "\x22DF"+ ,"curlyvee;" * "\x22CE"+ ,"curlywedge;" * "\x22CF"+ ,"curren" * "\x00A4"+ ,"curren;" * "\x00A4"+ ,"curvearrowleft;" * "\x21B6"+ ,"curvearrowright;" * "\x21B7"+ ,"cuvee;" * "\x22CE"+ ,"cuwed;" * "\x22CF"+ ,"cwconint;" * "\x2232"+ ,"cwint;" * "\x2231"+ ,"cylcty;" * "\x232D"+ ,"dagger;" * "\x2020"+ ,"Dagger;" * "\x2021"+ ,"daleth;" * "\x2138"+ ,"darr;" * "\x2193"+ ,"Darr;" * "\x21A1"+ ,"dArr;" * "\x21D3"+ ,"dash;" * "\x2010"+ ,"dashv;" * "\x22A3"+ ,"Dashv;" * "\x2AE4"+ ,"dbkarow;" * "\x290F"+ ,"dblac;" * "\x02DD"+ ,"Dcaron;" * "\x010E"+ ,"dcaron;" * "\x010F"+ ,"Dcy;" * "\x0414"+ ,"dcy;" * "\x0434"+ ,"DD;" * "\x2145"+ ,"dd;" * "\x2146"+ ,"ddagger;" * "\x2021"+ ,"ddarr;" * "\x21CA"+ ,"DDotrahd;" * "\x2911"+ ,"ddotseq;" * "\x2A77"+ ,"deg" * "\x00B0"+ ,"deg;" * "\x00B0"+ ,"Del;" * "\x2207"+ ,"Delta;" * "\x0394"+ ,"delta;" * "\x03B4"+ ,"demptyv;" * "\x29B1"+ ,"dfisht;" * "\x297F"+ ,"Dfr;" * "\x1D507"+ ,"dfr;" * "\x1D521"+ ,"dHar;" * "\x2965"+ ,"dharl;" * "\x21C3"+ ,"dharr;" * "\x21C2"+ ,"DiacriticalAcute;" * "\x00B4"+ ,"DiacriticalDot;" * "\x02D9"+ ,"DiacriticalDoubleAcute;" * "\x02DD"+ ,"DiacriticalGrave;" * "\x0060"+ ,"DiacriticalTilde;" * "\x02DC"+ ,"diam;" * "\x22C4"+ ,"Diamond;" * "\x22C4"+ ,"diamond;" * "\x22C4"+ ,"diamondsuit;" * "\x2666"+ ,"diams;" * "\x2666"+ ,"die;" * "\x00A8"+ ,"DifferentialD;" * "\x2146"+ ,"digamma;" * "\x03DD"+ ,"disin;" * "\x22F2"+ ,"div;" * "\x00F7"+ ,"divide" * "\x00F7"+ ,"divide;" * "\x00F7"+ ,"divideontimes;" * "\x22C7"+ ,"divonx;" * "\x22C7"+ ,"DJcy;" * "\x0402"+ ,"djcy;" * "\x0452"+ ,"dlcorn;" * "\x231E"+ ,"dlcrop;" * "\x230D"+ ,"dollar;" * "\x0024"+ ,"Dopf;" * "\x1D53B"+ ,"dopf;" * "\x1D555"+ ,"Dot;" * "\x00A8"+ ,"dot;" * "\x02D9"+ ,"DotDot;" * "\x20DC"+ ,"doteq;" * "\x2250"+ ,"doteqdot;" * "\x2251"+ ,"DotEqual;" * "\x2250"+ ,"dotminus;" * "\x2238"+ ,"dotplus;" * "\x2214"+ ,"dotsquare;" * "\x22A1"+ ,"doublebarwedge;" * "\x2306"+ ,"DoubleContourIntegral;" * "\x222F"+ ,"DoubleDot;" * "\x00A8"+ ,"DoubleDownArrow;" * "\x21D3"+ ,"DoubleLeftArrow;" * "\x21D0"+ ,"DoubleLeftRightArrow;" * "\x21D4"+ ,"DoubleLeftTee;" * "\x2AE4"+ ,"DoubleLongLeftArrow;" * "\x27F8"+ ,"DoubleLongLeftRightArrow;" * "\x27FA"+ ,"DoubleLongRightArrow;" * "\x27F9"+ ,"DoubleRightArrow;" * "\x21D2"+ ,"DoubleRightTee;" * "\x22A8"+ ,"DoubleUpArrow;" * "\x21D1"+ ,"DoubleUpDownArrow;" * "\x21D5"+ ,"DoubleVerticalBar;" * "\x2225"+ ,"DownArrow;" * "\x2193"+ ,"downarrow;" * "\x2193"+ ,"Downarrow;" * "\x21D3"+ ,"DownArrowBar;" * "\x2913"+ ,"DownArrowUpArrow;" * "\x21F5"+ ,"DownBreve;" * "\x0311"+ ,"downdownarrows;" * "\x21CA"+ ,"downharpoonleft;" * "\x21C3"+ ,"downharpoonright;" * "\x21C2"+ ,"DownLeftRightVector;" * "\x2950"+ ,"DownLeftTeeVector;" * "\x295E"+ ,"DownLeftVector;" * "\x21BD"+ ,"DownLeftVectorBar;" * "\x2956"+ ,"DownRightTeeVector;" * "\x295F"+ ,"DownRightVector;" * "\x21C1"+ ,"DownRightVectorBar;" * "\x2957"+ ,"DownTee;" * "\x22A4"+ ,"DownTeeArrow;" * "\x21A7"+ ,"drbkarow;" * "\x2910"+ ,"drcorn;" * "\x231F"+ ,"drcrop;" * "\x230C"+ ,"Dscr;" * "\x1D49F"+ ,"dscr;" * "\x1D4B9"+ ,"DScy;" * "\x0405"+ ,"dscy;" * "\x0455"+ ,"dsol;" * "\x29F6"+ ,"Dstrok;" * "\x0110"+ ,"dstrok;" * "\x0111"+ ,"dtdot;" * "\x22F1"+ ,"dtri;" * "\x25BF"+ ,"dtrif;" * "\x25BE"+ ,"duarr;" * "\x21F5"+ ,"duhar;" * "\x296F"+ ,"dwangle;" * "\x29A6"+ ,"DZcy;" * "\x040F"+ ,"dzcy;" * "\x045F"+ ,"dzigrarr;" * "\x27FF"+ ,"Eacute" * "\x00C9"+ ,"eacute" * "\x00E9"+ ,"Eacute;" * "\x00C9"+ ,"eacute;" * "\x00E9"+ ,"easter;" * "\x2A6E"+ ,"Ecaron;" * "\x011A"+ ,"ecaron;" * "\x011B"+ ,"ecir;" * "\x2256"+ ,"Ecirc" * "\x00CA"+ ,"ecirc" * "\x00EA"+ ,"Ecirc;" * "\x00CA"+ ,"ecirc;" * "\x00EA"+ ,"ecolon;" * "\x2255"+ ,"Ecy;" * "\x042D"+ ,"ecy;" * "\x044D"+ ,"eDDot;" * "\x2A77"+ ,"Edot;" * "\x0116"+ ,"edot;" * "\x0117"+ ,"eDot;" * "\x2251"+ ,"ee;" * "\x2147"+ ,"efDot;" * "\x2252"+ ,"Efr;" * "\x1D508"+ ,"efr;" * "\x1D522"+ ,"eg;" * "\x2A9A"+ ,"Egrave" * "\x00C8"+ ,"egrave" * "\x00E8"+ ,"Egrave;" * "\x00C8"+ ,"egrave;" * "\x00E8"+ ,"egs;" * "\x2A96"+ ,"egsdot;" * "\x2A98"+ ,"el;" * "\x2A99"+ ,"Element;" * "\x2208"+ ,"elinters;" * "\x23E7"+ ,"ell;" * "\x2113"+ ,"els;" * "\x2A95"+ ,"elsdot;" * "\x2A97"+ ,"Emacr;" * "\x0112"+ ,"emacr;" * "\x0113"+ ,"empty;" * "\x2205"+ ,"emptyset;" * "\x2205"+ ,"EmptySmallSquare;" * "\x25FB"+ ,"emptyv;" * "\x2205"+ ,"EmptyVerySmallSquare;" * "\x25AB"+ ,"emsp13;" * "\x2004"+ ,"emsp14;" * "\x2005"+ ,"emsp;" * "\x2003"+ ,"ENG;" * "\x014A"+ ,"eng;" * "\x014B"+ ,"ensp;" * "\x2002"+ ,"Eogon;" * "\x0118"+ ,"eogon;" * "\x0119"+ ,"Eopf;" * "\x1D53C"+ ,"eopf;" * "\x1D556"+ ,"epar;" * "\x22D5"+ ,"eparsl;" * "\x29E3"+ ,"eplus;" * "\x2A71"+ ,"epsi;" * "\x03B5"+ ,"Epsilon;" * "\x0395"+ ,"epsilon;" * "\x03B5"+ ,"epsiv;" * "\x03F5"+ ,"eqcirc;" * "\x2256"+ ,"eqcolon;" * "\x2255"+ ,"eqsim;" * "\x2242"+ ,"eqslantgtr;" * "\x2A96"+ ,"eqslantless;" * "\x2A95"+ ,"Equal;" * "\x2A75"+ ,"equals;" * "\x003D"+ ,"EqualTilde;" * "\x2242"+ ,"equest;" * "\x225F"+ ,"Equilibrium;" * "\x21CC"+ ,"equiv;" * "\x2261"+ ,"equivDD;" * "\x2A78"+ ,"eqvparsl;" * "\x29E5"+ ,"erarr;" * "\x2971"+ ,"erDot;" * "\x2253"+ ,"escr;" * "\x212F"+ ,"Escr;" * "\x2130"+ ,"esdot;" * "\x2250"+ ,"esim;" * "\x2242"+ ,"Esim;" * "\x2A73"+ ,"Eta;" * "\x0397"+ ,"eta;" * "\x03B7"+ ,"ETH" * "\x00D0"+ ,"eth" * "\x00F0"+ ,"ETH;" * "\x00D0"+ ,"eth;" * "\x00F0"+ ,"Euml" * "\x00CB"+ ,"euml" * "\x00EB"+ ,"Euml;" * "\x00CB"+ ,"euml;" * "\x00EB"+ ,"euro;" * "\x20AC"+ ,"excl;" * "\x0021"+ ,"exist;" * "\x2203"+ ,"Exists;" * "\x2203"+ ,"expectation;" * "\x2130"+ ,"ExponentialE;" * "\x2147"+ ,"exponentiale;" * "\x2147"+ ,"fallingdotseq;" * "\x2252"+ ,"Fcy;" * "\x0424"+ ,"fcy;" * "\x0444"+ ,"female;" * "\x2640"+ ,"ffilig;" * "\xFB03"+ ,"fflig;" * "\xFB00"+ ,"ffllig;" * "\xFB04"+ ,"Ffr;" * "\x1D509"+ ,"ffr;" * "\x1D523"+ ,"filig;" * "\xFB01"+ ,"FilledSmallSquare;" * "\x25FC"+ ,"FilledVerySmallSquare;" * "\x25AA"+ ,"fjlig;" * "\x0066\x006A"+ ,"flat;" * "\x266D"+ ,"fllig;" * "\xFB02"+ ,"fltns;" * "\x25B1"+ ,"fnof;" * "\x0192"+ ,"Fopf;" * "\x1D53D"+ ,"fopf;" * "\x1D557"+ ,"ForAll;" * "\x2200"+ ,"forall;" * "\x2200"+ ,"fork;" * "\x22D4"+ ,"forkv;" * "\x2AD9"+ ,"Fouriertrf;" * "\x2131"+ ,"fpartint;" * "\x2A0D"+ ,"frac12" * "\x00BD"+ ,"frac12;" * "\x00BD"+ ,"frac13;" * "\x2153"+ ,"frac14" * "\x00BC"+ ,"frac14;" * "\x00BC"+ ,"frac15;" * "\x2155"+ ,"frac16;" * "\x2159"+ ,"frac18;" * "\x215B"+ ,"frac23;" * "\x2154"+ ,"frac25;" * "\x2156"+ ,"frac34" * "\x00BE"+ ,"frac34;" * "\x00BE"+ ,"frac35;" * "\x2157"+ ,"frac38;" * "\x215C"+ ,"frac45;" * "\x2158"+ ,"frac56;" * "\x215A"+ ,"frac58;" * "\x215D"+ ,"frac78;" * "\x215E"+ ,"frasl;" * "\x2044"+ ,"frown;" * "\x2322"+ ,"Fscr;" * "\x2131"+ ,"fscr;" * "\x1D4BB"+ ,"gacute;" * "\x01F5"+ ,"Gamma;" * "\x0393"+ ,"gamma;" * "\x03B3"+ ,"Gammad;" * "\x03DC"+ ,"gammad;" * "\x03DD"+ ,"gap;" * "\x2A86"+ ,"Gbreve;" * "\x011E"+ ,"gbreve;" * "\x011F"+ ,"Gcedil;" * "\x0122"+ ,"Gcirc;" * "\x011C"+ ,"gcirc;" * "\x011D"+ ,"Gcy;" * "\x0413"+ ,"gcy;" * "\x0433"+ ,"Gdot;" * "\x0120"+ ,"gdot;" * "\x0121"+ ,"ge;" * "\x2265"+ ,"gE;" * "\x2267"+ ,"gel;" * "\x22DB"+ ,"gEl;" * "\x2A8C"+ ,"geq;" * "\x2265"+ ,"geqq;" * "\x2267"+ ,"geqslant;" * "\x2A7E"+ ,"ges;" * "\x2A7E"+ ,"gescc;" * "\x2AA9"+ ,"gesdot;" * "\x2A80"+ ,"gesdoto;" * "\x2A82"+ ,"gesdotol;" * "\x2A84"+ ,"gesl;" * "\x22DB\xFE00"+ ,"gesles;" * "\x2A94"+ ,"Gfr;" * "\x1D50A"+ ,"gfr;" * "\x1D524"+ ,"gg;" * "\x226B"+ ,"Gg;" * "\x22D9"+ ,"ggg;" * "\x22D9"+ ,"gimel;" * "\x2137"+ ,"GJcy;" * "\x0403"+ ,"gjcy;" * "\x0453"+ ,"gl;" * "\x2277"+ ,"gla;" * "\x2AA5"+ ,"glE;" * "\x2A92"+ ,"glj;" * "\x2AA4"+ ,"gnap;" * "\x2A8A"+ ,"gnapprox;" * "\x2A8A"+ ,"gnE;" * "\x2269"+ ,"gne;" * "\x2A88"+ ,"gneq;" * "\x2A88"+ ,"gneqq;" * "\x2269"+ ,"gnsim;" * "\x22E7"+ ,"Gopf;" * "\x1D53E"+ ,"gopf;" * "\x1D558"+ ,"grave;" * "\x0060"+ ,"GreaterEqual;" * "\x2265"+ ,"GreaterEqualLess;" * "\x22DB"+ ,"GreaterFullEqual;" * "\x2267"+ ,"GreaterGreater;" * "\x2AA2"+ ,"GreaterLess;" * "\x2277"+ ,"GreaterSlantEqual;" * "\x2A7E"+ ,"GreaterTilde;" * "\x2273"+ ,"gscr;" * "\x210A"+ ,"Gscr;" * "\x1D4A2"+ ,"gsim;" * "\x2273"+ ,"gsime;" * "\x2A8E"+ ,"gsiml;" * "\x2A90"+ ,"GT" * "\x003E"+ ,"gt" * "\x003E"+ ,"GT;" * "\x003E"+ ,"gt;" * "\x003E"+ ,"Gt;" * "\x226B"+ ,"gtcc;" * "\x2AA7"+ ,"gtcir;" * "\x2A7A"+ ,"gtdot;" * "\x22D7"+ ,"gtlPar;" * "\x2995"+ ,"gtquest;" * "\x2A7C"+ ,"gtrapprox;" * "\x2A86"+ ,"gtrarr;" * "\x2978"+ ,"gtrdot;" * "\x22D7"+ ,"gtreqless;" * "\x22DB"+ ,"gtreqqless;" * "\x2A8C"+ ,"gtrless;" * "\x2277"+ ,"gtrsim;" * "\x2273"+ ,"gvertneqq;" * "\x2269\xFE00"+ ,"gvnE;" * "\x2269\xFE00"+ ,"Hacek;" * "\x02C7"+ ,"hairsp;" * "\x200A"+ ,"half;" * "\x00BD"+ ,"hamilt;" * "\x210B"+ ,"HARDcy;" * "\x042A"+ ,"hardcy;" * "\x044A"+ ,"harr;" * "\x2194"+ ,"hArr;" * "\x21D4"+ ,"harrcir;" * "\x2948"+ ,"harrw;" * "\x21AD"+ ,"Hat;" * "\x005E"+ ,"hbar;" * "\x210F"+ ,"Hcirc;" * "\x0124"+ ,"hcirc;" * "\x0125"+ ,"hearts;" * "\x2665"+ ,"heartsuit;" * "\x2665"+ ,"hellip;" * "\x2026"+ ,"hercon;" * "\x22B9"+ ,"Hfr;" * "\x210C"+ ,"hfr;" * "\x1D525"+ ,"HilbertSpace;" * "\x210B"+ ,"hksearow;" * "\x2925"+ ,"hkswarow;" * "\x2926"+ ,"hoarr;" * "\x21FF"+ ,"homtht;" * "\x223B"+ ,"hookleftarrow;" * "\x21A9"+ ,"hookrightarrow;" * "\x21AA"+ ,"Hopf;" * "\x210D"+ ,"hopf;" * "\x1D559"+ ,"horbar;" * "\x2015"+ ,"HorizontalLine;" * "\x2500"+ ,"Hscr;" * "\x210B"+ ,"hscr;" * "\x1D4BD"+ ,"hslash;" * "\x210F"+ ,"Hstrok;" * "\x0126"+ ,"hstrok;" * "\x0127"+ ,"HumpDownHump;" * "\x224E"+ ,"HumpEqual;" * "\x224F"+ ,"hybull;" * "\x2043"+ ,"hyphen;" * "\x2010"+ ,"Iacute" * "\x00CD"+ ,"iacute" * "\x00ED"+ ,"Iacute;" * "\x00CD"+ ,"iacute;" * "\x00ED"+ ,"ic;" * "\x2063"+ ,"Icirc" * "\x00CE"+ ,"icirc" * "\x00EE"+ ,"Icirc;" * "\x00CE"+ ,"icirc;" * "\x00EE"+ ,"Icy;" * "\x0418"+ ,"icy;" * "\x0438"+ ,"Idot;" * "\x0130"+ ,"IEcy;" * "\x0415"+ ,"iecy;" * "\x0435"+ ,"iexcl" * "\x00A1"+ ,"iexcl;" * "\x00A1"+ ,"iff;" * "\x21D4"+ ,"Ifr;" * "\x2111"+ ,"ifr;" * "\x1D526"+ ,"Igrave" * "\x00CC"+ ,"igrave" * "\x00EC"+ ,"Igrave;" * "\x00CC"+ ,"igrave;" * "\x00EC"+ ,"ii;" * "\x2148"+ ,"iiiint;" * "\x2A0C"+ ,"iiint;" * "\x222D"+ ,"iinfin;" * "\x29DC"+ ,"iiota;" * "\x2129"+ ,"IJlig;" * "\x0132"+ ,"ijlig;" * "\x0133"+ ,"Im;" * "\x2111"+ ,"Imacr;" * "\x012A"+ ,"imacr;" * "\x012B"+ ,"image;" * "\x2111"+ ,"ImaginaryI;" * "\x2148"+ ,"imagline;" * "\x2110"+ ,"imagpart;" * "\x2111"+ ,"imath;" * "\x0131"+ ,"imof;" * "\x22B7"+ ,"imped;" * "\x01B5"+ ,"Implies;" * "\x21D2"+ ,"in;" * "\x2208"+ ,"incare;" * "\x2105"+ ,"infin;" * "\x221E"+ ,"infintie;" * "\x29DD"+ ,"inodot;" * "\x0131"+ ,"int;" * "\x222B"+ ,"Int;" * "\x222C"+ ,"intcal;" * "\x22BA"+ ,"integers;" * "\x2124"+ ,"Integral;" * "\x222B"+ ,"intercal;" * "\x22BA"+ ,"Intersection;" * "\x22C2"+ ,"intlarhk;" * "\x2A17"+ ,"intprod;" * "\x2A3C"+ ,"InvisibleComma;" * "\x2063"+ ,"InvisibleTimes;" * "\x2062"+ ,"IOcy;" * "\x0401"+ ,"iocy;" * "\x0451"+ ,"Iogon;" * "\x012E"+ ,"iogon;" * "\x012F"+ ,"Iopf;" * "\x1D540"+ ,"iopf;" * "\x1D55A"+ ,"Iota;" * "\x0399"+ ,"iota;" * "\x03B9"+ ,"iprod;" * "\x2A3C"+ ,"iquest" * "\x00BF"+ ,"iquest;" * "\x00BF"+ ,"Iscr;" * "\x2110"+ ,"iscr;" * "\x1D4BE"+ ,"isin;" * "\x2208"+ ,"isindot;" * "\x22F5"+ ,"isinE;" * "\x22F9"+ ,"isins;" * "\x22F4"+ ,"isinsv;" * "\x22F3"+ ,"isinv;" * "\x2208"+ ,"it;" * "\x2062"+ ,"Itilde;" * "\x0128"+ ,"itilde;" * "\x0129"+ ,"Iukcy;" * "\x0406"+ ,"iukcy;" * "\x0456"+ ,"Iuml" * "\x00CF"+ ,"iuml" * "\x00EF"+ ,"Iuml;" * "\x00CF"+ ,"iuml;" * "\x00EF"+ ,"Jcirc;" * "\x0134"+ ,"jcirc;" * "\x0135"+ ,"Jcy;" * "\x0419"+ ,"jcy;" * "\x0439"+ ,"Jfr;" * "\x1D50D"+ ,"jfr;" * "\x1D527"+ ,"jmath;" * "\x0237"+ ,"Jopf;" * "\x1D541"+ ,"jopf;" * "\x1D55B"+ ,"Jscr;" * "\x1D4A5"+ ,"jscr;" * "\x1D4BF"+ ,"Jsercy;" * "\x0408"+ ,"jsercy;" * "\x0458"+ ,"Jukcy;" * "\x0404"+ ,"jukcy;" * "\x0454"+ ,"Kappa;" * "\x039A"+ ,"kappa;" * "\x03BA"+ ,"kappav;" * "\x03F0"+ ,"Kcedil;" * "\x0136"+ ,"kcedil;" * "\x0137"+ ,"Kcy;" * "\x041A"+ ,"kcy;" * "\x043A"+ ,"Kfr;" * "\x1D50E"+ ,"kfr;" * "\x1D528"+ ,"kgreen;" * "\x0138"+ ,"KHcy;" * "\x0425"+ ,"khcy;" * "\x0445"+ ,"KJcy;" * "\x040C"+ ,"kjcy;" * "\x045C"+ ,"Kopf;" * "\x1D542"+ ,"kopf;" * "\x1D55C"+ ,"Kscr;" * "\x1D4A6"+ ,"kscr;" * "\x1D4C0"+ ,"lAarr;" * "\x21DA"+ ,"Lacute;" * "\x0139"+ ,"lacute;" * "\x013A"+ ,"laemptyv;" * "\x29B4"+ ,"lagran;" * "\x2112"+ ,"Lambda;" * "\x039B"+ ,"lambda;" * "\x03BB"+ ,"lang;" * "\x27E8"+ ,"Lang;" * "\x27EA"+ ,"langd;" * "\x2991"+ ,"langle;" * "\x27E8"+ ,"lap;" * "\x2A85"+ ,"Laplacetrf;" * "\x2112"+ ,"laquo" * "\x00AB"+ ,"laquo;" * "\x00AB"+ ,"larr;" * "\x2190"+ ,"Larr;" * "\x219E"+ ,"lArr;" * "\x21D0"+ ,"larrb;" * "\x21E4"+ ,"larrbfs;" * "\x291F"+ ,"larrfs;" * "\x291D"+ ,"larrhk;" * "\x21A9"+ ,"larrlp;" * "\x21AB"+ ,"larrpl;" * "\x2939"+ ,"larrsim;" * "\x2973"+ ,"larrtl;" * "\x21A2"+ ,"lat;" * "\x2AAB"+ ,"latail;" * "\x2919"+ ,"lAtail;" * "\x291B"+ ,"late;" * "\x2AAD"+ ,"lates;" * "\x2AAD\xFE00"+ ,"lbarr;" * "\x290C"+ ,"lBarr;" * "\x290E"+ ,"lbbrk;" * "\x2772"+ ,"lbrace;" * "\x007B"+ ,"lbrack;" * "\x005B"+ ,"lbrke;" * "\x298B"+ ,"lbrksld;" * "\x298F"+ ,"lbrkslu;" * "\x298D"+ ,"Lcaron;" * "\x013D"+ ,"lcaron;" * "\x013E"+ ,"Lcedil;" * "\x013B"+ ,"lcedil;" * "\x013C"+ ,"lceil;" * "\x2308"+ ,"lcub;" * "\x007B"+ ,"Lcy;" * "\x041B"+ ,"lcy;" * "\x043B"+ ,"ldca;" * "\x2936"+ ,"ldquo;" * "\x201C"+ ,"ldquor;" * "\x201E"+ ,"ldrdhar;" * "\x2967"+ ,"ldrushar;" * "\x294B"+ ,"ldsh;" * "\x21B2"+ ,"le;" * "\x2264"+ ,"lE;" * "\x2266"+ ,"LeftAngleBracket;" * "\x27E8"+ ,"LeftArrow;" * "\x2190"+ ,"leftarrow;" * "\x2190"+ ,"Leftarrow;" * "\x21D0"+ ,"LeftArrowBar;" * "\x21E4"+ ,"LeftArrowRightArrow;" * "\x21C6"+ ,"leftarrowtail;" * "\x21A2"+ ,"LeftCeiling;" * "\x2308"+ ,"LeftDoubleBracket;" * "\x27E6"+ ,"LeftDownTeeVector;" * "\x2961"+ ,"LeftDownVector;" * "\x21C3"+ ,"LeftDownVectorBar;" * "\x2959"+ ,"LeftFloor;" * "\x230A"+ ,"leftharpoondown;" * "\x21BD"+ ,"leftharpoonup;" * "\x21BC"+ ,"leftleftarrows;" * "\x21C7"+ ,"LeftRightArrow;" * "\x2194"+ ,"leftrightarrow;" * "\x2194"+ ,"Leftrightarrow;" * "\x21D4"+ ,"leftrightarrows;" * "\x21C6"+ ,"leftrightharpoons;" * "\x21CB"+ ,"leftrightsquigarrow;" * "\x21AD"+ ,"LeftRightVector;" * "\x294E"+ ,"LeftTee;" * "\x22A3"+ ,"LeftTeeArrow;" * "\x21A4"+ ,"LeftTeeVector;" * "\x295A"+ ,"leftthreetimes;" * "\x22CB"+ ,"LeftTriangle;" * "\x22B2"+ ,"LeftTriangleBar;" * "\x29CF"+ ,"LeftTriangleEqual;" * "\x22B4"+ ,"LeftUpDownVector;" * "\x2951"+ ,"LeftUpTeeVector;" * "\x2960"+ ,"LeftUpVector;" * "\x21BF"+ ,"LeftUpVectorBar;" * "\x2958"+ ,"LeftVector;" * "\x21BC"+ ,"LeftVectorBar;" * "\x2952"+ ,"leg;" * "\x22DA"+ ,"lEg;" * "\x2A8B"+ ,"leq;" * "\x2264"+ ,"leqq;" * "\x2266"+ ,"leqslant;" * "\x2A7D"+ ,"les;" * "\x2A7D"+ ,"lescc;" * "\x2AA8"+ ,"lesdot;" * "\x2A7F"+ ,"lesdoto;" * "\x2A81"+ ,"lesdotor;" * "\x2A83"+ ,"lesg;" * "\x22DA\xFE00"+ ,"lesges;" * "\x2A93"+ ,"lessapprox;" * "\x2A85"+ ,"lessdot;" * "\x22D6"+ ,"lesseqgtr;" * "\x22DA"+ ,"lesseqqgtr;" * "\x2A8B"+ ,"LessEqualGreater;" * "\x22DA"+ ,"LessFullEqual;" * "\x2266"+ ,"LessGreater;" * "\x2276"+ ,"lessgtr;" * "\x2276"+ ,"LessLess;" * "\x2AA1"+ ,"lesssim;" * "\x2272"+ ,"LessSlantEqual;" * "\x2A7D"+ ,"LessTilde;" * "\x2272"+ ,"lfisht;" * "\x297C"+ ,"lfloor;" * "\x230A"+ ,"Lfr;" * "\x1D50F"+ ,"lfr;" * "\x1D529"+ ,"lg;" * "\x2276"+ ,"lgE;" * "\x2A91"+ ,"lHar;" * "\x2962"+ ,"lhard;" * "\x21BD"+ ,"lharu;" * "\x21BC"+ ,"lharul;" * "\x296A"+ ,"lhblk;" * "\x2584"+ ,"LJcy;" * "\x0409"+ ,"ljcy;" * "\x0459"+ ,"ll;" * "\x226A"+ ,"Ll;" * "\x22D8"+ ,"llarr;" * "\x21C7"+ ,"llcorner;" * "\x231E"+ ,"Lleftarrow;" * "\x21DA"+ ,"llhard;" * "\x296B"+ ,"lltri;" * "\x25FA"+ ,"Lmidot;" * "\x013F"+ ,"lmidot;" * "\x0140"+ ,"lmoust;" * "\x23B0"+ ,"lmoustache;" * "\x23B0"+ ,"lnap;" * "\x2A89"+ ,"lnapprox;" * "\x2A89"+ ,"lnE;" * "\x2268"+ ,"lne;" * "\x2A87"+ ,"lneq;" * "\x2A87"+ ,"lneqq;" * "\x2268"+ ,"lnsim;" * "\x22E6"+ ,"loang;" * "\x27EC"+ ,"loarr;" * "\x21FD"+ ,"lobrk;" * "\x27E6"+ ,"LongLeftArrow;" * "\x27F5"+ ,"longleftarrow;" * "\x27F5"+ ,"Longleftarrow;" * "\x27F8"+ ,"LongLeftRightArrow;" * "\x27F7"+ ,"longleftrightarrow;" * "\x27F7"+ ,"Longleftrightarrow;" * "\x27FA"+ ,"longmapsto;" * "\x27FC"+ ,"LongRightArrow;" * "\x27F6"+ ,"longrightarrow;" * "\x27F6"+ ,"Longrightarrow;" * "\x27F9"+ ,"looparrowleft;" * "\x21AB"+ ,"looparrowright;" * "\x21AC"+ ,"lopar;" * "\x2985"+ ,"Lopf;" * "\x1D543"+ ,"lopf;" * "\x1D55D"+ ,"loplus;" * "\x2A2D"+ ,"lotimes;" * "\x2A34"+ ,"lowast;" * "\x2217"+ ,"lowbar;" * "\x005F"+ ,"LowerLeftArrow;" * "\x2199"+ ,"LowerRightArrow;" * "\x2198"+ ,"loz;" * "\x25CA"+ ,"lozenge;" * "\x25CA"+ ,"lozf;" * "\x29EB"+ ,"lpar;" * "\x0028"+ ,"lparlt;" * "\x2993"+ ,"lrarr;" * "\x21C6"+ ,"lrcorner;" * "\x231F"+ ,"lrhar;" * "\x21CB"+ ,"lrhard;" * "\x296D"+ ,"lrm;" * "\x200E"+ ,"lrtri;" * "\x22BF"+ ,"lsaquo;" * "\x2039"+ ,"Lscr;" * "\x2112"+ ,"lscr;" * "\x1D4C1"+ ,"Lsh;" * "\x21B0"+ ,"lsh;" * "\x21B0"+ ,"lsim;" * "\x2272"+ ,"lsime;" * "\x2A8D"+ ,"lsimg;" * "\x2A8F"+ ,"lsqb;" * "\x005B"+ ,"lsquo;" * "\x2018"+ ,"lsquor;" * "\x201A"+ ,"Lstrok;" * "\x0141"+ ,"lstrok;" * "\x0142"+ ,"LT" * "\x003C"+ ,"lt" * "\x003C"+ ,"LT;" * "\x003C"+ ,"lt;" * "\x003C"+ ,"Lt;" * "\x226A"+ ,"ltcc;" * "\x2AA6"+ ,"ltcir;" * "\x2A79"+ ,"ltdot;" * "\x22D6"+ ,"lthree;" * "\x22CB"+ ,"ltimes;" * "\x22C9"+ ,"ltlarr;" * "\x2976"+ ,"ltquest;" * "\x2A7B"+ ,"ltri;" * "\x25C3"+ ,"ltrie;" * "\x22B4"+ ,"ltrif;" * "\x25C2"+ ,"ltrPar;" * "\x2996"+ ,"lurdshar;" * "\x294A"+ ,"luruhar;" * "\x2966"+ ,"lvertneqq;" * "\x2268\xFE00"+ ,"lvnE;" * "\x2268\xFE00"+ ,"macr" * "\x00AF"+ ,"macr;" * "\x00AF"+ ,"male;" * "\x2642"+ ,"malt;" * "\x2720"+ ,"maltese;" * "\x2720"+ ,"map;" * "\x21A6"+ ,"Map;" * "\x2905"+ ,"mapsto;" * "\x21A6"+ ,"mapstodown;" * "\x21A7"+ ,"mapstoleft;" * "\x21A4"+ ,"mapstoup;" * "\x21A5"+ ,"marker;" * "\x25AE"+ ,"mcomma;" * "\x2A29"+ ,"Mcy;" * "\x041C"+ ,"mcy;" * "\x043C"+ ,"mdash;" * "\x2014"+ ,"mDDot;" * "\x223A"+ ,"measuredangle;" * "\x2221"+ ,"MediumSpace;" * "\x205F"+ ,"Mellintrf;" * "\x2133"+ ,"Mfr;" * "\x1D510"+ ,"mfr;" * "\x1D52A"+ ,"mho;" * "\x2127"+ ,"micro" * "\x00B5"+ ,"micro;" * "\x00B5"+ ,"mid;" * "\x2223"+ ,"midast;" * "\x002A"+ ,"midcir;" * "\x2AF0"+ ,"middot" * "\x00B7"+ ,"middot;" * "\x00B7"+ ,"minus;" * "\x2212"+ ,"minusb;" * "\x229F"+ ,"minusd;" * "\x2238"+ ,"minusdu;" * "\x2A2A"+ ,"MinusPlus;" * "\x2213"+ ,"mlcp;" * "\x2ADB"+ ,"mldr;" * "\x2026"+ ,"mnplus;" * "\x2213"+ ,"models;" * "\x22A7"+ ,"Mopf;" * "\x1D544"+ ,"mopf;" * "\x1D55E"+ ,"mp;" * "\x2213"+ ,"Mscr;" * "\x2133"+ ,"mscr;" * "\x1D4C2"+ ,"mstpos;" * "\x223E"+ ,"Mu;" * "\x039C"+ ,"mu;" * "\x03BC"+ ,"multimap;" * "\x22B8"+ ,"mumap;" * "\x22B8"+ ,"nabla;" * "\x2207"+ ,"Nacute;" * "\x0143"+ ,"nacute;" * "\x0144"+ ,"nang;" * "\x2220\x20D2"+ ,"nap;" * "\x2249"+ ,"napE;" * "\x2A70\x0338"+ ,"napid;" * "\x224B\x0338"+ ,"napos;" * "\x0149"+ ,"napprox;" * "\x2249"+ ,"natur;" * "\x266E"+ ,"natural;" * "\x266E"+ ,"naturals;" * "\x2115"+ ,"nbsp" * "\x00A0"+ ,"nbsp;" * "\x00A0"+ ,"nbump;" * "\x224E\x0338"+ ,"nbumpe;" * "\x224F\x0338"+ ,"ncap;" * "\x2A43"+ ,"Ncaron;" * "\x0147"+ ,"ncaron;" * "\x0148"+ ,"Ncedil;" * "\x0145"+ ,"ncedil;" * "\x0146"+ ,"ncong;" * "\x2247"+ ,"ncongdot;" * "\x2A6D\x0338"+ ,"ncup;" * "\x2A42"+ ,"Ncy;" * "\x041D"+ ,"ncy;" * "\x043D"+ ,"ndash;" * "\x2013"+ ,"ne;" * "\x2260"+ ,"nearhk;" * "\x2924"+ ,"nearr;" * "\x2197"+ ,"neArr;" * "\x21D7"+ ,"nearrow;" * "\x2197"+ ,"nedot;" * "\x2250\x0338"+ ,"NegativeMediumSpace;" * "\x200B"+ ,"NegativeThickSpace;" * "\x200B"+ ,"NegativeThinSpace;" * "\x200B"+ ,"NegativeVeryThinSpace;" * "\x200B"+ ,"nequiv;" * "\x2262"+ ,"nesear;" * "\x2928"+ ,"nesim;" * "\x2242\x0338"+ ,"NestedGreaterGreater;" * "\x226B"+ ,"NestedLessLess;" * "\x226A"+ ,"NewLine;" * "\x000A"+ ,"nexist;" * "\x2204"+ ,"nexists;" * "\x2204"+ ,"Nfr;" * "\x1D511"+ ,"nfr;" * "\x1D52B"+ ,"ngE;" * "\x2267\x0338"+ ,"nge;" * "\x2271"+ ,"ngeq;" * "\x2271"+ ,"ngeqq;" * "\x2267\x0338"+ ,"ngeqslant;" * "\x2A7E\x0338"+ ,"nges;" * "\x2A7E\x0338"+ ,"nGg;" * "\x22D9\x0338"+ ,"ngsim;" * "\x2275"+ ,"nGt;" * "\x226B\x20D2"+ ,"ngt;" * "\x226F"+ ,"ngtr;" * "\x226F"+ ,"nGtv;" * "\x226B\x0338"+ ,"nharr;" * "\x21AE"+ ,"nhArr;" * "\x21CE"+ ,"nhpar;" * "\x2AF2"+ ,"ni;" * "\x220B"+ ,"nis;" * "\x22FC"+ ,"nisd;" * "\x22FA"+ ,"niv;" * "\x220B"+ ,"NJcy;" * "\x040A"+ ,"njcy;" * "\x045A"+ ,"nlarr;" * "\x219A"+ ,"nlArr;" * "\x21CD"+ ,"nldr;" * "\x2025"+ ,"nlE;" * "\x2266\x0338"+ ,"nle;" * "\x2270"+ ,"nleftarrow;" * "\x219A"+ ,"nLeftarrow;" * "\x21CD"+ ,"nleftrightarrow;" * "\x21AE"+ ,"nLeftrightarrow;" * "\x21CE"+ ,"nleq;" * "\x2270"+ ,"nleqq;" * "\x2266\x0338"+ ,"nleqslant;" * "\x2A7D\x0338"+ ,"nles;" * "\x2A7D\x0338"+ ,"nless;" * "\x226E"+ ,"nLl;" * "\x22D8\x0338"+ ,"nlsim;" * "\x2274"+ ,"nLt;" * "\x226A\x20D2"+ ,"nlt;" * "\x226E"+ ,"nltri;" * "\x22EA"+ ,"nltrie;" * "\x22EC"+ ,"nLtv;" * "\x226A\x0338"+ ,"nmid;" * "\x2224"+ ,"NoBreak;" * "\x2060"+ ,"NonBreakingSpace;" * "\x00A0"+ ,"Nopf;" * "\x2115"+ ,"nopf;" * "\x1D55F"+ ,"not" * "\x00AC"+ ,"not;" * "\x00AC"+ ,"Not;" * "\x2AEC"+ ,"NotCongruent;" * "\x2262"+ ,"NotCupCap;" * "\x226D"+ ,"NotDoubleVerticalBar;" * "\x2226"+ ,"NotElement;" * "\x2209"+ ,"NotEqual;" * "\x2260"+ ,"NotEqualTilde;" * "\x2242\x0338"+ ,"NotExists;" * "\x2204"+ ,"NotGreater;" * "\x226F"+ ,"NotGreaterEqual;" * "\x2271"+ ,"NotGreaterFullEqual;" * "\x2267\x0338"+ ,"NotGreaterGreater;" * "\x226B\x0338"+ ,"NotGreaterLess;" * "\x2279"+ ,"NotGreaterSlantEqual;" * "\x2A7E\x0338"+ ,"NotGreaterTilde;" * "\x2275"+ ,"NotHumpDownHump;" * "\x224E\x0338"+ ,"NotHumpEqual;" * "\x224F\x0338"+ ,"notin;" * "\x2209"+ ,"notindot;" * "\x22F5\x0338"+ ,"notinE;" * "\x22F9\x0338"+ ,"notinva;" * "\x2209"+ ,"notinvb;" * "\x22F7"+ ,"notinvc;" * "\x22F6"+ ,"NotLeftTriangle;" * "\x22EA"+ ,"NotLeftTriangleBar;" * "\x29CF\x0338"+ ,"NotLeftTriangleEqual;" * "\x22EC"+ ,"NotLess;" * "\x226E"+ ,"NotLessEqual;" * "\x2270"+ ,"NotLessGreater;" * "\x2278"+ ,"NotLessLess;" * "\x226A\x0338"+ ,"NotLessSlantEqual;" * "\x2A7D\x0338"+ ,"NotLessTilde;" * "\x2274"+ ,"NotNestedGreaterGreater;" * "\x2AA2\x0338"+ ,"NotNestedLessLess;" * "\x2AA1\x0338"+ ,"notni;" * "\x220C"+ ,"notniva;" * "\x220C"+ ,"notnivb;" * "\x22FE"+ ,"notnivc;" * "\x22FD"+ ,"NotPrecedes;" * "\x2280"+ ,"NotPrecedesEqual;" * "\x2AAF\x0338"+ ,"NotPrecedesSlantEqual;" * "\x22E0"+ ,"NotReverseElement;" * "\x220C"+ ,"NotRightTriangle;" * "\x22EB"+ ,"NotRightTriangleBar;" * "\x29D0\x0338"+ ,"NotRightTriangleEqual;" * "\x22ED"+ ,"NotSquareSubset;" * "\x228F\x0338"+ ,"NotSquareSubsetEqual;" * "\x22E2"+ ,"NotSquareSuperset;" * "\x2290\x0338"+ ,"NotSquareSupersetEqual;" * "\x22E3"+ ,"NotSubset;" * "\x2282\x20D2"+ ,"NotSubsetEqual;" * "\x2288"+ ,"NotSucceeds;" * "\x2281"+ ,"NotSucceedsEqual;" * "\x2AB0\x0338"+ ,"NotSucceedsSlantEqual;" * "\x22E1"+ ,"NotSucceedsTilde;" * "\x227F\x0338"+ ,"NotSuperset;" * "\x2283\x20D2"+ ,"NotSupersetEqual;" * "\x2289"+ ,"NotTilde;" * "\x2241"+ ,"NotTildeEqual;" * "\x2244"+ ,"NotTildeFullEqual;" * "\x2247"+ ,"NotTildeTilde;" * "\x2249"+ ,"NotVerticalBar;" * "\x2224"+ ,"npar;" * "\x2226"+ ,"nparallel;" * "\x2226"+ ,"nparsl;" * "\x2AFD\x20E5"+ ,"npart;" * "\x2202\x0338"+ ,"npolint;" * "\x2A14"+ ,"npr;" * "\x2280"+ ,"nprcue;" * "\x22E0"+ ,"npre;" * "\x2AAF\x0338"+ ,"nprec;" * "\x2280"+ ,"npreceq;" * "\x2AAF\x0338"+ ,"nrarr;" * "\x219B"+ ,"nrArr;" * "\x21CF"+ ,"nrarrc;" * "\x2933\x0338"+ ,"nrarrw;" * "\x219D\x0338"+ ,"nrightarrow;" * "\x219B"+ ,"nRightarrow;" * "\x21CF"+ ,"nrtri;" * "\x22EB"+ ,"nrtrie;" * "\x22ED"+ ,"nsc;" * "\x2281"+ ,"nsccue;" * "\x22E1"+ ,"nsce;" * "\x2AB0\x0338"+ ,"Nscr;" * "\x1D4A9"+ ,"nscr;" * "\x1D4C3"+ ,"nshortmid;" * "\x2224"+ ,"nshortparallel;" * "\x2226"+ ,"nsim;" * "\x2241"+ ,"nsime;" * "\x2244"+ ,"nsimeq;" * "\x2244"+ ,"nsmid;" * "\x2224"+ ,"nspar;" * "\x2226"+ ,"nsqsube;" * "\x22E2"+ ,"nsqsupe;" * "\x22E3"+ ,"nsub;" * "\x2284"+ ,"nsube;" * "\x2288"+ ,"nsubE;" * "\x2AC5\x0338"+ ,"nsubset;" * "\x2282\x20D2"+ ,"nsubseteq;" * "\x2288"+ ,"nsubseteqq;" * "\x2AC5\x0338"+ ,"nsucc;" * "\x2281"+ ,"nsucceq;" * "\x2AB0\x0338"+ ,"nsup;" * "\x2285"+ ,"nsupe;" * "\x2289"+ ,"nsupE;" * "\x2AC6\x0338"+ ,"nsupset;" * "\x2283\x20D2"+ ,"nsupseteq;" * "\x2289"+ ,"nsupseteqq;" * "\x2AC6\x0338"+ ,"ntgl;" * "\x2279"+ ,"Ntilde" * "\x00D1"+ ,"ntilde" * "\x00F1"+ ,"Ntilde;" * "\x00D1"+ ,"ntilde;" * "\x00F1"+ ,"ntlg;" * "\x2278"+ ,"ntriangleleft;" * "\x22EA"+ ,"ntrianglelefteq;" * "\x22EC"+ ,"ntriangleright;" * "\x22EB"+ ,"ntrianglerighteq;" * "\x22ED"+ ,"Nu;" * "\x039D"+ ,"nu;" * "\x03BD"+ ,"num;" * "\x0023"+ ,"numero;" * "\x2116"+ ,"numsp;" * "\x2007"+ ,"nvap;" * "\x224D\x20D2"+ ,"nvdash;" * "\x22AC"+ ,"nvDash;" * "\x22AD"+ ,"nVdash;" * "\x22AE"+ ,"nVDash;" * "\x22AF"+ ,"nvge;" * "\x2265\x20D2"+ ,"nvgt;" * "\x003E\x20D2"+ ,"nvHarr;" * "\x2904"+ ,"nvinfin;" * "\x29DE"+ ,"nvlArr;" * "\x2902"+ ,"nvle;" * "\x2264\x20D2"+ ,"nvlt;" * "\x003C\x20D2"+ ,"nvltrie;" * "\x22B4\x20D2"+ ,"nvrArr;" * "\x2903"+ ,"nvrtrie;" * "\x22B5\x20D2"+ ,"nvsim;" * "\x223C\x20D2"+ ,"nwarhk;" * "\x2923"+ ,"nwarr;" * "\x2196"+ ,"nwArr;" * "\x21D6"+ ,"nwarrow;" * "\x2196"+ ,"nwnear;" * "\x2927"+ ,"Oacute" * "\x00D3"+ ,"oacute" * "\x00F3"+ ,"Oacute;" * "\x00D3"+ ,"oacute;" * "\x00F3"+ ,"oast;" * "\x229B"+ ,"ocir;" * "\x229A"+ ,"Ocirc" * "\x00D4"+ ,"ocirc" * "\x00F4"+ ,"Ocirc;" * "\x00D4"+ ,"ocirc;" * "\x00F4"+ ,"Ocy;" * "\x041E"+ ,"ocy;" * "\x043E"+ ,"odash;" * "\x229D"+ ,"Odblac;" * "\x0150"+ ,"odblac;" * "\x0151"+ ,"odiv;" * "\x2A38"+ ,"odot;" * "\x2299"+ ,"odsold;" * "\x29BC"+ ,"OElig;" * "\x0152"+ ,"oelig;" * "\x0153"+ ,"ofcir;" * "\x29BF"+ ,"Ofr;" * "\x1D512"+ ,"ofr;" * "\x1D52C"+ ,"ogon;" * "\x02DB"+ ,"Ograve" * "\x00D2"+ ,"ograve" * "\x00F2"+ ,"Ograve;" * "\x00D2"+ ,"ograve;" * "\x00F2"+ ,"ogt;" * "\x29C1"+ ,"ohbar;" * "\x29B5"+ ,"ohm;" * "\x03A9"+ ,"oint;" * "\x222E"+ ,"olarr;" * "\x21BA"+ ,"olcir;" * "\x29BE"+ ,"olcross;" * "\x29BB"+ ,"oline;" * "\x203E"+ ,"olt;" * "\x29C0"+ ,"Omacr;" * "\x014C"+ ,"omacr;" * "\x014D"+ ,"Omega;" * "\x03A9"+ ,"omega;" * "\x03C9"+ ,"Omicron;" * "\x039F"+ ,"omicron;" * "\x03BF"+ ,"omid;" * "\x29B6"+ ,"ominus;" * "\x2296"+ ,"Oopf;" * "\x1D546"+ ,"oopf;" * "\x1D560"+ ,"opar;" * "\x29B7"+ ,"OpenCurlyDoubleQuote;" * "\x201C"+ ,"OpenCurlyQuote;" * "\x2018"+ ,"operp;" * "\x29B9"+ ,"oplus;" * "\x2295"+ ,"or;" * "\x2228"+ ,"Or;" * "\x2A54"+ ,"orarr;" * "\x21BB"+ ,"ord;" * "\x2A5D"+ ,"order;" * "\x2134"+ ,"orderof;" * "\x2134"+ ,"ordf" * "\x00AA"+ ,"ordf;" * "\x00AA"+ ,"ordm" * "\x00BA"+ ,"ordm;" * "\x00BA"+ ,"origof;" * "\x22B6"+ ,"oror;" * "\x2A56"+ ,"orslope;" * "\x2A57"+ ,"orv;" * "\x2A5B"+ ,"oS;" * "\x24C8"+ ,"oscr;" * "\x2134"+ ,"Oscr;" * "\x1D4AA"+ ,"Oslash" * "\x00D8"+ ,"oslash" * "\x00F8"+ ,"Oslash;" * "\x00D8"+ ,"oslash;" * "\x00F8"+ ,"osol;" * "\x2298"+ ,"Otilde" * "\x00D5"+ ,"otilde" * "\x00F5"+ ,"Otilde;" * "\x00D5"+ ,"otilde;" * "\x00F5"+ ,"otimes;" * "\x2297"+ ,"Otimes;" * "\x2A37"+ ,"otimesas;" * "\x2A36"+ ,"Ouml" * "\x00D6"+ ,"ouml" * "\x00F6"+ ,"Ouml;" * "\x00D6"+ ,"ouml;" * "\x00F6"+ ,"ovbar;" * "\x233D"+ ,"OverBar;" * "\x203E"+ ,"OverBrace;" * "\x23DE"+ ,"OverBracket;" * "\x23B4"+ ,"OverParenthesis;" * "\x23DC"+ ,"par;" * "\x2225"+ ,"para" * "\x00B6"+ ,"para;" * "\x00B6"+ ,"parallel;" * "\x2225"+ ,"parsim;" * "\x2AF3"+ ,"parsl;" * "\x2AFD"+ ,"part;" * "\x2202"+ ,"PartialD;" * "\x2202"+ ,"Pcy;" * "\x041F"+ ,"pcy;" * "\x043F"+ ,"percnt;" * "\x0025"+ ,"period;" * "\x002E"+ ,"permil;" * "\x2030"+ ,"perp;" * "\x22A5"+ ,"pertenk;" * "\x2031"+ ,"Pfr;" * "\x1D513"+ ,"pfr;" * "\x1D52D"+ ,"Phi;" * "\x03A6"+ ,"phi;" * "\x03C6"+ ,"phiv;" * "\x03D5"+ ,"phmmat;" * "\x2133"+ ,"phone;" * "\x260E"+ ,"Pi;" * "\x03A0"+ ,"pi;" * "\x03C0"+ ,"pitchfork;" * "\x22D4"+ ,"piv;" * "\x03D6"+ ,"planck;" * "\x210F"+ ,"planckh;" * "\x210E"+ ,"plankv;" * "\x210F"+ ,"plus;" * "\x002B"+ ,"plusacir;" * "\x2A23"+ ,"plusb;" * "\x229E"+ ,"pluscir;" * "\x2A22"+ ,"plusdo;" * "\x2214"+ ,"plusdu;" * "\x2A25"+ ,"pluse;" * "\x2A72"+ ,"PlusMinus;" * "\x00B1"+ ,"plusmn" * "\x00B1"+ ,"plusmn;" * "\x00B1"+ ,"plussim;" * "\x2A26"+ ,"plustwo;" * "\x2A27"+ ,"pm;" * "\x00B1"+ ,"Poincareplane;" * "\x210C"+ ,"pointint;" * "\x2A15"+ ,"Popf;" * "\x2119"+ ,"popf;" * "\x1D561"+ ,"pound" * "\x00A3"+ ,"pound;" * "\x00A3"+ ,"pr;" * "\x227A"+ ,"Pr;" * "\x2ABB"+ ,"prap;" * "\x2AB7"+ ,"prcue;" * "\x227C"+ ,"pre;" * "\x2AAF"+ ,"prE;" * "\x2AB3"+ ,"prec;" * "\x227A"+ ,"precapprox;" * "\x2AB7"+ ,"preccurlyeq;" * "\x227C"+ ,"Precedes;" * "\x227A"+ ,"PrecedesEqual;" * "\x2AAF"+ ,"PrecedesSlantEqual;" * "\x227C"+ ,"PrecedesTilde;" * "\x227E"+ ,"preceq;" * "\x2AAF"+ ,"precnapprox;" * "\x2AB9"+ ,"precneqq;" * "\x2AB5"+ ,"precnsim;" * "\x22E8"+ ,"precsim;" * "\x227E"+ ,"prime;" * "\x2032"+ ,"Prime;" * "\x2033"+ ,"primes;" * "\x2119"+ ,"prnap;" * "\x2AB9"+ ,"prnE;" * "\x2AB5"+ ,"prnsim;" * "\x22E8"+ ,"prod;" * "\x220F"+ ,"Product;" * "\x220F"+ ,"profalar;" * "\x232E"+ ,"profline;" * "\x2312"+ ,"profsurf;" * "\x2313"+ ,"prop;" * "\x221D"+ ,"Proportion;" * "\x2237"+ ,"Proportional;" * "\x221D"+ ,"propto;" * "\x221D"+ ,"prsim;" * "\x227E"+ ,"prurel;" * "\x22B0"+ ,"Pscr;" * "\x1D4AB"+ ,"pscr;" * "\x1D4C5"+ ,"Psi;" * "\x03A8"+ ,"psi;" * "\x03C8"+ ,"puncsp;" * "\x2008"+ ,"Qfr;" * "\x1D514"+ ,"qfr;" * "\x1D52E"+ ,"qint;" * "\x2A0C"+ ,"Qopf;" * "\x211A"+ ,"qopf;" * "\x1D562"+ ,"qprime;" * "\x2057"+ ,"Qscr;" * "\x1D4AC"+ ,"qscr;" * "\x1D4C6"+ ,"quaternions;" * "\x210D"+ ,"quatint;" * "\x2A16"+ ,"quest;" * "\x003F"+ ,"questeq;" * "\x225F"+ ,"QUOT" * "\x0022"+ ,"quot" * "\x0022"+ ,"QUOT;" * "\x0022"+ ,"quot;" * "\x0022"+ ,"rAarr;" * "\x21DB"+ ,"race;" * "\x223D\x0331"+ ,"Racute;" * "\x0154"+ ,"racute;" * "\x0155"+ ,"radic;" * "\x221A"+ ,"raemptyv;" * "\x29B3"+ ,"rang;" * "\x27E9"+ ,"Rang;" * "\x27EB"+ ,"rangd;" * "\x2992"+ ,"range;" * "\x29A5"+ ,"rangle;" * "\x27E9"+ ,"raquo" * "\x00BB"+ ,"raquo;" * "\x00BB"+ ,"rarr;" * "\x2192"+ ,"Rarr;" * "\x21A0"+ ,"rArr;" * "\x21D2"+ ,"rarrap;" * "\x2975"+ ,"rarrb;" * "\x21E5"+ ,"rarrbfs;" * "\x2920"+ ,"rarrc;" * "\x2933"+ ,"rarrfs;" * "\x291E"+ ,"rarrhk;" * "\x21AA"+ ,"rarrlp;" * "\x21AC"+ ,"rarrpl;" * "\x2945"+ ,"rarrsim;" * "\x2974"+ ,"rarrtl;" * "\x21A3"+ ,"Rarrtl;" * "\x2916"+ ,"rarrw;" * "\x219D"+ ,"ratail;" * "\x291A"+ ,"rAtail;" * "\x291C"+ ,"ratio;" * "\x2236"+ ,"rationals;" * "\x211A"+ ,"rbarr;" * "\x290D"+ ,"rBarr;" * "\x290F"+ ,"RBarr;" * "\x2910"+ ,"rbbrk;" * "\x2773"+ ,"rbrace;" * "\x007D"+ ,"rbrack;" * "\x005D"+ ,"rbrke;" * "\x298C"+ ,"rbrksld;" * "\x298E"+ ,"rbrkslu;" * "\x2990"+ ,"Rcaron;" * "\x0158"+ ,"rcaron;" * "\x0159"+ ,"Rcedil;" * "\x0156"+ ,"rcedil;" * "\x0157"+ ,"rceil;" * "\x2309"+ ,"rcub;" * "\x007D"+ ,"Rcy;" * "\x0420"+ ,"rcy;" * "\x0440"+ ,"rdca;" * "\x2937"+ ,"rdldhar;" * "\x2969"+ ,"rdquo;" * "\x201D"+ ,"rdquor;" * "\x201D"+ ,"rdsh;" * "\x21B3"+ ,"Re;" * "\x211C"+ ,"real;" * "\x211C"+ ,"realine;" * "\x211B"+ ,"realpart;" * "\x211C"+ ,"reals;" * "\x211D"+ ,"rect;" * "\x25AD"+ ,"REG" * "\x00AE"+ ,"reg" * "\x00AE"+ ,"REG;" * "\x00AE"+ ,"reg;" * "\x00AE"+ ,"ReverseElement;" * "\x220B"+ ,"ReverseEquilibrium;" * "\x21CB"+ ,"ReverseUpEquilibrium;" * "\x296F"+ ,"rfisht;" * "\x297D"+ ,"rfloor;" * "\x230B"+ ,"Rfr;" * "\x211C"+ ,"rfr;" * "\x1D52F"+ ,"rHar;" * "\x2964"+ ,"rhard;" * "\x21C1"+ ,"rharu;" * "\x21C0"+ ,"rharul;" * "\x296C"+ ,"Rho;" * "\x03A1"+ ,"rho;" * "\x03C1"+ ,"rhov;" * "\x03F1"+ ,"RightAngleBracket;" * "\x27E9"+ ,"RightArrow;" * "\x2192"+ ,"rightarrow;" * "\x2192"+ ,"Rightarrow;" * "\x21D2"+ ,"RightArrowBar;" * "\x21E5"+ ,"RightArrowLeftArrow;" * "\x21C4"+ ,"rightarrowtail;" * "\x21A3"+ ,"RightCeiling;" * "\x2309"+ ,"RightDoubleBracket;" * "\x27E7"+ ,"RightDownTeeVector;" * "\x295D"+ ,"RightDownVector;" * "\x21C2"+ ,"RightDownVectorBar;" * "\x2955"+ ,"RightFloor;" * "\x230B"+ ,"rightharpoondown;" * "\x21C1"+ ,"rightharpoonup;" * "\x21C0"+ ,"rightleftarrows;" * "\x21C4"+ ,"rightleftharpoons;" * "\x21CC"+ ,"rightrightarrows;" * "\x21C9"+ ,"rightsquigarrow;" * "\x219D"+ ,"RightTee;" * "\x22A2"+ ,"RightTeeArrow;" * "\x21A6"+ ,"RightTeeVector;" * "\x295B"+ ,"rightthreetimes;" * "\x22CC"+ ,"RightTriangle;" * "\x22B3"+ ,"RightTriangleBar;" * "\x29D0"+ ,"RightTriangleEqual;" * "\x22B5"+ ,"RightUpDownVector;" * "\x294F"+ ,"RightUpTeeVector;" * "\x295C"+ ,"RightUpVector;" * "\x21BE"+ ,"RightUpVectorBar;" * "\x2954"+ ,"RightVector;" * "\x21C0"+ ,"RightVectorBar;" * "\x2953"+ ,"ring;" * "\x02DA"+ ,"risingdotseq;" * "\x2253"+ ,"rlarr;" * "\x21C4"+ ,"rlhar;" * "\x21CC"+ ,"rlm;" * "\x200F"+ ,"rmoust;" * "\x23B1"+ ,"rmoustache;" * "\x23B1"+ ,"rnmid;" * "\x2AEE"+ ,"roang;" * "\x27ED"+ ,"roarr;" * "\x21FE"+ ,"robrk;" * "\x27E7"+ ,"ropar;" * "\x2986"+ ,"Ropf;" * "\x211D"+ ,"ropf;" * "\x1D563"+ ,"roplus;" * "\x2A2E"+ ,"rotimes;" * "\x2A35"+ ,"RoundImplies;" * "\x2970"+ ,"rpar;" * "\x0029"+ ,"rpargt;" * "\x2994"+ ,"rppolint;" * "\x2A12"+ ,"rrarr;" * "\x21C9"+ ,"Rrightarrow;" * "\x21DB"+ ,"rsaquo;" * "\x203A"+ ,"Rscr;" * "\x211B"+ ,"rscr;" * "\x1D4C7"+ ,"Rsh;" * "\x21B1"+ ,"rsh;" * "\x21B1"+ ,"rsqb;" * "\x005D"+ ,"rsquo;" * "\x2019"+ ,"rsquor;" * "\x2019"+ ,"rthree;" * "\x22CC"+ ,"rtimes;" * "\x22CA"+ ,"rtri;" * "\x25B9"+ ,"rtrie;" * "\x22B5"+ ,"rtrif;" * "\x25B8"+ ,"rtriltri;" * "\x29CE"+ ,"RuleDelayed;" * "\x29F4"+ ,"ruluhar;" * "\x2968"+ ,"rx;" * "\x211E"+ ,"Sacute;" * "\x015A"+ ,"sacute;" * "\x015B"+ ,"sbquo;" * "\x201A"+ ,"sc;" * "\x227B"+ ,"Sc;" * "\x2ABC"+ ,"scap;" * "\x2AB8"+ ,"Scaron;" * "\x0160"+ ,"scaron;" * "\x0161"+ ,"sccue;" * "\x227D"+ ,"sce;" * "\x2AB0"+ ,"scE;" * "\x2AB4"+ ,"Scedil;" * "\x015E"+ ,"scedil;" * "\x015F"+ ,"Scirc;" * "\x015C"+ ,"scirc;" * "\x015D"+ ,"scnap;" * "\x2ABA"+ ,"scnE;" * "\x2AB6"+ ,"scnsim;" * "\x22E9"+ ,"scpolint;" * "\x2A13"+ ,"scsim;" * "\x227F"+ ,"Scy;" * "\x0421"+ ,"scy;" * "\x0441"+ ,"sdot;" * "\x22C5"+ ,"sdotb;" * "\x22A1"+ ,"sdote;" * "\x2A66"+ ,"searhk;" * "\x2925"+ ,"searr;" * "\x2198"+ ,"seArr;" * "\x21D8"+ ,"searrow;" * "\x2198"+ ,"sect" * "\x00A7"+ ,"sect;" * "\x00A7"+ ,"semi;" * "\x003B"+ ,"seswar;" * "\x2929"+ ,"setminus;" * "\x2216"+ ,"setmn;" * "\x2216"+ ,"sext;" * "\x2736"+ ,"Sfr;" * "\x1D516"+ ,"sfr;" * "\x1D530"+ ,"sfrown;" * "\x2322"+ ,"sharp;" * "\x266F"+ ,"SHCHcy;" * "\x0429"+ ,"shchcy;" * "\x0449"+ ,"SHcy;" * "\x0428"+ ,"shcy;" * "\x0448"+ ,"ShortDownArrow;" * "\x2193"+ ,"ShortLeftArrow;" * "\x2190"+ ,"shortmid;" * "\x2223"+ ,"shortparallel;" * "\x2225"+ ,"ShortRightArrow;" * "\x2192"+ ,"ShortUpArrow;" * "\x2191"+ ,"shy" * "\x00AD"+ ,"shy;" * "\x00AD"+ ,"Sigma;" * "\x03A3"+ ,"sigma;" * "\x03C3"+ ,"sigmaf;" * "\x03C2"+ ,"sigmav;" * "\x03C2"+ ,"sim;" * "\x223C"+ ,"simdot;" * "\x2A6A"+ ,"sime;" * "\x2243"+ ,"simeq;" * "\x2243"+ ,"simg;" * "\x2A9E"+ ,"simgE;" * "\x2AA0"+ ,"siml;" * "\x2A9D"+ ,"simlE;" * "\x2A9F"+ ,"simne;" * "\x2246"+ ,"simplus;" * "\x2A24"+ ,"simrarr;" * "\x2972"+ ,"slarr;" * "\x2190"+ ,"SmallCircle;" * "\x2218"+ ,"smallsetminus;" * "\x2216"+ ,"smashp;" * "\x2A33"+ ,"smeparsl;" * "\x29E4"+ ,"smid;" * "\x2223"+ ,"smile;" * "\x2323"+ ,"smt;" * "\x2AAA"+ ,"smte;" * "\x2AAC"+ ,"smtes;" * "\x2AAC\xFE00"+ ,"SOFTcy;" * "\x042C"+ ,"softcy;" * "\x044C"+ ,"sol;" * "\x002F"+ ,"solb;" * "\x29C4"+ ,"solbar;" * "\x233F"+ ,"Sopf;" * "\x1D54A"+ ,"sopf;" * "\x1D564"+ ,"spades;" * "\x2660"+ ,"spadesuit;" * "\x2660"+ ,"spar;" * "\x2225"+ ,"sqcap;" * "\x2293"+ ,"sqcaps;" * "\x2293\xFE00"+ ,"sqcup;" * "\x2294"+ ,"sqcups;" * "\x2294\xFE00"+ ,"Sqrt;" * "\x221A"+ ,"sqsub;" * "\x228F"+ ,"sqsube;" * "\x2291"+ ,"sqsubset;" * "\x228F"+ ,"sqsubseteq;" * "\x2291"+ ,"sqsup;" * "\x2290"+ ,"sqsupe;" * "\x2292"+ ,"sqsupset;" * "\x2290"+ ,"sqsupseteq;" * "\x2292"+ ,"squ;" * "\x25A1"+ ,"Square;" * "\x25A1"+ ,"square;" * "\x25A1"+ ,"SquareIntersection;" * "\x2293"+ ,"SquareSubset;" * "\x228F"+ ,"SquareSubsetEqual;" * "\x2291"+ ,"SquareSuperset;" * "\x2290"+ ,"SquareSupersetEqual;" * "\x2292"+ ,"SquareUnion;" * "\x2294"+ ,"squarf;" * "\x25AA"+ ,"squf;" * "\x25AA"+ ,"srarr;" * "\x2192"+ ,"Sscr;" * "\x1D4AE"+ ,"sscr;" * "\x1D4C8"+ ,"ssetmn;" * "\x2216"+ ,"ssmile;" * "\x2323"+ ,"sstarf;" * "\x22C6"+ ,"Star;" * "\x22C6"+ ,"star;" * "\x2606"+ ,"starf;" * "\x2605"+ ,"straightepsilon;" * "\x03F5"+ ,"straightphi;" * "\x03D5"+ ,"strns;" * "\x00AF"+ ,"sub;" * "\x2282"+ ,"Sub;" * "\x22D0"+ ,"subdot;" * "\x2ABD"+ ,"sube;" * "\x2286"+ ,"subE;" * "\x2AC5"+ ,"subedot;" * "\x2AC3"+ ,"submult;" * "\x2AC1"+ ,"subne;" * "\x228A"+ ,"subnE;" * "\x2ACB"+ ,"subplus;" * "\x2ABF"+ ,"subrarr;" * "\x2979"+ ,"subset;" * "\x2282"+ ,"Subset;" * "\x22D0"+ ,"subseteq;" * "\x2286"+ ,"subseteqq;" * "\x2AC5"+ ,"SubsetEqual;" * "\x2286"+ ,"subsetneq;" * "\x228A"+ ,"subsetneqq;" * "\x2ACB"+ ,"subsim;" * "\x2AC7"+ ,"subsub;" * "\x2AD5"+ ,"subsup;" * "\x2AD3"+ ,"succ;" * "\x227B"+ ,"succapprox;" * "\x2AB8"+ ,"succcurlyeq;" * "\x227D"+ ,"Succeeds;" * "\x227B"+ ,"SucceedsEqual;" * "\x2AB0"+ ,"SucceedsSlantEqual;" * "\x227D"+ ,"SucceedsTilde;" * "\x227F"+ ,"succeq;" * "\x2AB0"+ ,"succnapprox;" * "\x2ABA"+ ,"succneqq;" * "\x2AB6"+ ,"succnsim;" * "\x22E9"+ ,"succsim;" * "\x227F"+ ,"SuchThat;" * "\x220B"+ ,"Sum;" * "\x2211"+ ,"sum;" * "\x2211"+ ,"sung;" * "\x266A"+ ,"sup1" * "\x00B9"+ ,"sup1;" * "\x00B9"+ ,"sup2" * "\x00B2"+ ,"sup2;" * "\x00B2"+ ,"sup3" * "\x00B3"+ ,"sup3;" * "\x00B3"+ ,"sup;" * "\x2283"+ ,"Sup;" * "\x22D1"+ ,"supdot;" * "\x2ABE"+ ,"supdsub;" * "\x2AD8"+ ,"supe;" * "\x2287"+ ,"supE;" * "\x2AC6"+ ,"supedot;" * "\x2AC4"+ ,"Superset;" * "\x2283"+ ,"SupersetEqual;" * "\x2287"+ ,"suphsol;" * "\x27C9"+ ,"suphsub;" * "\x2AD7"+ ,"suplarr;" * "\x297B"+ ,"supmult;" * "\x2AC2"+ ,"supne;" * "\x228B"+ ,"supnE;" * "\x2ACC"+ ,"supplus;" * "\x2AC0"+ ,"supset;" * "\x2283"+ ,"Supset;" * "\x22D1"+ ,"supseteq;" * "\x2287"+ ,"supseteqq;" * "\x2AC6"+ ,"supsetneq;" * "\x228B"+ ,"supsetneqq;" * "\x2ACC"+ ,"supsim;" * "\x2AC8"+ ,"supsub;" * "\x2AD4"+ ,"supsup;" * "\x2AD6"+ ,"swarhk;" * "\x2926"+ ,"swarr;" * "\x2199"+ ,"swArr;" * "\x21D9"+ ,"swarrow;" * "\x2199"+ ,"swnwar;" * "\x292A"+ ,"szlig" * "\x00DF"+ ,"szlig;" * "\x00DF"+ ,"Tab;" * "\x0009"+ ,"target;" * "\x2316"+ ,"Tau;" * "\x03A4"+ ,"tau;" * "\x03C4"+ ,"tbrk;" * "\x23B4"+ ,"Tcaron;" * "\x0164"+ ,"tcaron;" * "\x0165"+ ,"Tcedil;" * "\x0162"+ ,"tcedil;" * "\x0163"+ ,"Tcy;" * "\x0422"+ ,"tcy;" * "\x0442"+ ,"tdot;" * "\x20DB"+ ,"telrec;" * "\x2315"+ ,"Tfr;" * "\x1D517"+ ,"tfr;" * "\x1D531"+ ,"there4;" * "\x2234"+ ,"Therefore;" * "\x2234"+ ,"therefore;" * "\x2234"+ ,"Theta;" * "\x0398"+ ,"theta;" * "\x03B8"+ ,"thetasym;" * "\x03D1"+ ,"thetav;" * "\x03D1"+ ,"thickapprox;" * "\x2248"+ ,"thicksim;" * "\x223C"+ ,"ThickSpace;" * "\x205F\x200A"+ ,"thinsp;" * "\x2009"+ ,"ThinSpace;" * "\x2009"+ ,"thkap;" * "\x2248"+ ,"thksim;" * "\x223C"+ ,"THORN" * "\x00DE"+ ,"thorn" * "\x00FE"+ ,"THORN;" * "\x00DE"+ ,"thorn;" * "\x00FE"+ ,"tilde;" * "\x02DC"+ ,"Tilde;" * "\x223C"+ ,"TildeEqual;" * "\x2243"+ ,"TildeFullEqual;" * "\x2245"+ ,"TildeTilde;" * "\x2248"+ ,"times" * "\x00D7"+ ,"times;" * "\x00D7"+ ,"timesb;" * "\x22A0"+ ,"timesbar;" * "\x2A31"+ ,"timesd;" * "\x2A30"+ ,"tint;" * "\x222D"+ ,"toea;" * "\x2928"+ ,"top;" * "\x22A4"+ ,"topbot;" * "\x2336"+ ,"topcir;" * "\x2AF1"+ ,"Topf;" * "\x1D54B"+ ,"topf;" * "\x1D565"+ ,"topfork;" * "\x2ADA"+ ,"tosa;" * "\x2929"+ ,"tprime;" * "\x2034"+ ,"TRADE;" * "\x2122"+ ,"trade;" * "\x2122"+ ,"triangle;" * "\x25B5"+ ,"triangledown;" * "\x25BF"+ ,"triangleleft;" * "\x25C3"+ ,"trianglelefteq;" * "\x22B4"+ ,"triangleq;" * "\x225C"+ ,"triangleright;" * "\x25B9"+ ,"trianglerighteq;" * "\x22B5"+ ,"tridot;" * "\x25EC"+ ,"trie;" * "\x225C"+ ,"triminus;" * "\x2A3A"+ ,"TripleDot;" * "\x20DB"+ ,"triplus;" * "\x2A39"+ ,"trisb;" * "\x29CD"+ ,"tritime;" * "\x2A3B"+ ,"trpezium;" * "\x23E2"+ ,"Tscr;" * "\x1D4AF"+ ,"tscr;" * "\x1D4C9"+ ,"TScy;" * "\x0426"+ ,"tscy;" * "\x0446"+ ,"TSHcy;" * "\x040B"+ ,"tshcy;" * "\x045B"+ ,"Tstrok;" * "\x0166"+ ,"tstrok;" * "\x0167"+ ,"twixt;" * "\x226C"+ ,"twoheadleftarrow;" * "\x219E"+ ,"twoheadrightarrow;" * "\x21A0"+ ,"Uacute" * "\x00DA"+ ,"uacute" * "\x00FA"+ ,"Uacute;" * "\x00DA"+ ,"uacute;" * "\x00FA"+ ,"uarr;" * "\x2191"+ ,"Uarr;" * "\x219F"+ ,"uArr;" * "\x21D1"+ ,"Uarrocir;" * "\x2949"+ ,"Ubrcy;" * "\x040E"+ ,"ubrcy;" * "\x045E"+ ,"Ubreve;" * "\x016C"+ ,"ubreve;" * "\x016D"+ ,"Ucirc" * "\x00DB"+ ,"ucirc" * "\x00FB"+ ,"Ucirc;" * "\x00DB"+ ,"ucirc;" * "\x00FB"+ ,"Ucy;" * "\x0423"+ ,"ucy;" * "\x0443"+ ,"udarr;" * "\x21C5"+ ,"Udblac;" * "\x0170"+ ,"udblac;" * "\x0171"+ ,"udhar;" * "\x296E"+ ,"ufisht;" * "\x297E"+ ,"Ufr;" * "\x1D518"+ ,"ufr;" * "\x1D532"+ ,"Ugrave" * "\x00D9"+ ,"ugrave" * "\x00F9"+ ,"Ugrave;" * "\x00D9"+ ,"ugrave;" * "\x00F9"+ ,"uHar;" * "\x2963"+ ,"uharl;" * "\x21BF"+ ,"uharr;" * "\x21BE"+ ,"uhblk;" * "\x2580"+ ,"ulcorn;" * "\x231C"+ ,"ulcorner;" * "\x231C"+ ,"ulcrop;" * "\x230F"+ ,"ultri;" * "\x25F8"+ ,"Umacr;" * "\x016A"+ ,"umacr;" * "\x016B"+ ,"uml" * "\x00A8"+ ,"uml;" * "\x00A8"+ ,"UnderBar;" * "\x005F"+ ,"UnderBrace;" * "\x23DF"+ ,"UnderBracket;" * "\x23B5"+ ,"UnderParenthesis;" * "\x23DD"+ ,"Union;" * "\x22C3"+ ,"UnionPlus;" * "\x228E"+ ,"Uogon;" * "\x0172"+ ,"uogon;" * "\x0173"+ ,"Uopf;" * "\x1D54C"+ ,"uopf;" * "\x1D566"+ ,"UpArrow;" * "\x2191"+ ,"uparrow;" * "\x2191"+ ,"Uparrow;" * "\x21D1"+ ,"UpArrowBar;" * "\x2912"+ ,"UpArrowDownArrow;" * "\x21C5"+ ,"UpDownArrow;" * "\x2195"+ ,"updownarrow;" * "\x2195"+ ,"Updownarrow;" * "\x21D5"+ ,"UpEquilibrium;" * "\x296E"+ ,"upharpoonleft;" * "\x21BF"+ ,"upharpoonright;" * "\x21BE"+ ,"uplus;" * "\x228E"+ ,"UpperLeftArrow;" * "\x2196"+ ,"UpperRightArrow;" * "\x2197"+ ,"upsi;" * "\x03C5"+ ,"Upsi;" * "\x03D2"+ ,"upsih;" * "\x03D2"+ ,"Upsilon;" * "\x03A5"+ ,"upsilon;" * "\x03C5"+ ,"UpTee;" * "\x22A5"+ ,"UpTeeArrow;" * "\x21A5"+ ,"upuparrows;" * "\x21C8"+ ,"urcorn;" * "\x231D"+ ,"urcorner;" * "\x231D"+ ,"urcrop;" * "\x230E"+ ,"Uring;" * "\x016E"+ ,"uring;" * "\x016F"+ ,"urtri;" * "\x25F9"+ ,"Uscr;" * "\x1D4B0"+ ,"uscr;" * "\x1D4CA"+ ,"utdot;" * "\x22F0"+ ,"Utilde;" * "\x0168"+ ,"utilde;" * "\x0169"+ ,"utri;" * "\x25B5"+ ,"utrif;" * "\x25B4"+ ,"uuarr;" * "\x21C8"+ ,"Uuml" * "\x00DC"+ ,"uuml" * "\x00FC"+ ,"Uuml;" * "\x00DC"+ ,"uuml;" * "\x00FC"+ ,"uwangle;" * "\x29A7"+ ,"vangrt;" * "\x299C"+ ,"varepsilon;" * "\x03F5"+ ,"varkappa;" * "\x03F0"+ ,"varnothing;" * "\x2205"+ ,"varphi;" * "\x03D5"+ ,"varpi;" * "\x03D6"+ ,"varpropto;" * "\x221D"+ ,"varr;" * "\x2195"+ ,"vArr;" * "\x21D5"+ ,"varrho;" * "\x03F1"+ ,"varsigma;" * "\x03C2"+ ,"varsubsetneq;" * "\x228A\xFE00"+ ,"varsubsetneqq;" * "\x2ACB\xFE00"+ ,"varsupsetneq;" * "\x228B\xFE00"+ ,"varsupsetneqq;" * "\x2ACC\xFE00"+ ,"vartheta;" * "\x03D1"+ ,"vartriangleleft;" * "\x22B2"+ ,"vartriangleright;" * "\x22B3"+ ,"vBar;" * "\x2AE8"+ ,"Vbar;" * "\x2AEB"+ ,"vBarv;" * "\x2AE9"+ ,"Vcy;" * "\x0412"+ ,"vcy;" * "\x0432"+ ,"vdash;" * "\x22A2"+ ,"vDash;" * "\x22A8"+ ,"Vdash;" * "\x22A9"+ ,"VDash;" * "\x22AB"+ ,"Vdashl;" * "\x2AE6"+ ,"vee;" * "\x2228"+ ,"Vee;" * "\x22C1"+ ,"veebar;" * "\x22BB"+ ,"veeeq;" * "\x225A"+ ,"vellip;" * "\x22EE"+ ,"verbar;" * "\x007C"+ ,"Verbar;" * "\x2016"+ ,"vert;" * "\x007C"+ ,"Vert;" * "\x2016"+ ,"VerticalBar;" * "\x2223"+ ,"VerticalLine;" * "\x007C"+ ,"VerticalSeparator;" * "\x2758"+ ,"VerticalTilde;" * "\x2240"+ ,"VeryThinSpace;" * "\x200A"+ ,"Vfr;" * "\x1D519"+ ,"vfr;" * "\x1D533"+ ,"vltri;" * "\x22B2"+ ,"vnsub;" * "\x2282\x20D2"+ ,"vnsup;" * "\x2283\x20D2"+ ,"Vopf;" * "\x1D54D"+ ,"vopf;" * "\x1D567"+ ,"vprop;" * "\x221D"+ ,"vrtri;" * "\x22B3"+ ,"Vscr;" * "\x1D4B1"+ ,"vscr;" * "\x1D4CB"+ ,"vsubne;" * "\x228A\xFE00"+ ,"vsubnE;" * "\x2ACB\xFE00"+ ,"vsupne;" * "\x228B\xFE00"+ ,"vsupnE;" * "\x2ACC\xFE00"+ ,"Vvdash;" * "\x22AA"+ ,"vzigzag;" * "\x299A"+ ,"Wcirc;" * "\x0174"+ ,"wcirc;" * "\x0175"+ ,"wedbar;" * "\x2A5F"+ ,"wedge;" * "\x2227"+ ,"Wedge;" * "\x22C0"+ ,"wedgeq;" * "\x2259"+ ,"weierp;" * "\x2118"+ ,"Wfr;" * "\x1D51A"+ ,"wfr;" * "\x1D534"+ ,"Wopf;" * "\x1D54E"+ ,"wopf;" * "\x1D568"+ ,"wp;" * "\x2118"+ ,"wr;" * "\x2240"+ ,"wreath;" * "\x2240"+ ,"Wscr;" * "\x1D4B2"+ ,"wscr;" * "\x1D4CC"+ ,"xcap;" * "\x22C2"+ ,"xcirc;" * "\x25EF"+ ,"xcup;" * "\x22C3"+ ,"xdtri;" * "\x25BD"+ ,"Xfr;" * "\x1D51B"+ ,"xfr;" * "\x1D535"+ ,"xharr;" * "\x27F7"+ ,"xhArr;" * "\x27FA"+ ,"Xi;" * "\x039E"+ ,"xi;" * "\x03BE"+ ,"xlarr;" * "\x27F5"+ ,"xlArr;" * "\x27F8"+ ,"xmap;" * "\x27FC"+ ,"xnis;" * "\x22FB"+ ,"xodot;" * "\x2A00"+ ,"Xopf;" * "\x1D54F"+ ,"xopf;" * "\x1D569"+ ,"xoplus;" * "\x2A01"+ ,"xotime;" * "\x2A02"+ ,"xrarr;" * "\x27F6"+ ,"xrArr;" * "\x27F9"+ ,"Xscr;" * "\x1D4B3"+ ,"xscr;" * "\x1D4CD"+ ,"xsqcup;" * "\x2A06"+ ,"xuplus;" * "\x2A04"+ ,"xutri;" * "\x25B3"+ ,"xvee;" * "\x22C1"+ ,"xwedge;" * "\x22C0"+ ,"Yacute" * "\x00DD"+ ,"yacute" * "\x00FD"+ ,"Yacute;" * "\x00DD"+ ,"yacute;" * "\x00FD"+ ,"YAcy;" * "\x042F"+ ,"yacy;" * "\x044F"+ ,"Ycirc;" * "\x0176"+ ,"ycirc;" * "\x0177"+ ,"Ycy;" * "\x042B"+ ,"ycy;" * "\x044B"+ ,"yen" * "\x00A5"+ ,"yen;" * "\x00A5"+ ,"Yfr;" * "\x1D51C"+ ,"yfr;" * "\x1D536"+ ,"YIcy;" * "\x0407"+ ,"yicy;" * "\x0457"+ ,"Yopf;" * "\x1D550"+ ,"yopf;" * "\x1D56A"+ ,"Yscr;" * "\x1D4B4"+ ,"yscr;" * "\x1D4CE"+ ,"YUcy;" * "\x042E"+ ,"yucy;" * "\x044E"+ ,"yuml" * "\x00FF"+ ,"yuml;" * "\x00FF"+ ,"Yuml;" * "\x0178"+ ,"Zacute;" * "\x0179"+ ,"zacute;" * "\x017A"+ ,"Zcaron;" * "\x017D"+ ,"zcaron;" * "\x017E"+ ,"Zcy;" * "\x0417"+ ,"zcy;" * "\x0437"+ ,"Zdot;" * "\x017B"+ ,"zdot;" * "\x017C"+ ,"zeetrf;" * "\x2128"+ ,"ZeroWidthSpace;" * "\x200B"+ ,"Zeta;" * "\x0396"+ ,"zeta;" * "\x03B6"+ ,"Zfr;" * "\x2128"+ ,"zfr;" * "\x1D537"+ ,"ZHcy;" * "\x0416"+ ,"zhcy;" * "\x0436"+ ,"zigrarr;" * "\x21DD"+ ,"Zopf;" * "\x2124"+ ,"zopf;" * "\x1D56B"+ ,"Zscr;" * "\x1D4B5"+ ,"zscr;" * "\x1D4CF"+ ,"zwj;" * "\x200D"+ ,"zwnj;" * "\x200C"+ ]
+ app/Main.hs view
@@ -0,0 +1,28 @@+{-# LANGUAGE OverloadedStrings #-}+module Main where++import Text.HTML.TagSoup as Soup+import Text.HTML.TagStew as Stew+import qualified Data.ByteString as B+import qualified Data.ByteString.Builder as BB+import qualified Data.ByteString.UTF8 as BU+import System.Environment (getArgs)+import Control.Monad+import Text.Show.Unicode+import System.IO (stdout)++fromTag :: Tag B.ByteString -> BB.Builder+fromTag = go where+ f = BB.byteString+ go (TagOpen t xs) = "\ESC[34m<" <> f t+ <> foldMap (\(k, v) -> " " <> f k <> "=" <> f v) xs+ <> ">\ESC[0m"+ go (TagClose t) = "\ESC[34m</" <> f t <> ">\ESC[0m"+ go (TagText t) = f t+ go (TagComment t) = "<!--" <> f t <> "-->"+{-# INLINE fromTag #-}++main :: IO ()+main = getArgs >>= \paths -> forM_ paths $ \path -> do+ bs <- B.readFile path+ BB.hPutBuilder stdout $ foldMap ((<>"\n") . fromTag) $ Soup.parseTags bs
+ tagstew.cabal view
@@ -0,0 +1,39 @@+cabal-version: 2.4+-- Initial package description 'tagstew.cabal' generated by 'cabal init'.+-- For further documentation, see http://haskell.org/cabal/users-guide/++name: tagstew+version: 0+synopsis: Black magic tagsoup+description: Fast alternative HTML decoder for tagsoup+bug-reports: https://github.com/fumieval/tagstew+license: BSD-3-Clause+license-file: LICENSE+author: Fumiaki Kinoshita+maintainer: fumiexcel@gmail.com+copyright: Copyright (c) 2020 Fumiaki Kinoshita+category: Text+extra-source-files: CHANGELOG.md, README.md++library+ exposed-modules: Text.HTML.TagStew, Text.HTML.TagStew.Entity+ ghc-options: -Wall -O2+ build-depends: base == 4.*, bytestring, compact, unordered-containers+ , tagsoup, text+ default-language: Haskell2010++executable tagstew+ main-is: Main.hs+ -- other-modules:+ -- other-extensions:+ build-depends: base == 4.*, bytestring+ , tagstew+ , tagsoup+ , utf8-string+ , unicode-show+ hs-source-dirs: app+ default-language: Haskell2010++source-repository head+ type: git+ location: https://github.com/fumieval/tagstew